├── .dockerignore
├── .editorconfig
├── .eslintrc.json
├── .githooks
└── pre-commit
├── .github
├── ISSUE_TEMPLATE
│ ├── ---1-report-an-issue.md
│ ├── ---2-feature-request.md
│ └── config.yml
├── dash-shot.png
├── graphql-playground.png
├── pull_request_template.md
└── workflows
│ ├── ci-automated-check-environment.yml
│ ├── ci.yml
│ ├── release-automated.yml
│ └── release-manual-docker.yml
├── .gitignore
├── .npmignore
├── .nvmrc
├── .prettierrc
├── .releaserc
├── commit.hbs
├── footer.hbs
├── header.hbs
└── template.hbs
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── PIG
├── index.html
└── index.template.html
├── Parse-Dashboard
├── Authentication.js
├── CLI
│ ├── mfa.js
│ └── utils.js
├── CLIHelper.js
├── app.js
├── index.ejs
├── index.js
├── login.ejs
├── parse-dashboard-config.json
├── public
│ ├── favicon.ico
│ ├── worker-css.js
│ ├── worker-html.js
│ ├── worker-javascript.js
│ ├── worker-json.js
│ ├── worker-php.js
│ └── worker-xml.js
└── server.js
├── Procfile
├── README.md
├── babel.config.js
├── bin
└── parse-dashboard
├── changelogs
├── CHANGELOG_alpha.md
├── CHANGELOG_beta.md
└── CHANGELOG_release.md
├── ci
├── CiVersionCheck.js
├── ciCheck.js
└── nodeEngineCheck.js
├── deploy-homolog.sh
├── deploy-homolog2.sh
├── deploy-prod.sh
├── deploy-prod2.sh
├── docker-compose.uffizzi.yml
├── jsconfig.json
├── nginx-uffizzi
├── html
│ └── index.html
└── nginx.conf
├── package.json
├── release.config.js
├── scripts
├── before_script.sh
└── generate.js
├── src
├── components
│ ├── ACLEditor
│ │ └── ACLEditor.react.js
│ ├── AppBadge
│ │ ├── AppBadge.react.js
│ │ └── AppBadge.scss
│ ├── Autocomplete
│ │ ├── Autocomplete.example.js
│ │ ├── Autocomplete.react.js
│ │ └── Autocomplete.scss
│ ├── B4AAlert
│ │ ├── B4AAlert.example.js
│ │ ├── B4AAlert.react.js
│ │ └── B4AAlert.scss
│ ├── B4ACloudCodeView
│ │ ├── B4ACloudCodeView.example.js
│ │ ├── B4ACloudCodeView.react.js
│ │ └── B4ACloudCodeView.scss
│ ├── B4ACodeTree
│ │ ├── B4ACodeTree.example.js
│ │ ├── B4ACodeTree.react.js
│ │ ├── B4ACodeTree.scss
│ │ ├── B4AJsTree.css
│ │ ├── B4ATreeActions.js
│ │ └── icons
│ │ │ ├── add-file.png
│ │ │ ├── file-check.png
│ │ │ ├── file-upload-outline.png
│ │ │ ├── file.png
│ │ │ ├── folder-empty-undeployed.png
│ │ │ ├── folder-empty.png
│ │ │ ├── folder-notdeployed.png
│ │ │ ├── folder.png
│ │ │ └── trash-can-outline.png
│ ├── B4ADescriptionTemplate
│ │ ├── B4ADescriptionTemplate.example.js
│ │ ├── B4ADescriptionTemplate.react.js
│ │ └── B4ADescriptionTemplate.scss
│ ├── B4AFieldTemplate
│ │ ├── B4AFieldTemplate.example.js
│ │ ├── B4AFieldTemplate.react.js
│ │ └── B4AFieldTemplate.scss
│ ├── B4ALabelTemplate
│ │ ├── B4ALabelTemplate.example.js
│ │ ├── B4ALabelTemplate.react.js
│ │ └── B4ALabelTemplate.scss
│ ├── B4aBadge
│ │ ├── B4aBadge.react.js
│ │ └── B4aBadge.scss
│ ├── BooleanEditor
│ │ ├── BooleanEditor.react.js
│ │ └── BooleanEditor.scss
│ ├── BrowserCell
│ │ ├── BrowserCell.react.js
│ │ └── BrowserCell.scss
│ ├── BrowserFilter
│ │ ├── B4aBrowserFilter.react.js
│ │ ├── B4aBrowserFilter.scss
│ │ ├── B4aFilterRow.react.js
│ │ ├── BrowserFilter.react.js
│ │ ├── BrowserFilter.scss
│ │ └── FilterRow.react.js
│ ├── BrowserMenu
│ │ ├── BrowserMenu.react.js
│ │ ├── BrowserMenu.scss
│ │ ├── MenuItem.react.js
│ │ ├── Separator.react.js
│ │ └── SubMenuItem.react.js
│ ├── BrowserRow
│ │ └── BrowserRow.react.js
│ ├── Button
│ │ ├── B4AButton.scss
│ │ ├── Button.example.js
│ │ ├── Button.react.js
│ │ └── Button.scss
│ ├── CSRFInput
│ │ └── CSRFInput.react.js
│ ├── Calendar
│ │ ├── Calendar.example.js
│ │ ├── Calendar.react.js
│ │ └── Calendar.scss
│ ├── CascadingView
│ │ ├── CascadingView.example.js
│ │ ├── CascadingView.react.js
│ │ └── CascadingView.scss
│ ├── CategoryList
│ │ ├── CategoryItemAction.js
│ │ ├── CategoryList.react.js
│ │ └── CategoryList.scss
│ ├── Chart
│ │ ├── Chart.example.js
│ │ ├── Chart.react.js
│ │ ├── Chart.scss
│ │ └── Shape.react.js
│ ├── Checkbox
│ │ ├── Checkbox.example.js
│ │ ├── Checkbox.react.js
│ │ └── Checkbox.scss
│ ├── Chip
│ │ ├── Chip.example.js
│ │ ├── Chip.react.js
│ │ └── Chip.scss
│ ├── ChromeDatePicker
│ │ ├── ChromeDatePicker.example.js
│ │ ├── ChromeDatePicker.react.js
│ │ └── ChromeDatePicker.scss
│ ├── ChromeDropdown
│ │ ├── ChromeDropdown.example.js
│ │ ├── ChromeDropdown.react.js
│ │ └── ChromeDropdown.scss
│ ├── CodeEditor
│ │ ├── CodeEditor.example.js
│ │ └── CodeEditor.react.js
│ ├── CodeSnippet
│ │ ├── CodeSnippet.css
│ │ ├── CodeSnippet.example.js
│ │ └── CodeSnippet.react.js
│ ├── ColumnsConfiguration
│ │ ├── ColumnConfigurationItem.react.js
│ │ ├── ColumnConfigurationItem.scss
│ │ ├── ColumnsConfiguration.react.js
│ │ └── ColumnsConfiguration.scss
│ ├── ContextMenu
│ │ ├── ContextMenu.example.js
│ │ ├── ContextMenu.react.js
│ │ └── ContextMenu.scss
│ ├── CreditCardInput
│ │ ├── CreditCardInput.example.js
│ │ ├── CreditCardInput.react.js
│ │ └── CreditCardInput.scss
│ ├── DataBrowserHeader
│ │ ├── DataBrowserHeader.example.js
│ │ ├── DataBrowserHeader.react.js
│ │ └── DataBrowserHeader.scss
│ ├── DataBrowserHeaderBar
│ │ ├── DataBrowserHeaderBar.react.js
│ │ └── DataBrowserHeaderBar.scss
│ ├── DatePicker
│ │ ├── DatePicker.example.js
│ │ ├── DatePicker.react.js
│ │ └── DatePicker.scss
│ ├── DateRange
│ │ ├── DateRange.example.js
│ │ ├── DateRange.react.js
│ │ └── DateRange.scss
│ ├── DateTimeEditor
│ │ ├── DateTimeEditor.react.js
│ │ └── DateTimeEditor.scss
│ ├── DateTimeEntry
│ │ └── DateTimeEntry.react.js
│ ├── DateTimeInput
│ │ ├── DateTimeInput.example.js
│ │ ├── DateTimeInput.react.js
│ │ └── DateTimeInput.scss
│ ├── DateTimePicker
│ │ ├── DateTimePicker.react.js
│ │ └── DateTimePicker.scss
│ ├── DonutChart
│ │ ├── DonutChart.example.js
│ │ ├── DonutChart.react.js
│ │ └── DonutChart.scss
│ ├── DragHandle
│ │ ├── DragHandle.example.js
│ │ └── DragHandle.react.js
│ ├── Dropdown
│ │ ├── Dropdown.example.js
│ │ ├── Dropdown.react.js
│ │ ├── Dropdown.scss
│ │ └── Option.react.js
│ ├── EmptyState
│ │ ├── EmptyState.example.js
│ │ ├── EmptyState.react.js
│ │ └── EmptyState.scss
│ ├── ExpirationDateInput
│ │ ├── ExpirationDateInput.example.js
│ │ └── ExpirationDateInput.react.js
│ ├── ExplorerActiveChartButton
│ │ ├── ExplorerActiveChartButton.example.js
│ │ ├── ExplorerActiveChartButton.react.js
│ │ └── ExplorerActiveChartButton.scss
│ ├── ExplorerMenuButton
│ │ ├── ExplorerMenuButton.example.js
│ │ ├── ExplorerMenuButton.react.js
│ │ └── ExplorerMenuButton.scss
│ ├── ExplorerQueryComposer
│ │ ├── ExplorerFilter.js
│ │ ├── ExplorerQueryComposer.example.js
│ │ ├── ExplorerQueryComposer.react.js
│ │ └── ExplorerQueryComposer.scss
│ ├── ExplorerQueryPicker
│ │ ├── ExplorerQueryPicker.example.js
│ │ ├── ExplorerQueryPicker.react.js
│ │ └── ExplorerQueryPicker.scss
│ ├── Field
│ │ ├── Field.example.js
│ │ ├── Field.react.js
│ │ └── Field.scss
│ ├── FieldSettings
│ │ ├── FieldSettings.example.js
│ │ ├── FieldSettings.react.js
│ │ └── FieldSettings.scss
│ ├── Fieldset
│ │ ├── Fieldset.example.js
│ │ ├── Fieldset.react.js
│ │ └── Fieldset.scss
│ ├── FileEditor
│ │ ├── FileEditor.react.js
│ │ └── FileEditor.scss
│ ├── FileInput
│ │ ├── FileInput.example.js
│ │ ├── FileInput.react.js
│ │ └── FileInput.scss
│ ├── FileTree
│ │ ├── FileTree.react.js
│ │ └── FileTree.scss
│ ├── Filter
│ │ └── Filter.react.js
│ ├── FlowFooter
│ │ ├── FlowFooter.react.js
│ │ └── FlowFooter.scss
│ ├── FlowView
│ │ ├── FlowView.react.js
│ │ └── FlowView.scss
│ ├── FormButton
│ │ ├── FormButton.example.js
│ │ ├── FormButton.react.js
│ │ └── FormButton.scss
│ ├── FormModal
│ │ ├── FormModal.example.js
│ │ └── FormModal.react.js
│ ├── FormNote
│ │ ├── FormNote.react.js
│ │ └── FormNote.scss
│ ├── FormTable
│ │ ├── FormTable.example.js
│ │ ├── FormTable.react.js
│ │ └── FormTable.scss
│ ├── FormTableCollab
│ │ ├── FormTableCollab.example.js
│ │ ├── FormTableCollab.react.js
│ │ └── FormTableCollab.scss
│ ├── FourOhFour
│ │ ├── FourOhFour.react.js
│ │ ├── FourOhFour.scss
│ │ └── sprite.png
│ ├── GeoPointEditor
│ │ ├── GeoPointEditor.react.js
│ │ └── GeoPointEditor.scss
│ ├── GeoPointInput
│ │ ├── GeoPointInput.react.js
│ │ └── GeoPointInput.scss
│ ├── Icon
│ │ ├── Icon.example.js
│ │ └── Icon.react.js
│ ├── InlineSubmitInput
│ │ ├── InlineSubmitInput.example.js
│ │ ├── InlineSubmitInput.react.js
│ │ └── InlineSubmitInput.scss
│ ├── IntervalInput
│ │ ├── IntervalInput.example.js
│ │ └── IntervalInput.react.js
│ ├── JsonPrinter
│ │ ├── JsonPrinter.example.js
│ │ └── JsonPrinter.react.js
│ ├── KeyField
│ │ ├── KeyField.example.js
│ │ ├── KeyField.react.js
│ │ └── KeyField.scss
│ ├── Label
│ │ ├── Label.example.js
│ │ ├── Label.react.js
│ │ └── Label.scss
│ ├── LabelSettings
│ │ ├── LabelSettings.example.js
│ │ ├── LabelSettings.react.js
│ │ └── LabelSettings.scss
│ ├── LiveReload
│ │ ├── LiveReload.example.js
│ │ └── LiveReload.react.js
│ ├── Loader
│ │ ├── Loader.example.js
│ │ ├── Loader.react.js
│ │ └── Loader.scss
│ ├── LoaderContainer
│ │ ├── LoaderContainer.example.js
│ │ ├── LoaderContainer.react.js
│ │ └── LoaderContainer.scss
│ ├── LoaderDots
│ │ ├── LoaderDots.example.js
│ │ ├── LoaderDots.react.js
│ │ └── LoaderDots.scss
│ ├── LogView
│ │ ├── LogView.example.js
│ │ ├── LogView.react.js
│ │ ├── LogView.scss
│ │ ├── LogViewEntry.example.js
│ │ ├── LogViewEntry.react.js
│ │ └── LogViewEntry.scss
│ ├── LoginForm
│ │ ├── LoginForm.example.js
│ │ ├── LoginForm.react.js
│ │ └── LoginForm.scss
│ ├── LoginRow
│ │ ├── LoginRow.react.js
│ │ └── LoginRow.scss
│ ├── Markdown
│ │ ├── Markdown.example.js
│ │ └── Markdown.react.js
│ ├── Modal
│ │ ├── Modal.example.js
│ │ ├── Modal.react.js
│ │ └── Modal.scss
│ ├── MoneyInput
│ │ ├── MoneyInput.example.js
│ │ ├── MoneyInput.react.js
│ │ └── MoneyInput.scss
│ ├── MultiSelect
│ │ ├── MultiSelect.example.js
│ │ ├── MultiSelect.react.js
│ │ ├── MultiSelect.scss
│ │ └── MultiSelectOption.react.js
│ ├── NumberEditor
│ │ ├── NumberEditor.react.js
│ │ └── NumberEditor.scss
│ ├── NumericInput
│ │ ├── NumericInput.example.js
│ │ ├── NumericInput.example.scss
│ │ ├── NumericInput.react.js
│ │ └── NumericInput.scss
│ ├── NumericInputSettings
│ │ ├── NumericInputSettings.example.js
│ │ ├── NumericInputSettings.example.scss
│ │ ├── NumericInputSettings.react.js
│ │ └── NumericInputSettings.scss
│ ├── PasswordStrength
│ │ ├── PasswordStrength.react.js
│ │ └── PasswordStrength.scss
│ ├── PermissionsCollaboratorDialog
│ │ ├── PermissionsCollaboratorDialog.example.js
│ │ ├── PermissionsCollaboratorDialog.react.js
│ │ ├── PermissionsCollaboratorDialog.scss
│ │ └── Tabs.css
│ ├── PermissionsDialog
│ │ ├── PermissionsDialog.example.js
│ │ ├── PermissionsDialog.react.js
│ │ └── PermissionsDialog.scss
│ ├── Pill
│ │ ├── Pill.example.js
│ │ ├── Pill.react.js
│ │ └── Pill.scss
│ ├── PlatformCard
│ │ ├── PlatformCard.example.js
│ │ ├── PlatformCard.react.js
│ │ └── PlatformCard.scss
│ ├── Popover
│ │ ├── Popover.react.js
│ │ └── Popover.scss
│ ├── PopoverTooltip
│ │ ├── PopoverTooltip.react.js
│ │ └── PopoverTooltip.scss
│ ├── ProtectedFieldsDialog
│ │ ├── ProtectedFieldsDialog.example.js
│ │ ├── ProtectedFieldsDialog.react.js
│ │ └── ProtectedFieldsDialog.scss
│ ├── PushAudienceDialog
│ │ ├── InstallationCondition.react.js
│ │ ├── InstallationCondition.scss
│ │ ├── PushAudienceDialog.example.js
│ │ ├── PushAudienceDialog.react.js
│ │ └── PushAudienceDialog.scss
│ ├── PushAudiencesSelector
│ │ ├── PushAudiencesBaseRow.react.js
│ │ ├── PushAudiencesOption.example.js
│ │ ├── PushAudiencesOption.react.js
│ │ ├── PushAudiencesOption.scss
│ │ ├── PushAudiencesSelector.example.js
│ │ ├── PushAudiencesSelector.react.js
│ │ └── PushAudiencesSelector.scss
│ ├── PushCerts
│ │ ├── CertsTable.react.js
│ │ ├── PushCerts.example.js
│ │ └── PushCerts.react.js
│ ├── PushExperimentDropdown
│ │ ├── PushExperimentDropdown.example.js
│ │ ├── PushExperimentDropdown.react.js
│ │ └── PushExperimentDropdown.scss
│ ├── PushOpenRate
│ │ ├── PushOpenRate.example.js
│ │ ├── PushOpenRate.react.js
│ │ └── PushOpenRate.scss
│ ├── PushPreview
│ │ ├── PushPreview.react.js
│ │ ├── PushPreview.scss
│ │ ├── VisiblePreview.react.js
│ │ ├── android.jpg
│ │ ├── iphone.jpg
│ │ ├── laptop.jpg
│ │ └── windowsphone.jpg
│ ├── RadioButton
│ │ ├── RadioButton.example.js
│ │ ├── RadioButton.react.js
│ │ └── RadioButton.scss
│ ├── Range
│ │ ├── Range.example.js
│ │ ├── Range.react.js
│ │ └── Range.scss
│ ├── ReleaseInfo
│ │ └── ReleaseInfo.js
│ ├── SaveButton
│ │ ├── SaveButton.example.js
│ │ ├── SaveButton.react.js
│ │ └── SaveButton.scss
│ ├── ScrollHint
│ │ ├── ScrollHint.react.js
│ │ └── ScrollHint.scss
│ ├── SegmentSelect
│ │ ├── SegmentSelect.example.js
│ │ ├── SegmentSelect.react.js
│ │ └── SegmentSelect.scss
│ ├── ServerLogsView
│ │ ├── ServerLogsView.react.js
│ │ └── ServerLogsView.scss
│ ├── Sidebar
│ │ ├── AppName.react.js
│ │ ├── AppsMenu.react.js
│ │ ├── FooterMenu.react.js
│ │ ├── Pin.react.js
│ │ ├── Sidebar.react.js
│ │ ├── Sidebar.scss
│ │ ├── SidebarAction.js
│ │ ├── SidebarHeader.react.js
│ │ ├── SidebarSection.react.js
│ │ ├── SidebarSubItem.react.js
│ │ └── zendeskSettings.js
│ ├── SliderWrap
│ │ ├── SliderWrap.example.js
│ │ ├── SliderWrap.react.js
│ │ └── SliderWrap.scss
│ ├── SlowQueriesFilter
│ │ ├── SlowQueriesFilter.react.js
│ │ └── SlowQueriesFilter.scss
│ ├── StatusIndicator
│ │ ├── StatusIndicator.example.js
│ │ ├── StatusIndicator.react.js
│ │ └── StatusIndicator.scss
│ ├── StringEditor
│ │ ├── StringEditor.react.js
│ │ └── StringEditor.scss
│ ├── SuggestionsList
│ │ ├── SuggestionsList.react.js
│ │ └── SuggestionsList.scss
│ ├── Table
│ │ ├── Table.scss
│ │ └── TableHeader.react.js
│ ├── TextInput
│ │ ├── TextInput.example.js
│ │ ├── TextInput.example.scss
│ │ ├── TextInput.react.js
│ │ └── TextInput.scss
│ ├── TextInputSettings
│ │ ├── TextInputSettings.example.js
│ │ ├── TextInputSettings.example.scss
│ │ ├── TextInputSettings.react.js
│ │ └── TextInputSettings.scss
│ ├── TimeInput
│ │ └── TimeInput.react.js
│ ├── Toggle
│ │ ├── Toggle.example.js
│ │ ├── Toggle.react.js
│ │ └── Toggle.scss
│ ├── Toolbar
│ │ ├── Toolbar.react.js
│ │ └── Toolbar.scss
│ ├── Tooltip
│ │ ├── PopperTooltip.react.js
│ │ ├── SimpleTooltip.react.js
│ │ ├── SimpleTooltip.scss
│ │ ├── Tooltip.example.js
│ │ ├── Tooltip.react.js
│ │ └── Tooltip.scss
│ ├── Tour
│ │ └── Tour.react.js
│ ├── TrackVisibility
│ │ ├── TrackVisibility.example.js
│ │ └── TrackVisibility.react.js
│ ├── VideoTutorialButton
│ │ ├── VideoTutorialButton.react.js
│ │ └── VideoTutorialButton.scss
│ └── VisibilityField
│ │ ├── VisibilityField.example.js
│ │ └── VisibilityField.react.js
├── context
│ └── currentApp.js
├── dashboard
│ ├── Account
│ │ ├── AccountLinkField.react.js
│ │ └── AccountOverview.react.js
│ ├── AccountView.react.js
│ ├── Analytics
│ │ ├── AnalyticsConstants.js
│ │ ├── Explorer
│ │ │ ├── Explorer.react.js
│ │ │ └── Explorer.scss
│ │ ├── Overview
│ │ │ ├── Overview.react.js
│ │ │ └── Overview.scss
│ │ ├── Performance
│ │ │ ├── Performance.react.js
│ │ │ └── Performance.scss
│ │ ├── Retention
│ │ │ ├── Retention.react.js
│ │ │ └── Retention.scss
│ │ └── SlowQueries
│ │ │ ├── SlowQueries.react.js
│ │ │ └── SlowQueries.scss
│ ├── AppData.react.js
│ ├── AppSelector.react.js
│ ├── Apps
│ │ ├── AppsIndex.react.js
│ │ ├── AppsIndex.scss
│ │ └── loadingIcon.png
│ ├── B4aAdminPage
│ │ ├── B4aAdminModal.js
│ │ ├── B4aAdminPage.react.js
│ │ ├── B4aAdminPage.scss
│ │ └── B4aAdminParams.js
│ ├── B4aAppTemplates
│ │ ├── B4aAppTemplates.react.js
│ │ └── B4aAppTemplates.scss
│ ├── B4aConnectPage
│ │ ├── B4aConnectPage.react.js
│ │ ├── B4aConnectPage.scss
│ │ ├── android-robot.png
│ │ ├── apple-logo.png
│ │ ├── flutter.png
│ │ ├── graphQl.png
│ │ ├── ionic.png
│ │ ├── javascript-icon.png
│ │ ├── react.png
│ │ └── xamarin-logo.png
│ ├── B4aHubPublishPage
│ │ ├── B4aHubPublishModal.js
│ │ ├── B4aHubPublishPage.react.js
│ │ ├── B4aHubPublishPage.scss
│ │ └── B4aHubUnpublishModal.js
│ ├── BlockchainPage
│ │ ├── BlockChainPage.react.js
│ │ ├── BlockChainPage.scss
│ │ ├── MoveToBlockchainModal.react.js
│ │ └── RemoveFromBlockchainModal.react.js
│ ├── Dashboard.js
│ ├── Dashboard.scss
│ ├── DashboardView.react.js
│ ├── Data
│ │ ├── ApiConsole
│ │ │ ├── ApiConsole.react.js
│ │ │ ├── ApiConsole.scss
│ │ │ ├── GraphQLConsole.react.js
│ │ │ ├── RestConsole.react.js
│ │ │ ├── generateCurl.js
│ │ │ └── request.js
│ │ ├── Browser
│ │ │ ├── AddColumnDialog.react.js
│ │ │ ├── AttachRowsDialog.react.js
│ │ │ ├── AttachSelectedRowsDialog.react.js
│ │ │ ├── B4ABrowserToolbar.react.js
│ │ │ ├── Browser.react.js
│ │ │ ├── Browser.scss
│ │ │ ├── BrowserTable.react.js
│ │ │ ├── BrowserToolbar.react.js
│ │ │ ├── CloneSelectedRowsDialog.react.js
│ │ │ ├── ConfirmDeleteColumnDialog.react.js
│ │ │ ├── CreateClassDialog.react.js
│ │ │ ├── DataBrowser.react.js
│ │ │ ├── DeleteRowsDialog.react.js
│ │ │ ├── DropClassDialog.react.js
│ │ │ ├── EditRowDialog.react.js
│ │ │ ├── Editor.react.js
│ │ │ ├── ExportDialog.react.js
│ │ │ ├── ExportSchemaDialog.react.js
│ │ │ ├── ExportSelectedRowsDialog.react.js
│ │ │ ├── ExportSelectedRowsDialog.scss
│ │ │ ├── ImportDialog.react.js
│ │ │ ├── ImportRelationDialog.react.js
│ │ │ ├── LoginDialog.react.js
│ │ │ ├── Notification.react.js
│ │ │ ├── ObjectPickerDialog.react.js
│ │ │ ├── PointerKeyDialog.react.js
│ │ │ ├── RemoveColumnDialog.react.js
│ │ │ ├── SchemaOverview.react.js
│ │ │ ├── SecureFieldsDialog.react.js
│ │ │ ├── SecurityDialog.react.js
│ │ │ └── postgresql.png
│ │ ├── CloudCode
│ │ │ ├── B4ACloudCode.react.js
│ │ │ ├── B4ACloudCode.scss
│ │ │ ├── B4ACloudCodeToolbar.react.js
│ │ │ ├── B4ACloudCodeToolbar.scss
│ │ │ ├── CloudCode.react.js
│ │ │ └── CloudCode.scss
│ │ ├── Config
│ │ │ ├── Config.react.js
│ │ │ ├── ConfigDialog.react.js
│ │ │ └── DeleteParameterDialog.react.js
│ │ ├── Jobs
│ │ │ ├── JobEdit.react.js
│ │ │ ├── JobScheduleReminder.react.js
│ │ │ ├── Jobs.react.js
│ │ │ ├── Jobs.scss
│ │ │ ├── JobsData.react.js
│ │ │ ├── JobsForm.react.js
│ │ │ └── RunNowButton.react.js
│ │ ├── Logs
│ │ │ ├── AccessLogs.react.js
│ │ │ ├── ErrorLogs.react.js
│ │ │ ├── InfoLogs.react.js
│ │ │ ├── Logs.react.js
│ │ │ ├── Logs.scss
│ │ │ └── SystemLogs.react.js
│ │ ├── Migration
│ │ │ ├── Migration.react.js
│ │ │ ├── Migration.scss
│ │ │ ├── MigrationStep.react.js
│ │ │ └── MigrationStep.scss
│ │ ├── Playground
│ │ │ ├── Playground.react.js
│ │ │ └── Playground.scss
│ │ └── Webhooks
│ │ │ ├── Webhooks.react.js
│ │ │ └── Webhooks.scss
│ ├── Hub
│ │ ├── HubConnections.react.js
│ │ ├── HubConnections.scss
│ │ └── HubDisconnectionDialog.react.js
│ ├── IndexManager
│ │ ├── IndexForm.react.js
│ │ ├── IndexForm.scss
│ │ ├── IndexManager.react.js
│ │ └── IndexManager.scss
│ ├── Push
│ │ ├── Push.scss
│ │ ├── PushAudiencesData.react.js
│ │ ├── PushAudiencesData.scss
│ │ ├── PushAudiencesIndex.react.js
│ │ ├── PushAudiencesIndexRow.react.js
│ │ ├── PushAudiencesIndexRow.scss
│ │ ├── PushComposerHelper.react.js
│ │ ├── PushConstants.js
│ │ ├── PushDetails.react.js
│ │ ├── PushDetails.scss
│ │ ├── PushIndex.react.js
│ │ ├── PushIndex.scss
│ │ └── PushNew.react.js
│ ├── ServerSettings
│ │ ├── ServerSettings.react.js
│ │ └── ServerSettings.scss
│ ├── Settings
│ │ ├── AppleCerts.react.js
│ │ ├── Collaborators.react.js
│ │ ├── DashboardSettings
│ │ │ ├── DashboardSettings.react.js
│ │ │ └── DashboardSettings.scss
│ │ ├── Fields
│ │ │ ├── AppInformationFields.react.js
│ │ │ ├── CollaboratorsFields.react.js
│ │ │ ├── Constants.js
│ │ │ ├── CurrentPlanFields.react.js
│ │ │ ├── DangerzoneFields.react.js
│ │ │ └── ManageAppFields.react.js
│ │ ├── GeneralSettings.react.js
│ │ ├── GeneralSettings.scss
│ │ ├── GeneralSettingsValidataions.js
│ │ ├── HostingSettings.react.js
│ │ ├── Modals
│ │ │ ├── changeConnectionStringModal.js
│ │ │ ├── cloneAppModal.react.js
│ │ │ ├── collaboratorRemovedWarningModal.js
│ │ │ ├── deleteAppModal.js
│ │ │ ├── deleteAppModal.react.js
│ │ │ ├── migrateAppModal.js
│ │ │ ├── purgeFilesModal.react.js
│ │ │ ├── purgeSystemLogModal.react.js
│ │ │ ├── restartAppModal.react.js
│ │ │ └── transferAppModal.react.js
│ │ ├── PushSettings.react.js
│ │ ├── Security
│ │ │ ├── Security.react.js
│ │ │ └── Security.scss
│ │ ├── SecuritySettings.react.js
│ │ ├── Settings.scss
│ │ ├── SettingsData.react.js
│ │ ├── UsersSettings.react.js
│ │ └── Util
│ │ │ ├── compareCollaborators.js
│ │ │ ├── generalFieldsOptions.js
│ │ │ ├── getError.js
│ │ │ ├── getPromiseList.js
│ │ │ ├── index.js
│ │ │ ├── renderModal.js
│ │ │ ├── validateEmail.js
│ │ │ └── verifyEditedCollaborators.js
│ ├── SidebarBuilder.js
│ ├── TableView.react.js
│ ├── TableView.scss
│ └── index.js
├── icons
│ ├── add-column.svg
│ ├── add-outline.svg
│ ├── add-row.svg
│ ├── admin-app-check.svg
│ ├── admin-app.svg
│ ├── admin-check.svg
│ ├── analytics-outline.svg
│ ├── analytics-solid.svg
│ ├── android.svg
│ ├── api-reference.svg
│ ├── api.svg
│ ├── apple.svg
│ ├── arduino.svg
│ ├── back4app-logo-face-blue.svg
│ ├── back4app-logo-text-blue.svg
│ ├── blank-app-outline.svg
│ ├── blank-app-solid.svg
│ ├── bug-outline.svg
│ ├── bug-solid.svg
│ ├── calendar-outline.svg
│ ├── calendar-solid.svg
│ ├── check-outline.svg
│ ├── check-solid.svg
│ ├── check.svg
│ ├── chip-close.svg
│ ├── clone-icon-license.txt
│ ├── clone-icon.svg
│ ├── cloud-code.svg
│ ├── cloud-cool.svg
│ ├── cloud-happy.svg
│ ├── cloud-sad.svg
│ ├── cloud-surprise.svg
│ ├── cloud-unsure.svg
│ ├── cloud-wink.svg
│ ├── collaborate-outline.svg
│ ├── collaborate-solid.svg
│ ├── core.svg
│ ├── database-hub.svg
│ ├── database.svg
│ ├── delete-icon.svg
│ ├── devices-outline.svg
│ ├── devices-solid.svg
│ ├── dotnet.svg
│ ├── down-outline.svg
│ ├── down-solid.svg
│ ├── download.svg
│ ├── drag-indicator.svg
│ ├── edit-outline.svg
│ ├── edit-solid.svg
│ ├── ellipses.svg
│ ├── expand.svg
│ ├── facebook.svg
│ ├── file-upload-outline.png
│ ├── files-outline.svg
│ ├── files-solid.svg
│ ├── filter-icon.svg
│ ├── filter-outline.svg
│ ├── filter-solid.svg
│ ├── folder-outline.svg
│ ├── folder-solid.svg
│ ├── gear-outline.svg
│ ├── gear-solid.svg
│ ├── gears.svg
│ ├── github.svg
│ ├── google.svg
│ ├── hamburger.svg
│ ├── help.svg
│ ├── heroku.svg
│ ├── icon-app-templates.svg
│ ├── icon-deploy.svg
│ ├── import-file.svg
│ ├── index-manager.svg
│ ├── infinity.svg
│ ├── info-outline.svg
│ ├── info-solid.svg
│ ├── input-down-icon.svg
│ ├── input-up-icon.svg
│ ├── javascript.svg
│ ├── keys-outline.svg
│ ├── keys-solid.svg
│ ├── laptop-outline.svg
│ ├── laptop-solid.svg
│ ├── left-outline.svg
│ ├── left-solid.svg
│ ├── lock-open-variant.svg
│ ├── lock-outline.svg
│ ├── locked-outline.svg
│ ├── locked-solid.svg
│ ├── logout.svg
│ ├── mail-outline.svg
│ ├── mail-solid.svg
│ ├── manage-columns.svg
│ ├── minus-outline.svg
│ ├── minus-solid.svg
│ ├── more-icon.svg
│ ├── more.svg
│ ├── phone-outline.svg
│ ├── phone-solid.svg
│ ├── php.svg
│ ├── pin.svg
│ ├── play-circle-outline.svg
│ ├── plus-outline.svg
│ ├── plus-solid.svg
│ ├── plus.svg
│ ├── push-outline.svg
│ ├── push-solid.svg
│ ├── question-solid.svg
│ ├── refresh-icon.svg
│ ├── refresh-outline.svg
│ ├── refresh-solid.svg
│ ├── refresh.svg
│ ├── right-outline.svg
│ ├── right-solid.svg
│ ├── rpi.svg
│ ├── rtos.svg
│ ├── search-outline.svg
│ ├── search-solid.svg
│ ├── security.svg
│ ├── send-outline.svg
│ ├── send-solid.svg
│ ├── server-settings-icon.svg
│ ├── share.svg
│ ├── test.png
│ ├── trash-outline.svg
│ ├── trash-solid.svg
│ ├── unity.svg
│ ├── unlock-outline.svg
│ ├── unlock-solid.svg
│ ├── up-outline.svg
│ ├── up-solid.svg
│ ├── users-outline.svg
│ ├── users-solid.svg
│ ├── visibility-icon.svg
│ ├── visibility.svg
│ ├── visibility_off.svg
│ ├── warn-outline.svg
│ ├── warn-solid.svg
│ ├── warn-triangle-outline.svg
│ ├── warn-triangle-solid.svg
│ ├── windows.svg
│ ├── x-outline.svg
│ ├── x-solid.svg
│ └── xamarin.svg
├── lib
│ ├── AJAX.js
│ ├── AccountManager.js
│ ├── AppsManager.js
│ ├── CSRFManager.js
│ ├── Charting.js
│ ├── ClassPreferences.js
│ ├── CloudCodeChanges.js
│ ├── ColumnPreferences.js
│ ├── Constants.js
│ ├── DateUtils.js
│ ├── Email.js
│ ├── Filters.js
│ ├── ParseApp.js
│ ├── ParseOptionUtils.js
│ ├── Position.js
│ ├── PropTypes.js
│ ├── PushUtils.js
│ ├── StringEscaping.js
│ ├── axios.js
│ ├── browserUtils.js
│ ├── encodeFormData.js
│ ├── englishOrdinalIndicator.js
│ ├── extractTime.js
│ ├── generatePath.js
│ ├── getFileName.js
│ ├── getSiteDomain.js
│ ├── hasAncestor.js
│ ├── howLongAgo.js
│ ├── htmlString.js
│ ├── isInsidePopover.js
│ ├── joinWithFinal.js
│ ├── jsonChangesToString.js
│ ├── keyMirror.js
│ ├── mergeDefaultParseOptions.js
│ ├── passwordStrength.js
│ ├── pluck.js
│ ├── pluralize.js
│ ├── prettyNumber.js
│ ├── queryFromFilters.js
│ ├── renderFlowFooterChanges.js
│ ├── setDifference.js
│ ├── stores
│ │ ├── AnalyticsQueryStore.js
│ │ ├── ConfigStore.js
│ │ ├── JobsStore.js
│ │ ├── PushAudiencesStore.js
│ │ ├── SchemaStore.js
│ │ ├── StateManager.js
│ │ ├── StoreManager.js
│ │ └── WebhookStore.js
│ ├── stringCompare.js
│ ├── stringList.js
│ ├── subscribeTo.js
│ ├── tests
│ │ ├── .eslintrc.json
│ │ ├── Authentication.test.js
│ │ ├── B4AAlert.test.js
│ │ ├── BrowserCell.test.js
│ │ ├── Button.test.js
│ │ ├── Charting.test.js
│ │ ├── CloudCodeView.test.js
│ │ ├── CodeEditor.test.js
│ │ ├── CodeTree.test.js
│ │ ├── CodeView.test.js
│ │ ├── ColumnPreferences.test.js
│ │ ├── DateUtils.test.js
│ │ ├── Email.test.js
│ │ ├── FormTableCollab.test.js
│ │ ├── Markdown.test.js
│ │ ├── PermissionsCollaboratorDialog.test.js
│ │ ├── PlatformCard.test.js
│ │ ├── Tooltip.test.js
│ │ ├── e2e.js
│ │ ├── e2e
│ │ │ └── dashboard.e2e.test.js
│ │ ├── extractTime.test.js
│ │ ├── getFileName.test.js
│ │ ├── passwordStrength.test.js
│ │ └── prettyNumber.test.js
│ ├── unique.js
│ ├── validateAndSubmitConnectionString.js
│ ├── validateCLPEntry.js
│ ├── validateEmailFormat.js
│ ├── validateNumeric.js
│ ├── withForwardedRef.js
│ └── withRouter.js
├── login
│ ├── Login.js
│ ├── Login.scss
│ └── index.js
├── parse-interface-guide
│ ├── ComponentsMap.js
│ ├── PIG.react.js
│ ├── PIG.scss
│ ├── PropsTable.react.js
│ ├── index.html
│ ├── index.js
│ └── routes.js
├── quickstart
│ ├── Quickstart.react.js
│ └── index.js
└── stylesheets
│ ├── back4app.scss
│ ├── base.scss
│ ├── fonts.scss
│ ├── globals.scss
│ └── introjs.css
├── testing
├── extractClassnames.js
├── preprocessor.js
└── styleMock.js
└── webpack
├── PIG.config.js
├── base.config.js
├── build.config.js
├── dev.config.js
├── homolog.config.js
├── plugins
└── svg-prep.js
├── production.config.js
├── publish.config.js
└── webpack.config.js
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | npm-debug.log
3 | *.md
4 | PATENTS
5 | LICENSE
6 | Dockerfile
7 | .dockerignore
8 | .gitignore
9 | .travis.yml
10 | .istanbul.yml
11 | .git
12 | .github
13 |
14 | # Build folder
15 | lib/
16 |
17 | # Tests
18 | spec/
19 |
20 | # IDEs
21 | .idea/
22 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.githooks/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | ESLINT="$(git rev-parse --show-toplevel)/node_modules/.bin/eslint"
4 |
5 | if [ ! -x "$ESLINT" ]; then
6 | echo "\t\033[41mPlease install ESlint\033[0m (npm i --save --save-exact --dev eslint)"
7 | exit 1
8 | fi
9 |
10 | exec 1>&2
11 | git diff --cached --name-status | while read st file; do
12 | # skip deleted files
13 | if [ "$st" = 'D' ]; then continue; fi
14 | if [ "$file" = "Parse-Dashboard/parse-dashboard-config.json" ]; then
15 | git reset
16 | git checkout -- Parse-Dashboard/parse-dashboard-config.json
17 | echo "[Error] Can not commit parse dashboard config file: $file"
18 | exit 1
19 | fi
20 | "$ESLINT" "$file"
21 | if [ "$?" = 1 ]; then
22 | git reset
23 | git checkout -- $file
24 | echo "[Error] eslint failed for file: $file"
25 | exit 1
26 | fi
27 | done
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 🙋🏽♀️ Getting help with code
4 | url: https://stackoverflow.com/questions/tagged/parse-platform
5 | about: Get help with code-level questions on Stack Overflow.
6 | - name: 🙋 Getting general help
7 | url: https://community.parseplatform.org
8 | about: Get help with other questions on our Community Forum.
9 |
--------------------------------------------------------------------------------
/.github/dash-shot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/.github/dash-shot.png
--------------------------------------------------------------------------------
/.github/graphql-playground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/.github/graphql-playground.png
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ### New Pull Request Checklist
2 |
7 |
8 | - [ ] I am not disclosing a [vulnerability](https://github.com/parse-community/parse-server/blob/master/SECURITY.md).
9 | - [ ] I am creating this PR in reference to an [issue](https://github.com/parse-community/parse-dashboard/issues?q=is%3Aissue).
10 |
11 | ### Issue Description
12 |
13 |
14 | Closes: FILL_THIS_OUT
15 |
16 | ### Approach
17 |
18 |
19 | ### TODOs before merging
20 |
24 |
25 | - [ ] Add tests
26 | - [ ] Add changes to documentation (guides, repository pages, in-code descriptions)
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | bundles/
4 | PIG/bundles/
5 | Parse-Dashboard/public/*
6 | Parse-Dashboard/parse-dashboard-config.json
7 | npm-debug.log
8 | .eslintcache
9 |
10 | // vim .swp
11 | *.swp
12 | .env
13 | .idea/
14 |
15 | logs/
16 | test_logs
17 |
18 | # visual studio code
19 | .vscode
20 |
21 | package-lock.json
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | Parse Dashboard/parse-dashboard-config.json
2 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | 8.11
2 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | semi: true
2 | trailingComma: "es5"
3 | singleQuote: true
4 | arrowParens: "avoid"
5 | printWidth: 100
6 |
--------------------------------------------------------------------------------
/.releaserc/footer.hbs:
--------------------------------------------------------------------------------
1 | {{#if noteGroups}}
2 | {{#each noteGroups}}
3 |
4 | ### {{title}}
5 |
6 | {{#each notes}}
7 | * {{#if commit.scope}}**{{commit.scope}}:** {{/if}}{{text}} ([{{commit.shortHash}}]({{commit.shortHash}}))
8 | {{/each}}
9 | {{/each}}
10 |
11 | {{/if}}
12 |
--------------------------------------------------------------------------------
/.releaserc/header.hbs:
--------------------------------------------------------------------------------
1 | {{#if isPatch~}}
2 | ##
3 | {{~else~}}
4 | #
5 | {{~/if}} {{#if @root.linkCompare~}}
6 | [{{version}}](
7 | {{~#if @root.repository~}}
8 | {{~#if @root.host}}
9 | {{~@root.host}}/
10 | {{~/if}}
11 | {{~#if @root.owner}}
12 | {{~@root.owner}}/
13 | {{~/if}}
14 | {{~@root.repository}}
15 | {{~else}}
16 | {{~@root.repoUrl}}
17 | {{~/if~}}
18 | /compare/{{previousTag}}...{{currentTag}})
19 | {{~else}}
20 | {{~version}}
21 | {{~/if}}
22 | {{~#if title}} "{{title}}"
23 | {{~/if}}
24 | {{~#if date}} ({{date}})
25 | {{/if}}
26 |
--------------------------------------------------------------------------------
/.releaserc/template.hbs:
--------------------------------------------------------------------------------
1 | {{> header}}
2 |
3 | {{#each commitGroups}}
4 |
5 | {{#if title}}
6 | ### {{title}}
7 |
8 | {{/if}}
9 | {{#each commits}}
10 | {{> commit root=@root}}
11 | {{/each}}
12 | {{/each}}
13 |
14 | {{> footer}}
15 |
--------------------------------------------------------------------------------
/PIG/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
PIG Component Explorer
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/PIG/index.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | PIG Component Explorer
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Parse-Dashboard/CLI/utils.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | copy(text) {
3 | const proc = require('child_process').spawn('pbcopy');
4 | proc.stdin.write(text);
5 | proc.stdin.end();
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Parse-Dashboard/CLIHelper.js:
--------------------------------------------------------------------------------
1 | const { createUser, createMFA } = require('./CLI/mfa');
2 |
3 | module.exports = {
4 | createUser,
5 | createMFA
6 | };
7 |
--------------------------------------------------------------------------------
/Parse-Dashboard/parse-dashboard-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "apps": [
3 | {
4 | "serverURL": "http://localhost:1337/parse",
5 | "appId": "APPLICATION_ID",
6 | "masterKey": "MASTER_KEY",
7 | "appName": "Countries States and Cities",
8 | "iconName": "",
9 | "primaryBackgroundColor": "",
10 | "secondaryBackgroundColor": "",
11 | "custom": {
12 | "isOwner": true
13 | }
14 | }
15 | ],
16 | "iconsFolder": "icons"
17 | }
18 |
--------------------------------------------------------------------------------
/Parse-Dashboard/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/Parse-Dashboard/public/favicon.ico
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: bin/parse-dashboard --config Parse-Dashboard/parse-dashboard-config.json
2 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: [
3 | ['@babel/plugin-proposal-decorators', { legacy: true }],
4 | ['@babel/transform-runtime', { corejs: 3 }],
5 | ],
6 | presets: [
7 | '@babel/preset-react',
8 | ['@babel/preset-env', { corejs: '3.28', useBuiltIns: 'entry' }],
9 | ],
10 | };
11 |
--------------------------------------------------------------------------------
/bin/parse-dashboard:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | require('../Parse-Dashboard');
3 |
--------------------------------------------------------------------------------
/deploy-homolog2.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [[ ! $b4a_certs_path ]]; then echo 'Set b4a_certs_path environment variable, please!' && exit; fi
4 |
5 | host=34.192.186.60
6 | user=ubuntu
7 | pem=AppContainers.pem
8 |
9 | branch=$(git symbolic-ref --short HEAD)
10 | git='~/bin/git-parse-dashboard'
11 |
12 | ssh -t -i $b4a_certs_path/$pem $user@$host "sudo su back4app -c '. ~/.nvm/nvm.sh && nvm use 14 && cd ~/scm/parse-dashboard2 && rm -rf node_modules && $git reset --hard && $git remote update && $git checkout $branch && $git merge origin/$branch && npm install && sed -i \"s/http:\/\/localhost:4000\/parseapi/https:\/\/dashboard-homolog.back4app.com\/parseapi/\" node_modules/parse/lib/browser/settings.js && npm run build-homolog'"
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "experimentalDecorators": true
4 | },
5 | "typeAcquisition": {
6 | "include": [
7 | "jest"
8 | ]
9 | },
10 | "exclude": ["node_modules"]
11 | }
12 |
--------------------------------------------------------------------------------
/scripts/before_script.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -x
4 |
5 | test -f Parse-Dashboard/public/bundles/dashboard.bundle.js
6 | test -f Parse-Dashboard/public/bundles/login.bundle.js
7 | test -f Parse-Dashboard/public/bundles/sprites.svg
8 | test -d Parse-Dashboard/public/bundles/img
9 |
--------------------------------------------------------------------------------
/src/components/AppBadge/AppBadge.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import PropTypes from 'lib/PropTypes';
9 | import React from 'react';
10 | import styles from 'components/AppBadge/AppBadge.scss';
11 |
12 | const AppBadge = ({ production }) => (
13 |
14 | {production ? 'PROD' : 'DEV'}
15 |
16 | );
17 |
18 | export default AppBadge;
19 |
20 | AppBadge.propTypes = {
21 | production: PropTypes.bool.describe('Indicates whether the app is in production mode or not.'),
22 | };
23 |
--------------------------------------------------------------------------------
/src/components/AppBadge/AppBadge.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .badge {
11 | @include DosisFont;
12 | display: inline-block;
13 | height: 26px;
14 | line-height: 26px;
15 | vertical-align: middle;
16 | text-align: center;
17 | border: 1px solid #768C97;
18 | color: #768C97;
19 | border-radius: 5px;
20 | font-size: 10px;
21 | letter-spacing: 4px;
22 | width: 60px;
23 | padding-left: 3px;
24 | float: right;
25 | }
26 |
27 | .prod {
28 | color: #00dc7c;
29 | border-color: #00dc7c;
30 | }
31 |
--------------------------------------------------------------------------------
/src/components/B4AAlert/B4AAlert.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .label {
11 | font-family: Noto Sans;
12 | font-size: 14px;
13 | line-height: 32px;
14 | margin-bottom: 22px;
15 | border-radius: 4px;
16 | border: solid 1px #bcdff1;
17 | background-color: #d9edf7;
18 | color: #31708f;
19 |
20 | .close {
21 | float: right;
22 | width: 14px;
23 | height: 14px;
24 | font-size: 16px;
25 | margin-top: -10px;
26 | margin-right: -10px;
27 | }
28 |
29 | p {
30 | height: fit-content;
31 | margin-bottom: 0px;
32 | }
33 | }
34 |
35 | .title {
36 | font-weight: bold;
37 | }
38 |
39 | .description {
40 | a {
41 | color: #169cee;
42 | text-decoration: none;
43 | }
44 |
45 | p {
46 | padding: 0 20px;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/components/B4ACloudCodeView/B4ACloudCodeView.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import B4ACloudCodeView from 'components/B4ACloudCodeView/B4ACloudCodeView.react';
10 |
11 | export const component = B4ACloudCodeView;
12 |
13 | export const demos = [
14 | {
15 | render() {
16 | return (
17 |
18 | )
19 | }
20 | }
21 | ];
22 |
--------------------------------------------------------------------------------
/src/components/B4ACloudCodeView/B4ACloudCodeView.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACloudCodeView/B4ACloudCodeView.scss
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/B4AJsTree.css:
--------------------------------------------------------------------------------
1 | @import url('https://static.back4app.com/fonts/fonts.css');
2 |
3 | .jstree-default {
4 | font-family: Inconsolata;
5 | font-size: 14px!important;
6 | font-weight: normal;
7 | font-style: normal;
8 | font-stretch: normal;
9 | line-height: 2;
10 | letter-spacing: normal;
11 | color: rgba(0, 0, 0, 0.7);
12 | }
13 |
14 | .jstree-themeicon-custom {
15 | background: transparent none 0 0;
16 | font-family: Material-Design-Iconic-Font;
17 | font-size: 20px!important;
18 | font-weight: normal;
19 | font-style: normal;
20 | font-stretch: normal;
21 | line-height: normal;
22 | letter-spacing: normal;
23 | text-align: center;
24 | color: #208aec;
25 | }
26 |
27 | .new {
28 | color: #4caf50;
29 | }
30 |
31 | .jstree-themeicon-custom {
32 | background-size: contain!important;
33 | }
34 |
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/add-file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/add-file.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/file-check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/file-check.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/file-upload-outline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/file-upload-outline.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/file.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/folder-empty-undeployed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/folder-empty-undeployed.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/folder-empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/folder-empty.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/folder-notdeployed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/folder-notdeployed.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/folder.png
--------------------------------------------------------------------------------
/src/components/B4ACodeTree/icons/trash-can-outline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/B4ACodeTree/icons/trash-can-outline.png
--------------------------------------------------------------------------------
/src/components/B4ADescriptionTemplate/B4ADescriptionTemplate.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 | @import 'stylesheets/back4app.scss';
10 |
11 | .description {
12 | height: 100%;
13 |
14 | div:nth-child(1) {
15 | height: 70%;
16 | }
17 |
18 | .text {
19 | text-align: left;
20 | padding: 20px 0;
21 | font-size: 12px;
22 | text-overflow: ellipsis;
23 | overflow: hidden;
24 |
25 | color: rgba(0, 0, 0, .5)
26 | }
27 |
28 | .button {
29 | text-align: center;
30 | margin-top: 10px;
31 | }
32 | }
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/components/B4ALabelTemplate/B4ALabelTemplate.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Field from 'components/Field/Field.react';
10 | import B4ALabelTemplate from 'components/B4ALabelTemplate/B4ALabelTemplate.react';
11 |
12 | export const component = B4ALabelTemplate;
13 |
14 | export const demos = [
15 | {
16 | render: () => (
17 | }
26 | input={null} />
27 | )
28 | }
29 | ];
30 |
--------------------------------------------------------------------------------
/src/components/B4aBadge/B4aBadge.react.js:
--------------------------------------------------------------------------------
1 | import PropTypes from 'lib/PropTypes';
2 | import React from 'react';
3 | import styles from 'components/B4aBadge/B4aBadge.scss';
4 |
5 | let B4aBadge = ({ label, color, additionalStyles = {} }) => (
6 |
7 | {label}
8 |
9 | );
10 |
11 | export default B4aBadge;
12 |
13 | B4aBadge.propTypes = {
14 | label: PropTypes.string.isRequired.describe(
15 | 'The badge label.'
16 | ),
17 | color: PropTypes.oneOf(['blue', 'green', 'red', 'ios', 'android']).describe(
18 | 'The color of the badge.'
19 | ),
20 | additionalStyles: PropTypes.object.describe(
21 | 'Additional styles for tag.'
22 | )
23 | };
24 |
--------------------------------------------------------------------------------
/src/components/B4aBadge/B4aBadge.scss:
--------------------------------------------------------------------------------
1 | @import 'stylesheets/globals.scss';
2 | @import 'stylesheets/back4app.scss';
3 |
4 | .badge {
5 | margin-top: 5px;
6 | display: inline-block;
7 | height: 18px;
8 | line-height: 16px;
9 | text-align: center;
10 | border: 1px solid;
11 | border-radius: 3px;
12 | letter-spacing: 1px;
13 | width: 45px;
14 | font-size: 12px;
15 | float: right;
16 | font-weight: bold;
17 | color: $white;
18 | min-width: fit-content;
19 | }
20 |
21 | .green {
22 | background-color: $green;
23 | border-color: $green;
24 | }
25 |
26 | .blue {
27 | background-color: $light-blue;
28 | border-color: $light-blue;
29 | }
30 |
31 | .red {
32 | background-color: $red;
33 | border-color: $red;
34 | }
35 |
36 | .ios {
37 | background-color: $iosColor;
38 | border-color: $iosColor;
39 | }
40 |
41 | .android {
42 | background-color: $androidColor;
43 | border-color: $androidColor;
44 | }
--------------------------------------------------------------------------------
/src/components/BooleanEditor/BooleanEditor.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .editor {
9 | background: white;
10 | white-space: nowrap;
11 | box-shadow: 0 1px 4px rgba(0,0,0,0.4);
12 |
13 | > *:first-child {
14 | margin: 6px 0;
15 | }
16 | }
--------------------------------------------------------------------------------
/src/components/BrowserMenu/MenuItem.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/BrowserMenu/BrowserMenu.scss';
10 |
11 | const MenuItem = ({ text, disabled, active, greenActive, onClick }) => {
12 | const classes = [styles.item];
13 | if (disabled) {
14 | classes.push(styles.disabled);
15 | }
16 | if (active) {
17 | classes.push(styles.active);
18 | }
19 | if (greenActive) {
20 | classes.push(styles.greenActive);
21 | }
22 | return (
23 |
24 | {text}
25 |
26 | );
27 | };
28 |
29 | export default MenuItem;
30 |
--------------------------------------------------------------------------------
/src/components/BrowserMenu/Separator.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/BrowserMenu/BrowserMenu.scss';
10 |
11 | const Separator = () => ;
12 |
13 | export default Separator;
14 |
--------------------------------------------------------------------------------
/src/components/Button/B4AButton.scss:
--------------------------------------------------------------------------------
1 | .b4a-green {
2 | color: #4caf50;
3 | border-color: #4caf50!important;
4 |
5 | &:hover, &:focus {
6 | background-color: #81c784;
7 | }
8 |
9 | &.primary {
10 | background-color: #4caf50;
11 | color: $white;
12 |
13 | &:hover, &:focus {
14 | background-color: #357a38;
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/components/CSRFInput/CSRFInput.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import { getToken } from 'lib/CSRFManager';
9 | import React from 'react';
10 |
11 | // An invisible component that embeds a hidden input
12 | // containing the CSRF token into a form
13 | const CSRFInput = () => (
14 |
15 |
16 |
17 | );
18 |
19 | export default CSRFInput;
20 |
--------------------------------------------------------------------------------
/src/components/Calendar/Calendar.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Calendar from 'components/Calendar/Calendar.react';
9 | import React from 'react';
10 |
11 | export const component = Calendar;
12 |
13 | export const demos = [
14 | {
15 | render: () => (
16 |
17 |
18 |
19 | ),
20 | },
21 | ];
22 |
--------------------------------------------------------------------------------
/src/components/CategoryList/CategoryItemAction.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/CategoryList/CategoryList.scss';
10 |
11 | export default class CategoryAction {
12 | constructor(text, fn) {
13 | this.text = text;
14 | this.fn = fn;
15 | }
16 |
17 | renderButton() {
18 | return (
19 |
22 | {this.text}
23 |
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/Checkbox/Checkbox.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Checkbox from 'components/Checkbox/Checkbox.react';
10 |
11 | export const component = Checkbox;
12 |
13 | export const demos = [
14 | {
15 | render: () => (
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | ),
28 | },
29 | ];
30 |
--------------------------------------------------------------------------------
/src/components/Chip/Chip.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Chip from 'components/Chip/Chip.react';
10 |
11 | export const component = Chip;
12 |
13 | export const demos = [
14 | {
15 | render: () => (
16 |
17 |
18 |
19 |
20 |
21 | ),
22 | },
23 | ];
24 |
--------------------------------------------------------------------------------
/src/components/CodeEditor/CodeEditor.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import CodeEditor from 'components/CodeEditor/CodeEditor.react';
10 |
11 | export const component = CodeEditor;
12 |
13 | export const demos = [
14 | {
15 | name: 'Simple code editor (only JS support)',
16 | render: () => ,
17 | },
18 | ];
19 |
--------------------------------------------------------------------------------
/src/components/CodeSnippet/CodeSnippet.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import CodeSnippet from 'components/CodeSnippet/CodeSnippet.react';
10 |
11 | export const component = CodeSnippet;
12 |
13 | export const demos = [
14 | {
15 | render() {
16 | const source = `// Some comment here
17 | Parse.Cloud.define('hello', function(req, resp) {
18 | let someVariable = "";
19 | let otherVariable = "
";
20 | });`;
21 |
22 | return ;
23 | },
24 | },
25 | {
26 | name: 'Print JSON',
27 | render() {
28 | const obj = {
29 | this: 'is awesome',
30 | awesome: true,
31 | };
32 |
33 | return ;
34 | },
35 | },
36 | ];
37 |
--------------------------------------------------------------------------------
/src/components/ColumnsConfiguration/ColumnConfigurationItem.scss:
--------------------------------------------------------------------------------
1 | .columnConfigItem {
2 | padding: 8px 10px;
3 | display: flex;
4 | border-radius: 5px;
5 | cursor: grab;
6 | }
7 |
8 | .icon {
9 | display: flex;
10 | align-items: center;
11 | height: 24px;
12 | }
13 |
14 | .visibilityIcon {
15 | cursor: pointer;
16 | width: 30px;
17 | }
18 |
19 | .columnConfigItemName {
20 | text-overflow: ellipsis;
21 | overflow: hidden;
22 | line-height: 24px;
23 | }
24 |
25 | .columnIcon {
26 | width: auto;
27 | flex-grow: 1;
28 | justify-content: end;
29 | }
--------------------------------------------------------------------------------
/src/components/CreditCardInput/CreditCardInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .input {
11 | @include NotoSansFont;
12 | border: 0;
13 | outline: 0;
14 | background: $inputBackgroundColor;
15 | font-size: 16px;
16 | width: 100%;
17 | height: 80px;
18 | padding: 6px;
19 | text-align: center;
20 | vertical-align: top;
21 | resize: none;
22 |
23 | &:focus {
24 | @include placeholder {
25 | opacity: 0;
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/components/DatePicker/DatePicker.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .input {
11 | width: 100%;
12 | height: 80px;
13 | line-height: 80px;
14 | text-align: center;
15 | background: $inputBackgroundColor;
16 | }
17 |
18 | .placeholder {
19 | color: $secondaryTextColor;
20 | }
21 |
22 | .picker {
23 | border: 1px solid $blue;
24 | background: white;
25 |
26 | > * {
27 | margin: 10% auto 4% auto;
28 | }
29 | }
30 |
31 | .value {
32 | color: $blue;
33 | }
--------------------------------------------------------------------------------
/src/components/DateTimeEditor/DateTimeEditor.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .editor {
11 | box-shadow: 0 1px 4px rgba(0,0,0,0.4);
12 |
13 | > input {
14 | @include MonospaceFont;
15 | width: 100%;
16 | height: 30px;
17 | border: none;
18 | outline: none;
19 | padding: 0 4px;
20 | font-size: 12px;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/components/DateTimeInput/DateTimeInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .input {
11 | width: 100%;
12 | height: 80px;
13 | line-height: 80px;
14 | text-align: center;
15 | background: $inputBackgroundColor;
16 | }
17 |
18 | .placeholder {
19 | color: $secondaryTextColor;
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/DateTimePicker/DateTimePicker.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .picker {
11 | border: 1px solid $blue;
12 | background: white;
13 |
14 | > *:first-child {
15 | margin: 10% auto 4% auto;
16 | }
17 | }
18 |
19 | .value {
20 | color: $lightBlue;
21 |
22 | strong {
23 | color: $blue;
24 | }
25 | }
26 |
27 | .time {
28 | margin: 0;
29 | padding: 12px;
30 | color: $blue;
31 | border-top: 1px solid $borderGrey;
32 | text-align: right;
33 |
34 | input {
35 | display: inline-block;
36 | width: 40px;
37 | height: 30px;
38 | border: 1px solid $blue;
39 | color: $blue;
40 | border-radius: 5px;
41 | outline: none;
42 | text-align: center;
43 | font-size: 12px;
44 | padding: 0;
45 | }
46 | }
--------------------------------------------------------------------------------
/src/components/DonutChart/DonutChart.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import DonutChart from 'components/DonutChart/DonutChart.react';
9 | import React from 'react';
10 |
11 | export const component = DonutChart;
12 |
13 | export const demos = [
14 | {
15 | name: 'Simple DonutChart',
16 | render: () => ,
17 | },
18 | {
19 | name: 'DonutChart without Dominant Value',
20 | render: () => ,
21 | },
22 | {
23 | name: 'Progress Bar with DonutChart',
24 | render: () => (
25 |
31 | ),
32 | },
33 | ];
34 |
--------------------------------------------------------------------------------
/src/components/Dropdown/Option.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/Dropdown/Dropdown.scss';
10 |
11 | const Option = props => ;
12 |
13 | export default Option;
14 |
--------------------------------------------------------------------------------
/src/components/EmptyState/EmptyState.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .title {
11 | font-size: 46px;
12 | font-weight: 100;
13 | line-height: 55px;
14 | white-space: nowrap;
15 | margin-bottom: 45px;
16 | }
17 |
18 | .description {
19 | @include DosisFont;
20 | font-size: 16px;
21 | letter-spacing: 0.72px;
22 | line-height: 17px;
23 | margin-bottom: 12px;
24 | }
25 |
26 | .icon {
27 | width: 170px;
28 | height: 170px;
29 | margin: 0 auto 24px auto;
30 | border-radius: 100%;
31 | background: #f3f0f2;
32 | text-align: center;
33 | padding-top: 45px;
34 | }
35 |
--------------------------------------------------------------------------------
/src/components/Fieldset/Fieldset.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Field from 'components/Field/Field.react';
10 | import Fieldset from 'components/Fieldset/Fieldset.react';
11 | import Label from 'components/Label/Label.react';
12 | import Toggle from 'components/Toggle/Toggle.react';
13 |
14 | export const component = Fieldset;
15 |
16 | export const demos = [
17 | {
18 | render: () => (
19 |
25 | ),
26 | },
27 | ];
28 |
--------------------------------------------------------------------------------
/src/components/FileTree/FileTree.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .directory, .file {
9 | color: #8fb9cf;
10 | height: 20px;
11 | line-height: 20px;
12 | font-size: 12px;
13 | cursor: pointer;
14 | }
15 |
16 | .directory {
17 | svg {
18 | vertical-align: middle;
19 | fill: #8fb9cf;
20 | margin-right: 6px;
21 | }
22 |
23 | > span {
24 | vertical-align: middle;
25 | }
26 |
27 | &:hover {
28 | color: white;
29 |
30 | svg {
31 | fill: white;
32 | }
33 | }
34 | }
35 |
36 | .contents {
37 | padding-left: 12px;
38 | }
39 |
40 | .file {
41 | display: block;
42 |
43 | &:hover {
44 | color: white;
45 | }
46 | }
47 |
48 | .current {
49 | color: white;
50 | }
51 |
--------------------------------------------------------------------------------
/src/components/FlowView/FlowView.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .flowViewWrapper {
9 | height: calc(100vh - 51px);
10 | display: flex;
11 | flex-direction: column;
12 | }
--------------------------------------------------------------------------------
/src/components/FormButton/FormButton.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Button from 'components/Button/Button.react';
9 | import React from 'react';
10 | import styles from 'components/FormButton/FormButton.scss';
11 |
12 | const FormButton = props => (
13 |
14 |
15 |
16 | );
17 |
18 | const { ...otherPropTypes } = Button.propTypes;
19 | FormButton.propTypes = otherPropTypes;
20 |
21 | export default FormButton;
22 |
--------------------------------------------------------------------------------
/src/components/FormButton/FormButton.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .input {
11 | width: 100%;
12 | height: 80px;
13 | text-align: center;
14 | padding-top: 25px;
15 | background: $inputBackgroundColor;
16 | }
--------------------------------------------------------------------------------
/src/components/FormModal/FormModal.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import FormModal from 'components/FormModal/FormModal.react';
9 |
10 | export const component = FormModal;
11 | export const demos = [];
12 |
--------------------------------------------------------------------------------
/src/components/FormNote/FormNote.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import { Directions } from 'lib/Constants';
9 | import PropTypes from 'lib/PropTypes';
10 | import React from 'react';
11 | import SliderWrap from 'components/SliderWrap/SliderWrap.react';
12 | import styles from 'components/FormNote/FormNote.scss';
13 |
14 | const FormNote = ({ show, children, color, ...other }) => (
15 |
16 | {children}
17 |
18 | );
19 |
20 | FormNote.propTypes = {
21 | show: PropTypes.bool,
22 | color: PropTypes.oneOf(['blue', 'green', 'orange', 'red']),
23 | };
24 |
25 | export default FormNote;
26 |
--------------------------------------------------------------------------------
/src/components/FormNote/FormNote.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .note {
11 | color: white;
12 | font-size: 12px;
13 | text-align: center;
14 | line-height: 30px;
15 | min-height: 30px;
16 | }
17 |
18 | .blue {
19 | background: $blue;
20 | }
21 | .green {
22 | background: $green;
23 | }
24 | .orange {
25 | background: $orange;
26 | }
27 | .red {
28 | background: $red;
29 | }
30 |
--------------------------------------------------------------------------------
/src/components/FourOhFour/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/FourOhFour/sprite.png
--------------------------------------------------------------------------------
/src/components/GeoPointEditor/GeoPointEditor.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .editor {
11 | position: absolute;
12 | top: 0;
13 | left: 0;
14 | box-shadow: 0 1px 4px rgba(0,0,0,0.4);
15 |
16 | input {
17 | @include MonospaceFont;
18 | width: 50%;
19 | height: 30px;
20 | border: none;
21 | outline: none;
22 | padding: 0 4px;
23 | font-size: 12px;
24 |
25 | &:first-child {
26 | border-right: 1px solid #e3e3ea;
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/src/components/GeoPointInput/GeoPointInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .geopoint {
11 | width: 100%;
12 | background: $inputBackgroundColor;
13 | height: 80px;
14 | }
15 |
16 | .labels {
17 | height: 30px;
18 |
19 | span {
20 | display: inline-block;
21 | width: 50%;
22 | height: 30px;
23 | line-height: 30px;
24 | text-align: center;
25 | color: $secondaryTextColor;
26 | font-size: 14px;
27 | }
28 | }
29 |
30 | .inputs {
31 | height: 50px;
32 |
33 | input {
34 | border: none;
35 | outline: none;
36 | background: none;
37 | height: 50px;
38 | width: 50%;
39 | font-size: 16px;
40 | text-align: center;
41 | }
42 | }
--------------------------------------------------------------------------------
/src/components/Icon/Icon.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Icon from 'components/Icon/Icon.react';
9 | import React from 'react';
10 |
11 | export const component = Icon;
12 |
13 | export const demos = [
14 | {
15 | render: () => (
16 |
17 |
18 |
19 |
20 |
21 |
22 | ),
23 | },
24 | ];
25 |
--------------------------------------------------------------------------------
/src/components/InlineSubmitInput/InlineSubmitInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .wrapper {
11 | background: $inputBackgroundColor;
12 | padding: 0px 5px;
13 | }
14 |
15 | .input_padded {
16 | padding-right: 50px;
17 | }
18 |
19 | .button {
20 | @include buttonReset($border: 1px solid #159cee, $padding: 0px 7px);
21 | position: absolute;
22 | top: 30px;
23 | right: 15px;
24 | height: 20px;
25 | line-height: 20px;
26 | outline: 0;
27 | text-decoration: none;
28 | text-align: center;
29 | border-radius: 5px;
30 | cursor: pointer;
31 | font-size: 10px;
32 | color: #159cee;
33 | }
34 |
--------------------------------------------------------------------------------
/src/components/JsonPrinter/JsonPrinter.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import CodeSnippet from 'components/CodeSnippet/CodeSnippet.react';
9 | import PropTypes from 'lib/PropTypes';
10 | import React from 'react';
11 |
12 | const JsonPrinter = ({ object }) => (
13 |
19 | );
20 |
21 | export default JsonPrinter;
22 |
23 | JsonPrinter.propTypes = {
24 | object: PropTypes.any.describe('The JavaScript object to stringify and print.'),
25 | };
26 |
--------------------------------------------------------------------------------
/src/components/KeyField/KeyField.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .key {
11 | @include MonospaceFont;
12 | background: $inputBackgroundColor;
13 | width: 100%;
14 | height: 80px;
15 | line-height: 80px;
16 | font-size: 12px;
17 | text-align: center;
18 | }
--------------------------------------------------------------------------------
/src/components/Label/Label.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Field from 'components/Field/Field.react';
10 | import Label from 'components/Label/Label.react';
11 |
12 | export const component = Label;
13 |
14 | export const demos = [
15 | {
16 | render: () => (
17 | }
19 | input={null}
20 | />
21 | ),
22 | },
23 | ];
24 |
--------------------------------------------------------------------------------
/src/components/Label/Label.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .label {
11 | font-size: 13px;
12 | }
13 |
14 | .text {
15 | font-weight: 700;
16 | display: flex;
17 | align-items: center;
18 | }
19 |
20 | .description {
21 | margin-top: 2px;
22 | color: $secondaryTextColor;
23 | line-height: 13px;
24 | }
25 |
26 | .help {
27 | margin-left: 6px;
28 | line-height: 0;
29 | }
30 |
--------------------------------------------------------------------------------
/src/components/LabelSettings/LabelSettings.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Field from 'components/Field/Field.react';
10 | import Label from 'components/Label/Label.react';
11 |
12 | export const component = Label;
13 |
14 | export const demos = [
15 | {
16 | render: () => (
17 | }
19 | input={null} />
20 | )
21 | }
22 | ];
23 |
--------------------------------------------------------------------------------
/src/components/LabelSettings/LabelSettings.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .label {
11 | font-size: 13px;
12 | text-align: start;
13 | }
14 |
15 | .text {
16 | font-weight: 700;
17 | display: flex;
18 | align-items: center;
19 | }
20 |
21 | .description {
22 | margin-top: 2px;
23 | color: $secondaryTextColor;
24 | line-height: 13px;
25 | }
26 |
27 | .help {
28 | margin-left: 6px;
29 | line-height: 0;
30 | }
31 |
--------------------------------------------------------------------------------
/src/components/LiveReload/LiveReload.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import LiveReload from 'components/LiveReload/LiveReload.react';
9 | import React from 'react';
10 |
11 | export const component = LiveReload;
12 | export const demos = [
13 | {
14 | render: () => (
15 | Promise.resolve(Math.random())}
17 | render={num => {num}}
18 | refreshIntervalMillis={100}
19 | initialData={0}
20 | />
21 | ),
22 | },
23 | ];
24 |
--------------------------------------------------------------------------------
/src/components/Loader/Loader.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import baseStyles from 'stylesheets/base.scss';
9 | import Loader from 'components/Loader/Loader.react';
10 | import React from 'react';
11 |
12 | export const component = Loader;
13 |
14 | export const demos = [
15 | {
16 | render() {
17 | return (
18 |
26 |
27 |
28 | );
29 | },
30 | },
31 | ];
32 |
--------------------------------------------------------------------------------
/src/components/Loader/Loader.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .loader {
11 | position: relative;
12 | display: block;
13 | width: 140px;
14 | height: 140px;
15 |
16 | div {
17 | position: absolute;
18 | width: 20px;
19 | height: 20px;
20 | border-radius: 100%;
21 | transform: translate(-50%, -50%);
22 |
23 | &:nth-child(3n) {
24 | background: $red;
25 | }
26 | &:nth-child(3n + 1) {
27 | background: $green;
28 | }
29 | &:nth-child(3n + 2) {
30 | background: $blue;
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/components/LoaderContainer/LoaderContainer.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .loaderContainer {
9 | position: relative;
10 | .loaderParent {
11 | visibility: hidden;
12 | background: rgba(255, 255, 255, 0.7);
13 | position: absolute;
14 | width: 100%;
15 | height: 100%;
16 | top: 0;
17 | left: 0;
18 | &.visible {
19 | visibility: visible;
20 | }
21 | &.solid {
22 | background: white;
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/components/LoaderDots/LoaderDots.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import LoaderDots from 'components/LoaderDots/LoaderDots.react';
10 |
11 | export const component = LoaderDots;
12 |
13 | export const demos = [
14 | {
15 | name: 'Loader Dots',
16 | render: () => (
17 |
18 |
19 |
20 | ),
21 | },
22 | ];
23 |
--------------------------------------------------------------------------------
/src/components/LoaderDots/LoaderDots.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/LoaderDots/LoaderDots.scss';
10 |
11 | export default class LoaderDots extends React.Component {
12 | constructor() {
13 | super();
14 | }
15 |
16 | render() {
17 | return (
18 |
19 |
20 |
21 |
22 |
23 | );
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/components/LogView/LogView.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/LogView/LogView.scss';
10 |
11 | const LogView = props => {
12 | return {props.children}
;
13 | };
14 |
15 | export default LogView;
16 |
--------------------------------------------------------------------------------
/src/components/LogView/LogView.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .view {
11 | background: $logViewBackgroundColor;
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/LogView/LogViewEntry.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import LogViewEntry from 'components/LogView/LogViewEntry.react';
10 |
11 | export const component = LogViewEntry;
12 |
13 | export const demos = [
14 | {
15 | render: () => ,
16 | },
17 | ];
18 |
--------------------------------------------------------------------------------
/src/components/LogView/LogViewEntry.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .entry {
11 | @include MonospaceFont;
12 | font-size: 14px;
13 | list-style: none;
14 | margin-bottom: 15px;
15 |
16 | &.error {
17 | color: red;
18 | }
19 |
20 | .content {
21 | white-space: pre-wrap;
22 | }
23 |
24 | .time {
25 | color: green;
26 | }
27 |
28 | //TODO: handle keywords that should be highlighted - use global vars for colors
29 | .highlight {
30 |
31 | &.error {
32 | color: red;
33 | }
34 |
35 | &.info {
36 | color: purple;
37 | }
38 |
39 | &.warning {
40 | color: orange;
41 | }
42 |
43 | &.success {
44 | color: green;
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/components/LoginRow/LoginRow.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/LoginRow/LoginRow.scss';
10 |
11 | const LoginRow = ({ label, input, extra }) => (
12 |
17 | );
18 |
19 | export default LoginRow;
20 |
--------------------------------------------------------------------------------
/src/components/Markdown/Markdown.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Markdown from 'components/Markdown/Markdown.react';
10 |
11 | export const component = Markdown;
12 |
13 | export const demos = [
14 | {
15 | name: 'Demo name',
16 | render: () => {
17 | const content = `
18 | **bold** *italic*
19 |
20 | ~~This code is a mistake~~
21 |
22 | > Some quote
23 |
24 | \`code\`
25 |
26 | # Super heading dude #
27 |
28 | ### These components are built by: ###
29 | 1. Andrew
30 | 2. Drew
31 | 3. Gogo
32 | 4. Peter
33 |
34 | \`\`\`
35 | some code block
36 | \`\`\`
37 | `;
38 | return ;
39 | },
40 | },
41 | ];
42 |
--------------------------------------------------------------------------------
/src/components/MoneyInput/MoneyInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .moneyInput {
11 | @include DosisFont;
12 | border: 0;
13 | outline: 0;
14 | background: $inputBackgroundColor;
15 | font-size: 22px;
16 | width: 100%;
17 | padding: 6px;
18 | vertical-align: top;
19 | resize: none;
20 | height: 80px;
21 | color: $green;
22 | text-align: center;
23 |
24 | &:focus {
25 | @include placeholder {
26 | opacity: 0;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/components/NumberEditor/NumberEditor.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .editor {
11 | position: absolute;
12 | top: 0;
13 | left: 0;
14 | box-shadow: 0 1px 4px rgba(0,0,0,0.4);
15 |
16 | input {
17 | @include MonospaceFont;
18 | width: 100%;
19 | height: 30px;
20 | border: none;
21 | outline: none;
22 | padding: 0 4px;
23 | font-size: 12px;
24 | }
25 | }
--------------------------------------------------------------------------------
/src/components/NumericInput/NumericInput.example.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | //example of how to fix height alignment of placeholder text
11 | .textarea_wrap textarea:not(.monospace) {
12 | @include placeholder {
13 | line-height: 200px;
14 | top: 0%;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/NumericInput/NumericInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .text_input {
11 | @include NotoSansFont;
12 | border: 0;
13 | outline: 0;
14 | background: $inputBackgroundColor;
15 | font-size: 16px;
16 | width: 100%;
17 | padding: 6px;
18 | vertical-align: top;
19 | resize: vertical;
20 |
21 | &:focus {
22 | @include placeholder {
23 | opacity: 0;
24 | }
25 | }
26 | }
27 |
28 | input.monospace, textarea.monospace {
29 | @include MonospaceFont;
30 | }
31 |
32 | input.text_input {
33 | text-align: center;
34 | }
35 |
36 | textarea.text_input:not(.monospace) {
37 | @include placeholder {
38 | text-align: center;
39 | position: relative;
40 | top: 50%;
41 | line-height: 9px;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/components/NumericInputSettings/NumericInputSettings.example.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | //example of how to fix height alignment of placeholder text
11 | .textarea_wrap textarea:not(.monospace) {
12 | @include placeholder {
13 | line-height: 200px;
14 | top: 0%;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/NumericInputSettings/NumericInputSettings.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .text_input {
11 | @include NotoSansFont;
12 | border: 1px solid lightgrey;
13 | outline: 0;
14 | font-size: 16px;
15 | width: 100%;
16 | padding: 6px;
17 | vertical-align: top;
18 | resize: vertical;
19 |
20 | &:focus {
21 | @include placeholder {
22 | opacity: 0;
23 | }
24 | }
25 | }
26 |
27 | input.monospace, textarea.monospace {
28 | @include MonospaceFont;
29 | }
30 |
31 | input.text_input {
32 | text-align: start;
33 | }
34 |
35 | textarea.text_input:not(.monospace) {
36 | @include placeholder {
37 | text-align: center;
38 | position: relative;
39 | top: 50%;
40 | line-height: 9px;
41 | }
42 | }
43 |
44 | .error {
45 | border-color: #ff395e;
46 | }
--------------------------------------------------------------------------------
/src/components/Pill/Pill.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Pill from 'components/Pill/Pill.react';
10 |
11 | export const component = Pill;
12 |
13 | export const demos = [
14 | {
15 | render: () => (
16 |
21 | ),
22 | },
23 | ];
24 |
--------------------------------------------------------------------------------
/src/components/PlatformCard/PlatformCard.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .card {
11 | width: 200px;
12 | height: 80px;
13 | background-color: $lightGrey;
14 | border-radius: 5px;
15 | padding: 10px;
16 | display: table;
17 | table-layout: fixed;
18 | }
19 |
20 | .left {
21 | display: table-cell;
22 | width: 50px;
23 | vertical-align: middle;
24 | }
25 |
26 | .right {
27 | display: table-cell;
28 | padding-left: 20px;
29 | vertical-align: middle;
30 | }
31 |
32 | .name {
33 | color: $platformCardTextColor;
34 | }
35 |
36 | .subtitle {
37 | color: $platformCardSecondaryTextColor;
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/Popover/Popover.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .popover_wrapper, .fixed_wrapper {
11 | position: absolute;
12 | top: 0;
13 | left: 0;
14 | bottom: 0;
15 | right: 0;
16 | pointer-events: none;
17 | z-index: 100; // This is just +1 z-index of Sidebar
18 |
19 | & > div {
20 | position: absolute;
21 | pointer-events: all;
22 | }
23 | }
24 |
25 | .transition{
26 | @include animation('fade-in .2s linear');
27 | opacity: 1;
28 | }
29 |
30 | .popover_wrapper {
31 | position: absolute;
32 | }
33 |
34 | .fixed_wrapper {
35 | position: fixed;
36 | }
37 |
38 | .popoverLayer {
39 | cursor: pointer;
40 | }
41 |
42 |
43 | @include keyframes(fade-in) {
44 | 0% {
45 | opacity: 0;
46 | }
47 | }
--------------------------------------------------------------------------------
/src/components/PopoverTooltip/PopoverTooltip.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .popover {
11 | position: relative;
12 | }
13 |
14 | .tooltipContainer {
15 | inset: 0px auto auto 0px;
16 | background-color: #fff;
17 | border-radius: 4px;
18 | border: 1px solid #c0c0c0;
19 | filter: drop-shadow(0px 2px 4px rgba(0, 0, 0, 0.12));
20 | color: #000;
21 | display: flex;
22 | flex-direction: column;
23 | padding: 0.4rem;
24 | transition: opacity 0.3s;
25 | z-index: 9999;
26 | }
27 |
28 | .tooltipContent {
29 | display: inline-block;
30 | width: 100%;
31 | }
32 |
33 | .tooltipArrow {
34 | position: absolute;
35 | bottom: -5px;
36 | width: 0;
37 | height: 0;
38 | border-left: 8px solid transparent;
39 | border-right: 8px solid transparent;
40 | border-top: 8px solid #fff;
41 | }
--------------------------------------------------------------------------------
/src/components/PushAudiencesSelector/PushAudiencesOption.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import PushAudiencesOption from 'components/PushAudiencesSelector/PushAudiencesOption.react';
10 |
11 | export const component = PushAudiencesOption;
12 |
13 | const mockData = {
14 | id: '1',
15 | name: 'Everyone',
16 | createdAt: new Date(1444757195683),
17 | };
18 |
19 | export const demos = [
20 | {
21 | render() {
22 | return (
23 |
30 | );
31 | },
32 | },
33 | ];
34 |
--------------------------------------------------------------------------------
/src/components/PushAudiencesSelector/PushAudiencesSelector.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 | .container {
10 | position: relative;
11 | width: 100%;
12 | overflow: hidden;
13 | min-height: 200px;
14 | .header {
15 | position: absolute;
16 | top: 0;
17 | left: 0;
18 | width: 100%;
19 | color: white;
20 | background: #66637A;
21 | padding: 8px 20px 6px 20px;
22 | font-size: 14px;
23 | }
24 | .body {
25 | padding-top: 31px;
26 | max-height: 400px;
27 | overflow: auto;
28 | }
29 | .cell {
30 | display: inline-block;
31 | }
32 | .col1 {
33 | width: 50%;
34 | }
35 | .col2 {
36 | width: 20%;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/PushPreview/android.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/PushPreview/android.jpg
--------------------------------------------------------------------------------
/src/components/PushPreview/iphone.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/PushPreview/iphone.jpg
--------------------------------------------------------------------------------
/src/components/PushPreview/laptop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/PushPreview/laptop.jpg
--------------------------------------------------------------------------------
/src/components/PushPreview/windowsphone.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/components/PushPreview/windowsphone.jpg
--------------------------------------------------------------------------------
/src/components/RadioButton/RadioButton.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import RadioButton from 'components/RadioButton/RadioButton.react';
10 |
11 | export const component = RadioButton;
12 |
13 | export const demos = [
14 | {
15 | name: 'Unchecked State',
16 | render() {
17 | return ;
18 | },
19 | },
20 | {
21 | name: 'Checked State',
22 | render() {
23 | return ;
24 | },
25 | },
26 | {
27 | name: 'Disabled State [styles tbd]',
28 | render() {
29 | return ;
30 | },
31 | },
32 | {
33 | name: 'Disabled Checked State [styles tbd]',
34 | render() {
35 | return ;
36 | },
37 | },
38 | ];
39 |
--------------------------------------------------------------------------------
/src/components/RadioButton/RadioButton.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/RadioButton/RadioButton.scss';
10 |
11 | const RadioButton = props => {
12 | const parentClassName = props.parentClassName || '';
13 | props = Object.assign({}, props);
14 | delete props.parentClassName;
15 | return (
16 |
17 |
18 |
19 |
20 | );
21 | };
22 |
23 | export default RadioButton;
24 |
--------------------------------------------------------------------------------
/src/components/ReleaseInfo/ReleaseInfo.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import howLongAgo from 'lib/howLongAgo';
9 |
10 | const ReleaseInfo = ({ release }) => {
11 | if (!release) {
12 | return '';
13 | }
14 |
15 | return [
16 | 'Latest deploy: ',
17 | release.version,
18 | ' \u2022 ',
19 | howLongAgo(release.deployedAt),
20 | ' \u2022 SDK Version: ',
21 | release.parseVersion,
22 | ].join('');
23 | };
24 |
25 | export default ReleaseInfo;
26 |
--------------------------------------------------------------------------------
/src/components/SaveButton/SaveButton.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .shake {
11 | @include transform(translateX(0));
12 | @include animation('shake 0.6s');
13 | }
14 |
15 | @include keyframes (shake) {
16 | 0% {
17 | @include transform(translateX(-5px));
18 | }
19 | 20% {
20 | @include transform(translateX(5px));
21 | }
22 | 40% {
23 | @include transform(translateX(-5px));
24 | }
25 | 60% {
26 | @include transform(translateX(5px));
27 | }
28 | 80% {
29 | @include transform(translateX(-5px));
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/components/ScrollHint/ScrollHint.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/ScrollHint/ScrollHint.scss';
10 |
11 | export default class ScrollHint extends React.Component {
12 | constructor() {
13 | super();
14 | this.state = { active: false };
15 | }
16 |
17 | toggle(active) {
18 | this.setState({ active });
19 | }
20 |
21 | render() {
22 | const { active } = this.state;
23 |
24 | const classes = [styles.scrollHint, active ? styles.active : undefined].join(' ');
25 |
26 | return ;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/components/ScrollHint/ScrollHint.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .scrollHint.active::before{
9 | content: '╲╱';
10 | color: rgb(116, 214, 249);
11 | position: absolute;
12 | opacity: 0.8;
13 | text-shadow: 0 0 .5rem rgba(0,0,0,0.5);
14 | width: 6rem;
15 | font-size: 1rem;
16 | height: 2rem;
17 | line-height: 2rem;
18 | text-align: center;
19 | bottom: 2rem;
20 | margin-left: -3rem;
21 | left: 50%;
22 | animation: bounce 1s ease infinite;
23 | }
24 |
25 | @keyframes bounce {
26 | 50% {
27 | transform: translateY(-50%);
28 | }
29 | 100% {
30 | transform: translateY(0);
31 | }
32 | }
--------------------------------------------------------------------------------
/src/components/SegmentSelect/SegmentSelect.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import SegmentSelect from 'components/SegmentSelect/SegmentSelect.react';
10 |
11 | export const component = SegmentSelect;
12 |
13 | class Demo extends React.Component {
14 | constructor() {
15 | super();
16 | this.state = {
17 | current: null,
18 | };
19 | }
20 |
21 | render() {
22 | return (
23 | this.setState({ current })}
27 | />
28 | );
29 | }
30 | }
31 |
32 | export const demos = [
33 | {
34 | render: () => ,
35 | },
36 | ];
37 |
--------------------------------------------------------------------------------
/src/components/SegmentSelect/SegmentSelect.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .row {
11 | display: inline-block;
12 | height: 24px;
13 |
14 | a {
15 | @include DosisFont;
16 | display: inline-block;
17 | height: 24px;
18 | line-height: 24px;
19 | padding: 0 12px;
20 | font-size: 12px;
21 | border-style: solid;
22 | border-color: $blue;
23 | border-width: 1px 0 1px 1px;
24 | color: $blue;
25 |
26 | &:first-child {
27 | border-radius: 5px 0 0 5px;
28 | }
29 | &:last-child {
30 | border-radius: 0 5px 5px 0;
31 | border-right-width: 1px;
32 | }
33 |
34 | &.current {
35 | background: $blue;
36 | color: white;
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/components/Sidebar/AppName.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Pin from 'components/Sidebar/Pin.react';
3 | import Tooltip from 'components/Tooltip/SimpleTooltip.react';
4 | import styles from 'components/Sidebar/Sidebar.scss';
5 |
6 | const AppName = ({ name, onClick, pin, onPinClick }) => (
7 |
8 |
9 |
10 |
{name})}>
11 | {name}
12 |
13 |
14 |
15 | {pin}
16 |
17 |
18 | );
19 |
20 | export default AppName;
21 |
--------------------------------------------------------------------------------
/src/components/Sidebar/Pin.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import Icon from 'components/Icon/Icon.react';
4 | import styles from 'components/Sidebar/Sidebar.scss';
5 |
6 | const Pin = ({ onClick }) => (
7 |
8 |
9 |
10 | );
11 |
12 | export default Pin;
13 |
--------------------------------------------------------------------------------
/src/components/Sidebar/SidebarAction.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/Sidebar/Sidebar.scss';
10 |
11 | export default class SidebarAction {
12 | constructor(text, fn) {
13 | this.text = text;
14 | this.fn = fn;
15 | }
16 |
17 | renderButton() {
18 | return (
19 |
20 | {this.text}
21 |
22 | );
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/components/Sidebar/zendeskSettings.js:
--------------------------------------------------------------------------------
1 | const zendeskSettings = () => {
2 | return window.zESettings = {
3 | webWidget: {
4 | position: {
5 | horizontal: 'left',
6 | }
7 | }
8 | };
9 | }
10 |
11 | export default zendeskSettings()
12 |
--------------------------------------------------------------------------------
/src/components/SliderWrap/SliderWrap.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .slider {
9 | overflow: hidden;
10 | transition: all 0.5s cubic-bezier(1, 0, 0, 1);
11 | }
12 |
13 | .metrics {
14 | width: 100%;
15 | display: inline-block;
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/StatusIndicator/StatusIndicator.example.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import StatusIndicator from 'components/StatusIndicator/StatusIndicator.react';
10 |
11 | export const component = StatusIndicator;
12 |
13 | export const demos = [
14 | {
15 | name: 'Positive',
16 | render: () => ,
17 | },
18 | {
19 | name: 'Negative',
20 | render: () => ,
21 | },
22 | {
23 | name: 'In Progress',
24 | render: () => ,
25 | },
26 | ];
27 |
--------------------------------------------------------------------------------
/src/components/StatusIndicator/StatusIndicator.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import PropTypes from 'lib/PropTypes';
9 | import React from 'react';
10 | import styles from 'components/StatusIndicator/StatusIndicator.scss';
11 |
12 | const StatusIndicator = ({ text, color }) => {
13 | color = color || 'blue';
14 | return {text};
15 | };
16 |
17 | StatusIndicator.propTypes = {
18 | text: PropTypes.string.isRequired,
19 | color: PropTypes.oneOf(['blue', 'green', 'red']),
20 | };
21 |
22 | export default StatusIndicator;
23 |
--------------------------------------------------------------------------------
/src/components/StatusIndicator/StatusIndicator.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .status {
11 | @include DosisFont;
12 | display: inline-block;
13 | font-size: 14px;
14 | letter-spacing: 0.1em;
15 | text-transform: uppercase;
16 |
17 | &:before {
18 | content: '';
19 | display: inline-block;
20 | width: 11px;
21 | height: 11px;
22 | border-radius: 100%;
23 | margin-right: 8px;
24 | }
25 | }
26 |
27 | .blue {
28 | color: $blue;
29 |
30 | &:before {
31 | background: $blue;
32 | }
33 | }
34 |
35 | .red {
36 | color: $red;
37 |
38 | &:before {
39 | background: $red;
40 | }
41 | }
42 |
43 | .green {
44 | color: $green;
45 |
46 | &:before {
47 | background: $green;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/components/StringEditor/StringEditor.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .editor {
11 | position: absolute;
12 | top: 0;
13 | left: 0;
14 | box-shadow: 0 1px 4px rgba(0,0,0,0.4);
15 |
16 | input {
17 | @include MonospaceFont;
18 | width: 100%;
19 | height: 30px;
20 | border: none;
21 | outline: none;
22 | padding: 0 4px;
23 | font-size: 12px;
24 | }
25 |
26 | &.readonly {
27 | box-shadow: 0px 0px 2px 1px rgb(0 0 0 / 20%);
28 | }
29 |
30 | input:disabled {
31 | background-color: #f2f2f2;
32 | color: #666;
33 | }
34 |
35 | textarea {
36 | @include MonospaceFont;
37 | width: 200px;
38 | height: 93px;
39 | font-size: 12px;
40 | padding: 4px;
41 | resize: none;
42 | border: none;
43 | outline: none;
44 | }
45 | }
--------------------------------------------------------------------------------
/src/components/SuggestionsList/SuggestionsList.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .suggestions {
11 | border: 1px solid $mainTextColor;
12 | border-top-width: 0;
13 | list-style: none;
14 | max-height: 143px;
15 | overflow-y: auto;
16 | -moz-box-shadow: 0px 0px 0px #666, 0px 4px 8px #666;
17 | -webkit-box-shadow: 0px 0px 0px #666, 0px 4px 8px #666;
18 | box-shadow:0px 0px 0px #666, 0px 4px 8px #666;
19 | }
20 |
21 | .suggestions li {
22 | background: white;
23 | padding-left: 10px;
24 | font-family:"Open Sans", sans-serif;
25 | }
26 |
27 | .active,
28 | .suggestions li:hover {
29 | color: #0e69a1;
30 | cursor: pointer;
31 | font-weight: 500;
32 | }
33 |
34 | .suggestions li:not(:last-of-type) {
35 | border-bottom: 1px solid #999;
36 | }
--------------------------------------------------------------------------------
/src/components/Table/TableHeader.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import styles from 'components/Table/Table.scss';
10 |
11 | const TableHeader = ({ width, ...props }) => {
12 | const style = {};
13 | if (width !== undefined) {
14 | style.width = width + '%';
15 | }
16 | return ;
17 | };
18 |
19 | export default TableHeader;
20 |
--------------------------------------------------------------------------------
/src/components/TextInput/TextInput.example.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | //example of how to fix height alignment of placeholder text
11 | .textarea_wrap textarea:not(.monospace) {
12 | @include placeholder {
13 | line-height: 200px;
14 | top: 0%;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/TextInput/TextInput.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .text_input {
11 | @include NotoSansFont;
12 | border: 0;
13 | outline: 0;
14 | background: $inputBackgroundColor;
15 | font-size: 16px;
16 | width: 100%;
17 | padding: 6px;
18 | vertical-align: top;
19 | resize: vertical;
20 |
21 | &:focus {
22 | @include placeholder {
23 | opacity: 0;
24 | }
25 | }
26 | }
27 |
28 | input.monospace, textarea.monospace {
29 | @include MonospaceFont;
30 | }
31 |
32 | input.text_input {
33 | text-align: center;
34 | }
35 |
36 | textarea.text_input:not(.monospace) {
37 | @include placeholder {
38 | text-align: center;
39 | position: relative;
40 | top: 50%;
41 | line-height: 9px;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/components/TextInputSettings/TextInputSettings.example.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | //example of how to fix height alignment of placeholder text
11 | .textarea_wrap textarea:not(.monospace) {
12 | @include placeholder {
13 | line-height: 200px;
14 | top: 0%;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/Tooltip/PopperTooltip.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { usePopperTooltip } from 'react-popper-tooltip';
3 | import 'react-popper-tooltip/dist/styles.css';
4 |
5 | const PopperTooltip = props => {
6 | const { children, tooltip, visible, placement } = props;
7 | const { getArrowProps, getTooltipProps, setTooltipRef, setTriggerRef } = usePopperTooltip({
8 | placement,
9 | });
10 |
11 | return (
12 | <>
13 | {children}
14 | {visible && (
15 |
23 | )}
24 | >
25 | );
26 | };
27 |
28 | export default PopperTooltip;
29 |
--------------------------------------------------------------------------------
/src/components/Tooltip/Tooltip.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import PropTypes from 'lib/PropTypes';
9 | import React from 'react';
10 | import styles from 'components/Tooltip/Tooltip.scss';
11 |
12 | const Tooltip = ({ value, children }) => {
13 | return (
14 |
15 | {children}
16 |
17 |
{value}
18 |
19 |
20 |
21 |
22 | );
23 | };
24 |
25 | export default Tooltip;
26 |
27 | Tooltip.propTypes = {
28 | value: PropTypes.node.isRequired.describe('The tooltip text.'),
29 | children: PropTypes.node.describe('The content that should reveal a tooltip when hovered.'),
30 | };
31 |
--------------------------------------------------------------------------------
/src/components/TrackVisibility/TrackVisibility.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React, { useRef, useEffect } from 'react';
9 |
10 | export default function TrackVisibility(props) {
11 | const refContainer = useRef(null);
12 |
13 | useEffect(() => {
14 | props.observer.observe(refContainer.current);
15 | return () => {
16 | props.observer.disconnect();
17 | };
18 | }, [props.observer]);
19 |
20 | return {props.children}
;
21 | }
22 |
--------------------------------------------------------------------------------
/src/context/currentApp.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const CurrentApp = React.createContext(null);
4 |
--------------------------------------------------------------------------------
/src/dashboard/AccountView.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import { buildAccountSidebar } from './SidebarBuilder';
10 | import styles from 'dashboard/Dashboard.scss';
11 |
12 | export default class AccountView extends React.Component {
13 | render() {
14 | const sidebar = buildAccountSidebar({
15 | section: this.props.section,
16 | subsection: this.props.subsection,
17 | });
18 |
19 | return (
20 |
21 |
{this.props.children}
22 | {sidebar}
23 |
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/dashboard/Analytics/SlowQueries/SlowQueries.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .toolbarAction {
11 | @include buttonReset($padding: 0px 20px);
12 | color: white;
13 | font-size: 1rem;
14 |
15 | > *:not(svg) {
16 | margin: 5px;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/dashboard/Apps/loadingIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/Apps/loadingIcon.png
--------------------------------------------------------------------------------
/src/dashboard/B4aAppTemplates/B4aAppTemplates.scss:
--------------------------------------------------------------------------------
1 | @import 'stylesheets/back4app.scss';
2 |
3 | .loading {
4 | display: flex;
5 | align-items: center;
6 | justify-content: center;
7 | min-height: calc(#{$content-max-height} - #{$toolbar-height});
8 | }
9 |
10 | .app-templates {
11 | background-color: #f9f9f9;
12 | max-height: calc(#{$content-max-height} - #{$toolbar-height});
13 | margin-top: $toolbar-height;
14 | overflow: auto;
15 | }
16 |
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/B4aConnectPage.scss:
--------------------------------------------------------------------------------
1 | @import 'stylesheets/back4app.scss';
2 |
3 | .loading {
4 | position: relative;
5 | min-height: $content-max-height;
6 | }
7 |
8 | .connect-page {
9 | background-color: #f9f9f9;
10 | min-height: $content-max-height;
11 | padding-top: 70px;
12 | overflow: hidden;
13 | }
14 |
15 | .frameworkList-container {
16 | display: flex;
17 | flex-wrap: wrap;
18 | margin-top: 30px;
19 | }
20 |
21 | .framework-box {
22 | width: 140px;
23 | height: 130px;
24 | padding: 10px 20px;
25 | border: 1px solid #e4e4e4;
26 | display: flex;
27 | flex-direction: column;
28 | align-items: center;
29 | justify-content: center;
30 | margin: 10px;
31 | border-radius: 10px;
32 | transition: ease 0.5s;
33 |
34 | &:hover {
35 | box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.15);
36 | text-decoration: none;
37 | }
38 |
39 | & > p {
40 | margin-top: 10px;
41 | color: #444444;
42 | font-size: 14px;
43 | }
44 | }
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/android-robot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/android-robot.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/apple-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/apple-logo.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/flutter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/flutter.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/graphQl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/graphQl.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/ionic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/ionic.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/javascript-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/javascript-icon.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/react.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/react.png
--------------------------------------------------------------------------------
/src/dashboard/B4aConnectPage/xamarin-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/B4aConnectPage/xamarin-logo.png
--------------------------------------------------------------------------------
/src/dashboard/Dashboard.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/back4app.scss';
9 | @import 'stylesheets/globals.scss';
10 |
11 | .content {
12 | margin-left: 300px;
13 | max-height: $content-max-height;
14 | overflow: auto;
15 | }
16 |
17 | body:global(.expanded) {
18 | .content {
19 | margin-left: 54px;
20 | }
21 | }
22 |
23 |
24 | .loadingError {
25 | font-size: 58px;
26 | color: #ffffff;
27 | }
28 |
29 | .empty {
30 | position: relative;
31 | background: #1e3b4d;
32 | min-height: 100vh;
33 | text-align: center;
34 | }
35 |
36 | .cloud {
37 | width: 170px;
38 | height: 170px;
39 | border-radius: 100%;
40 | padding-top: 30px;
41 | background: #3E5566;
42 | margin: 0 auto 14px auto;
43 | }
--------------------------------------------------------------------------------
/src/dashboard/Data/Browser/ConfirmDeleteColumnDialog.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Modal from 'components/Modal/Modal.react';
9 | import React from 'react';
10 |
11 | export default class ConfirmDeleteColumnDialog extends React.Component {
12 |
13 | render() {
14 | let content = null;
15 |
16 | return (
17 |
26 | {content}
27 |
28 | );
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/dashboard/Data/Browser/ExportSelectedRowsDialog.scss:
--------------------------------------------------------------------------------
1 | .row {
2 | display: block;
3 | position: relative;
4 | height: 100px;
5 | border-bottom: 1px solid #e0e0e1;
6 | }
7 | .label {
8 | line-height: 16px;
9 | }
10 |
--------------------------------------------------------------------------------
/src/dashboard/Data/Browser/postgresql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/dashboard/Data/Browser/postgresql.png
--------------------------------------------------------------------------------
/src/dashboard/Data/CloudCode/B4ACloudCodeToolbar.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Toolbar from 'components/Toolbar/Toolbar.react';
3 | import styles from 'dashboard/Data/CloudCode/B4ACloudCodeToolbar.scss';
4 |
5 | let B4ACloudCodeToolbar = () => {
6 | return (
7 |
11 |
12 | );
13 | };
14 |
15 | export default B4ACloudCodeToolbar;
16 |
--------------------------------------------------------------------------------
/src/dashboard/Data/CloudCode/B4ACloudCodeToolbar.scss:
--------------------------------------------------------------------------------
1 |
2 | .title {
3 | position: absolute;
4 | left: 0;
5 | width: 100%;
6 | margin-top: 0px;
7 | }
8 |
9 | body:global(.expanded) {
10 | .title {
11 | left: 0;
12 | }
13 | }
14 |
15 |
--------------------------------------------------------------------------------
/src/dashboard/Data/CloudCode/CloudCode.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/back4app.scss';
9 | @import 'stylesheets/globals.scss';
10 | @import "B4ACloudCode";
11 |
12 | .source {
13 | position: relative;
14 | min-height: $content-max-height;
15 | display: flex;
16 | flex-direction: column;
17 | }
18 |
19 | .content {
20 | padding: 96px 0px 0px 0px;
21 | min-height: $content-max-height;
22 | }
23 |
24 | body:global(.expanded) {
25 | .toolbar {
26 | left: 0px!important;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/dashboard/Data/Jobs/JobScheduleReminder.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import baseStyles from 'stylesheets/base.scss';
3 |
4 | export default class JobScheduleReminder extends React.Component {
5 | render() {
6 | return (
7 |
8 |
9 | {'Be noted that '}
10 | {'parse-server doesn\'t run the jobs in the scheduled times'}
11 | {' by itself.'}
12 |
13 |
14 | {'Please take a look at the '}
15 | {'docs'}
16 | {' on how to do that.'}
17 |
18 |
19 | );
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/dashboard/Data/Jobs/Jobs.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .jobsFlow {
9 | padding: 120px 0 100px 0;
10 | overflow: auto;
11 | }
12 |
13 | .buttonCell {
14 | > a:not(:last-child) {
15 | margin-right: 10px;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/dashboard/Data/Playground/Playground.scss:
--------------------------------------------------------------------------------
1 | .playground-ctn {
2 | padding-top: 48px;
3 | background-color: #002b36;
4 | height: calc(100vh - 48px);
5 | }
6 |
7 | .console-ctn {
8 | display: flex;
9 | align-items: center;
10 | justify-content: stretch;
11 | flex-direction: column;
12 |
13 | & h3 {
14 | height: 28px;
15 | line-height: 28px;
16 | font-size: 16px;
17 | font-weight: 700;
18 | color: white;
19 | }
20 |
21 | & > header {
22 | flex: 1;
23 | padding: 0 0 0 10px;
24 | background-color: #169cee;
25 | display: flex;
26 | align-items: center;
27 | justify-content: space-between;
28 | width: 100%;
29 | }
30 |
31 | & > section {
32 | width: 100%;
33 | }
34 | }
35 |
36 | .buttons-ctn {
37 | display: flex;
38 | justify-content: flex-end;
39 | padding: 15px;
40 | align-items: center;
41 |
42 | & > div {
43 | display: flex;
44 | justify-content: flex-end;
45 | width: 25%;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/dashboard/Data/Webhooks/Webhooks.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .deleteButton {
11 | @include buttonReset;
12 | }
13 |
--------------------------------------------------------------------------------
/src/dashboard/Push/PushAudiencesData.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .showMoreWrap {
11 | padding: 10px;
12 | margin-left: 20px;
13 | }
14 |
15 | .pushAudienceData {
16 | border: 1px solid $borderGrey;
17 | }
18 |
19 | .pushAudienceDialog {
20 | text-align: right;
21 | border-top: 1px solid $borderGrey;
22 | padding: 15px 30px 15px 15px;
23 | }
24 |
--------------------------------------------------------------------------------
/src/dashboard/ServerSettings/ServerSettings.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | *
8 | */
9 | @import 'stylesheets/back4app.scss';
10 | @import 'stylesheets/globals.scss';
11 |
12 | $toolbar-height: 48px;
13 | $server-settings-content-height: calc(#{$content-max-height} - #{$toolbar-height});
14 |
15 | .content {
16 | max-height: $server-settings-content-height;
17 | margin-top: 48px;
18 | overflow: hidden;
19 | }
20 |
21 | .iframeContent {
22 | max-height: $server-settings-content-height;
23 | min-height: $server-settings-content-height;
24 | width: 100%;
25 | border: 0;
26 |
27 | iframe {
28 | outline: 5px solid red;
29 | }
30 | }
31 |
32 |
33 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/DashboardSettings/DashboardSettings.scss:
--------------------------------------------------------------------------------
1 | .copyData {
2 | max-height: 50vh;
3 | overflow-y: scroll;
4 | }
5 | .newUser {
6 | max-height: 100px;
7 | overflow-y: scroll;
8 | }
9 | .settings_page {
10 | padding: 120px 0 80px 0;
11 | }
12 | .footer {
13 | display: flex;
14 | padding: 10px;
15 | justify-content: end;
16 | gap: 10px;
17 | }
18 | .password {
19 | display: flex;
20 | gap: 4px;
21 | }
22 | .userData {
23 | padding: 10px;
24 | }
25 | .mfa {
26 | display: block;
27 | margin-top: 10px;
28 | }
29 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/GeneralSettings.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .cost {
11 | font-size: 18px;
12 | color: $blue;
13 | line-height: 18px;
14 | padding-right: 18px;
15 | padding-top: 16px;
16 | @include DosisFont;
17 | text-transform: uppercase;
18 | }
19 |
20 | .features {
21 | @include DosisFont;
22 | padding-right: 18px;
23 | padding-top: 1px;
24 | font-size: 14px;
25 | color: #66637a;
26 | line-height: 14px;
27 | }
28 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/GeneralSettingsValidataions.js:
--------------------------------------------------------------------------------
1 | import * as yup from 'yup';
2 |
3 | export default yup.object({
4 | appName: yup.string().min(0).max(255),
5 | collaborators: yup.array(),
6 | parseOptions: yup.object({
7 | passwordPolicy: yup.object({
8 | resetTokenValidityDuration: yup.number().positive(),
9 | validatorPattern: yup.string().trim().max(1000).min(3),
10 | validationError: yup.string().trim().max(1000).min(1),
11 | maxPasswordAge: yup.number().integer().min(0),
12 | maxPasswordHistory: yup.number().integer().min(0).max(20)
13 | }),
14 | accountLockout: yup.object({
15 | duration: yup.number().positive().max(100000),
16 | threshold: yup.number().positive().max(1000)
17 | })
18 | })
19 | });
20 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Modals/collaboratorRemovedWarningModal.js:
--------------------------------------------------------------------------------
1 | export default ({ Modal, joinWithFinal }) => this.setState({removedCollaborators: []})}
8 | buttonsInCenter={true}
9 | textModal={true}>
10 | We have removed {joinWithFinal('', this.state.removedCollaborators.map(c => c.userName || c.userEmail), ', ', ' and ')} from this app. If they had saved the master key, they may still have access via an SDK or the API. To be sure, you can reset your master key in the Keys section of app settings.
11 | ;
12 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Modals/deleteAppModal.js:
--------------------------------------------------------------------------------
1 | export default ({
2 | Modal, state, AppsManager, context, setState, history, passwordField
3 | }) => 0}
13 | onSubmit={() => AppsManager.deleteApp(context.slug, state.password)}
14 | onSuccess={() => history.push('/apps')}
15 | onClose={() => setState({showDeleteAppModal: false})}
16 | clearFields={() => setState({password: ''})}>
17 | {passwordField}
18 |
19 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Modals/purgeFilesModal.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Modal from 'components/Modal/Modal.react';
3 |
4 | export const PurgeFilesModal = ({ context, setParentState }) => setParentState({ showPurgeFilesModal: false })}
14 | onConfirm={() => context.cleanUpFiles().then(() => {
15 | setParentState({
16 | cleanupFilesMessage: 'All set! You\'ll receive an email when the process is over.',
17 | cleanupNoteColor: 'orange',
18 | showPurgeFilesModal: false,
19 | });
20 | }).catch((e) => {
21 | setParentState({
22 | cleanupFilesMessage: e.error,
23 | cleanupNoteColor: 'red',
24 | showPurgeFilesModal: false,
25 | });
26 | })} />
27 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Modals/purgeSystemLogModal.react.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Modal from 'components/Modal/Modal.react';
3 |
4 | export const PurgeSystemLogModal = ({ context, setParentState }) => setParentState({showPurgeSystemLogModal: false})}
14 | onConfirm={() => context.cleanUpSystemLog().then(() => {
15 | setParentState({
16 | cleanupSystemLogMessage: 'Your System log was deleted.',
17 | cleanupNoteColor: 'orange',
18 | showPurgeSystemLogModal: false,
19 | });
20 | }).fail((e) => {
21 | setParentState({
22 | cleanupSystemLogMessage: e.error,
23 | cleanupNoteColor: 'red',
24 | showPurgeSystemLogModal: false,
25 | });
26 | })} />
27 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Security/Security.scss:
--------------------------------------------------------------------------------
1 | @import 'stylesheets/globals.scss';
2 | .tableData {
3 | white-space: normal !important;
4 | }
5 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Settings.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | .settings_page {
9 | margin-top: 48px;
10 | overflow: auto;
11 | }
12 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Util/compareCollaborators.js:
--------------------------------------------------------------------------------
1 | export const compareCollaborators = (collab1, collab2) => (collab1.userEmail === collab2.userEmail);
2 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Util/getError.js:
--------------------------------------------------------------------------------
1 | export default ( errors, field ) =>
2 | errors.find( error => error.startsWith(field) )?.replace(field, '');
3 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Util/index.js:
--------------------------------------------------------------------------------
1 | export * from './generalFieldsOptions';
2 | export * from './compareCollaborators';
3 | export * from './verifyEditedCollaborators';
4 | export * from './getPromiseList';
5 | export * from './renderModal';
6 | export * from './validateEmail';
7 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Util/renderModal.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const renderModal = ( shouldRender, props, Component ) => {
4 | if ( shouldRender === true ) {
5 | return
6 | }
7 | return null;
8 | }
9 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Util/validateEmail.js:
--------------------------------------------------------------------------------
1 | export function validateEmail(email) {
2 | const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
3 | return re.test(String(email).toLowerCase());
4 | }
5 |
--------------------------------------------------------------------------------
/src/dashboard/Settings/Util/verifyEditedCollaborators.js:
--------------------------------------------------------------------------------
1 | export const verifyEditedCollaborators = (modified) => {
2 | let editedCollabs = []
3 | modified.forEach((modifiedCollab) => {
4 | if (modifiedCollab.isEdited) editedCollabs.push(modifiedCollab);
5 | })
6 | return editedCollabs;
7 | }
8 |
--------------------------------------------------------------------------------
/src/dashboard/SidebarBuilder.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 | import Sidebar from 'components/Sidebar/Sidebar.react';
10 |
11 | const accountSidebarSections = [
12 | {
13 | name: 'Your Apps',
14 | icon: 'blank-app-outline',
15 | link: '/apps',
16 | } /*{
17 | name: 'Account Settings',
18 | icon: 'users-solid',
19 | link: '/account',
20 | }*/,
21 | ];
22 |
23 | export function buildAccountSidebar(options) {
24 | const { section, subsection } = options;
25 | return (
26 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/src/dashboard/index.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import 'core-js/stable';
9 | import 'regenerator-runtime/runtime';
10 | import Immutable from 'immutable';
11 | import installDevTools from 'immutable-devtools';
12 | import React from 'react';
13 | import ReactDOM from 'react-dom';
14 | import Dashboard from './Dashboard';
15 |
16 | require('stylesheets/fonts.scss');
17 | require('graphiql/graphiql.min.css');
18 | installDevTools(Immutable);
19 |
20 | const path = window.PARSE_DASHBOARD_PATH || '/';
21 | ReactDOM.render(, document.getElementById('browser_mount'));
22 |
--------------------------------------------------------------------------------
/src/icons/add-column.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/add-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/admin-app-check.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/src/icons/admin-app.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/admin-check.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/src/icons/analytics-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/analytics-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/api-reference.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/api.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/blank-app-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/bug-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/bug-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/calendar-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/calendar-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/check-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/check-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/check.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/src/icons/chip-close.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/clone-icon-license.txt:
--------------------------------------------------------------------------------
1 | "clone-icon.svg" by FontAwesome (fontawesome.com) is licensed under CC BY 4.0.
--------------------------------------------------------------------------------
/src/icons/clone-icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/icons/database.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/devices-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/devices-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/down-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/down-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/download.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/drag-indicator.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/edit-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/ellipses.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
--------------------------------------------------------------------------------
/src/icons/expand.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/facebook.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/src/icons/file-upload-outline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/icons/file-upload-outline.png
--------------------------------------------------------------------------------
/src/icons/files-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/files-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/filter-icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/filter-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/filter-solid.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/folder-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/folder-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/gear-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/google.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
--------------------------------------------------------------------------------
/src/icons/hamburger.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
--------------------------------------------------------------------------------
/src/icons/help.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/heroku.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/icon-app-templates.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/index-manager.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/src/icons/infinity.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/info-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/info-solid.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/icons/input-down-icon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/input-up-icon.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/icons/laptop-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/laptop-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/left-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/left-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/lock-open-variant.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/lock-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/locked-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/locked-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/logout.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/src/icons/mail-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/mail-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/minus-outline.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
--------------------------------------------------------------------------------
/src/icons/minus-solid.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/src/icons/more-icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/more.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/phone-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/phone-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/play-circle-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/plus-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/plus-solid.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/src/icons/plus.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/src/icons/push-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/push-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/refresh-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/refresh-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/right-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/right-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/search-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/search-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/security.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/send-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/send-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/server-settings-icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/share.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/back4app/parse-dashboard/781eb97616b70d0b71f6bfdcd7ea9972767688dd/src/icons/test.png
--------------------------------------------------------------------------------
/src/icons/trash-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/trash-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/unlock-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/unlock-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/up-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/up-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/visibility-icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/visibility.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/icons/warn-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/warn-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/warn-triangle-solid.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/icons/windows.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/x-outline.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
--------------------------------------------------------------------------------
/src/icons/x-solid.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
--------------------------------------------------------------------------------
/src/lib/CSRFManager.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import { unescape } from 'lib/StringEscaping';
9 |
10 | let currentToken = null;
11 |
12 | export function getToken() {
13 | if (!currentToken) {
14 | const tokenScript = document.getElementById('csrf');
15 | if (tokenScript) {
16 | currentToken = JSON.parse(unescape(tokenScript.innerHTML));
17 | }
18 | }
19 | return currentToken;
20 | }
21 |
--------------------------------------------------------------------------------
/src/lib/CloudCodeChanges.js:
--------------------------------------------------------------------------------
1 | export default class CloudCodeChanges {
2 |
3 | constructor(){
4 | this.files = [];
5 | }
6 |
7 | addFile( fileName ) {
8 | this.files = this.files.filter(f => f !== fileName);
9 | this.files = [ ...this.files, fileName ];
10 | }
11 |
12 | getFiles() {
13 | return this.files;
14 | }
15 |
16 | removeFile(fileName) {
17 | // if fileName exists, then remove
18 | if (this.files.indexOf(fileName) !== -1) {
19 | this.files = this.files.filter((f) => f !== fileName);
20 | } else
21 | this.files = [...this.files, fileName];
22 | }
23 |
24 | }
--------------------------------------------------------------------------------
/src/lib/ParseOptionUtils.js:
--------------------------------------------------------------------------------
1 |
2 | export const getSettingsFromKey = ( json, key ) => {
3 | return json && key in json ? json[key] : undefined;
4 | }
5 |
6 | export const convertStringToInt = ( value ) => {
7 | if ( typeof value === 'string' ) {
8 | if ( isNaN(value) ) return;
9 | return parseInt(value);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/lib/Position.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default class Position {
9 | constructor(x, y) {
10 | this.x = x || 0;
11 | this.y = y || 0;
12 | }
13 |
14 | transform(x, y) {
15 | return new Position(this.x + x, this.y + y);
16 | }
17 |
18 | static inDocument(node) {
19 | const pos = Position.inWindow(node);
20 | pos.x += window.pageXOffset;
21 | pos.y += window.pageYOffset;
22 | return pos;
23 | }
24 |
25 | static topTooltip(node, tooltipHeight) {
26 | let pos = Position.inWindow(node);
27 | pos.x += window.pageXOffset;
28 | pos.y += window.pageYOffset - tooltipHeight;
29 | return pos;
30 | }
31 |
32 | static inWindow(node) {
33 | const rect = node.getBoundingClientRect();
34 | return new Position(rect.left, rect.top);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/lib/StringEscaping.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | const UNESCAPE_MAP = {
9 | '&': '&',
10 | '<': '<',
11 | '>': '>',
12 | '/': '/',
13 | ''': '\'',
14 | '"': '"',
15 | };
16 | const ESCAPE_MAP = {};
17 | for (const k in UNESCAPE_MAP) {
18 | ESCAPE_MAP[UNESCAPE_MAP[k]] = k;
19 | }
20 |
21 | const escapeMatcher = RegExp('(?:' + Object.keys(ESCAPE_MAP).join('|') + ')', 'g');
22 | const unescapeMatcher = RegExp('(?:' + Object.keys(UNESCAPE_MAP).join('|') + ')', 'g');
23 |
24 | export function escape(str) {
25 | return str.replace(escapeMatcher, function (ch) {
26 | return ESCAPE_MAP[ch];
27 | });
28 | }
29 |
30 | export function unescape(str) {
31 | return str.replace(unescapeMatcher, function (ch) {
32 | return UNESCAPE_MAP[ch];
33 | });
34 | }
35 |
--------------------------------------------------------------------------------
/src/lib/axios.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | import rateLimit from 'axios-rate-limit';
3 | import * as AJAX from './AJAX';
4 |
5 | const baseURL = process.env.BACKEND_URL;
6 | const instance = axios.create({
7 | baseURL: baseURL
8 | });
9 |
10 | const checkCurrentUser = async() =>{
11 | try {
12 | let result = await AJAX.get(`${b4aSettings.BACK4APP_API_PATH}/me`);
13 | if (!result.username) window.location = '/'
14 | } catch (err){
15 | if (err.message == "Unauthorized!") window.location = '/'
16 | }
17 | }
18 |
19 | instance.interceptors.response.use(async (response) => {
20 | const { data, status } = response;
21 | if (status === 200 && typeof data !== "object"){
22 | await checkCurrentUser();
23 | }
24 | return response;
25 | }, async (error) => {
26 | await checkCurrentUser();
27 | return Promise.reject(error);
28 | }
29 | )
30 |
31 | const http = rateLimit(instance, { maxRequests: 2, perMilliseconds: 1000, maxRPS: 2 })
32 |
33 |
34 | export default http;
35 |
--------------------------------------------------------------------------------
/src/lib/browserUtils.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 |
9 | export function isChrome() {
10 | return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
11 | }
12 |
13 | export function isMobile() {
14 | return window.innerWidth <= 1015;
15 | }
16 |
--------------------------------------------------------------------------------
/src/lib/englishOrdinalIndicator.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | const numberSuffix = number => {
9 | if (number > 3 && number < 21) {
10 | return 'th';
11 | }
12 | switch (number % 10) {
13 | case 1:
14 | return 'st';
15 | case 2:
16 | return 'nd';
17 | case 3:
18 | return 'rd';
19 | default:
20 | return 'th';
21 | }
22 | };
23 |
24 | export default function englishOrdinalIndicator(number) {
25 | return number + numberSuffix(number);
26 | }
27 |
--------------------------------------------------------------------------------
/src/lib/generatePath.js:
--------------------------------------------------------------------------------
1 | export default function generatePath(currentApp, path) {
2 | return `/apps/${currentApp.slug}/${path}`;
3 | }
4 |
--------------------------------------------------------------------------------
/src/lib/getFileName.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Parse from 'parse';
9 |
10 | export default function getFileName(name) {
11 | if (name instanceof Parse.File) {
12 | return getFileName(name.name());
13 | }
14 | const offset = name.indexOf('_') + 1;
15 | return name.substr(offset);
16 | }
17 |
--------------------------------------------------------------------------------
/src/lib/getSiteDomain.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function getSiteDomain() {
9 | const host = location.host.split('.');
10 | return location.protocol + '//' + host.slice(host.length - 2).join('.');
11 | }
12 |
--------------------------------------------------------------------------------
/src/lib/hasAncestor.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function hasAncestor(node, ancestor, contentId) {
9 | let cur = node.parentNode;
10 | while (cur && cur.nodeType === 1) {
11 | if (cur === ancestor) {
12 | return true;
13 | } else if (contentId && cur.dataset.parentContentId === contentId) {
14 | return true;
15 | }
16 | cur = cur.parentNode;
17 | }
18 | return false;
19 | }
20 |
--------------------------------------------------------------------------------
/src/lib/htmlString.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import { escape } from 'lib/StringEscaping';
9 |
10 | export default function htmlString(pieces, ...vars) {
11 | let result = pieces[0];
12 | for (let i = 0; i < vars.length; i++) {
13 | result += escape(vars[i]) + pieces[i + 1];
14 | }
15 | return result;
16 | }
17 |
--------------------------------------------------------------------------------
/src/lib/isInsidePopover.js:
--------------------------------------------------------------------------------
1 | export default function isInsidePopover(node) {
2 | let cur = node.parentNode;
3 | while (cur && cur.nodeType === 1) {
4 | // If id starts with "fixed_wrapper", we consider it as the
5 | // root element of the Popover component
6 | if (/^fixed_wrapper/g.test(cur.id)) {
7 | return true;
8 | }
9 | cur = cur.parentNode;
10 | }
11 | return false;
12 | }
13 |
--------------------------------------------------------------------------------
/src/lib/jsonChangesToString.js:
--------------------------------------------------------------------------------
1 |
2 | function jsonChangesToString(json, initialValue) {
3 | if ( !json ) return '';
4 | let joinedArr = [];
5 | Object.keys(json).map( (jsonKey) => {
6 | if ( typeof json[jsonKey] === 'object' && Object.keys(json[jsonKey]).length >= 1 ) {
7 | joinedArr.push(jsonChangesToString(json[jsonKey]))
8 | } else {
9 | if ( initialValue && initialValue[jsonKey] !== json[jsonKey] ) {
10 | joinedArr.push(jsonKey + ' to ' + json[jsonKey]);
11 | } else if ( !initialValue ) {
12 | joinedArr.push(jsonKey + ' to ' + json[jsonKey]);
13 | }
14 | }
15 |
16 | } )
17 | return joinedArr.join(', ');
18 | }
19 |
20 | export default jsonChangesToString;
21 |
--------------------------------------------------------------------------------
/src/lib/keyMirror.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | /**
9 | * Takes an array of keys, and turns it into an object mapping keys to
10 | * themselves
11 | */
12 | export default function keyMirror(keys) {
13 | const map = {};
14 | for (let i = 0; i < keys.length; i++) {
15 | map[keys[i]] = keys[i];
16 | }
17 | return map;
18 | }
19 |
--------------------------------------------------------------------------------
/src/lib/mergeDefaultParseOptions.js:
--------------------------------------------------------------------------------
1 | export default function mergeDefaultParseOptions( parseOptions ) {
2 | return {
3 | passwordPolicy: {
4 | resetTokenValidityDuration: parseOptions?.passwordPolicy?.resetTokenValidityDuration || 24 * 60 * 60,
5 | resetTokenReuseIfValid: parseOptions?.passwordPolicy?.resetTokenReuseIfValid || false,
6 | validatorPattern: '/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})/',
7 | validationError: 'Password must contain at least 1 digit.',
8 | doNotAllowUsername: false,
9 | maxPasswordAge: 90,
10 | maxPasswordHistory: 5,
11 | ...parseOptions.passwordPolicy
12 | },
13 | accountLockout: {
14 | duration: 5,
15 | threshold: 3,
16 | ...parseOptions.accountLockout
17 | },
18 | ...parseOptions
19 | };
20 | }
21 |
--------------------------------------------------------------------------------
/src/lib/pluck.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function(array, key) {
9 | // handle axios responses
10 | if (array && array.response && array.response.data)
11 | return [array.response.data[key]];
12 | return array.map(item => item[key]);
13 | }
14 |
--------------------------------------------------------------------------------
/src/lib/pluralize.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function pluralize(count, word, plural) {
9 | if (count === 1) {
10 | return String(count) + ' ' + word;
11 | }
12 | return String(count) + ' ' + (plural || word + 's');
13 | }
14 |
--------------------------------------------------------------------------------
/src/lib/setDifference.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function (first, second, equalityPredicate) {
9 | return first.filter(
10 | itemFromFirst =>
11 | !second.find(itemFromSecond => equalityPredicate(itemFromFirst, itemFromSecond))
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/src/lib/stringCompare.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function stringCompare(a, b) {
9 | return a < b ? -1 : a > b ? 1 : 0;
10 | }
11 |
--------------------------------------------------------------------------------
/src/lib/tests/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": [
3 | "jest"
4 | ],
5 | "env": {
6 | "jest/globals": true
7 | }
8 | }
--------------------------------------------------------------------------------
/src/lib/tests/B4AAlert.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/B4AAlert/B4AAlert.react');
9 |
10 | import React from 'react';
11 | import ReactDOM from 'react-dom';
12 | import TestUtils from 'react-addons-test-utils';
13 |
14 | const B4AAlert = require('../../components/B4AAlert/B4AAlert.react');
15 |
16 | describe('B4AAlert', () => {
17 | it('can render examples', () => {
18 | jest.dontMock('../../components/B4AAlert/B4AAlert.example');
19 | const example = require('../../components/B4AAlert/B4AAlert.example');
20 | example.demos.forEach((example, i) => {
21 | example.render();
22 | });
23 | });
24 | // test suite goes here
25 | });
26 |
--------------------------------------------------------------------------------
/src/lib/tests/CloudCodeView.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/B4ACloudCodeView/B4ACloudCodeView.react');
9 |
10 | import React from 'react';
11 | import ReactDOM from 'react-dom';
12 | import TestUtils from 'react-addons-test-utils';
13 |
14 | const B4ACloudCodeView = require('../../components/B4ACloudCodeView/B4ACloudCodeView.react');
15 |
16 | describe('B4ACloudCodeView', () => {
17 | it('can render examples', () => {
18 | jest.dontMock('../../components/B4ACloudCodeView/B4ACloudCodeView.example');
19 | const example = require('../../components/B4ACloudCodeView/B4ACloudCodeView.example');
20 | example.demos.forEach((example, i) => {
21 | example.render();
22 | });
23 | });
24 | // test suite goes here
25 | });
26 |
--------------------------------------------------------------------------------
/src/lib/tests/CodeEditor.test.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @jest-environment jsdom
3 | */
4 | /*
5 | * Copyright (c) 2016-present, Parse, LLC
6 | * All rights reserved.
7 | *
8 | * This source code is licensed under the license found in the LICENSE file in
9 | * the root directory of this source tree.
10 | */
11 | jest.dontMock('../../components/CodeEditor/CodeEditor.react');
12 |
13 | describe('CodeEditor', () => {
14 | it('can render examples', () => {
15 | jest.dontMock('../../components/CodeEditor/CodeEditor.example');
16 | const example = require('../../components/CodeEditor/CodeEditor.example');
17 | example.demos.forEach(example => {
18 | example.render();
19 | });
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/src/lib/tests/CodeTree.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/B4ACodeTree/B4ACodeTree.react');
9 |
10 | import React from 'react';
11 | import ReactDOM from 'react-dom';
12 | import TestUtils from 'react-addons-test-utils';
13 |
14 | const B4ACodeTree = require('../../components/B4ACodeTree/B4ACodeTree.react');
15 |
16 | describe('B4ACodeTree', () => {
17 | it('can render examples', () => {
18 | jest.dontMock('../../components/B4ACodeTree/B4ACodeTree.example');
19 | const example = require('../../components/B4ACodeTree/B4ACodeTree.example');
20 | example.demos.forEach((example, i) => {
21 | example.render();
22 | });
23 | });
24 | // test suite goes here
25 | });
26 |
--------------------------------------------------------------------------------
/src/lib/tests/CodeView.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/CodeView/CodeView.react');
9 |
10 | import React from 'react';
11 | import ReactDOM from 'react-dom';
12 | import TestUtils from 'react-addons-test-utils';
13 |
14 | const CodeView = require('../../components/CodeView/CodeView.react');
15 |
16 | describe('CodeView', () => {
17 | it('can render examples', () => {
18 | jest.dontMock('../../components/CodeView/CodeView.example');
19 | const example = require('../../components/CodeView/CodeView.example');
20 | example.demos.forEach((example, i) => {
21 | example.render();
22 | });
23 | });
24 | // test suite goes here
25 | });
26 |
--------------------------------------------------------------------------------
/src/lib/tests/FormTableCollab.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/FormTableCollab/FormTableCollab.react');
9 |
10 | describe('FormTableCollab', () => {
11 | it('can render examples', () => {
12 | jest.dontMock('../../components/FormTableCollab/FormTableCollab.example');
13 | const example = require('../../components/FormTableCollab/FormTableCollab.example');
14 | example.demos.forEach((example) => {
15 | example.render();
16 | });
17 | });
18 | // test suite goes here
19 | });
20 |
--------------------------------------------------------------------------------
/src/lib/tests/Markdown.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/Markdown/Markdown.react');
9 |
10 | describe('Markdown', () => {
11 | it('can render examples', () => {
12 | jest.dontMock('../../components/Markdown/Markdown.example');
13 | const example = require('../../components/Markdown/Markdown.example');
14 | example.demos.forEach(example => {
15 | example.render();
16 | });
17 | });
18 | // test suite goes here
19 | });
20 |
--------------------------------------------------------------------------------
/src/lib/tests/PlatformCard.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/PlatformCard/PlatformCard.react');
9 |
10 | describe('PlatformCard', () => {
11 | it('can render examples', () => {
12 | jest.dontMock('../../components/PlatformCard/PlatformCard.example');
13 | const example = require('../../components/PlatformCard/PlatformCard.example');
14 | example.demos.forEach(example => {
15 | example.render();
16 | });
17 | });
18 | });
19 |
--------------------------------------------------------------------------------
/src/lib/tests/Tooltip.test.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | jest.dontMock('../../components/Tooltip/Tooltip.react');
9 |
10 | describe('Tooltip', () => {
11 | it('does nothing', () => {});
12 | });
13 |
--------------------------------------------------------------------------------
/src/lib/unique.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function (array) {
9 | return Array.from(new Set(array));
10 | }
11 |
--------------------------------------------------------------------------------
/src/lib/validateEmailFormat.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | export default function validateEmailFormat(email) {
9 | // Copied from existing website's newsletter_signup.js
10 | const emailRegex =
11 | /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
12 | return emailRegex.test(email);
13 | }
14 |
--------------------------------------------------------------------------------
/src/lib/validateNumeric.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | const numeric = /^[-+]?\d*\.?\d*$/;
9 |
10 | export default function validateNumeric(str) {
11 | return numeric.test(str);
12 | }
13 |
--------------------------------------------------------------------------------
/src/lib/withForwardedRef.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export function withForwardedRef(Component) {
4 | function render(props, ref) {
5 | const innerRef = React.useRef();
6 | React.useImperativeHandle(ref, () => innerRef.current, [props.multiline]);
7 | return ;
8 | }
9 |
10 | const name = Component.displayName || Component.name;
11 | render.displayName = `withForwardedRef(${name})`;
12 |
13 | return React.forwardRef(render);
14 | }
15 |
--------------------------------------------------------------------------------
/src/lib/withRouter.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import { useParams, useNavigate, useOutletContext, useLocation, UNSAFE_NavigationContext as NavigationContext } from 'react-router-dom';
3 |
4 | export function withRouter(Component) {
5 | function render(props) {
6 | const params = useParams();
7 | const navigate = useNavigate();
8 | const { navigator } = useContext(NavigationContext);
9 | const outletContext = useOutletContext();
10 | const location = useLocation();
11 |
12 | return (
13 |
21 | );
22 | }
23 |
24 | const name = Component.displayName || Component.name;
25 | render.displayName = `withRouter(${name})`;
26 |
27 | return render;
28 | }
29 |
--------------------------------------------------------------------------------
/src/login/Login.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import 'stylesheets/globals.scss';
9 |
10 | .message {
11 | background: #f9f9fa;
12 | height: 50px;
13 | padding: 10px;
14 | font-size: 13px;
15 | }
16 |
17 | .error {
18 | background: #f9f9fa;
19 | height: 50px;
20 | line-height: 50px;
21 | overflow: hidden;
22 | font-size: 13px;
23 | color: $red;
24 | }
25 |
26 | body {
27 | // background: #0c5582;
28 | }
--------------------------------------------------------------------------------
/src/login/index.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Login from './Login';
9 | import React from 'react';
10 | import ReactDOM from 'react-dom';
11 |
12 | require('stylesheets/fonts.scss');
13 |
14 | // App entry point
15 |
16 | const path = window.PARSE_DASHBOARD_PATH || '/';
17 | ReactDOM.render(, document.getElementById('login_mount'));
18 |
--------------------------------------------------------------------------------
/src/parse-interface-guide/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | PIG Component Explorer
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/parse-interface-guide/index.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import ReactDOM from 'react-dom';
9 |
10 | import Routes from './routes';
11 |
12 | // App entry point
13 |
14 | ReactDOM.render(Routes, document.getElementById('browser_mount'));
15 |
--------------------------------------------------------------------------------
/src/parse-interface-guide/routes.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import PIG from 'parse-interface-guide/PIG.react';
9 | import React from 'react';
10 | import { BrowserRouter, Routes, Route } from 'react-router-dom';
11 |
12 | const routes = (
13 |
14 |
15 | } />
16 |
17 |
18 | );
19 |
20 | export default routes;
21 |
--------------------------------------------------------------------------------
/src/quickstart/Quickstart.react.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import React from 'react';
9 |
10 | export default class Quickstart extends React.Component {
11 | render() {
12 | return Hello world
;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/quickstart/index.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | import Quickstart from 'quickstart/Quickstart.react';
9 | import React from 'react';
10 | import ReactDOM from 'react-dom';
11 |
12 | require('stylesheets/fonts.scss');
13 |
14 | // App entry point
15 |
16 | ReactDOM.render(, document.getElementById('quickstart_mount'));
17 |
--------------------------------------------------------------------------------
/src/stylesheets/back4app.scss:
--------------------------------------------------------------------------------
1 | // Back4App colors
2 | $light-blue: #208AEC;
3 | $dark-gray: #424242;
4 | $green: #4CAF50;
5 | $lightYellow: #f5e023;
6 | $darkYellow: #f78400;
7 | $light-gray: #dfdfdf;
8 | $iosColor: #000000;
9 | $androidColor: #A4C639;
10 | // Back4App sizes
11 | $header-height: 51px;
12 | $toolbar-height: 48px;
13 | $content-max-height: calc(100vh - #{$header-height});
14 |
15 | .jstree-icon {
16 | background-size: contain;
17 | }
18 |
19 | input[type=number]::-webkit-inner-spin-button,
20 | input[type=number]::-webkit-outer-spin-button {
21 | -webkit-appearance: none;
22 | }
23 |
--------------------------------------------------------------------------------
/src/stylesheets/fonts.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | @import url(https://fonts.googleapis.com/css?family=Dosis);
9 | @import url(https://fonts.googleapis.com/css?family=Source+Code+Pro);
10 | @import url(https://fonts.googleapis.com/css?family=Noto+Sans:400,700);
11 | @import url(https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css);
12 | @import url(https://fonts.googleapis.com/css?family=Raleway:100,300,400,500,700);
13 | @import url(https://fonts.googleapis.com/css?family=Inconsolata);
14 |
--------------------------------------------------------------------------------
/testing/extractClassnames.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | // Hacky way to get classnames out of a SASS/CSS file
9 | // This should work for our testing needs
10 |
11 | module.exports = function(src) {
12 | if (!src) {
13 | return {};
14 | }
15 |
16 | const classMatch = src.match(/\.([a-zA-Z]\w*)\s*\{/g);
17 | const classMap = {};
18 | if (classMatch) {
19 | for (let i = 0; i < classMatch.length; i++) {
20 | const c = classMatch[i].replace(/[^a-zA-Z0-9\-_]/g, '');
21 | classMap[c] = c;
22 | }
23 | }
24 | return classMap;
25 | };
26 |
--------------------------------------------------------------------------------
/testing/styleMock.js:
--------------------------------------------------------------------------------
1 | // @see https://stackoverflow.com/a/54646930/3000466
2 | module.exports = {};
3 |
--------------------------------------------------------------------------------
/webpack/PIG.config.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | var configuration = require('./base.config.js');
9 | const HtmlWebpackPlugin = require('html-webpack-plugin');
10 | const path = require('path');
11 |
12 | configuration.mode = 'development';
13 | configuration.entry = { PIG: './parse-interface-guide/index.js' };
14 | configuration.output.path = require('path').resolve('./PIG/bundles');
15 | configuration.output.filename = "[name].[chunkhash].js";
16 |
17 | configuration.plugins.push(
18 | new HtmlWebpackPlugin({
19 | template: '../PIG/index.template.html',
20 | filename: path.resolve('./PIG/index.html')
21 | }),
22 | );
23 |
24 | module.exports = configuration;
25 |
--------------------------------------------------------------------------------
/webpack/dev.config.js:
--------------------------------------------------------------------------------
1 | var configuration = require('./publish.config.js');
2 | var webpack = require('webpack');
3 | const TerserPlugin = require('terser-webpack-plugin');
4 |
5 | configuration.plugins.push(
6 | new webpack.DefinePlugin({
7 | 'process.env': {
8 | 'NODE_ENV': '"dev"'
9 | }
10 | }),
11 | new webpack.SourceMapDevToolPlugin({
12 | filename: '[file].map',
13 | include: /dashboard.*.*/
14 | })
15 | );
16 |
17 | configuration.optimization = {
18 | splitChunks: {
19 | cacheGroups: {
20 | commons: {
21 | test: /[\\/]node_modules[\\/]/,
22 | name: 'vendors',
23 | chunks: 'all'
24 | }
25 | }
26 | },
27 | minimizer: [
28 | new TerserPlugin({
29 | cache: true,
30 | parallel: true,
31 | sourceMap: true, // Must be set to true if using source-maps in production
32 | terserOptions: {
33 | mangle: false
34 | }
35 | })
36 | ]
37 | }
38 |
39 | module.exports = configuration;
40 |
--------------------------------------------------------------------------------
/webpack/homolog.config.js:
--------------------------------------------------------------------------------
1 | const configuration = require('./publish.config.js');
2 | const webpack = require('webpack');
3 | const TerserPlugin = require('terser-webpack-plugin');
4 |
5 | configuration.plugins.push(
6 | new webpack.DefinePlugin({
7 | 'process.env': {
8 | 'NODE_ENV': JSON.stringify('homolog')
9 | }
10 | }),
11 | new webpack.SourceMapDevToolPlugin({
12 | filename: '[file].map',
13 | include: /dashboard.*.*/
14 | })
15 | );
16 |
17 | configuration.optimization = {
18 | splitChunks: {
19 | cacheGroups: {
20 | commons: {
21 | test: /[\\/]node_modules[\\/]/,
22 | name: 'vendors',
23 | chunks: 'all'
24 | }
25 | }
26 | },
27 | minimize: true,
28 | minimizer: [
29 | new TerserPlugin({
30 | // cache: true,
31 | parallel: true,
32 | terserOptions: {
33 | sourceMap: true,
34 | mangle: false
35 | }
36 | })
37 | ]
38 | }
39 |
40 | module.exports = configuration;
41 |
--------------------------------------------------------------------------------
/webpack/webpack.config.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016-present, Parse, LLC
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the license found in the LICENSE file in
6 | * the root directory of this source tree.
7 | */
8 | const configuration = require('./base.config.js');
9 |
10 | configuration.entry = {
11 | dashboard: './dashboard/index.js',
12 | login: './login/index.js',
13 | signup: './signup/index.js',
14 | PIG: './parse-interface-guide/index.js',
15 | quickstart: './quickstart/index.js',
16 | };
17 | configuration.output.path = require('path').resolve('./bundles');
18 |
19 | module.exports = configuration;
20 |
--------------------------------------------------------------------------------