\r\n * setFilter({ ...filter, q: event?.target?.value || '' })\r\n * }\r\n * />\r\n * );\r\n * }\r\n *\r\n * // Then use it like this:\r\n * \r\n * }\r\n * >\r\n * \r\n * \r\n * \r\n */\r\nexport function ListArrayInput(props) {\r\n const { availableChoices, children, filter, filters, input, onAdd, onRemove, page, pagination = DefaultPagination, setFilter, setPage, perPage, setPerPage, total, } = props;\r\n const handleAdd = (event, item) => {\r\n let cancelled = false;\r\n if (onAdd) {\r\n // If the handler returns false, prevent the addition\r\n if (onAdd(event, item) === false) {\r\n cancelled = true;\r\n }\r\n }\r\n cancelled = cancelled || event.defaultPrevented;\r\n if (!cancelled) {\r\n input.onChange([...input.value, item.id]);\r\n }\r\n };\r\n const handleRemove = (event, item) => {\r\n let cancelled = false;\r\n if (onRemove) {\r\n // If the handler returns false, prevent the addition\r\n if (onRemove(event, item) === false) {\r\n cancelled = true;\r\n }\r\n }\r\n cancelled = cancelled || event.defaultPrevented;\r\n if (!cancelled) {\r\n input.onChange(input.value.filter(selectedItem => selectedItem.id !== item.id));\r\n }\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n !!filters && React.cloneElement(filters, { filter, setFilter }),\r\n React.createElement(List, null, availableChoices &&\r\n availableChoices.map((choice, index) => (React.createElement(ListArrayInputItem, { key: choice.id, selected: !!input.value && input.value.includes(choice.id), record: choice, onAdd: handleAdd, onRemove: handleRemove }, React.Children.only(children))))),\r\n React.cloneElement(pagination, {\r\n page,\r\n perPage,\r\n total,\r\n setPage,\r\n setPerPage,\r\n })));\r\n}\r\n//# sourceMappingURL=ListArrayInput.js.map","import * as React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useTranslate } from 'ra-core';\r\nexport function ApiSelectionModalTaC(props) {\r\n const { content } = props;\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n return (React.createElement(\"div\", { className: classes.content, dangerouslySetInnerHTML: { __html: content } }));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n content: {\r\n overflow: 'scroll',\r\n },\r\n}), {\r\n name: 'Layer7ApplicationApiSelectionModalTaC',\r\n});\r\n//# sourceMappingURL=ApiSelectionModalTaC.js.map","import * as React from 'react';\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography, } from '@material-ui/core';\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport { useDataProvider, useTranslate } from 'ra-core';\r\nimport { LoadingIndicator } from 'react-admin';\r\nimport { ApiSelectionModalTaC } from './ApiSelectionModalTaC';\r\nimport { TruncatedTextField } from '../../ui';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport function ApiSelectionModal(props) {\r\n const { api, onConfirm, onCancel, apiPlansEnabled, orgUuid } = props;\r\n const [apiPlans, setApiPlans] = React.useState([]);\r\n const [selectedApiPlan, setSelectedApiPlan] = React.useState();\r\n const [isLoaded, setIsLoaded] = React.useState(false);\r\n const [apiEula, setApiEula] = React.useState();\r\n const classes = useStyles(props);\r\n const dataProvider = useDataProvider();\r\n const translate = useTranslate();\r\n const notify = useLayer7Notify();\r\n React.useEffect(() => {\r\n async function fetchApiPlans() {\r\n const { data } = await dataProvider.getApiPlansByApi('apiPlans', {\r\n apiId: api.id,\r\n orgUuid: orgUuid,\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n setApiPlans(data);\r\n setIsLoaded(true);\r\n }\r\n async function fetchApiEula() {\r\n const { data } = await dataProvider.getOne('apiEulas', {\r\n id: api.apiEulaUuid,\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n setApiEula(data);\r\n }\r\n if (api) {\r\n if (apiPlansEnabled) {\r\n fetchApiPlans();\r\n }\r\n else {\r\n setIsLoaded(true);\r\n }\r\n fetchApiEula();\r\n }\r\n }, [JSON.stringify(api)]); // eslint-disable-line\r\n const onClose = () => {\r\n setApiPlans([]);\r\n setSelectedApiPlan(undefined);\r\n setApiEula(undefined);\r\n setIsLoaded(false);\r\n onCancel();\r\n };\r\n const onAPIConfirm = () => {\r\n api.apiPlan = selectedApiPlan;\r\n setApiPlans([]);\r\n setSelectedApiPlan(undefined);\r\n setApiEula(undefined);\r\n setIsLoaded(false);\r\n onConfirm();\r\n };\r\n return (React.createElement(Dialog, { fullWidth: true, maxWidth: \"md\", open: !!api, onClose: onClose, \"aria-labelledby\": \"alert-dialog-title\", \"aria-describedby\": \"alert-dialog-description\" },\r\n !isLoaded && !apiEula && React.createElement(LoadingIndicator, null),\r\n isLoaded && !!api ? (React.createElement(React.Fragment, null,\r\n React.createElement(DialogTitle, { id: \"alert-dialog-title\" },\r\n api.name,\r\n \" v\",\r\n api.version),\r\n selectedApiPlan && (React.createElement(TableContainer, { className: classes.planSummaryTable },\r\n React.createElement(Table, { size: \"small\", stickyHeader: true, \"aria-label\": \"sticky table\" },\r\n React.createElement(TableBody, null,\r\n React.createElement(TableRow, null,\r\n React.createElement(StyledTableCell, { component: \"th\", scope: \"row\" }, selectedApiPlan.name),\r\n React.createElement(StyledTableCell, { align: \"left\" },\r\n React.createElement(TruncatedTextField, { record: selectedApiPlan, source: \"description\" })),\r\n React.createElement(StyledTableCell, { align: \"left\" }, selectedApiPlan.rateLimit),\r\n React.createElement(StyledTableCell, { align: \"left\" }, selectedApiPlan.quota),\r\n React.createElement(StyledTableCell, { align: \"left\" }, selectedApiPlan.quotaInterval)))))),\r\n apiPlans.length === 0 || selectedApiPlan ? (React.createElement(DialogContent, null,\r\n React.createElement(ApiSelectionModalTaC, { content: apiEula === null || apiEula === void 0 ? void 0 : apiEula.Content }))) : null,\r\n apiPlans && apiPlans.length > 0 && !selectedApiPlan ? (React.createElement(DialogContent, null,\r\n React.createElement(Typography, { className: classes.heading }, translate('apihub.actions.select_an_api_plan')),\r\n React.createElement(TableContainer, { className: classes.container },\r\n React.createElement(Table, { className: classes.table, size: \"small\", stickyHeader: true, \"aria-label\": \"sticky table\" },\r\n React.createElement(TableHead, null,\r\n React.createElement(TableRow, null,\r\n React.createElement(StyledTableCell, { align: \"left\" }, translate('resources.apiPlans.fields.name')),\r\n React.createElement(StyledTableCell, { align: \"left\" }, translate('resources.apiPlans.fields.description')),\r\n React.createElement(StyledTableCell, { align: \"left\" }, translate('resources.apiPlans.fields.rate_limit')),\r\n React.createElement(StyledTableCell, { align: \"left\" }, translate('resources.apiPlans.fields.quota')),\r\n React.createElement(StyledTableCell, { align: \"left\" }, translate('resources.apiPlans.fields.quota_interval')))),\r\n React.createElement(TableBody, null, apiPlans.map(row => (React.createElement(TableRow, { key: row.uuid, hover: true, onClick: () => setSelectedApiPlan(row) },\r\n React.createElement(StyledTableCell, { component: \"th\", scope: \"row\" }, row.name),\r\n React.createElement(StyledTableCell, { align: \"left\" },\r\n React.createElement(TruncatedTextField, { record: row, source: \"description\" })),\r\n React.createElement(StyledTableCell, { align: \"left\" }, row.rateLimit),\r\n React.createElement(StyledTableCell, { align: \"left\" }, row.quota),\r\n React.createElement(StyledTableCell, { align: \"left\" }, row.quotaInterval))))))))) : null,\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { onClick: onClose, color: \"primary\" }, translate('ra.action.cancel')),\r\n React.createElement(Button, { onClick: onAPIConfirm, color: \"primary\", autoFocus: true, disabled: !isLoaded ||\r\n (isLoaded &&\r\n apiPlans.length > 0 &&\r\n !selectedApiPlan) }, translate('resources.applications.actions.accept_terms_and_conditions'))))) : null));\r\n}\r\nconst StyledTableCell = withStyles(theme => ({\r\n head: {\r\n fontSize: theme.typography.body1,\r\n fontWeight: '600',\r\n whiteSpace: 'nowrap',\r\n },\r\n body: {\r\n fontSize: theme.typography.body1,\r\n fontWeight: '500',\r\n },\r\n}))(TableCell);\r\nconst useStyles = makeStyles(theme => ({\r\n heading: {\r\n fontSize: theme.typography.pxToRem(14),\r\n fontWeight: theme.typography.fontWeightBold,\r\n color: theme.palette.grey[600],\r\n marginBottom: theme.spacing(3),\r\n },\r\n planSummaryTable: {\r\n marginLeft: theme.spacing(1),\r\n width: '97%',\r\n },\r\n table: {\r\n minWidth: '100%',\r\n },\r\n container: {\r\n maxHeight: '100%',\r\n },\r\n}), {\r\n name: 'Layer7ApplicationApiPlansList',\r\n});\r\n//# sourceMappingURL=ApiSelectionModal.js.map","import * as React from 'react';\r\nimport { ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, IconButton, Tooltip, Typography, } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport { useTranslate } from 'ra-core';\r\nimport { ApiSelectionModal } from '../ApiSelectionModal';\r\nimport { ApiStatus } from '../../../apis/ApiStatus';\r\nexport function ApiSelectionListItem(props) {\r\n const { className, onRemoved, onApiPlanChanged, item, orgUuid } = props;\r\n const { record } = item;\r\n const [editApiPlan, setEditApiPlan] = React.useState(false);\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const handleItemRemoved = event => {\r\n if (onRemoved) {\r\n onRemoved(event, item);\r\n }\r\n };\r\n const handleApiPlanChanged = event => {\r\n setEditApiPlan(false);\r\n if (onApiPlanChanged) {\r\n onApiPlanChanged(event, record);\r\n }\r\n };\r\n const truncate = text => {\r\n const width = 20;\r\n if (text.length > width) {\r\n return `${text.slice(0, width).trim()}...`;\r\n }\r\n else {\r\n return text;\r\n }\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(ExpansionPanel, { className: className },\r\n React.createElement(ExpansionPanelSummary, { expandIcon: React.createElement(ExpandMoreIcon, null) },\r\n React.createElement(Tooltip, { title: translate('ra.action.delete'), className: classes.delete },\r\n React.createElement(IconButton, { onClick: handleItemRemoved, edge: \"end\", \"aria-label\": translate('ra.action.delete') },\r\n React.createElement(DeleteIcon, null))),\r\n React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.apiname }, record.name),\r\n React.createElement(Typography, { className: classes.version },\r\n \"v\",\r\n record.version),\r\n React.createElement(ApiStatus, { record: record, variant: \"caption\" }))),\r\n React.createElement(ExpansionPanelDetails, null,\r\n React.createElement(\"div\", { className: classes.description },\r\n record.apiPlan ? (React.createElement(\"div\", { className: classes.apiPlanDetails },\r\n translate('resources.applications.fields.apiPlan'),\r\n \": \",\r\n truncate(record.apiPlan.name),\r\n React.createElement(\"span\", { className: classes.apiPlanInterval },\r\n \"(\",\r\n record.apiPlan.quota\r\n ? `${translate('resources.apiPlans.fields.quota')}: ${record.apiPlan.quota}/${translate(`resources.apiPlans.fields.${record.apiPlan.quotaInterval.toLowerCase()}`)}`\r\n : null,\r\n record.apiPlan.rateLimit\r\n ? `${translate('resources.apiPlans.fields.rate_limit')}: ${record.apiPlan.rateLimit}/${translate(`resources.apiPlans.fields.second`)}`\r\n : null,\r\n \")\"),\r\n React.createElement(Tooltip, { title: translate('resources.applications.actions.edit') },\r\n React.createElement(IconButton, { \"aria-label\": \"actions\", onClick: () => setEditApiPlan(true) },\r\n React.createElement(EditIcon, { fontSize: \"small\" }))))) : null,\r\n record.description))),\r\n React.createElement(ApiSelectionModal, { api: editApiPlan ? record : null, onConfirm: handleApiPlanChanged, onCancel: () => {\r\n setEditApiPlan(false);\r\n }, apiPlansEnabled: true, source: \"ApiApiPlanIds\", orgUuid: orgUuid })));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n apiname: {\r\n wordBreak: 'break-all',\r\n },\r\n version: {\r\n color: theme.palette.text.secondary,\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n delete: {\r\n marginRight: theme.spacing(0),\r\n },\r\n apiPlanDetails: {\r\n fontSize: theme.typography.pxToRem(14),\r\n marginTop: theme.spacing(0),\r\n },\r\n apiPlanInterval: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n description: {\r\n marginTop: theme.spacing(-1),\r\n marginLeft: theme.spacing(6),\r\n fontSize: theme.typography.pxToRem(14),\r\n },\r\n}), {\r\n name: 'Layer7SelectedItem',\r\n});\r\n//# sourceMappingURL=ApiSelectionListItem.js.map","import * as React from 'react';\r\nimport { Chip, ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, IconButton, Tooltip, Typography, } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport { useTranslate } from 'ra-core';\r\nimport { ApiStatus } from '../../../apis/ApiStatus';\r\nexport function ApiGroupSelectionListItem(props) {\r\n const { className, onRemoved, item } = props;\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const handleItemRemoved = event => {\r\n if (onRemoved) {\r\n onRemoved(event, item);\r\n }\r\n };\r\n return (React.createElement(ExpansionPanel, { className: className },\r\n React.createElement(ExpansionPanelSummary, { expandIcon: React.createElement(ExpandMoreIcon, null) },\r\n React.createElement(Tooltip, { title: translate('ra.action.delete'), className: classes.delete },\r\n React.createElement(IconButton, { onClick: handleItemRemoved, edge: \"end\", \"aria-label\": translate('ra.action.delete') },\r\n React.createElement(DeleteIcon, null))),\r\n React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Chip, { className: classes.chip, label: translate(`resources.apiGroups.short_name`, {\r\n smart_count: 1,\r\n }) }),\r\n React.createElement(Typography, null, item.record.name),\r\n React.createElement(Typography, { className: classes.apisCount },\r\n \"(\",\r\n item.record.apis.length,\r\n \")\"))),\r\n React.createElement(ExpansionPanelDetails, null,\r\n React.createElement(\"div\", { className: classes.details },\r\n React.createElement(\"div\", { className: classes.list }, item.record.apis.map(api => (React.createElement(\"div\", { className: classes.api, key: api.uuid },\r\n React.createElement(\"div\", null, api.name),\r\n React.createElement(ApiStatus, { record: api, variant: \"caption\" })))))))));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n chip: {\r\n marginRight: theme.spacing(1),\r\n height: theme.spacing(3),\r\n },\r\n apisCount: {\r\n color: theme.palette.text.secondary,\r\n marginLeft: theme.spacing(1),\r\n },\r\n delete: {\r\n marginRight: theme.spacing(1),\r\n },\r\n details: {\r\n marginTop: theme.spacing(-2),\r\n marginLeft: theme.spacing(6),\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n description: {\r\n marginTop: theme.spacing(0),\r\n fontSize: theme.typography.pxToRem(14),\r\n },\r\n list: {\r\n marginTop: theme.spacing(1),\r\n width: '100%',\r\n },\r\n api: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n textAlign: 'left',\r\n marginTop: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7SelectedItem',\r\n});\r\n//# sourceMappingURL=ApiGroupSelectionListItem.js.map","import * as React from 'react';\r\nimport { Typography } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useTranslate } from 'ra-core';\r\nimport { ApiSelectionListItem } from './ApiSelectionListItem';\r\nimport { ApiGroupSelectionListItem } from './ApiGroupSelectionListItem';\r\nexport function SelectionList(props) {\r\n const { onItemRemoved, onApiPlanChanged, selectedItems, orgUuid } = props;\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(\"div\", { className: classes.header },\r\n React.createElement(Typography, null, translate('ra.action.bulk_actions', {\r\n smart_count: selectedItems.length,\r\n }))),\r\n !selectedItems || selectedItems.length === 0 ? (React.createElement(\"div\", { className: classes.empty })) : (React.createElement(\"div\", null, selectedItems\r\n .sort((a, b) => a.record.name > b.record.name\r\n ? 1\r\n : b.record.name > a.record.name\r\n ? -1\r\n : 0)\r\n .map((item, index) => {\r\n return item.type === 'apis' ? (React.createElement(ApiSelectionListItem, { className: classes.item, key: item.record.id, onRemoved: onItemRemoved, onApiPlanChanged: onApiPlanChanged, item: item, orgUuid: orgUuid })) : (React.createElement(ApiGroupSelectionListItem, { className: classes.item, key: item.record.id, onRemoved: onItemRemoved, item: item }));\r\n })))));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n },\r\n empty: {\r\n flexGrow: 1,\r\n borderStyle: 'dashed',\r\n borderWidth: 2,\r\n borderColor: theme.palette.grey[500],\r\n },\r\n header: {\r\n // The following styles ensure the header text is\r\n // correctly aligned with the tabs on the right\r\n display: 'flex',\r\n minHeight: 48,\r\n alignItems: 'center',\r\n },\r\n item: {\r\n minHeight: 48,\r\n '&:not(:last-child)': {\r\n borderBottomStyle: 'solid',\r\n borderWidth: 1,\r\n borderColor: theme.palette.grey[400],\r\n },\r\n },\r\n}), {\r\n name: 'Layer7SelectionList',\r\n});\r\n//# sourceMappingURL=SelectionList.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport * as React from 'react';\r\nexport function TabPanel(props) {\r\n const { children, value, index } = props, other = __rest(props, [\"children\", \"value\", \"index\"]);\r\n return (React.createElement(\"div\", Object.assign({ role: \"tabpanel\", hidden: value !== index, id: `simple-tabpanel-${index}`, \"aria-labelledby\": `simple-tab-${index}` }, other), value === index && children));\r\n}\r\n//# sourceMappingURL=TabPanel.js.map","import * as React from 'react';\r\nimport { SearchInput } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nexport function ListArrayInputFilter(props) {\r\n const { filter, setFilter } = props;\r\n const translate = useTranslate();\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(SearchInput, { source: \"q\", onChange: event => { var _a; return setFilter(((_a = event === null || event === void 0 ? void 0 : event.target) === null || _a === void 0 ? void 0 : _a.value) || ''); }, placeholder: translate('resources.applications.actions.searchByApiTitle') })));\r\n}\r\n//# sourceMappingURL=ListArrayInputFilter.js.map","import * as React from 'react';\r\nimport { ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Chip, IconButton, Tooltip, Typography, } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport { useTranslate } from 'ra-core';\r\nimport { ApiStatus } from '../../apis/ApiStatus';\r\nimport { useListArrayInputItem } from '../../ui';\r\nexport function ApiChoiceItem(props) {\r\n const { record, selected, onAdd } = useListArrayInputItem();\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n return (React.createElement(ExpansionPanel, null,\r\n React.createElement(ExpansionPanelSummary, { expandIcon: React.createElement(ExpandMoreIcon, null) },\r\n React.createElement(Tooltip, { title: translate('ra.action.add') },\r\n React.createElement(\"span\", null,\r\n React.createElement(IconButton, { \"aria-label\": translate('ra.action.add'), className: classes.add, disabled: selected, onClick: onAdd, color: \"primary\" },\r\n React.createElement(AddIcon, null)))),\r\n React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, null, record.name),\r\n React.createElement(Typography, { className: classes.version },\r\n \"v\",\r\n record.version))),\r\n React.createElement(ExpansionPanelDetails, null,\r\n React.createElement(\"div\", { className: classes.details },\r\n record.tags &&\r\n record.tags.map((tag, i) => (React.createElement(Chip, { key: i, label: tag, className: classes.tag }))),\r\n React.createElement(\"div\", { className: classes.additionalDetails },\r\n React.createElement(\"div\", { className: classes.description }, record.description),\r\n React.createElement(ApiStatus, { record: record, variant: \"caption\" }))))));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n },\r\n add: {\r\n marginTop: theme.spacing(-1),\r\n },\r\n version: {\r\n color: theme.palette.text.secondary,\r\n marginLeft: theme.spacing(1),\r\n },\r\n details: {\r\n marginTop: theme.spacing(-2),\r\n marginLeft: theme.spacing(6),\r\n width: '100%',\r\n },\r\n additionalDetails: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginTop: theme.spacing(2),\r\n },\r\n description: {\r\n marginTop: theme.spacing(0),\r\n fontSize: theme.typography.pxToRem(14),\r\n },\r\n tag: {\r\n marginRight: theme.spacing(1),\r\n height: theme.spacing(3),\r\n },\r\n status: {\r\n marginTop: theme.spacing(0),\r\n fontSize: theme.typography.pxToRem(14),\r\n },\r\n}), {\r\n name: 'Layer7ApiChoiceItem',\r\n});\r\n//# sourceMappingURL=ApiChoiceItem.js.map","import * as React from 'react';\r\nimport { Divider, IconButton, ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Tooltip, Typography, } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport { useTranslate } from 'ra-core';\r\nimport { ApiStatus } from '../../apis/ApiStatus';\r\nimport { useListArrayInputItem } from '../../ui';\r\nexport function ApiGroupChoiceItem(props) {\r\n const { record, selected, onAdd } = useListArrayInputItem();\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n return (React.createElement(ExpansionPanel, null,\r\n React.createElement(ExpansionPanelSummary, { expandIcon: React.createElement(ExpandMoreIcon, null) },\r\n React.createElement(Tooltip, { title: translate('ra.action.add') },\r\n React.createElement(\"span\", null,\r\n React.createElement(IconButton, { \"aria-label\": translate('ra.action.add'), className: classes.add, disabled: selected, onClick: onAdd, color: \"primary\" },\r\n React.createElement(AddIcon, null)))),\r\n React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, null, record.name),\r\n React.createElement(Typography, { className: classes.apiCount },\r\n \"(\",\r\n record.apis.length,\r\n \")\"),\r\n React.createElement(Typography, { className: classes.status }, translate(`resources.apis.portalStatus.${record.status.toLowerCase()}`)))),\r\n React.createElement(ExpansionPanelDetails, null,\r\n React.createElement(\"div\", { className: classes.details },\r\n React.createElement(Typography, { className: classes.description }, record.description),\r\n React.createElement(Divider, null),\r\n React.createElement(\"div\", { className: classes.list }, record.apis.map(api => (React.createElement(\"div\", { className: classes.api, key: api.uuid },\r\n React.createElement(\"div\", null, api.name),\r\n React.createElement(ApiStatus, { record: api, variant: \"caption\" })))))))));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n },\r\n add: {\r\n marginTop: theme.spacing(-1),\r\n },\r\n apiCount: {\r\n color: theme.palette.text.secondary,\r\n marginLeft: theme.spacing(1),\r\n },\r\n details: {\r\n marginTop: theme.spacing(-2),\r\n marginLeft: theme.spacing(6),\r\n width: '100%',\r\n },\r\n status: {\r\n color: theme.palette.text.secondary,\r\n marginLeft: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n textTransform: 'lowercase',\r\n },\r\n description: {\r\n marginTop: theme.spacing(0),\r\n fontSize: theme.typography.pxToRem(14),\r\n },\r\n list: {\r\n marginTop: theme.spacing(1),\r\n width: '100%',\r\n },\r\n api: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n textAlign: 'left',\r\n marginTop: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7ApiGroupChoiceItem',\r\n});\r\n//# sourceMappingURL=ApiGroupChoiceItem.js.map","import * as React from 'react';\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useDataProvider, useTranslate } from 'ra-core';\r\nimport { ApiSelectionModalTaC } from './ApiSelectionModalTaC';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport function ApiGroupSelectionModal(props) {\r\n var _a;\r\n const { apiGroup, onConfirm, onCancel, orgUuid } = props;\r\n const [apiGroupEula, setApiGroupEula] = React.useState();\r\n const dataProvider = useDataProvider();\r\n const translate = useTranslate();\r\n const notify = useLayer7Notify();\r\n const classes = useStyles(props);\r\n React.useEffect(() => {\r\n async function fetchApiGroupEula() {\r\n const { data } = await dataProvider.getApiGroupEula('apiGroups', {\r\n apiGroupId: apiGroup.id,\r\n filter: { OrganizationUuid: orgUuid },\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n setApiGroupEula(data);\r\n }\r\n if (apiGroup) {\r\n fetchApiGroupEula();\r\n }\r\n }, [JSON.stringify(apiGroup)]); // eslint-disable-line\r\n return (React.createElement(Dialog, { fullWidth: true, maxWidth: \"md\", open: !!apiGroup, onClose: onCancel, \"aria-labelledby\": \"alert-dialog-title\", \"aria-describedby\": \"alert-dialog-description\" },\r\n React.createElement(React.Fragment, null,\r\n React.createElement(DialogTitle, { id: \"alert-dialog-title\" }, apiGroup === null || apiGroup === void 0 ? void 0 :\r\n apiGroup.name,\r\n \" (\", (_a = apiGroup === null || apiGroup === void 0 ? void 0 : apiGroup.apis) === null || _a === void 0 ? void 0 :\r\n _a.length,\r\n \")\"),\r\n React.createElement(DialogContent, null,\r\n React.createElement(ApiSelectionModalTaC, { content: apiGroupEula === null || apiGroupEula === void 0 ? void 0 : apiGroupEula.content })),\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { onClick: onCancel, color: \"primary\" }, translate('ra.action.cancel')),\r\n React.createElement(Button, { onClick: onConfirm, color: \"primary\", autoFocus: true }, translate('resources.applications.actions.accept_terms_and_conditions'))))));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n heading: {\r\n fontSize: theme.typography.pxToRem(14),\r\n fontWeight: theme.typography.fontWeightBold,\r\n color: theme.palette.grey[600],\r\n marginBottom: theme.spacing(3),\r\n },\r\n planSummaryTable: {\r\n marginLeft: theme.spacing(1),\r\n width: '97%',\r\n },\r\n table: {\r\n minWidth: '100%',\r\n },\r\n container: {\r\n maxHeight: '100%',\r\n },\r\n}), {\r\n name: 'Layer7ApplicationApiPlansList',\r\n});\r\n//# sourceMappingURL=ApiGroupSelectionModal.js.map","import * as React from 'react';\r\nimport { Chip, FormControl, Grid, Input, InputLabel, MenuItem, Select, Tabs, Tab, } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useDataProvider, useQuery, useTranslate } from 'ra-core';\r\nimport { useForm } from 'react-final-form';\r\nimport get from 'lodash/get';\r\nimport { ListArrayInput, ReferenceArrayInput } from '../../ui';\r\nimport { SelectionList } from './SelectionList';\r\nimport { TabPanel } from './TabPanel';\r\nimport { ListArrayInputFilter } from './ListArrayInputFilter';\r\nimport { ApiChoiceItem } from './ApiChoiceItem';\r\nimport { ApiGroupChoiceItem } from './ApiGroupChoiceItem';\r\nimport { ApiSelectionModal } from './ApiSelectionModal';\r\nimport { ApiGroupSelectionModal } from './ApiGroupSelectionModal';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport function ApiSelector(props) {\r\n const { application, resource = '', orgUuid, apis = [] } = props;\r\n const translate = useTranslate();\r\n const [selectedTab, setSelectedTab] = React.useState('apis');\r\n const [selectedItems, setSelectedItems] = React.useState(apis);\r\n const [selectedApi, setSelectedApi] = React.useState();\r\n const [selectedApiGroup, setSelectedApiGroup] = React.useState(undefined);\r\n const [apiPlansEnabled, setApiPlansEnabled] = React.useState(false);\r\n const [tags, setTags] = React.useState([]);\r\n const [filterTags, setFilterTags] = React.useState([]);\r\n const form = useForm();\r\n const classes = useStyles(props);\r\n const dataProvider = useDataProvider();\r\n const notify = useLayer7Notify();\r\n const { data: apiPlanFeatureFlag, loading: isLoadingApiPlansFeatureFlag, } = useQuery({\r\n type: 'getApiPlansFeatureFlag',\r\n resource: 'apiPlans',\r\n payload: {},\r\n });\r\n React.useEffect(() => {\r\n if (apiPlanFeatureFlag) {\r\n setApiPlansEnabled(apiPlanFeatureFlag.value === 'true');\r\n }\r\n }, [apiPlanFeatureFlag]);\r\n React.useEffect(() => {\r\n async function fetchTags() {\r\n const { data } = await dataProvider.getList('tags', {}, {\r\n onFailure: error => notify(error),\r\n });\r\n setTags(data);\r\n }\r\n if (tags.length === 0) {\r\n fetchTags();\r\n }\r\n }, []);\r\n // This effect preloads the initially selected items (either APIs or Groups)\r\n // when editing an existing application.\r\n // It uses the dataProvider directly instead of getMany because getMany\r\n // to avoid dealing with many loaded/loading states and prevent some rerender issues\r\n React.useEffect(() => {\r\n async function fetchInitialSelectedItems() {\r\n if (application.ApiIds && application.ApiIds.results.length > 0) {\r\n const { data: selectedApis } = await dataProvider.getMany('apis', {\r\n ids: application.ApiIds.results || [],\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n let selectedApiPlans = [];\r\n if (get(application, 'ApiApiPlanIds.results.length', 0)) {\r\n form.change('ApiApiPlanIds', Array.from(application.ApiApiPlanIds.results));\r\n const { data: apiPlans } = await dataProvider.getMany('apiPlans', {\r\n ids: Array.from(new Set(application.ApiApiPlanIds.results\r\n .map(result => result.ApiPlanUuid)\r\n .filter(uuid => uuid))),\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n selectedApiPlans = apiPlans;\r\n }\r\n setInitialSelectedApis(selectedApis, selectedApiPlans, get(application, 'ApiApiPlanIds.results', []));\r\n }\r\n if (application.ApiGroupIds &&\r\n application.ApiGroupIds.results.length > 0) {\r\n const { data: apiGroups } = await dataProvider.getList('apiGroups', {\r\n filter: {\r\n orgUuid: orgUuid,\r\n applicationUuid: application.id,\r\n },\r\n pagination: { page: 1, perPage: 1000 },\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n const selectedApiGroups = apiGroups.filter(apiGroup => application.ApiGroupIds.results.find(id => apiGroup.id === id));\r\n setInitialSelectedApiGroups(selectedApiGroups);\r\n }\r\n }\r\n if (application) {\r\n fetchInitialSelectedItems();\r\n }\r\n }, [JSON.stringify(application)]); // eslint-disable-line\r\n React.useEffect(() => {\r\n setSelectedItems([]);\r\n setSelectedApi(undefined);\r\n setSelectedApiGroup(undefined);\r\n setSelectedTab('apis');\r\n form.change('ApiIds', undefined);\r\n form.change('ApiGroupIds', undefined);\r\n }, [form, orgUuid]);\r\n const setInitialSelectedApis = (records, apiPlans, results) => {\r\n const apiIds = records.map(item => item.id);\r\n form.change('ApiIds', Array.from(apiIds));\r\n setSelectedItems(previousSelectedItems => {\r\n const newSelectedItems = new Set(previousSelectedItems);\r\n records.forEach(record => {\r\n newSelectedItems.add({\r\n type: 'apis',\r\n record: Object.assign(Object.assign({}, record), { apiPlan: apiPlans.find(apiPlan => apiPlan.id ===\r\n get(results.find(result => result.ApiUuid === record.id &&\r\n result.ApiPlanUuid === apiPlan.id), 'ApiPlanUuid')) }),\r\n });\r\n });\r\n return Array.from(newSelectedItems);\r\n });\r\n };\r\n const setInitialSelectedApiGroups = records => {\r\n const selectedApiGroups = records.map(item => item.id);\r\n form.change('ApiGroupIds', Array.from(selectedApiGroups));\r\n setSelectedItems(previousSelectedItems => {\r\n const newSelectedItems = new Set(previousSelectedItems);\r\n records.forEach(record => {\r\n newSelectedItems.add({\r\n type: 'apiGroups',\r\n record: record,\r\n });\r\n });\r\n return Array.from(newSelectedItems);\r\n });\r\n };\r\n const handleTabChange = (event, newSelectedTab) => setSelectedTab(newSelectedTab);\r\n const handleApiAdded = (event, record) => {\r\n // Prevent the ListArrayInput change because we want to display a modal\r\n // for ApiPlan selection first\r\n event.preventDefault();\r\n // Store the selected API which will trigger the modal display\r\n setSelectedApi(record);\r\n };\r\n const handleApiConfirmed = event => {\r\n // Get the current list of ApiIds\r\n const selectedApis = new Set(form.getState().values.ApiIds || []);\r\n selectedApis.add(selectedApi.id);\r\n // Update the form by adding the selected API\r\n form.change('ApiIds', Array.from(selectedApis));\r\n const selectedApiPlans = new Set(form.getState().values.ApiApiPlanIds || []);\r\n if (selectedApi.apiPlan) {\r\n selectedApiPlans.add({\r\n ApiUuid: selectedApi.id,\r\n ApiPlanUuid: selectedApi.apiPlan.uuid,\r\n });\r\n }\r\n else if (apiPlansEnabled) {\r\n selectedApiPlans.add({\r\n ApiUuid: selectedApi.id,\r\n ApiPlanUuid: null,\r\n });\r\n }\r\n form.change('ApiApiPlanIds', Array.from(selectedApiPlans));\r\n // Update the selection list\r\n setSelectedItems(previousSelectedItems => {\r\n const newSelectedItems = new Set(previousSelectedItems);\r\n newSelectedItems.add({ type: 'apis', record: selectedApi });\r\n return Array.from(newSelectedItems);\r\n });\r\n // Close the modal\r\n setSelectedApi(undefined);\r\n };\r\n const handleApiPlanChanged = (event, api) => {\r\n const selectedApiPlanIds = (form.getState().values.ApiApiPlanIds || []).map(apiPlanId => {\r\n const newApiPlanId = Object.assign({}, apiPlanId);\r\n if (newApiPlanId.ApiUuid === api.id) {\r\n newApiPlanId.ApiPlanUuid = api.apiPlan.uuid;\r\n }\r\n return newApiPlanId;\r\n });\r\n form.change('ApiApiPlanIds', selectedApiPlanIds);\r\n setSelectedItems(previousSelectedItems => {\r\n const newSelectedItems = previousSelectedItems.map(item => {\r\n const newRecord = Object.assign({}, item.record);\r\n if (newRecord.id === api.id) {\r\n newRecord.apiPlan = api.apiPlan;\r\n }\r\n return { type: 'apis', record: newRecord };\r\n });\r\n return newSelectedItems;\r\n });\r\n };\r\n const handleApiCancelled = event => {\r\n setSelectedApi(undefined);\r\n };\r\n const handleApiGroupAdded = (event, record) => {\r\n event.preventDefault();\r\n setSelectedApiGroup(record);\r\n };\r\n const handleApiGroupConfirmed = event => {\r\n // Get the current list of ApiGroupIds\r\n const selectedApiGroups = new Set(form.getState().values.ApiGroupIds || []);\r\n selectedApiGroups.add(selectedApiGroup.id);\r\n // Update the form by adding the selected API\r\n form.change('ApiGroupIds', Array.from(selectedApiGroups));\r\n setSelectedItems(previousSelectedItems => {\r\n const newSelectedItems = new Set(previousSelectedItems);\r\n newSelectedItems.add({\r\n type: 'apiGroups',\r\n record: selectedApiGroup,\r\n });\r\n return Array.from(newSelectedItems);\r\n });\r\n // Close the modal\r\n setSelectedApiGroup(undefined);\r\n };\r\n const handleApiGroupCancelled = event => {\r\n setSelectedApiGroup(undefined);\r\n };\r\n const handleItemRemoved = (event, itemToRemove) => {\r\n setSelectedItems(previousSelectedItems => previousSelectedItems.filter(item => {\r\n const differentType = itemToRemove.type !== item.type;\r\n const differentId = itemToRemove.record.id !== item.record.id;\r\n return differentType || differentId;\r\n }));\r\n let field = itemToRemove.type === 'apis' ? 'ApiIds' : 'ApiGroupIds';\r\n // We can't use form.getFieldState here because the tab containing\r\n // the input for the field may not be active and getFieldState returns\r\n // undefined in this case.\r\n const selectedItemIds = form.getState().values[field] || [];\r\n form.change(field, selectedItemIds.filter(id => id !== itemToRemove.record.id));\r\n if (apiPlansEnabled) {\r\n const selectedApiPlanIds = form.getState().values['ApiApiPlanIds'] || [];\r\n form.change('ApiApiPlanIds', selectedApiPlanIds.filter(object => object.ApiUuid !== itemToRemove.record.id));\r\n }\r\n };\r\n if (isLoadingApiPlansFeatureFlag) {\r\n return null;\r\n }\r\n const TagSelector = props => {\r\n const handleChange = event => {\r\n setFilterTags(event.target.value);\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(ListArrayInputFilter, Object.assign({}, props, { alwaysOn: true })),\r\n React.createElement(FormControl, { className: classes.tagFilter },\r\n React.createElement(InputLabel, null, translate('resources.applications.actions.filterByTag')),\r\n React.createElement(Select, { multiple: true, autoWidth: true, value: filterTags, onChange: handleChange, input: React.createElement(Input, null), renderValue: selected => (React.createElement(\"div\", { className: classes.tags }, selected.map(value => (React.createElement(Chip, { key: value.uuid, label: value.name, className: classes.tag }))))) }, tags.map(tag => (React.createElement(MenuItem, { key: tag.uuid, value: tag }, tag.name)))))));\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Grid, { className: classes.root, container: true, spacing: 4 },\r\n React.createElement(Grid, { item: true, xs: 5 },\r\n React.createElement(SelectionList, { selectedItems: selectedItems, onItemRemoved: handleItemRemoved, onApiPlanChanged: handleApiPlanChanged, orgUuid: orgUuid })),\r\n React.createElement(Grid, { item: true, xs: 7 },\r\n React.createElement(Tabs, { className: classes.tabs, value: selectedTab, onChange: handleTabChange, indicatorColor: \"primary\", textColor: \"primary\" },\r\n React.createElement(Tab, { label: translate('resources.apis.name', {\r\n smart_count: 2,\r\n }), id: \"api-selector-tab-apis\", \"aria-controls\": \"api-selector-tabpanel-apis\", value: \"apis\" }),\r\n !apiPlansEnabled && (React.createElement(Tab, { label: translate('resources.apiGroups.name', {\r\n smart_count: 2,\r\n }), id: \"api-selector-tab-api-groups\", \"aria-controls\": \"api-selector-tabpanel-api-groups\", value: \"apiGroups\" }))),\r\n React.createElement(TabPanel, { value: selectedTab, index: \"apis\" }, orgUuid && (React.createElement(ReferenceArrayInput, { label: \"\", source: \"ApiIds\", reference: \"apis\", resource: resource, perPage: 5, filter: {\r\n portalStatus: 'ENABLED',\r\n orgUuid: orgUuid,\r\n tags: filterTags.map(tag => tag.name),\r\n } },\r\n React.createElement(ListArrayInput, { filters: React.createElement(TagSelector, null), onAdd: handleApiAdded },\r\n React.createElement(ApiChoiceItem, null))))),\r\n !apiPlansEnabled && (React.createElement(TabPanel, { value: selectedTab, index: \"apiGroups\" }, orgUuid && (React.createElement(ReferenceArrayInput, { label: \"\", source: \"ApiGroupIds\", reference: \"apiGroups\", resource: resource, perPage: 5, filter: { orgUuid: orgUuid } },\r\n React.createElement(ListArrayInput, { filters: React.createElement(ListArrayInputFilter, null), onAdd: handleApiGroupAdded },\r\n React.createElement(ApiGroupChoiceItem, null)))))),\r\n React.createElement(ApiSelectionModal, { api: selectedApi, onConfirm: handleApiConfirmed, onCancel: handleApiCancelled, apiPlansEnabled: apiPlansEnabled, source: \"ApiApiPlanIds\", orgUuid: orgUuid }),\r\n React.createElement(ApiGroupSelectionModal, { apiGroup: selectedApiGroup, onConfirm: handleApiGroupConfirmed, onCancel: handleApiGroupCancelled, source: \"ApiGroupIds\", orgUuid: orgUuid })))));\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n marginBottom: theme.spacing(1),\r\n },\r\n tabs: {\r\n borderBottom: `1px solid ${theme.palette.divider}`,\r\n },\r\n tagFilter: {\r\n marginLeft: theme.spacing(1),\r\n marginTop: theme.spacing(3),\r\n minWidth: theme.spacing(20),\r\n maxWidth: theme.spacing(200),\r\n },\r\n tags: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n tag: {\r\n margin: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7ApiSelector',\r\n});\r\n//# sourceMappingURL=ApiSelector.js.map","import React from 'react';\r\nimport { required, SelectInput } from 'react-admin';\r\nimport { useGetList } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nconst useSelectInputStyles = makeStyles({\r\n SelectInput: {\r\n width: '100%',\r\n },\r\n});\r\nexport const OrganizationSelectInput = props => {\r\n const { data = {}, loaded } = useGetList('organizations', {\r\n page: 1,\r\n perPage: 200,\r\n });\r\n const selectInputClasses = useSelectInputStyles();\r\n const orgList = Object.values(data).map(choice => ({\r\n id: choice.id,\r\n name: choice.name,\r\n }));\r\n if (!loaded) {\r\n return null;\r\n }\r\n return (React.createElement(SelectInput, { source: \"organizationName\", label: \"resources.applications.fields.selectOrganization\", choices: orgList, validate: required(), className: selectInputClasses.SelectInput, onChange: e => props.onChange(e.target.value) }));\r\n};\r\n//# sourceMappingURL=OrganizationSelectInput.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { TextInput, SelectInput, required } from 'react-admin';\r\n/**\r\n * A custom react admin input which takes a Layer7 ApiHub CustomField\r\n * definition and returns a configured react admin input.\r\n * @param {Object} props\r\n * @param {Object.customField} The CustomField definition\r\n *\r\n * @example\r\n * export function TestPage() {\r\n * const [formValues, setFormValues] = React.useState();\r\n * const { ids, data, loaded } = useGetList('customFields');\r\n *\r\n * if (!loaded) {\r\n * return null;\r\n * }\r\n *\r\n * const handleSubmit = values => {\r\n * setFormValues(values);\r\n * };\r\n *\r\n * return (\r\n * <>\r\n * \r\n * {ids.map(id => (\r\n * \r\n * ))}\r\n * \r\n * {formValues ? JSON.stringify(formValues, null, 4) : null}
\r\n * >\r\n * );\r\n * }\r\n */\r\nexport function CustomFieldInput(props) {\r\n const { customField } = props, rest = __rest(props, [\"customField\"]);\r\n if (customField.Type === CustomFieldTypeText) {\r\n return (React.createElement(TextInput, Object.assign({}, rest, { \r\n // Required because react-admin forms clone their children and\r\n // may inject an undefined id if a child has no source prop\r\n id: customField.Name, source: customField.id, label: customField.Name, validate: customField.Required ? required() : undefined })));\r\n }\r\n if (customField.Type === CustomFieldTypeSingleSelect) {\r\n return (React.createElement(SelectInput, Object.assign({}, rest, { \r\n // Required because react-admin forms clone their children and\r\n // may inject an undefined id if a child has no source prop\r\n id: customField.Name, source: customField.id, label: customField.Name, choices: customField.OptionsList.results\r\n .sort(sortByOrdinal)\r\n .map(choice => ({\r\n id: choice.Value,\r\n name: choice.Value,\r\n })), validate: customField.Required ? required() : undefined })));\r\n }\r\n return null;\r\n}\r\nconst CustomFieldTypeText = 'TEXT';\r\nconst CustomFieldTypeSingleSelect = 'SINGLE_SELECT';\r\nconst sortByOrdinal = (a, b) => a.Ordinal - b.Ordinal;\r\n//# sourceMappingURL=CustomFieldInput.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useGetList, useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Typography } from '@material-ui/core';\r\nimport { Labeled } from 'react-admin';\r\nimport { useForm } from 'react-final-form';\r\nimport { CustomFieldInput } from '../../ui/CustomFieldInput';\r\nconst useSelectInputStyles = makeStyles(theme => ({\r\n SelectInput: {\r\n width: '100%',\r\n },\r\n}));\r\nconst useLabelStyles = makeStyles(theme => ({\r\n label: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1.5rem',\r\n },\r\n}));\r\nexport const ApplicationCustomField = props => {\r\n const { fields, type } = props, rest = __rest(props, [\"fields\", \"type\"]);\r\n const isEdit = type === 'EDIT';\r\n return (React.createElement(React.Fragment, null,\r\n isEdit && React.createElement(EditCustomFieldData, { source: \"cf\", fields: fields }),\r\n !isEdit && React.createElement(CreateCustomField, { source: \"cf\" })));\r\n};\r\nexport const EditCustomFieldData = (_a) => {\r\n var { fields, type } = _a, rest = __rest(_a, [\"fields\", \"type\"]);\r\n const { ids = [], data, loaded, error } = useGetList('customFields');\r\n const selectInputClasses = useSelectInputStyles();\r\n const labelClasses = useLabelStyles();\r\n const translate = useTranslate();\r\n const form = useForm();\r\n if (ids.length === 0) {\r\n return null;\r\n }\r\n // Merging all CustomFields and application > customfields values.\r\n const mergedData = Object.values(data).map((item, i) => (Object.assign(Object.assign({}, item), fields.find(itmInner => itmInner.CustomFieldUuid === item.id))));\r\n form.change('CustomFieldsArr', Array.from(ids));\r\n return (React.createElement(\"div\", null,\r\n React.createElement(Labeled, { id: \"customField\", label: \"resources.applications.fields.customField\", classes: labelClasses }),\r\n mergedData.length === 0 ? (React.createElement(Typography, null, translate('resources.applications.fields.noCustomFields'))) : (mergedData.map(item => (React.createElement(CustomFieldInput, { key: item.id, \r\n // source is required to properly link the label to the input\r\n source: item.id, customField: item, className: selectInputClasses.SelectInput, initialValue: item.Value }))))));\r\n};\r\nexport const CreateCustomField = () => {\r\n const { ids = [], data, loaded, error } = useGetList('customFields');\r\n const selectInputClasses = useSelectInputStyles();\r\n const labelClasses = useLabelStyles();\r\n const translate = useTranslate();\r\n if (error || !loaded || ids.length === 0) {\r\n return null;\r\n }\r\n return (React.createElement(\"div\", null,\r\n React.createElement(Labeled, { id: \"customField\", label: \"resources.applications.fields.customField\", classes: labelClasses }),\r\n ids.length === 0 ? (React.createElement(Typography, null, translate('resources.applications.fields.noCustomFields'))) : (ids.map(id => (React.createElement(CustomFieldInput, { key: id, \r\n // source is required to properly link the label to the input\r\n source: data[id].id, customField: data[id], className: selectInputClasses.SelectInput }))))));\r\n};\r\n//# sourceMappingURL=ApplicationCustomField.js.map","import React, { useState, useEffect } from 'react';\r\nimport { useQuery, required, RadioButtonGroupInput } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport get from 'lodash/get';\r\nconst useSelectInputStyles = makeStyles({\r\n input: {\r\n width: '100%',\r\n },\r\n});\r\nexport const KeySecretSelectInput = () => {\r\n const [allowHashedSecret, setAllowHashedSecret] = useState(false);\r\n const [allowPlainTextSecret, setAllowPlainTextSecret] = useState(false);\r\n const translate = useTranslate();\r\n const { data, error, loading } = useQuery({\r\n type: 'getSecretHashMetadata',\r\n resource: 'applications',\r\n payload: {},\r\n });\r\n useEffect(() => {\r\n if (error) {\r\n setAllowHashedSecret(false);\r\n setAllowPlainTextSecret(false);\r\n }\r\n else if (data && data.value) {\r\n const isPlainTextAllowed = get(JSON.parse(data.value), 'plaintextAllowed');\r\n setAllowHashedSecret(true);\r\n setAllowPlainTextSecret(isPlainTextAllowed);\r\n }\r\n else {\r\n setAllowHashedSecret(false);\r\n setAllowPlainTextSecret(true);\r\n }\r\n }, [data, error]);\r\n const classes = useSelectInputStyles();\r\n const choices = [\r\n ...(allowPlainTextSecret\r\n ? [\r\n {\r\n id: 'plaintext',\r\n name: translate('resources.applications.actions.plainTextSecret'),\r\n checked: true,\r\n },\r\n ]\r\n : []),\r\n ...(allowHashedSecret\r\n ? [\r\n {\r\n id: 'hashedsecret',\r\n name: translate('resources.applications.actions.hashedSecret'),\r\n },\r\n ]\r\n : []),\r\n ];\r\n if (loading || (!allowPlainTextSecret && !allowHashedSecret)) {\r\n return null;\r\n }\r\n return (React.createElement(RadioButtonGroupInput, { source: \"sharedSecret\", label: \"resources.applications.fields.sharedSecretFormat\", className: classes.input, choices: choices, validate: required() }));\r\n};\r\n//# sourceMappingURL=KeySecretSelectInput.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState } from 'react';\r\nimport { useTranslate, linkToRecord } from 'ra-core';\r\nimport Button from '@material-ui/core/Button';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport ReportProblemOutlinedIcon from '@material-ui/icons/ReportProblemOutlined';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useCopyToClipboard } from '../../ui';\r\nimport { useHistory } from 'react-router-dom';\r\nconst useOneTimePasswordDialogStyles = makeStyles(theme => ({\r\n mainContent: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n leftSection: {\r\n flex: '1',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n margin: theme.spacing(0),\r\n padding: theme.spacing(1),\r\n backgroundColor: theme.palette.warning.main,\r\n color: theme.palette.common.white,\r\n },\r\n leftIcon: {\r\n fontSize: '5rem',\r\n color: theme.palette.common.white,\r\n },\r\n rightSection: {\r\n flex: '5',\r\n flexDirection: 'row',\r\n },\r\n subHeading: {\r\n textTransform: 'uppercase',\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n copyHashSection: {\r\n backgroundColor: theme.palette.background.default,\r\n padding: theme.spacing(1),\r\n textAlign: 'center',\r\n },\r\n}), {\r\n name: 'Layer7ApplicationOneTimePasswordDialog',\r\n});\r\nexport const OneTimePasswordDialog = (_a) => {\r\n var { id, keySecret } = _a, props = __rest(_a, [\"id\", \"keySecret\"]);\r\n const [open, setOpen] = useState(true);\r\n const history = useHistory();\r\n const classes = useOneTimePasswordDialogStyles();\r\n const copyToClipboard = useCopyToClipboard({\r\n successMessage: 'resources.applications.notifications.copy_success',\r\n errorMessage: 'resources.applications.notifications.copy_error',\r\n });\r\n const translate = useTranslate();\r\n const handleDialogClose = () => {\r\n if (open) {\r\n setOpen(false);\r\n }\r\n history.push(linkToRecord('/applications', id, 'show'));\r\n };\r\n return (React.createElement(Dialog, { disableBackdropClick: \"false\", disableEscapeKeyDown: \"false\", open: open, onClose: handleDialogClose, \"aria-labelledby\": \"form-dialog-title\" },\r\n React.createElement(\"div\", { className: classes.mainContent },\r\n React.createElement(\"div\", { className: classes.leftSection },\r\n React.createElement(ReportProblemOutlinedIcon, { className: classes.leftIcon })),\r\n React.createElement(\"div\", { className: classes.rightSection },\r\n React.createElement(DialogTitle, { id: \"form-dialog-title\" }, translate('resources.applications.notifications.secret_generated_heading')),\r\n React.createElement(DialogContent, { dividers: true },\r\n React.createElement(Typography, { variant: \"subtitle1\", component: \"h2\", className: classes.subHeading, gutterBottom: true }, translate('resources.applications.notifications.copy_secret_now')),\r\n React.createElement(Typography, { variant: \"body1\", gutterBottom: true }, translate('resources.applications.notifications.secret_generated_message')),\r\n React.createElement(\"div\", { className: classes.copyHashSection },\r\n React.createElement(Typography, { variant: \"subtitle2\", gutterBottom: true }, translate('resources.applications.fields.sharedSecretClientSecret')),\r\n React.createElement(Typography, { variant: \"body1\", gutterBottom: true }, keySecret),\r\n React.createElement(Button, { onClick: copyToClipboard, value: keySecret, align: \"center\", variant: \"contained\", color: \"primary\" }, translate('resources.applications.notifications.copy_to_clipboard')))),\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { onClick: handleDialogClose, color: \"secondary\" }, translate('ra.action.close')))))));\r\n};\r\n//# sourceMappingURL=OneTimePasswordDialog.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { SimpleForm, TextInput, required, minLength, maxLength, Labeled, RadioButtonGroupInput, useCreate, CRUD_CREATE, } from 'react-admin';\r\nimport { useRefresh, useTranslate, linkToRecord } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { getUserOrganizations, isOrgBoundUser } from '../userContexts';\r\nimport { ApplicationToolbar } from './ApplicationToolbar';\r\nimport { ApiSelector } from './ApiSelector';\r\nimport { OrganizationSelectInput, ApplicationCustomField, KeySecretSelectInput, } from './formFields';\r\nimport { useLayer7Notify } from '../useLayer7Notify';\r\nimport { OneTimePasswordDialog } from './OneTimePasswordDialog';\r\nexport const ApplicationNew = ({ userContext, toolbarProps }) => {\r\n const classes = useStyles();\r\n const labelClasses = useLabelStyles();\r\n const history = useHistory();\r\n const { hasAccessibleOrgs, activeOrg } = getUserOrganizations(userContext);\r\n const [showOrgList, setShowOrgList] = useState(false);\r\n const [showDialog, setShowDialog] = useState(false);\r\n const [keySecret, setKeySecret] = useState(null);\r\n const [applicationId, setApplicationId] = useState(null);\r\n const [selectedOrganization, setSelectedOrganization] = useState(null);\r\n const [create, { loading, error }] = useCreate('applications');\r\n const notify = useLayer7Notify();\r\n const refresh = useRefresh();\r\n const translate = useTranslate();\r\n const initialValues = {\r\n applicationName: '',\r\n description: '',\r\n organizationName: (activeOrg === null || activeOrg === void 0 ? void 0 : activeOrg.name) || '',\r\n oAuthCallbackUrl: '',\r\n oAuthScope: '',\r\n oAuthType: 'public',\r\n sharedSecret: null,\r\n };\r\n useEffect(() => {\r\n if (!isOrgBoundUser(userContext) && !hasAccessibleOrgs) {\r\n setShowOrgList(true);\r\n }\r\n else {\r\n setShowOrgList(false);\r\n setSelectedOrganization(activeOrg === null || activeOrg === void 0 ? void 0 : activeOrg.uuid);\r\n }\r\n }, [activeOrg, hasAccessibleOrgs, userContext]);\r\n const onSubmit = form => {\r\n const { applicationName, description, organizationName, oAuthCallbackUrl, oAuthScope, oAuthType, sharedSecret, ApiIds = [], ApiApiPlanIds = [], ApiGroupIds = [], q } = form, rest = __rest(form, [\"applicationName\", \"description\", \"organizationName\", \"oAuthCallbackUrl\", \"oAuthScope\", \"oAuthType\", \"sharedSecret\", \"ApiIds\", \"ApiApiPlanIds\", \"ApiGroupIds\", \"q\"]);\r\n const customFieldsArr = Object.entries(rest).map(([key, value]) => {\r\n return {\r\n Uuid: '{{GENERATED_UUID}}',\r\n EntityUuid: '{{GENERATED_UUID}}',\r\n CustomFieldUuid: key,\r\n Value: value,\r\n };\r\n });\r\n let payload = Object.assign({ Name: applicationName, Description: description, OrganizationUuid: selectedOrganization, OauthCallbackUrl: oAuthCallbackUrl, OauthScope: oAuthScope, OauthType: oAuthType, Uuid: '{{GENERATED_GUID}}', ApiIds: { results: ApiIds }, ApiApiPlanIds: { results: ApiApiPlanIds }, ApiGroupIds: { results: ApiGroupIds }, CustomFieldValues: {\r\n results: customFieldsArr,\r\n } }, (sharedSecret\r\n ? { ShouldHash: sharedSecret === 'hashedsecret' }\r\n : {}));\r\n create({\r\n payload: { data: payload },\r\n }, {\r\n action: CRUD_CREATE,\r\n onSuccess: ({ data }) => {\r\n notify('resources.applications.notifications.create_success');\r\n if (payload.ShouldHash) {\r\n setKeySecret(data.keySecret);\r\n setApplicationId(data.id);\r\n setShowDialog(true);\r\n refresh();\r\n }\r\n else {\r\n history.push(linkToRecord('/applications', data.id, 'show'));\r\n }\r\n },\r\n onFailure: error => {\r\n notify(error ||\r\n 'resources.applications.notifications.create_error', 'error');\r\n },\r\n });\r\n };\r\n return (React.createElement(Grid, { className: classes.root, container: true, spacing: 3 },\r\n React.createElement(Grid, { container: true, item: true, md: 8, sm: 12 },\r\n React.createElement(SimpleForm, { className: classes.form, save: onSubmit, initialValues: initialValues, toolbar: React.createElement(ApplicationToolbar, Object.assign({}, toolbarProps)) },\r\n React.createElement(TextInput, { source: \"applicationName\", type: \"text\", label: \"resources.applications.fields.name\", variant: \"filled\", fullWidth: true, helperText: \"resources.applications.validation.application_name_caption\", validate: [required(), minLength(2), maxLength(50)] }),\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"applicationName\", label: \"resources.applications.fields.applicationInformation\", classes: labelClasses, className: classes.field }),\r\n showOrgList && (React.createElement(OrganizationSelectInput, { onChange: setSelectedOrganization, source: \"organizationName\" })),\r\n React.createElement(TextInput, { source: \"description\", type: \"text\", label: \"resources.applications.fields.description\", variant: \"filled\", multiline: true, fullWidth: true }),\r\n React.createElement(ApplicationCustomField, { className: classes.field }),\r\n React.createElement(Labeled, { label: \"resources.applications.fields.apiManagement\", classes: labelClasses, className: classes.field }),\r\n React.createElement(ApiSelector, { orgUuid: selectedOrganization, source: \"selected\" }),\r\n React.createElement(Labeled, { label: \"resources.applications.fields.authCredentials\", classes: labelClasses, className: classes.field }),\r\n React.createElement(TextInput, { source: \"oAuthCallbackUrl\", type: \"text\", label: \"resources.applications.fields.callbackUrl\", variant: \"filled\", multiline: true, fullWidth: true, helperText: \"resources.applications.validation.callback_url_caption\", validate: [maxLength(2048)] }),\r\n React.createElement(TextInput, { source: \"oAuthScope\", type: \"text\", label: \"resources.applications.fields.scope\", variant: \"filled\", multiline: true, fullWidth: true, helperText: \"resources.applications.validation.scope_caption\", validate: [maxLength(4000)] }),\r\n React.createElement(RadioButtonGroupInput, { source: \"oAuthType\", label: \"resources.applications.fields.type\", className: classes.input, choices: [\r\n {\r\n id: 'public',\r\n name: translate('resources.applications.fields.public'),\r\n },\r\n {\r\n id: 'confidential',\r\n name: translate('resources.applications.fields.confidential'),\r\n },\r\n ] }),\r\n React.createElement(KeySecretSelectInput, { source: \"sharedSecret\" })),\r\n showDialog && (React.createElement(OneTimePasswordDialog, { id: applicationId, keySecret: keySecret })))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n fontFamily: theme.typography.body2.fontFamily,\r\n fontSize: theme.typography.caption.fontSize,\r\n margin: theme.spacing(0),\r\n },\r\n details: {},\r\n configuration: {},\r\n subtitle: {\r\n textTransform: 'uppercase',\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1rem',\r\n margin: theme.spacing(1, 1, 2, 1),\r\n },\r\n field: {\r\n marginRight: theme.spacing(1),\r\n width: '100%',\r\n },\r\n type: {\r\n textTransform: 'uppercase',\r\n },\r\n icon: {\r\n fontSize: '1rem',\r\n },\r\n form: {\r\n flex: 1,\r\n },\r\n customFields: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n label: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1.5rem',\r\n },\r\n input: {\r\n width: '100%',\r\n },\r\n apiSelector: {\r\n marginBottom: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7ApplicationDetails',\r\n});\r\nconst useLabelStyles = makeStyles(theme => ({\r\n label: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1.5rem',\r\n },\r\n}));\r\n//# sourceMappingURL=ApplicationNew.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useTranslate } from 'ra-core';\r\nimport { Create } from '../ui';\r\nimport { ApplicationNew } from './ApplicationNew';\r\nimport { useUserContext } from '../userContexts';\r\nconst useTitleStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {},\r\n status: {\r\n padding: theme.spacing(1, 0),\r\n },\r\n}), {\r\n name: 'Layer7ApplicationTitle',\r\n});\r\nconst useStyles = makeStyles({\r\n root: {},\r\n card: {},\r\n}, {\r\n name: 'Layer7ApplicationCreate',\r\n});\r\n//TODO: proper translation for Title\r\nconst Title = (_a) => {\r\n var rest = __rest(_a, []);\r\n const classes = useTitleStyles(rest);\r\n const translate = useTranslate();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(\"span\", { className: classes.title }, translate('resources.applications.actions.addApplication'))));\r\n};\r\nexport const ApplicationCreate = props => {\r\n const _a = useStyles(props), { root: rootClassName } = _a, classes = __rest(_a, [\"root\"]);\r\n const { permissions, id } = props, rest = __rest(props, [\"permissions\", \"id\"]);\r\n const [userContext] = useUserContext();\r\n const [canCreateApp, setCanCreateApp] = React.useState(false);\r\n React.useEffect(() => {\r\n if (userContext && !userContext.userDetails.developer) {\r\n setCanCreateApp(true);\r\n }\r\n }, [userContext]);\r\n return (canCreateApp && (React.createElement(Create, Object.assign({ className: rootClassName, classes: classes, title: React.createElement(Title, null) }, rest),\r\n React.createElement(ApplicationNew, { userContext: userContext }))));\r\n};\r\n//# sourceMappingURL=ApplicationCreate.js.map","import React from 'react';\r\nimport { Edit as RaEdit } from 'react-admin';\r\nimport { ViewTitle } from './ViewTitle';\r\nexport const Edit = props => (React.createElement(React.Fragment, null,\r\n React.createElement(ViewTitle, null),\r\n React.createElement(RaEdit, Object.assign({}, props))));\r\n//# sourceMappingURL=Edit.js.map","import React, { useState, useEffect } from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { Labeled, useQuery } from 'react-admin';\r\nimport Button from '@material-ui/core/Button';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport IconFileCopy from '@material-ui/icons/FileCopy';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport NativeSelect from '@material-ui/core/NativeSelect';\r\nimport ReportProblemOutlinedIcon from '@material-ui/icons/ReportProblemOutlined';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport get from 'lodash/get';\r\nimport { useForm } from 'react-final-form';\r\nimport { useLayer7Notify } from '../useLayer7Notify';\r\nimport { useCopyToClipboard } from '../ui';\r\nexport const ApplicationKeySecret = props => {\r\n const { id: appUuid, record, isEditDisabled, labelClasses } = props;\r\n const [open, setOpen] = useState(false);\r\n const classes = useStyles(props);\r\n const copyToClipboard = useCopyToClipboard({\r\n successMessage: 'resources.applications.notifications.copy_success',\r\n errorMessage: 'resources.applications.notifications.copy_error',\r\n });\r\n const translate = useTranslate();\r\n const notify = useLayer7Notify();\r\n const form = useForm();\r\n const [keySecret, setKeySecret] = useState(record.keySecret);\r\n const [isPlainTextSelected, setIsPlainTextSelected] = useState(true);\r\n const [isHashedSecretSetting, setIsHashedSecretSetting] = useState(false);\r\n const [allowSelectHashing, setAllowSelectHashing] = useState(false);\r\n const [oneTimePassword, setOneTimePassword] = useState(false);\r\n const handleClick = event => {\r\n const value = event.target.value;\r\n if (value === 0) {\r\n return false;\r\n }\r\n if ((!value && isHashedSecretSetting) || value > 1) {\r\n setIsPlainTextSelected(false);\r\n }\r\n else {\r\n setIsPlainTextSelected(true);\r\n }\r\n setOpen(true);\r\n };\r\n const handleClose = () => {\r\n setOneTimePassword(false);\r\n setOpen(false);\r\n };\r\n const handleSecretClearAndClose = () => {\r\n setKeySecret('***********');\r\n setOneTimePassword(false);\r\n setOpen(false);\r\n };\r\n const { data, error, loading: isGetSecretHashMetadataLoading } = useQuery({\r\n type: 'getSecretHashMetadata',\r\n resource: 'applications',\r\n payload: {},\r\n });\r\n useEffect(() => {\r\n if (data && data.value) {\r\n const isPlainTextAllowed = get(JSON.parse(data.value), 'plaintextAllowed');\r\n setIsHashedSecretSetting(true);\r\n setAllowSelectHashing(isPlainTextAllowed);\r\n }\r\n else {\r\n setIsHashedSecretSetting(false);\r\n setIsPlainTextSelected(true);\r\n setAllowSelectHashing(false);\r\n }\r\n }, [data, error]);\r\n /*\r\n To generate random uuid\r\n */\r\n const uuidv4 = () => {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^\r\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16));\r\n };\r\n const generateKeySecret = () => {\r\n const key = uuidv4().replace(/-/g, '');\r\n notify('resources.applications.notifications.secret_generated_heading');\r\n if (isHashedSecretSetting && !isPlainTextSelected) {\r\n setOneTimePassword(true);\r\n setKeySecret(key);\r\n form.change('ShouldHash', true);\r\n }\r\n else {\r\n setKeySecret(key);\r\n setOpen(false);\r\n form.change('ShouldHash', false);\r\n }\r\n form.change('keySecret', key);\r\n };\r\n if (isGetSecretHashMetadataLoading) {\r\n return null;\r\n }\r\n return (React.createElement(Grid, null,\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // on Labeled, this will translate in a correct `for` attribute on the label\r\n , { \r\n // on Labeled, this will translate in a correct `for` attribute on the label\r\n id: \"sharedSecretClientSecret\", label: \"resources.applications.fields.sharedSecretClientSecret\", classes: labelClasses, className: classes.field },\r\n React.createElement(Typography, { variant: \"body2\", className: classes.fieldContent },\r\n React.createElement(\"span\", { id: \"sharedSecretClientSecret\" }, keySecret),\r\n keySecret && !keySecret.includes('****') && (React.createElement(IconButton, { className: classes.buttonCopy, color: \"primary\", title: translate('resources.applications.notifications.copy_to_clipboard'), value: keySecret, onClick: copyToClipboard },\r\n React.createElement(IconFileCopy, { className: classes.iconCopy })))))),\r\n !isEditDisabled && (React.createElement(Grid, { item: true, xs: 12 },\r\n !allowSelectHashing && (React.createElement(Button, { className: classes.buttonGenerate, color: \"primary\", variant: \"outlined\", onClick: handleClick, \"aria-label\": translate('resources.applications.actions.generateSecret'), value: 0 }, translate('resources.applications.actions.generateSecret'))),\r\n isHashedSecretSetting && allowSelectHashing && (React.createElement(NativeSelect, { className: classes.selectField, name: translate('resources.applications.actions.generateSecret'), onChange: handleClick, label: translate('resources.applications.actions.generateSecret'), inputProps: {\r\n 'aria-label': translate('resources.applications.actions.generateSecret'),\r\n }, value: 0, variant: \"outlined\", color: \"primary\" },\r\n React.createElement(\"option\", { value: 0 }, translate('resources.applications.actions.generateSecret')),\r\n React.createElement(\"option\", { value: 1 }, translate('resources.applications.actions.plainTextSecret')),\r\n React.createElement(\"option\", { value: 2 }, translate('resources.applications.actions.hashedSecret')))),\r\n React.createElement(Dialog, { disableBackdropClick: oneTimePassword, disableEscapeKeyDown: oneTimePassword, open: open, onClose: handleClose, \"aria-labelledby\": \"form-dialog-title\" }, oneTimePassword ? (React.createElement(OneTimePasswordDialog, { handleClose: handleClose, keySecret: keySecret })) : (React.createElement(ShowGenerateDialog, { handleClose: handleClose, generate: generateKeySecret })))))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n field: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n marginBottom: theme.spacing(2),\r\n minWidth: '100px',\r\n },\r\n fieldContent: {},\r\n buttonCopy: {},\r\n iconCopy: {\r\n fontSize: '1rem',\r\n color: theme.palette.secondary.main,\r\n },\r\n buttonGenerate: {},\r\n selectField: {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n color: theme.palette.primary.main,\r\n borderRadius: 4,\r\n '&.MuiNativeSelect-select:focus, .MuiNativeSelect-select': {\r\n borderRadius: 'unset',\r\n backgroundColor: 'transparent',\r\n },\r\n '&.MuiInput-underline:after, .MuiInput-underline:before': {\r\n borderBottom: 0,\r\n },\r\n '&.MuiInput-underline:before': {\r\n borderBottom: 0,\r\n },\r\n '&.MuiInput-underline:hover:not(.Mui-disabled):before': {\r\n borderBottom: 0,\r\n },\r\n padding: theme.spacing(0.5),\r\n margin: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7ApplicationKeySecret',\r\n});\r\nconst useOneTimePasswordDialogStyles = makeStyles(theme => ({\r\n mainContent: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n leftSection: {\r\n flex: '1',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n margin: theme.spacing(0),\r\n padding: theme.spacing(1),\r\n backgroundColor: theme.palette.warning.main,\r\n color: theme.palette.common.white,\r\n },\r\n leftIcon: {\r\n fontSize: '5rem',\r\n color: theme.palette.common.white,\r\n },\r\n rightSection: {\r\n flex: '5',\r\n flexDirection: 'row',\r\n },\r\n subHeading: {\r\n textTransform: 'uppercase',\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n copyHashSection: {\r\n backgroundColor: theme.palette.background.default,\r\n padding: theme.spacing(1),\r\n textAlign: 'center',\r\n },\r\n}), {\r\n name: 'Layer7ApplicationOneTimePasswordDialog',\r\n});\r\nconst OneTimePasswordDialog = ({ handleClose, keySecret }) => {\r\n const classes = useOneTimePasswordDialogStyles();\r\n const copyToClipboard = useCopyToClipboard({\r\n successMessage: 'resources.applications.notifications.copy_success',\r\n errorMessage: 'resources.applications.notifications.copy_error',\r\n });\r\n const translate = useTranslate();\r\n return (React.createElement(\"div\", { className: classes.mainContent },\r\n React.createElement(\"div\", { className: classes.leftSection },\r\n React.createElement(ReportProblemOutlinedIcon, { className: classes.leftIcon })),\r\n React.createElement(\"div\", { className: classes.rightSection },\r\n React.createElement(DialogTitle, { id: \"form-dialog-title\" }, translate('resources.applications.notifications.secret_generated_heading')),\r\n React.createElement(DialogContent, { dividers: true },\r\n React.createElement(Typography, { variant: \"subtitle1\", component: \"h2\", className: classes.subHeading, gutterBottom: true }, translate('resources.applications.notifications.copy_secret_now')),\r\n React.createElement(Typography, { variant: \"body1\", gutterBottom: true }, translate('resources.applications.notifications.secret_generated_message')),\r\n React.createElement(\"div\", { className: classes.copyHashSection },\r\n React.createElement(Typography, { variant: \"subtitle2\", gutterBottom: true }, translate('resources.applications.fields.sharedSecretClientSecret')),\r\n React.createElement(Typography, { variant: \"body1\", gutterBottom: true }, keySecret),\r\n React.createElement(Button, { onClick: copyToClipboard, value: keySecret, align: \"center\", variant: \"contained\", color: \"primary\" }, translate('resources.applications.notifications.copy_to_clipboard')))),\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { onClick: handleClose, color: \"secondary\" }, translate('ra.action.close'))))));\r\n};\r\nconst ShowGenerateDialog = ({ handleClose, generate }) => {\r\n const translate = useTranslate();\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(DialogTitle, { id: \"form-dialog-title\" }, translate('resources.applications.actions.generateSecret')),\r\n React.createElement(DialogContent, { dividers: true },\r\n React.createElement(Typography, { variant: \"body1\" }, `${translate('resources.applications.notifications.generate_secret_warning_1')}\n ${translate('resources.applications.notifications.generate_secret_warning_2')}`)),\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { onClick: handleClose, variant: \"outlined\", color: \"secondary\" }, translate('ra.action.cancel')),\r\n React.createElement(Button, { onClick: generate, variant: \"contained\", color: \"primary\" }, translate('resources.applications.actions.generateSecret')))));\r\n};\r\n//# sourceMappingURL=ApplicationKeySecret.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport { FieldTitle, useInput } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { InputHelperText, InputPropTypes } from 'react-admin';\r\nimport { isValidElement } from 'react';\r\nconst ToggleSwitchInput = (_a) => {\r\n var { format, label, fullWidth, helperText, onBlur, onChange, onFocus, options, disabled, parse, resource, source, validate } = _a, rest = __rest(_a, [\"format\", \"label\", \"fullWidth\", \"helperText\", \"onBlur\", \"onChange\", \"onFocus\", \"options\", \"disabled\", \"parse\", \"resource\", \"source\", \"validate\"]);\r\n const _b = useInput(Object.assign({ format,\r\n onBlur,\r\n onChange,\r\n onFocus,\r\n parse,\r\n resource,\r\n source, type: 'checkbox', validate }, rest)), { id } = _b, _c = _b.input, { onChange: finalFormOnChange, type, value } = _c, inputProps = __rest(_c, [\"onChange\", \"type\", \"value\"]), { isRequired, meta: { error, touched } } = _b;\r\n const classes = useStyles();\r\n const handleChange = useCallback((event, value) => {\r\n finalFormOnChange(value);\r\n }, [finalFormOnChange]);\r\n return (React.createElement(FormGroup, Object.assign({}, rest),\r\n React.createElement(FormControlLabel, { control: React.createElement(Switch, Object.assign({ id: id, color: \"primary\", onChange: handleChange }, inputProps, options, { disabled: disabled, className: classes.checkbox })), label: isValidElement(label) ? (label) : (React.createElement(FieldTitle, { label: label, source: source, resource: resource, isRequired: isRequired })) }),\r\n React.createElement(FormHelperText, { error: !!error },\r\n React.createElement(InputHelperText, { touched: touched, error: error, helperText: helperText }))));\r\n};\r\nToggleSwitchInput.propTypes = Object.assign(Object.assign({}, InputPropTypes), { label: PropTypes.any, options: PropTypes.shape(Switch.propTypes), disabled: PropTypes.bool });\r\nToggleSwitchInput.defaultProps = {\r\n options: {},\r\n};\r\nexport default ToggleSwitchInput;\r\nconst useStyles = makeStyles({\r\n checkbox: {\r\n alignSelf: 'center',\r\n paddingTop: '2',\r\n },\r\n});\r\n//# sourceMappingURL=ToggleSwitchInput.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { SimpleForm, TextInput, required, minLength, maxLength, Labeled, RadioButtonGroupInput, } from 'react-admin';\r\nimport { useRefresh, useTranslate, linkToRecord, CRUD_UPDATE, useUpdate, } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { ApplicationToolbar } from './ApplicationToolbar';\r\nimport { ApiSelector } from './ApiSelector';\r\nimport { ApplicationKeyClient } from './ApplicationKeyClient';\r\nimport { ApplicationKeySecret } from './ApplicationKeySecret';\r\nimport { EditCustomFieldData } from './formFields';\r\nimport { useLayer7Notify } from '../useLayer7Notify';\r\nimport ToggleSwitchInput from '../ui/ToggleSwitchInput';\r\nimport { isEditApplicationDisabled } from './isApplicationPending';\r\nexport const ApplicationEditView = (_a) => {\r\n var _b, _c, _d;\r\n var { userContext, toolbarProps, record } = _a, props = __rest(_a, [\"userContext\", \"toolbarProps\", \"record\"]);\r\n const classes = useStyles();\r\n const labelClasses = useLabelStyles();\r\n const history = useHistory();\r\n const [apiKey, setApiKey] = useState(record.apiKey);\r\n const [applicationId, setApplicationId] = useState(props.id);\r\n const selectedOrganization = record.organizationUuid;\r\n const [statusLabel, setStatusLabel] = useState(record.status);\r\n const [update, { loading, error }] = useUpdate('applications');\r\n const notify = useLayer7Notify();\r\n const refresh = useRefresh();\r\n const translate = useTranslate();\r\n const isEditDisabled = isEditApplicationDisabled(userContext, record);\r\n const handleStatusChange = value => {\r\n setStatusLabel(value);\r\n };\r\n if (!record || !record.ApiIds) {\r\n return null;\r\n }\r\n const initialValues = {\r\n id: record.id,\r\n applicationName: record.name,\r\n description: record.description,\r\n organizationName: record.organizationName,\r\n oAuthCallbackUrl: record.OauthCallbackUrl || '',\r\n oAuthScope: record.OauthScope || '',\r\n oAuthType: ((_b = record.OauthType) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || 'public',\r\n sharedSecret: null,\r\n selected: (_c = record.ApiIds) === null || _c === void 0 ? void 0 : _c.results,\r\n customFields: ((_d = record.CustomFieldValues) === null || _d === void 0 ? void 0 : _d.results) || [],\r\n apiKey: record.apiKey,\r\n keySecret: record.keySecret,\r\n status: record.status === 'REJECTED'\r\n ? record.status\r\n : record.status === 'ENABLED',\r\n };\r\n const onSubmit = form => {\r\n const { id, status, applicationName, description, organizationName, oAuthCallbackUrl, oAuthScope, oAuthType, sharedSecret, ApiIds = [], ApiApiPlanIds = [], ApiGroupIds = [], CustomFieldsArr = [], ShouldHash = null, keySecret, apiKey } = form, rest = __rest(form, [\"id\", \"status\", \"applicationName\", \"description\", \"organizationName\", \"oAuthCallbackUrl\", \"oAuthScope\", \"oAuthType\", \"sharedSecret\", \"ApiIds\", \"ApiApiPlanIds\", \"ApiGroupIds\", \"CustomFieldsArr\", \"ShouldHash\", \"keySecret\", \"apiKey\"]);\r\n const CustomFieldValues = CustomFieldsArr.map(item => {\r\n return {\r\n Uuid: '{{GENERATED_UUID}}',\r\n EntityUuid: '{{GENERATED_UUID}}',\r\n CustomFieldUuid: item,\r\n Value: rest[item] ? rest[item] : '',\r\n };\r\n });\r\n const udpatedStatus = status => {\r\n return status === 'REJECTED'\r\n ? status\r\n : status\r\n ? 'ENABLED'\r\n : 'DISABLED';\r\n };\r\n let payload = {\r\n Name: applicationName,\r\n Description: description,\r\n OrganizationUuid: selectedOrganization,\r\n OrganizationName: organizationName,\r\n OauthCallbackUrl: oAuthCallbackUrl,\r\n OauthScope: oAuthScope,\r\n OauthType: oAuthType,\r\n Uuid: id,\r\n ApiIds: { results: ApiIds },\r\n ApiApiPlanIds: { results: ApiApiPlanIds },\r\n ApiGroupIds: { results: ApiGroupIds },\r\n CustomFieldValues: {\r\n results: CustomFieldValues,\r\n },\r\n KeySecret: keySecret,\r\n ApiKey: apiKey,\r\n Status: udpatedStatus(status),\r\n ShouldHash: ShouldHash,\r\n };\r\n //Update Application call\r\n update({\r\n payload: { id: payload.Uuid, data: payload },\r\n }, {\r\n action: CRUD_UPDATE,\r\n onSuccess: ({ data }) => {\r\n notify('resources.applications.notifications.edit_success');\r\n history.push(linkToRecord('/applications', payload.Uuid, 'show'));\r\n refresh();\r\n },\r\n onFailure: error => {\r\n notify(error ||\r\n 'resources.applications.notifications.edit_error', 'error');\r\n },\r\n });\r\n };\r\n return (React.createElement(Grid, { className: classes.root, container: true, spacing: 3 },\r\n React.createElement(Grid, { container: true, item: true, md: 9, sm: 12 },\r\n React.createElement(SimpleForm, { className: classes.form, save: onSubmit, initialValues: initialValues, toolbar: !isEditDisabled ? (React.createElement(ApplicationToolbar, Object.assign({ type: \"EDIT\", buttonLabel: \"resources.applications.actions.save\" }, toolbarProps))) : null },\r\n React.createElement(TextInput, { source: \"applicationName\", type: \"text\", label: \"resources.applications.fields.name\", variant: \"filled\", fullWidth: true, helperText: \"resources.applications.validation.application_name_caption\", validate: [required(), minLength(2), maxLength(50)] }),\r\n record.status !== 'REJECTED' && (React.createElement(ToggleSwitchInput, { source: \"status\", label: statusLabel === 'ENABLED' ||\r\n statusLabel === true\r\n ? 'resources.applications.status.enabled'\r\n : 'resources.applications.status.disabled', classes: labelClasses, className: classes.field, onChange: handleStatusChange })),\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"applicationName\", label: \"resources.applications.fields.applicationInformation\", classes: labelClasses, className: classes.field }),\r\n React.createElement(TextInput, { source: \"organizationName\", type: \"text\", label: \"resources.applications.fields.organization\", variant: \"filled\", fullWidth: true, disabled: true }),\r\n React.createElement(TextInput, { source: \"description\", type: \"text\", label: \"resources.applications.fields.description\", variant: \"filled\", multiline: true, fullWidth: true }),\r\n React.createElement(EditCustomFieldData, { fields: initialValues.customFields, type: \"EDIT\", className: classes.field }),\r\n React.createElement(Labeled, { label: \"resources.applications.fields.apiManagement\", classes: labelClasses, className: classes.field }),\r\n React.createElement(ApiSelector, { orgUuid: selectedOrganization, source: \"selected\", application: record }),\r\n React.createElement(Labeled, { label: \"resources.applications.fields.authCredentials\", classes: labelClasses, className: classes.field }),\r\n React.createElement(TextInput, { source: \"oAuthCallbackUrl\", type: \"text\", label: \"resources.applications.fields.callbackUrl\", variant: \"filled\", multiline: true, fullWidth: true, helperText: \"resources.applications.validation.callback_url_caption\", validate: [maxLength(2048)] }),\r\n React.createElement(TextInput, { source: \"oAuthScope\", type: \"text\", label: \"resources.applications.fields.scope\", variant: \"filled\", multiline: true, fullWidth: true, helperText: \"resources.applications.validation.scope_caption\", validate: [maxLength(4000)] }),\r\n React.createElement(RadioButtonGroupInput, { source: \"oAuthType\", label: \"resources.applications.fields.type\", className: classes.input, required: true, choices: [\r\n {\r\n id: 'public',\r\n name: translate('resources.applications.fields.public'),\r\n },\r\n {\r\n id: 'confidential',\r\n name: translate('resources.applications.fields.confidential'),\r\n },\r\n ] }),\r\n record.apiKey && (React.createElement(ApplicationKeyClient, { id: record.id, data: record, includeSecret: false, labelClasses: labelClasses, isEditMode: true })),\r\n record.keySecret && (React.createElement(\"div\", { className: classes.input },\r\n React.createElement(ApplicationKeySecret, { source: \"keySecret\", id: record.id, record: record, isEditDisabled: isEditDisabled ||\r\n record.status === 'DISABLED', labelClasses: labelClasses })))))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n fontFamily: theme.typography.body2.fontFamily,\r\n fontSize: theme.typography.caption.fontSize,\r\n margin: theme.spacing(0),\r\n },\r\n details: {},\r\n configuration: {},\r\n subtitle: {\r\n textTransform: 'uppercase',\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1rem',\r\n margin: theme.spacing(1, 1, 2, 1),\r\n },\r\n field: {\r\n marginRight: theme.spacing(1),\r\n width: '100%',\r\n },\r\n type: {\r\n textTransform: 'uppercase',\r\n },\r\n icon: {\r\n fontSize: '1rem',\r\n },\r\n form: {\r\n flex: 1,\r\n },\r\n customFields: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n label: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1.5rem',\r\n },\r\n input: {\r\n width: '100%',\r\n },\r\n apiSelector: {\r\n marginBottom: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7ApplicationDetails',\r\n});\r\nconst useLabelStyles = makeStyles(theme => ({\r\n label: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1.5rem',\r\n width: '100%',\r\n },\r\n}));\r\n//# sourceMappingURL=ApplicationEditView.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { ShowButton, TopToolbar } from 'react-admin';\r\nimport { Edit } from '../ui';\r\nimport { ApplicationEditView } from './ApplicationEditView';\r\nimport { ApplicationTitle } from './ApplicationTitle';\r\nimport { useUserContext } from '../userContexts';\r\nconst useStyles = makeStyles({\r\n root: {},\r\n card: {},\r\n topToolbar: {\r\n paddingTop: '0px',\r\n },\r\n}, {\r\n name: 'Layer7ApplicationCreate',\r\n});\r\nconst AppEditActions = ({ basePath, data, resource, className }) => {\r\n return (React.createElement(TopToolbar, { className: className },\r\n React.createElement(\"div\", null,\r\n React.createElement(ShowButton, { basePath: basePath, record: data }))));\r\n};\r\nexport const ApplicationEdit = props => {\r\n const _a = useStyles(props), { root: rootClassName } = _a, classes = __rest(_a, [\"root\"]);\r\n const { permissions, id } = props, rest = __rest(props, [\"permissions\", \"id\"]);\r\n const [userContext] = useUserContext();\r\n if (!userContext) {\r\n return null;\r\n }\r\n return (React.createElement(Edit, Object.assign({ className: rootClassName, classes: classes, title: React.createElement(ApplicationTitle, null), actions: React.createElement(AppEditActions, { className: classes.topToolbar }) }, props),\r\n React.createElement(ApplicationEditView, { userContext: userContext })));\r\n};\r\n//# sourceMappingURL=ApplicationEdit.js.map","import { ApplicationList } from './ApplicationList';\r\nimport { ApplicationShow } from './ApplicationShow';\r\nimport { ApplicationCreate } from './ApplicationCreate';\r\nimport { ApplicationEdit } from './ApplicationEdit';\r\nimport { IconApps } from '../ui/icons';\r\nexport const applications = {\r\n icon: IconApps,\r\n list: ApplicationList,\r\n show: ApplicationShow,\r\n create: ApplicationCreate,\r\n edit: ApplicationEdit,\r\n};\r\nexport * from './ApiSelector';\r\nexport * from './ApplicationList';\r\nexport * from './ApplicationShow';\r\nexport * from './ApplicationCard';\r\nexport * from './ApplicationDetailsOverviewEditor';\r\nexport * from './ApplicationDetailsOverviewField';\r\nexport * from './ApplicationKeyClient';\r\nexport * from './ApplicationKeySecret';\r\nexport * from './ApplicationStatus';\r\nexport * from './isApplicationPending';\r\nexport * from './ApplicationCreate';\r\nexport * from './ApplicationEdit';\r\n//# sourceMappingURL=index.js.map","var CurrentUserKey = '@mock/currentUser';\r\nexport function setCurrentUser(user) {\r\n return localStorage.setItem(CurrentUserKey, JSON.stringify(user));\r\n}\r\nexport function deleteCurrentUser() {\r\n localStorage.removeItem(CurrentUserKey);\r\n}\r\nexport function getCurrentUser() {\r\n var str = localStorage.getItem(CurrentUserKey);\r\n if (str) {\r\n return JSON.parse(str);\r\n }\r\n return null;\r\n}\r\n","var __spreadArrays = (this && this.__spreadArrays) || function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\nexport function promisify(func) {\r\n var params = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n params[_i - 1] = arguments[_i];\r\n }\r\n return new Promise(function (resolve, reject) {\r\n func.apply(void 0, __spreadArrays(params, [resolve, reject]));\r\n });\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport { Response } from 'miragejs';\r\nimport { deleteCurrentUser, getCurrentUser, setCurrentUser, } from './currentUser';\r\nimport { promisify } from '../promisify';\r\nvar PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgVL6G4zaK+ngqrBheIqP1HcqZIdT8cyHJhvZ9rqOSRdemmvMTFsBoJScPAQQl/jlb7VVVvkGdkvSompszpHaIMQxWG6QuBF23v72nu5NmpYDBsyHZHgIROzqdzqycfKhvWrdDFfq17eZmarsNzvc4KVF3CVv+aM4aXmLPXCIMhrq6M+MYcwMYMS5G6JEYXQtvpw5GQHDm6nfTHNds3wBzooakaOMIldae56jRnX+ILeb+yPWmjsPPwbaOjU2cbygNKMHBfnLEFRz05J2XcGh/DGm4x0s12jnPNiH8hkHd8U8bviwvLlreNBM1XCThL0V07HCETzUPQOhpLtplUh7RwIDAQAB';\r\nexport function login(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, username, password, users, user;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = JSON.parse(request.requestBody), username = _a.username, password = _a.password;\r\n return [4 /*yield*/, promisify(database.userContexts.find().fetch)];\r\n case 1:\r\n users = _b.sent();\r\n user = users.find(function (u) { return u.userContexts[0].userDetails.username === username; });\r\n if (!user || password !== 'Password@1') {\r\n return [2 /*return*/, new Response(401, {}, {\r\n respCode: '401',\r\n respMsg: \"Authentication failed for user '\" + username + \"'\",\r\n provider: '',\r\n referrer: '',\r\n })];\r\n }\r\n setCurrentUser(user);\r\n return [2 /*return*/, {\r\n respCode: '200',\r\n respMsg: 'Successfully authenticated user',\r\n provider: '',\r\n referrer: '',\r\n dashboardPath: '',\r\n gateaugauge: 'mocked-token',\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getPublicKey(database) {\r\n return function (schema, request) {\r\n return {\r\n respCode: 200,\r\n respMsg: 'Successfully fetched public key',\r\n publicKey: PUBLIC_KEY,\r\n };\r\n };\r\n}\r\nexport function resetPassword(database) {\r\n return function (schema, request) {\r\n return {\r\n status: 200,\r\n };\r\n };\r\n}\r\nexport function checkUserNameIsUnique(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var username, users, usersWithSameUsernameExist;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n username = request.queryParams.Name;\r\n return [4 /*yield*/, promisify(database.userContexts.find().fetch)];\r\n case 1:\r\n users = _a.sent();\r\n usersWithSameUsernameExist = users.some(function (u) { return u.userContexts[0].userDetails.username === username; });\r\n if (usersWithSameUsernameExist) {\r\n return [2 /*return*/, new Response(401, {}, { errors: ['should be unique'] })];\r\n }\r\n return [2 /*return*/, {\r\n status: 200,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function passwordResetTokenValidate(database) {\r\n return function (schema, request) {\r\n var token = request.queryParams.token;\r\n if (!['Mithrandir', 'Saruman'].includes(token)) {\r\n return new Response(401, {}, { errors: ['Token Invalid'] });\r\n }\r\n return {\r\n status: 200,\r\n };\r\n };\r\n}\r\nexport function updateMyPassword(database) {\r\n return function (schema, request) {\r\n var _a = JSON.parse(request.requestBody), uuid = _a.uuid, newPassword = _a.newPassword;\r\n if (\r\n // The password is encrypted, so we rely on the token to return an error\r\n uuid === 'Saruman') {\r\n return new Response(400, {}, {\r\n error: {\r\n code: 'ValidationException',\r\n detail: {\r\n devErrorMessage: 'Invalid new password',\r\n errorCode: '4755',\r\n userErrorKey: 'error.validation.password.sameExistingPassword',\r\n userErrorMessage: 'New password cannot be same as previous passwords.',\r\n validationErrors: [\r\n {\r\n error: 'Validation Error : New password cannot be same as previous passwords.',\r\n field: 'Password',\r\n key: 'error.validation.password.sameExistingPassword',\r\n },\r\n ],\r\n },\r\n message: {\r\n lang: 'en',\r\n value: 'New password cannot be same as previous passwords.',\r\n },\r\n },\r\n });\r\n }\r\n else {\r\n return { status: 200 };\r\n }\r\n };\r\n}\r\nexport function logout(database) {\r\n return function (schema, request) {\r\n deleteCurrentUser();\r\n return {\r\n status: 200,\r\n };\r\n };\r\n}\r\nexport function getAccountSetup(database) {\r\n return function (schema, request) {\r\n var token = request.queryParams.token;\r\n if (token === 'IamLordVoldemort') {\r\n return {\r\n email: 'tom@deathlyhallows.com',\r\n firstName: 'Tom Marvolo',\r\n lastName: 'Riddle',\r\n };\r\n }\r\n return new Response(401, {}, { errors: ['token not valid'] });\r\n };\r\n}\r\nexport function putAccountSetup(database) {\r\n return function (schema, request) {\r\n var token = request.queryParams.token;\r\n if (token === 'IamLordVoldemort') {\r\n return {};\r\n }\r\n return new Response(401, {}, { errors: ['token not valid'] });\r\n };\r\n}\r\nexport function getUserContexts(database) {\r\n return function (schema, request) {\r\n var currentUser = getCurrentUser();\r\n if (currentUser) {\r\n return currentUser;\r\n }\r\n return new Response(401, {}, {\r\n errors: ['User not authenticated'],\r\n });\r\n };\r\n}\r\nexport function getCmsSettings(database) {\r\n return function (schema, request) {\r\n return {\r\n REGISTRATION_STATUS: 'ENABLED',\r\n REGISTRATION_REQUEST_WORKFLOW: 'ENABLED',\r\n SSO_ENABLED: 'true',\r\n REGISTRATION_TERMS_OF_USE: \"\\nBy clicking \\\"I Accept the Terms and Conditions\\\" you, on behalf of your employer or contracted entity, agree that your use and access to the CA API Management SaaS Portal Application Programmable Interface (\\\"PAPI\\\") will be subject to and governed by this CA API Policy (the \\\"Policy\\\"). You must be authorized to use the CA API Management SaaS Portal by CA or an authorized CA Partner. If you do not, or cannot agree to the Policy, you must not use or access the PAPI. Your continued use of the PAPI constitutes acceptance of any changes to the Policy. Under the Policy, \\\"CA\\\", \\\"we\\\" or \\\"us\\\" means CA Inc., with offices located at 520 Madison Avenue, New York, NY 10022, and its subsidiaries and affiliates.\\n\\nI. CA makes the PAPI available to provide programmatic access to CA's API Management SaaS Solution. CA reserves the right to discontinue, change, or version the PAPI at any time, in its sole discretion, and makes no guarantees or warranties that the software, scripts or programmatic routines will continue to operate following any changes. CA shall have no liability to you or any third party any downtime, changes or withdrawal of the PAPI. Where possible, we will take commercially reasonable efforts to provide you advanced notice of any changes. CA retains all rights in and to its intellectual property, including but not limited to, the PAPI, software, tools, data materials, information and derivatives or modifications thereof. CA reserves all rights not expressly granted in this Policy.\\n\\nII. In order to access the PAPI you may be required to provide certain information, you agree that all information is current and accurate. You agree to inform CA of any changes. You may only access and use the PAPI in accordance with the technical documentation supplied by CA. CA may set limits and restrictions around acceptable use of the PAPI. You agree that you will not attempt to disable or circumvent these limitations.\\n\\nIII. You agree that you will not:\\na) Sublicense the PAPI to any third party. You further agree that you will not create an API that functions in a substantially similar way to the PAPI and offer it for use to third parties.\\nb) Perform or take any actions that will introduce any viruses, worms, defects, Trojan horses, malware or have the effect of disabling, interfering, disrupting or impairing the CA product or services.\\nc) Except where prohibited by law, reverse engineer or decompile any source code through the PAPI or any related CA product or service.\\nd) Use the PAPI to process or store any sensitive, personal or confidential information.\\ne) Use the PAPI, directly or indirectly, to benchmark or create a product or service that is substantially similar to the CA API Management SaaS Portal.\\nf) Remove, alter or obscure any CA marks.\\ng) Do the following with the PAPI content:\\na. Change, alter or misrepresent directly or indirectly the source or ownership in any way\\nb. Copy, translate, modify, create derivative works, publicly display or sublicense to any third party.\\nc. Perform any mechanism to keep permanent copies of content or keep content longer than permitted in the cache header.\\n\\nIV. EXCEPT AS EXPRESSLY STATED HEREIN, CA DOES NOT MAKE ANY REPRESENTATIONS OR WARRANTIES ABOUT THE PAPI. SPECIFICALLY, ITS FUNCTIONALITY, RELIABILITY, AVAILABILITY OR ABILITY TO MEET YOUR SPECIFIC NEEDS OR REQUIREMENTS. THE PAPI IS PROVIDED ON AN \\\"AS-IS\\\" BASIS. EXCEPT WHERE PROHIBITED BY LAW, CA DISCLAIMS THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. CA, ITS SUPPLIERS, DISTRIBUTORS AND LICENSORS, WILL NOT BE RESPONSIBLE FOR LOST PROFITS, REVENUES OR DATA; OR INDIRECT, SPECIAL, CONSEQUENTIAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF ADVISED IN ADVANCE OF THE POSSIBLE OF SUCH DAMAGES. TO THE EXTENT PERMITTED BY LAW, THE TOTAL LIABILITY OF CA, ITS SUPPLIERS AND DISTRIBUTORS, FOR ANY CLAIM ARISING FROM OR RELATED TO THE POLICY IS LIMITED TO 100.00 USD.\\n\\nV. You may discontinue using the PAPI at any time. In the event of termination or expiration by you or CA, Sections III, IV and VI will survive.\\n\\nVI. The governing law and venue for any disputes or claims arising out of or related to the PAPI will be governed by the terms of your agreement with CA for use of the CA API Management SaaS Portal.\",\r\n };\r\n };\r\n}\r\nexport function getAuthSchemes(database) {\r\n return function (schema, request) {\r\n return {\r\n isOktaProxied: false,\r\n respCode: 200,\r\n respMsg: 'Successfully fetched Authentication Schemes',\r\n publicKey: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj1h7QmwcUR8qW4GtcilTxMmrr/6LYyUuHeBFfeIenZ7aodWOnzDqTl9iAVEOmldcR9QZKq2uzwXyEeiCxnNFf9QK5IFbdF3J1QUteuEhdE1xMQJVn4rjksORpggGGm2HxcrBQFHbeJhmUeNIGEQ+t4Lt+vPzB/6QLwKXppQKK9cgd8cPckVmdQ73g3/LpRDm+VymGkFmTn26ModOJMk0IKJ/8SE5kAPPK8Tmikqj4/TdCxO/JEkgW+JjgigCzmupip+8EZjJT7aYEBYzq9XuQ+008p1/U3dVpR6ngwHYLMBCSufPaP6OuIVvA/VyP8iKqzD6vf1CJ0CBctzEY7bpDQIDAQAB',\r\n authSchemes: [\r\n {\r\n authMethod: 'DEFAULT',\r\n credsReqd: true,\r\n defaultConfig: true,\r\n description: '',\r\n links: [],\r\n name: 'CA Technologies Developer Network',\r\n showFyp: true,\r\n tenantId: 'apim',\r\n url: 'https://apim.dev.ca.com/admin/login',\r\n uuid: 'f71b8cbc-6b45-4ecc-af9b-a64a98ea317a',\r\n },\r\n {\r\n advancedConfigurations: { enhancedPasswordSecurity: 'no' },\r\n credsReqd: true,\r\n defaultConfig: false,\r\n description: 'OpenLDAP docker container running on this server',\r\n links: [],\r\n name: 'extuidev OpenLDAP',\r\n showFyp: false,\r\n tenantId: 'apim',\r\n url: 'https://apim.dev.ca.com?provider=b5d2c613-67b1-413f-a661-a862d1f0bc0e',\r\n uuid: 'b5d2c613-67b1-413f-a661-a862d1f0bc0e',\r\n },\r\n {\r\n advancedConfigurations: { enhancedPasswordSecurity: 'yes' },\r\n credsReqd: true,\r\n defaultConfig: false,\r\n description: 'LDAP docker container running on this server',\r\n links: [],\r\n name: 'extuidev LDAP',\r\n showFyp: false,\r\n tenantId: 'apim',\r\n url: 'https://apim.dev.ca.com?provider=c5d2c613-67b1-413f-a661-a862d1f0bc0e',\r\n uuid: 'c5d2c613-67b1-413f-a661-a862d1f0bc0e',\r\n },\r\n {\r\n credsReqd: false,\r\n defaultConfig: false,\r\n description: 'saml test',\r\n links: [],\r\n name: 'saml',\r\n showFyp: false,\r\n tenantId: 'bugbashovatssg01gcp-apim-bugbash',\r\n url: 'https://bugbashovatssg01gcp-apim-bugbash.app.gdue4.saasdev.broadcom.com/api/bugbashovatssg01gcp-apim-bugbash/authenticate/saml/request/e97ef478-70b4-45a8-8a68-444a6140c812',\r\n uuid: 'e97ef478-70b4-45a8-8a68-444a6140c812',\r\n },\r\n ],\r\n };\r\n };\r\n}\r\nvar generateMaxLengthValidationError = function (key, name, value, maxLength) {\r\n var _a;\r\n return value && value.length > maxLength\r\n ? (_a = {},\r\n _a[key] = {\r\n code: 410,\r\n devMessage: \"Maximum allowed length for \" + name + \" of \" + maxLength + \" characters has been exceeded\",\r\n messageKey: 'error.validation.length.max',\r\n localizedMessage: \"Field \" + name + \" exceeds the maximum length of \" + maxLength + \".\",\r\n parameters: [name, maxLength],\r\n },\r\n _a) : {};\r\n};\r\nexport function putUserContexts(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, firstName, lastName, email, username, currentUser, validationErrors, users, user;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = JSON.parse(request.requestBody), firstName = _a.firstName, lastName = _a.lastName, email = _a.email, username = _a.username;\r\n currentUser = getCurrentUser();\r\n validationErrors = __assign(__assign(__assign({}, generateMaxLengthValidationError('FirstName', 'FIRST_NAME', firstName, 60)), generateMaxLengthValidationError('LastName', 'LAST_NAME', lastName, 60)), generateMaxLengthValidationError('Email', 'EMAIL', email, 256));\r\n return [4 /*yield*/, promisify(database.userContexts.find().fetch)];\r\n case 1:\r\n users = _b.sent();\r\n user = users.find(function (u) {\r\n return u.userContexts[0].userDetails.username ===\r\n currentUser.userContexts[0].userDetails.username;\r\n });\r\n user.userContexts[0].userDetails.firstName =\r\n firstName || user.userContexts[0].userDetails.firstName;\r\n user.userContexts[0].userDetails.lastName =\r\n lastName || user.userContexts[0].userDetails.lastName;\r\n user.userContexts[0].userDetails.email =\r\n email || user.userContexts[0].userDetails.email;\r\n return [4 /*yield*/, promisify(database.userContexts.upsert.bind(database.userContexts), user)];\r\n case 2:\r\n _b.sent();\r\n setCurrentUser(user);\r\n if (Object.keys(validationErrors).length > 0) {\r\n return [2 /*return*/, new Response(400, {}, {\r\n httpStatusCode: 400,\r\n errorCode: 483,\r\n devErrorMessage: 'The request could not be completed due to data input errors.',\r\n userErrorMessage: 'The request could not be completed due to data input errors.',\r\n locale: 'en',\r\n userErrorKey: 'error.validation.entity',\r\n validationErrors: validationErrors,\r\n })];\r\n }\r\n return [2 /*return*/, {\r\n status: 200,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getPasswordPolicy() {\r\n return function (schema, request) {\r\n return {\r\n respCode: 200,\r\n respMsg: 'Successfully fetched Password Policies',\r\n authScheme: {\r\n links: [],\r\n passwordPolicies: {\r\n regexConfig: {\r\n UPPERCASE: {\r\n value: 1,\r\n enabled: true,\r\n },\r\n NUMBER: {\r\n value: 1,\r\n enabled: true,\r\n },\r\n MAXIMUM_LENGTH: {\r\n value: 60,\r\n enabled: true,\r\n },\r\n MINIMUM_LENGTH: {\r\n value: 8,\r\n enabled: true,\r\n },\r\n REGEX: {\r\n value: '^(?=(.*[A-Z]){1})(?=(.*[a-z]){1})(?=(.*[0-9]){1})(?=(.*[!@#$%^&*-]){1})[ A-Za-z0-9!@#$%^&*-]{8,60}$',\r\n enabled: true,\r\n },\r\n SUPPORTED_SYMBOLS: {\r\n value: '!@#$%^&*-',\r\n enabled: true,\r\n },\r\n SYMBOL: {\r\n value: 1,\r\n enabled: true,\r\n },\r\n LOWERCASE: {\r\n value: 1,\r\n enabled: true,\r\n },\r\n },\r\n passwordConfig: {\r\n PASSWORD_HISTORY: {\r\n value: 5,\r\n enabled: false,\r\n },\r\n PASSWORD_EXPIRY: {\r\n value: 60,\r\n enabled: false,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport { Response } from 'miragejs';\r\nimport { getCurrentUser, setCurrentUser } from './currentUser';\r\nimport { promisify } from '../promisify';\r\nexport function getUserProfile(database) {\r\n return function (schema, request) {\r\n var userContexts = getCurrentUser().userContexts;\r\n var userDetails = userContexts[0].userDetails;\r\n var uuid = userDetails.uuid, firstName = userDetails.firstName, lastName = userDetails.lastName, email = userDetails.email, userName = userDetails.username;\r\n return new Response(200, {}, {\r\n uuid: uuid,\r\n firstName: firstName,\r\n lastName: lastName,\r\n email: email,\r\n userName: userName,\r\n });\r\n };\r\n}\r\nexport function putUserProfile(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, firstName, lastName, email, currentUser, users, user;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = JSON.parse(request.requestBody), firstName = _a.firstName, lastName = _a.lastName, email = _a.email;\r\n currentUser = getCurrentUser();\r\n return [4 /*yield*/, promisify(database.userContexts.find().fetch)];\r\n case 1:\r\n users = _b.sent();\r\n user = users.find(function (u) {\r\n return u.userContexts[0].userDetails.username ===\r\n currentUser.userContexts[0].userDetails.username;\r\n });\r\n user.userContexts[0].userDetails.firstName =\r\n firstName || user.userContexts[0].userDetails.firstName;\r\n user.userContexts[0].userDetails.lastName =\r\n lastName || user.userContexts[0].userDetails.lastName;\r\n user.userContexts[0].userDetails.email =\r\n email || user.userContexts[0].userDetails.email;\r\n return [4 /*yield*/, promisify(database.userContexts.upsert.bind(database.userContexts), user)];\r\n case 2:\r\n _b.sent();\r\n setCurrentUser(user);\r\n return [2 /*return*/, {\r\n status: 200,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { promisify } from '../promisify';\r\nimport specs from '../specs.json';\r\nimport { getCurrentUser } from './currentUser';\r\nvar SearchFields = ['name', 'description'];\r\nexport function listApis(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, page, size, order, sort, filter, finalPage, finalSize, _b, finalSort, finalOrder, finalFilters, otherFilters, totalElements, results;\r\n var _c;\r\n return __generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n _a = request.queryParams, page = _a.page, size = _a.size, order = _a.order, sort = _a.sort, filter = __rest(_a, [\"page\", \"size\", \"order\", \"sort\"]);\r\n finalPage = parseInt(page, 10);\r\n finalSize = parseInt(size, 10);\r\n _b = sort ? sort.split(',') : [], finalSort = _b[0], finalOrder = _b[1];\r\n finalFilters = filter;\r\n if (Object.keys(filter).some(function (key) { return SearchFields.includes(key); })) {\r\n otherFilters = Object.keys(filter).filter(function (key) { return !SearchFields.includes(key); });\r\n finalFilters = otherFilters.reduce(function (acc, key) {\r\n var _a;\r\n return (__assign(__assign({}, acc), (_a = {}, _a[key] = filter[key], _a)));\r\n }, {\r\n $or: SearchFields.map(function (field) {\r\n var _a;\r\n return (_a = {},\r\n _a[field] = {\r\n $regex: \".*\" + filter[field] + \".*\",\r\n $options: 'ig',\r\n },\r\n _a);\r\n }),\r\n });\r\n }\r\n return [4 /*yield*/, promisify(database.apis.find(finalFilters).fetch)];\r\n case 1:\r\n totalElements = (_d.sent()).length;\r\n return [4 /*yield*/, promisify(database.apis.find(finalFilters, {\r\n limit: finalSize,\r\n skip: finalSize * finalPage,\r\n sort: (_c = {},\r\n _c[finalSort] = (finalOrder === null || finalOrder === void 0 ? void 0 : finalOrder.toLowerCase()) === 'asc' ? 1 : -1,\r\n _c),\r\n }).fetch)];\r\n case 2:\r\n results = _d.sent();\r\n return [2 /*return*/, {\r\n results: results,\r\n totalElements: totalElements,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApi(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, ssgServiceType, api;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apis.findOne.bind(database.apis), { uuid: request.params.id }, {})];\r\n case 1:\r\n _a = _b.sent(), ssgServiceType = _a.ssgServiceType, api = __rest(_a, [\"ssgServiceType\"]);\r\n return [2 /*return*/, __assign(__assign({}, api), { apiServiceType: ssgServiceType })];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function listApiPermissions(database) {\r\n return function (schema, request) {\r\n var user = getCurrentUser();\r\n var _a = user.userContexts[0].userDetails, apiOwner = _a.apiOwner, orgPublisher = _a.orgPublisher, portalAdmin = _a.portalAdmin;\r\n var hasRights = apiOwner || orgPublisher || portalAdmin;\r\n return {\r\n id: request.params.id,\r\n canEdit: hasRights,\r\n canDelete: hasRights,\r\n };\r\n };\r\n}\r\nexport function getApiSpecContent(database) {\r\n return function (schema, request) {\r\n return specs;\r\n };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { promisify } from '../promisify';\r\nimport { Response } from 'miragejs';\r\nvar UuidRegexp = /Eulas\\('(.*)'\\)/;\r\nvar SearchFields = ['name', 'description'];\r\nexport function listApiGroups(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, page, size, order, sort, filter, finalPage, finalSize, _b, finalSort, finalOrder, finalFilters, otherFilters, totalElements, results;\r\n var _c;\r\n return __generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n _a = request.queryParams, page = _a.page, size = _a.size, order = _a.order, sort = _a.sort, filter = __rest(_a, [\"page\", \"size\", \"order\", \"sort\"]);\r\n finalPage = parseInt(page, 10);\r\n finalSize = parseInt(size, 10);\r\n _b = sort ? sort.split(',') : [], finalSort = _b[0], finalOrder = _b[1];\r\n finalFilters = filter;\r\n if (Object.keys(filter).some(function (key) { return SearchFields.includes(key); })) {\r\n otherFilters = Object.keys(filter).filter(function (key) { return !SearchFields.includes(key); });\r\n finalFilters = otherFilters.reduce(function (acc, key) {\r\n var _a;\r\n return (__assign(__assign({}, acc), (_a = {}, _a[key] = filter[key], _a)));\r\n }, {\r\n $or: SearchFields.map(function (field) {\r\n var _a;\r\n return (_a = {},\r\n _a[field] = {\r\n $regex: \".*\" + filter[field] + \".*\",\r\n $options: 'ig',\r\n },\r\n _a);\r\n }),\r\n });\r\n }\r\n return [4 /*yield*/, promisify(database.apiGroups.find(finalFilters).fetch)];\r\n case 1:\r\n totalElements = (_d.sent()).length;\r\n return [4 /*yield*/, promisify(database.apiGroups.find(finalFilters, {\r\n limit: finalSize,\r\n skip: finalSize * finalPage,\r\n sort: (_c = {},\r\n _c[finalSort] = (finalOrder === null || finalOrder === void 0 ? void 0 : finalOrder.toLowerCase()) === 'asc' ? 1 : -1,\r\n _c),\r\n }).fetch)];\r\n case 2:\r\n results = _d.sent();\r\n return [2 /*return*/, {\r\n results: results,\r\n totalElements: totalElements,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiGroup(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var apiGroup;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apiGroups.findOne.bind(database.apiGroups), { uuid: request.params.id }, {})];\r\n case 1:\r\n apiGroup = _a.sent();\r\n return [2 /*return*/, apiGroup];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiGroupApis(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var apiGroup;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apiGroups.findOne.bind(database.apiGroups), { uuid: request.params.id }, {})];\r\n case 1:\r\n apiGroup = _a.sent();\r\n return [2 /*return*/, apiGroup.apis.map(function (_a) {\r\n var uuid = _a.uuid;\r\n return ({ uuid: uuid });\r\n })];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiGroupEula(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var matches, Uuid, eula;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n matches = UuidRegexp.exec(request.params.path);\r\n if (!(matches && matches.length > 1)) return [3 /*break*/, 2];\r\n Uuid = matches[1];\r\n return [4 /*yield*/, promisify(database.apiEulas.findOne.bind(database.apiEulas), { Uuid: Uuid })];\r\n case 1:\r\n eula = _a.sent();\r\n if (eula) {\r\n return [2 /*return*/, eula];\r\n }\r\n _a.label = 2;\r\n case 2: return [2 /*return*/, new Response(404)];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { promisify } from '../promisify';\r\nimport { Response } from 'miragejs';\r\nimport faker from 'faker';\r\nexport function listApiPlans(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var totalElements;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apiPlans.find().fetch)];\r\n case 1:\r\n totalElements = (_a.sent())\r\n .length;\r\n return [4 /*yield*/, promisify(database.apiPlans.find().fetch)];\r\n case 2: return [2 /*return*/, _a.sent()];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiPlan(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, apis, apiPlan;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apiPlans.findOne.bind(database.apiPlans), { uuid: request.params.id }, {})];\r\n case 1:\r\n _a = _b.sent(), apis = _a.apis, apiPlan = __rest(_a, [\"apis\"]);\r\n return [2 /*return*/, apiPlan];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiPlanApis(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var apiPlan;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apiPlans.findOne.bind(database.apiPlans), { uuid: request.params.id }, {})];\r\n case 1:\r\n apiPlan = _a.sent();\r\n return [2 /*return*/, apiPlan.apis.map(function (_a) {\r\n var uuid = _a.uuid;\r\n return ({ uuid: uuid });\r\n })];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiApiPlanAssociation(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var apiPlan, hasAssociation;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apiPlans.findOne.bind(database.apiPlans), { uuid: request.params.api_plan_id }, {})];\r\n case 1:\r\n apiPlan = _a.sent();\r\n hasAssociation = !!apiPlan.apis.find(function (api) { return request.params.api_id === api; });\r\n if (hasAssociation) {\r\n return [2 /*return*/, '0'];\r\n }\r\n else {\r\n return [2 /*return*/, new Response(404, {}, {\r\n error: {\r\n code: '404',\r\n message: {\r\n lang: 'en-US',\r\n value: 'association not found',\r\n },\r\n },\r\n })];\r\n }\r\n return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApiPlansFeatureFlag(database) {\r\n return {\r\n CreateTs: 0,\r\n Uuid: faker.random.uuid(),\r\n CreatedBy: 'SYSTEM',\r\n ModifyTs: 0,\r\n Value: true,\r\n Name: 'FEATURE_FLAG_API_PLANS',\r\n };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { promisify } from '../promisify';\r\nexport function listAccountPlans(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, page, size, order, sort, apiUuid, $select, filter, finalPage, finalSize, _b, finalSort, finalOrder, totalElements, results;\r\n var _c;\r\n var _d;\r\n return __generator(this, function (_e) {\r\n switch (_e.label) {\r\n case 0:\r\n _a = request.queryParams, page = _a.page, size = _a.size, order = _a.order, sort = _a.sort, apiUuid = _a.apiUuid, $select = _a.$select, filter = __rest(_a, [\"page\", \"size\", \"order\", \"sort\", \"apiUuid\", \"$select\"]);\r\n finalPage = parseInt(request.queryParams.page, 10);\r\n finalSize = parseInt(request.queryParams.size, 10);\r\n _b = (_d = request.queryParams.sort) === null || _d === void 0 ? void 0 : _d.split(','), finalSort = _b[0], finalOrder = _b[1];\r\n return [4 /*yield*/, promisify(database.accountPlans.find(filter).fetch)];\r\n case 1:\r\n totalElements = (_e.sent()).length;\r\n return [4 /*yield*/, promisify(database.accountPlans.find(filter, {\r\n limit: finalSize,\r\n skip: finalSize * finalPage,\r\n sort: (_c = {},\r\n _c[finalSort] = (finalOrder === null || finalOrder === void 0 ? void 0 : finalOrder.toLowerCase()) === 'asc' ? 1 : -1,\r\n _c),\r\n }).fetch)];\r\n case 2:\r\n results = _e.sent();\r\n return [2 /*return*/, {\r\n results: results,\r\n totalElements: totalElements,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getAccountPlan(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.accountPlans.findOne.bind(database.accountPlans), {\r\n uuid: request.params.id,\r\n }, {})];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { promisify } from '../promisify';\r\nimport faker from 'faker';\r\nexport function listApplications(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, page, size, order, sort, apiUuid, name, $select, filter, finalPage, finalSize, _b, finalSort, finalOrder, finalFilter, totalElements, results, applications;\r\n var _c;\r\n var _d;\r\n return __generator(this, function (_e) {\r\n switch (_e.label) {\r\n case 0:\r\n _a = request.queryParams, page = _a.page, size = _a.size, order = _a.order, sort = _a.sort, apiUuid = _a.apiUuid, name = _a.name, $select = _a.$select, filter = __rest(_a, [\"page\", \"size\", \"order\", \"sort\", \"apiUuid\", \"name\", \"$select\"]);\r\n finalPage = parseInt(request.queryParams.page, 10);\r\n finalSize = parseInt(request.queryParams.size, 10);\r\n _b = (_d = request.queryParams.sort) === null || _d === void 0 ? void 0 : _d.split(','), finalSort = _b[0], finalOrder = _b[1];\r\n finalFilter = __assign({}, filter);\r\n if (apiUuid) {\r\n finalFilter._accessibleApis = apiUuid;\r\n }\r\n return [4 /*yield*/, promisify(database.applications.find(finalFilter).fetch)];\r\n case 1:\r\n totalElements = (_e.sent()).length;\r\n return [4 /*yield*/, promisify(database.applications.find(finalFilter, {\r\n limit: finalSize,\r\n skip: finalSize * finalPage,\r\n sort: (_c = {},\r\n _c[finalSort] = (finalOrder === null || finalOrder === void 0 ? void 0 : finalOrder.toLowerCase()) === 'asc' ? 1 : -1,\r\n _c),\r\n }).fetch)];\r\n case 2:\r\n results = _e.sent();\r\n applications = results.map(function (r) {\r\n var result = {};\r\n var keys = Object.keys(r);\r\n keys.map(function (k) {\r\n result[k.toLowerCase()] = r[k];\r\n });\r\n return result;\r\n });\r\n return [2 /*return*/, {\r\n results: applications,\r\n totalElements: totalElements,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getApplication(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var application, keys;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.applications.findOne.bind(database.applications), { uuid: request.params.uuid }, {})];\r\n case 1:\r\n application = _a.sent();\r\n keys = Object.keys(application);\r\n keys.map(function (k) {\r\n application[\"\" + k[0].toUpperCase() + k.slice(1)] = application[k];\r\n });\r\n return [2 /*return*/, application];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getGenerateSharedSecret(database) {\r\n return function (schema, request) {\r\n return {\r\n d: {\r\n result: faker.random.alphaNumeric(32),\r\n },\r\n };\r\n // To test Error Scenario\r\n // return new Response(405, undefined, {\r\n // error : {\r\n // code : \"MethodNotAllowedException\",\r\n // message : {\r\n // lang : \"en-US\",\r\n // value : \"Method Not Allowed\"\r\n // }\r\n // }\r\n // });\r\n };\r\n}\r\nexport function getSecretHashMetadata(database) {\r\n return {\r\n Uuid: faker.random.uuid(),\r\n Name: 'APP_SECRET_HASHING_METADATA',\r\n Value: '{\"algorithm\":\"SHA-512\",\"plaintextAllowed\":true}',\r\n };\r\n}\r\nexport function postApplication(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var uuid, application;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n uuid = faker.random.uuid();\r\n application = __assign(__assign({}, JSON.parse(request.requestBody)), { Uuid: uuid, uuid: uuid, id: uuid, status: 'Enabled', Status: 'Enabled' });\r\n return [4 /*yield*/, promisify(database.applications.upsert.bind(database.applications), __assign({}, application))];\r\n case 1:\r\n _a.sent();\r\n return [2 /*return*/, application];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function deleteApplication(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var uuid, application;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n uuid = request.params.uuid;\r\n return [4 /*yield*/, promisify(database.applications.findOne.bind(database.applications), { uuid: uuid }, {})];\r\n case 1:\r\n application = _a.sent();\r\n return [4 /*yield*/, promisify(database.applications.remove.bind(database.applications), application._id)];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/, application];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { promisify } from '../promisify';\r\nexport function listApiKeys(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, page, size, order, sort, name, $select, filter, finalPage, finalSize, _b, finalSort, finalOrder, finalFilter, totalElements, results;\r\n var _c;\r\n var _d;\r\n return __generator(this, function (_e) {\r\n switch (_e.label) {\r\n case 0:\r\n _a = request.queryParams, page = _a.page, size = _a.size, order = _a.order, sort = _a.sort, name = _a.name, $select = _a.$select, filter = __rest(_a, [\"page\", \"size\", \"order\", \"sort\", \"name\", \"$select\"]);\r\n finalPage = parseInt(request.queryParams.page, 10);\r\n finalSize = parseInt(request.queryParams.size, 10);\r\n _b = ((_d = request.queryParams.sort) === null || _d === void 0 ? void 0 : _d.split(',')) || [], finalSort = _b[0], finalOrder = _b[1];\r\n finalFilter = __assign({}, filter);\r\n return [4 /*yield*/, promisify(database.apiKeys.find(finalFilter).fetch)];\r\n case 1:\r\n totalElements = (_e.sent()).length;\r\n return [4 /*yield*/, promisify(database.apiKeys.find(finalFilter, {\r\n limit: finalSize,\r\n skip: finalSize * finalPage,\r\n sort: (_c = {},\r\n _c[finalSort] = (finalOrder === null || finalOrder === void 0 ? void 0 : finalOrder.toLowerCase()) === 'asc' ? 1 : -1,\r\n _c),\r\n }).fetch)];\r\n case 2:\r\n results = _e.sent();\r\n return [2 /*return*/, {\r\n results: results,\r\n totalElements: totalElements,\r\n }];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport faker from 'faker';\r\nimport { promisify } from '../promisify';\r\nexport function listOrganizations(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.organizations.find().fetch)];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getOrganization(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var uuid, organization;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n uuid = request.params.uuid;\r\n return [4 /*yield*/, promisify(database.organizations.findOne.bind(database.organizations), {\r\n uuid: uuid,\r\n })];\r\n case 1:\r\n organization = _a.sent();\r\n if (!organization) {\r\n return [2 /*return*/, new Response(404)];\r\n }\r\n return [2 /*return*/, organization];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function postOrganization(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var organization;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n organization = JSON.parse(request.requestBody);\r\n return [4 /*yield*/, promisify(database.organizations.upsert.bind(database.organizations), __assign(__assign({}, organization), { uuid: faker.random.uuid() }))];\r\n case 1:\r\n _a.sent();\r\n return [2 /*return*/, request.requestBody];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function putOrganization(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var organization;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n organization = JSON.parse(request.requestBody);\r\n return [4 /*yield*/, promisify(database.organizations.upsert.bind(database.organizations), __assign({}, organization))];\r\n case 1:\r\n _a.sent();\r\n return [2 /*return*/, request.requestBody];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function deleteOrganization(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var uuid, organization;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n uuid = request.params.uuid;\r\n return [4 /*yield*/, promisify(database.organizations.findOne.bind(database.organizations), {\r\n uuid: uuid,\r\n })];\r\n case 1:\r\n organization = _a.sent();\r\n return [4 /*yield*/, promisify(database.organizations.remove.bind(database.organizations), organization._id)];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/, organization];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport faker from 'faker';\r\nimport { promisify } from '../promisify';\r\nexport function postDocument(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var document;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n document = JSON.parse(request.requestBody);\r\n return [4 /*yield*/, promisify(database.documents.upsert.bind(database.documents), __assign(__assign({}, document), { uuid: faker.random.uuid(), typeUuid: request.params.typeUuid }))];\r\n case 1:\r\n _a.sent();\r\n return [2 /*return*/, request.requestBody];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function putDocument(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var document;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n document = JSON.parse(request.requestBody);\r\n return [4 /*yield*/, promisify(database.documents.upsert.bind(database.documents), __assign(__assign({}, document), { typeUuid: request.params.typeUuid }))];\r\n case 1:\r\n _a.sent();\r\n return [2 /*return*/, request.requestBody];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getDocumentsTree(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, type, typeUuid, locale, documents;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = request.params, type = _a.type, typeUuid = _a.typeUuid;\r\n locale = request.queryParams.locale;\r\n return [4 /*yield*/, promisify(database.documents.find({\r\n type: type,\r\n typeUuid: typeUuid,\r\n locale: locale,\r\n }).fetch)];\r\n case 1:\r\n documents = _b.sent();\r\n return [2 /*return*/, documents.map(function (_a) {\r\n var markdown = _a.markdown, doc = __rest(_a, [\"markdown\"]);\r\n return doc;\r\n })];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function putDocumentsTree(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, type, typeUuid, locale, documents, newDocuments;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = request.params, type = _a.type, typeUuid = _a.typeUuid;\r\n locale = request.queryParams.locale;\r\n return [4 /*yield*/, promisify(database.documents.find({\r\n type: type,\r\n typeUuid: typeUuid,\r\n locale: locale,\r\n }).fetch)];\r\n case 1:\r\n documents = _b.sent();\r\n newDocuments = JSON.parse(request.requestBody);\r\n return [4 /*yield*/, promisify(database.documents.upsert.bind(database.documents), newDocuments, documents)];\r\n case 2:\r\n _b.sent();\r\n return [2 /*return*/, newDocuments.map(function (_a) {\r\n var markdown = _a.markdown, doc = __rest(_a, [\"markdown\"]);\r\n return doc;\r\n })];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function getDocument(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, type, typeUuid, navtitle, locale, document;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = request.params, type = _a.type, typeUuid = _a.typeUuid, navtitle = _a.navtitle;\r\n locale = request.queryParams.locale;\r\n return [4 /*yield*/, promisify(database.documents.findOne.bind(database.documents), {\r\n type: type,\r\n typeUuid: typeUuid,\r\n navtitle: navtitle,\r\n locale: locale,\r\n })];\r\n case 1:\r\n document = _b.sent();\r\n if (!document) {\r\n return [2 /*return*/, new Response(404)];\r\n }\r\n return [2 /*return*/, document];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function deleteDocument(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, type, typeUuid, navtitle, locale, document;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = request.params, type = _a.type, typeUuid = _a.typeUuid, navtitle = _a.navtitle;\r\n locale = request.queryParams.locale;\r\n return [4 /*yield*/, promisify(database.documents.findOne.bind(database.documents), {\r\n type: type,\r\n typeUuid: typeUuid,\r\n navtitle: navtitle,\r\n locale: locale,\r\n })];\r\n case 1:\r\n document = _b.sent();\r\n return [4 /*yield*/, promisify(database.documents.remove.bind(database.documents), document._id)];\r\n case 2:\r\n _b.sent();\r\n return [2 /*return*/, document];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport { promisify } from '../promisify';\r\nimport { Response } from 'miragejs';\r\nexport function listApiTags(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var api, tags;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.apis.findOne.bind(database.apis), {\r\n uuid: request.params.id,\r\n })];\r\n case 1:\r\n api = _a.sent();\r\n if (!api) {\r\n return [2 /*return*/, new Response(404)];\r\n }\r\n return [4 /*yield*/, promisify(database.tags.find({\r\n name: {\r\n $in: api.tags,\r\n },\r\n }).fetch)];\r\n case 2:\r\n tags = _a.sent();\r\n return [2 /*return*/, tags];\r\n }\r\n });\r\n }); };\r\n}\r\nexport function listTags(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var tags;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.tags.find().fetch)];\r\n case 1:\r\n tags = _a.sent();\r\n return [2 /*return*/, tags];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport { promisify } from '../promisify';\r\nexport function listApiAssets(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var assets;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, promisify(database.assets.find({\r\n _apiUuid: request.params.id,\r\n }).fetch)];\r\n case 1:\r\n assets = _a.sent();\r\n return [2 /*return*/, assets];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport { Response } from 'miragejs';\r\nimport { promisify } from '../promisify';\r\nexport function postRegistration(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var registration, existingRegistration;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n registration = JSON.parse(request.requestBody);\r\n return [4 /*yield*/, promisify(database.registrations.findOne.bind(database.registrations), { Email: registration.Email }, {})];\r\n case 1:\r\n existingRegistration = _a.sent();\r\n if (existingRegistration) {\r\n return [2 /*return*/, new Response(551, undefined, {\r\n error: {\r\n code: 'ValidationException',\r\n message: {\r\n lang: 'en',\r\n value: 'Registration request for this email is pending approval/activation. Multiple requests are not allowed.',\r\n },\r\n detail: {\r\n errorCode: '551',\r\n devErrorMessage: 'Registration request for this email is pending approval/activation. Multiple requests are not allowed.',\r\n userErrorMessage: 'Registration request for this email is pending approval/activation. Multiple requests are not allowed.',\r\n userErrorKey: 'error.user.create.fail.limituserregistration',\r\n },\r\n },\r\n })];\r\n }\r\n return [4 /*yield*/, promisify(database.registrations.upsert.bind(database.registrations), __assign({}, registration))];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/, new Response(201, {}, {})];\r\n }\r\n });\r\n }); };\r\n}\r\n","// Icons made by Freepik \r\nexport var iconQuestionMark = \"\\n\\n\";\r\nexport var iconPickAxe = \"\";\r\n","// Inspired by NextJs\r\n// https://github.com/zeit/next.js/blob/886037b1bac4bdbfeb689b032c1612750fb593f7/packages/next/client/dev/prerender-indicator.js#L1\r\nimport { iconQuestionMark } from './icons';\r\nexport var KEY = '@layer7/mock-server/running-indicator';\r\n/**\r\n * Create and display the running indicator that should be displayed when the mock server is running.\r\n *\r\n * @param {*} icon The HTML element containing the icon\r\n * @param {*} link The link to open when clicking on the running indicator\r\n */\r\nexport function initializeRunningIndicator(_a) {\r\n var _b = _a.icon, icon = _b === void 0 ? iconQuestionMark : _b, _c = _a.link, link = _c === void 0 ? '#' : _c;\r\n var shadowHost = document.createElement('div');\r\n shadowHost.id = KEY;\r\n // Make sure container is fixed and on a high zIndex so it shows\r\n shadowHost.style.position = 'fixed';\r\n shadowHost.style.bottom = '20px';\r\n shadowHost.style.left = '10px';\r\n shadowHost.style.width = 0;\r\n shadowHost.style.height = 0;\r\n shadowHost.style.zIndex = 99998;\r\n shadowHost.style.transition = 'all 100ms ease';\r\n document.body.appendChild(shadowHost);\r\n var shadowRoot;\r\n var prefix = '';\r\n if (shadowHost.attachShadow) {\r\n shadowRoot = shadowHost.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n // If attachShadow is undefined then the browser does not support\r\n // the Shadow DOM, we need to prefix all the names so there\r\n // will be no conflicts\r\n shadowRoot = shadowHost;\r\n prefix = KEY + \"-\";\r\n }\r\n // Container\r\n var container = createContainer(prefix, icon, link);\r\n shadowRoot.appendChild(container);\r\n // CSS\r\n var css = createCss(prefix);\r\n shadowRoot.appendChild(css);\r\n var expandEl = container.querySelector('a');\r\n var closeEl = container.querySelector(\"#\" + prefix + \"close\");\r\n // State\r\n var dismissKey = KEY;\r\n var dismissUntil = parseInt(window.localStorage.getItem(dismissKey), 10);\r\n var dismissed = dismissUntil > new Date().getTime();\r\n var isVisible = !dismissed;\r\n function updateContainer() {\r\n if (isVisible) {\r\n container.classList.add(prefix + \"visible\");\r\n }\r\n else {\r\n container.classList.remove(prefix + \"visible\");\r\n }\r\n }\r\n var expandedClass = prefix + \"expanded\";\r\n var toggleTimeout;\r\n var toggleExpand = function (expand) {\r\n if (expand === void 0) { expand = true; }\r\n clearTimeout(toggleTimeout);\r\n toggleTimeout = setTimeout(function () {\r\n if (expand) {\r\n expandEl.classList.add(expandedClass);\r\n closeEl.style.display = 'flex';\r\n }\r\n else {\r\n expandEl.classList.remove(expandedClass);\r\n closeEl.style.display = 'none';\r\n }\r\n }, 50);\r\n };\r\n closeEl.addEventListener('click', function () {\r\n var oneHourAway = new Date().getTime() + 1 * 60 * 60 * 1000;\r\n window.localStorage.setItem(dismissKey, oneHourAway + '');\r\n isVisible = false;\r\n updateContainer();\r\n });\r\n closeEl.addEventListener('mouseenter', function () { return toggleExpand(); });\r\n closeEl.addEventListener('mouseleave', function () { return toggleExpand(false); });\r\n expandEl.addEventListener('mouseenter', function () { return toggleExpand(); });\r\n expandEl.addEventListener('mouseleave', function () { return toggleExpand(false); });\r\n updateContainer();\r\n}\r\nfunction createContainer(prefix, icon, link) {\r\n if (link === void 0) { link = '#'; }\r\n var container = document.createElement('div');\r\n container.id = prefix + \"container\";\r\n container.innerHTML = \"\\n \\n \\n \\n \" + icon + \"\\n Mock Server Running\\n
\\n \\n \";\r\n return container;\r\n}\r\nfunction createCss(prefix) {\r\n var css = document.createElement('style');\r\n css.textContent = \"\\n #\" + prefix + \"container {\\n position: absolute;\\n display: none;\\n bottom: 15px;\\n left: 15px;\\n }\\n #\" + prefix + \"close {\\n top: -10px;\\n left: -10px;\\n border: none;\\n width: 18px;\\n height: 18px;\\n color: #333333;\\n font-size: 16px;\\n cursor: pointer;\\n display: none;\\n position: absolute;\\n background: #ffffff;\\n border-radius: 100%;\\n align-items: center;\\n flex-direction: column;\\n justify-content: center;\\n }\\n #\" + prefix + \"container a {\\n color: inherit;\\n text-decoration: none;\\n width: 40px;\\n height: 50px;\\n overflow: hidden;\\n border-radius: 5px;\\n background: #fff;\\n color: #000;\\n font: initial;\\n cursor: pointer;\\n letter-spacing: initial;\\n text-shadow: initial;\\n text-transform: initial;\\n visibility: initial;\\n font-size: 14px;\\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\\n padding: 5px 8px;\\n align-items: center;\\n box-shadow: 0 11px 40px 0 rgba(0, 0, 0, 0.25), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\\n display: flex;\\n transition: opacity 0.1s ease, bottom 0.1s ease, width 0.3s ease;\\n animation: \" + prefix + \"fade-in 0.1s ease-in-out;\\n }\\n #\" + prefix + \"icon-wrapper {\\n width: 140px;\\n height: 50px;\\n display: flex;\\n flex-shrink: 0;\\n align-items: center;\\n position: relative;\\n }\\n #\" + prefix + \"icon-wrapper svg {\\n flex-shrink: 0;\\n margin-right: 8px;\\n }\\n #\" + prefix + \"container a.\" + prefix + \"expanded {\\n width: 135px;\\n }\\n #\" + prefix + \"container.\" + prefix + \"visible {\\n display: flex;\\n bottom: 10px;\\n opacity: 1;\\n }\\n @keyframes \" + prefix + \"fade-in {\\n from {\\n bottom: 0px;\\n opacity: 0;\\n }\\n to {\\n bottom: 10px;\\n opacity: 1;\\n }\\n }\\n \";\r\n return css;\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport differenceInDays from 'date-fns/differenceInDays';\r\nimport eachDayOfInterval from 'date-fns/eachDayOfInterval';\r\nimport eachMonthOfInterval from 'date-fns/eachMonthOfInterval';\r\nimport parseISO from 'date-fns/parseISO';\r\nexport function getMetricsHits(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, startDate, endDate, parsedStartDate, parsedEndDate, diff, hitsTs, hits;\r\n return __generator(this, function (_b) {\r\n _a = request.queryParams, startDate = _a.startDate, endDate = _a.endDate;\r\n parsedStartDate = parseISO(startDate);\r\n parsedEndDate = parseISO(endDate);\r\n diff = Math.abs(differenceInDays(parsedStartDate, parsedEndDate));\r\n if (diff > 31) {\r\n hitsTs = eachMonthOfInterval({\r\n start: parsedStartDate,\r\n end: parsedEndDate,\r\n }).map(function (date) { return ({\r\n date: date,\r\n hits: Math.floor(Math.random() * 5000 + 2000),\r\n }); });\r\n }\r\n else {\r\n hitsTs = eachDayOfInterval({\r\n start: parsedStartDate,\r\n end: parsedEndDate,\r\n }).map(function (date) { return ({\r\n date: date,\r\n hits: Math.floor(Math.random() * 200 + 100),\r\n }); });\r\n }\r\n hits = hitsTs.reduce(function (acc, currentHit) {\r\n return currentHit > acc ? currentHit : acc;\r\n });\r\n return [2 /*return*/, {\r\n respCode: 200,\r\n respMsg: 'Request Processed Successfully',\r\n requestId: 'Gen-ad1d18f8-8ada-4e06-97fb-eedc715f84bd',\r\n query: {\r\n timerange: 'custom',\r\n startTimeGMT: startDate,\r\n endTimeGMT: endDate,\r\n sortby: 'hits(default)',\r\n sortorder: 'asc(default)',\r\n },\r\n data: {\r\n hits: { hits: hits },\r\n hitsTs: hitsTs,\r\n },\r\n }];\r\n });\r\n }); };\r\n}\r\nexport function getMetricsLatency(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, startDate, endDate, parsedStartDate, parsedEndDate, diff, latenciesTs, getLatency, latencies;\r\n return __generator(this, function (_b) {\r\n _a = request.queryParams, startDate = _a.startDate, endDate = _a.endDate;\r\n parsedStartDate = parseISO(startDate);\r\n parsedEndDate = parseISO(endDate);\r\n diff = Math.abs(differenceInDays(parsedStartDate, parsedEndDate));\r\n getLatency = function (date) {\r\n var min = Math.floor(Math.random() * 100);\r\n var max = Math.floor(Math.random() * 100 + 300);\r\n return {\r\n date: date,\r\n avg: (min + max) / 2,\r\n min: min,\r\n max: max,\r\n };\r\n };\r\n if (diff > 31) {\r\n latenciesTs = eachMonthOfInterval({\r\n start: parsedStartDate,\r\n end: parsedEndDate,\r\n }).map(getLatency);\r\n }\r\n else {\r\n latenciesTs = eachDayOfInterval({\r\n start: parsedStartDate,\r\n end: parsedEndDate,\r\n }).map(getLatency);\r\n }\r\n latencies = {\r\n max: latenciesTs.reduce(function (acc, latency) {\r\n return latency.max > acc ? latency.max : acc;\r\n }),\r\n min: latenciesTs.reduce(function (acc, latency) {\r\n return latency.min < acc ? latency.min : acc;\r\n }),\r\n avg: latenciesTs.reduce(function (acc, latency) { return acc + latency.avg; }) /\r\n latenciesTs.length,\r\n };\r\n return [2 /*return*/, {\r\n respCode: 200,\r\n respMsg: 'Request Processed Successfully',\r\n requestId: 'Gen-89ecd7b4-6a90-48d4-8e2b-630b3f86d12d',\r\n query: {\r\n stats: 'avg,max,min',\r\n timerange: 'custom',\r\n startTimeGMT: '2020-01-05T00:00:00(default)',\r\n endTimeGMT: '2020-01-11T23:59:59(default)',\r\n sortby: 'avg(default)',\r\n sortorder: 'asc(default)',\r\n },\r\n data: {\r\n latencies: latencies,\r\n latenciesTs: latenciesTs,\r\n },\r\n }];\r\n });\r\n }); };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport { promisify } from '../promisify';\r\nimport { Response } from 'miragejs';\r\nvar UuidRegexp = /ApiEulas\\('(.*)'\\)/;\r\nexport function getApiEula(database) {\r\n var _this = this;\r\n return function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var matches, Uuid, eula;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n matches = UuidRegexp.exec(request.params.path);\r\n if (!(matches && matches.length > 1)) return [3 /*break*/, 2];\r\n Uuid = matches[1];\r\n return [4 /*yield*/, promisify(database.apiEulas.findOne.bind(database.apiEulas), { Uuid: Uuid })];\r\n case 1:\r\n eula = _a.sent();\r\n if (eula) {\r\n return [2 /*return*/, eula];\r\n }\r\n _a.label = 2;\r\n case 2: return [2 /*return*/, new Response(404)];\r\n }\r\n });\r\n }); };\r\n}\r\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { Model, Server } from 'miragejs';\r\nimport minimongo from 'minimongo';\r\nimport defaultData from './defaultData.json';\r\nimport { login, getPublicKey, resetPassword, checkUserNameIsUnique, passwordResetTokenValidate, updateMyPassword, logout, getAccountSetup, putAccountSetup, getUserContexts, putUserContexts, getCmsSettings, getAuthSchemes, getPasswordPolicy, } from './handlers/authentication';\r\nimport { getUserProfile, putUserProfile } from './handlers/userProfile';\r\nimport { getTheme } from './handlers/branding';\r\nimport { listApis, getApi, listApiPermissions, getApiSpecContent, } from './handlers/apis';\r\nimport { listApiGroups, getApiGroup, getApiGroupApis, getApiGroupEula, } from './handlers/apiGroups';\r\nimport { listApiPlans, getApiPlan, getApiApiPlanAssociation, getApiPlansFeatureFlag, } from './handlers/apiPlans';\r\nimport { listAccountPlans, getAccountPlan } from './handlers/accountPlans';\r\nimport { listApplications, getApplication, postApplication, getGenerateSharedSecret, getSecretHashMetadata, deleteApplication, } from './handlers/applications';\r\nimport { listApiKeys } from './handlers/apiKeys';\r\nimport { listOrganizations, getOrganization, postOrganization, putOrganization, deleteOrganization, } from './handlers/organizations';\r\nimport { getDocumentsTree, postDocument, putDocument, getDocument, putDocumentsTree, deleteDocument, } from './handlers/documents';\r\nimport { listApiTags, listTags } from './handlers/tags';\r\nimport { listApiAssets } from './handlers/assets';\r\nimport { promisify } from './promisify';\r\nimport { deleteCurrentUser } from './handlers/currentUser';\r\nimport { postRegistration } from './handlers/registrations';\r\nimport { initializeRunningIndicator } from './running/indicator';\r\nimport { getMetricsHits, getMetricsLatency } from './handlers/metrics';\r\nimport { listCustomFields } from './handlers/customFields';\r\nimport { getApiEula } from './handlers/apiEulas';\r\nvar database;\r\nvar DefaultUrlPrefix = 'https://apim.dev.ca.com/';\r\n/**\r\n * Starts a Mirage Server mocking all the ApiHub APIs. This server runs in the browser and intercepts\r\n * all requests made to the /api routes\r\n *\r\n * @param {options} Options The options\r\n * @param {options.data} data The default data used to populate the mock server\r\n * @param {options.urlPrefix} urlPrefix The base url for running the mock server\r\n * @param {options.showRunningIndicator} showRunningIndicator Show or hide the running indicator\r\n * @param {options.timing} timing The delay before responding\r\n */\r\nexport var startApiHubMockedServer = function (_a) {\r\n if (_a === void 0) { _a = {\r\n timing: 150,\r\n }; }\r\n return __awaiter(void 0, void 0, void 0, function () {\r\n var server;\r\n var _b = _a.data, data = _b === void 0 ? defaultData : _b, _c = _a.urlPrefix, urlPrefix = _c === void 0 ? DefaultUrlPrefix : _c, _d = _a.showRunningIndicator, showRunningIndicator = _d === void 0 ? true : _d, _e = _a.runningIndicatorLink, runningIndicatorLink = _e === void 0 ? '#' : _e, options = __rest(_a, [\"data\", \"urlPrefix\", \"showRunningIndicator\", \"runningIndicatorLink\"]);\r\n return __generator(this, function (_f) {\r\n switch (_f.label) {\r\n case 0:\r\n if (showRunningIndicator) {\r\n initializeRunningIndicator({ link: runningIndicatorLink });\r\n }\r\n return [4 /*yield*/, getDatabase()];\r\n case 1:\r\n database = _f.sent();\r\n return [4 /*yield*/, initDatabase(database, data)];\r\n case 2:\r\n _f.sent();\r\n server = new Server({\r\n models: {\r\n userContexts: Model.extend(),\r\n apis: Model.extend(),\r\n applications: Model.extend(),\r\n documents: Model.extend(),\r\n },\r\n routes: function () {\r\n var _this = this;\r\n this.get(urlPrefix + \"api/apim/GenerateNewSharedSecret\", getGenerateSharedSecret(database), options);\r\n this.get(urlPrefix + \"api/apim/passwordResetTokenValidate\", passwordResetTokenValidate(database), options);\r\n this.put(urlPrefix + \"api/apim/v2/users/password/reset/:uuid\", updateMyPassword(database), options);\r\n this.get(urlPrefix + \"api/apim/ResetMyPassword()\", resetPassword(database), options);\r\n this.get(urlPrefix + \"api/apim/logout\", logout(database), options);\r\n this.post(urlPrefix + \"api/apim/authenticate/login\", login(database), options);\r\n this.get(urlPrefix + \"api/apim/UserNameUnique()\", checkUserNameIsUnique(database), options);\r\n this.get(urlPrefix + \"api/apim/accountSetup\", getAccountSetup(database), options);\r\n this.put(urlPrefix + \"api/apim/accountSetup\", putAccountSetup(database), options);\r\n this.get(urlPrefix + \"api/apim/authenticate/getPublicKey\", getPublicKey(database), options);\r\n this.get(urlPrefix + \"api/apim/public/auth/schemes/passwordpolicy\", getPasswordPolicy(database), options);\r\n this.get(urlPrefix + \"api/apim/userContexts\", getUserContexts(database), options);\r\n this.put(urlPrefix + \"api/apim/userContexts\", putUserContexts(database), options);\r\n this.get(urlPrefix + \"api/apim/userProfile\", getUserProfile(database), options);\r\n this.put(urlPrefix + \"api/apim/userProfile\", putUserProfile(database), options);\r\n this.get(urlPrefix + \"api/apim/branding/1.0/themes\", getTheme(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/apis\", listApis(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/applications\", listApplications(database), options);\r\n this.post(urlPrefix + \"api/apim/Applications\", postApplication(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/applications/:applicationUuid/api-keys\", listApiKeys(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/account-plans\", listAccountPlans(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/account-plans/:id\", getAccountPlan(database), options);\r\n this.get(urlPrefix + \"api/apim/document-service/1.0/docs/:type/:typeUuid/:navtitle\", getDocument(database), options);\r\n this.post(urlPrefix + \"api/apim/document-service/1.0/docs/:type/:typeUuid/:navtitle\", postDocument(database), options);\r\n this.put(urlPrefix + \"api/apim/document-service/1.0/docs/:type/:typeUuid/:navtitle\", putDocument(database), options);\r\n this.del(urlPrefix + \"api/apim/document-service/1.0/docs/:type/:typeUuid/:navtitle\", deleteDocument(database), options);\r\n this.get(urlPrefix + \"api/apim/document-service/1.0/docs/:type/:typeUuid\", getDocumentsTree(database), options);\r\n this.put(urlPrefix + \"api/apim/document-service/1.0/docs/:type/:typeUuid\", putDocumentsTree(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/apis/:id\", getApi(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/apis/:id/tags\", listApiTags(database), options);\r\n this.get(urlPrefix + \"tenant-admin/internal/organizations\", listOrganizations(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/organizations/:id\", getOrganization(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/apis/:id/assets\", listApiAssets(database), options);\r\n this.get(urlPrefix + \"api/apim/tags\", listTags(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/internal/permissions/apis/:id/permitted\", listApiPermissions(database), options);\r\n this.get(urlPrefix + \"api/apim/2.0/Apis\", function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var results;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, listApis(database)(schema, request)];\r\n case 1:\r\n results = (_a.sent()).results;\r\n return [2 /*return*/, results];\r\n }\r\n });\r\n }); }, options);\r\n this.get(urlPrefix + \"api/apim/api-management/internal/OrganizationApiGroups\", listApiGroups(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/api-groups/:id\", getApiGroup(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/api-groups/:id/apis\", getApiGroupApis(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/internal/ApiGroups/:id/Eulas\", getApiGroupEula(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/internal/api-plans\", listApiPlans(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/1.0/api-plans/:id\", getApiPlan(database), options);\r\n this.get(urlPrefix + \"api/apim/api-management/internal/api-plans\", getApiApiPlanAssociation(database), options);\r\n this.get(urlPrefix + \"api/apim/Settings('FEATURE_FLAG_API_PLANS')\", getApiPlansFeatureFlag(database), options);\r\n this.get(urlPrefix + \"api/apim/Settings('APP_SECRET_HASHING_METADATA')\", getSecretHashMetadata(database), options);\r\n this.delete(urlPrefix + \"api/apim/Applications(':uuid')\", deleteApplication(database), options);\r\n // This is the only way I found to make the SpecContent route work.\r\n // Its url looks like api/apim/2.0/Apis(':id')/SpecContent.\r\n // It seems either the parenthesises or the quotes make the route parameter\r\n // parsing fail.\r\n this.get(urlPrefix + \"api/apim/2.0/*path\", function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var path, uuid;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n path = request.params.path;\r\n if (!path.match(/Apis\\('.*'\\)\\/SpecContent/)) return [3 /*break*/, 2];\r\n return [4 /*yield*/, getApiSpecContent(database)(schema, request)];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n case 2:\r\n if (!path.match(/Apis\\('.*'\\)/)) return [3 /*break*/, 4];\r\n uuid = path.substring(6, path.length - 13);\r\n return [4 /*yield*/, getApi(database)(schema, {\r\n params: {\r\n uuid: uuid,\r\n },\r\n })];\r\n case 3: return [2 /*return*/, _a.sent()];\r\n case 4: return [2 /*return*/, {}];\r\n }\r\n });\r\n }); }, options);\r\n this.post(urlPrefix + \"api/apim/Registrations\", postRegistration(database), options);\r\n this.get(urlPrefix + \"api/apim/cmsSettings\", getCmsSettings(database), options);\r\n this.get(urlPrefix + \"api/apim/public/auth/schemes\", getAuthSchemes(database), options);\r\n // api/apim/analytics/metrics/v1/hits/apis/by-week\r\n this.get(urlPrefix + \"api/apim/analytics/metrics/v1/hits/apis/:timeAggregation\", getMetricsHits(database), options);\r\n this.get(urlPrefix + \"api/apim/analytics/metrics/v1/latency/apis/:timeAggregation\", getMetricsLatency(database), options);\r\n this.get(urlPrefix + \"api/apim/CustomFields\", listCustomFields(database), options);\r\n // This is the only way I found to make the legacy routes work.\r\n // Its url looks api/apim/api-management/1.0/Applications(':uuid').\r\n // It seems either the parenthesises or the quotes make the route parameter\r\n // parsing fail.\r\n this.get(urlPrefix + \"api/apim/*path\", function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var path, uuid;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n console.log('GET - Catch all', request.url);\r\n path = request.params.path;\r\n if (!path.match(/ApiEulas\\('.*'\\)/)) return [3 /*break*/, 2];\r\n return [4 /*yield*/, getApiEula(database)(schema, request)];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n case 2:\r\n if (!path.match(/Applications\\('.*'\\)/)) return [3 /*break*/, 4];\r\n uuid = path.substring(14, path.length - 2);\r\n return [4 /*yield*/, getApplication(database)(schema, {\r\n params: {\r\n uuid: uuid,\r\n },\r\n })];\r\n case 3: return [2 /*return*/, _a.sent()];\r\n case 4: return [2 /*return*/, {}];\r\n }\r\n });\r\n }); }, options);\r\n this.put(urlPrefix + \"api/apim/*path\", function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var path, uuid;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n console.log('PUT - Catch all', request.params.path);\r\n path = request.params.path;\r\n if (!path.match(/Organizations\\('.*'\\)/)) return [3 /*break*/, 2];\r\n uuid = path.substring(15, path.length - 2);\r\n return [4 /*yield*/, putOrganization(database)(schema, {\r\n params: {\r\n uuid: uuid,\r\n },\r\n })];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n case 2: return [2 /*return*/, {}];\r\n }\r\n });\r\n }); }, options);\r\n this.post(urlPrefix + \"api/apim/*path\", function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var path, uuid;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n console.log('POST - Catch all', request.params.path);\r\n path = request.params.path;\r\n if (!path.match(/Organizations\\('.*'\\)/)) return [3 /*break*/, 2];\r\n uuid = path.substring(15, path.length - 2);\r\n return [4 /*yield*/, postOrganization(database)(schema, {\r\n params: {\r\n uuid: uuid,\r\n },\r\n })];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n case 2: return [2 /*return*/, {}];\r\n }\r\n });\r\n }); }, options);\r\n this.delete(urlPrefix + \"api/apim/*path\", function (schema, request) { return __awaiter(_this, void 0, void 0, function () {\r\n var path, uuid;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n console.log('DELETE - Catch all', request.params.path);\r\n path = request.params.path;\r\n if (!path.match(/Organizations\\('.*'\\)/)) return [3 /*break*/, 2];\r\n uuid = path.substring(15, path.length - 2);\r\n return [4 /*yield*/, deleteOrganization(database)(schema, {\r\n params: {\r\n uuid: uuid,\r\n },\r\n })];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n case 2: return [2 /*return*/, {}];\r\n }\r\n });\r\n }); }, options);\r\n this.passthrough();\r\n },\r\n });\r\n window.Layer7Mock = {\r\n database: database,\r\n clearDatabase: function () {\r\n return clearDatabase();\r\n },\r\n initDatabase: function (initialData) {\r\n if (initialData === void 0) { initialData = data; }\r\n return initDatabase(database, initialData);\r\n },\r\n resetDatabase: function (initialData) {\r\n var _this = this;\r\n if (initialData === void 0) { initialData = data; }\r\n return this.clearDatabase().then(function () {\r\n return _this.initDatabase(initialData);\r\n });\r\n },\r\n deleteCurrentUser: deleteCurrentUser,\r\n };\r\n return [2 /*return*/, { server: server, database: database }];\r\n }\r\n });\r\n });\r\n};\r\nfunction getDatabase() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n if (database) {\r\n return [2 /*return*/, database];\r\n }\r\n return [2 /*return*/, new Promise(function (resolve, reject) {\r\n var indexedDb = new minimongo.IndexedDb({ namespace: 'layer7' }, function () { return resolve(indexedDb); }, reject);\r\n })];\r\n });\r\n });\r\n}\r\nfunction clearDatabase() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, Promise.all([\r\n promisify(database.removeCollection.bind(database), 'apis'),\r\n promisify(database.removeCollection.bind(database), 'apiEulas'),\r\n promisify(database.removeCollection.bind(database), 'apiGroups'),\r\n promisify(database.removeCollection.bind(database), 'apiKeys'),\r\n promisify(database.removeCollection.bind(database), 'apiPlans'),\r\n promisify(database.removeCollection.bind(database), 'applications'),\r\n promisify(database.removeCollection.bind(database), 'userContexts'),\r\n promisify(database.removeCollection.bind(database), 'documents'),\r\n promisify(database.removeCollection.bind(database), 'specs'),\r\n promisify(database.removeCollection.bind(database), 'assets'),\r\n promisify(database.removeCollection.bind(database), 'tags'),\r\n promisify(database.removeCollection.bind(database), 'registrations'),\r\n promisify(database.removeCollection.bind(database), 'customFields'),\r\n ])];\r\n case 1:\r\n _a.sent();\r\n console.log('Mock database cleared');\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nfunction initDatabase(db, initialData) {\r\n if (initialData === void 0) { initialData = defaultData; }\r\n return __awaiter(this, void 0, void 0, function () {\r\n var hasData;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, Promise.all([\r\n promisify(db.addCollection.bind(db), 'apis'),\r\n promisify(db.addCollection.bind(db), 'apiEulas'),\r\n promisify(db.addCollection.bind(db), 'apiGroups'),\r\n promisify(db.addCollection.bind(db), 'apiKeys'),\r\n promisify(db.addCollection.bind(db), 'apiPlans'),\r\n promisify(db.addCollection.bind(db), 'applications'),\r\n promisify(db.addCollection.bind(db), 'userContexts'),\r\n promisify(db.addCollection.bind(db), 'documents'),\r\n promisify(db.addCollection.bind(db), 'specs'),\r\n promisify(db.addCollection.bind(db), 'assets'),\r\n promisify(db.addCollection.bind(db), 'tags'),\r\n promisify(db.addCollection.bind(db), 'registrations'),\r\n promisify(db.addCollection.bind(db), 'customFields'),\r\n ])];\r\n case 1:\r\n _a.sent();\r\n return [4 /*yield*/, promisify(db.apis.find().fetch)];\r\n case 2:\r\n hasData = (_a.sent()).length > 0;\r\n if (!!hasData) return [3 /*break*/, 4];\r\n return [4 /*yield*/, Promise.all([\r\n promisify(db.tags.upsert.bind(db.tags), initialData.tags),\r\n promisify(db.apis.upsert.bind(db.apis), initialData.apis),\r\n promisify(db.registrations.upsert.bind(db.registrations), initialData.registrations),\r\n promisify(db.applications.upsert.bind(db.applications), initialData.applications),\r\n promisify(db.apiGroups.upsert.bind(db.apiGroups), initialData.apiGroups),\r\n promisify(db.apiGroups.upsert.bind(db.apiKeys), initialData.apiKeys),\r\n promisify(db.apiPlans.upsert.bind(db.apiPlans), initialData.apiPlans),\r\n promisify(db.userContexts.upsert.bind(db.userContexts), initialData.userContexts),\r\n promisify(db.documents.upsert.bind(db.documents), initialData.documents),\r\n promisify(db.assets.upsert.bind(db.assets), initialData.assets),\r\n promisify(db.customFields.upsert.bind(db.customFields), initialData.customFields),\r\n promisify(db.apiEulas.upsert.bind(db.apiEulas), initialData.apiEulas),\r\n ])];\r\n case 3:\r\n _a.sent();\r\n _a.label = 4;\r\n case 4:\r\n console.log('Mock database initialized');\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\n","import { promisify } from '../promisify';\r\nexport function listCustomFields(database) {\r\n return function (schema, request) {\r\n return promisify(database.customFields.find(request.queryParams).fetch);\r\n };\r\n}\r\n","import theme from '../theme.json';\r\nexport function getTheme(database) {\r\n return function (schema, request) {\r\n return theme;\r\n };\r\n}\r\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport get from 'lodash/get';\r\nimport pure from 'recompose/pure';\r\nimport Link from '@material-ui/core/Link';\r\nexport const LinkField = pure((_a) => {\r\n var { addLabel = true, className, source, record = {} } = _a, rest = __rest(_a, [\"addLabel\", \"className\", \"source\", \"record\"]);\r\n const value = get(record, source);\r\n if (!value) {\r\n return null;\r\n }\r\n return (React.createElement(Link, Object.assign({ className: className, href: value }, rest), value));\r\n});\r\n//# sourceMappingURL=LinkField.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { forwardRef } from 'react';\r\nimport { useTranslate, useGetManyReference } from 'ra-core';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport Link from '@material-ui/core/Link';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport get from 'lodash/get';\r\nimport { useApiHub } from '../ApiHubContext';\r\nexport const ApiAssetsField = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const { record } = props, rest = __rest(props, [\"record\"]);\r\n const { data, loaded, error } = useGetManyReference('assets', 'id', record.id, undefined, undefined, undefined, 'apis');\r\n if (!loaded) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (error) {\r\n return (React.createElement(Typography, Object.assign({ variant: \"body1\", className: classes.error }, rest), translate('ra.page.error')));\r\n }\r\n if (!data) {\r\n return (React.createElement(Typography, Object.assign({ variant: \"body1\" }, rest), translate('resources.apis.overview.notifications.no_assets')));\r\n }\r\n const links = Object.keys(data).map(key => {\r\n const { id, name, type, links } = data[key];\r\n return {\r\n id,\r\n name,\r\n type: type,\r\n href: get(links, '[0].href', null),\r\n rel: get(links, '[0].rel', null),\r\n };\r\n });\r\n return React.createElement(AssetsList, Object.assign({ record: record, links: links }, rest));\r\n};\r\nexport const AssetsList = (_a) => {\r\n var { record, links } = _a, rest = __rest(_a, [\"record\", \"links\"]);\r\n const { urlWithTenant } = useApiHub();\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(List, Object.assign({}, rest), links.length > 0 &&\r\n links.map(link => (React.createElement(ListItem, { key: link.id, disableGutters: true },\r\n React.createElement(Link, { type: link.type, href: `${urlWithTenant}${link.href}`, download: link.name }, link.name))))),\r\n links.length > 1 ? React.createElement(DownloadFilesButton, { id: record.id }) : null));\r\n};\r\nconst DownloadFilesButton = ({ id }) => {\r\n const translate = useTranslate();\r\n const { urlWithTenant } = useApiHub();\r\n const href = `${urlWithTenant}/api-management/1.0/apis/${id}/assets/archive`;\r\n const label = translate('resources.apis.overview.actions.download_assets');\r\n return (React.createElement(Link, { component: DownloadButton, href: href, download: \"assets.zip\", \"aria-label\": label }, label));\r\n};\r\nconst DownloadButton = forwardRef((props, ref) => (React.createElement(Button, Object.assign({ variant: \"outlined\", color: \"primary\", ref: ref }, props))));\r\nconst useStyles = makeStyles(theme => ({\r\n error: {\r\n color: theme.palette.error.main,\r\n marginBottom: theme.spacing(),\r\n },\r\n}), {\r\n name: 'Layer7ApiAssetsField',\r\n});\r\n//# sourceMappingURL=ApiAssetsField.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport classNames from 'classnames';\r\nimport { useGetList } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\n/**\r\n * A React Admin custom field to display the number of applications using\r\n * the current API.\r\n * Meant to be used in an API view.\r\n */\r\nexport const ApiApplicationUsageField = props => {\r\n const { className, record } = props, rest = __rest(props, [\"className\", \"record\"]);\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const { data, loaded, error } = useGetList('applications', undefined, { field: 'name', order: 'ASC' }, {\r\n apiUuid: record.id,\r\n });\r\n if (!loaded) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (!data || error) {\r\n return (React.createElement(Typography, Object.assign({ variant: \"body2\", className: classes.error }, rest), translate('ra.page.error')));\r\n }\r\n return (React.createElement(Typography, Object.assign({ variant: \"body2\", className: classNames(className, classes.root) }, rest), data && Object.keys(data).length));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n color: theme.palette.primary.main,\r\n },\r\n error: {\r\n color: theme.palette.error.main,\r\n marginBottom: theme.spacing(),\r\n },\r\n}), {\r\n name: 'Layer7ApiApplicationUsageField',\r\n});\r\n//# sourceMappingURL=ApiApplicationUsageField.js.map","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { Labeled, TextField, DateField } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { MarkdownField, LinkField } from '../ui';\r\nimport { VisibilityField } from './VisibilityField';\r\nimport { ApiAssetsField } from './ApiAssetsField';\r\nimport { ApiApplicationUsageField } from './Application';\r\nimport { AsyncTagsField } from './TagsField';\r\nexport const ApiOverview = ({ record, userIsPublisher }) => {\r\n const classes = useOverviewStyles();\r\n const gridClasses = useGridStyles();\r\n const rightGridClasses = useRightGridStyles();\r\n const headerLabelClasses = useHeaderStyles();\r\n const contentLabelClasses = useContentStyles();\r\n const translate = useTranslate();\r\n return (React.createElement(Grid, { className: classes.root, container: true, spacing: 3 },\r\n React.createElement(Grid, { container: true, item: true, md: 8, sm: 12, direction: \"row\", classes: gridClasses, className: classes.informations },\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"portalStatus\", label: \"resources.apis.fields.portalStatus\", classes: headerLabelClasses, className: classes.field },\r\n React.createElement(Grid, { item: true, container: true, alignItems: \"center\", className: classNames(classes.enabledContainer, {\r\n [classes.enabled]: record.portalStatus === 'ENABLED',\r\n [classes.disabled]: record.portalStatus !== 'ENABLED',\r\n }) },\r\n React.createElement(\"div\", { className: classes.enabledIcon }),\r\n React.createElement(Typography, { variant: \"body2\", className: headerLabelClasses.value, id: \"portalStatus\" }, translate(`resources.apis.portalStatus.${record.portalStatus.toLowerCase()}`))))),\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"apiServiceType\", label: \"resources.apis.fields.apiServiceType\", classes: headerLabelClasses, className: classes.field },\r\n React.createElement(TextField, { id: \"apiServiceType\", record: record, source: \"apiServiceType\", className: classNames(headerLabelClasses.value, classes.type) }))),\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"version\", label: \"resources.apis.fields.version\", classes: headerLabelClasses, className: classes.field },\r\n React.createElement(Typography, { id: \"version\", variant: \"body2\", className: headerLabelClasses.value }, translate('resources.apis.overview.fields.version', {\r\n version: record.version,\r\n })))),\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"accessStatus\", label: \"resources.apis.fields.accessStatus\", classes: headerLabelClasses, className: classes.field },\r\n React.createElement(VisibilityField, { id: \"accessStatus\", record: record, source: \"accessStatus\", className: headerLabelClasses.value }))),\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"modifyTs\", label: \"resources.apis.fields.modifyTs\", classes: headerLabelClasses, className: classes.field },\r\n React.createElement(DateField, { id: \"modifyTs\", record: record, source: \"modifyTs\", className: headerLabelClasses.value })))),\r\n React.createElement(Grid, { className: classes.applications, container: true, item: true, md: 4, sm: 12, classes: rightGridClasses },\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"applicationUsage\", label: \"resources.apis.fields.applicationUsage\", classes: headerLabelClasses, className: classes.field },\r\n React.createElement(ApiApplicationUsageField, { id: \"applicationUsage\", record: record, className: headerLabelClasses.value })))),\r\n React.createElement(Grid, { container: true, item: true, md: 8, sm: 12, direction: \"column\", className: classes.description, classes: gridClasses },\r\n userIsPublisher ? (React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"apiLocation\", label: \"resources.apis.fields.apiLocation\", classes: contentLabelClasses, className: classes.field },\r\n React.createElement(LinkField, { id: \"locationUrl\", record: record, source: \"locationUrl\", target: \"_blank\", rel: \"noopener\" })))) : null,\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"description\", label: \"resources.apis.fields.description\", classes: contentLabelClasses, className: classes.field },\r\n React.createElement(MarkdownField, { id: \"description\", record: record, source: \"description\" }))),\r\n userIsPublisher ? (React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"privateDescription\", label: \"resources.apis.fields.privateDescription\", classes: contentLabelClasses, className: classes.field },\r\n React.createElement(MarkdownField, { id: \"privateDescription\", record: record, source: \"privateDescription\" })))) : null,\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"tags\", label: \"resources.apis.fields.tags\", classes: contentLabelClasses, className: classes.field },\r\n React.createElement(Grid, { item: true, container: true, alignItems: \"center\" },\r\n React.createElement(AsyncTagsField, { id: \"tags\", record: record }))))),\r\n React.createElement(Grid, { container: true, item: true, md: 4, sm: 12, className: classes.assets, classes: rightGridClasses },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"assets\", label: \"resources.apis.fields.assets\", classes: contentLabelClasses, className: classes.field },\r\n React.createElement(ApiAssetsField, { id: \"assets\", record: record })))));\r\n};\r\nconst useOverviewStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n fontFamily: theme.typography.body2.fontFamily,\r\n fontSize: theme.typography.caption.fontSize,\r\n margin: -theme.spacing(1),\r\n },\r\n enabledContainer: {\r\n width: 'auto',\r\n },\r\n enabled: {\r\n color: theme.palette.success.main,\r\n '& $enabledIcon': {\r\n backgroundColor: theme.palette.success.main,\r\n },\r\n },\r\n disabled: {\r\n '& $enabledIcon': {\r\n backgroundColor: theme.palette.text.disabled,\r\n },\r\n },\r\n enabledIcon: {\r\n width: theme.spacing(1.5),\r\n height: theme.spacing(1.5),\r\n borderRadius: 99999,\r\n marginRight: theme.spacing(),\r\n },\r\n field: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n minWidth: '100px',\r\n },\r\n type: {\r\n textTransform: 'uppercase',\r\n },\r\n informations: {},\r\n applications: {},\r\n description: {},\r\n assets: {},\r\n}), {\r\n name: 'Layer7ApiOverview',\r\n});\r\nconst useHeaderStyles = makeStyles(theme => ({\r\n label: {\r\n textTransform: 'uppercase',\r\n },\r\n value: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n}));\r\nconst useContentStyles = makeStyles(theme => ({\r\n label: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n fontSize: '1.5rem',\r\n },\r\n}));\r\nconst useGridStyles = makeStyles(theme => ({\r\n root: {\r\n borderBottom: `1px solid ${theme.palette.divider}`,\r\n },\r\n}));\r\nconst useRightGridStyles = makeStyles(theme => ({\r\n root: {\r\n borderBottom: `1px solid ${theme.palette.divider}`,\r\n borderLeft: `1px solid ${theme.palette.divider}`,\r\n },\r\n}));\r\n//# sourceMappingURL=ApiOverview.js.map","import React from 'react';\r\nimport get from 'lodash/get';\r\nimport { Documentation as BaseDocumentation } from '../documentation';\r\nexport const ApiDocumentation = props => {\r\n const { record } = props;\r\n return React.createElement(BaseDocumentation, Object.assign({}, props, { entityUuid: get(record, 'id') }));\r\n};\r\n//# sourceMappingURL=ApiDocumentation.js.map","import React, { useState } from 'react';\r\nimport { useTranslate, useDataProvider } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\n/**\r\n * Component responsible for fetching and displaying an application's credentials\r\n * @param {String} id. The application identifier\r\n */\r\nexport const ApiApplicationCredentials = ({ id }) => {\r\n const classes = useStyles();\r\n const translate = useTranslate();\r\n const dataProvider = useDataProvider();\r\n const notify = useLayer7Notify();\r\n const [application, setApplication] = useState();\r\n const fetchApplication = async (id) => {\r\n const { data } = await dataProvider.getOne('applications', {\r\n id: id,\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n return data;\r\n };\r\n React.useEffect(() => {\r\n (async () => {\r\n const data = await fetchApplication(id);\r\n setApplication(data);\r\n })();\r\n }, [id]);\r\n if (!application) {\r\n return React.createElement(CircularProgress, { color: \"primary\" });\r\n }\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { variant: \"subtitle1\", className: classes.mainKey },\r\n React.createElement(\"span\", { className: classes.label }, translate('resources.applications.fields.apiKey')),\r\n React.createElement(\"span\", { id: `api-key-${application.id}` }, application.apiKey)),\r\n React.createElement(Typography, { variant: \"body2\", className: classes.secondaryKey },\r\n React.createElement(\"span\", { className: classes.label }, translate('resources.applications.fields.keySecret')),\r\n React.createElement(\"span\", { id: `shared-secret-${application.id}` }, application.keySecret))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n border: `solid 1px ${theme.palette.divider}`,\r\n backgroundColor: theme.palette.background.default,\r\n paddingBottom: theme.spacing(3),\r\n paddingTop: theme.spacing(3),\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(4),\r\n },\r\n mainKey: {\r\n color: theme.palette.text.primary,\r\n fontWeight: theme.typography.fontWeightBold,\r\n wordBreak: 'break-all',\r\n },\r\n secondaryKey: {\r\n color: theme.palette.text.primary,\r\n wordBreak: 'break-all',\r\n },\r\n label: {\r\n marginRight: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7ApiApplicationCredentials',\r\n});\r\n//# sourceMappingURL=ApiApplicationCredentials.js.map","import React, { useState } from 'react';\r\nimport { useTranslate, useDataProvider } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Autocomplete from '@material-ui/lab/Autocomplete';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport uniqBy from 'lodash/uniqBy';\r\nimport { ApiApplicationCredentials } from './ApiApplicationCredentials';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport const ApiApplications = ({ id }) => {\r\n const translate = useTranslate();\r\n const classes = useStyles();\r\n const dataProvider = useDataProvider();\r\n const notify = useLayer7Notify();\r\n const [selectedApp, setSelectedApp] = useState();\r\n const [open, setOpen] = React.useState(false);\r\n const [applications, setApplications] = useState([]);\r\n const [search, setSearch] = React.useState(undefined);\r\n const [loading, setLoading] = React.useState(false);\r\n const [currentPage, setCurrentPage] = React.useState(1);\r\n const fetchApplications = async (searchValue) => {\r\n const { data, total } = await dataProvider.getList('applications', {\r\n filter: {\r\n apiUuid: id,\r\n name: search,\r\n },\r\n pagination: { page: currentPage, perPage: 10 },\r\n sort: { field: 'name', order: 'ASC' },\r\n }, {\r\n onFailure: error => notify(error),\r\n });\r\n return [data, total];\r\n };\r\n const onSearch = event => {\r\n setCurrentPage(1);\r\n setLoading(true);\r\n setSearch(event.target.value);\r\n };\r\n React.useEffect(() => {\r\n if (!open) {\r\n setLoading(false);\r\n setSearch(undefined);\r\n }\r\n }, [open]);\r\n React.useEffect(() => {\r\n let active = true;\r\n if (!search || search.length < 2) {\r\n return undefined;\r\n }\r\n (async () => {\r\n const [data, total] = await fetchApplications(search);\r\n if (active) {\r\n if (data.length == total) {\r\n setApplications(data);\r\n setLoading(false);\r\n }\r\n else if (applications.length < total) {\r\n setApplications(uniqBy([...applications, ...data], 'id'));\r\n setCurrentPage(currentPage + 1);\r\n }\r\n else {\r\n setLoading(false);\r\n }\r\n }\r\n })();\r\n return () => {\r\n active = false;\r\n };\r\n }, [search, currentPage]);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Grid, { container: true, spacing: 3 },\r\n React.createElement(Grid, { item: true, xs: 7 },\r\n React.createElement(Typography, { variant: \"h6\", color: \"textSecondary\", gutterBottom: true }, translate('resources.applications.name', {\r\n smart_count: 1,\r\n })),\r\n React.createElement(FormControl, { className: classes.formControl },\r\n React.createElement(Autocomplete, { style: { width: 500 }, freeSolo: true, open: open, onOpen: () => setOpen(true), onClose: (event, reason) => setOpen(false), onChange: (event, app, reason) => {\r\n setSelectedApp(app);\r\n if (reason == 'clear') {\r\n setApplications([]);\r\n }\r\n }, getOptionSelected: (option, value) => option.name === value.name, getOptionLabel: option => option.name, options: applications, loading: loading, loadingText: translate('ra.action.loading'), renderInput: params => (React.createElement(TextField, Object.assign({}, params, { variant: \"outlined\", onChange: onSearch, label: translate('resources.apis.specification.actions.search_or_select_application'), InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React.createElement(React.Fragment, null,\r\n loading ? (React.createElement(CircularProgress, { color: \"inherit\", size: 20 })) : null,\r\n params.InputProps.endAdornment)) }) }))) })),\r\n React.createElement(Typography, { color: \"textSecondary\" }, translate('resources.apis.specification.actions.select_application'))),\r\n React.createElement(Grid, { item: true, xs: 5 }, selectedApp && (React.createElement(ApiApplicationCredentials, { id: selectedApp.id }))))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n fontFamily: theme.typography.body2.fontFamily,\r\n padding: '0px 20px',\r\n },\r\n formControl: {\r\n minWidth: '240px',\r\n },\r\n}), {\r\n name: 'Layer7ApiApplications',\r\n});\r\n//# sourceMappingURL=ApiApplications.js.map","import React from 'react';\r\nimport { useTranslate, useGetOne } from 'react-admin';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport SwaggerUI from 'swagger-ui-react';\r\nimport 'swagger-ui-react/swagger-ui.css';\r\nimport { makeStyles } from '@material-ui/core';\r\nexport const Swagger = ({ id }) => {\r\n const translate = useTranslate();\r\n const classes = useStyles();\r\n const { data, loaded, error } = useGetOne('specs', id);\r\n const DisableTryItOutPlugin = function () {\r\n return {\r\n statePlugins: {\r\n spec: {\r\n wrapSelectors: {\r\n allowTryItOutFor: () => () => false,\r\n },\r\n },\r\n },\r\n };\r\n };\r\n if (!loaded) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (!data || error) {\r\n return (React.createElement(Typography, { variant: \"body2\", color: \"error\" }, translate('ra.page.error')));\r\n }\r\n return (React.createElement(\"div\", { className: classes.swagger },\r\n React.createElement(SwaggerUI, { plugins: DisableTryItOutPlugin, spec: data })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n swagger: {\r\n backgroundColor: theme.palette.common.white,\r\n paddingTop: theme.spacing(1),\r\n paddingBottom: theme.spacing(1),\r\n marginTop: theme.spacing(1),\r\n borderRadius: theme.shape.borderRadius,\r\n },\r\n}), {\r\n name: 'Layer7Swagger',\r\n});\r\n//# sourceMappingURL=Swagger.js.map","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { ApiApplications } from './Application';\r\nimport { Swagger } from './Swagger';\r\nexport const ApiSpecs = ({ record }) => {\r\n const classes = useStyles();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(ApiApplications, { id: record.id }),\r\n React.createElement(Swagger, { id: record.id })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n color: theme.palette.secondary.main,\r\n fontWeight: theme.typography.fontWeightBold,\r\n padding: theme.spacing(),\r\n '& .swagger-ui .wrapper': {\r\n maxWidth: 'unset',\r\n },\r\n },\r\n}), {\r\n name: 'Layer7ApiSpecs',\r\n});\r\n//# sourceMappingURL=ApiSpecs.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { TabbedShowLayout, Tab, useGetOne, useQuery, CRUD_GET_ONE, } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport get from 'lodash/get';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Show } from '../ui';\r\nimport { ENTITY_TYPE_API } from '../dataProvider/documents';\r\nimport { CurrentUserId } from '../dataProvider/userContexts';\r\nimport { isPublisher } from '../userContexts';\r\nimport { ApiOverview } from './ApiOverview';\r\nimport { ApiDocumentation } from './ApiDocumentation';\r\nimport { ApiSpecs } from './ApiSpecs';\r\nexport const ApiShow = props => {\r\n const _a = useStyles(props), { root: rootClassName } = _a, classes = __rest(_a, [\"root\"]);\r\n const { id } = props, rest = __rest(props, [\"id\"]);\r\n const { data: userContexts } = useGetOne('userContexts', CurrentUserId, {\r\n action: CRUD_GET_ONE,\r\n });\r\n const { data: apisPermissions } = useQuery({\r\n type: 'getPermissions',\r\n resource: 'apis',\r\n payload: { id },\r\n });\r\n return (React.createElement(Show, Object.assign({ className: rootClassName, classes: classes, title: React.createElement(ApiTitle, null), id: id }, rest),\r\n React.createElement(ApiShowTabs, { userIsPublisher: isPublisher(userContexts), userCanEdit: get(apisPermissions, 'canEdit', false), userCanDelete: get(apisPermissions, 'canEdit', false) })));\r\n};\r\nexport const ApiShowTabs = props => {\r\n const translate = useTranslate();\r\n const { userIsPublisher, userCanEdit, userCanDelete } = props, rest = __rest(props, [\"userIsPublisher\", \"userCanEdit\", \"userCanDelete\"]);\r\n const showSpecs = !isSoapApi(props.record);\r\n return (React.createElement(TabbedShowLayout, Object.assign({}, rest),\r\n React.createElement(Tab, { label: translate('resources.apis.overview.title') },\r\n React.createElement(ApiOverview, { userIsPublisher: userIsPublisher })),\r\n showSpecs && (React.createElement(Tab, { label: translate('resources.apis.specification.title'), path: \"spec\" },\r\n React.createElement(ApiSpecs, null))),\r\n React.createElement(Tab, { label: translate('resources.apis.documentation.title'), path: \"doc\" },\r\n React.createElement(ApiDocumentation, { userCanEdit: userCanEdit, userCanDelete: userCanDelete, entityType: ENTITY_TYPE_API }))));\r\n};\r\nconst ApiTitle = (_a) => {\r\n var { record } = _a, rest = __rest(_a, [\"record\"]);\r\n const classes = useTitleStyles(rest);\r\n if (!record) {\r\n return null;\r\n }\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(\"span\", { className: classes.title }, record.name)));\r\n};\r\nexport const isSoapApi = record => {\r\n // The API type is defined as ssgServiceType in the API list page,\r\n // but as apiServiceType in the API show page.\r\n // The react-admin engine first renders the API show page with the data of the API list page\r\n // in order to improve the user experience.\r\n // So we need to test both names to avoid a visual glitch when rendering the Tabs.\r\n const type = get(record, 'apiServiceType', null) ||\r\n get(record, 'ssgServiceType', null);\r\n return type && type.toLowerCase() === 'soap';\r\n};\r\n// We don't need custom styles by default but this allows to\r\n// easily customize styles in the theme file directly\r\nconst useStyles = makeStyles({\r\n root: {},\r\n card: {},\r\n}, {\r\n name: 'Layer7ApiShow',\r\n});\r\nconst useTitleStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {},\r\n}), {\r\n name: 'Layer7ApplicationTitle',\r\n});\r\n//# sourceMappingURL=ApiShow.js.map","import { ApiList } from './ApiList';\r\nimport { ApiShow } from './ApiShow';\r\nimport { IconApi } from '../ui/icons';\r\nexport const apis = {\r\n icon: IconApi,\r\n list: ApiList,\r\n show: ApiShow,\r\n};\r\nexport * from './ApiList';\r\nexport * from './ApiShow';\r\nexport * from './ApiCard';\r\n//# sourceMappingURL=index.js.map","export default __webpack_public_path__ + \"static/media/BannerCsob.ca6bb250.jpg\";","import React from 'react';\r\nimport { theme as mytheme } from '../theme';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Link from '@material-ui/core/Link';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Card from '@material-ui/core/Card';\r\nimport Box from '@material-ui/core/Box';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Container from '@material-ui/core/Container';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { useAuthState } from 'ra-core';\r\nimport { Redirect } from 'react-router';\r\n\r\nimport { UnAuthenticatedLayoutWithTheme } from '../layout';\r\nimport BannerCsob from '../ui/BannerCsob.jpg';\r\nimport ContactImg from '../ui/image/contact.png';\r\nimport OpenBankingImg from '../ui/image/csob-open-banking-and-others.png';\r\nimport DocumentationImg from '../ui/image/documentation-api.png';\r\nimport HowToImg from '../ui/image/wiki-how-to.png';\r\nimport RegistrationImg from '../ui/image/registration.png';\r\n\r\nexport const LandingPage = () => {\r\n const classes = useStyles();\r\n const { loading, authenticated } = useAuthState();\r\n\r\n if (loading) {\r\n return null;\r\n }\r\n const isGuest = localStorage.getItem('isGuest');\r\n if (authenticated && isGuest === 'false') {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n The building blocks\r\n
\r\n for API management\r\n \r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n Documentation\r\n \r\n \r\n The documentation describes individual\r\n services and the process how to use them\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n Registration\r\n \r\n \r\n Create an account and start using our\r\n open banking APIs\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n List of APIs\r\n \r\n \r\n Explore published APIs, find out which\r\n ones you may benefit from and how\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n How To\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n Drop us a line\r\n \r\n \r\n Need a question answered before signing\r\n up?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n bannerContainer: {\r\n position: 'relative',\r\n backgroundColor: mytheme.palette.secondary.darkBlue,\r\n },\r\n bannerContent: {\r\n '& img': {\r\n display: 'flex',\r\n width: '100%',\r\n },\r\n },\r\n bannerText: {\r\n position: 'absolute',\r\n top: '110px',\r\n paddingLeft: theme.spacing(20),\r\n color: theme.palette.common.white,\r\n fontWeight: 300,\r\n [theme.breakpoints.down('md')]: {\r\n fontSize: '40px',\r\n top: '70px',\r\n paddingLeft: theme.spacing(10),\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n fontSize: '30px',\r\n top: '45px',\r\n paddingLeft: theme.spacing(5),\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n fontSize: '20px',\r\n top: '40px',\r\n paddingLeft: theme.spacing(5),\r\n },\r\n },\r\n button: {},\r\n cards: {\r\n alignItems: 'stretch',\r\n justifyContent: 'center',\r\n '& > li': {\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n },\r\n },\r\n item: {\r\n marginTop: theme.spacing(4),\r\n },\r\n card: {\r\n borderRadius: theme.spacing(1),\r\n textAlign: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n width: '100%',\r\n '& > :first-child': {\r\n flex: 1,\r\n paddingTop: theme.spacing(4),\r\n },\r\n '& h4': {\r\n marginTop: theme.spacing(4),\r\n marginBottom: theme.spacing(4),\r\n },\r\n '& img': {\r\n width: '100%',\r\n },\r\n },\r\n link: {\r\n color: mytheme.palette.secondary.darkBlue,\r\n '& h4': {\r\n color: mytheme.palette.secondary.lightBlue,\r\n },\r\n '&:hover': {\r\n color: mytheme.palette.secondary.darkBlue,\r\n textDecoration: 'none',\r\n outline: 'none',\r\n '& h4': {\r\n color: mytheme.palette.secondary.darkBlue,\r\n },\r\n },\r\n },\r\n}));\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Divider from '@material-ui/core/Divider';\n\nexport const ApplicationTitle = ({ record, ...rest }) => {\n const classes = useTitleStyles(rest);\n\n if (!record) {\n return null;\n }\n\n return (\n \n );\n};\n\nconst useTitleStyles = makeStyles(\n theme => ({\n root: {},\n title: {},\n divider: {\n marginTop: theme.spacing(2),\n backgroundColor: theme.palette.grey[300],\n },\n status: {\n padding: theme.spacing(1, 0),\n },\n }),\n {\n name: 'HealthcareApplicationTitle',\n }\n);\n","import React from 'react';\nimport classnames from 'classnames';\nimport { useTranslate } from 'ra-core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nexport const ApplicationStatus = ({ record, variant = 'caption', ...rest }) => {\n const classes = useStyles(rest);\n const translate = useTranslate();\n\n if (!record) {\n return null;\n }\n\n return (\n \n {record.status && (\n \n {translate(\n `resources.applications.status.${record.status.toLowerCase()}`\n )}\n \n )}\n
\n );\n};\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n width: 'auto',\n },\n status: {\n fontWeight: '500',\n },\n }),\n {\n name: 'HealthcareApplicationStatus',\n }\n);\n\nconst useIconStyles = makeStyles(\n theme => ({\n root: {\n width: theme.spacing(2),\n height: theme.spacing(2),\n borderRadius: 99999,\n },\n enabled: {\n backgroundColor: theme.palette.success.main,\n },\n rejected: {\n backgroundColor: theme.palette.error.main,\n },\n disabled: {\n backgroundColor: theme.palette.text.disabled,\n },\n }),\n {\n name: 'HealthcareApplicationStatusIcon',\n }\n);\n\nexport const ApplicationStatusIcon = ({ record, ...rest }) => {\n const classes = useIconStyles(rest);\n\n return (\n \n );\n};\n","import React from 'react';\nimport { ApiCard } from 'layer7-apihub';\nimport { useQuery } from 'react-admin';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Grid from '@material-ui/core/Grid';\n\nexport const ApplicationApisList = ({ apis, ...rest }) => {\n const classes = useStyles(rest);\n const carouselClasses = useCarouselStyles(rest);\n\n const { data = [] } = useQuery({\n type: 'getApis',\n resource: 'apis',\n });\n\n const appApis = apis ? getAppApis(data, apis) : [];\n\n if (!appApis || appApis.length === 0) {\n return null;\n }\n\n return (\n \n {appApis.map(api => (\n \n \n \n ))}\n \n );\n};\n\nconst getAppApis = (allApis, selectedApis) =>\n allApis.filter(api => selectedApis.includes(api.id));\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n margin: theme.spacing(2, 1),\n },\n }),\n {\n name: 'HealthcareApplicationApisList',\n }\n);\n\nconst useCarouselStyles = makeStyles(\n theme => ({\n root: {},\n buttonWrapper: {\n '&:hover': {\n '& $button': {\n backgroundColor: theme.palette.secondary.lightBlue,\n filter: 'brightness(100%)',\n opacity: '1 !important',\n },\n },\n },\n button: {\n backgroundColor: `${theme.palette.secondary.lightBlue} !important`,\n color: theme.palette.common.white,\n '&:hover': {\n opacity: 1,\n },\n },\n buttonVisible: {\n opacity: 1,\n },\n buttonHidden: {\n opacity: 0,\n },\n next: {},\n prev: {},\n }),\n {\n name: 'HealthcareApplicationApisCarousel',\n }\n);\n","/* eslint-disable */\nimport React from 'react';\nimport classnames from 'classnames';\nimport { Labeled, TextField } from 'react-admin';\nimport { useTranslate } from 'ra-core';\nimport {\n IconApi,\n ApplicationDetailsOverviewField,\n ApplicationKeyClient,\n ApplicationKeySecret,\n useUserContext,\n} from 'layer7-apihub';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { ApplicationStatus, ApplicationStatusIcon } from './ApplicationStatus';\nimport { ApplicationApisList } from './ApplicationApisList';\n\nexport const ApplicationDetails = ({ record }) => {\n const classes = useStyles();\n const gridClasses = useGridStyles();\n const rightGridClasses = useRightGridStyles();\n const contentClasses = useContentStyles();\n const headerClasses = useHeaderStyles();\n const applicationDetailsOverviewClasses = useOverviewStyles();\n const translate = useTranslate();\n\n const apiIds = (record.apiIds && record.apiIds.results) || [];\n\n const [userContext] = useUserContext();\n const canEdit = userContext?.userDetails?.portalAdmin || false;\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {/* commented comment \n \n \n \n {translate(\n 'resources.applications.notifications.configuration'\n )}\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n */}\n \n \n \n \n \n {apiIds.length} APIs Included\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n display: 'flex',\n fontFamily: theme.typography.body2.fontFamily,\n fontSize: theme.typography.caption.fontSize,\n margin: theme.spacing(0),\n },\n informations: {\n '&.MuiGrid-item': {\n backgroundColor: theme.palette.secondary.bgDarkBlue,\n paddingTop: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n paddingLeft: theme.spacing(4),\n paddingRight: theme.spacing(4),\n },\n '& label': {\n color: theme.palette.secondary.darkBlue,\n fontSize: '1rem',\n },\n '& label ~ div': {\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.secondary.darkBlue,\n padding: theme.spacing(0),\n },\n },\n details: {\n '&.MuiGrid-item': {\n paddingTop: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n paddingLeft: theme.spacing(4),\n paddingRight: theme.spacing(4),\n },\n '& label, & h3': {\n fontWeight: 'normal',\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(2),\n },\n '& label': {\n color: theme.palette.secondary.darkBlue,\n },\n '& h3': {\n marginTop: theme.spacing(4),\n },\n '& label ~ div': {\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(0),\n },\n },\n configuration: {\n '&.MuiGrid-item': {\n backgroundColor: theme.palette.secondary.darkWhite,\n paddingTop: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n paddingLeft: theme.spacing(4),\n paddingRight: theme.spacing(7),\n },\n '& label, & h3': {\n color: theme.palette.secondary.lightBlue,\n fontWeight: 'normal',\n marginTop: theme.spacing(2),\n },\n '& h3': {\n backgroundColor: theme.palette.secondary.bgDarkBlue,\n padding: theme.spacing(1, 2),\n maxWidth: '125px',\n marginTop: theme.spacing(4),\n },\n '& label ~ div': {\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(0),\n },\n },\n subtitleContainer: {\n color: theme.palette.secondary.lightBlue,\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'flex-start',\n borderTopStyle: 'solid',\n borderTopWidth: '1px',\n borderTopColor: theme.palette.secondary.bgDarkBlue,\n margin: theme.spacing(6, 1, 2, 1),\n },\n subtitle: {\n backgroundColor: theme.palette.secondary.bgDarkBlue,\n color: theme.palette.secondary.lightBlue,\n textTransform: 'uppercase',\n fontWeight: '700 !important',\n fontSize: '0.8rem',\n padding: theme.spacing(1, 2),\n marginTop: '0px !important',\n },\n field: {\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(1),\n minWidth: '100px',\n width: '100%',\n },\n type: {\n textTransform: 'uppercase',\n },\n icon: {\n fontSize: '1rem',\n },\n apiIcon: {\n color: theme.palette.secondary.lightBlue,\n },\n }),\n {\n name: 'HealthcareApplicationDetails',\n }\n);\n\nconst useOverviewStyles = makeStyles(\n theme => ({\n markdown: {\n overflowY: 'scroll',\n height: '200px',\n paddingRight: theme.spacing(2),\n },\n }),\n {\n name: 'HealthcareApplicationDetailsOverview',\n }\n);\n\nconst useHeaderStyles = makeStyles(\n theme => ({\n label: {\n textTransform: 'uppercase',\n },\n value: {\n fontSize: '1.25rem',\n color: theme.palette.secondary.darkBlue,\n },\n icon: {\n marginRight: theme.spacing(2),\n color: theme.palette.secondary.darkBlue,\n },\n }),\n {\n name: 'HealthcareApplicationDetailsHeader',\n }\n);\n\nconst useContentStyles = makeStyles(\n theme => ({\n label: {\n fontWeight: theme.typography.fontWeightBold,\n fontSize: '1.5rem',\n },\n }),\n {\n name: 'HealthcareApplicationDetailsContent',\n }\n);\n\nconst useGridStyles = makeStyles(\n theme => ({\n root: {\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n }),\n {\n name: 'HealthcareApplicationDetailsGrid',\n }\n);\n\nconst useRightGridStyles = makeStyles(\n theme => ({\n root: {\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderLeft: `1px solid ${theme.palette.divider}`,\n },\n }),\n {\n name: 'HealthcareApplicationDetailsRightGrid',\n }\n);\n","import React from 'react';\nimport { Show } from 'layer7-apihub';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { ApplicationTitle } from './ApplicationTitle';\nimport { ApplicationDetails } from './ApplicationDetails';\n\nexport const ApplicationShow = props => {\n const { root: rootClassName, ...classes } = useStyles(props);\n const { permissions, id, ...rest } = props;\n\n return (\n }\n id={id}\n {...rest}\n >\n \n \n );\n};\n\nconst useStyles = makeStyles(\n {\n root: {},\n card: {},\n },\n {\n name: 'HealthcareApplicationShow',\n }\n);\n","import { applications as defaultApplications } from 'layer7-apihub';\n\nimport { ApplicationShow } from './ApplicationShow';\n\nexport const applications = {\n ...defaultApplications,\n show: ApplicationShow,\n};\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { cloneElement } from 'react';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { HideOnScroll, LoadingIndicator, useLocale } from 'react-admin';\r\nimport { ApiHubUserMenu } from './ApiHubUserMenu';\r\nimport { ApiHubLanguageSwitcher } from './ApiHubLanguageSwitcher';\r\nimport { SidebarButton } from './SidebarButton';\r\n/**\r\n * The ApiHub AppBar used in the ApiHub Layout.\r\n *\r\n * @param {*} props AppBar properties\r\n */\r\nexport const ApiHubAppBar = (_a) => {\r\n var { children, classes: classesOverride, className, languagesMenu, logo, logout, open, sidebarButton, title, userMenu } = _a, rest = __rest(_a, [\"children\", \"classes\", \"className\", \"languagesMenu\", \"logo\", \"logout\", \"open\", \"sidebarButton\", \"title\", \"userMenu\"]);\r\n const classes = useStyles({ classes: classesOverride });\r\n useLocale(); // Make sure the locale change would rerender the component\r\n return (React.createElement(HideOnScroll, null,\r\n React.createElement(AppBar, Object.assign({ className: className, color: \"secondary\", elevation: 0 }, rest),\r\n React.createElement(Toolbar, { disableGutters: true, variant: \"regular\", className: classes.toolbar },\r\n cloneElement(sidebarButton, { open }),\r\n React.createElement(\"div\", { className: classes.header }, children),\r\n React.createElement(LoadingIndicator, null),\r\n cloneElement(languagesMenu),\r\n React.createElement(Divider, { className: classes.divider, orientation: \"vertical\" }),\r\n cloneElement(userMenu, { logout })))));\r\n};\r\nApiHubAppBar.defaultProps = {\r\n userMenu: React.createElement(ApiHubUserMenu, null),\r\n languagesMenu: React.createElement(ApiHubLanguageSwitcher, null),\r\n sidebarButton: React.createElement(SidebarButton, null),\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n paddingRight: 24,\r\n },\r\n header: {\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n minWidth: '156px',\r\n },\r\n divider: {\r\n alignSelf: 'stretch',\r\n backgroundColor: theme.palette.primary.contrastText,\r\n height: 'auto',\r\n marginBottom: theme.spacing(2),\r\n marginLeft: theme.spacing(4),\r\n marginRight: theme.spacing(4),\r\n marginTop: theme.spacing(2),\r\n },\r\n}), {\r\n name: 'Layer7AppBar',\r\n});\r\n//# sourceMappingURL=ApiHubAppBar.js.map","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nexport const IconWiki = props => {\r\n return (React.createElement(SvgIcon, Object.assign({ viewBox: \"0 0 24 24\", fontSize: \"small\" }, props),\r\n React.createElement(\"path\", { d: \"M20 0v2h-18v18h-2v-20h20zm-7.281 20.497l-.719 3.503 3.564-.658-2.845-2.845zm8.435-8.436l2.846 2.845-7.612 7.612-2.845-2.845 7.611-7.612zm-17.154-8.061v20h6v-2h-4v-16h16v4.077l2 2v-8.077h-20z\" })));\r\n};\r\n//# sourceMappingURL=IconWiki.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { MenuItemLink } from 'react-admin';\r\nimport { useSelector } from 'react-redux';\r\nimport classnames from 'classnames';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles, useMediaQuery } from '@material-ui/core';\r\nimport { IconApi, IconApps, IconWiki } from './ui/icons';\r\n/**\r\n * The ApiHub Menu used in the ApiHub Sidebar.\r\n *\r\n * Inspired by https://github.com/marmelab/react-admin/blob/2c167a4693b4ca060f72b272f19e9af8f41eb091/packages/ra-ui-materialui/src/layout/Menu.tsx\r\n *\r\n * @param {*} props Menu properties\r\n */\r\nexport const ApiHubMenu = props => {\r\n const { classes: classesOverride, className, dense, hasDashboard, onMenuClick = () => null, logout } = props, rest = __rest(props, [\"classes\", \"className\", \"dense\", \"hasDashboard\", \"onMenuClick\", \"logout\"]);\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const isXSmall = useMediaQuery(theme => theme.breakpoints.down('xs'));\r\n const open = useSelector(state => state.admin.ui.sidebarOpen);\r\n // Used to force redraw on navigation\r\n useSelector(state => state.router.location.pathname);\r\n const ApplicationShow = () => {\r\n if (localStorage.getItem('username') != 'guest') {\r\n return (React.createElement(MenuItemLink, { key: \"applications\", to: \"/applications\", primaryText: translate(`resources.applications.name`, {\r\n smart_count: 2,\r\n }), leftIcon: React.createElement(IconApps, null), onClick: onMenuClick, dense: dense, sidebarIsOpen: open }));\r\n }\r\n return '';\r\n };\r\n return (React.createElement(\"div\", Object.assign({ className: classnames(classes.main, className) }, rest),\r\n React.createElement(MenuItemLink, { key: \"apis\", to: \"/apis\", primaryText: translate(`resources.apis.name`, {\r\n smart_count: 2,\r\n }), leftIcon: React.createElement(IconApi, null), onClick: onMenuClick, dense: dense, sidebarIsOpen: open }),\r\n React.createElement(ApplicationShow, null),\r\n React.createElement(MenuItemLink, { key: \"documents\", to: \"/howto\", primaryText: translate(`resources.documents.name`, {\r\n smart_count: 2,\r\n }), leftIcon: React.createElement(IconWiki, null), onClick: onMenuClick, dense: dense, sidebarIsOpen: open }),\r\n isXSmall && logout));\r\n};\r\nconst useStyles = makeStyles({\r\n main: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'flex-start',\r\n },\r\n}, { name: 'RaMenu' });\r\n//# sourceMappingURL=ApiHubMenu.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { Layout } from 'react-admin';\r\nimport { ApiHubAppBar } from './ApiHubAppBar';\r\nimport { ApiHubMenu } from './ApiHubMenu';\r\nimport { useSelector } from 'react-redux';\r\n/**\r\n * The ApiHub Layout used in the ApiHub Admin.\r\n *\r\n * @param {*} appBar The AppBar component\r\n * @param {*} sidebar The Sidebar component\r\n * @param {*} menu The Menu component\r\n * @param {*} rest The other Layout properties\r\n */\r\nexport const ApiHubLayout = (_a) => {\r\n var { appBar = ApiHubAppBar, menu = ApiHubMenu } = _a, rest = __rest(_a, [\"appBar\", \"menu\"]);\r\n // In order to let the components use Redux-based dataProvider\r\n // hooks like useGetOne, we must wait for the resource registration before\r\n // displaying the dashboard.\r\n // This fix should be reverted after the release of React Admin v3.6.3.\r\n const resourcesAreRegistered = useSelector(state => Object.keys(state.admin.resources).length > 0);\r\n if (!resourcesAreRegistered) {\r\n return null;\r\n }\r\n return React.createElement(Layout, Object.assign({ appBar: appBar, menu: menu }, rest));\r\n};\r\n//# sourceMappingURL=ApiHubLayout.js.map","import React from 'react';\nimport { useTranslate } from 'ra-core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Divider from '@material-ui/core/Divider';\n\nconst useTitleStyles = makeStyles(\n theme => ({\n root: {},\n title: {},\n divider: {\n marginTop: theme.spacing(2),\n backgroundColor: theme.palette.grey[300],\n },\n }),\n {\n name: 'HealthcareDocumentTitle',\n }\n);\n\nexport const DocumentTitle = props => {\n const classes = useTitleStyles(props);\n const translate = useTranslate();\n\n return (\n \n
\n {translate(`resources.documents.name`, {\n smart_count: 2,\n })}\n \n
\n
\n );\n};\n","import { documents as defaultDocuments } from 'layer7-apihub';\nimport { DocumentList } from './DocumentList';\n\nexport const documents = {\n ...defaultDocuments,\n list: DocumentList,\n};\n","import React from 'react';\nimport { DocumentList as DefaultDocumentList } from 'layer7-apihub';\n\nimport { DocumentTitle } from './DocumentTitle';\n\nexport const DocumentList = props => {\n return } {...props} />;\n};\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { SaveButton, Toolbar } from 'react-admin';\r\nimport { ValidationError } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport get from 'lodash/get';\r\n/**\r\n * The SignUp Toolbar displaying the submit button and the possible errors of signup form\r\n *\r\n * @param {string} button.color The color of the submit button\r\n * @param {string} button.variant The variant of the submit button\r\n * @param {string} button.size The size of the submit button\r\n *\r\n */\r\nexport const SignUpToolbar = props => {\r\n const { loading = false, error = null } = props, rest = __rest(props, [\"loading\", \"error\"]);\r\n const classes = useStyles(rest);\r\n const { button } = props;\r\n const color = get(button, 'color', 'primary');\r\n const variant = get(button, 'variant', 'outlined');\r\n const size = get(button, 'size', 'small');\r\n return (React.createElement(React.Fragment, null,\r\n error ? (React.createElement(Typography, { variant: \"body1\", color: \"error\", className: classes.error },\r\n React.createElement(ValidationError, { error: error }))) : null,\r\n React.createElement(Toolbar, Object.assign({ className: classes.toolbar }, rest),\r\n React.createElement(SaveButton, { icon: loading ? (React.createElement(CircularProgress, { className: classes.circularProgress, size: 15 })) : (React.createElement(\"span\", null)), label: \"resources.registrations.actions.submit\", color: color, variant: variant, size: size }))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'stretch',\r\n flexBasis: '100%',\r\n backgroundColor: 'transparent',\r\n padding: 0,\r\n },\r\n circularProgress: {\r\n color: theme.palette.grey[500],\r\n },\r\n}), {\r\n name: 'Layer7SignUpToolbar',\r\n});\r\n//# sourceMappingURL=SignUpToolbar.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { Slider } from '@material-ui/core';\r\nexport const ConfirmSlider = (_a) => {\r\n var { classes, confirmed = false, onChange = () => { } } = _a, rest = __rest(_a, [\"classes\", \"confirmed\", \"onChange\"]);\r\n return (React.createElement(Slider, Object.assign({ disabled: confirmed, classes: classes, onChange: onChange }, rest)));\r\n};\r\n//# sourceMappingURL=ConfirmSlider.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { email, required, SimpleForm, TextInput, useTranslate, } from 'react-admin';\r\nimport { makeStyles, Link, Typography } from '@material-ui/core';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { SignUpToolbar } from './SignUpToolbar';\r\nimport { ConfirmSlider } from '../../ui';\r\nimport { getErrorMessage } from '../../useLayer7Notify';\r\nexport const SignUpForm = props => {\r\n const classes = useStyles(props);\r\n const { onSubmit = () => { }, toolbarProps, serverError } = props;\r\n let showError = false;\r\n const { title, form, colorAlert, colorTextSecondary, confirmSliderHeader } = classes, sliderClasses = __rest(classes, [\"title\", \"form\", \"colorAlert\", \"colorTextSecondary\", \"confirmSliderHeader\"]);\r\n const translate = useTranslate();\r\n const [formConfirmed, setFormConfirmed] = useState(false);\r\n const [showSliderAlert, setShowSliderAlert] = useState(false);\r\n const [sliderLabelColor, setSliderLabelColor] = useState('textPrimary');\r\n const submit = data => {\r\n const { EmailConfirmation } = data, registration = __rest(data, [\"EmailConfirmation\"]);\r\n if (!formConfirmed) {\r\n setShowSliderAlert(true);\r\n return;\r\n }\r\n onSubmit(registration);\r\n };\r\n const sliderChange = (event, value) => {\r\n if (value === 100) {\r\n setFormConfirmed(true);\r\n setSliderLabelColor('textSecondary');\r\n setShowSliderAlert(false);\r\n }\r\n else {\r\n setFormConfirmed(false);\r\n }\r\n };\r\n const validate = () => {\r\n if (!isEmpty(serverError) && !showError) {\r\n const { error } = serverError;\r\n const message = getErrorMessage(error);\r\n showError = true;\r\n return {\r\n OrganizationName: message,\r\n };\r\n }\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(SimpleForm, { className: classes.form, save: submit, toolbar: React.createElement(SignUpToolbar, Object.assign({}, toolbarProps)), redirect: false, validate: validate },\r\n React.createElement(TextInput, { source: \"Email\", type: \"email\", label: \"resources.registrations.fields.email\", variant: \"outlined\", fullWidth: true, validate: ValidateEmail }),\r\n React.createElement(TextInput, { source: \"EmailConfirmation\", type: \"email\", label: \"resources.registrations.fields.email_confirmation\", variant: \"outlined\", fullWidth: true, validate: ValidateEmailConfirmation }),\r\n React.createElement(TextInput, { source: \"OrganizationName\", type: \"text\", label: \"resources.registrations.fields.organization\", variant: \"outlined\", fullWidth: true }),\r\n React.createElement(TextInput, { source: \"OrganizationDescription\", type: \"text\", label: \"resources.registrations.fields.organization_description\", variant: \"outlined\", fullWidth: true, multiline: true }),\r\n React.createElement(React.Fragment, null,\r\n React.createElement(ConfirmSliderHeader, { classes: classes, sliderLabelColor: sliderLabelColor, showAlert: showSliderAlert }),\r\n React.createElement(ConfirmSlider, { confirmed: formConfirmed, classes: sliderClasses, onChange: sliderChange, ThumbComponent: ConfirmSliderThumb }))),\r\n React.createElement(Typography, { variant: \"body1\", align: \"center\" },\r\n React.createElement(Link, { component: RouterLink, to: \"/login\" }, translate('resources.registrations.actions.login')))));\r\n};\r\nconst ValidateEmail = [required(), email()];\r\nconst ValidateEmailConfirmation = [\r\n required(),\r\n email(),\r\n validateAreEqual('Email', 'EmailConfirmation'),\r\n];\r\nexport function validateAreEqual(field1, field2, message = 'resources.registrations.notifications.email_confirmation_error') {\r\n return (value, allValues) => {\r\n return allValues[field1] === allValues[field2] ? undefined : message;\r\n };\r\n}\r\nconst ConfirmSliderThumb = props => {\r\n const translate = useTranslate();\r\n return (React.createElement(Typography, Object.assign({ variant: \"body2\", align: \"center\" }, props), props.confirmed\r\n ? translate('resources.registrations.slider.confirmed')\r\n : translate('resources.registrations.slider.unconfirmed')));\r\n};\r\nconst ConfirmSliderHeader = (_a) => {\r\n var { classes, showAlert, sliderLabelColor } = _a, rest = __rest(_a, [\"classes\", \"showAlert\", \"sliderLabelColor\"]);\r\n const translate = useTranslate();\r\n return (React.createElement(\"div\", { className: classes.confirmSliderHeader },\r\n React.createElement(Typography, { gutterBottom: true, color: sliderLabelColor, classes: {\r\n colorTextSecondary: classes.colorTextSecondary,\r\n } }, translate('resources.registrations.fields.robot')),\r\n showAlert && (React.createElement(Typography, { variant: \"caption\", gutterBottom: true, color: \"textPrimary\", classes: { colorTextPrimary: classes.colorAlert } }, translate('resources.registrations.notifications.confirmation_required')))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n form: {\r\n '& >:first-child': {\r\n padding: 0,\r\n },\r\n },\r\n title: {\r\n fontSize: theme.typography.fontSize * 2,\r\n marginBottom: theme.spacing(6),\r\n color: theme.palette.getContrastText(theme.palette.background.default),\r\n },\r\n root: {\r\n margin: '-15px 0 20px 0',\r\n width: '50%',\r\n },\r\n thumb: {\r\n height: 38,\r\n width: '100%',\r\n backgroundColor: theme.palette.grey[500],\r\n color: theme.palette.grey[800],\r\n borderRadius: 2,\r\n marginTop: -2,\r\n marginLeft: 0,\r\n '&:focus, &:hover, &$active': {\r\n boxShadow: 'inherit',\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[300],\r\n },\r\n '&$disabled': {\r\n height: 38,\r\n width: '100%',\r\n backgroundColor: theme.palette.success.dark,\r\n color: theme.palette.common.white,\r\n borderRadius: 2,\r\n marginTop: -2,\r\n marginLeft: 0,\r\n },\r\n },\r\n rail: {\r\n height: 34,\r\n borderRadius: 2,\r\n width: '200%',\r\n },\r\n track: {\r\n height: 34,\r\n borderRadius: 2,\r\n },\r\n disabled: {},\r\n colorTextSecondary: {\r\n color: theme.palette.success.dark,\r\n },\r\n colorAlert: {\r\n color: theme.palette.error.main,\r\n },\r\n confirmSliderHeader: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'baseline',\r\n },\r\n}), {\r\n name: 'Layer7SignUpForm',\r\n});\r\n//# sourceMappingURL=SignUpForm.js.map","import React from 'react';\nimport { ApiList as DefaultApiList } from 'layer7-apihub';\nimport { useTranslate } from 'ra-core';\nimport {\n Filter,\n SearchInput,\n SelectInput,\n SelectArrayInput,\n ReferenceArrayInput,\n //ReferenceInput,\n} from 'react-admin';\nimport { makeStyles } from '@material-ui/core/styles';\n\nexport const ApiList = props => (\n } {...props} />\n);\n\nconst ApiFilter = props => {\n const translate = useTranslate();\n const classes = useApiFilterStyles();\n\n return (\n \n \n \n \n \n \n \n \n {/*\n \n */}\n \n );\n};\n\nconst useApiFilterStyles = makeStyles({\n searchInput: {\n minWidth: '300px',\n },\n});\n","import { apis as defaultApis } from 'layer7-apihub';\nimport { ApiList } from './ApiList';\n\nexport const apis = {\n ...defaultApis,\n list: ApiList,\n};\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState, forwardRef } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\r\nimport classnames from 'classnames';\r\nexport const LocaleSwitcherMenu = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const { onChange, locale, locales, className } = props, rest = __rest(props, [\"onChange\", \"locale\", \"locales\", \"className\"]);\r\n const classes = useStyles(props);\r\n const open = Boolean(anchorEl);\r\n const handleMenu = event => setAnchorEl(event.currentTarget);\r\n const handleClose = () => setAnchorEl(null);\r\n const handleSetLocale = newLocale => {\r\n onChange(newLocale);\r\n handleClose();\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Button, Object.assign({ \"aria-owns\": open ? 'menu-appbar' : null, \"aria-haspopup\": true, color: \"inherit\", variant: \"text\", className: classnames(classes.button, className), onClick: handleMenu, endIcon: React.createElement(ArrowDropDownIcon, null) }, rest), locales[locale]),\r\n React.createElement(Menu, { id: \"menu-appbar\", anchorEl: anchorEl, anchorOrigin: {\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }, transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }, open: open, onClose: handleClose }, Object.keys(locales).map(key => (React.createElement(LocaleSwitcherMenuItem, { key: key, locale: key, onSetLocale: handleSetLocale }, locales[key]))))));\r\n};\r\nexport const LocaleSwitcherMenuItem = forwardRef((_a, ref) => {\r\n var { locale, onSetLocale } = _a, props = __rest(_a, [\"locale\", \"onSetLocale\"]);\r\n return (React.createElement(MenuItem, Object.assign({ ref: ref, onClick: () => onSetLocale(locale) }, props)));\r\n});\r\nconst useStyles = makeStyles({\r\n button: {\r\n textTransform: 'none',\r\n },\r\n}, {\r\n name: 'Layer7LocaleSwitcherMenu',\r\n});\r\n//# sourceMappingURL=LocaleSwitcherMenu.js.map","import React, { useEffect } from 'react';\r\nimport { useSetLocale, useLocale } from 'ra-core';\r\nimport { LocaleSwitcherMenu, supportedLocales, defaultLocale } from './i18n';\r\nimport { useApiHubPreference } from './preferences';\r\nexport const ApiHubLanguageSwitcher = () => {\r\n const setLocale = useSetLocale();\r\n const locale = useLocale();\r\n const [localePreference, writeLocalePreference] = useApiHubPreference('locale');\r\n useEffect(() => {\r\n if (!supportedLocales[localePreference]) {\r\n writeLocalePreference(defaultLocale);\r\n return;\r\n }\r\n if (localePreference !== locale) {\r\n setLocale(localePreference);\r\n }\r\n }, [locale, localePreference, setLocale, writeLocalePreference]);\r\n const handleLocaleChange = newLocale => {\r\n writeLocalePreference(newLocale);\r\n };\r\n return (React.createElement(LocaleSwitcherMenu, { locale: locale, locales: supportedLocales, onChange: handleLocaleChange }));\r\n};\r\n//# sourceMappingURL=ApiHubLanguageSwitcher.js.map","import React from 'react';\r\nimport { SaveButton, Toolbar } from 'react-admin';\r\nimport { ValidationError } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { FormSpy } from 'react-final-form';\r\nimport get from 'lodash/get';\r\n/**\r\n * The New Password Toolbar displaying the submit button and the possible errors of the new password form\r\n *\r\n * @param {string} button.color The color of the submit button\r\n * @param {string} button.variant The variant of the submit button\r\n * @param {string} button.size The size of the submit button\r\n *\r\n */\r\nexport const NewPasswordToolbar = props => {\r\n const classes = useStyles(props);\r\n const { button } = props;\r\n const color = get(button, 'color', 'primary');\r\n const variant = get(button, 'variant', 'outlined');\r\n const size = get(button, 'size', 'small');\r\n return (React.createElement(FormSpy, { subscription: subscription }, ({ error, touched }) => {\r\n const showError = error && touched.password && touched.confirm_password;\r\n return (React.createElement(React.Fragment, null,\r\n showError ? (React.createElement(Typography, { variant: \"body1\", color: \"error\", className: classes.error },\r\n React.createElement(ValidationError, { error: error }))) : null,\r\n React.createElement(Toolbar, Object.assign({ className: classes.toolbar }, props),\r\n React.createElement(SaveButton, { className: classes.submit, icon: React.createElement(\"span\", null), label: \"apihub.new_password.actions.change_password\", color: color, variant: variant, size: size }))));\r\n }));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'stretch',\r\n flexBasis: '100%',\r\n backgroundColor: 'transparent',\r\n padding: 0,\r\n marginTop: theme.spacing(2),\r\n },\r\n error: {\r\n marginTop: theme.spacing(2),\r\n },\r\n success: {\r\n color: theme.palette.success.main,\r\n marginTop: theme.spacing(2),\r\n },\r\n submit: {},\r\n}), {\r\n name: 'Layer7NewPasswordToolbar',\r\n});\r\nconst subscription = { error: true, touched: true, submitSucceeded: true };\r\n//# sourceMappingURL=NewPasswordToolbar.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { SimpleForm } from 'react-admin';\r\nimport { required } from 'ra-core';\r\nimport { FORM_ERROR } from 'final-form';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { NewPasswordToolbar } from './NewPasswordToolbar';\r\nimport { PasswordInput } from '../../ui';\r\nimport { validatePassword } from '../validatePassword';\r\nexport const NewPasswordForm = props => {\r\n const { onSubmit, toolbarProps } = props, rest = __rest(props, [\"onSubmit\", \"toolbarProps\"]);\r\n const classes = useStyles(props);\r\n const validate = ({ password, confirm_password }) => {\r\n if (password !== confirm_password) {\r\n return {\r\n [FORM_ERROR]: 'apihub.new_password.validation.error_password_match',\r\n };\r\n }\r\n };\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(SimpleForm, Object.assign({ className: classes.form, save: onSubmit, toolbar: React.createElement(NewPasswordToolbar, Object.assign({}, toolbarProps)), validate: validate }, rest),\r\n React.createElement(PasswordInput, { source: \"password\", label: \"apihub.new_password.fields.password\", fullWidth: true, variant: \"outlined\", validate: [required(), validatePassword], title: \"apihub.new_password.validation.tooltip_password\" }),\r\n React.createElement(PasswordInput, { source: \"confirm_password\", label: \"apihub.new_password.fields.confirm_password\", variant: \"outlined\", fullWidth: true, validate: required(), title: \"apihub.new_password.validation.tooltip_password_confirm\" }))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n form: {\r\n '& >:first-child': {\r\n padding: 0,\r\n },\r\n '& .ra-input': {\r\n marginTop: theme.spacing(2),\r\n },\r\n },\r\n}), {\r\n name: 'Layer7NewPasswordForm',\r\n});\r\n//# sourceMappingURL=NewPasswordForm.js.map","import React from 'react';\r\nimport { SaveButton, Toolbar } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport get from 'lodash/get';\r\n/**\r\n * The Reset Password Toolbar displaying the submit button\r\n *\r\n * @param {string} button.color The color of the submit button\r\n * @param {string} button.variant The variant of the submit button\r\n * @param {string} button.size The size of the submit button\r\n *\r\n */\r\nexport const ResetPasswordToolbar = props => {\r\n const classes = useStyles(props);\r\n const { button } = props;\r\n const color = get(button, 'color', 'primary');\r\n const variant = get(button, 'variant', 'outlined');\r\n const size = get(button, 'size', 'small');\r\n return (React.createElement(Toolbar, Object.assign({ className: classes.toolbar }, props),\r\n React.createElement(SaveButton, { className: classes.submit, label: \"apihub.reset_password.actions.submit\", color: color, variant: variant, size: size })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'stretch',\r\n flexBasis: '100%',\r\n backgroundColor: 'transparent',\r\n padding: 0,\r\n marginTop: theme.spacing(2),\r\n },\r\n submit: {},\r\n}), {\r\n name: 'Layer7ResetPasswordToolbar',\r\n});\r\n//# sourceMappingURL=ResetPasswordToolbar.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { required, SimpleForm, TextInput, useTranslate } from 'react-admin';\r\nimport { makeStyles, Typography } from '@material-ui/core';\r\nimport { ResetPasswordToolbar } from './ResetPasswordToolbar';\r\nexport const ResetPasswordForm = props => {\r\n const { onSubmit = () => { }, toolbarProps } = props, rest = __rest(props, [\"onSubmit\", \"toolbarProps\"]);\r\n const classes = useStyles(rest);\r\n const translate = useTranslate();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { variant: \"subtitle1\", color: \"textSecondary\", className: classes.instructions }, translate('apihub.reset_password.form_details.instructions')),\r\n React.createElement(Typography, { variant: \"subtitle2\", color: \"textSecondary\", className: classes.description, gutterBottom: true }, translate('apihub.reset_password.form_details.description')),\r\n React.createElement(SimpleForm, Object.assign({ className: classes.form, save: onSubmit, toolbar: React.createElement(ResetPasswordToolbar, Object.assign({}, toolbarProps)) }, rest),\r\n React.createElement(TextInput, { source: \"username\", type: \"text\", label: \"apihub.reset_password.fields.username\", variant: \"filled\", fullWidth: true, validate: required(), autoFocus: true }))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n instructions: {\r\n paddingTop: theme.spacing(2),\r\n fontSize: theme.typography.fontSize,\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n description: {\r\n paddingBottom: theme.spacing(2),\r\n },\r\n form: {\r\n '& >:first-child': {\r\n padding: 0,\r\n },\r\n },\r\n}), {\r\n name: 'Layer7ResetPasswordForm',\r\n});\r\n//# sourceMappingURL=ResetPasswordForm.js.map","export const defaultLocale = 'en';\r\nexport const supportedLocales = {\r\n en: 'English',\r\n es: 'Español',\r\n fr: 'Français',\r\n};\r\nexport const documentationLocales = {\r\n en: 'en-US',\r\n es: 'es-ES',\r\n fr: 'fr-FR',\r\n};\r\n//# sourceMappingURL=supportedLocales.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { forwardRef } from 'react';\r\nimport { markdownRenderer as defaultMarkdownRenderer } from '.';\r\nexport const MarkdownView = forwardRef((_a, ref) => {\r\n var { value, markdownRenderer = defaultMarkdownRenderer, markdownOptions = {} } = _a, props = __rest(_a, [\"value\", \"markdownRenderer\", \"markdownOptions\"]);\r\n return (React.createElement(\"div\", Object.assign({ ref: ref }, props), markdownRenderer(value, markdownOptions)));\r\n});\r\n//# sourceMappingURL=MarkdownView.js.map","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { startApiHubMockedServer } from 'layer7-apihub-mock';\n\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport data from './data.json';\nconst { ENABLE_MOCK, MOCK_SERVER_INDICATOR_LINK } = global.APIHUB_CONFIG;\n\nexport const shouldEnableMock = (enableMock = ENABLE_MOCK) =>\n enableMock === 'true' || enableMock === true;\n\nif (!shouldEnableMock(ENABLE_MOCK)) {\n ReactDOM.render(, document.getElementById('root'));\n} else {\n console.log('Starting the mocked server');\n startApiHubMockedServer({\n data,\n runningIndicatorLink: MOCK_SERVER_INDICATOR_LINK,\n }).then(() => ReactDOM.render(, document.getElementById('root')));\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nexport const ENTITY_TYPE_API = 'api';\r\nexport const ENTITY_TYPE_APPLICATION = 'application';\r\nexport const ENTITY_TYPE_HOME = 'home';\r\nexport const ENTITY_TYPE_CUSTOM = 'custom';\r\nexport const buildDocumentId = (entityType, entityUuid, navtitle, locale) => {\r\n // The document API does not follow the usual REST convention\r\n // To make it work with react admin, we build an ID which will be destructured\r\n // in the dataProvider\r\n return `${entityType}/${entityUuid}/${navtitle}/${locale}`;\r\n};\r\n/**\r\n * Prepare data to create a document\r\n * Filtered params are: id, uuid, children\r\n * Conserved params are: type, typeUuid, locale, parentUuid, status, title, navtitle, markdown, ordinal, modifyTs\r\n */\r\nconst prepareCreateData = (_a) => {\r\n var { id, uuid, children } = _a, rest = __rest(_a, [\"id\", \"uuid\", \"children\"]);\r\n return JSON.stringify(rest);\r\n};\r\n/**\r\n * Prepare data to update a document\r\n * Filtered params are: id, children\r\n * Conserved params are: uuid, type, typeUuid, locale, parentUuid, status, title, navtitle, markdown, ordinal, modifyTs\r\n */\r\nconst prepareUpdateData = (_a) => {\r\n var { id, children } = _a, rest = __rest(_a, [\"id\", \"children\"]);\r\n return JSON.stringify(rest);\r\n};\r\nexport const documentsDataProvider = context => {\r\n const basePath = `${context.apiUrl}/document-service/1.0`;\r\n return {\r\n getList: async ({ filter }) => {\r\n const { entityType, entityUuid, locale } = filter;\r\n const url = `${basePath}/docs/${entityType}/${entityUuid}?locale=${locale}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.map(item => (Object.assign(Object.assign({}, item), { id: buildDocumentId(entityType, entityUuid, item.navtitle, locale) }))),\r\n total: json.length,\r\n };\r\n },\r\n getOne: async ({ id }) => {\r\n const [entityType, entityUuid, navtitle, locale] = id.split('/');\r\n const url = `${basePath}/docs/${entityType}/${entityUuid}/${encodeURIComponent(navtitle)}?locale=${locale}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: Object.assign(Object.assign({}, json), { id: buildDocumentId(entityType, entityUuid, json.navtitle, json.locale) }),\r\n };\r\n },\r\n create: async (_a) => {\r\n var _b = _a.data, { id } = _b, body = __rest(_b, [\"id\"]);\r\n const [entityType, entityUuid] = id.split('/');\r\n const { navtitle } = body;\r\n const url = `${basePath}/docs/${entityType}/${entityUuid}/${navtitle}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'POST',\r\n body: prepareCreateData(body),\r\n });\r\n return {\r\n data: Object.assign(Object.assign({}, json), { id: buildDocumentId(entityType, entityUuid, json.navtitle, json.locale) }),\r\n };\r\n },\r\n update: async (_a) => {\r\n var _b = _a.data, { id } = _b, body = __rest(_b, [\"id\"]);\r\n const [entityType, entityUuid, navtitle, locale] = id.split('/');\r\n const url = `${basePath}/docs/${entityType}/${entityUuid}/${encodeURIComponent(navtitle)}?locale=${locale}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'PUT',\r\n body: prepareUpdateData(body),\r\n });\r\n return {\r\n data: Object.assign(Object.assign({}, json), { id: buildDocumentId(entityType, entityUuid, json.navtitle, json.locale) }),\r\n };\r\n },\r\n updateTree: async ({ entityType, entityUuid, locale, data }) => {\r\n const url = `${basePath}/docs/${entityType}/${entityUuid}?locale=${locale}`;\r\n const { json } = await context.fetchJson(url, {\r\n method: 'PUT',\r\n credentials: 'include',\r\n body: JSON.stringify(data),\r\n });\r\n return { data: json };\r\n },\r\n delete: async ({ id }) => {\r\n const [entityType, entityUuid, navtitle, locale] = id.split('/');\r\n const url = `${basePath}/docs/${entityType}/${entityUuid}/${encodeURIComponent(navtitle)}?locale=${locale}&forceDelete=true`;\r\n const data = __rest((await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'DELETE',\r\n })).json, []);\r\n return {\r\n data: Object.assign(Object.assign({}, data), { id: buildDocumentId(entityType, entityUuid, data.navtitle, data.locale) }),\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=documents.js.map","import { getErrorMessage } from '../useLayer7Notify';\r\n// Fake id used because we can only access the current user context\r\nexport const CurrentUserId = 'layer7@currentUser';\r\nclass UserContextsValidationError extends Error {\r\n constructor(message) {\r\n super(message);\r\n this.name = 'UserContextsValidationError';\r\n this.status = 400;\r\n }\r\n}\r\nexport const userContextsDataProvider = context => {\r\n const basePath = `${context.apiUrl}/userContexts`;\r\n return {\r\n getOne: async () => {\r\n const { json: data } = await context.fetchJson(basePath, {\r\n credentials: 'include',\r\n });\r\n if (!data || !data.userContexts || !data.userContexts.length > 0) {\r\n const customError = {\r\n status: 404,\r\n message: 'resources.userContexts.notifications.profile_not_exist_error',\r\n };\r\n throw customError;\r\n }\r\n const userContext = data.userContexts[0];\r\n return {\r\n data: Object.assign(Object.assign({}, userContext), { id: CurrentUserId }),\r\n };\r\n },\r\n update: async ({ id, data }) => {\r\n // The update method should only be used to update the user details\r\n const { userDetails: { firstName, lastName, email, username, uuid }, } = data;\r\n try {\r\n await context.fetchJson(basePath, {\r\n credentials: 'include',\r\n method: 'PUT',\r\n body: JSON.stringify({\r\n firstName,\r\n lastName,\r\n email,\r\n username,\r\n uuid,\r\n }),\r\n });\r\n }\r\n catch (error) {\r\n const message = getErrorMessage(error);\r\n throw new UserContextsValidationError(message);\r\n }\r\n return {\r\n data: Object.assign({ id }, data),\r\n };\r\n },\r\n updateActiveOrganization: async ({ id, data }) => {\r\n // The updateActiveOrganization method should only be used to update the user active organization\r\n try {\r\n await context.fetchJson(basePath, {\r\n credentials: 'include',\r\n method: 'PUT',\r\n body: JSON.stringify({\r\n orgUuid: data.activeOrgUuid,\r\n }),\r\n });\r\n }\r\n catch (error) {\r\n const message = getErrorMessage(error);\r\n throw new UserContextsValidationError(message);\r\n }\r\n return {\r\n data: Object.assign({ id }, data),\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=userContexts.js.map","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nexport const ApiStatus = ({ record, variant = 'caption' }) => {\r\n const classes = useStyles();\r\n const translate = useTranslate();\r\n if (!record.portalStatus) {\r\n record.portalStatus = record.status || '';\r\n }\r\n if (!record) {\r\n return null;\r\n }\r\n return (React.createElement(\"div\", { className: classnames(classes.root, {\r\n [classes.enabled]: record.portalStatus === 'ENABLED',\r\n [classes.disabled]: record.portalStatus !== 'ENABLED',\r\n }) },\r\n React.createElement(\"div\", { className: classes.enabledIcon }),\r\n React.createElement(Typography, { className: classes.status, variant: variant }, translate(`resources.apis.portalStatus.${record.portalStatus.toLowerCase()}`))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n width: 'auto',\r\n },\r\n enabled: {\r\n color: theme.palette.success.main,\r\n '& $enabledIcon': {\r\n backgroundColor: theme.palette.success.main,\r\n },\r\n },\r\n rejected: {\r\n color: theme.palette.error.main,\r\n '& $enabledIcon': {\r\n backgroundColor: theme.palette.error.main,\r\n },\r\n },\r\n disabled: {\r\n color: theme.palette.text.disabled,\r\n '& $enabledIcon': {\r\n backgroundColor: theme.palette.text.disabled,\r\n },\r\n },\r\n enabledIcon: {\r\n width: theme.spacing(1.5),\r\n height: theme.spacing(1.5),\r\n borderRadius: 99999,\r\n marginRight: theme.spacing(),\r\n },\r\n status: {},\r\n}), {\r\n name: 'Layer7ApiStatus',\r\n});\r\n//# sourceMappingURL=ApiStatus.js.map","export default \"data:image/png;base64,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\"","import React, { cloneElement } from 'react';\nimport AppBar from '@material-ui/core/AppBar';\nimport Divider from '@material-ui/core/Divider';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport { HideOnScroll, LoadingIndicator } from 'react-admin';\nimport {\n ApiHubUserMenu,\n ApiHubLanguageSwitcher,\n SidebarButton,\n} from 'layer7-apihub';\n\nimport LogoHeaderCsob from '../ui/LogoHeaderCsob.png';\n\nexport const AuthenticatedAppBar = ({\n children,\n classes: classesOverride,\n className,\n languagesMenu,\n logo,\n logout,\n open,\n sidebarButton,\n title,\n userMenu,\n ...rest\n}) => {\n const classes = useStyles({ classes: classesOverride });\n const whichUsername = localStorage.getItem('username');\n return (\n \n \n \n {cloneElement(sidebarButton, { open })}\n \n
\n
\n \n
\n {whichUsername !== 'guest' ? (\n <>\n \n \n
\n \n {cloneElement(userMenu, { logout })}\n >\n ) : (\n <>\n \n \n >\n )}\n \n \n \n );\n};\n\nAuthenticatedAppBar.defaultProps = {\n userMenu: ,\n languagesMenu: ,\n sidebarButton: ,\n};\n\nconst useStyles = makeStyles(\n theme => ({\n appBar: {\n background: theme.palette.common.white,\n },\n toolbar: {\n paddingRight: 24,\n },\n header: {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: '156px',\n },\n divider: {\n alignSelf: 'stretch',\n backgroundColor: theme.palette.secondary.bgDarkBlue,\n height: 'auto',\n width: '1px',\n marginBottom: theme.spacing(2),\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(2),\n marginTop: theme.spacing(2),\n },\n link: {\n fontWeight: 'bold',\n color: theme.palette.secondary.lightBlue,\n textDecoration: 'none',\n marginLeft: theme.spacing(1),\n outline: 'none',\n '&:hover': {\n textDecoration: 'none',\n outline: 'none',\n color: theme.palette.secondary.darkBlue,\n },\n },\n linkGuest: {\n fontWeight: 'bold',\n color: theme.palette.secondary.lightBlue,\n textDecoration: 'none',\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(2.5),\n outline: 'none',\n '&:hover': {\n textDecoration: 'none',\n outline: 'none',\n color: theme.palette.secondary.darkBlue,\n },\n },\n indicator: {\n color: theme.palette.secondary.lightBlue,\n '&:hover': {\n color: theme.palette.secondary.darkBlue,\n },\n },\n logo: {},\n button: {\n background: 'transparent',\n fontWeight: 'bold',\n fontSize: '15px',\n color: theme.palette.secondary.lightBlue,\n '&:hover': {\n background: theme.palette.secondary.lightGrayBlue,\n },\n },\n }),\n {\n name: 'HealthcareAuthenticatedAppBar',\n }\n);\n","import React from 'react';\nimport Link from '@material-ui/core/Link';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core';\nimport { Link as RouterLink } from 'react-router-dom';\nimport Container from '@material-ui/core/Container';\nimport Grid from '@material-ui/core/Grid';\n\nimport LogoHeaderCsob from '../ui/LogoHeaderCsob.png';\n\nexport const Footer = ({ withLogo = true, ...rest }) => {\n const classes = useStyles(rest);\n\n return (\n \n );\n};\n\nconst useStyles = makeStyles(\n theme => ({\n container: {},\n root: {\n backgroundColor: theme.palette.secondary.darkWhite,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(4),\n marginTop: theme.spacing(8),\n alignItems: 'center',\n },\n company: {\n color: theme.palette.secondary.darkGray,\n fontWeight: theme.typography.fontWeightBold,\n flexGrow: 1,\n },\n link: {\n display: 'block',\n fontWeight: 'bold',\n color: theme.palette.secondary.lightBlue,\n textDecoration: 'none',\n outline: 'none',\n marginRight: theme.spacing(2),\n '&:hover': {\n color: theme.palette.secondary.darkBlue,\n },\n },\n logo: {\n '& img': {\n marginRight: theme.spacing(1),\n },\n },\n }),\n {\n name: 'HealthcareFooter',\n }\n);\n","import React from 'react';\nimport { Sidebar as RaSidebar } from 'react-admin';\nimport { makeStyles } from '@material-ui/core';\n\nexport const Sidebar = ({ children, ...rest }) => {\n const classes = useStyles(rest);\n\n return (\n \n {children}\n \n );\n};\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n position: 'relative',\n },\n brand: {\n position: 'absolute',\n bottom: '0px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100px',\n backgroundColor: theme.palette.background.default,\n },\n logo: {\n fill: theme.palette.primary.main,\n padding: theme.spacing(0, 2),\n },\n }),\n {\n name: 'HealthcareSidebar',\n }\n);\n","import React from 'react';\nimport { ApiHubLayout } from 'layer7-apihub';\nimport { theme } from '../theme';\nimport { makeStyles } from '@material-ui/core';\n\nimport { AuthenticatedAppBar } from './AuthenticatedAppBar';\nimport { Footer } from './Footer';\nimport { Sidebar } from './Sidebar';\n\nexport const AuthenticatedLayout = ({ children, ...rest }) => {\n const classes = useLayoutStyles();\n\n return (\n \n {children}
\n \n \n );\n};\n\nconst useLayoutStyles = makeStyles(\n theme => ({\n innerContent: {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n },\n }),\n {\n name: 'HealthcareAuthenticatedLayout',\n }\n);\n","import React from 'react';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport Container from '@material-ui/core/Container';\nimport { Link as RouterLink } from 'react-router-dom';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport LogoHeaderCsob from '../ui/LogoHeaderCsob.png';\n\nconst StyledMenu = withStyles({\n paper: {\n border: '1px solid #d3d4d5',\n },\n})(props => (\n \n));\n\nconst StyledMenuItem = withStyles(theme => ({\n root: {\n '&:focus': {\n '& .MuiListItemIcon-root, & .MuiListItemText-primary': {\n color: theme.palette.common.white,\n },\n },\n },\n}))(MenuItem);\n\nexport const Header = props => {\n const classes = useAppbarStyles(props);\n const { showActions, ...rest } = props;\n const [anchorEl, setAnchorEl] = React.useState(false);\n const handleClick = () => {\n setAnchorEl(true);\n };\n\n const handleClose = () => {\n setAnchorEl(false);\n };\n const myUser = JSON.parse(localStorage.getItem('userContext'));\n if (myUser) {\n console.log(myUser);\n }\n return (\n \n \n \n \n
\n \n \n Developer Network\n \n {showActions ? (\n myUser === null ||\n myUser?.userDetails?.username === 'guest' ? (\n <>\n \n \n \n \n \n
\n >\n ) : (\n <>\n {/*\n \n */}\n \n \n \n
\n >\n )\n ) : null}\n \n \n \n );\n};\n\nconst useAppbarStyles = makeStyles(\n theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n },\n root: {\n background: 'transparent',\n },\n toolbar: {\n alignItems: 'center',\n paddingRight: '0',\n paddingLeft: '0',\n },\n title: {\n paddingLeft: theme.spacing(3),\n alignItems: 'center',\n textDecoration: 'none',\n color: theme.palette.secondary.darkBlue,\n '& span': {\n maxWidth: 100,\n fontWeight: 300,\n },\n flexGrow: 1,\n [theme.breakpoints.down('xs')]: {\n fontSize: '18px',\n paddingLeft: theme.spacing(1.5),\n },\n },\n button: {\n background: 'transparent',\n fontWeight: 'bold',\n fontSize: '15px',\n color: theme.palette.secondary.lightBlue,\n '&:hover': {\n background: theme.palette.secondary.lightGrayBlue,\n },\n [theme.breakpoints.down('sm')]: {\n display: 'none',\n },\n },\n mobileButton: {\n background: 'transparent',\n '& .MuiListItemIcon-root': {\n paddingTop: theme.spacing(1),\n paddingRight: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n paddingLeft: theme.spacing(1),\n borderRadius: theme.spacing(4),\n },\n [theme.breakpoints.up('md')]: {\n display: 'none',\n },\n },\n menuIcon: {\n borderRadius: '30%',\n },\n link: {\n fontWeight: 'bold',\n color: theme.palette.secondary.lightBlue,\n textDecoration: 'none',\n outline: 'none',\n marginRight: theme.spacing(2),\n '&:hover': {\n textDecoration: 'none',\n outline: 'none',\n color: theme.palette.secondary.darkBlue,\n },\n [theme.breakpoints.down('xs')]: {\n display: 'none',\n },\n },\n lenguage: {\n [theme.breakpoints.up('sm')]: {\n display: 'none',\n },\n },\n logo: {\n display: 'flex',\n },\n }),\n {\n name: 'HealthcareHeader',\n }\n);\n","import React from 'react';\nimport {\n createMuiTheme,\n makeStyles,\n ThemeProvider,\n CssBaseline,\n} from '@material-ui/core';\nimport { Notification } from 'react-admin';\n\nimport { theme } from '../theme';\nimport { Footer } from './Footer';\nimport { Header } from './Header';\n\nexport const UnAuthenticatedLayout = ({ children, showActions }) => {\n const classes = useStyles();\n\n return (\n <>\n \n {children}\n \n \n >\n );\n};\n\nexport const UnAuthenticatedLayoutWithTheme = props => {\n return (\n \n \n \n \n );\n};\n\nconst useStyles = makeStyles(\n theme => ({\n '@global': {\n body: {\n background: theme.palette.common.white,\n color: theme.palette.common.white,\n },\n '#root': {\n minHeight: '100vh',\n },\n },\n main: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n }),\n {\n name: 'HealthcareUnAuthenticatedLayout',\n }\n);\n","import get from 'lodash/get';\r\nimport set from 'lodash/set';\r\nimport { combineReducers } from 'redux';\r\nexport const SAVE_EXPANDED_NODES = '@layer7/SAVE_EXPANDED_NODES';\r\nexport const ADD_EXPANDED_NODES = '@layer7/ADD_EXPANDED_NODES';\r\nexport const DOCUMENT_ADDED = '@layer7/DOCUMENT_ADDED';\r\nexport const documentationTreeReducer = (previousState = {}, { type, payload }) => {\r\n if (!payload || !payload.entityUuid || !payload.locale) {\r\n return previousState;\r\n }\r\n switch (type) {\r\n case SAVE_EXPANDED_NODES: {\r\n const newState = Object.assign({}, previousState);\r\n return set(newState, `${payload.entityUuid}[${payload.locale}]`, payload.expandedNodes);\r\n }\r\n case ADD_EXPANDED_NODES: {\r\n const newExpandedNodes = new Set(get(previousState, `${payload.entityUuid}[${payload.locale}]`, []));\r\n payload.nodeIds.forEach(id => newExpandedNodes.add(id));\r\n const newState = Object.assign({}, previousState);\r\n return set(newState, `${payload.entityUuid}[${payload.locale}]`, Array.from(newExpandedNodes));\r\n }\r\n default:\r\n return previousState;\r\n }\r\n};\r\nexport const newDocument = (previousState = null, { type, payload }) => {\r\n switch (type) {\r\n case DOCUMENT_ADDED:\r\n return payload;\r\n default:\r\n return previousState;\r\n }\r\n};\r\nexport const documentationReducer = {\r\n documentation: combineReducers({\r\n documentationTree: documentationTreeReducer,\r\n newDocument,\r\n }),\r\n};\r\n// Tree\r\nexport const saveExpandedNodes = (entityUuid, locale, expandedNodes) => ({\r\n type: SAVE_EXPANDED_NODES,\r\n payload: { entityUuid, locale, expandedNodes },\r\n});\r\nexport const addExpandedNodes = (entityUuid, locale, nodeIds) => ({\r\n type: ADD_EXPANDED_NODES,\r\n payload: { entityUuid, locale, nodeIds },\r\n});\r\nexport const selectExpandedNodes = (entityUuid, locale) => state => get(state, `documentation.documentationTree.${entityUuid}.${locale}`, []);\r\n// New Document\r\nexport const addNewDocument = document => ({\r\n type: DOCUMENT_ADDED,\r\n payload: document,\r\n});\r\nexport const removeNewDocument = () => ({\r\n type: DOCUMENT_ADDED,\r\n payload: null,\r\n});\r\nexport const getNewDocument = state => state.documentation.newDocument;\r\n//# sourceMappingURL=documentationReducer.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { ThemeProvider, createMuiTheme } from '@material-ui/core/styles';\r\nimport { Notification } from 'react-admin';\r\nimport { theme as defaultTheme } from '../theme';\r\n/**\r\n * The page displaying the account setup form\r\n *\r\n * @param {*} Header A React Component used as the page header\r\n * @param {*} Content A React Component used to display some content next to the account setup form\r\n * @param {*} Footer A React Component used as the page footer\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyApp = props => \r\n *\r\n * @example With customized parts\r\n * const Header = () => \r\n * const Content = () => \r\n * const Footer = () => \r\n *\r\n * const AccountSetupPagePage = props => (\r\n * \r\n * );\r\n *\r\n * const MyApp = props => \r\n */\r\nexport const AuthenticationLayout = (_a) => {\r\n var { theme = defaultTheme } = _a, props = __rest(_a, [\"theme\"]);\r\n return (React.createElement(ThemeProvider, { theme: createMuiTheme(theme) },\r\n React.createElement(ThemedAuthenticationLayout, Object.assign({}, props))));\r\n};\r\n// This component exists for theming only. Indeed, we must call the useStyles hook AFTER\r\n// the ThemeProvider has been initialized with the specified theme\r\nconst ThemedAuthenticationLayout = (_a) => {\r\n var { children, Header, Content, Footer } = _a, rest = __rest(_a, [\"children\", \"Header\", \"Content\", \"Footer\"]);\r\n const classes = useStyles();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n Header ? React.createElement(Header, null) : null,\r\n React.createElement(\"main\", { className: classes.container },\r\n React.createElement(\"div\", { className: classes.columns }, children),\r\n Content ? (React.createElement(\"div\", { className: classes.columns },\r\n React.createElement(Content, null))) : null),\r\n Footer ? React.createElement(Footer, null) : null,\r\n React.createElement(Notification, null)));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n backgroundColor: theme.palette.background.default,\r\n position: 'fixed',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n padding: theme.spacing(4),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflow: 'auto',\r\n },\r\n container: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n flexGrow: 1,\r\n },\r\n columns: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: theme.spacing(4),\r\n [theme.breakpoints.down('sm')]: {\r\n padding: theme.spacing(3),\r\n },\r\n '&:first-child': {\r\n minWidth: '250px',\r\n maxWidth: '30%',\r\n [theme.breakpoints.down('sm')]: {\r\n maxWidth: '100%',\r\n width: '100%',\r\n },\r\n },\r\n '&:not(:first-child)': {\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.divider,\r\n borderWidth: '0px 0px 0px 1px',\r\n marginLeft: theme.spacing(4),\r\n maxWidth: `calc(50% - ${theme.spacing(4)}px)`,\r\n [theme.breakpoints.down('sm')]: {\r\n borderWidth: '1px 0px 0px 0px',\r\n marginLeft: '0px',\r\n maxWidth: '100%',\r\n width: '100%',\r\n },\r\n },\r\n '&:last-child': {\r\n flexGrow: 1,\r\n },\r\n },\r\n}), {\r\n name: 'Layer7ThemedAuthenticationLayout',\r\n});\r\n//# sourceMappingURL=AuthenticationLayout.js.map","import React from 'react';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nexport const ViewTitle = props => {\r\n const classes = useStyles();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, Object.assign({ id: \"react-admin-title\", variant: \"h5\", component: \"h2\", color: \"inherit\", className: classes.title }, props))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n marginTop: theme.spacing(3),\r\n marginBottom: theme.spacing(),\r\n },\r\n title: {\r\n fontWeight: theme.typography.fontWeightMedium,\r\n color: theme.palette.getContrastText(theme.palette.background.default),\r\n },\r\n}), {\r\n name: 'Layer7ViewTitle',\r\n});\r\n//# sourceMappingURL=ViewTitle.js.map","import get from 'lodash/get';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { useNotify } from 'ra-core';\r\nexport const getErrorMessage = error => {\r\n const message = get(error, 'body.userErrorMessage', '') ||\r\n get(error, 'body.error.message.value');\r\n const validationErrorCheck1 = get(error, 'body.validationErrors', {});\r\n const validationErrorCheck2 = get(error, 'body.error.detail.validationErrors', {});\r\n const validationErrors = !isEmpty(validationErrorCheck1)\r\n ? validationErrorCheck1\r\n : validationErrorCheck2;\r\n if (!validationErrors || Object.keys(validationErrors).length === 0) {\r\n return message;\r\n }\r\n const validationMessages = Object.keys(validationErrors)\r\n .map(validationField => get(validationErrors, `${validationField}.error`, '') ||\r\n get(validationErrors, `${validationField}.localizedMessage`, ''))\r\n .join(' ');\r\n return `${validationMessages}`;\r\n};\r\nexport const useLayer7Notify = () => {\r\n const notify = useNotify();\r\n return (message, type = 'info', messageArgs, undoable = false) => {\r\n if (typeof message === 'object') {\r\n const errorMessage = getErrorMessage(message);\r\n notify(errorMessage, 'error');\r\n return;\r\n }\r\n notify(message, type, messageArgs, undoable);\r\n };\r\n};\r\n//# sourceMappingURL=useLayer7Notify.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport get from 'lodash/get';\r\nimport { useTranslate, useGetManyReference } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport TabScrollButton from '@material-ui/core/TabScrollButton';\r\nimport classnames from 'classnames';\r\nexport const TagsField = props => {\r\n const { className, record, source, color = 'primary', variant = 'outlined', size = 'small', } = props;\r\n const classes = useStyles(props);\r\n const tags = get(record, source, []);\r\n return (React.createElement(Tabs, { variant: \"scrollable\", className: classes.root, scrollButtons: \"on\", ScrollButtonComponent: TagsFieldScrollButton, component: \"ul\", value: false }, tags.map(tag => (React.createElement(Tab, { key: tag, className: classes.tab, disableFocusRipple: true, disableRipple: true, component: \"li\", value: tag, label: React.createElement(Chip, { label: tag, className: classnames(classes.tag, className), color: color, variant: variant, size: size }) })))));\r\n};\r\nexport const AsyncTagsField = props => {\r\n const { record, variant = 'outlined', color = 'primary' } = props, rest = __rest(props, [\"record\", \"variant\", \"color\"]);\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const { data, loaded, error } = useGetManyReference('tags', 'id', record.id, undefined, undefined, undefined, 'apis');\r\n if (!loaded) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (error) {\r\n return (React.createElement(Typography, Object.assign({ variant: \"body2\", className: classes.error }, rest), translate('ra.page.error')));\r\n }\r\n const tags = data ? Object.keys(data).map(key => data[key]) : [];\r\n return (React.createElement(\"ul\", Object.assign({}, rest), tags.map(tag => (React.createElement(Chip, { component: \"li\", key: tag.id, label: tag.name, className: classes.tag, variant: variant, color: color })))));\r\n};\r\nexport const TagsFieldScrollButton = props => {\r\n const { onClick } = props, rest = __rest(props, [\"onClick\"]);\r\n const handleClick = event => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n onClick(event);\r\n };\r\n return (React.createElement(TabScrollButton, Object.assign({ \"data-layer7-test\": \"tags-scroll-button\", onClick: handleClick }, rest)));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n margin: 0,\r\n padding: 0,\r\n maxWidth: 300,\r\n minHeight: 'unset',\r\n position: 'relative',\r\n },\r\n tab: {\r\n minHeight: 'unset',\r\n minWidth: 'unset',\r\n maxWidth: 'unset',\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n paddingLeft: theme.spacing(0.5),\r\n paddingRight: theme.spacing(0.5),\r\n },\r\n tag: {\r\n borderRadius: theme.spacing(0.5),\r\n backgroundColor: 'transparent',\r\n border: '1px solid',\r\n '& + &': {\r\n marginLeft: theme.spacing(),\r\n },\r\n },\r\n error: {\r\n color: theme.palette.error.main,\r\n marginBottom: theme.spacing(),\r\n },\r\n}), {\r\n name: 'Layer7ApiTags',\r\n});\r\n//# sourceMappingURL=TagsField.js.map","import React from 'react';\n\nimport { theme } from '../theme';\nimport { UnAuthenticatedLayoutWithTheme, Header, Footer } from '../layout';\n\nexport const AuthenticationLayout = props => {\n return (\n \n );\n};\n","import React from 'react';\nimport {\n AccountSetupForm,\n AccountSetupPreparingForm,\n AccountSetupInvalidRequest,\n AccountSetupSuccess,\n useAccountData,\n} from 'layer7-apihub';\nimport { makeStyles } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport Card from '@material-ui/core/Card';\nimport Grid from '@material-ui/core/Grid';\n\nimport { AuthenticationLayout } from './AuthenticationLayout';\n\nexport const AccountSetupPage = props => {\n const [state, accountData, submitAccountData] = useAccountData();\n const classes = useStyles(props);\n\n const handleSubmit = data => {\n submitAccountData(data);\n };\n\n return (\n \n \n \n \n Account Setup\n \n \n {state === 'prepare' && (\n \n )}\n {state === 'fill' && (\n <>\n \n Please fill this form to complete your\n registration.\n \n \n >\n )}\n {state === 'invalid_request' && (\n \n )}\n {state === 'success' && (\n \n )}\n \n \n \n \n );\n};\n\nconst useStyles = makeStyles(theme => ({\n content: {\n marginTop: theme.spacing(8),\n flex: 1,\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n },\n accountSetup: {\n padding: theme.spacing(6),\n margin: '0 auto',\n },\n}));\n","import React, { useEffect, useState } from 'react';\nimport {\n PasswordInput,\n required,\n FormWithRedirect,\n TextInput,\n useLogin,\n useTranslate,\n useRedirect,\n} from 'react-admin';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Link from '@material-ui/core/Link';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\n\nexport const LoginForm = props => {\n const login = useLogin();\n const classes = useStyles(props);\n const translate = useTranslate();\n const [isLoading, setIsLoading] = useState(null);\n const [error, setError] = useState(null); // eslint-disable-line no-unused-vars\n\n const redirect = useRedirect();\n useEffect(() => {}, [redirect]);\n\n const submit = async ({ username, password }) => {\n setError(null);\n setIsLoading(true);\n localStorage.removeItem('username');\n\n try {\n const currentU = await login({\n scheme: 'credentials',\n username,\n password,\n });\n localStorage.setItem('username', currentU);\n if (localStorage.getItem('username') !== 'guest') {\n redirect('/apis');\n }\n } catch {\n localStorage.setItem('username', 'guest');\n setError('apihub.login.notifications.invalid_credentials');\n }\n setIsLoading(false);\n };\n\n return (\n (\n \n )}\n />\n );\n};\n\nconst useStyles = makeStyles(theme => ({\n form: {\n '& >:first-child': {\n padding: 0,\n },\n },\n actions: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n },\n}));\n","import React from 'react';\nimport { theme as mytheme } from '../theme';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Divider from '@material-ui/core/Divider';\nimport Button from '@material-ui/core/Button';\nimport { Link as RouterLink } from 'react-router-dom';\n\nimport { UnAuthenticatedLayoutWithTheme } from '../layout';\nimport { LoginForm } from './LoginForm';\nimport Container from '@material-ui/core/Container';\n\nexport const LoginPage = props => {\n const classes = useStyles();\n localStorage.setItem('useredirect', false);\n\n return (\n \n \n \n \n \n \n \n Login\n \n \n \n \n \n \n \n \n \n Don't have an account?\n \n \n \n \n \n \n \n \n );\n};\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n background: mytheme.palette.secondary.bgLightBlue,\n },\n },\n container: {},\n content: {\n justifyContent: 'center',\n marginTop: theme.spacing(8),\n flex: 3,\n },\n loginCard: {\n backgroundColor: theme.palette.common.white,\n },\n login: {\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'center',\n backgroundColor: mytheme.palette.secondary.darkWhite,\n },\n loginTitle: {\n color: mytheme.palette.secondary.darkBlue,\n display: 'flex',\n justifyContent: 'center',\n },\n loginContent: {\n padding: theme.spacing(6),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n\n '& button': {},\n },\n signUp: {\n borderRadius: theme.spacing(4),\n marginRight: 'auto',\n marginLeft: 'auto',\n marginTop: theme.spacing(2),\n },\n}));\n","import React from 'react';\nimport {\n NewPasswordForm,\n NewPasswordVerifyingToken,\n NewPasswordInvalidToken,\n NewPasswordSuccess,\n useSetNewPassword,\n} from 'layer7-apihub';\nimport { makeStyles } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport Card from '@material-ui/core/Card';\nimport Grid from '@material-ui/core/Grid';\nimport Container from '@material-ui/core/Container';\n\nimport { AuthenticationLayout } from './AuthenticationLayout';\n\nexport function NewPasswordPage(props) {\n const classes = useStyles(props);\n const [state, handleSubmit] = useSetNewPassword();\n\n return (\n \n \n \n \n \n New Password\n \n \n {state === 'verifying_token' && (\n \n )}\n {state === 'request_new_password' && (\n <>\n \n Please fill this form to create a new\n password.\n \n \n >\n )}\n {state === 'invalid_token' && (\n \n )}\n {state === 'success' && (\n \n )}\n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(theme => ({\n container: {},\n content: {\n marginTop: theme.spacing(8),\n flex: 1,\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n },\n instructions: {\n paddingBottom: theme.spacing(4),\n },\n newPassword: {\n padding: theme.spacing(6),\n },\n}));\n","import React from 'react';\nimport {\n ResetPasswordForm,\n ResetPasswordConfirm,\n useResetPassword,\n} from 'layer7-apihub';\nimport { makeStyles } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport Card from '@material-ui/core/Card';\nimport Grid from '@material-ui/core/Grid';\nimport Container from '@material-ui/core/Container';\nimport CardContent from '@material-ui/core/CardContent';\nimport Divider from '@material-ui/core/Divider';\nimport { theme as mytheme } from '../theme';\n\nimport { AuthenticationLayout } from './AuthenticationLayout';\n\nexport const ResetPasswordPage = props => {\n const classes = useStyles(props);\n const [username, setUsername] = useResetPassword();\n\n const handleSubmit = ({ username }) => {\n setUsername(username);\n };\n\n return (\n \n \n \n \n \n \n \n Reset Password\n \n \n \n \n {username ? (\n \n ) : (\n <>\n \n Please fill this form to reset your\n password.\n \n \n >\n )}\n \n \n \n \n \n \n );\n};\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n background: mytheme.palette.secondary.bgLightBlue,\n },\n },\n container: {},\n content: {\n justifyContent: 'center',\n marginTop: theme.spacing(8),\n flex: 1,\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n },\n formCard: {\n backgroundColor: theme.palette.common.white,\n },\n resetPasswordTitle: {\n textAlign: 'center',\n color: mytheme.palette.secondary.darkBlue,\n },\n resetPasswordText: {\n color: mytheme.palette.secondary.darkGray,\n },\n resetPassword: {\n padding: theme.spacing(6),\n paddingLeft: theme.spacing(12),\n paddingRight: theme.spacing(12),\n },\n}));\n","import React from 'react';\r\nimport { theme as mytheme } from '../theme';\r\nimport { email, required, FormWithRedirect, TextInput } from 'react-admin';\r\nimport { validateAreEqual } from 'layer7-apihub';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport Link from '@material-ui/core/Link';\r\nimport CardActions from '@material-ui/core/CardActions';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nexport const SignUpForm = props => {\r\n const classes = useStyles(props);\r\n\r\n const history = useHistory();\r\n\r\n const submit = async data => {\r\n const { EmailConfirmation, ...registration } = data;\r\n\r\n const success = await props.onSubmit(registration);\r\n\r\n if (success) {\r\n history.push('/');\r\n }\r\n };\r\n\r\n return (\r\n (\r\n \r\n )}\r\n />\r\n );\r\n};\r\n\r\nconst ValidateEmail = [required(), email()];\r\nconst ValidateEmailConfirmation = [\r\n required(),\r\n email(),\r\n validateAreEqual('Email', 'EmailConfirmation'),\r\n];\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n title: {\r\n fontSize: theme.typography.fontSize * 2,\r\n marginBottom: theme.spacing(6),\r\n color: theme.palette.getContrastText(theme.palette.background.default),\r\n },\r\n root: {\r\n display: 'flex',\r\n padding: theme.spacing(5, 2, 1),\r\n },\r\n fieldset: {\r\n border: 'none',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: 'calc(100%/2)',\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(4),\r\n marginTop: theme.spacing(-8),\r\n marginBottom: theme.spacing(2),\r\n '& + &': {\r\n borderLeftStyle: 'solid',\r\n borderLeftColor: theme.palette.grey[300],\r\n borderLeftWidth: 1,\r\n },\r\n '& legend': {\r\n marginTop: theme.spacing(4),\r\n marginBottom: theme.spacing(3),\r\n float: 'left',\r\n },\r\n '& hr': {\r\n width: '100%',\r\n height: '1px',\r\n backgroundColor: theme.palette.grey[300],\r\n border: 'none',\r\n marginBottom: theme.spacing(4),\r\n },\r\n },\r\n fieldsetHeader: {\r\n paddingTop: theme.spacing(8),\r\n },\r\n topFieldSetElement: {\r\n marginTop: 'auto',\r\n },\r\n actions: {\r\n display: 'flex',\r\n paddingBottom: theme.spacing(6),\r\n paddingTop: theme.spacing(6),\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(4),\r\n backgroundColor: mytheme.palette.secondary.bgDarkBlue,\r\n justifyContent: 'space-between',\r\n },\r\n submit: {\r\n borderRadius: theme.spacing(4),\r\n fontWeight: 'bold',\r\n fontSize: '1.1rem',\r\n paddingTop: theme.spacing(2),\r\n paddingBottom: theme.spacing(2),\r\n paddingLeft: theme.spacing(6),\r\n paddingRight: theme.spacing(6),\r\n textTransform: 'unset',\r\n },\r\n loginLink: {\r\n fontWeight: 'bold',\r\n },\r\n}));\r\n","import React from 'react';\nimport { useLogout, useRedirect } from 'react-admin';\nimport { theme as mytheme } from '../theme';\nimport Card from '@material-ui/core/Card';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core';\nimport Container from '@material-ui/core/Container';\nimport { useLocation } from 'react-router-dom';\nimport { useSignup, useLayer7Notify } from 'layer7-apihub';\nimport { UnAuthenticatedLayoutWithTheme } from '../layout';\nimport { SignUpForm } from './SignUpForm';\n\nexport const SignUpPage = params => {\n const logout = useLogout();\n const redirect = useRedirect();\n logout();\n const locations = useLocation();\n console.log(locations.hash);\n if (locations.hash.includes('token')) {\n redirect('/account-setup' + locations.hash);\n }\n const classes = useStyles();\n const notify = useLayer7Notify();\n\n const [signup] = useSignup();\n\n const handleSubmit = data => {\n signup(data, {\n onSuccess: () => {\n notify('resources.registrations.notifications.confirmation');\n },\n onFailure: error => {\n notify(\n error || 'resources.registrations.notifications.error',\n 'error'\n );\n },\n });\n };\n return (\n \n \n \n \n \n Register for an account\n \n \n The developer portal gives third parties access to\n our APIs along with a sandbox environment\n provisioned to help you gain early access and to\n provide feedback on our integrated solution.\n \n \n \n \n \n
\n \n \n );\n};\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n background: mytheme.palette.secondary.bgLightBlue,\n },\n },\n root: {\n color: mytheme.palette.common.black,\n },\n container: {},\n title: {\n color: mytheme.palette.secondary.darkBlue,\n },\n button: {},\n section: {\n paddingBottom: theme.spacing(0),\n paddingTop: theme.spacing(4),\n },\n signUp: {\n marginTop: theme.spacing(4),\n },\n}));\n","import { useRefresh, useRedirect, useGetOne, useUpdate, useMutation, CRUD_GET_ONE, CRUD_UPDATE, } from 'ra-core';\r\nimport merge from 'lodash/merge';\r\nimport { useLayer7Notify } from '../useLayer7Notify';\r\nimport { CurrentUserId } from '../dataProvider/userContexts';\r\nexport const useUserContext = redirectTo => {\r\n const notify = useLayer7Notify();\r\n const refresh = useRefresh();\r\n const redirect = useRedirect();\r\n // Pass a fake id because we can only access the current user context\r\n const { data: userContext } = useGetOne('userContexts', CurrentUserId, {\r\n action: CRUD_GET_ONE,\r\n });\r\n const [updateProfile] = useUpdate('userContexts', CurrentUserId);\r\n const [updateActiveOrganization] = useMutation({\r\n type: 'updateActiveOrganization',\r\n resource: 'userContexts',\r\n });\r\n const handleChangeUserProfile = newUserContext => {\r\n updateProfile({\r\n payload: {\r\n id: CurrentUserId,\r\n data: merge(userContext, newUserContext),\r\n },\r\n }, {\r\n action: CRUD_UPDATE,\r\n onSuccess: () => {\r\n notify('resources.userContexts.userDetails.notifications.update_success', 'info');\r\n if (redirectTo) {\r\n redirect(redirectTo);\r\n }\r\n refresh();\r\n },\r\n onFailure: () => {\r\n notify('resources.userContexts.userDetails.notifications.update_error', 'error');\r\n },\r\n });\r\n };\r\n const handleChangeUserActiveOrganization = newUserContext => {\r\n updateActiveOrganization({\r\n payload: {\r\n id: CurrentUserId,\r\n data: merge(userContext, newUserContext),\r\n },\r\n }, {\r\n action: CRUD_UPDATE,\r\n onSuccess: () => {\r\n notify('resources.userContexts.activeOrgUuid.notifications.update_success', 'info');\r\n // We should perform a redirection before refreshing the view,\r\n // because the current view may not be accessible for the new organization.\r\n if (redirectTo) {\r\n redirect(redirectTo);\r\n }\r\n refresh();\r\n },\r\n onFailure: error => {\r\n notify(error ||\r\n 'resources.userContexts.activeOrgUuid.notifications.update_error', 'error');\r\n },\r\n });\r\n };\r\n return [\r\n userContext,\r\n handleChangeUserProfile,\r\n handleChangeUserActiveOrganization,\r\n ];\r\n};\r\n//# sourceMappingURL=useUserContext.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useTranslate } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListSubheader from '@material-ui/core/ListSubheader';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport { getUserOrganizations } from '.';\r\nexport const UserOrganizationSwitcher = (_a) => {\r\n var { userContext, onChangeUserContext } = _a, props = __rest(_a, [\"userContext\", \"onChangeUserContext\"]);\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n const { hasAccessibleOrgs, accessibleOrgs, activeOrg, } = getUserOrganizations(userContext);\r\n return hasAccessibleOrgs ? (React.createElement(React.Fragment, null,\r\n React.createElement(List, { compnent: \"div\", className: classes.root },\r\n React.createElement(ListSubheader, { className: classes.item }, translate('resources.userContexts.accessibleOrgs.title', {\r\n smart_count: accessibleOrgs.length || 0,\r\n })),\r\n accessibleOrgs.map(({ uuid, name }) => {\r\n const isActiveOrg = uuid === activeOrg.uuid;\r\n return (React.createElement(Tooltip, { key: uuid, title: name },\r\n React.createElement(ListItem, { className: classes.item, \"aria-label\": translate(isActiveOrg\r\n ? 'resources.userContexts.activeOrgUuid.status.active'\r\n : 'resources.userContexts.activeOrgUuid.status.not_active'), onClick: () => onChangeUserContext({\r\n activeOrgUuid: uuid,\r\n }), button: !isActiveOrg },\r\n React.createElement(ListItemText, { className: classes.itemText, primary: name, primaryTypographyProps: {\r\n variant: 'subtitle1',\r\n className: classes.truncatedText,\r\n } }),\r\n isActiveOrg && (React.createElement(ListItemIcon, { className: classes.icon },\r\n React.createElement(CheckIcon, null))))));\r\n })),\r\n React.createElement(Divider, { className: classes.divider }))) : null;\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n padding: `0px 0px ${theme.spacing()}px 0px`,\r\n },\r\n item: {\r\n color: theme.palette.text.secondary,\r\n },\r\n itemText: {\r\n display: 'block',\r\n marginTop: '0px',\r\n marginBottom: '0px',\r\n maxWidth: '300px',\r\n [theme.breakpoints.up('lg')]: {\r\n maxWidth: '250px',\r\n },\r\n },\r\n truncatedText: {\r\n display: 'inline-block',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '300px',\r\n [theme.breakpoints.up('lg')]: {\r\n maxWidth: '250px',\r\n },\r\n },\r\n secondaryText: {\r\n fontSize: theme.typography.caption.fontSize,\r\n },\r\n icon: {\r\n marginLeft: theme.spacing(2),\r\n minWidth: theme.spacing(3),\r\n color: theme.palette.success.main,\r\n },\r\n divider: {\r\n marginBottom: theme.spacing(),\r\n },\r\n}), {\r\n name: 'Layer7UserOrganizationSwitcher',\r\n});\r\n//# sourceMappingURL=UserOrganizationSwitcher.js.map","import get from 'lodash/get';\r\n/**\r\n * Get the organizations details from the user context.\r\n *\r\n * @param {object} userContext The user context\r\n */\r\nexport const getUserOrganizations = userContext => {\r\n const activeOrgUuid = get(userContext, 'activeOrgUuid', null);\r\n const organizations = get(userContext, 'accessibleOrgs', {});\r\n const orgsUuids = Object.values(organizations);\r\n const accessibleOrgs = Object.keys(organizations).reduce((listAccessibleOrgs, organizationName, index) => {\r\n const org = {\r\n uuid: orgsUuids[index],\r\n name: organizationName,\r\n };\r\n listAccessibleOrgs.push(org);\r\n return listAccessibleOrgs;\r\n }, []);\r\n const activeOrg = accessibleOrgs.find(org => org.uuid === activeOrgUuid);\r\n const hasAccessibleOrgs = accessibleOrgs.length > 0;\r\n return { hasAccessibleOrgs, accessibleOrgs, activeOrg };\r\n};\r\n//# sourceMappingURL=getUserOrganizations.js.map","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nexport const IconApps = props => {\r\n return (React.createElement(SvgIcon, Object.assign({ viewBox: \"0 0 16.042 17.002\", fontSize: \"small\" }, props),\r\n React.createElement(\"path\", { d: \"M4.308,8.9l7.335,4.668a.667.667,0,0,0,.72,0L19.7,8.9a.667.667,0,0,0,0-1.12L12.363,3.107a.667.667,0,0,0-.72,0L4.308,7.775a.667.667,0,0,0,0,1.12Z\", transform: \"translate(-4.003 -3.002)\" }),\r\n React.createElement(\"path\", { d: \"M19.044,15.116l-7,4.45-7-4.45a.669.669,0,0,0-.723,1.124l7.361,4.684a.669.669,0,0,0,.723,0l7.361-4.684a.669.669,0,0,0-.723-1.124Z\", transform: \"translate(-4.003 -7.029)\" }),\r\n React.createElement(\"path\", { d: \"M19.044,20.116l-7,4.45-7-4.45a.669.669,0,0,0-.723,1.124l7.361,4.684a.669.669,0,0,0,.723,0l7.361-4.684a.669.669,0,0,0-.723-1.124Z\", transform: \"translate(-4.003 -9.029)\" })));\r\n};\r\n//# sourceMappingURL=IconApps.js.map","import React from 'react';\r\nimport { TextField } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport get from 'lodash/get';\r\nexport const TruncatedTextField = props => {\r\n const classes = useStyles();\r\n const value = get(props.record, props.source);\r\n return (React.createElement(Tooltip, { title: value || '' },\r\n React.createElement(TextField, Object.assign({ className: classes.root }, props))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'inline-block',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '15vw',\r\n [theme.breakpoints.up('lg')]: {\r\n maxWidth: '10vw',\r\n },\r\n },\r\n}), {\r\n name: 'Layer7TruncatedTextField',\r\n});\r\n//# sourceMappingURL=TruncatedTextField.js.map","import { get } from 'lodash';\r\n/**\r\n * Detect if the user is a portal admin from the user context.\r\n *\r\n * @param {object} userContext The user context\r\n */\r\nexport function isPortalAdmin(userContext) {\r\n return !!get(userContext, 'userDetails.portalAdmin', null);\r\n}\r\n/**\r\n * Detect if the user is a publisher from the user context.\r\n *\r\n * @param {object} userContext The user context\r\n */\r\nexport function isPublisher(userContext) {\r\n const portalAdmin = !!get(userContext, 'userDetails.portalAdmin', null);\r\n const apiOwner = !!get(userContext, 'userDetails.apiOwner', null);\r\n const orgPublisher = !!get(userContext, 'userDetails.orgPublisher', null);\r\n return portalAdmin || apiOwner || orgPublisher;\r\n}\r\n/**\r\n * Detect if the user is an org bound user from the user context.\r\n *\r\n * @param {object} userContext The user context\r\n */\r\nexport function isOrgBoundUser(userContext) {\r\n const orgPublisher = !!get(userContext, 'userDetails.orgPublisher', null);\r\n const orgAdmin = !!get(userContext, 'userDetails.orgAdmin', null);\r\n const developer = !!get(userContext, 'userDetails.developer', null);\r\n return orgAdmin || orgPublisher || developer;\r\n}\r\n/**\r\n * Detect if the user is an admin user and not a developer from the user context.\r\n *\r\n * @param {object} userContext The user context\r\n */\r\nexport function isAdminUser(userContext) {\r\n const portalAdmin = !!get(userContext, 'userDetails.portalAdmin', null);\r\n const apiOwner = !!get(userContext, 'userDetails.apiOwner', null);\r\n const orgPublisher = !!get(userContext, 'userDetails.orgPublisher', null);\r\n const orgAdmin = !!get(userContext, 'userDetails.orgAdmin', null);\r\n const developer = !!get(userContext, 'userDetails.developer', null);\r\n return (portalAdmin || apiOwner || orgAdmin || orgPublisher) && !developer;\r\n}\r\n/**\r\n * Detect if the user is an admin from the user context.\r\n *\r\n * @param {object} userContext The user context\r\n */\r\nexport function isOrgAdmin(userContext) {\r\n return !!get(userContext, 'userDetails.orgAdmin', null);\r\n}\r\n//# sourceMappingURL=userPermissions.js.map","import get from 'lodash/get';\r\nimport { useLayer7Notify } from '../useLayer7Notify';\r\nexport const useCopyToClipboard = ({ successMessage = '', errorMessage = '', } = {}) => {\r\n const notify = useLayer7Notify();\r\n async function copyToClipboard(event) {\r\n if (!navigator || !navigator.clipboard) {\r\n console.warning('Copy to clipboard not supported');\r\n return;\r\n }\r\n const textToCopy = get(event, 'currentTarget.value', '');\r\n try {\r\n await navigator.clipboard.writeText(textToCopy);\r\n if (successMessage) {\r\n notify(successMessage);\r\n }\r\n }\r\n catch (error) {\r\n notify(errorMessage || error, 'error');\r\n }\r\n }\r\n return copyToClipboard;\r\n};\r\n//# sourceMappingURL=useCopyToClipboard.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nexport const credentialsAuthProvider = (apiUrl, fetchJson) => ({\r\n login: async (_a) => {\r\n var { username, password, publicKey } = _a, params = __rest(_a, [\"username\", \"password\", \"publicKey\"]);\r\n try {\r\n const headers = new Headers({\r\n 'Content-Type': 'application/json; charset=UTF-8',\r\n });\r\n if (publicKey) {\r\n headers.set('Public-Key', publicKey);\r\n }\r\n const { json } = await fetchJson(`${apiUrl}/authenticate/login`, {\r\n method: 'POST',\r\n body: JSON.stringify(Object.assign({ username,\r\n password, eula: 'accept' }, params)),\r\n headers: headers,\r\n });\r\n const { respCode, respMsg } = json;\r\n if (respCode < 200 || respCode >= 300) {\r\n throw new Error(respMsg);\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error(error);\r\n }\r\n },\r\n logout: async () => {\r\n try {\r\n await fetchJson(`${apiUrl}/logout`);\r\n return Promise.resolve();\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n },\r\n checkAuth: () => {\r\n return Promise.resolve();\r\n },\r\n checkError: () => {\r\n return Promise.resolve();\r\n },\r\n getPermissions: async () => {\r\n return Promise.resolve();\r\n },\r\n});\r\n//# sourceMappingURL=credentialsAuthProvider.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { credentialsAuthProvider } from './credentialsAuthProvider';\r\nimport { getFetchJson } from '../fetchUtils';\r\nimport { deleteApiHubPreference } from '../preferences';\r\nconst LOGIN_SCHEME = '@layer7/authentication/loginScheme';\r\nconst LOGGED_IN = '@layer7/authentication/loggedIn';\r\nconst checkError = error => {\r\n const status = error.status;\r\n if (!status) {\r\n // TypeError: Network request failed\r\n return Promise.reject(error);\r\n }\r\n switch (error.status) {\r\n case 401: // Unauthorized\r\n case 500: // Internal Server Error\r\n return Promise.reject(error);\r\n default:\r\n return Promise.resolve(error);\r\n }\r\n};\r\nexport const authProvider = (baseUrl, tenantName, originHubName, keyLoginScheme = LOGIN_SCHEME, keyLoggedIn = LOGGED_IN, fetchJson = getFetchJson(originHubName)) => {\r\n const apiUrl = `${baseUrl}/api/${tenantName}`;\r\n const providers = {\r\n credentials: credentialsAuthProvider(apiUrl, fetchJson),\r\n };\r\n const getIsLoggedIn = () => {\r\n return JSON.parse(sessionStorage.getItem(keyLoggedIn));\r\n };\r\n const setIsLoggedIn = value => {\r\n sessionStorage.setItem(keyLoggedIn, JSON.stringify(value));\r\n };\r\n const removeIsLoggedIn = () => {\r\n sessionStorage.removeItem(keyLoggedIn);\r\n localStorage.removeItem('userContext');\r\n };\r\n let schemeUsedForLogin = null;\r\n const getSchemeUsedForLogin = () => {\r\n if (!schemeUsedForLogin) {\r\n schemeUsedForLogin = localStorage.getItem(keyLoginScheme);\r\n }\r\n return schemeUsedForLogin;\r\n };\r\n const setSchemeUsedForLogin = scheme => {\r\n localStorage.setItem(keyLoginScheme, scheme);\r\n };\r\n const getProviderUsedForLogin = () => {\r\n const scheme = getSchemeUsedForLogin();\r\n return providers[scheme];\r\n };\r\n return {\r\n login: async (_a) => {\r\n var { scheme } = _a, params = __rest(_a, [\"scheme\"]);\r\n setSchemeUsedForLogin(scheme);\r\n const authProviderUsedForLogin = getProviderUsedForLogin();\r\n if (!authProviderUsedForLogin) {\r\n throw new Error(`Unknown authentication scheme ${scheme}`);\r\n }\r\n await authProviderUsedForLogin.login(params);\r\n // If we got this far, the authentication should be fine\r\n // Store this fact in storage\r\n setIsLoggedIn(true);\r\n },\r\n logout: async () => {\r\n const authProviderUsedForLogin = getProviderUsedForLogin();\r\n if (authProviderUsedForLogin) {\r\n await authProviderUsedForLogin.logout();\r\n }\r\n else {\r\n // Call the default logout route\r\n try {\r\n await fetchJson(`${apiUrl}/logout`);\r\n return Promise.resolve();\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n // Don't set the isLoggedIn variable to false\r\n // to force the checkAuth method to check if the user is authenticated by fetching the API\r\n removeIsLoggedIn();\r\n // The documentation locale should reset to the preferred UI locale\r\n // for every new session\r\n deleteApiHubPreference('documentationLocale');\r\n if (localStorage.getItem('useredirect') == 'true') {\r\n return Promise.resolve();\r\n }\r\n else {\r\n return Promise.reject();\r\n }\r\n },\r\n checkAuth: () => {\r\n // We use the local storage\r\n // to store if a user using this portal is logged in or not.\r\n const isLoggedIn = getIsLoggedIn();\r\n if (isLoggedIn === true) {\r\n return Promise.resolve();\r\n }\r\n else {\r\n const username = 'guest';\r\n const password = 'Gu3st!Gu3st!';\r\n setSchemeUsedForLogin('credentials');\r\n const authProviderUsedForLogin = getProviderUsedForLogin();\r\n if (!authProviderUsedForLogin) {\r\n throw new Error(`Unknown authentication scheme 'credentials'`);\r\n }\r\n authProviderUsedForLogin.login({ username, password });\r\n // If we got this far, the authentication should be fine\r\n // Store this fact in storage\r\n setIsLoggedIn(true);\r\n localStorage.setItem('username', username);\r\n }\r\n try {\r\n // But he may use another portal to log in.\r\n // So fetching the api it's the only way to know\r\n // if he is already authenticated or not.\r\n const response = fetchJson(`${apiUrl}/userContexts`);\r\n response.then(result => {\r\n console.log(JSON.parse(result.body).userContexts[0].userDetails.username);\r\n }, function (error) {\r\n console.log(error);\r\n });\r\n checkError(response);\r\n setIsLoggedIn(true);\r\n }\r\n catch (error) {\r\n setIsLoggedIn(false);\r\n return Promise.reject();\r\n }\r\n return Promise.resolve();\r\n },\r\n checkError,\r\n getPermissions: async () => {\r\n const authProviderUsedForLogin = getProviderUsedForLogin();\r\n if (authProviderUsedForLogin) {\r\n return authProviderUsedForLogin.getPermissions();\r\n }\r\n return Promise.resolve();\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=authProvider.js.map","import { mergeTranslations } from 'react-admin';\r\nimport raMessages from 'ra-language-english';\r\nconst apiHubMessages = {\r\n ra: Object.assign(Object.assign({}, raMessages), { page: {\r\n dashboard: 'Home',\r\n }, action: {\r\n add_filter: 'Add Filter',\r\n show: 'Show',\r\n edit: 'Edit',\r\n bulk_actions: '1 item selected |||| %{smart_count} items selected',\r\n loading: 'Loading...',\r\n }, actions: Object.assign(Object.assign({}, raMessages.actions), { open_sidebar: 'Open the menu', close_sidebar: 'Close the menu' }), navigation: Object.assign(Object.assign({}, raMessages.navigation), { page_rows_per_page: 'Items per page:', next: 'Next', prev: 'Prev' }), auth: {\r\n logout: 'Logout',\r\n } }),\r\n apihub: {\r\n login: {\r\n title: 'Sign In To API Hub',\r\n fields: {\r\n username: 'Username',\r\n password: 'Password',\r\n },\r\n actions: {\r\n sign_in: 'Sign in',\r\n sign_in_with: 'Sign in with',\r\n sign_up_title: 'New to API Hub?',\r\n sign_up: 'Create an API Hub Account',\r\n forgot_password: 'Forgot password?',\r\n },\r\n notifications: {\r\n invalid_credentials: 'Invalid credentials. Please try again or use the forgot password link below',\r\n selected_scheme: 'Signing in with',\r\n },\r\n },\r\n account_setup: {\r\n title: 'Complete And Activate Account',\r\n fields: {\r\n firstname: 'First Name',\r\n lastname: 'Last Name',\r\n email: 'Email',\r\n username: 'Username',\r\n password: 'Password',\r\n confirm_password: 'Confirm Password',\r\n },\r\n actions: {\r\n submit: 'Activate Your Account',\r\n open_login_page: 'Go to Sign In',\r\n },\r\n validation: {\r\n error_password_match: 'The passwords do not match',\r\n error_username_not_unique: 'This username is not unique',\r\n tooltip_username: 'Minimum 6 characters\\nMaximum 60 characters',\r\n tooltip_password: 'Password requirements:\\n- Minimum 8 characters\\n- Maximum 60 characters\\n- At least one lowercase character\\n- At least one uppercase character\\n- At least one number\\n- At least one special character: !@#$%^&*',\r\n tooltip_password_confirm: 'Repeat your password',\r\n },\r\n notifications: {\r\n prepare: 'Preparing form...',\r\n invalid_request: 'Your account cannot be set up.',\r\n success: 'Your account has been successfully set up.',\r\n },\r\n terms_of_use: {\r\n terms_of_use_acknowledgement: 'I have read and accept the ',\r\n terms_of_use: 'Terms of Use',\r\n terms_of_use_validation: 'Accept our terms and conditions',\r\n terms_of_use_dialog: {\r\n title: 'Terms of Use',\r\n close: 'Close',\r\n },\r\n },\r\n },\r\n reset_password: {\r\n title: 'Reset Password',\r\n fields: {\r\n username: 'Username',\r\n },\r\n actions: {\r\n submit: 'Submit',\r\n },\r\n form_details: {\r\n instructions: 'Enter your username',\r\n description: 'We will email a link to reset your password.',\r\n },\r\n },\r\n reset_password_confirm: {\r\n title: 'Reset Password Request Sent',\r\n actions: {\r\n open_login_page: 'Go to Sign In',\r\n },\r\n form_details: {\r\n instructions: 'Check your email.',\r\n description: 'Click the link in your email to reset your password.',\r\n },\r\n },\r\n new_password: {\r\n title: 'Create New Password',\r\n fields: {\r\n current_password: 'Current Password',\r\n password: 'Password',\r\n confirm_password: 'Confirm Password',\r\n },\r\n actions: {\r\n change_password: 'Change password',\r\n open_login_page: 'Go to Sign In',\r\n },\r\n validation: {\r\n error_password_match: 'The passwords do not match',\r\n tooltip_password: 'Password requirements:\\n- Minimum 8 characters\\n- Maximum 60 characters\\n- At least one lowercase character\\n- At least one uppercase character\\n- At least one number\\n- At least one special character: !@#$%^&*',\r\n tooltip_password_confirm: 'Repeat your password',\r\n },\r\n notifications: {\r\n confirmation: 'Your password has been reset. Use your new password to log in.',\r\n verifying_token: 'Verifying your password reset request...',\r\n invalid_token: 'Cannot create a new password: your token is invalid.',\r\n },\r\n },\r\n menu: {\r\n user_details: {\r\n full_name: '%{last_name} %{first_name}',\r\n },\r\n },\r\n homepage: {\r\n placeholder_empty_content: 'The Home page content has not been provided yet. Portal Admins can click Create to add content.',\r\n },\r\n actions: {\r\n view_as_cards: 'Display as cards',\r\n view_as_list: 'Display as list',\r\n tree_drop_before: 'Before %{title}',\r\n tree_drop_after: 'After %{title}',\r\n select_an_api_plan: 'Select an API Plan (Required)',\r\n },\r\n validation: {\r\n password: {\r\n at_least_one_lowercase_character: 'At least one lowercase character',\r\n at_least_one_uppercase_character: 'At least one uppercase character',\r\n at_least_one_number: 'At least one number',\r\n at_least_one_special_character: 'At least one special character: !@#$%^&*',\r\n },\r\n },\r\n markdown_editor: {\r\n fonts: {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n strikethrough: 'Strikethrough',\r\n unordered: 'Unordered List',\r\n order: 'Ordered List',\r\n quote: 'Quote',\r\n hr: 'Line Break',\r\n inlinecode: 'Inline Code',\r\n code: 'Block Code',\r\n },\r\n },\r\n terms_and_conditions: {\r\n api_label: 'By clicking Select API, I accept the Terms and Conditions',\r\n api_group_label: 'By clicking Select API Group, I accept the Terms and Conditions',\r\n },\r\n },\r\n resources: {\r\n apis: {\r\n name: 'API |||| APIs',\r\n fields: {\r\n name: 'Name',\r\n portalStatus: 'State',\r\n accessStatus: 'Visibility',\r\n apiServiceType: 'Type',\r\n ssgServiceType: 'Type',\r\n createTs: 'Created',\r\n modifyTs: 'Modified',\r\n version: 'Version',\r\n versionShort: 'V',\r\n description: 'Description',\r\n privateDescription: 'Private Description',\r\n tags: 'Tags',\r\n applicationUsage: 'Applications',\r\n assets: 'Assets',\r\n apiLocation: 'API Location',\r\n apiGroup: 'API Group',\r\n },\r\n portalStatus: {\r\n enabled: 'Enabled',\r\n disabled: 'Disabled',\r\n deprecated: 'Deprecated',\r\n unpublished: 'Unpublished',\r\n incomplete: 'Incomplete',\r\n new: 'New',\r\n },\r\n accessStatus: {\r\n public: 'Public',\r\n private: 'Private',\r\n },\r\n last_update: {\r\n fields: {\r\n updated: 'Modified %{date}',\r\n },\r\n },\r\n list: {\r\n cards: {\r\n fields: {\r\n updated: 'Modified %{date}',\r\n version: 'v%{version}',\r\n applications: '%{smart_count} app(s)',\r\n applications_long: '1 application using this API |||| %{smart_count} applications using this API',\r\n averageLatency: '%{ms} ms',\r\n averageLatency_long: 'Average latency past 7 days',\r\n },\r\n },\r\n sort: {\r\n name: {\r\n asc: 'API name: A-Z',\r\n desc: 'API name: Z-A',\r\n },\r\n createTs: {\r\n asc: 'Date created: old to new',\r\n desc: 'Date created: new to old',\r\n },\r\n modifyTs: {\r\n asc: 'Date modified: old to new',\r\n desc: 'Date modified: new to old',\r\n },\r\n },\r\n filters: {\r\n search: 'Search by name or description',\r\n },\r\n },\r\n overview: {\r\n title: 'Overview',\r\n fields: {\r\n version: 'v%{version}',\r\n },\r\n actions: {\r\n download_assets: 'Download Assets',\r\n },\r\n notifications: {\r\n no_assets: 'No assets associated with this API.',\r\n },\r\n },\r\n specification: {\r\n title: 'Specs',\r\n fields: {\r\n select_application_label: 'Apps being used',\r\n },\r\n actions: {\r\n select_application: 'Select application to use its default key.',\r\n search_or_select_application: 'Search or Select Application',\r\n },\r\n },\r\n documentation: {\r\n title: 'Documentation',\r\n },\r\n },\r\n apiGroups: {\r\n name: 'API Group |||| API Groups',\r\n short_name: 'Group |||| Groups',\r\n fields: {\r\n name: 'Name',\r\n },\r\n },\r\n apiPlans: {\r\n name: 'API Plan |||| API Plans',\r\n fields: {\r\n name: 'Name',\r\n description: 'Description',\r\n rate_limit: 'Rate Limit',\r\n quota: 'Quota',\r\n quota_interval: 'Quota Interval',\r\n second: 'second',\r\n day: 'day',\r\n month: 'month',\r\n },\r\n },\r\n applications: {\r\n name: 'Application |||| Applications',\r\n fields: {\r\n name: 'Name',\r\n apiKey: 'API Key:',\r\n keySecret: 'Shared Secret:',\r\n apiKeyClientID: 'API Key / Client ID',\r\n apisIncluded: 'APIs Included',\r\n authentication: 'Authentication',\r\n description: 'Description',\r\n encrypted: 'Encrypted',\r\n sharedSecretClientSecret: 'Shared Secret / Client Secret',\r\n oauthType: 'OAuth Type',\r\n oauthCallbackUrl: 'OAuth Callback URL',\r\n oauthScope: 'OAuth Scope',\r\n overview: 'Overview',\r\n status: 'State',\r\n apiGroups: 'API Groups',\r\n apiGroup: 'API Group',\r\n organization: 'Organization',\r\n applicationInformation: 'Application Information',\r\n customField: 'Custom Fields',\r\n noCustomFields: 'No available custom fields',\r\n noApplications: 'No available applications',\r\n apiManagement: 'API Management',\r\n authCredentials: 'Authentication and Credentials',\r\n callbackUrl: 'Callback/Redirect URL(s)',\r\n scope: 'Scope',\r\n type: 'Type',\r\n none: 'None',\r\n public: 'Public',\r\n confidential: 'Confidential',\r\n sharedSecretFormat: 'Shared Secret Format',\r\n selectOrganization: 'Select organization',\r\n apiPlan: 'API Plan',\r\n quota: 'Quota',\r\n rateLimit: 'Rate Limit',\r\n termsOfUseApi: 'By clicking Add API, I accept Terms and Conditions',\r\n actions: 'Actions',\r\n default: 'Default',\r\n },\r\n actions: {\r\n generateSecret: 'Generate New Secret',\r\n copyNewSecret: 'Copy New Secret',\r\n plainTextSecret: 'Plain text secret',\r\n hashedSecret: 'Hashed secret',\r\n cancel: 'Cancel',\r\n save: 'Save',\r\n addApplication: 'Add Application',\r\n createApplication: 'Create Application',\r\n deleteApplication: 'Delete Application',\r\n deleting_title: 'Deleting Application',\r\n select_api: 'Select API',\r\n addApi: 'Add API',\r\n addApiGroup: 'Add API Group',\r\n searchByApiTitle: 'Search',\r\n filterByTag: 'Filter by tag',\r\n accept_terms_and_conditions: 'I Accept the Terms & Conditions',\r\n edit: 'Edit',\r\n delete: 'Delete',\r\n },\r\n validation: {\r\n error_application_name_not_unique: 'This application name is not unique',\r\n callback_url_caption: 'Use comma separated values',\r\n scope_caption: 'Use space separated values',\r\n application_name_caption: 'Use unique name 50 characters (max)',\r\n },\r\n status: {\r\n enabled: 'Enabled',\r\n disabled: 'Disabled',\r\n deprecated: 'Deprecated',\r\n incomplete: 'Incomplete',\r\n unpublished: 'Unpublished',\r\n rejected: 'Rejected',\r\n application_pending_approval: 'Pending Approval',\r\n edit_application_pending_approval: 'Pending Approval',\r\n },\r\n list: {\r\n sort: {\r\n name: {\r\n asc: 'Application Name: A-Z',\r\n desc: 'Application Name: Z-A',\r\n },\r\n },\r\n },\r\n notifications: {\r\n configuration: 'Configuration',\r\n copy_success: 'Copied to Clipboard successfully',\r\n copy_error: 'Copy to Clipboard failed',\r\n generate_secret_warning_1: 'Generating a new secret changes the API key and voids the current API key.',\r\n generate_secret_warning_2: 'This breaks access for anyone using the current API key. Share and use the newly generated secret with developers coding their application that uses the APIs.',\r\n secret_generated_heading: 'New Secret Generated',\r\n secret_generated_heading_error: 'An error occurred while generating the secret',\r\n secret_generated_message: 'Text secret will only be visible during the current browser session and will be hashed after the page has been refreshed.',\r\n copy_secret_now: 'Copy the shared secret now',\r\n copy_to_clipboard: 'Copy to Clipboard',\r\n edit_overview: 'Edit overview',\r\n empty_overview: 'No value',\r\n create_success: 'Application successfully created.',\r\n create_error: 'An error occurred while creating the application.',\r\n edit_success: 'Application successfully updated.',\r\n edit_error: 'An error occurred while updating the application.',\r\n delete_success: 'Application successfully deleted.',\r\n delete_error: 'An error occurred while deleting the application.',\r\n },\r\n confirm_delete: 'You are about to delete this application. Are you sure?',\r\n deleting_content: 'Undeploying keys and deleting application. This may take several minutes.',\r\n },\r\n documents: {\r\n name: 'Wiki |||| Wiki',\r\n fields: {\r\n title: 'Title',\r\n navtitle: 'URI',\r\n markdown: 'Content',\r\n modifyTs: 'Last Modified',\r\n ordinal: 'Position',\r\n new_document: 'New document',\r\n select_documentation_locale: 'Selected language',\r\n },\r\n actions: {\r\n // Toolbar\r\n new_document_button: 'New root document',\r\n new_child_document_button: 'New child',\r\n edit_document_button: 'Edit',\r\n delete_document_button: 'Delete',\r\n change_document_parent_button: 'Change parent',\r\n // Tree\r\n expand_documentation: 'Expand documentation of node {title}',\r\n collapse_documentation: 'Collapse documentation of node {title}',\r\n // Drag & Drop\r\n move_as_first_child: 'First document',\r\n move_after_document: 'After %{title}',\r\n move_as_root_item: 'Select to move to root',\r\n // Form\r\n save: 'Publish',\r\n cancel: 'Cancel',\r\n },\r\n validation: {\r\n error_no_special_characters: 'The URI must contain only uncoded characters. Supports letters from a to z, and the separators - and _.',\r\n error_navtitle_not_unique: 'This URI already exists.',\r\n },\r\n notifications: {\r\n tree_updated_success: 'Documentation tree updated successfully',\r\n tree_updated_error: 'Documentation tree update has failed',\r\n create_success: 'Document successfully created.',\r\n create_error: 'An error occurred while creating the document.',\r\n edit_success: 'Document successfully updated.',\r\n edit_error: 'An error occurred while updating the document.',\r\n delete_success: 'Document successfully deleted.',\r\n delete_error: 'An error occurred while deleting the document.',\r\n unsaved_changes: 'If you leave this page, your changes will be lost. Do you want to cancel editing this document?',\r\n },\r\n confirm_delete_document_without_children: 'You are about to delete this document. Are you sure?',\r\n confirm_delete_document_with_children: 'You are about to delete this document and its child documents. Are you sure?',\r\n },\r\n registrations: {\r\n title: 'Create a New Account',\r\n fields: {\r\n email: 'Email',\r\n email_confirmation: 'Confirm Email',\r\n organization: 'Organization or Workspace',\r\n organization_description: 'Organization Description',\r\n robot: \"I'm not a robot\",\r\n },\r\n actions: {\r\n submit: 'Submit',\r\n login: 'Sign In To An Existing Account',\r\n return_to_homepage: 'Return to homepage',\r\n },\r\n notifications: {\r\n confirmation_required: 'Confirmation required',\r\n error: 'There was a problem registering your account.',\r\n confirmation_title: 'Check Your Email',\r\n confirmation: 'Registration received. A notification email will be sent to the address provided.',\r\n email_confirmation_error: 'Email does not match.',\r\n form_confirmation_error: 'Confirmation required.',\r\n limituserregistration: 'Registration request for this email is pending approval/activation. Multiple requests are not allowed.',\r\n },\r\n slider: {\r\n confirmed: 'Confirmed',\r\n unconfirmed: 'Slide to Confirm',\r\n },\r\n },\r\n userContexts: {\r\n title: 'My Profile',\r\n fields: {\r\n userDetails: {\r\n username: 'Username',\r\n lastName: 'Last Name',\r\n firstName: 'First Name',\r\n email: 'Email',\r\n password: 'Password',\r\n },\r\n currentPassword: 'Current Password',\r\n newPassword: 'Password',\r\n confirmNewPassword: 'Confirm Password',\r\n },\r\n actions: {\r\n edit_profile: 'My Profile',\r\n cancel: 'Cancel',\r\n },\r\n notifications: {\r\n profile_not_exist_error: 'This profile does not exist',\r\n update_success: 'Profile updated',\r\n update_error: 'The profile update has failed',\r\n invalid_password: 'The current password in invalid',\r\n confirm_password_change: 'Your password has been reset. Use your new password to log in.',\r\n },\r\n validation: {\r\n error_current_password_empty: 'Please enter your current password',\r\n error_password_match: 'The passwords do not match',\r\n tooltip_password: 'Password requirements:\\n- Minimum 8 characters\\n- Maximum 60 characters\\n- At least one lowercase character\\n- At least one uppercase character\\n- At least one number\\n- At least one special character: !@#$%^&*',\r\n tooltip_password_confirm: 'Repeat your password',\r\n },\r\n accessibleOrgs: {\r\n title: 'My Organization |||| My Organizations',\r\n },\r\n activeOrgUuid: {\r\n status: {\r\n active: 'Selected organization',\r\n not_active: 'Organization not selected',\r\n },\r\n notifications: {\r\n update_success: 'Your organization updated successfully',\r\n update_error: 'The organization update has failed',\r\n },\r\n },\r\n },\r\n userProfiles: {\r\n passwordDialogTitle: 'Enter Current Password',\r\n fields: {\r\n userName: 'Username',\r\n lastName: 'Last Name',\r\n firstName: 'First Name',\r\n email: 'Email',\r\n password: 'Password',\r\n currentPassword: 'Current Password',\r\n newPassword: 'New Password',\r\n confirmNewPassword: 'Confirm New Password',\r\n },\r\n actions: {\r\n edit_profile: 'My Profile',\r\n admin_invite: 'Invite Members',\r\n cancel: 'Cancel',\r\n submit: 'Submit',\r\n },\r\n notifications: {\r\n update_success: 'Profile updated',\r\n },\r\n validation: {\r\n error_password_empty: \"Password can't be blank\",\r\n error_password_match: 'The passwords do not match',\r\n error_password_not_matching_criteria: 'Password must meet the specified password requirements.',\r\n tooltip_current_password: 'Password required to make changes. Please enter your current password.',\r\n tooltip_password_title: 'Password requirements:',\r\n tooltip_password_min: '-Minimum %{num} characters',\r\n tooltip_password_max: '-Maximum %{num} characters',\r\n tooltip_password_lower: '-At least %{num} lowercase character(s)',\r\n tooltip_password_upper: '-At least %{num} uppercase character(s)',\r\n tooltip_password_number: '-At least %{num} number(s)',\r\n tooltip_password_special: '-At least %{num} special character(s): %{symbols}',\r\n tooltip_password_confirm: 'Repeat your password',\r\n },\r\n },\r\n },\r\n};\r\nexport default mergeTranslations(raMessages, apiHubMessages);\r\n//# sourceMappingURL=en.js.map","import { mergeTranslations } from 'react-admin';\r\nimport raMessages from 'ra-language-english';\r\nconst apiHubMessages = {\r\n ra: Object.assign(Object.assign({}, raMessages), { page: {\r\n dashboard: 'Página principal',\r\n }, action: {\r\n add_filter: 'Añadir filtro',\r\n show: 'Mostrar',\r\n edit: 'Editar',\r\n bulk_actions: '1 artículo seleccionado |||| %{smart_count} elementos seleccionados',\r\n loading: 'Cargando...',\r\n }, actions: Object.assign(Object.assign({}, raMessages.actions), { open_sidebar: 'Abrir el menú', close_sidebar: 'Cerrar el menú' }), navigation: Object.assign(Object.assign({}, raMessages.navigation), { page_rows_per_page: 'Elementos por página:', next: 'Sigu', prev: 'Ante' }), auth: {\r\n logout: 'Cerrar Sesión',\r\n } }),\r\n apihub: {\r\n login: {\r\n title: 'Iniciar sesión en API Hub',\r\n fields: {\r\n username: 'Nombre de usuario',\r\n password: 'Contraseña',\r\n },\r\n actions: {\r\n sign_in: 'Iniciar sesión',\r\n sign_in_with: 'Iniciar sesión con',\r\n sign_up_title: '¿Primera vez en API Hub?',\r\n sign_up: 'Crear una cuenta de API Hub',\r\n forgot_password: '¿Ha olvidado la contraseña?',\r\n },\r\n notifications: {\r\n invalid_credentials: 'Credenciales no válidas. Vuelva a intentarlo o utilice el enlace de contraseña olvidada a continuación',\r\n selected_scheme: 'Iniciando sesión con',\r\n },\r\n },\r\n account_setup: {\r\n title: 'Completar y activar la cuenta',\r\n fields: {\r\n firstname: 'Nombre',\r\n lastname: 'Apellido',\r\n email: 'Correo electrónico',\r\n username: 'Nombre de usuario',\r\n password: 'Contraseña',\r\n confirm_password: 'Confirmar contraseña',\r\n },\r\n actions: {\r\n submit: 'Activar cuenta',\r\n open_login_page: 'Ir a Iniciar sesión',\r\n },\r\n validation: {\r\n error_password_match: 'Las contraseñas no coinciden',\r\n error_username_not_unique: 'Este nombre de usuario no es único.',\r\n tooltip_username: '6 caracteres como mínimo\\n60 caracteres como máximo',\r\n tooltip_password: 'Requisitos de la contraseña:\\n- 8 caracteres como mínimo\\n- 60 caracteres como máximo\\n- Al menos un carácter en minúscula\\n- Al menos un carácter en mayúscula\\n- Al menos un número\\n- Al menos un carácter especial: !@#$%^&*',\r\n tooltip_password_confirm: 'Repita la contraseña',\r\n },\r\n notifications: {\r\n prepare: 'Preparando formulario...',\r\n invalid_request: 'No se puede configurar la cuenta.',\r\n success: 'La cuenta se ha configurado correctamente.',\r\n },\r\n terms_of_use: {\r\n terms_of_use_acknowledgement: 'He leído y acepto los ',\r\n terms_of_use: 'Términos de uso',\r\n terms_of_use_validation: 'Aceptar nuestros términos y condiciones',\r\n terms_of_use_dialog: {\r\n title: 'Términos de uso',\r\n close: 'Cerrar',\r\n },\r\n },\r\n },\r\n reset_password: {\r\n title: 'Restablecer contraseña',\r\n fields: {\r\n username: 'Nombre de usuario',\r\n },\r\n actions: {\r\n submit: 'Enviar',\r\n },\r\n form_details: {\r\n instructions: 'Introduzca el nombre de usuario',\r\n description: 'Le enviaremos un vínculo para restablecer la contraseña.',\r\n },\r\n },\r\n reset_password_confirm: {\r\n title: 'Solicitud de restablecimiento de la contraseña enviada',\r\n actions: {\r\n open_login_page: 'Ir a Iniciar sesión',\r\n },\r\n form_details: {\r\n instructions: 'Compruebe el correo electrónico.',\r\n description: 'Haga clic en el vínculo del correo electrónico para restablecer la contraseña.',\r\n },\r\n },\r\n new_password: {\r\n title: 'Crear nueva contraseña',\r\n fields: {\r\n current_password: 'Contraseña actual',\r\n password: 'Contraseña',\r\n confirm_password: 'Confirmar contraseña',\r\n },\r\n actions: {\r\n change_password: 'Cambiar contraseña',\r\n open_login_page: 'Ir a Iniciar sesión',\r\n },\r\n validation: {\r\n error_password_match: 'Las contraseñas no coinciden',\r\n tooltip_password: 'Requisitos de la contraseña:\\n- 8 caracteres como mínimo\\n- 60 caracteres como máximo\\n- Al menos un carácter en minúscula\\n- Al menos un carácter en mayúscula\\n- Al menos un número\\n- Al menos un carácter especial: !@#$%^&*',\r\n tooltip_password_confirm: 'Repita la contraseña',\r\n },\r\n notifications: {\r\n confirmation: 'Se ha restablecido la contraseña. Utilice la nueva contraseña para iniciar sesión.',\r\n verifying_token: 'Se está verificando la solicitud de restablecimiento de la contraseña...',\r\n invalid_token: 'No se puede crear una nueva contraseña porque el token no es válido.',\r\n },\r\n },\r\n menu: {\r\n user_details: {\r\n full_name: '%{last_name} %{first_name}',\r\n },\r\n },\r\n homepage: {\r\n placeholder_empty_content: 'Todavía no se ha proporcionado el contenido de la página principal. Los administradores del portal pueden hacer clic en Crear para agregar contenido.',\r\n },\r\n actions: {\r\n view_as_cards: 'Mostrar como tarjetas',\r\n view_as_list: 'Mostrar como lista',\r\n tree_drop_before: 'Antes de %{title}',\r\n tree_drop_after: 'Después de %{title}',\r\n select_an_api_plan: 'Seleccionar un plan de la API (obligatorio)',\r\n },\r\n validation: {\r\n password: {\r\n at_least_one_lowercase_character: 'Al menos un carácter en minúscula',\r\n at_least_one_uppercase_character: 'Al menos un carácter en mayúscula',\r\n at_least_one_number: 'Al menos un número',\r\n at_least_one_special_character: 'Al menos un carácter especial: !@#$%^&*',\r\n },\r\n },\r\n markdown_editor: {\r\n fonts: {\r\n bold: 'Negrita',\r\n italic: 'Cursiva',\r\n strikethrough: 'Tachado',\r\n unordered: 'Lista desordenada',\r\n order: 'Lista ordenada',\r\n quote: 'Comillas',\r\n hr: 'Salto de línea',\r\n inlinecode: 'Código en línea',\r\n code: 'Código de bloque',\r\n },\r\n },\r\n terms_and_conditions: {\r\n api_label: 'Al hacer clic en Seleccionar API, acepto los términos y condiciones.',\r\n api_group_label: 'Al hacer clic en Seleccionar grupo de API, acepto los términos y condiciones.',\r\n },\r\n },\r\n resources: {\r\n apis: {\r\n name: 'API |||| Las API',\r\n fields: {\r\n name: 'Nombre',\r\n portalStatus: 'Estado',\r\n accessStatus: 'Visibilidad',\r\n apiServiceType: 'Tipo',\r\n ssgServiceType: 'Tipo',\r\n createTs: 'Creada',\r\n modifyTs: 'Modificado',\r\n version: 'Versión',\r\n versionShort: 'V',\r\n description: 'Descripción',\r\n privateDescription: 'Descripción privada',\r\n tags: 'Etiquetas',\r\n applicationUsage: 'Aplicaciones',\r\n assets: 'Activos',\r\n apiLocation: 'Ubicación de la API',\r\n apiGroup: 'Grupo de API',\r\n },\r\n portalStatus: {\r\n enabled: 'Activado',\r\n disabled: 'Desactivado',\r\n deprecated: 'Obsoleto',\r\n unpublished: 'Sin publicar',\r\n incomplete: 'Incompleto',\r\n },\r\n accessStatus: {\r\n public: 'Público',\r\n private: 'Privada',\r\n },\r\n last_update: {\r\n fields: {\r\n updated: 'Modificada el %{date}',\r\n },\r\n },\r\n list: {\r\n cards: {\r\n fields: {\r\n updated: 'Modificada el %{date}',\r\n version: 'v%{version}',\r\n applications: '% {smart_count} aplicaciones',\r\n applications_long: '1 aplicación que utiliza esta API |||| %{smart_count} aplicaciones que utilizan esta API',\r\n averageLatency: '%{ms} ms',\r\n averageLatency_long: 'Latencia media en los últimos 7 días',\r\n },\r\n },\r\n sort: {\r\n name: {\r\n asc: 'Nombre de la API: A-Z',\r\n desc: 'Nombre de la API: Z-A',\r\n },\r\n createTs: {\r\n asc: 'Fecha de creación: de la más anterior a la más reciente',\r\n desc: 'Fecha de creación: de la más reciente a la más anterior',\r\n },\r\n modifyTs: {\r\n asc: 'Fecha de modificación: de la más anterior a la más reciente',\r\n desc: 'Fecha de modificación: de la más reciente a la más anterior',\r\n },\r\n },\r\n filters: {\r\n search: 'Buscar por nombre o descripción',\r\n },\r\n },\r\n overview: {\r\n title: 'Descripción general',\r\n fields: {\r\n version: 'v%{version}',\r\n },\r\n actions: {\r\n download_assets: 'Descargar activos',\r\n },\r\n notifications: {\r\n no_assets: 'No hay ningún activo asociado a esta API.',\r\n },\r\n },\r\n specification: {\r\n title: 'Especificaciones',\r\n fields: {\r\n select_application_label: 'Aplicaciones en uso',\r\n },\r\n actions: {\r\n select_application: 'Seleccione la aplicación para usar su clave predeterminada',\r\n search_or_select_application: 'Buscar o seleccionar aplicación',\r\n },\r\n },\r\n documentation: {\r\n title: 'Documentación',\r\n },\r\n },\r\n apiGroups: {\r\n name: 'Grupo de API |||| Grupos de API',\r\n short_name: 'Grupo |||| Grupos',\r\n fields: {\r\n name: 'Nombre',\r\n },\r\n },\r\n apiPlans: {\r\n name: 'Plan de la API ||| Planes de la API',\r\n fields: {\r\n name: 'Nombre',\r\n description: 'Descripción',\r\n rate_limit: 'Límite de frecuencia',\r\n quota: 'Cuota',\r\n quota_interval: 'Intervalo de cuota',\r\n second: 'segundo',\r\n day: 'día',\r\n month: 'mes',\r\n },\r\n },\r\n applications: {\r\n name: 'Aplicación |||| Aplicaciones',\r\n fields: {\r\n name: 'Nombre',\r\n apiKey: 'Clave de la API:',\r\n keySecret: 'Secreto compartido:',\r\n apiKeyClientID: 'Clave de la API/ID de cliente',\r\n apisIncluded: 'API incluidas',\r\n authentication: 'Autenticación',\r\n description: 'Descripción',\r\n encrypted: 'Cifrado',\r\n sharedSecretClientSecret: 'Secreto compartido/secreto de cliente',\r\n oauthType: 'Tipo de OAuth',\r\n oauthCallbackUrl: 'Dirección URL de la devolución de llamada de OAuth',\r\n oauthScope: 'Ámbito de OAuth',\r\n overview: 'Descripción general',\r\n status: 'Estado',\r\n apiGroups: 'Grupos de API',\r\n apiGroup: 'Grupo de API',\r\n organization: 'Organización',\r\n applicationInformation: 'Información de la aplicación',\r\n customField: 'Campo personalizado',\r\n noCustomFields: 'No hay campos personalizados disponibles',\r\n noApplications: 'No hay aplicaciones disponibles',\r\n apiManagement: 'Gestión de la API',\r\n authCredentials: 'Autenticación y credenciales',\r\n callbackUrl: 'Direcciones URL de devolución de llamada o redirección',\r\n scope: 'Ámbito',\r\n type: 'Tipo',\r\n none: 'Ninguno',\r\n public: 'Público',\r\n confidential: 'Confidencial',\r\n sharedSecretFormat: 'Formato del secreto compartido',\r\n selectOrganization: 'Seleccionar organización',\r\n apiPlan: 'Plan de la API',\r\n quota: 'Cuota',\r\n rateLimit: 'Límite de frecuencia',\r\n termsOfUseApi: 'Al hacer clic en Agregar API, acepto los términos y condiciones.',\r\n actions: 'Comportamiento',\r\n default: 'Defecto',\r\n },\r\n actions: {\r\n generateSecret: 'Generar nuevo secreto',\r\n copyNewSecret: 'Copiar secreto nuevo',\r\n plainTextSecret: 'Secreto de texto sin formato',\r\n hashedSecret: 'Secreto con hash',\r\n cancel: 'Cancelar',\r\n save: 'Guardar',\r\n addApplication: 'Agregar aplicación',\r\n createApplication: 'Crear aplicación',\r\n deleteApplication: 'Suprimir aplicación',\r\n deleting_title: 'Eliminando aplicación',\r\n select_api: 'Seleccionar API',\r\n addApi: 'Agregar API',\r\n addApiGroup: 'Agregar grupo de API',\r\n searchByApiTitle: 'Buscar',\r\n filterByTag: 'Filtrar por etiqueta',\r\n accept_terms_and_conditions: 'Acepto los términos y condiciones.',\r\n edit: 'Editar',\r\n delete: 'Suprimir',\r\n },\r\n validation: {\r\n error_application_name_not_unique: 'Este nombre de aplicación no es exclusivo.',\r\n callback_url_caption: 'Utilizar valores separados por comas',\r\n scope_caption: 'Utilizar valores separados por espacios',\r\n application_name_caption: 'Utilizar nombre único de 50 caracteres como máximo',\r\n },\r\n status: {\r\n enabled: 'Activado',\r\n disabled: 'Desactivado',\r\n deprecated: 'Obsoleto',\r\n unpublished: 'Sin publicar',\r\n rejected: 'Rechazado',\r\n application_pending_approval: 'Pendiente de aprobación',\r\n edit_application_pending_approval: 'Pendiente de aprobación',\r\n },\r\n list: {\r\n sort: {\r\n name: {\r\n asc: 'Nombre de la aplicación: A-Z',\r\n desc: 'Nombre de la aplicación: Z-A',\r\n },\r\n },\r\n },\r\n notifications: {\r\n configuration: 'Configuración',\r\n copy_success: 'Se ha copiado en el portapapeles correctamente.',\r\n copy_error: 'Se ha producido un error al copiar al portapapeles.',\r\n generate_secret_warning_1: 'Al generar un nuevo secreto se cambia la clave de la API y se anula la clave de la API actual.',\r\n generate_secret_warning_2: 'Esto rompe el acceso para todos los usuarios que utilicen la clave de la API actual. Comparta y utilice el secreto recién generado con los desarrolladores que codifican la aplicación que utiliza las API.',\r\n secret_generated_heading: 'Nuevo secreto generado',\r\n secret_generated_heading_error: 'Se ha producido un error al generar el secreto.',\r\n secret_generated_message: 'El texto del secreto solo será visible durante la sesión actual del explorador y se aplicará un algoritmo hash después de que se haya actualizado la página.',\r\n copy_secret_now: 'Copiar el secreto compartido ahora',\r\n copy_to_clipboard: 'Copiar a portapapeles',\r\n edit_overview: 'Editar descripción general',\r\n empty_overview: 'Sin valor',\r\n create_success: 'La aplicación se ha creado correctamente.',\r\n create_error: 'Se ha producido un error al crear la aplicación.',\r\n edit_success: 'La aplicación se ha actualizado correctamente.',\r\n edit_error: 'Se ha producido un error al actualizar la aplicación.',\r\n delete_success: 'La aplicación se ha suprimido correctamente.',\r\n delete_error: 'Se ha producido un error al suprimir la aplicación.',\r\n },\r\n confirm_delete: 'Está a punto de suprimir este aplicación. ¿Está seguro?',\r\n deleting_content: 'Anulación de la implementación de claves y eliminación de la aplicación. Esto puede tomar varios minutos.',\r\n },\r\n documents: {\r\n name: 'Wiki |||| Wiki',\r\n fields: {\r\n title: 'Título',\r\n navtitle: 'URI',\r\n markdown: 'Contenido',\r\n modifyTs: 'Última modificación',\r\n ordinal: 'Posición',\r\n new_document: 'Nuevo documento',\r\n select_documentation_locale: 'Idioma seleccionado',\r\n },\r\n actions: {\r\n // Toolbar\r\n new_document_button: 'New root document',\r\n new_child_document_button: 'Nuevo elemento secundario',\r\n edit_document_button: 'Editar',\r\n delete_document_button: 'Suprimir',\r\n change_document_parent_button: 'Cambiar elemento principal',\r\n // Tree\r\n expand_documentation: 'Expand documentation of node {title}',\r\n collapse_documentation: 'Contraer la documentación del nodo {title}',\r\n // Drag & Drop\r\n move_as_first_child: 'First document',\r\n move_after_document: 'Después de %{title}',\r\n move_as_root_item: 'Seleccionar para desplazarse al elemento raíz',\r\n // Form\r\n save: 'Publish',\r\n cancel: 'Cancelar',\r\n },\r\n validation: {\r\n error_no_special_characters: 'El URI solo debe contener caracteres no codificados. Admite letras de la a a la z y los separadores - y _.',\r\n error_navtitle_not_unique: 'Este URI ya existe.',\r\n },\r\n notifications: {\r\n tree_updated_success: 'El árbol de la documentación se ha actualizado correctamente.',\r\n tree_updated_error: 'Se ha producido un error al actualizar el árbol de la documentación.',\r\n create_success: 'El documento se ha creado correctamente.',\r\n create_error: 'Se ha producido un error al crear el documento.',\r\n edit_success: 'El documento se ha actualizado correctamente.',\r\n edit_error: 'Se ha producido un error al actualizar el documento.',\r\n delete_success: 'El documento se ha suprimido correctamente.',\r\n delete_error: 'Se ha producido un error al suprimir el documento.',\r\n unsaved_changes: 'Si abandona la página, se perderán los cambios realizados. ¿Desea cancelar la edición de este documento?',\r\n },\r\n confirm_delete_document_without_children: 'Está a punto de suprimir este documento. ¿Está seguro?',\r\n confirm_delete_document_with_children: 'Está a punto de suprimir este documento y sus documentos secundarios. ¿Está seguro?',\r\n },\r\n registrations: {\r\n title: 'Crear una nueva cuenta',\r\n fields: {\r\n email: 'Correo electrónico',\r\n email_confirmation: 'Confirmar correo electrónico',\r\n organization: 'Organización o espacio de trabajo',\r\n organization_description: 'Descripción de la organización',\r\n robot: 'No soy un robot',\r\n },\r\n actions: {\r\n submit: 'Enviar',\r\n login: 'Iniciar sesión en una cuenta existente',\r\n return_to_homepage: 'Volver a la página principal',\r\n },\r\n notifications: {\r\n confirmation_required: 'Confirmación obligatoria',\r\n error: 'Se ha producido un problema al registrar la cuenta.',\r\n confirmation_title: 'Comprobación del correo electrónico',\r\n confirmation: 'Se ha recibido el registro. Se enviará un correo electrónico de notificación a la dirección proporcionada.',\r\n email_confirmation_error: 'El correo electrónico no coincide.',\r\n form_confirmation_error: 'Se necesita la confirmación.',\r\n limituserregistration: 'La solicitud de registro para este correo electrónico está pendiente de aprobación o activación. No se permiten varias solicitudes.',\r\n },\r\n slider: {\r\n confirmed: 'Confirmado',\r\n unconfirmed: 'Deslizar para confirmar',\r\n },\r\n },\r\n userContexts: {\r\n title: 'Mi perfil',\r\n fields: {\r\n userDetails: {\r\n username: 'Nombre de usuario',\r\n lastName: 'Apellido',\r\n firstName: 'Nombre',\r\n email: 'Correo electrónico',\r\n password: 'Contraseña',\r\n },\r\n currentPassword: 'Contraseña actual',\r\n newPassword: 'Contraseña',\r\n confirmNewPassword: 'Confirmar contraseña',\r\n },\r\n actions: {\r\n edit_profile: 'Mi perfil',\r\n cancel: 'Cancelar',\r\n },\r\n notifications: {\r\n profile_not_exist_error: 'Este perfile no existe.',\r\n update_success: 'Perfil actualizado',\r\n update_error: 'Se ha producido un error al actualizar el perfil.',\r\n invalid_password: 'La contraseña actual no es válida.',\r\n confirm_password_change: 'Se ha restablecido la contraseña. Utilice la nueva contraseña para iniciar sesión.',\r\n },\r\n validation: {\r\n error_current_password_empty: 'Introduzca la contraseña actual.',\r\n error_password_match: 'Las contraseñas no coinciden',\r\n tooltip_password: 'Requisitos de la contraseña:\\n- 8 caracteres como mínimo\\n- 60 caracteres como máximo\\n- Al menos un carácter en minúscula\\n- Al menos un carácter en mayúscula\\n- Al menos un número\\n- Al menos un carácter especial: !@#$%^&*',\r\n tooltip_password_confirm: 'Repita la contraseña',\r\n },\r\n accessibleOrgs: {\r\n title: 'Mi organización |||| Mis organizaciones',\r\n },\r\n activeOrgUuid: {\r\n status: {\r\n active: 'Organización seleccionada',\r\n not_active: 'Organización no seleccionada',\r\n },\r\n notifications: {\r\n update_success: 'Se ha actualizado la organización correctamente.',\r\n update_error: 'Se ha producido un error al actualizar la organización.',\r\n },\r\n },\r\n },\r\n },\r\n};\r\nexport default mergeTranslations(raMessages, apiHubMessages);\r\n//# sourceMappingURL=es.js.map","import { mergeTranslations } from 'react-admin';\r\nimport raMessages from 'ra-language-english';\r\nconst apiHubMessages = {\r\n ra: Object.assign(Object.assign({}, raMessages), { page: {\r\n dashboard: 'Accueil',\r\n }, action: {\r\n add_filter: 'Ajouter un filtre',\r\n show: 'Spectacle',\r\n edit: 'Éditer',\r\n bulk_actions: '1 élément sélectionné |||| %{smart_count} articles sélectionnés',\r\n loading: 'Chargement...',\r\n }, actions: Object.assign(Object.assign({}, raMessages.actions), { open_sidebar: 'Ouvrir le menu', close_sidebar: 'Fermer le menu' }), navigation: Object.assign(Object.assign({}, raMessages.navigation), { page_rows_per_page: 'Eléments par page :', next: 'Proc', prev: 'Préc' }), auth: {\r\n logout: 'Se déconnecter',\r\n } }),\r\n apihub: {\r\n login: {\r\n title: 'Se connecter à API Hub',\r\n fields: {\r\n username: \"Nom d'utilisateur\",\r\n password: 'Mot de passe',\r\n },\r\n actions: {\r\n sign_in: 'Connexion',\r\n sign_in_with: 'Connexion avec',\r\n sign_up_title: \"Nouvel utilisateur d'API Hub ?\",\r\n sign_up: 'Créer un compte API Hub',\r\n forgot_password: 'Mot de passe oublié ?',\r\n },\r\n notifications: {\r\n invalid_credentials: \"Informations d'identification non valides. Veuillez réessayer ou utiliser le lien mot de passe oublié ci-dessous\",\r\n selected_scheme: 'Connexion avec',\r\n },\r\n },\r\n account_setup: {\r\n title: 'Terminer et activer votre compte',\r\n fields: {\r\n firstname: 'Prénom',\r\n lastname: 'Nom',\r\n email: 'Courriel',\r\n username: \"Nom d'utilisateur\",\r\n password: 'Mot de passe',\r\n confirm_password: 'Confirmer le mot de passe',\r\n },\r\n actions: {\r\n submit: 'Activer votre compte',\r\n open_login_page: 'Accéder à la page de connexion',\r\n },\r\n validation: {\r\n error_password_match: 'Les mots de passe sont différents.',\r\n error_username_not_unique: \"Ce nom d'utilisateur n'est pas unique.\",\r\n tooltip_username: '6 caractères minimum\\n60 caractères maximum',\r\n tooltip_password: 'Exigences relatives au mot de passe : \\n- 8 caractères minimum\\n- 60 caractères maximum\\n- Au moins une minuscule\\n- Au moins une majuscule\\n- Au moins un chiffre\\n- Au moins un caractère spécial parmi ceux ci-après : !@#$%^&*',\r\n tooltip_password_confirm: 'Resaisissez votre mot de passe',\r\n },\r\n notifications: {\r\n prepare: 'Préparation du formulaire..',\r\n invalid_request: 'Impossible de configurer votre compte.',\r\n success: 'Votre compte a été configuré.',\r\n },\r\n terms_of_use: {\r\n terms_of_use_acknowledgement: \"J’ai lu et j'accepte les \",\r\n terms_of_use: \"Conditions d'utilisation\",\r\n terms_of_use_validation: 'Accepter nos termes et conditions',\r\n terms_of_use_dialog: {\r\n title: \"Conditions d'utilisation\",\r\n close: 'Fermer',\r\n },\r\n },\r\n },\r\n reset_password: {\r\n title: 'Réinitialiser le mot de passe',\r\n fields: {\r\n username: \"Nom d'utilisateur\",\r\n },\r\n actions: {\r\n submit: 'Soumettre',\r\n },\r\n form_details: {\r\n instructions: \"Entrez votre nom d'utilisateur.\",\r\n description: 'Un lien de réinitialisation de votre mot de passe vous sera envoyé par courriel.',\r\n },\r\n },\r\n reset_password_confirm: {\r\n title: 'Demande de réinitialisation du mot de passe envoyée',\r\n actions: {\r\n open_login_page: 'Accéder à la page de connexion',\r\n },\r\n form_details: {\r\n instructions: 'Consultez votre boîte de réception.',\r\n description: 'Pour réinitialiser votre mot de passe, cliquez sur le lien inclus dans votre courriel.',\r\n },\r\n },\r\n new_password: {\r\n title: 'Créer un mot de passe',\r\n fields: {\r\n current_password: 'Mot de passe actuel',\r\n password: 'Mot de passe',\r\n confirm_password: 'Confirmer le mot de passe',\r\n },\r\n actions: {\r\n change_password: 'Modifier le mot de passe',\r\n open_login_page: 'Accéder à la page de connexion',\r\n },\r\n validation: {\r\n error_password_match: 'Les mots de passe sont différents.',\r\n tooltip_password: 'Exigences relatives au mot de passe : \\n- 8 caractères minimum\\n- 60 caractères maximum\\n- Au moins une minuscule\\n- Au moins une majuscule\\n- Au moins un chiffre\\n- Au moins un caractère spécial parmi ceux ci-après : !@#$%^&*',\r\n tooltip_password_confirm: 'Resaisissez votre mot de passe',\r\n },\r\n notifications: {\r\n confirmation: 'Votre mot de passe a été réinitialisé. Utilisez votre nouveau mot de passe pour vous connecter.',\r\n verifying_token: 'Vérification de votre demande de réinitialisation du mot de passe...',\r\n invalid_token: \"Impossible de créer un mot de passe : votre jeton n'est pas valide.\",\r\n },\r\n },\r\n menu: {\r\n user_details: {\r\n full_name: '%{last_name} %{first_name}',\r\n },\r\n },\r\n homepage: {\r\n placeholder_empty_content: \"Le contenu de la page d'accueil n'a pas encore été fourni. Les administrateurs du portail peuvent cliquer sur Créer pour ajouter du contenu.\",\r\n },\r\n actions: {\r\n view_as_cards: 'Afficher sous forme de cartes',\r\n view_as_list: 'Afficher sous forme de liste',\r\n tree_drop_before: 'Avant %{title}',\r\n tree_drop_after: 'Après %{title}',\r\n select_an_api_plan: \"Sélectionner un plan d'API (obligatoire)\",\r\n },\r\n validation: {\r\n password: {\r\n at_least_one_lowercase_character: 'Au moins une minuscule',\r\n at_least_one_uppercase_character: 'Au moins une majuscule',\r\n at_least_one_number: 'Au moins un chiffre',\r\n at_least_one_special_character: 'Au moins un caractère spécial parmi ceux ci-après : !@#$%^&*',\r\n },\r\n },\r\n markdown_editor: {\r\n fonts: {\r\n bold: 'Gras',\r\n italic: 'Italique',\r\n strikethrough: 'Barré',\r\n unordered: 'Liste non triée',\r\n order: 'Liste numérotée',\r\n quote: 'Citation',\r\n hr: 'Saut de ligne',\r\n inlinecode: 'Code intégré',\r\n code: 'Code de bloc',\r\n },\r\n },\r\n terms_and_conditions: {\r\n api_label: \"En cliquant sur Sélectionner une API, j'accepte les termes et conditions.\",\r\n api_group_label: \"En cliquant sur Sélectionner un groupe d'API, j'accepte les termes et conditions.\",\r\n },\r\n },\r\n resources: {\r\n apis: {\r\n name: 'API |||| API',\r\n fields: {\r\n name: 'Nom ',\r\n portalStatus: 'Etat',\r\n accessStatus: 'Visibilité',\r\n apiServiceType: 'Type',\r\n ssgServiceType: 'Type',\r\n createTs: 'Créé',\r\n modifyTs: 'Modifié',\r\n version: 'Version',\r\n versionShort: 'V',\r\n description: 'Description ',\r\n privateDescription: 'Description privée',\r\n tags: 'Etiquettes',\r\n applicationUsage: 'Applications',\r\n assets: 'Actifs',\r\n apiLocation: \"Emplacement de l'API\",\r\n apiGroup: \"Groupe d'API\",\r\n },\r\n portalStatus: {\r\n enabled: 'Activé',\r\n disabled: 'Désactivé',\r\n deprecated: 'Désapprouvé',\r\n unpublished: 'Non publié',\r\n incomplete: 'Incomplet',\r\n },\r\n accessStatus: {\r\n public: 'Public',\r\n private: 'Privée',\r\n },\r\n last_update: {\r\n fields: {\r\n updated: 'Modification %{date}',\r\n },\r\n },\r\n list: {\r\n cards: {\r\n fields: {\r\n updated: 'Modification %{date}',\r\n version: 'v%{version}',\r\n applications: '%{smart_count} application(s)',\r\n applications_long: '1 application utilisant cette API |||| %{smart_count} applications utilisant cette API',\r\n averageLatency: '%{ms} ms',\r\n averageLatency_long: 'Latence moyenne au cours des 7 derniers jours',\r\n },\r\n },\r\n sort: {\r\n name: {\r\n asc: \"Nom de l'API : A-Z\",\r\n desc: \"Nom de l'API : Z-A\",\r\n },\r\n createTs: {\r\n asc: 'Date de création : du plus ancien au plus ancien récent',\r\n desc: 'Date de création : du plus récent au plus ancien',\r\n },\r\n modifyTs: {\r\n asc: 'Date de modification : du plus ancien au plus ancien récent',\r\n desc: 'Date de modification : du plus récent au plus ancien',\r\n },\r\n },\r\n filters: {\r\n search: 'Rechercher par nom ou par description',\r\n },\r\n },\r\n overview: {\r\n title: 'Présentation',\r\n fields: {\r\n version: 'v%{version}',\r\n },\r\n actions: {\r\n download_assets: 'Télécharger les actifs',\r\n },\r\n notifications: {\r\n no_assets: \"Aucun actif n'est associé à cette API.\",\r\n },\r\n },\r\n specification: {\r\n title: 'Spécifications',\r\n fields: {\r\n select_application_label: 'Applications utilisées',\r\n },\r\n actions: {\r\n select_application: \"Sélectionnez l'application pour utiliser sa clé par défaut.\",\r\n search_or_select_application: 'Rechercher ou sélectionner une application',\r\n },\r\n },\r\n documentation: {\r\n title: 'Documentation',\r\n },\r\n },\r\n apiGroups: {\r\n name: \"Groupe d'API |||| Groupes d'API\",\r\n short_name: 'Groupe |||| Groupes',\r\n fields: {\r\n name: 'Nom ',\r\n },\r\n },\r\n apiPlans: {\r\n name: \"Plan d'API |||| Plans d'API\",\r\n fields: {\r\n name: 'Nom ',\r\n description: 'Description ',\r\n rate_limit: 'Limite de taux',\r\n quota: 'Quota',\r\n quota_interval: 'Intervalle de quota',\r\n second: 'seconde',\r\n day: 'jour',\r\n month: 'mois',\r\n },\r\n },\r\n applications: {\r\n name: 'Application |||| Applications',\r\n fields: {\r\n name: 'Nom ',\r\n apiKey: \"Clé d'API :\",\r\n keySecret: 'Secret partagé :',\r\n apiKeyClientID: \"Clé d'API/ID de client\",\r\n apisIncluded: 'API incluses',\r\n authentication: 'Authentification',\r\n description: 'Description ',\r\n encrypted: 'Chiffré',\r\n sharedSecretClientSecret: 'Secret partagé/Secret de client',\r\n oauthType: 'Type OAuth',\r\n oauthCallbackUrl: 'URL de rappel OAuth',\r\n oauthScope: 'Etendue OAuth',\r\n overview: 'Présentation',\r\n status: 'Etat',\r\n apiGroups: \"Groupes d'API\",\r\n apiGroup: \"Groupe d'API\",\r\n organization: 'Organisation',\r\n applicationInformation: \"Informations sur l'application\",\r\n customField: 'Champ personnalisé',\r\n noCustomFields: \"Aucun champ personnalisé n'est disponible.\",\r\n noApplications: \"Aucune application n'est disponible\",\r\n apiManagement: 'Gestion des API',\r\n authCredentials: \"Authentification et informations d'identification\",\r\n callbackUrl: 'URL(s) de rappel/redirection',\r\n scope: 'Portée ',\r\n type: 'Type',\r\n none: 'Aucun(e)',\r\n public: 'Public',\r\n confidential: 'Confidentiel',\r\n sharedSecretFormat: 'Format du secret partagé',\r\n selectOrganization: \"Sélectionner l'organisation\",\r\n apiPlan: \"Plan d'API\",\r\n quota: 'Quota',\r\n rateLimit: 'Limite de taux',\r\n termsOfUseApi: \"En cliquant sur Ajouter une API, j'accepte les termes et conditions.\",\r\n actions: 'Actions',\r\n default: 'Défaut',\r\n },\r\n actions: {\r\n generateSecret: 'Générer un nouveau secret',\r\n copyNewSecret: 'Copier le nouveau secret',\r\n plainTextSecret: 'Secret en texte brut',\r\n hashedSecret: 'Secret haché',\r\n cancel: 'Annuler',\r\n save: 'Enregistrer',\r\n addApplication: 'Ajouter une application',\r\n createApplication: 'Créer une application',\r\n deleteApplication: \"Supprimer l'application\",\r\n deleting_title: \"Suppression de l'application\",\r\n select_api: \"Sélectionner l'API\",\r\n addApi: 'Ajouter une API',\r\n addApiGroup: \"Ajouter un groupe d'API\",\r\n searchByApiTitle: 'Rechercher',\r\n filterByTag: 'Filtrer par étiquette',\r\n accept_terms_and_conditions: \"J'accepte les termes et conditions\",\r\n edit: 'Modifier',\r\n delete: 'Supprimer',\r\n },\r\n validation: {\r\n error_application_name_not_unique: \"Le nom de cette application n'est pas unique.\",\r\n callback_url_caption: 'Utiliser des valeurs séparées par des virgules',\r\n scope_caption: 'Utiliser des valeurs séparées par des espaces',\r\n application_name_caption: 'Utiliser un nom unique de 50 caractères max.',\r\n },\r\n status: {\r\n enabled: 'Activé',\r\n disabled: 'Désactivé',\r\n deprecated: 'Désapprouvé',\r\n unpublished: 'Non publié',\r\n rejected: 'Rejeté',\r\n application_pending_approval: \"En attente d'approbation\",\r\n edit_application_pending_approval: \"En attente d'approbation\",\r\n },\r\n list: {\r\n sort: {\r\n name: {\r\n asc: \"Nom de l'application : A-Z\",\r\n desc: \"Nom de l'application : Z-A\",\r\n },\r\n },\r\n },\r\n notifications: {\r\n configuration: 'Configuration',\r\n copy_success: 'Copié dans le presse-papiers',\r\n copy_error: 'Echec de la copie dans le presse-papiers',\r\n generate_secret_warning_1: \"La génération d'un nouveau secret modifie la clé d'API et annule la clé d'API actuelle.\",\r\n generate_secret_warning_2: \"Cette option permet d'empêcher l'accès à quiconque utilise la clé d'API actuelle. Partagez le nouveau secret généré avec les développeurs qui codent une application utilisant les API.\",\r\n secret_generated_heading: 'Nouveau secret généré',\r\n secret_generated_heading_error: \"Une erreur s'est produite lors de la génération du secret.\",\r\n secret_generated_message: \"Le secret de texte est visible uniquement pendant la session de navigation actuelle ; il est haché après l'actualisation de la page.\",\r\n copy_secret_now: 'Copier le secret partagé maintenant',\r\n copy_to_clipboard: 'Copier dans le presse-papiers',\r\n edit_overview: 'Modifier la présentation',\r\n empty_overview: 'Aucune valeur',\r\n create_success: \"L'application a été créée.\",\r\n create_error: \"Une erreur s'est produite lors de la création de l'application.\",\r\n edit_success: \"L'application a été mise à jour.\",\r\n edit_error: \"Une erreur s'est produite lors de la mise à jour de l'application.\",\r\n delete_success: \"L'application a été supprimée.\",\r\n delete_error: \"Une erreur s'est produite lors de la suppression de l'application.\",\r\n },\r\n confirm_delete: 'Vous êtes sur le point de supprimer cette application. Voulez-vous continuer ?',\r\n deleting_content: \"Annulation du déploiement des clés et suppression de l'application. Cela peut prendre plusieurs minutes.\",\r\n },\r\n documents: {\r\n name: 'Wiki |||| Wiki',\r\n fields: {\r\n title: 'Titre',\r\n navtitle: 'URI',\r\n markdown: 'Contenu',\r\n modifyTs: 'Dernière modification',\r\n ordinal: 'Position',\r\n new_document: 'Nouveau document',\r\n select_documentation_locale: 'Langue sélectionnée',\r\n },\r\n actions: {\r\n // Toolbar\r\n new_document_button: 'New root document',\r\n new_child_document_button: 'Nouvel enfant',\r\n edit_document_button: 'Modifier',\r\n delete_document_button: 'Supprimer',\r\n change_document_parent_button: 'Modifier le parent',\r\n // Tree\r\n expand_documentation: 'Expand documentation of node {title}',\r\n collapse_documentation: 'Réduire la documentation du noeud {title}',\r\n // Drag & Drop\r\n move_as_first_child: 'First document',\r\n move_after_document: 'Après %{title}',\r\n move_as_root_item: 'Sélectionnez cette option pour accéder à la racine.',\r\n // Form\r\n save: 'Publish',\r\n cancel: 'Annuler',\r\n },\r\n validation: {\r\n error_no_special_characters: \"L'URI doit contenir uniquement des caractères non codés. Les lettres de a à z et les séparateurs - et _ sont pris en charge.\",\r\n error_navtitle_not_unique: 'Cet URI existe déjà.',\r\n },\r\n notifications: {\r\n tree_updated_success: \"L'arborescence de documentation a été mise à jour.\",\r\n tree_updated_error: \"Echec de la mise à jour de l'arborescence de la documentation\",\r\n create_success: 'Le document a été créé.',\r\n create_error: \"Une erreur s'est produite lors de la création du document.\",\r\n edit_success: 'Le document a été mis à jour.',\r\n edit_error: \"Une erreur s'est produite lors de la mise à jour du document.\",\r\n delete_success: 'Le document a été supprimé.',\r\n delete_error: \"Une erreur s'est produite lors de la suppression du document.\",\r\n unsaved_changes: 'Si vous quittez cette page, vos modifications seront perdues. Voulez-vous annuler la modification de ce document ?',\r\n },\r\n confirm_delete_document_without_children: 'Vous êtes sur le point de supprimer ce document. Voulez-vous continuer ?',\r\n confirm_delete_document_with_children: 'Vous êtes sur le point de supprimer ce document et ses documents enfants. Voulez-vous continuer ?',\r\n },\r\n registrations: {\r\n title: 'Créer un compte',\r\n fields: {\r\n email: 'Courriel',\r\n email_confirmation: \"Confirmer l'adresse de messagerie\",\r\n organization: 'Organisation ou espace de travail',\r\n organization_description: \"Description de l'organisation\",\r\n robot: \"I'm not a robot\",\r\n },\r\n actions: {\r\n submit: 'Soumettre',\r\n login: 'Se connecter à un compte existant',\r\n return_to_homepage: \"Revenir à la page d'accueil\",\r\n },\r\n notifications: {\r\n confirmation_required: 'Confirmation requise',\r\n error: \"Un problème est survenu lors de l'enregistrement de votre compte.\",\r\n confirmation_title: 'Consulter votre boîte de réception',\r\n confirmation: \"Enregistrement reçu. Un courriel de notification sera envoyé à l'adresse indiquée.\",\r\n email_confirmation_error: \"L'adresse de messagerie ne correspond pas.\",\r\n form_confirmation_error: 'Confirmation requise.',\r\n limituserregistration: \"La demande d'enregistrement de cette adresse électronique est en attente d'approbation/activation. Les demandes multiples ne sont pas autorisées.\",\r\n },\r\n slider: {\r\n confirmed: 'Confirmé(e)',\r\n unconfirmed: 'Faire glisser pour confirmer',\r\n },\r\n },\r\n userContexts: {\r\n title: 'Mon profil',\r\n fields: {\r\n userDetails: {\r\n username: \"Nom d'utilisateur\",\r\n lastName: 'Nom',\r\n firstName: 'Prénom',\r\n email: 'Courriel',\r\n password: 'Mot de passe',\r\n },\r\n currentPassword: 'Mot de passe actuel',\r\n newPassword: 'Mot de passe',\r\n confirmNewPassword: 'Confirmer le mot de passe',\r\n },\r\n actions: {\r\n edit_profile: 'Mon profil',\r\n cancel: 'Annuler',\r\n },\r\n notifications: {\r\n profile_not_exist_error: \"Ce profil n'existe pas.\",\r\n update_success: 'Profil mis à jour',\r\n update_error: 'La mise à jour du profil a échoué.',\r\n invalid_password: \"Le mot de passe actuel n'est pas valide.\",\r\n confirm_password_change: 'Votre mot de passe a été réinitialisé. Utilisez votre nouveau mot de passe pour vous connecter.',\r\n },\r\n validation: {\r\n error_current_password_empty: 'Saisissez votre mot de passe actuel',\r\n error_password_match: 'Les mots de passe sont différents.',\r\n tooltip_password: 'Exigences relatives au mot de passe : \\n- 8 caractères minimum\\n- 60 caractères maximum\\n- Au moins une minuscule\\n- Au moins une majuscule\\n- Au moins un chiffre\\n- Au moins un caractère spécial parmi ceux ci-après : !@#$%^&*',\r\n tooltip_password_confirm: 'Resaisissez votre mot de passe',\r\n },\r\n accessibleOrgs: {\r\n title: 'Mon organisation |||| Mes organisations',\r\n },\r\n activeOrgUuid: {\r\n status: {\r\n active: 'Organisation sélectionnée',\r\n not_active: 'Organisation non sélectionnée',\r\n },\r\n notifications: {\r\n update_success: 'Votre organisation a été mise à jour.',\r\n update_error: \"La mise à jour de l'organisation a échoué.\",\r\n },\r\n },\r\n },\r\n },\r\n};\r\nexport default mergeTranslations(raMessages, apiHubMessages);\r\n//# sourceMappingURL=fr.js.map","import polyglotI18nProvider from 'ra-i18n-polyglot';\r\nimport englishMessages from './en';\r\nimport spanishMessages from './es';\r\nimport frenchMessages from './fr';\r\nexport const i18nProvider = (defaultLocale = 'en') => polyglotI18nProvider(locale => {\r\n if (locale === 'en') {\r\n return englishMessages;\r\n }\r\n if (locale === 'es') {\r\n return spanishMessages;\r\n }\r\n if (locale === 'fr') {\r\n return frenchMessages;\r\n }\r\n}, defaultLocale // Default locale\r\n);\r\n//# sourceMappingURL=i18nProvider.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { SaveButton, Toolbar } from 'react-admin';\r\nimport { ValidationError } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport get from 'lodash/get';\r\nexport const LoginToolbar = props => {\r\n const { loading = false, error = null } = props, rest = __rest(props, [\"loading\", \"error\"]);\r\n const classes = useStyles(rest);\r\n const { button } = props;\r\n const color = get(button, 'color', 'primary');\r\n const variant = get(button, 'variant', 'outlined');\r\n const size = get(button, 'size', 'small');\r\n return (React.createElement(React.Fragment, null,\r\n error ? (React.createElement(Typography, { variant: \"body1\", color: \"error\", className: classes.error },\r\n React.createElement(ValidationError, { error: error }))) : null,\r\n React.createElement(Toolbar, Object.assign({ className: classes.toolbar }, rest),\r\n React.createElement(SaveButton, { icon: loading ? (React.createElement(CircularProgress, { className: classes.circularProgress, size: 15 })) : (React.createElement(\"span\", null)), label: \"apihub.login.actions.sign_in\", disabled: loading, color: color, variant: variant, size: size }))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'stretch',\r\n flexBasis: '100%',\r\n backgroundColor: 'transparent',\r\n padding: 0,\r\n },\r\n circularProgress: {\r\n color: theme.palette.grey[500],\r\n },\r\n}), {\r\n name: 'Layer7LoginToolbar',\r\n});\r\n//# sourceMappingURL=LoginToolbar.js.map","export const CALOGOSRC = 'data:image/png;base64,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';\r\n//# sourceMappingURL=CALogoSrc.png.js.map","import React, { useState } from 'react';\r\nimport { Button, Divider, List, ListItem, makeStyles, Snackbar, Tooltip, Typography, } from '@material-ui/core';\r\nimport Alert from '@material-ui/lab/Alert';\r\nimport { useTranslate } from 'react-admin';\r\nimport { CALOGOSRC } from './CALogoSrc.png';\r\nexport const AuthSchemeList = props => {\r\n const { authSchemes, onClick } = props;\r\n const classes = useStyles(props);\r\n const [selectedScheme, setSelectedScheme] = useState();\r\n const translate = useTranslate();\r\n const onSelectScheme = scheme => {\r\n if (!scheme.credsReqd) {\r\n window.location = scheme.url;\r\n return;\r\n }\r\n if (selectedScheme && selectedScheme.uuid === scheme.uuid) {\r\n setSelectedScheme(null);\r\n onClick(null);\r\n }\r\n else {\r\n setSelectedScheme(scheme);\r\n onClick(scheme);\r\n }\r\n };\r\n const StartIcon = props => {\r\n const { selectedScheme, scheme } = props;\r\n if (scheme.logo) {\r\n return (React.createElement(\"img\", { style: { maxHeight: '36px', maxWidth: '36px' }, src: scheme.logo }));\r\n }\r\n else {\r\n return (React.createElement(\"img\", { style: { maxHeight: '36px', maxWidth: '36px' }, src: CALOGOSRC }));\r\n }\r\n if (scheme.credsReqd) {\r\n if (selectedScheme && selectedScheme.uuid === scheme.uuid) {\r\n return (React.createElement(\"img\", { style: { maxHeight: '36px', maxWidth: '36px' }, src: CALOGOSRC }));\r\n }\r\n else {\r\n return (React.createElement(\"img\", { style: { maxHeight: '36px', maxWidth: '36px' }, src: CALOGOSRC }));\r\n }\r\n }\r\n return null;\r\n };\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Snackbar, { anchorOrigin: { vertical: 'top', horizontal: 'center' }, open: !!selectedScheme },\r\n React.createElement(Alert, { elevation: 6, variant: \"outlined\", severity: \"info\" }, selectedScheme\r\n ? `${translate('apihub.login.notifications.selected_scheme')} ${selectedScheme.name}`\r\n : null)),\r\n React.createElement(Divider, { variant: \"middle\" }),\r\n React.createElement(Typography, { className: classes.divider, variant: \"body1\" }, \"or\"),\r\n React.createElement(Typography, { variant: \"body1\" }, translate('apihub.login.actions.sign_in_with')),\r\n React.createElement(List, null, authSchemes.map((scheme, i) => (React.createElement(ListItem, { key: scheme.name, disableGutters: true },\r\n React.createElement(Tooltip, { key: i, title: scheme.description, placement: \"right-start\" },\r\n React.createElement(Button, { variant: \"outlined\", startIcon: React.createElement(StartIcon, { scheme: scheme, selectedScheme: selectedScheme }), className: classes.listButton, onClick: () => onSelectScheme(scheme) },\r\n React.createElement(\"span\", { className: classes.listButtonLabelName },\r\n scheme.name,\r\n React.createElement(\"span\", { className: classes.listButtonLabelDescription }, scheme.description))))))))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n marginTop: theme.spacing(3),\r\n },\r\n listButtonLabelName: {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n listButtonLabelDescription: {\r\n fontSize: '0.7rem',\r\n display: 'block',\r\n color: theme.palette.text.secondary,\r\n textTransform: 'none',\r\n },\r\n listButton: {\r\n width: '100%',\r\n justifyContent: 'start',\r\n },\r\n divider: {\r\n marginTop: '-13px',\r\n marginBottom: theme.spacing(2),\r\n margin: '0 auto',\r\n width: '20px',\r\n textAlign: 'center',\r\n backgroundColor: theme.palette.background.default,\r\n },\r\n}), {\r\n name: 'Layer7LoginAuthSchemeList',\r\n});\r\n//# sourceMappingURL=AuthSchemeList.js.map","import { useEffect, useState } from 'react';\r\nimport get from 'lodash/get';\r\nimport { useApiHub } from '../ApiHubContext';\r\nimport { getFetchJson } from '../fetchUtils';\r\nexport const getAuthSchemes = async (urlWithTenant, originHubName, location) => {\r\n const fetchJson = getFetchJson(originHubName);\r\n const timestamp = Date.now();\r\n const { json } = await fetchJson(`${urlWithTenant}/public/auth/schemes?_=${timestamp}`);\r\n let schemesList = json.authSchemes.filter(scheme => scheme.authMethod !== 'DEFAULT');\r\n let isSamlDefaultConfig = false;\r\n const defaultLoginScheme = json.authSchemes.find(scheme => scheme.defaultConfig);\r\n if (defaultLoginScheme && defaultLoginScheme.authMethod === 'SAML') {\r\n isSamlDefaultConfig = true;\r\n }\r\n let host = window.location.href;\r\n if (location && location.state) {\r\n host =\r\n host.replace(window.location.hash, '') +\r\n '#' +\r\n location.state.nextPathname;\r\n }\r\n var encoded_query_param = encodeURIComponent(host);\r\n schemesList.forEach((authScheme, i) => {\r\n if (authScheme.authMethod === 'SAML') {\r\n authScheme.url = authScheme.url + '?fromUrl=' + encoded_query_param;\r\n }\r\n else if (authScheme.authMethod === 'SAML_DEPRECATED') {\r\n authScheme.url = authScheme.url + '?fromUrl=' + encoded_query_param;\r\n }\r\n });\r\n if (json.isOktaProxied) {\r\n schemesList = schemesList.filter(scheme => scheme.authMethod !== 'SAML');\r\n const a = document.createElement('a');\r\n a.href = urlWithTenant;\r\n const baseUrl = a.protocol + '//' + a.hostname;\r\n const okta_saml = {\r\n uuid: '',\r\n name: 'SSO Login',\r\n description: '',\r\n showFyp: false,\r\n credsReqd: false,\r\n defaultConfig: isSamlDefaultConfig,\r\n url: '',\r\n tenantId: '',\r\n authMethod: 'SAML',\r\n links: [],\r\n };\r\n okta_saml.url = `${baseUrl}/admin/login?fromApiHub=true&fromUrl=${encoded_query_param}`;\r\n schemesList.push(okta_saml);\r\n }\r\n const defaultScheme = json.authSchemes.find(scheme => scheme.authMethod === 'DEFAULT');\r\n const enhancedPasswordSecurity = get(defaultScheme, 'advancedConfigurations.enhancedPasswordSecurity');\r\n return [schemesList, enhancedPasswordSecurity === 'yes'];\r\n};\r\nexport const useAuthSchemes = location => {\r\n const { urlWithTenant, originHubName } = useApiHub();\r\n const [authSchemes, setAuthSchemes] = useState([]);\r\n const [enhancedPasswordSecurity, setEnhancedPasswordSecurity] = useState(false);\r\n useEffect(() => {\r\n getAuthSchemes(urlWithTenant, originHubName, location).then(resp => {\r\n setAuthSchemes(resp[0]);\r\n setEnhancedPasswordSecurity(resp[1]);\r\n });\r\n }, [location, originHubName, urlWithTenant]);\r\n const defaultScheme = authSchemes.find(scheme => scheme.defaultConfig);\r\n return [authSchemes, defaultScheme, enhancedPasswordSecurity];\r\n};\r\n//# sourceMappingURL=useAuthSchemes.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState } from 'react';\r\nimport { PasswordInput, required, SimpleForm, TextInput, useLogin, useTranslate, } from 'react-admin';\r\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\r\nimport { makeStyles, Link, Typography } from '@material-ui/core';\r\nimport get from 'lodash/get';\r\nimport { AuthSchemeList, LoginToolbar } from '.';\r\nimport { useAuthSchemes, usePasswordEncryption } from '..';\r\nexport const LoginForm = props => {\r\n const { toolbarProps } = props, rest = __rest(props, [\"toolbarProps\"]);\r\n const login = useLogin();\r\n const classes = useStyles(rest);\r\n const translate = useTranslate();\r\n const location = useLocation();\r\n const [authSchemes, defaultAuthScheme, defaultEnhancedPasswordSecurity,] = useAuthSchemes(location);\r\n const [publicKey, encrypt] = usePasswordEncryption();\r\n const [isLoading, setIsLoading] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [authScheme, setAuthScheme] = useState(null);\r\n const submit = async ({ username, password }) => {\r\n setError(null);\r\n setIsLoading(true);\r\n const params = {\r\n scheme: 'credentials',\r\n provider: get(authScheme, 'uuid', null),\r\n username,\r\n password,\r\n };\r\n const enhancedPasswordSecurity = authScheme\r\n ? get(authScheme, 'advancedConfigurations.enhancedPasswordSecurity') === 'yes'\r\n : defaultEnhancedPasswordSecurity;\r\n if (enhancedPasswordSecurity && publicKey) {\r\n params.password = await encrypt(password);\r\n params.publicKey = publicKey;\r\n }\r\n try {\r\n await login(params);\r\n }\r\n catch (_a) {\r\n setError('apihub.login.notifications.invalid_credentials');\r\n }\r\n setIsLoading(false);\r\n };\r\n if (defaultAuthScheme && !defaultAuthScheme.credsReqd) {\r\n window.location = defaultAuthScheme.url;\r\n return;\r\n }\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(SimpleForm, Object.assign({ className: classes.form, save: submit, toolbar: React.createElement(LoginToolbar, Object.assign({ loading: isLoading, error: error }, toolbarProps)) }, props),\r\n React.createElement(TextInput, { source: \"username\", type: \"text\", label: \"apihub.login.fields.username\", variant: \"outlined\", fullWidth: true, validate: required() }),\r\n React.createElement(PasswordInput, { source: \"password\", label: \"apihub.login.fields.password\", variant: \"outlined\", fullWidth: true, validate: required() })),\r\n React.createElement(Typography, { variant: \"body1\" },\r\n React.createElement(Link, { component: RouterLink, to: \"/reset-password\" }, translate('apihub.login.actions.forgot_password'))),\r\n authSchemes.length > 0 ? (React.createElement(AuthSchemeList, { onClick: setAuthScheme, authSchemes: authSchemes })) : null));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n form: {\r\n '& >:first-child': {\r\n padding: 0,\r\n },\r\n },\r\n}), {\r\n name: 'Layer7LoginForm',\r\n});\r\n//# sourceMappingURL=LoginForm.js.map","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Button, makeStyles, Typography } from '@material-ui/core';\r\nimport { useTranslate } from 'react-admin';\r\nexport const SignUpLink = props => {\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h2\", className: classes.title, color: \"textSecondary\" }, translate('apihub.login.actions.sign_up_title')),\r\n React.createElement(Button, { component: Link, to: \"/signup\", variant: \"outlined\", color: \"primary\" }, translate('apihub.login.actions.sign_up'))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n title: {\r\n fontSize: theme.typography.fontSize * 2,\r\n marginTop: theme.spacing(6),\r\n marginBottom: theme.spacing(2),\r\n },\r\n}), {\r\n name: 'Layer7LoginSignUpLink',\r\n});\r\n//# sourceMappingURL=SignUpLink.js.map","import React, { useEffect } from 'react';\r\nimport { makeStyles, Typography } from '@material-ui/core';\r\nimport { useTranslate, useCheckAuth, useRedirect } from 'react-admin';\r\nimport { useClearNotifications } from '../../ui';\r\nimport { LoginForm } from './LoginForm';\r\nimport { SignUpLink } from './SignUpLink';\r\nimport { AuthenticationLayout } from '../AuthenticationLayout';\r\nimport { useAuthenticationConfiguration } from '..';\r\n/**\r\n * The login component which includes the login form and the signup link.\r\n * Redirects to the main application page if the user is already logged in.\r\n */\r\nexport const Login = props => {\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n const clearNotifications = useClearNotifications();\r\n useEffect(() => {\r\n clearNotifications();\r\n }, [clearNotifications]);\r\n const { signUpEnabled } = useAuthenticationConfiguration();\r\n const checkAuth = useCheckAuth();\r\n const redirect = useRedirect();\r\n useEffect(() => {\r\n checkAuth({}, false)\r\n .then(() => {\r\n // Redirects the main page\r\n // if the user is already authenticated\r\n redirect('/apis');\r\n })\r\n .catch(() => {\r\n // Not authenticated, stay on the login page\r\n });\r\n }, [checkAuth, redirect]);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h2\", color: \"textPrimary\", className: classes.title }, translate('apihub.login.title')),\r\n React.createElement(LoginForm, Object.assign({}, props)),\r\n signUpEnabled ? React.createElement(SignUpLink, null) : null));\r\n};\r\nexport const LoginPage = props => (React.createElement(AuthenticationLayout, Object.assign({}, props),\r\n React.createElement(Login, null)));\r\nconst useStyles = makeStyles(theme => ({\r\n title: {\r\n fontSize: theme.typography.fontSize * 2,\r\n marginBottom: theme.spacing(6),\r\n },\r\n}), {\r\n name: 'Layer7Login',\r\n});\r\n//# sourceMappingURL=Login.js.map","import { hideNotification } from 'ra-core';\r\nimport { useDispatch } from 'react-redux';\r\n/**\r\n * An Hook to clear the react-admin notifications.\r\n *\r\n * @example Simple usage: clear notifications on mount\r\n *\r\n * const MyLayout = props => {\r\n * const clearNotifications = useClearNotifications();\r\n *\r\n * useEffect(() => {\r\n * clearNotifications();\r\n * }, [clearNotifications]);\r\n *\r\n * return {props.children}
;\r\n * };\r\n *\r\n */\r\nexport const useClearNotifications = () => {\r\n const dispatch = useDispatch();\r\n return () => dispatch(hideNotification());\r\n};\r\n//# sourceMappingURL=useClearNotifications.js.map","import React from 'react';\r\nimport { Typography } from '@material-ui/core';\r\nimport { useTranslate } from 'ra-core';\r\nimport { ResetPasswordForm } from './ResetPasswordForm';\r\nimport { ResetPasswordConfirm } from './ResetPasswordConfirm';\r\nimport { useResetPassword } from '../useResetPassword';\r\nimport { AuthenticationLayout } from '../AuthenticationLayout';\r\n/**\r\n * The component used to reset a password\r\n */\r\nexport const ResetPassword = props => {\r\n const [username, setUsername] = useResetPassword();\r\n const translate = useTranslate();\r\n const handleSubmit = ({ username }) => {\r\n setUsername(username);\r\n };\r\n if (username) {\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h4\", component: \"h2\", color: \"textPrimary\", gutterBottom: true }, translate('apihub.reset_password.title')),\r\n React.createElement(ResetPasswordConfirm, Object.assign({}, props))));\r\n }\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h4\", component: \"h2\", color: \"textPrimary\", gutterBottom: true }, translate('apihub.reset_password.title')),\r\n React.createElement(ResetPasswordForm, Object.assign({ onSubmit: handleSubmit }, props))));\r\n};\r\n/**\r\n * The page displaying the reset password form\r\n *\r\n * @param {*} Header A React Component used as the page header\r\n * @param {*} Content A React Component used to display some content next to the reset password form\r\n * @param {*} Footer A React Component used as the page footer\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyApp = props => \r\n *\r\n * @example With customized parts\r\n * const Header = () => \r\n * const Footer = () => \r\n * const Content = () => \r\n *\r\n * const MyResetPasswordPage = props => (\r\n * \r\n * );\r\n *\r\n * const MyApp = props => \r\n */\r\nexport const ResetPasswordPage = props => {\r\n return (React.createElement(AuthenticationLayout, Object.assign({}, props),\r\n React.createElement(ResetPassword, null)));\r\n};\r\n//# sourceMappingURL=ResetPassword.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { AuthenticationLayout } from '../AuthenticationLayout';\r\nimport { AccountSetupForm } from './AccountSetupForm';\r\nimport { AccountSetupPreparingForm } from './AccountSetupPreparingForm';\r\nimport { AccountSetupInvalidRequest } from './AccountSetupInvalidRequest';\r\nimport { AccountSetupSuccess } from './AccountSetupSuccess';\r\nimport { useAccountData } from './useAccountData';\r\n/**\r\n * The account setup form\r\n *\r\n */\r\nexport const AccountSetup = props => {\r\n const [state, accountData, submitAccountData, error] = useAccountData();\r\n const translate = useTranslate();\r\n const handleSubmit = data => {\r\n submitAccountData(data);\r\n };\r\n switch (state) {\r\n case 'prepare':\r\n return React.createElement(AccountSetupPreparingForm, Object.assign({}, props));\r\n case 'fill':\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h4\", component: \"h2\", color: \"textPrimary\", gutterBottom: true }, translate('apihub.account_setup.title')),\r\n React.createElement(AccountSetupForm, Object.assign({ initialValues: accountData, onSubmit: handleSubmit }, props))));\r\n case 'invalid_request':\r\n return React.createElement(AccountSetupInvalidRequest, Object.assign({}, props));\r\n case 'error':\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h4\", component: \"h2\", color: \"textPrimary\", gutterBottom: true }, translate('apihub.account_setup.title')),\r\n React.createElement(AccountSetupForm, Object.assign({ initialValues: accountData, onSubmit: handleSubmit, error: error }, props))));\r\n case 'success':\r\n return React.createElement(AccountSetupSuccess, Object.assign({}, props));\r\n default:\r\n return null;\r\n }\r\n};\r\n/**\r\n * The page displaying the account setup form\r\n *\r\n * @param {*} Header A React Component used as the page header\r\n * @param {*} Content A React Component used to display some content next to the account setup form\r\n * @param {*} Footer A React Component used as the page footer\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyApp = props => \r\n *\r\n * @example With customized parts\r\n * const Header = () => \r\n * const Content = () => \r\n * const Footer = () => \r\n *\r\n * const MyAccountSetupPage = props => (\r\n * \r\n * );\r\n *\r\n * const MyApp = props => \r\n *\r\n */\r\nexport const AccountSetupPage = props => {\r\n return (React.createElement(AuthenticationLayout, Object.assign({}, props),\r\n React.createElement(AccountSetup, null)));\r\n};\r\n//# sourceMappingURL=AccountSetup.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport classnames from 'classnames';\r\nimport { useTranslate } from 'ra-core';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nexport const HomePageCreateButton = (_a) => {\r\n var { onClick, className } = _a, rest = __rest(_a, [\"onClick\", \"className\"]);\r\n const translate = useTranslate();\r\n const classes = useStyles(rest);\r\n return (React.createElement(Tooltip, { title: translate('ra.action.create') },\r\n React.createElement(Fab, { \"aria-label\": translate('ra.action.create'), className: classnames(classes.root, className), onClick: onClick },\r\n React.createElement(AddIcon, null))));\r\n};\r\nexport const HomePageEditButton = (_a) => {\r\n var { onClick, className } = _a, rest = __rest(_a, [\"onClick\", \"className\"]);\r\n const translate = useTranslate();\r\n const classes = useStyles(rest);\r\n return (React.createElement(Tooltip, { title: translate('ra.action.edit') },\r\n React.createElement(Fab, { \"aria-label\": translate('ra.action.edit'), className: classnames(classes.root, className), onClick: onClick },\r\n React.createElement(EditIcon, null))));\r\n};\r\nconst useStyles = makeStyles(theme => {\r\n const appBarHeight = theme.spacing(9); // AppBar (size + margin)\r\n const homePagePadding = theme.spacing(3); // HomePage (padding)\r\n return {\r\n root: {\r\n position: 'fixed',\r\n right: homePagePadding,\r\n top: `calc(${appBarHeight}px + ${homePagePadding}px)`,\r\n },\r\n };\r\n}, {\r\n name: 'Layer7HomePageButton',\r\n});\r\n//# sourceMappingURL=HomePageButton.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState, useEffect, forwardRef } from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport SaveIcon from '@material-ui/icons/Save';\r\nimport { ENTITY_TYPE_HOME } from '../dataProvider/documents';\r\nimport { HomePageCreateButton, HomePageEditButton } from './HomePageButton';\r\nimport { MarkdownEditor, markdownRenderer as defaultMarkdownRenderer, MarkdownView, } from '../ui';\r\nimport { useUserContext } from '../userContexts';\r\nimport { useMarkdownContent } from '../documentation';\r\n/**\r\n * This component is responsible for fetching and displaying an home page content.\r\n * It also provide mechanisms for portal administrators to update it.\r\n *\r\n * The HomePageContent can be used as the default home page if there is only one content to display.\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyApp = props => \r\n *\r\n */\r\nexport const HomePageContent = props => {\r\n var _a;\r\n const { navtitle = 'home1', entityUuid = 'home1' } = props, rest = __rest(props, [\"navtitle\", \"entityUuid\"]);\r\n const [{ data, loading }, handleUpdate] = useMarkdownContent({\r\n entityType: ENTITY_TYPE_HOME,\r\n entityUuid,\r\n navtitle,\r\n });\r\n const translate = useTranslate();\r\n const classes = useStyles(rest);\r\n const [userContext] = useUserContext();\r\n const canEdit = ((_a = userContext === null || userContext === void 0 ? void 0 : userContext.userDetails) === null || _a === void 0 ? void 0 : _a.portalAdmin) || false;\r\n const [mode, setMode] = useState('view');\r\n const handleToggleEditionMode = () => setMode('edition');\r\n const handleToggleViewMode = () => setMode('view');\r\n useEffect(() => {\r\n setMode('view');\r\n }, [data]);\r\n if (loading) {\r\n return (React.createElement(Fade, { in: true, style: {\r\n transitionDelay: '300ms',\r\n }, unmountOnExit: true },\r\n React.createElement(LinearProgress, null)));\r\n }\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(MarkdownView, Object.assign({ className: classes.markdown, value: !data\r\n ? translate('apihub.homepage.placeholder_empty_content')\r\n : data.markdown }, rest)),\r\n canEdit ? (React.createElement(React.Fragment, null,\r\n data ? (React.createElement(HomePageEditButton, { onClick: handleToggleEditionMode })) : (React.createElement(HomePageCreateButton, { onClick: handleToggleEditionMode })),\r\n React.createElement(HomePageContentEditor, { initialValue: data ? data.markdown : undefined, navtitle: navtitle, onCancel: handleToggleViewMode, onSave: handleUpdate, open: mode === 'edition' }))) : null));\r\n};\r\nconst HomePageContentEditor = ({ initialValue, markdownRenderer = defaultMarkdownRenderer, onCancel, onSave, open, navtitle, }) => {\r\n const classes = useHomePageContentEditorStyles();\r\n const [value, setValue] = useState(initialValue);\r\n const translate = useTranslate();\r\n const handleSave = () => {\r\n onSave(value);\r\n };\r\n const handleCancel = () => {\r\n setValue(initialValue);\r\n onCancel();\r\n };\r\n useEffect(() => {\r\n // Be sure the value is updated when the initialValue changed\r\n setValue(initialValue);\r\n }, [initialValue]);\r\n return (React.createElement(Dialog, { open: open, fullScreen: true, onClose: handleCancel, TransitionComponent: Transition },\r\n React.createElement(DialogTitle, null, navtitle),\r\n React.createElement(DialogContent, null,\r\n React.createElement(InputLabel, { shrink: true, htmlFor: \"textarea\" }, translate('resources.documents.fields.markdown')),\r\n React.createElement(MarkdownEditor, { className: classes.editor, value: value, onChange: setValue, markdownRenderer: markdownRenderer })),\r\n React.createElement(DialogActions, { className: classes.actions },\r\n React.createElement(Button, { color: \"primary\", variant: \"outlined\", onClick: handleCancel }, translate('resources.documents.actions.cancel')),\r\n React.createElement(Button, { color: \"primary\", variant: \"contained\", onClick: handleSave, startIcon: React.createElement(SaveIcon, null) }, translate('resources.documents.actions.save')))));\r\n};\r\nconst Transition = forwardRef(function Transition(props, ref) {\r\n return React.createElement(Slide, Object.assign({ direction: \"up\", ref: ref }, props));\r\n});\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'relative',\r\n },\r\n markdown: {\r\n overflowWrap: 'anywhere',\r\n },\r\n}), {\r\n name: 'Layer7HomePageContent',\r\n});\r\nconst useHomePageContentEditorStyles = makeStyles(theme => ({\r\n editor: {\r\n height: `calc(100% - ${theme.spacing(2)}px)`,\r\n },\r\n actions: {\r\n margin: theme.spacing(2),\r\n },\r\n}), {\r\n name: 'Layer7HomePageContentEditor',\r\n});\r\n//# sourceMappingURL=HomePageContent.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { Children } from 'react';\r\nimport { Admin, Resource } from 'react-admin';\r\nimport { Route } from 'react-router';\r\nimport merge from 'lodash/fp/merge';\r\nimport { ApiHubProvider, guessApihubUrl, guessApihubTenantName, } from './ApiHubContext';\r\nimport { authProvider } from './authentication';\r\nimport { dataProvider } from './dataProvider';\r\nimport { i18nProvider, defaultLocale } from './i18n';\r\nimport { LoginPage, NewPasswordPage, ResetPasswordPage, AccountSetupPage, SignUpPage, } from './authentication';\r\nimport { HomePageContent } from './homepage';\r\nimport { apis } from './apis';\r\nimport { applications } from './applications';\r\nimport { documents } from './documentation';\r\nimport { userProfiles } from './userProfiles';\r\nimport { ApiHubLayout } from './ApiHubLayout';\r\nimport { readApiHubPreference } from './preferences';\r\nimport { theme as defaultTheme } from './theme';\r\nimport { documentationReducer } from './documentation/Documentation/documentationReducer';\r\nconst defaultCustomRoutes = [];\r\nexport const ApiHubAdmin = (_a) => {\r\n var { \r\n // ApiHub Settings\r\n url = guessApihubUrl(), tenantName = guessApihubTenantName(), originHubName, useSameOrigin = true, \r\n // Custom Pages and Layout\r\n dashboard = HomePageContent, layout = ApiHubLayout, loginPage = LoginPage, resetPasswordPage = ResetPasswordPage, newPasswordPage = NewPasswordPage, accountSetupPage = AccountSetupPage, signUpPage = SignUpPage, \r\n // React Admin Settings\r\n theme = defaultTheme, customReducers, customRoutes = defaultCustomRoutes, initialState, children } = _a, props = __rest(_a, [\"url\", \"tenantName\", \"originHubName\", \"useSameOrigin\", \"dashboard\", \"layout\", \"loginPage\", \"resetPasswordPage\", \"newPasswordPage\", \"accountSetupPage\", \"signUpPage\", \"theme\", \"customReducers\", \"customRoutes\", \"initialState\", \"children\"]);\r\n const defaultLocaleFromPreferences = readApiHubPreference('locale', defaultLocale);\r\n const defaultSidebarOpenFromPreferences = readApiHubPreference('sidebarOpen', true);\r\n const finalInitialState = merge({\r\n admin: {\r\n ui: {\r\n sidebarOpen: !!defaultSidebarOpenFromPreferences,\r\n viewVersion: 0,\r\n },\r\n },\r\n }, initialState);\r\n const resources = [\r\n // Resources which are needed for references but which will not have any UI\r\n React.createElement(Resource, { key: \"apiEulas\", name: \"apiEulas\" }),\r\n React.createElement(Resource, { key: \"apiGroups\", name: \"apiGroups\" }),\r\n React.createElement(Resource, { key: \"assets\", name: \"assets\" }),\r\n React.createElement(Resource, { key: \"customFields\", name: \"customFields\" }),\r\n React.createElement(Resource, { key: \"documents\", name: \"documents\" }),\r\n React.createElement(Resource, { key: \"organizations\", name: \"organizations\" }),\r\n React.createElement(Resource, { key: \"specs\", name: \"specs\" }),\r\n React.createElement(Resource, { key: \"tags\", name: \"tags\" }),\r\n React.createElement(Resource, { key: \"userContexts\", name: \"userContexts\" }),\r\n ];\r\n // If the user provided their own resources, they should override the defaults.\r\n if (Children.count(children) > 0) {\r\n Array.prototype.push.apply(resources, Children.toArray(children));\r\n }\r\n else {\r\n resources.push(React.createElement(Resource, Object.assign({ key: \"apis\", name: \"apis\" }, apis)), React.createElement(Resource, Object.assign({ key: \"applications\", name: \"applications\" }, applications)), React.createElement(Resource, Object.assign({ key: \"userProfiles\", name: \"userProfiles\" }, userProfiles)));\r\n }\r\n return (React.createElement(ApiHubProvider, { url: url, tenantName: tenantName, originHubName: originHubName },\r\n React.createElement(Admin, Object.assign({ authProvider: authProvider(url, tenantName, originHubName), dataProvider: dataProvider(url, tenantName, originHubName), i18nProvider: i18nProvider(defaultLocaleFromPreferences), theme: theme, layout: layout, loginPage: loginPage, dashboard: dashboard, customRoutes: [\r\n // React-Router loads only the first route that matches a path.\r\n // The only way to allow customizing the pre-defined routes\r\n // is to pass the customRoutes from the props before.\r\n ...customRoutes,\r\n // The Wiki Page displays a list of documents in a non standard way.\r\n React.createElement(Route, { path: \"/howto\", component: documents.list }),\r\n React.createElement(Route, { path: \"/reset-password*\", component: resetPasswordPage, noLayout: true }),\r\n React.createElement(Route, { path: \"/new-password*\", component: newPasswordPage, noLayout: true }),\r\n React.createElement(Route, { path: \"/account-setup*\", component: accountSetupPage, noLayout: true }),\r\n React.createElement(Route, { path: \"/signup\", component: signUpPage, noLayout: true }),\r\n ], customReducers: merge(documentationReducer, customReducers), initialState: finalInitialState }, props), resources)));\r\n};\r\n//# sourceMappingURL=ApiHubAdmin.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport get from 'lodash/get';\r\n/**\r\n * Compare two documents by ordinal respecting the ascending order (smallest to biggest).\r\n * @param {Array} documentA The first document\r\n * @param {Array} documentB The second document\r\n */\r\nexport const sortByOrdinal = (documentA, documentB) => documentA.ordinal - documentB.ordinal;\r\n/**\r\n * Compare two documents by ordinal respecting the descending order (biggest to smallest).\r\n * @param {Array} documentA The first document\r\n * @param {Array} documentB The second document\r\n */\r\nexport const sortByOrdinalDesc = (documentA, documentB) => documentB.ordinal - documentA.ordinal;\r\n/**\r\n * Get the first document from an array of documents.\r\n * The first document is the root document with the smallest ordinal.\r\n * @param {Array} documents An array of all documents\r\n */\r\nexport const getFirstDocument = documents => {\r\n if (!Array.isArray(documents) || documents.length === 0) {\r\n return null;\r\n }\r\n return documents\r\n .filter(document => !document.parentUuid)\r\n .sort(sortByOrdinal)[0];\r\n};\r\n/**\r\n * Builds a tree from an array of documents\r\n * @param {Array} documents An array of documents\r\n * @param {Function} sortFn The sort function to use\r\n */\r\nexport const getDocumentationTree = (documents, sortFn = a => a) => {\r\n return documents\r\n .filter(document => !document.parentUuid)\r\n .reduce((acc, document) => {\r\n document.children = getChildDocuments(document, documents, sortFn);\r\n acc.push(document);\r\n return acc;\r\n }, [])\r\n .sort(sortFn);\r\n};\r\n/**\r\n * Get all the children of a document\r\n * @param {Object} parent A document\r\n * @param {Array} documents An array of all documents\r\n * @param {Function} sortFn The sort function to use\r\n */\r\nexport const getChildDocuments = (parent, documents, sortFn = a => a) => {\r\n return documents\r\n .filter(document => document.parentUuid === parent.uuid && !!parent.uuid)\r\n .reduce((acc, document) => {\r\n document.children = getChildDocuments(document, documents, sortFn);\r\n acc.push(document);\r\n return acc;\r\n }, [])\r\n .sort(sortFn);\r\n};\r\nexport const getSiblingsDocuments = (tree = [], parentUuid = undefined) => {\r\n if (parentUuid === undefined) {\r\n return tree;\r\n }\r\n let index = 0;\r\n while (index < tree.length) {\r\n const document = tree[index];\r\n const children = get(document, 'children', []);\r\n if (document.uuid === parentUuid) {\r\n return children;\r\n }\r\n const result = getSiblingsDocuments(children, parentUuid);\r\n if (result.length > 0) {\r\n return result;\r\n }\r\n index++;\r\n }\r\n return [];\r\n};\r\nexport const documentHasChildren = (documents, document) => {\r\n return documents.some(node => node.parentUuid === document.uuid);\r\n};\r\n/**\r\n * Verify that node specified by `parentUuid` nor any of its parents is the node specified by `nodeUuid`.\r\n *\r\n * @param {Array} documents An array of all nodes in the tree\r\n * @param {String} parentUuid The uuid of the first node to check\r\n * @param {String} nodeUuid The uuid of the node for which we are looking up parents\r\n */\r\nexport const hasParentWithId = (documents, parentUuid, nodeUuid) => {\r\n if (parentUuid === nodeUuid) {\r\n return true;\r\n }\r\n const currentNode = documents.find(item => item.uuid === parentUuid);\r\n if (!currentNode || !currentNode.parentUuid) {\r\n return false;\r\n }\r\n return hasParentWithId(documents, currentNode.parentUuid, nodeUuid);\r\n};\r\nexport const getMaxOrdinalFromDocuments = documents => {\r\n if (!Array.isArray(documents) || documents.length === 0) {\r\n return -1;\r\n }\r\n const sortedSiblings = documents.sort(sortByOrdinalDesc);\r\n return sortedSiblings[0].ordinal;\r\n};\r\nexport const getParentDocument = (documents, parentUuid) => documents.find(item => item.uuid === parentUuid);\r\nexport function getAllDocumentParents(document, documents) {\r\n const getParent = document => documents.find(item => item.uuid === document.parentUuid);\r\n let currentDocument = document;\r\n const parents = [];\r\n while (currentDocument && currentDocument.parentUuid) {\r\n const parent = getParent(currentDocument);\r\n if (parent) {\r\n parents.push(parent);\r\n }\r\n currentDocument = parent;\r\n }\r\n return parents;\r\n}\r\n/**\r\n * Builds a flat array of documents from a tree\r\n * @param {Object} tree A tree of document items\r\n */\r\nexport const getArrayFromTree = tree => {\r\n return tree.reduce((acc, item) => {\r\n return [].concat(acc, item.children ? getArrayFromTree(item.children) : []);\r\n }, tree);\r\n};\r\n/**\r\n * Builds a tree from an array of documents but add intermediate items\r\n * used as drop targets for reordering before and/or after each node.\r\n * @param {Array} documents An array of documents\r\n * @param {String} draggedDocumentId The id of the document being dragged\r\n * @param {Function} sortFn The sort function to use\r\n */\r\nexport const getDocumentationTreeForDragDrop = (documents, draggedDocumentId, sortFn = sortByOrdinal) => {\r\n const tree = getDocumentationTree(documents, sortFn);\r\n const draggedDocument = documents.find(document => document.id === draggedDocumentId);\r\n const result = tree.reduce((acc, document) => acc.concat(addDropTargets(document, draggedDocument)), []);\r\n return result;\r\n};\r\nconst addDropTargets = (_a, draggedDocument) => {\r\n var { children } = _a, document = __rest(_a, [\"children\"]);\r\n if (document.id === draggedDocument.id) {\r\n return [document];\r\n }\r\n const targets = [\r\n Object.assign(Object.assign({}, document), { children: children.reduce((acc, childDocument) => acc.concat(addDropTargets(childDocument, draggedDocument)), []), dropData: {\r\n ordinal: children.length,\r\n parentUuid: document.uuid,\r\n } }),\r\n ];\r\n // Allow dropping at the very first position\r\n if (document.ordinal === 0) {\r\n targets.unshift({\r\n id: `before|${document.id}`,\r\n parentUuid: document.parentUuid,\r\n ordinal: 0,\r\n title: 'apihub.actions.tree_drop_before',\r\n relatedNode: document,\r\n dropTarget: true,\r\n dropData: {\r\n ordinal: 0,\r\n parentUuid: document.parentUuid,\r\n },\r\n });\r\n }\r\n // It does not make sense to allow dropping after the previous node\r\n const isPreviousNode = document.ordinal === draggedDocument.ordinal - 1 &&\r\n document.parentUuid === draggedDocument.parentUuid;\r\n if (!isPreviousNode) {\r\n targets.push({\r\n id: `after|${document.id}`,\r\n parentUuid: document.parentUuid,\r\n ordinal: document.ordinal + 1,\r\n title: 'apihub.actions.tree_drop_after',\r\n relatedNode: document,\r\n dropTarget: true,\r\n dropData: {\r\n ordinal: document.ordinal + 1,\r\n parentUuid: document.parentUuid,\r\n },\r\n });\r\n }\r\n return targets;\r\n};\r\n//# sourceMappingURL=tree.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { forwardRef, useState, useCallback, useRef, useEffect, useContext, createContext, useMemo, } from 'react';\r\nimport TreeView from '@material-ui/lab/TreeView';\r\nimport TreeItem from '@material-ui/lab/TreeItem';\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\r\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { useForkRef } from '@material-ui/core/utils';\r\nimport { useTranslate } from 'ra-core';\r\nimport Backend from 'react-dnd-html5-backend';\r\nimport { DndProvider, useDrag, useDrop } from 'react-dnd';\r\nimport classnames from 'classnames';\r\nimport FocusTrap from 'focus-trap-react';\r\nimport { getDocumentationTree, sortByOrdinal, hasParentWithId, getDocumentationTreeForDragDrop, getArrayFromTree, } from './tree';\r\n// We have to import this way otherwise it seems we end up with a different context\r\n// that the one used by MUI TreeView\r\nimport TreeViewContext from '@material-ui/lab/esm/TreeView/TreeViewContext';\r\nconst TreeViewDragDropContext = createContext();\r\nexport const DocumentationTree = (_a) => {\r\n var { items, onDocumentSelected, selectedDocumentId, expanded: controlledExpanded, onExpandedChange, onDocumentParentChange, canDrag } = _a, props = __rest(_a, [\"items\", \"onDocumentSelected\", \"selectedDocumentId\", \"expanded\", \"onExpandedChange\", \"onDocumentParentChange\", \"canDrag\"]);\r\n const [draggedNodeId, setDraggedNodeId] = useState(false);\r\n const [isDraggingUsingKeyboard, setIsDraggingUsingKeyboard] = useState(false);\r\n const [uncontrolledExpanded, setExpanded] = useState([]);\r\n const expanded = !controlledExpanded\r\n ? uncontrolledExpanded\r\n : controlledExpanded;\r\n const tree = draggedNodeId\r\n ? getDocumentationTreeForDragDrop(items, draggedNodeId, sortByOrdinal)\r\n : getDocumentationTree(items, sortByOrdinal);\r\n const handleExpandedChange = useCallback(newExpanded => {\r\n if (onExpandedChange) {\r\n onExpandedChange(newExpanded);\r\n }\r\n setExpanded(newExpanded);\r\n }, [onExpandedChange]);\r\n const handleSelectDocument = useCallback((event, nodeId) => {\r\n event.preventDefault();\r\n const node = items.find(item => item.id === nodeId);\r\n // If the node does not have an uuid, it's a new document\r\n // and it shouldn't handle collapse, expand or select\r\n if ((!node || !node.uuid) && !draggedNodeId) {\r\n return;\r\n }\r\n if (canDrag && event.key === ' ') {\r\n // Manage the keyboard drag and drop if the user is allowed to drag\r\n if (draggedNodeId) {\r\n // Apply the drop\r\n const newItems = getArrayFromTree(tree);\r\n const dropTarget = newItems.find(item => item.id === nodeId);\r\n const droppedItem = newItems.find(item => item.id === draggedNodeId);\r\n onDocumentParentChange({\r\n documentUuid: droppedItem.uuid,\r\n newParentUuid: dropTarget.dropData.parentUuid,\r\n ordinal: dropTarget.dropData.ordinal,\r\n });\r\n setDraggedNodeId(undefined);\r\n }\r\n else {\r\n setDraggedNodeId(nodeId);\r\n setIsDraggingUsingKeyboard(true);\r\n }\r\n }\r\n else {\r\n onDocumentSelected(node);\r\n }\r\n }, [\r\n canDrag,\r\n draggedNodeId,\r\n items,\r\n onDocumentParentChange,\r\n onDocumentSelected,\r\n tree,\r\n ]);\r\n const handleCollapse = useCallback((event, nodeId) => handleExpandedChange(expanded.filter(item => item !== nodeId)), [expanded, handleExpandedChange]);\r\n const handleExpand = useCallback((event, nodeId) => handleExpandedChange([...expanded, nodeId]), [expanded, handleExpandedChange]);\r\n const handleNodeToggle = useCallback((event, nodes) => {\r\n if (draggedNodeId && nodes.length > 0) {\r\n const node = items.find(item => item.id === nodes[0]);\r\n const nodeDragged = items.find(item => item.id === draggedNodeId);\r\n if (hasParentWithId(items, nodeDragged.uuid, node.uuid)) {\r\n return;\r\n }\r\n }\r\n handleExpandedChange(nodes);\r\n }, [draggedNodeId, handleExpandedChange, items]);\r\n const handleNodeDropped = useCallback(data => {\r\n setDraggedNodeId(undefined);\r\n onDocumentParentChange(data);\r\n }, [onDocumentParentChange]);\r\n useEffect(() => {\r\n const handleKeyDown = event => {\r\n if (draggedNodeId) {\r\n if (event.key === 'Escape') {\r\n setDraggedNodeId(undefined);\r\n }\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [draggedNodeId, onDocumentParentChange, selectedDocumentId, tree]);\r\n const dragDropContextValue = useMemo(() => ({\r\n isDragged: id => id === draggedNodeId,\r\n isDragging: !!draggedNodeId,\r\n isDraggingUsingKeyboard,\r\n setDraggedNodeId: id => {\r\n setDraggedNodeId(id);\r\n setIsDraggingUsingKeyboard(false);\r\n },\r\n }), [draggedNodeId, isDraggingUsingKeyboard]);\r\n return (React.createElement(DndProvider, { backend: Backend, context: window },\r\n React.createElement(TreeViewDragDropContext.Provider, { value: dragDropContextValue },\r\n React.createElement(FocusTrap, { active: !!draggedNodeId },\r\n React.createElement(TreeView, Object.assign({ defaultEndIcon: React.createElement(\"div\", { style: { width: 24 } }), expanded: expanded, onNodeToggle: handleNodeToggle, onNodeSelect: handleSelectDocument, selected: selectedDocumentId }, props), tree.map(item => (React.createElement(RecursiveTreeItem, { key: item.id, items: items, node: item, nodeId: item.id, onCollapse: handleCollapse, onDropped: handleNodeDropped, onExpand: handleExpand, canDrag: canDrag }))))))));\r\n};\r\nconst RecursiveTreeItem = forwardRef((props, ref) => {\r\n const { node, onExpand, onCollapse, onDropped, items, canDrag } = props, rest = __rest(props, [\"node\", \"onExpand\", \"onCollapse\", \"onDropped\", \"items\", \"canDrag\"]);\r\n const _a = useRecursiveTreeItemStyles(props), { isDragging: isDraggingClassName, isOver: isOverClassName, isOverAfter: isOverAfterClassName, isOverBefore: isOverBeforeClassName, dropTarget: dropTargetClassName, dropTargetFocused: dropTargetFocusedClassName } = _a, classes = __rest(_a, [\"isDragging\", \"isOver\", \"isOverAfter\", \"isOverBefore\", \"dropTarget\", \"dropTargetFocused\"]);\r\n const translate = useTranslate();\r\n const { isFocused, isExpanded } = useContext(TreeViewContext);\r\n const { isDragged, isDragging, isDraggingUsingKeyboard, setDraggedNodeId, } = useContext(TreeViewDragDropContext);\r\n const isBeingDragged = isDragged(node.id);\r\n const nodeRef = useRef();\r\n const handleRef = useForkRef(nodeRef, ref);\r\n const focused = isFocused ? isFocused(node.id) : false;\r\n const expanded = isExpanded ? isExpanded(node.id) : false;\r\n const [, drag] = useDrag({\r\n item: { type: DRAG_DROP_TYPE, id: node.id, uuid: node.uuid },\r\n begin: () => {\r\n // This timeout is necessary to avoid an issue in chrome\r\n // preventing drag operations after a while\r\n // See https://github.com/react-dnd/react-dnd/issues/2177#issuecomment-607171231\r\n setTimeout(() => {\r\n setDraggedNodeId(node.id);\r\n }, 0);\r\n },\r\n end: () => {\r\n setDraggedNodeId(undefined);\r\n },\r\n canDrag: () => {\r\n return canDrag && !isDragging;\r\n },\r\n });\r\n const [{ dropAccepted, isOver }, drop] = useDrop({\r\n accept: DRAG_DROP_TYPE,\r\n canDrop: item => {\r\n return !hasParentWithId(items, node.uuid, item.uuid);\r\n },\r\n drop: (item, monitor) => {\r\n // if the drop was already handled by a child, stop right there\r\n if (monitor.didDrop()) {\r\n return;\r\n }\r\n // prevent accidental drop on parent node:\r\n // dropping on itself would bubble up to the parent node\r\n if (!monitor.isOver({ shallow: true })) {\r\n return;\r\n }\r\n onDropped({\r\n documentUuid: item.uuid,\r\n newParentUuid: node.dropData.parentUuid,\r\n ordinal: node.dropData.ordinal,\r\n });\r\n },\r\n collect: monitor => ({\r\n dropAccepted: monitor.canDrop(),\r\n // shallow at true means strictly over this node and not its children\r\n isOver: monitor.isOver({ shallow: true }),\r\n }),\r\n });\r\n const handleCollapse = useCallback(event => {\r\n // Stop event propagation to avoid loading the node\r\n event.stopPropagation();\r\n // If the node does not have an uuid, it's a new document\r\n // and it shouldn't handle collapse, expand or select\r\n if (node && node.uuid && onCollapse) {\r\n onCollapse(event, node.id);\r\n }\r\n }, [node, onCollapse]);\r\n const handleExpand = useCallback(event => {\r\n // Stop event propagation to avoid loading the node\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n // If the node does not have an uuid, it's a new document\r\n // and it shouldn't handle collapse, expand or select\r\n if (node && node.uuid && onExpand) {\r\n onExpand(event, node.id);\r\n }\r\n }, [node, onExpand]);\r\n const dragEnterTimeout = useRef();\r\n useEffect(() => {\r\n if (!isBeingDragged && dropAccepted && isOver && !expanded) {\r\n dragEnterTimeout.current = setTimeout(() => {\r\n onExpand(undefined, node.id);\r\n clearTimeout(dragEnterTimeout.current);\r\n }, 350);\r\n return;\r\n }\r\n if (!isOver && dragEnterTimeout.current) {\r\n clearTimeout(dragEnterTimeout.current);\r\n }\r\n }, [dropAccepted, expanded, isBeingDragged, isOver, node.id, onExpand]);\r\n const attachRef = useCallback(treeItem => {\r\n if (!treeItem) {\r\n return;\r\n }\r\n drag(treeItem);\r\n drop(treeItem);\r\n handleRef(treeItem);\r\n }, [drag, drop, handleRef]);\r\n const isDraggingOver = ((isOver && dropAccepted) || (focused && isDraggingUsingKeyboard)) &&\r\n !isBeingDragged &&\r\n isDragging;\r\n return (React.createElement(TreeItem, Object.assign({ ref: attachRef, classes: classes, className: classnames({\r\n [dropTargetClassName]: !!node.dropTarget,\r\n [dropTargetFocusedClassName]: !!node.dropTarget && isDraggingOver,\r\n [isDraggingClassName]: isBeingDragged,\r\n [isOverClassName]: !node.dropTarget && isDraggingOver,\r\n }), \"aria-grabbed\": isBeingDragged, \"aria-dropeffect\": !isBeingDragged && isDragging ? 'move' : undefined, \"aria-label\": node.dropTarget\r\n ? translate(node.title, { title: node.relatedNode.title })\r\n : node.title, label: !node.dropTarget ? node.title : '', collapseIcon: React.createElement(ArrowDropDownIcon, { role: \"button\", \"aria-label\": translate('resources.documents.actions.collapse_documentation', {\r\n title: node.title,\r\n }), onClick: handleCollapse }), expandIcon: React.createElement(ArrowRightIcon, { role: \"button\", \"aria-label\": translate('resources.documents.actions.expand_documentation', {\r\n title: node.title,\r\n }), onClick: handleExpand }) }, rest), node.children && node.children.length > 0\r\n ? node.children.map(child => (React.createElement(RecursiveTreeItem, { key: child.id, items: items, node: child, nodeId: child.id, onCollapse: onCollapse, onDropped: onDropped, onExpand: onExpand, canDrag: canDrag })))\r\n : null));\r\n});\r\nconst useRecursiveTreeItemStyles = makeStyles(theme => ({\r\n root: {\r\n borderStyle: 'solid',\r\n borderWidth: 2,\r\n borderColor: 'transparent',\r\n },\r\n content: {\r\n padding: theme.spacing(1),\r\n paddingLeft: 0,\r\n },\r\n label: {},\r\n isDragging: {\r\n opacity: 0.5,\r\n },\r\n isOver: {\r\n borderColor: theme.palette.info.main,\r\n },\r\n dropTarget: {\r\n maxHeight: 5,\r\n minHeight: 5,\r\n borderWidth: 0,\r\n },\r\n dropTargetFocused: {\r\n backgroundColor: theme.palette.info.main,\r\n },\r\n}));\r\nexport const DRAG_DROP_TYPE = 'document';\r\n//# sourceMappingURL=DocumentationTree.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nexport const AddDocumentButton = (_a) => {\r\n var { document, onClick } = _a, rest = __rest(_a, [\"document\", \"onClick\"]);\r\n const handleAddNewDocument = () => {\r\n onClick(document);\r\n };\r\n return React.createElement(Button, Object.assign({ onClick: handleAddNewDocument }, rest));\r\n};\r\n//# sourceMappingURL=AddDocumentButton.js.map","import React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport IconEdit from '@material-ui/icons/Edit';\r\nimport IconDelete from '@material-ui/icons/Delete';\r\nimport IconAdd from '@material-ui/icons/Add';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useTranslate } from 'ra-core';\r\nimport { AddDocumentButton } from './AddDocumentButton';\r\nimport { DeleteDocumentButton } from './DeleteDocumentButton';\r\n/**\r\n * The toolbar displayed at the top of the document view\r\n */\r\nexport const DocumentToolbar = ({ disabled, document, entityType, entityUuid, hasChildren, userCanEdit, userCanAdd, userCanDelete, onEdit, onAddNewDocument, onDeleteDocument, }) => {\r\n const classes = useStyles();\r\n const translate = useTranslate();\r\n if (!document || (!userCanEdit && !userCanDelete)) {\r\n return null;\r\n }\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(\"div\", { className: classes.root },\r\n userCanAdd && (React.createElement(AddDocumentButton, { document: document, color: \"primary\", size: \"small\", onClick: onAddNewDocument, disabled: disabled, className: classes.button, \"aria-label\": translate('resources.documents.actions.new_child_document_button'), startIcon: React.createElement(IconAdd, null) }, translate('resources.documents.actions.new_child_document_button'))),\r\n userCanEdit && (React.createElement(Button, { color: \"primary\", size: \"small\", onClick: onEdit, disabled: disabled, className: classes.button, \"aria-label\": translate('resources.documents.actions.edit_document_button'), startIcon: React.createElement(IconEdit, null) }, translate('resources.documents.actions.edit_document_button'))),\r\n userCanDelete && (React.createElement(DeleteDocumentButton, { document: document, entityType: entityType, entityUuid: entityUuid, hasChildren: hasChildren, color: \"primary\", size: \"small\", onClick: onDeleteDocument, disabled: disabled, className: classes.button, \"aria-label\": translate('resources.documents.actions.delete_document_button'), startIcon: React.createElement(IconDelete, null) }, translate('resources.documents.actions.delete_document_button')))),\r\n React.createElement(Divider, null)));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(1),\r\n },\r\n button: {\r\n '& + &': {\r\n marginLeft: theme.spacing(2),\r\n },\r\n },\r\n}), {\r\n name: 'Layer7DocumentationToolbar',\r\n});\r\n//# sourceMappingURL=DocumentToolbar.js.map","import React from 'react';\r\nimport { useTranslate, useGetOne, CRUD_GET_ONE } from 'react-admin';\r\nimport get from 'lodash/get';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { buildDocumentId } from '../../dataProvider/documents';\r\nimport { MarkdownView } from '../../ui';\r\nimport { DocumentToolbar } from './DocumentToolbar';\r\nexport const DocumentView = ({ document, entityType, entityUuid, userCanEdit, userCanDelete, hasChildren, onEdit, onAddNewDocument, onDeleteDocument, }) => {\r\n const translate = useTranslate();\r\n const classes = useStyles();\r\n const documentId = buildDocumentId(entityType, entityUuid, document.navtitle, document.locale);\r\n const { data, loaded, loading, error } = useGetOne('documents', documentId, { action: CRUD_GET_ONE });\r\n if (loading) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (loaded && !!(!data || error)) {\r\n return (React.createElement(Typography, { variant: \"body2\", color: \"error\" }, translate('ra.page.error')));\r\n }\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(DocumentToolbar, { document: document, entityType: entityType, entityUuid: entityUuid, userCanEdit: userCanEdit, userCanAdd: userCanEdit, userCanDelete: userCanDelete, hasChildren: hasChildren, onEdit: onEdit, onAddNewDocument: onAddNewDocument, onDeleteDocument: onDeleteDocument }),\r\n React.createElement(MarkdownView, { className: classes.markdown, value: get(data, 'markdown', '') })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n markdown: {\r\n padding: theme.spacing(2),\r\n '& code': {\r\n whiteSpace: 'pre-wrap',\r\n },\r\n '& table': {\r\n fontSize: '14px',\r\n lineHeight: '1.7',\r\n maxWidth: '100%',\r\n overflow: 'auto',\r\n border: '1px solid #f6f6f6',\r\n borderCollapse: 'collapse',\r\n borderSpacing: 0,\r\n boxSizing: 'border-box',\r\n },\r\n '& table th': {\r\n textAlign: 'center',\r\n fontWeight: 700,\r\n border: '1px solid #efefef',\r\n padding: '10px 6px',\r\n backgroundColor: '#f5f7fa',\r\n wordBreak: 'break-word',\r\n },\r\n '& table td': {\r\n border: '1px solid #efefef',\r\n textAlign: 'left',\r\n padding: '10px 15px',\r\n wordBreak: 'break-word',\r\n minWidth: '60px',\r\n },\r\n },\r\n}), {\r\n name: 'Layer7DocumentView',\r\n});\r\n//# sourceMappingURL=DocumentView.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { Labeled, InputHelperText, useInput } from 'react-admin';\r\nimport classNames from 'classnames';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport { MarkdownEditor, markdownRenderer as defaultMarkdownRenderer, } from './';\r\nexport const MarkdownInput = (_a) => {\r\n var { markdownRenderer = defaultMarkdownRenderer, options = {}, helperText, formClassName, className } = _a, rest = __rest(_a, [\"markdownRenderer\", \"options\", \"helperText\", \"formClassName\", \"className\"]);\r\n const classes = useStyles(rest);\r\n const { input: { onChange, value, name }, meta: { error, touched }, } = useInput(Object.assign({}, rest));\r\n return (React.createElement(Labeled, Object.assign({ className: classNames(formClassName, className) }, rest, { id: \"textarea\" }),\r\n React.createElement(\"div\", { className: classes.editor },\r\n React.createElement(MarkdownEditor, { name: name, value: value, markdownRenderer: markdownRenderer, options: options, onChange: onChange }),\r\n React.createElement(FormHelperText, { error: !!error, variant: \"filled\", margin: \"dense\" },\r\n React.createElement(InputHelperText, { touched: touched, error: error, helperText: helperText })))));\r\n};\r\nconst useStyles = makeStyles({\r\n editor: {\r\n '& .rc-md-editor': {\r\n width: '100%',\r\n height: '40vh',\r\n },\r\n '& code': {\r\n whiteSpace: 'pre-wrap',\r\n },\r\n },\r\n}, {\r\n name: 'Layer7MarkdownInput',\r\n});\r\n//# sourceMappingURL=MarkdownInput.js.map","import React from 'react';\r\nimport { useTranslate } from 'react-admin';\r\nimport { Prompt } from 'react-router-dom';\r\nexport const DocumentFormConfirmBeforeQuit = ({ when }) => {\r\n const translate = useTranslate();\r\n return (React.createElement(Prompt, { when: when, message: () => translate('resources.documents.notifications.unsaved_changes') }));\r\n};\r\n//# sourceMappingURL=DocumentFormConfirmBeforeQuit.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { Toolbar, SaveButton, useTranslate } from 'react-admin';\r\nimport { ValidationError } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { DocumentFormConfirmBeforeQuit } from './DocumentFormConfirmBeforeQuit';\r\nexport const DocumentFormToolbar = (_a) => {\r\n var { loading = false, error = null, onCancel = () => { }, pristine } = _a, rest = __rest(_a, [\"loading\", \"error\", \"onCancel\", \"pristine\"]);\r\n const classes = useStyles(rest);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(DocumentFormConfirmBeforeQuit, { when: !pristine }),\r\n error ? (React.createElement(\"div\", { className: classes.error },\r\n React.createElement(Typography, { variant: \"body1\", color: \"error\" },\r\n React.createElement(ValidationError, { error: error })))) : null,\r\n React.createElement(Toolbar, Object.assign({ className: classes.toolbar, pristine: pristine }, rest),\r\n React.createElement(CancelButton, { onClick: onCancel }),\r\n React.createElement(SaveButton, { label: \"resources.documents.actions.save\", className: classes.saveButton, saving: loading }))));\r\n};\r\nconst CancelButton = (_a) => {\r\n var { basePath, handleSubmit, handleSubmitWithRedirect, onSave, invalid, pristine, submitOnEnter, onClick } = _a, rest = __rest(_a, [\"basePath\", \"handleSubmit\", \"handleSubmitWithRedirect\", \"onSave\", \"invalid\", \"pristine\", \"submitOnEnter\", \"onClick\"]);\r\n const translate = useTranslate();\r\n return (React.createElement(Button, Object.assign({ color: \"primary\", variant: \"outlined\", onClick: onClick }, rest), translate('resources.documents.actions.cancel')));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n backgroundColor: 'transparent',\r\n padding: 0,\r\n marginTop: theme.spacing(2),\r\n marginLeft: theme.spacing(),\r\n minWidth: `calc(512px + ${theme.spacing(4)}px)`,\r\n [theme.breakpoints.up('sm')]: {\r\n width: `calc(100% - ${theme.spacing(3)}px)`,\r\n minWidth: `calc(768px + ${theme.spacing(4)}px)`,\r\n },\r\n },\r\n saveButton: {\r\n marginLeft: theme.spacing(2),\r\n },\r\n error: {\r\n margin: theme.spacing(2),\r\n },\r\n success: {\r\n color: theme.palette.success.main,\r\n marginTop: theme.spacing(2),\r\n },\r\n}), {\r\n name: 'Layer7DocumentFormToolbar',\r\n});\r\n//# sourceMappingURL=DocumentFormToolbar.js.map","import React, { useEffect } from 'react';\r\nimport { SimpleForm, DateField, TextField, TextInput, useUpdate, required, CRUD_UPDATE, } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nimport { MarkdownInput } from '../../ui';\r\nimport { DocumentFormToolbar } from './DocumentFormToolbar';\r\nexport const DocumentEditForm = ({ document, onSave = () => { }, onCancel = () => { }, }) => {\r\n const notify = useLayer7Notify();\r\n const [update, { data, loading, error }] = useUpdate('documents');\r\n const handleSave = newDocument => {\r\n update({\r\n payload: {\r\n id: document.id,\r\n data: Object.assign(Object.assign({}, newDocument), { id: document.id }),\r\n },\r\n }, {\r\n action: CRUD_UPDATE,\r\n onSuccess: () => {\r\n notify('resources.documents.notifications.edit_success');\r\n },\r\n onFailure: error => {\r\n notify(error || 'resources.documents.notifications.edit_error', 'error');\r\n },\r\n });\r\n };\r\n useEffect(() => {\r\n if (data && data.uuid) {\r\n onSave(data);\r\n }\r\n }, [data, onSave]);\r\n return (React.createElement(DocumentForm, { record: document, loading: loading, error: error, onSave: handleSave, onCancel: onCancel }));\r\n};\r\nconst DocumentForm = ({ record = {}, loading = false, error = null, onSave = () => { }, onCancel = () => { }, }) => {\r\n const classes = useStyles();\r\n return (React.createElement(SimpleForm, { resource: \"documents\", record: record, toolbar: React.createElement(DocumentFormToolbar, { loading: loading, error: error, onCancel: onCancel }), save: onSave },\r\n React.createElement(TextInput, { source: \"title\", formClassName: classes.title, validate: required() }),\r\n React.createElement(TextField, { source: \"navtitle\", formClassName: classes.navtitle }),\r\n React.createElement(DateField, { source: \"modifyTs\", formClassName: classes.modifyTs }),\r\n React.createElement(MarkdownInput, { source: \"markdown\", formClassName: classes.markdown, validate: required(), isRequired: true, fullWidth: true })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n title: {\r\n display: 'inline-block',\r\n width: '30%',\r\n },\r\n navtitle: {\r\n display: 'inline-block',\r\n marginLeft: theme.spacing(4),\r\n width: '30%',\r\n },\r\n modifyTs: {\r\n display: 'inline-block',\r\n marginLeft: theme.spacing(4),\r\n width: '30%',\r\n },\r\n markdown: {\r\n width: '100%',\r\n },\r\n}), {\r\n name: 'Layer7DocumentEditForm',\r\n});\r\n//# sourceMappingURL=DocumentEditForm.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useGetOne, useTranslate, CRUD_GET_ONE } from 'ra-core';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { DocumentEditForm } from './DocumentEditForm';\r\nimport { DocumentToolbar } from './DocumentToolbar';\r\nexport const DocumentEdit = (_a) => {\r\n var { document, entityType, entityUuid, userCanDelete, userCanEdit, hasChildren, onAddNewDocument, onDeleteDocument } = _a, rest = __rest(_a, [\"document\", \"entityType\", \"entityUuid\", \"userCanDelete\", \"userCanEdit\", \"hasChildren\", \"onAddNewDocument\", \"onDeleteDocument\"]);\r\n const translate = useTranslate();\r\n const { data, loaded, loading, error } = useGetOne('documents', document.id, { action: CRUD_GET_ONE });\r\n if (loading) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (loaded && !!(!data || error)) {\r\n return (React.createElement(Typography, { variant: \"body2\", color: \"error\" }, translate('ra.page.error')));\r\n }\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(DocumentToolbar, { document: document, entityType: entityType, entityUuid: entityUuid, userCanEdit: userCanEdit, userCanAdd: userCanEdit, userCanDelete: userCanDelete, hasChildren: hasChildren, onAddNewDocument: onAddNewDocument, onDeleteDocument: onDeleteDocument, disabled: true }),\r\n React.createElement(DocumentEditForm, Object.assign({ document: data }, rest))));\r\n};\r\n//# sourceMappingURL=DocumentEdit.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useMemo } from 'react';\r\nimport { SimpleForm, FormDataConsumer, TextInput, useCreate, useRefresh, required, CRUD_CREATE, } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { useForm } from 'react-final-form';\r\nimport slugify from 'slugify';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nimport { buildDocumentId } from '../../dataProvider/documents';\r\nimport { MarkdownInput } from '../../ui';\r\nimport { DocumentFormToolbar } from './DocumentFormToolbar';\r\nexport const DocumentCreateForm = ({ document, entityType, entityUuid, allDocuments = [], onSaved = () => { }, onCancel = () => { }, }) => {\r\n const notify = useLayer7Notify();\r\n const refresh = useRefresh();\r\n const [create, { loading, error }] = useCreate('documents');\r\n const handleSave = newDocument => {\r\n const documentId = buildDocumentId(entityType, entityUuid, newDocument.navtitle, newDocument.locale);\r\n create({\r\n payload: { data: Object.assign(Object.assign({}, newDocument), { id: documentId }) },\r\n }, {\r\n action: CRUD_CREATE,\r\n onSuccess: ({ data }) => {\r\n notify('resources.documents.notifications.create_success');\r\n refresh();\r\n onSaved(data);\r\n },\r\n onFailure: error => {\r\n notify(error ||\r\n 'resources.documents.notifications.create_error', 'error');\r\n },\r\n });\r\n };\r\n return (React.createElement(DocumentForm, { document: document, loading: loading, error: error, allDocuments: allDocuments, onSave: handleSave, onCancel: onCancel }));\r\n};\r\nexport const DocumentForm = (_a) => {\r\n var { document = {}, loading = false, error = null, allDocuments = [], onSave = () => { }, onCancel = () => { } } = _a, rest = __rest(_a, [\"document\", \"loading\", \"error\", \"allDocuments\", \"onSave\", \"onCancel\"]);\r\n const classes = useStyles(rest);\r\n const navtitles = useMemo(() => Object.values(allDocuments).map(item => item.navtitle), [allDocuments]);\r\n return (React.createElement(SimpleForm, { resource: \"documents\", record: document, toolbar: React.createElement(DocumentFormToolbar, { loading: loading, error: error, onCancel: onCancel }), save: onSave },\r\n React.createElement(FormDataConsumer, null, () => {\r\n // eslint-disable-next-line\r\n const form = useForm();\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(TextInput, { resource: \"documents\", source: \"title\", className: classes.title, onChange: event => {\r\n const navtitleFieldState = form.getFieldState('navtitle');\r\n if (navtitleFieldState.modified &&\r\n navtitleFieldState.touched) {\r\n return;\r\n }\r\n const newNavtitle = slugifyURI(event.target.value);\r\n form.change('navtitle', newNavtitle);\r\n }, validate: required() }),\r\n React.createElement(TextInput, { resource: \"documents\", source: \"navtitle\", className: classes.navtitle, validate: [\r\n required(),\r\n checkUnicity(navtitles),\r\n checkSpecialCharacters(),\r\n ] })));\r\n }),\r\n React.createElement(MarkdownInput, { source: \"markdown\", formClassName: classes.markdown, validate: required(), isRequired: true, fullWidth: true })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n title: {\r\n display: 'inline-block',\r\n width: '256px',\r\n },\r\n navtitle: {\r\n display: 'inline-block',\r\n marginLeft: theme.spacing(4),\r\n width: '256px',\r\n },\r\n markdown: {\r\n width: '100%',\r\n },\r\n}), {\r\n name: 'Layer7DocumentCreateForm',\r\n});\r\nconst URI_ALLOWED_STRING = /^[a-zA-Z0-9_-]*$/;\r\nconst URI_NOT_ALLOWED_CHARACTERS = /[^a-zA-Z0-9_-\\s]/g;\r\nexport const checkSpecialCharacters = () => value => {\r\n if (URI_ALLOWED_STRING.test(value)) {\r\n return;\r\n }\r\n return 'resources.documents.validation.error_no_special_characters';\r\n};\r\nexport const checkUnicity = navtitles => value => {\r\n if (!navtitles\r\n .map(navtitle => navtitle.toLowerCase())\r\n .includes(value.toLowerCase())) {\r\n return;\r\n }\r\n return 'resources.documents.validation.error_navtitle_not_unique';\r\n};\r\nconst replaceNotAllowedCharacters = (text, replacement = '_') => {\r\n return text.replace(URI_NOT_ALLOWED_CHARACTERS, replacement);\r\n};\r\nexport const slugifyURI = uri => {\r\n const cleanedURI = replaceNotAllowedCharacters(uri, '_');\r\n return slugify(cleanedURI);\r\n};\r\n//# sourceMappingURL=DocumentCreateForm.js.map","import React from 'react';\r\nimport get from 'lodash/get';\r\nimport { DocumentCreateForm, slugifyURI } from './DocumentCreateForm';\r\nimport { getMaxOrdinalFromDocuments, getSiblingsDocuments } from './tree';\r\nexport const DocumentCreate = props => {\r\n return React.createElement(DocumentCreateForm, Object.assign({}, props));\r\n};\r\nexport const createNewDocument = (title, parentDocument, allItems, entityType, entityUuid, locale) => {\r\n const navtitle = slugifyURI(title);\r\n const parentUuid = get(parentDocument, 'uuid', undefined);\r\n const siblingsItems = getSiblingsDocuments(allItems, parentUuid);\r\n const ordinal = getMaxOrdinalFromDocuments(siblingsItems) + 1;\r\n return Object.assign(Object.assign({ id: 'new-document', type: get(parentDocument, 'type', entityType), typeUuid: get(parentDocument, 'typeUuid', entityUuid), status: 'PUBLISHED', ordinal,\r\n locale }, (parentUuid != null && { parentUuid })), { title,\r\n navtitle, markdown: '' });\r\n};\r\n//# sourceMappingURL=DocumentCreate.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { useMutation, CRUD_GET_LIST_SUCCESS, GET_LIST, FETCH_END, } from 'ra-core';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useCallback } from 'react';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport const moveDocument = ({ documentUuid, newParentUuid, ordinal: newOrdinal, allDocuments, }) => {\r\n const updatedDocument = allDocuments.find(doc => doc.uuid === documentUuid);\r\n if (!updatedDocument) {\r\n return;\r\n }\r\n const oldOrdinal = updatedDocument.ordinal;\r\n const oldParentUuid = updatedDocument.parentUuid;\r\n const result = allDocuments.map((doc, index) => {\r\n if (doc.uuid === updatedDocument.uuid) {\r\n const newSiblings = allDocuments.find(doc => doc.parentUuid === newParentUuid) ||\r\n [];\r\n const siblingsCount = oldParentUuid !== newParentUuid\r\n ? newSiblings.length + 1\r\n : newSiblings.length;\r\n const finalOrdinal = newOrdinal > siblingsCount - 1 ? siblingsCount - 1 : newOrdinal;\r\n return Object.assign(Object.assign({}, doc), { parentUuid: newParentUuid, ordinal: finalOrdinal < 0 ? 0 : finalOrdinal });\r\n }\r\n if (oldParentUuid === newParentUuid &&\r\n doc.parentUuid === oldParentUuid) {\r\n if (oldOrdinal < newOrdinal) {\r\n if (doc.ordinal > oldOrdinal && doc.ordinal <= newOrdinal) {\r\n return Object.assign(Object.assign({}, doc), { ordinal: doc.ordinal - 1 });\r\n }\r\n }\r\n if (oldOrdinal > newOrdinal) {\r\n if (doc.ordinal < oldOrdinal && doc.ordinal >= newOrdinal) {\r\n return Object.assign(Object.assign({}, doc), { ordinal: doc.ordinal + 1 });\r\n }\r\n }\r\n }\r\n if (oldParentUuid !== newParentUuid) {\r\n if (doc.parentUuid === oldParentUuid && doc.ordinal >= oldOrdinal) {\r\n return Object.assign(Object.assign({}, doc), { ordinal: doc.ordinal - 1 });\r\n }\r\n if (doc.parentUuid === newParentUuid && doc.ordinal >= newOrdinal) {\r\n return Object.assign(Object.assign({}, doc), { ordinal: doc.ordinal + 1 });\r\n }\r\n }\r\n return doc;\r\n });\r\n return result;\r\n};\r\nconst prepareDataForUpdate = items => items.map((_a) => {\r\n var { id, children, markdown } = _a, item = __rest(_a, [\"id\", \"children\", \"markdown\"]);\r\n return item;\r\n});\r\nexport const useUpdateDocumentTree = ({ entityType, entityUuid, items, locale, }) => {\r\n const dispatch = useDispatch();\r\n const notify = useLayer7Notify();\r\n const [mutate, mutationState] = useMutation({\r\n type: 'updateTree',\r\n resource: 'documents',\r\n });\r\n const handleSave = useCallback(({ documentUuid, newParentUuid, ordinal }) => {\r\n const newDocuments = moveDocument({\r\n documentUuid,\r\n newParentUuid,\r\n ordinal,\r\n allDocuments: items,\r\n });\r\n mutate({\r\n payload: {\r\n entityType,\r\n entityUuid,\r\n locale,\r\n data: prepareDataForUpdate(newDocuments),\r\n },\r\n }, {\r\n undoable: true,\r\n onSuccess: () => {\r\n // Fake a getList fetch success to optimistically update\r\n // the treeview, avoiding a full view refresh\r\n dispatch({\r\n type: CRUD_GET_LIST_SUCCESS,\r\n payload: {\r\n data: newDocuments,\r\n total: newDocuments.length,\r\n },\r\n meta: {\r\n resource: 'documents',\r\n fetchResponse: GET_LIST,\r\n fetchStatus: FETCH_END,\r\n },\r\n });\r\n notify('resources.documents.notifications.tree_updated_success', 'info', undefined, true);\r\n },\r\n onFailure: error => {\r\n notify(error ||\r\n 'resources.documents.notifications.tree_updated_error', 'error');\r\n // Fake a getList fetch success to optimistically update\r\n // the treeview, avoiding a full view refresh\r\n // Here we pass the original documents\r\n dispatch({\r\n type: CRUD_GET_LIST_SUCCESS,\r\n payload: {\r\n data: items,\r\n total: items.length,\r\n },\r\n meta: {\r\n resource: 'documents',\r\n fetchResponse: GET_LIST,\r\n fetchStatus: FETCH_END,\r\n },\r\n });\r\n },\r\n });\r\n }, [dispatch, entityType, entityUuid, items, locale, mutate, notify]);\r\n return [handleSave, mutationState];\r\n};\r\n//# sourceMappingURL=useUpdateDocumentTree.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useMemo, useCallback, useEffect } from 'react';\r\nimport { CRUD_GET_LIST, useTranslate, useGetList, useVersion } from 'ra-core';\r\nimport { NotFound } from 'react-admin';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { parse, stringify } from 'query-string';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport get from 'lodash/get';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Button from '@material-ui/core/Button';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport IconAdd from '@material-ui/icons/Add';\r\nimport { useApiHubPreference, readApiHubPreference } from '../../preferences';\r\nimport { DocumentationTree, DocumentView, DocumentCreate, DocumentEdit, } from './';\r\nimport { getFirstDocument, documentHasChildren, getAllDocumentParents, } from './tree';\r\nimport { createNewDocument } from './DocumentCreate';\r\nimport { defaultLocale, documentationLocales, } from '../../i18n';\r\nimport { addNewDocument, removeNewDocument, getNewDocument, addExpandedNodes, } from './documentationReducer';\r\nimport { useExpandedNodes } from './documentationTreeHooks';\r\nimport { useUpdateDocumentTree } from './useUpdateDocumentTree';\r\nexport const Documentation = (_a) => {\r\n var { entityUuid, entityType } = _a, rest = __rest(_a, [\"entityUuid\", \"entityType\"]);\r\n const translate = useTranslate();\r\n const version = useVersion();\r\n const [documentationLocalePreference, writeDocumentationLocalePreference,] = useApiHubPreference('documentationLocale');\r\n useEffect(() => {\r\n const locale = readApiHubPreference('locale', defaultLocale);\r\n if (documentationLocalePreference === undefined) {\r\n writeDocumentationLocalePreference(locale);\r\n }\r\n }, [documentationLocalePreference, writeDocumentationLocalePreference]);\r\n const handleDocumentationLocaleChange = newLocale => {\r\n writeDocumentationLocalePreference(newLocale);\r\n };\r\n /**\r\n * We want the list of ids to be always available for optimistic rendering,\r\n * and therefore we need a custom action (CRUD_GET_LIST) that will be used.\r\n */\r\n const { ids, loaded, error, total } = useGetList('documents', undefined, undefined, {\r\n entityType,\r\n entityUuid,\r\n locale: documentationLocales[documentationLocalePreference],\r\n }, {\r\n action: CRUD_GET_LIST,\r\n version,\r\n });\r\n // When the user changes the page/sort/filter or delete an item, this\r\n // controller runs the useGetList hook again. While the result of this new\r\n // call is loading, the ids and total are empty. To avoid rendering an\r\n // empty list at that moment, we override the ids and total with the latest\r\n // loaded ones.\r\n const defaultIds = useSelector(state => get(state.admin.resources, ['documents', 'list', 'ids'], []));\r\n const idsToDisplay = typeof total === 'undefined' ? defaultIds : ids;\r\n const data = useSelector(state => get(state.admin.resources, ['documents', 'data'], {}));\r\n const items = useMemo(() => Object.values(data)\r\n .filter(item => {\r\n return (item.locale ===\r\n documentationLocales[documentationLocalePreference]);\r\n })\r\n .filter(item => idsToDisplay.includes(item.id)), [data, documentationLocalePreference, idsToDisplay]);\r\n if (!loaded) {\r\n return React.createElement(LinearProgress, null);\r\n }\r\n if (!data || error) {\r\n return (React.createElement(Typography, { variant: \"body2\", color: \"error\" }, translate('ra.page.error')));\r\n }\r\n return (React.createElement(DocumentationContent, Object.assign({ entityUuid: entityUuid, entityType: entityType, items: items, locale: documentationLocalePreference, onLocaleChange: handleDocumentationLocaleChange }, rest)));\r\n};\r\nconst DocumentationContent = ({ entityUuid, entityType, items, locale, onLocaleChange, userCanEdit = false, userCanDelete = false, }) => {\r\n const translate = useTranslate();\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const [expanded, setExpanded] = useExpandedNodes(entityUuid, locale);\r\n const { error, mode, selectedDocument, selectedDocumentId, openDocumentPage, openNewDocumentPage, closeDocumentPage, } = useDocumentationHistory(items, entityUuid, locale);\r\n const [handleDocumentParentChange] = useUpdateDocumentTree({\r\n entityType,\r\n entityUuid,\r\n items,\r\n locale: documentationLocales[locale],\r\n });\r\n const handleLocaleChange = newLocale => {\r\n onLocaleChange(newLocale);\r\n closeDocumentPage();\r\n };\r\n const handleSelectDocument = document => {\r\n openDocumentPage(document, 'view');\r\n };\r\n const handleEditDocument = () => {\r\n openDocumentPage(selectedDocument, 'edit');\r\n };\r\n const handleSaveEditDocument = () => {\r\n openDocumentPage(selectedDocument, 'view');\r\n };\r\n const handleCancelEditDocument = () => {\r\n openDocumentPage(selectedDocument, 'view');\r\n };\r\n const newDocument = useSelector(getNewDocument);\r\n useEffect(() => {\r\n if (mode === 'add') {\r\n if (!history.location.state) {\r\n history.goBack();\r\n return;\r\n }\r\n dispatch(addNewDocument(history.location.state));\r\n }\r\n else if (newDocument) {\r\n dispatch(removeNewDocument());\r\n }\r\n }, [dispatch, history, mode, newDocument]);\r\n const handleAddNewDocument = parentDocument => {\r\n if (newDocument != null) {\r\n return;\r\n }\r\n if (parentDocument) {\r\n dispatch(addExpandedNodes(entityUuid, locale, [parentDocument.id]));\r\n }\r\n const title = translate('resources.documents.fields.new_document');\r\n openNewDocumentPage(createNewDocument(title, parentDocument, items, entityType, entityUuid, documentationLocales[locale]));\r\n };\r\n const handleSaveNewDocument = document => {\r\n openDocumentPage(document, 'view');\r\n };\r\n const handleCancelAddNewDocument = () => {\r\n closeDocumentPage();\r\n };\r\n const handleDeleteDocument = () => {\r\n closeDocumentPage();\r\n };\r\n const hasChildren = useMemo(() => selectedDocument\r\n ? documentHasChildren(items, selectedDocument)\r\n : false, [items, selectedDocument]);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(\"div\", { className: classes.treeContainer },\r\n React.createElement(\"div\", { className: classes.treeToolbar }, userCanEdit && (React.createElement(Button, { className: classes.addRootDocumentationButton, color: \"primary\", onClick: () => handleAddNewDocument(), disabled: newDocument != null, \"aria-label\": translate('resources.documents.actions.new_document_button'), title: translate('resources.documents.actions.new_document_button') },\r\n React.createElement(IconAdd, null),\r\n \" \",\r\n translate('resources.documents.actions.new_document_button')))),\r\n React.createElement(Divider, null),\r\n locale && (React.createElement(DocumentationTree, { className: classes.tree, items: [\r\n ...(newDocument != null ? [newDocument] : []),\r\n ...items,\r\n ], onDocumentSelected: handleSelectDocument, selectedDocumentId: newDocument != null\r\n ? newDocument.id\r\n : selectedDocumentId, expanded: expanded, onExpandedChange: setExpanded, onDocumentParentChange: handleDocumentParentChange, canDrag: userCanEdit }))),\r\n React.createElement(\"div\", { className: classes.documentation },\r\n selectedDocument && mode === 'view' ? (React.createElement(DocumentView, { document: selectedDocument, entityType: entityType, entityUuid: entityUuid, locale: locale, userCanDelete: userCanDelete, userCanEdit: userCanEdit, hasChildren: hasChildren, onEdit: handleEditDocument, onAddNewDocument: handleAddNewDocument, onDeleteDocument: handleDeleteDocument, allDocuments: items })) : null,\r\n selectedDocument && mode === 'edit' ? (React.createElement(DocumentEdit, { document: selectedDocument, entityType: entityType, entityUuid: entityUuid, userCanDelete: userCanDelete, userCanEdit: userCanEdit, hasChildren: hasChildren, onSave: handleSaveEditDocument, onCancel: handleCancelEditDocument, onAddNewDocument: handleAddNewDocument, onDeleteDocument: handleDeleteDocument })) : null,\r\n newDocument && mode === 'add' ? (React.createElement(DocumentCreate, { document: newDocument, entityType: entityType, entityUuid: entityUuid, allDocuments: items, onSaved: handleSaveNewDocument, onCancel: handleCancelAddNewDocument })) : null,\r\n error && React.createElement(NotFound, null))));\r\n};\r\nfunction useQuery() {\r\n const location = useLocation();\r\n return parse(location.search);\r\n}\r\nfunction useDocumentationHistory(items, entityUuid, locale) {\r\n const history = useHistory();\r\n const query = useQuery();\r\n const dispatch = useDispatch();\r\n const selectedDocumentNavtitle = get(query, 'uri', null);\r\n const mode = get(query, 'mode', 'view');\r\n const selectedDocument = items.find(documentation => documentation.navtitle === selectedDocumentNavtitle) || null;\r\n const selectedDocumentId = selectedDocument ? selectedDocument.id : null;\r\n const firstDocument = useMemo(() => getFirstDocument(items), [items]);\r\n useEffect(() => {\r\n const parents = getAllDocumentParents(selectedDocument, items).map(({ id }) => id);\r\n if (parents.length > 0) {\r\n dispatch(addExpandedNodes(entityUuid, locale, parents));\r\n }\r\n }, [dispatch, items, locale, selectedDocument, entityUuid]);\r\n const openDocumentPage = useCallback((document = null, mode = 'view', state = null) => {\r\n return history.push(Object.assign({ pathname: history.location.pathname, search: stringify(Object.assign(Object.assign({}, (document && { uri: document.navtitle })), { mode })) }, (state != null && { state })));\r\n }, [history]);\r\n const openNewDocumentPage = state => {\r\n return openDocumentPage(null, 'add', state);\r\n };\r\n const closeDocumentPage = () => {\r\n return history.push({\r\n pathname: history.location.pathname,\r\n });\r\n };\r\n useEffect(() => {\r\n if (mode !== 'add' &&\r\n selectedDocumentNavtitle === null &&\r\n firstDocument !== null) {\r\n openDocumentPage(firstDocument, 'view');\r\n }\r\n }, [\r\n firstDocument,\r\n items,\r\n mode,\r\n openDocumentPage,\r\n selectedDocument,\r\n selectedDocumentNavtitle,\r\n ]);\r\n return {\r\n // If a document was requested but not found\r\n error: selectedDocumentNavtitle && !selectedDocumentId\r\n ? 'resources.documents.notifications.not_found'\r\n : undefined,\r\n mode,\r\n selectedDocument,\r\n selectedDocumentId,\r\n openDocumentPage,\r\n openNewDocumentPage,\r\n closeDocumentPage,\r\n };\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n height: '100%',\r\n minHeight: '550px',\r\n },\r\n treeContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n padding: theme.spacing(1),\r\n paddingRight: theme.spacing(2),\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n flexBasis: '20%',\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.divider,\r\n borderWidth: '0px 1px 0px 0px',\r\n },\r\n tree: {},\r\n treeToolbar: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n },\r\n documentation: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n marginLeft: theme.spacing(1),\r\n padding: theme.spacing(1),\r\n flexGrow: 1,\r\n },\r\n localeButton: {\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n },\r\n addRootDocumentationButton: {},\r\n leftIcon: {\r\n marginRight: theme.spacing(1),\r\n },\r\n}), {\r\n name: 'Layer7Documentation',\r\n});\r\n//# sourceMappingURL=Documentation.js.map","import { useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { saveExpandedNodes, selectExpandedNodes } from './documentationReducer';\r\nexport const useExpandedNodes = (entityUuid, locale) => {\r\n const dispatch = useDispatch();\r\n const expandedNodes = useSelector(useCallback(selectExpandedNodes(entityUuid, locale), [\r\n entityUuid,\r\n locale,\r\n ]));\r\n const setExpandedNodes = useCallback(expanded => dispatch(saveExpandedNodes(entityUuid, locale, expanded)), [dispatch, entityUuid, locale]);\r\n return [expandedNodes, setExpandedNodes];\r\n};\r\n//# sourceMappingURL=documentationTreeHooks.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { PluginComponent } from 'react-markdown-editor-lite';\r\nimport Button from '@material-ui/core/Button';\r\nimport FormatBoldIcon from '@material-ui/icons/FormatBold';\r\nimport FormatItalicIcon from '@material-ui/icons/FormatItalic';\r\nimport FormatStrikethroughIcon from '@material-ui/icons/FormatStrikethrough';\r\nimport FormatListBulletedIcon from '@material-ui/icons/FormatListBulleted';\r\nimport FormatListNumberedIcon from '@material-ui/icons/FormatListNumbered';\r\nimport FormatQuoteIcon from '@material-ui/icons/FormatQuote';\r\nimport WrapTextIcon from '@material-ui/icons/WrapText';\r\nimport CodeIcon from '@material-ui/icons/Code';\r\nimport SettingsEthernetIcon from '@material-ui/icons/SettingsEthernet';\r\nconst FontButton = props => {\r\n const { type, onClick, children } = props;\r\n const translate = useTranslate();\r\n const handleClick = () => onClick(type);\r\n return (React.createElement(Button, { className: \"button\", title: translate(`apihub.markdown_editor.fonts.${type}`), onClick: handleClick }, children));\r\n};\r\nexport default class AccessibleFonts extends PluginComponent {\r\n render() {\r\n const handleClick = type => {\r\n this.editor.insertMarkdown(type);\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(FontButton, { type: \"bold\", onClick: handleClick },\r\n React.createElement(FormatBoldIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"italic\", onClick: handleClick },\r\n React.createElement(FormatItalicIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"strikethrough\", onClick: handleClick },\r\n React.createElement(FormatStrikethroughIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"unordered\", onClick: handleClick },\r\n React.createElement(FormatListBulletedIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"order\", onClick: handleClick },\r\n React.createElement(FormatListNumberedIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"quote\", onClick: handleClick },\r\n React.createElement(FormatQuoteIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"hr\", onClick: handleClick },\r\n React.createElement(WrapTextIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"inlinecode\", onClick: handleClick },\r\n React.createElement(CodeIcon, { fontSize: \"small\" })),\r\n React.createElement(FontButton, { type: \"code\", onClick: handleClick },\r\n React.createElement(SettingsEthernetIcon, { fontSize: \"small\" }))));\r\n }\r\n}\r\nAccessibleFonts.pluginName = 'accessible-fonts';\r\n//# sourceMappingURL=AccessibleFonts.js.map","import React from 'react';\r\nimport ReactMarkdownEditor from 'react-markdown-editor-lite';\r\nimport 'react-markdown-editor-lite/lib/index.css';\r\nimport AccessibleFonts from './plugins/AccessibleFonts';\r\nimport { markdownRenderer as defaultMarkdownRenderer } from './';\r\nconst defaultOptions = {\r\n canView: {\r\n menu: true,\r\n md: true,\r\n html: true,\r\n fullScreen: false,\r\n hideMenu: false,\r\n },\r\n syncScrollMode: ['leftFollowRight', 'rightFollowLeft'],\r\n};\r\nexport const MarkdownEditor = ({ markdownRenderer = defaultMarkdownRenderer, options = {}, name, value, onChange, className, }) => {\r\n const handleChange = ({ text }) => {\r\n onChange(text);\r\n };\r\n ReactMarkdownEditor.use(AccessibleFonts);\r\n return (React.createElement(\"div\", { className: className },\r\n React.createElement(ReactMarkdownEditor, { name: name, value: value, renderHTML: markdownRenderer, config: Object.assign(Object.assign({}, defaultOptions), options), onChange: handleChange, plugins: [\r\n 'header',\r\n 'accessible-fonts',\r\n 'table',\r\n 'image',\r\n 'link',\r\n 'clear',\r\n 'logger',\r\n 'mode-toggle',\r\n ] })));\r\n};\r\n//# sourceMappingURL=MarkdownEditor.js.map","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nexport const IconApi = props => {\r\n return (React.createElement(SvgIcon, Object.assign({ viewBox: \"0 0 16 11.761\", fontSize: \"small\" }, props),\r\n React.createElement(\"path\", { d: \"M8.6,41.134a1.31,1.31,0,0,0,1.353,1.28H23.247a1.31,1.31,0,0,0,1.353-1.28V33.6H8.6Zm6.609-3.675h3.9a.366.366,0,1,1,0,.731h-3.9a.366.366,0,1,1,0-.731Zm-4.657-1.719a.341.341,0,0,1,0-.512.388.388,0,0,1,.541,0l2.473,2.341a.341.341,0,0,1,0,.512L11.093,40.42a.388.388,0,0,1-.541,0,.341.341,0,0,1,0-.512l2.184-2.085Z\", transform: \"translate(-8.6 -30.652)\" }),\r\n React.createElement(\"path\", { d: \"M23.247,18.2H9.953A1.369,1.369,0,0,0,8.6,19.6v.881h16V19.6A1.4,1.4,0,0,0,23.247,18.2ZM9.779,20.043a.681.681,0,1,1,.657-.681A.664.664,0,0,1,9.779,20.043Zm1.99,0a.681.681,0,1,1,.657-.681A.664.664,0,0,1,11.769,20.043Zm2.01,0a.681.681,0,1,1,.657-.681A.664.664,0,0,1,13.779,20.043Z\", transform: \"translate(-8.6 -18.2)\" })));\r\n};\r\n//# sourceMappingURL=IconApi.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState } from 'react';\r\nimport { TextInput } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport { InfoOutlined, Visibility, VisibilityOff } from '@material-ui/icons';\r\nimport { makeStyles, IconButton, InputAdornment } from '@material-ui/core';\r\nimport { HtmlTooltip } from './HtmlTooltip';\r\nexport const PasswordInput = (_a) => {\r\n var { title } = _a, props = __rest(_a, [\"title\"]);\r\n const [passwordVisible, setPasswordVisible] = usePasswordVisibility();\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(TextInput, Object.assign({ type: passwordVisible ? 'text' : 'password', variant: \"outlined\", InputProps: {\r\n endAdornment: (React.createElement(InputAdornment, { position: \"end\" },\r\n React.createElement(React.Fragment, null,\r\n React.createElement(IconButton, { \"aria-label\": translate(passwordVisible\r\n ? 'ra.input.password.toggle_visible'\r\n : 'ra.input.password.toggle_hidden'), onClick: setPasswordVisible }, passwordVisible ? (React.createElement(VisibilityOff, null)) : (React.createElement(Visibility, null))),\r\n title ? (React.createElement(HtmlTooltip, { className: classes.tootip, title: translate(title), placement: \"right\", arrow: true },\r\n React.createElement(InfoOutlined, null))) : null))),\r\n } }, props)));\r\n};\r\nexport const usePasswordVisibility = initialValue => {\r\n const [visible, setVisible] = useState(initialValue);\r\n const toggleVisibility = () => {\r\n setVisible(!visible);\r\n };\r\n return [visible, toggleVisibility];\r\n};\r\nconst useStyles = makeStyles({\r\n tootip: {\r\n cursor: 'pointer',\r\n },\r\n}, {\r\n name: 'Layer7PasswordInput',\r\n});\r\n//# sourceMappingURL=PasswordInput.js.map","import React, { useEffect, useState } from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { useLocation } from 'react-router';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { useApiHub } from '../../ApiHubContext';\r\nimport { extractTokenFromUrl } from '../extractTokenFromUrl';\r\nimport { NewPasswordForm } from './NewPasswordForm';\r\nimport { NewPasswordVerifyingToken } from './NewPasswordVerifyingToken';\r\nimport { NewPasswordInvalidToken } from './NewPasswordInvalidToken';\r\nimport { NewPasswordSuccess } from './NewPasswordSuccess';\r\nimport { AuthenticationLayout } from '../AuthenticationLayout';\r\nimport { usePasswordEncryption } from '../usePasswordEncryption';\r\nimport { getFetchJson } from '../../fetchUtils';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\n/**\r\n * The component used to create a new password\r\n * *\r\n */\r\nexport const NewPassword = props => {\r\n const [state, handleSubmit] = useSetNewPassword();\r\n const translate = useTranslate();\r\n switch (state) {\r\n case 'verifying_token':\r\n return React.createElement(NewPasswordVerifyingToken, Object.assign({}, props));\r\n case 'request_new_password':\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h4\", component: \"h2\", color: \"textPrimary\", gutterBottom: true }, translate('apihub.new_password.title')),\r\n React.createElement(NewPasswordForm, Object.assign({ onSubmit: handleSubmit }, props))));\r\n case 'invalid_token':\r\n return React.createElement(NewPasswordInvalidToken, Object.assign({}, props));\r\n case 'success':\r\n return React.createElement(NewPasswordSuccess, Object.assign({}, props));\r\n default:\r\n return null;\r\n }\r\n};\r\n/**\r\n * The page displaying the form used to create a new password\r\n *\r\n * @param {*} Header A React Component used as the page header\r\n * @param {*} Content A React Component used to display some content next to the new password form\r\n * @param {*} Footer A React Component used as the page footer\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyApp = props => \r\n *\r\n * @example With customized parts\r\n * const Header = () => \r\n * const Footer = () => \r\n * const Content = () => \r\n *\r\n * const MyNewPasswordPage = props => (\r\n * \r\n * );\r\n *\r\n * const MyApp = props => \r\n */\r\nexport const NewPasswordPage = props => (React.createElement(AuthenticationLayout, Object.assign({}, props),\r\n React.createElement(NewPassword, null)));\r\n/**\r\n * This hook extracts the new password token from the url, verifies it and provides\r\n * a function to set the new password.\r\n *\r\n * It returns a tupple containing the current status (verifying_token, invalid_token, request_new_password and success)\r\n * and a function to actually submit the new password.\r\n */\r\nexport const useSetNewPassword = () => {\r\n const [state, setState] = useState('verifying_token');\r\n const location = useLocation();\r\n const { url, urlWithTenant, originHubName } = useApiHub();\r\n const token = extractTokenFromUrl(window.location.hash);\r\n const [publicKey, encrypt] = usePasswordEncryption();\r\n const notify = useLayer7Notify();\r\n useEffect(() => {\r\n if (state === 'verifying_token') {\r\n verifyNewPasswordTokenValid(urlWithTenant, originHubName, notify, token).then(isVerified => {\r\n setState(isVerified ? 'request_new_password' : 'invalid_token');\r\n });\r\n }\r\n }, [urlWithTenant, token, state, originHubName, notify]);\r\n const handleSubmit = async ({ password }) => {\r\n let finalPassword = password;\r\n if (publicKey) {\r\n finalPassword = await encrypt(password);\r\n }\r\n return submitNewPassword(url, urlWithTenant, originHubName, notify, publicKey, {\r\n newPassword: finalPassword,\r\n token,\r\n }).then(isSuccessful => setState(isSuccessful ? 'success' : 'request_new_password'));\r\n };\r\n return [state, handleSubmit];\r\n};\r\nconst submitNewPassword = (url, urlWithTenant, originHubName, notify, publicKey, { newPassword, token }) => {\r\n const fetchJson = getFetchJson(originHubName);\r\n const headers = new Headers({\r\n 'Content-Type': 'application/json; charset=UTF-8',\r\n Accept: 'text/plain, */*; q=0.01',\r\n });\r\n if (publicKey) {\r\n headers.set('Public-Key', publicKey);\r\n }\r\n return fetchJson(`${urlWithTenant}/v2/users/password/reset/${token}`, {\r\n method: 'put',\r\n headers: headers,\r\n body: JSON.stringify({ newPassword, uuid: token }),\r\n })\r\n .then(() => true)\r\n .catch(error => {\r\n console.log('error', error);\r\n notify(error, 'error');\r\n });\r\n};\r\nconst verifyNewPasswordTokenValid = (urlWithTenant, originHubName, notify, token) => {\r\n const fetchJson = getFetchJson(originHubName);\r\n return fetchJson(`${urlWithTenant}/passwordResetTokenValidate?token=${token}`)\r\n .then(({ json }) => !!json)\r\n .catch(error => {\r\n notify(error || 'apihub.new_password.notifications.invalid_token', 'error');\r\n });\r\n};\r\n//# sourceMappingURL=NewPassword.js.map","import React, { useState } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Link from '@material-ui/core/Link';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { CRUD_CREATE, useCreate, useTranslate } from 'ra-core';\r\nimport { SignUpForm } from './SignUpForm';\r\nimport { AuthenticationLayout } from '../AuthenticationLayout';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport const SignUp = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const [showConfirmation, setShowConfirmation] = useState(false);\r\n const [serverError, setServerError] = useState(null);\r\n const [signup] = useSignup();\r\n const handleSubmit = data => {\r\n signup(data, {\r\n onSuccess: () => setShowConfirmation(true),\r\n onFailure: error => {\r\n setServerError({ error });\r\n },\r\n });\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"h2\", color: \"textPrimary\", className: classes.title }, translate('resources.registrations.title')),\r\n showConfirmation ? (React.createElement(SignUpConfirmation, Object.assign({}, props))) : (React.createElement(SignUpForm, Object.assign({ onSubmit: handleSubmit, serverError: serverError }, props)))));\r\n};\r\n/**\r\n * The page displaying the reset password form\r\n *\r\n * @param {*} Header A React Component used as the page header\r\n * @param {*} Content A React Component used to display some content next to the reset password form\r\n * @param {*} Footer A React Component used as the page footer\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyApp = props => \r\n *\r\n * @example With customized parts\r\n * const Header = () => \r\n * const Footer = () => \r\n * const Content = () => \r\n *\r\n * const MyResetPasswordPage = props => (\r\n * \r\n * );\r\n *\r\n * const MyApp = props => \r\n */\r\nexport const SignUpPage = props => (React.createElement(AuthenticationLayout, Object.assign({}, props),\r\n React.createElement(SignUp, null)));\r\nexport const useSignup = () => {\r\n const [create, state] = useCreate('registrations');\r\n const notify = useLayer7Notify();\r\n const signup = (data, { onSuccess, onFailure }) => {\r\n create({\r\n payload: Object.assign({ FormField: '', Uuid: '{{GENERATED_GUID}}', OrganizationName: '', OrganizationDescription: '' }, data),\r\n }, {\r\n action: CRUD_CREATE,\r\n onSuccess: ({ data }) => {\r\n if (onSuccess) {\r\n onSuccess();\r\n }\r\n },\r\n onFailure: error => {\r\n notify(error || 'resources.registrations.notifications.error', 'error');\r\n if (onFailure) {\r\n onFailure(error);\r\n }\r\n },\r\n });\r\n };\r\n return [signup, state];\r\n};\r\nexport const SignUpConfirmation = () => {\r\n const translate = useTranslate();\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { component: \"p\", variant: \"h6\", gutterBottom: true }, translate('resources.registrations.notifications.confirmation_title')),\r\n React.createElement(Typography, { variant: \"body1\", gutterBottom: true }, translate('resources.registrations.notifications.confirmation')),\r\n React.createElement(Typography, { variant: \"body1\" },\r\n React.createElement(Link, { component: RouterLink, to: \"/login\" }, translate('resources.registrations.actions.return_to_homepage')))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n title: {\r\n fontSize: theme.typography.fontSize * 2,\r\n marginBottom: theme.spacing(6),\r\n },\r\n}));\r\n//# sourceMappingURL=SignUp.js.map","import React, { useEffect } from 'react';\r\nimport { List as RaList, Pagination as RaPagination } from 'react-admin';\r\nimport { ViewTitle } from './ViewTitle';\r\nimport { useApiHubPreference, readApiHubPreference } from '../preferences';\r\n/**\r\n * A List component which displays the react-admin list with the title above.\r\n *\r\n * @param {*} props The react-admin list properties\r\n * @param {string} props.resource The resource to fetch.\r\n * @param {int} props.perPage The perPage option, default to 12.\r\n *\r\n */\r\nexport const List = props => {\r\n const { className, resource, perPage = PER_PAGE_DEFAULT } = props;\r\n // Get the initial per page preference per resources\r\n // The readApiHubPreference method is used\r\n // instead of the useApiHubPreference hook\r\n // to not rerender the whole list each time the perPage property changes.\r\n // See the component above to understand the complete usage of the per page preferences.\r\n const perPagePreference = readApiHubPreference(`perPage/${resource}`, perPage);\r\n return (React.createElement(\"div\", { className: className },\r\n React.createElement(ViewTitle, null),\r\n React.createElement(RaList, Object.assign({}, props, { perPage: parseInt(perPagePreference, 10), pagination: React.createElement(Pagination, null) }))));\r\n};\r\nconst PER_PAGE_DEFAULT = 12;\r\nconst PER_PAGE_OPTIONS = [12, 24, 48];\r\nconst Pagination = props => {\r\n const { resource, perPage, setPerPage } = props;\r\n const [perPagePreference, setPerPagePreference] = useApiHubPreference(`perPage/${resource}`, perPage);\r\n useEffect(() => {\r\n if (perPagePreference !== perPage) {\r\n setPerPagePreference(perPagePreference);\r\n }\r\n }, [perPage, perPagePreference, setPerPage, setPerPagePreference]);\r\n const handleSetPerPage = newPerPage => {\r\n setPerPage(newPerPage);\r\n };\r\n return (React.createElement(RaPagination, Object.assign({}, props, { perPage: parseInt(perPagePreference, 10), setPerPage: handleSetPerPage, rowsPerPageOptions: PER_PAGE_OPTIONS })));\r\n};\r\n//# sourceMappingURL=List.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { cloneElement, useCallback } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { linkToRecord } from 'ra-core';\r\nimport MuiGrid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nexport const LoadingCardGrid = (_a) => {\r\n var { nbItems = 10, spacing = 2 } = _a, rest = __rest(_a, [\"nbItems\", \"spacing\"]);\r\n const classes = useStyles(rest);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(MuiGrid, { container: true, className: classes.gridList, spacing: spacing }, times(nbItems, key => (React.createElement(MuiGrid, { item: true, key: key },\r\n React.createElement(\"div\", { className: classes.placeholder })))))));\r\n};\r\nexport const LoadedCardGrid = (_a) => {\r\n var { basePath, children, data, ids, resource, rowClick, spacing = 2 } = _a, rest = __rest(_a, [\"basePath\", \"children\", \"data\", \"ids\", \"resource\", \"rowClick\", \"spacing\"]);\r\n const classes = useStyles(rest);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(MuiGrid, { className: classes.gridList, container: true, spacing: spacing }, ids.map(id => (React.createElement(CardGridItem, { key: id, id: id, basePath: basePath, record: data[id], resource: resource, rowClick: rowClick }, children))))));\r\n};\r\nexport const CardGrid = (_a) => {\r\n var { loaded } = _a, props = __rest(_a, [\"loaded\"]);\r\n return loaded ? React.createElement(LoadedCardGrid, Object.assign({}, props)) : React.createElement(LoadingCardGrid, Object.assign({}, props));\r\n};\r\nexport const CardGridItem = (_a) => {\r\n var { basePath, children, id, record, resource, rowClick, xsSize = 12, smSize = 6, mdSize = 4, lgSize = 3, xlSize = 3 } = _a, props = __rest(_a, [\"basePath\", \"children\", \"id\", \"record\", \"resource\", \"rowClick\", \"xsSize\", \"smSize\", \"mdSize\", \"lgSize\", \"xlSize\"]);\r\n const history = useHistory();\r\n const handleClick = useCallback(async (event) => {\r\n if (!rowClick)\r\n return;\r\n event.persist();\r\n const effect = typeof rowClick === 'function'\r\n ? await rowClick(id, basePath, record)\r\n : rowClick;\r\n switch (effect) {\r\n case 'edit':\r\n history.push(linkToRecord(basePath, id));\r\n return;\r\n case 'show':\r\n history.push(linkToRecord(basePath, id, 'show'));\r\n return;\r\n default:\r\n if (effect)\r\n history.push(effect);\r\n return;\r\n }\r\n }, [basePath, history, id, record, rowClick]);\r\n return (React.createElement(MuiGrid, Object.assign({ item: true, onClick: handleClick, xs: xsSize, sm: smSize, md: mdSize, lg: lgSize, xl: xlSize }, props), cloneElement(children, {\r\n basePath,\r\n id,\r\n record,\r\n resource,\r\n })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n margin: '-2px',\r\n },\r\n gridList: {\r\n width: '100%',\r\n marginTop: 0,\r\n marginBottom: 0,\r\n marginLeft: -theme.spacing(),\r\n marginRight: -theme.spacing(),\r\n },\r\n placeholder: {\r\n backgroundColor: theme.palette.grey[300],\r\n height: '100%',\r\n },\r\n}), {\r\n name: 'Layer7CardGrid',\r\n});\r\nconst times = (nbChildren, fn) => Array.from({ length: nbChildren }, (_, key) => fn(key));\r\n//# sourceMappingURL=CardGrid.js.map","import React, { useMemo } from 'react';\r\nimport { Datagrid as RaDatagrid } from 'react-admin';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nexport const Datagrid = props => {\r\n const theme = useTheme();\r\n const classes = useStyles(props);\r\n // HACK: For some reason, the header cells loses their styles when dynamically\r\n // changing the theme. Passing a new key when changing the theme fixes that\r\n const key = useMemo(() => Math.random(), [theme]); // eslint-disable-line\r\n return React.createElement(RaDatagrid, Object.assign({ key: key, classes: classes }, props));\r\n};\r\nconst computeDatagridPadding = (theme, props) => props && props.size === 'small'\r\n ? `${theme.spacing(0.5)}px ${theme.spacing(3)}px`\r\n : `${theme.spacing(1)}px ${theme.spacing(3)}px`;\r\nconst useStyles = makeStyles(theme => ({\r\n headerCell: {\r\n backgroundColor: theme.palette.action.selected,\r\n fontWeight: theme.typography.fontWeightBold,\r\n textTransform: 'uppercase',\r\n },\r\n rowCell: {\r\n padding: props => computeDatagridPadding(theme, props),\r\n },\r\n}), {\r\n name: 'Layer7Datagrid',\r\n});\r\n//# sourceMappingURL=Datagrid.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport get from 'lodash/get';\r\nimport { TextField } from 'react-admin';\r\nimport { MarkdownView, removeTags } from '.';\r\nimport { TruncatedTextField } from '../';\r\nexport const MarkdownField = (_a) => {\r\n var { record, source, stripTags = false, truncate } = _a, rest = __rest(_a, [\"record\", \"source\", \"stripTags\", \"truncate\"]);\r\n const value = get(record, source, '');\r\n if (stripTags) {\r\n const newRecord = Object.assign(Object.assign({}, record), { [source]: removeTags(value) });\r\n return truncate ? (React.createElement(TruncatedTextField, Object.assign({ record: newRecord, source: source }, rest))) : (React.createElement(TextField, Object.assign({ record: newRecord, source: source }, rest)));\r\n }\r\n return React.createElement(MarkdownView, Object.assign({ value: value }, rest));\r\n};\r\n//# sourceMappingURL=MarkdownField.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Chip from '@material-ui/core/Chip';\r\nexport const AccessField = (_a) => {\r\n var { basePath, cellClassName, // Use by react admin, should not propagate\r\n headerClassName, // Use by react admin, should not propagate\r\n record, source, translationKey } = _a, props = __rest(_a, [\"basePath\", \"cellClassName\", \"headerClassName\", \"record\", \"source\", \"translationKey\"]);\r\n const value = get(record, source);\r\n const enabled = value === 'ENABLED';\r\n const color = enabled ? 'primary' : 'default';\r\n const classes = useStyles();\r\n const translate = useTranslate();\r\n return (React.createElement(Chip, Object.assign({ color: color, disabled: !enabled, className: classnames(classes.root, { [classes.enabled]: enabled }), label: value\r\n ? translate(`${translationKey}.${value.toLowerCase()}`)\r\n : '' }, props)));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: { borderRadius: theme.spacing(0.5) },\r\n enabled: {\r\n backgroundColor: theme.palette.success.main,\r\n },\r\n}), {\r\n name: 'Layer7AccessField',\r\n});\r\n//# sourceMappingURL=AccessField.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport ToggleButton from '@material-ui/lab/ToggleButton';\r\nimport ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport ViewListIcon from '@material-ui/icons/ViewList';\r\nimport ViewModuleIcon from '@material-ui/icons/ViewModule';\r\nimport { useTranslate } from 'ra-core';\r\nimport { useListDisplay, LIST_DISPLAY_CARDS, LIST_DISPLAY_DATAGRID, } from './ListDisplayContext';\r\nexport const ListDisplayButton = props => {\r\n const [display, setDisplay] = useListDisplay();\r\n const handleChange = (event, value) => {\r\n setDisplay(value);\r\n };\r\n return (React.createElement(ToggleButtonGroup, Object.assign({ exclusive: true, onChange: handleChange, value: display, size: \"small\" }, props),\r\n React.createElement(ToggleButtonWithTooltip, { label: \"apihub.actions.view_as_cards\", value: LIST_DISPLAY_CARDS },\r\n React.createElement(ViewModuleIcon, null)),\r\n React.createElement(ToggleButtonWithTooltip, { label: \"apihub.actions.view_as_list\", value: LIST_DISPLAY_DATAGRID },\r\n React.createElement(ViewListIcon, null))));\r\n};\r\nconst ToggleButtonWithTooltip = (_a) => {\r\n var { label, title = label } = _a, props = __rest(_a, [\"label\", \"title\"]);\r\n const translate = useTranslate();\r\n const translatedLabel = translate(label, { _: label });\r\n const translatedTitle = translate(title, { _: title });\r\n return (React.createElement(Tooltip, { title: translatedTitle },\r\n React.createElement(ToggleButton, Object.assign({ \"aria-label\": translatedLabel }, props))));\r\n};\r\n//# sourceMappingURL=ListDisplayButton.js.map","import React, { useState, Children, cloneElement, useEffect, forwardRef, } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\r\nimport SortIcon from '@material-ui/icons/Sort';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { changeListParams, useTranslate } from 'ra-core';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { stringify } from 'query-string';\r\n/**\r\n * A sort button to use on a list which does not display a datagrid.\r\n *\r\n * @param {String} resource The resource on which to apply the sort\r\n * @param {Object} currentSort The current sort\r\n * @param {Object} currentSort.field The currently sorted field (eg: \"name\")\r\n * @param {Object} currentSort.order The current sort order (eg: \"ASC\")\r\n *\r\n * @example Usage inside a custom toolbar for a
\r\n * import { TopToolbar } from 'react-admin';\r\n *\r\n * const ApiListActions = ({\r\n * currentSort, // injected by react-admin\r\n * resource, // injected by react-admin\r\n * ...props\r\n * }) => {\r\n * return (\r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n * );\r\n * };\r\n */\r\nexport const SortButton = ({ children, resource, currentSort }) => {\r\n const [currentSortLabel, setCurrentSortLabel] = useState();\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const translate = useTranslate();\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const classes = useStyles();\r\n const listParams = useSelector(reduxState => reduxState.admin.resources[resource]\r\n ? reduxState.admin.resources[resource].list.params\r\n : {}, shallowEqual);\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n const handleMenuItemClick = (event, sortData) => {\r\n history.push({\r\n search: `?${stringify(Object.assign(Object.assign({}, listParams), { filter: JSON.stringify(listParams.filter), sort: sortData.sort.field, order: sortData.sort.order }))}`,\r\n });\r\n dispatch(changeListParams(resource, Object.assign(Object.assign({}, listParams), { sort: sortData.sort.field, order: sortData.sort.order })));\r\n handleClose();\r\n };\r\n useEffect(() => {\r\n const childrenAsArray = Children.toArray(children);\r\n if (childrenAsArray.length === 0) {\r\n return;\r\n }\r\n let selectedChild = childrenAsArray.find(child => child.props.sort.field === currentSort.field &&\r\n child.props.sort.order === currentSort.order);\r\n if (!selectedChild) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn('The current sort parameters do not match the provided children');\r\n }\r\n selectedChild = childrenAsArray[0];\r\n }\r\n setCurrentSortLabel(translate(selectedChild.props.label));\r\n }, [children, currentSort, translate]);\r\n return currentSortLabel ? (React.createElement(React.Fragment, null,\r\n React.createElement(Button, { \"aria-controls\": \"sort-menu\", \"aria-label\": currentSortLabel, \"aria-haspopup\": \"true\", onClick: handleClick, startIcon: React.createElement(SortIcon, null), endIcon: React.createElement(ArrowDropDownIcon, null), className: classes.root, size: \"small\", color: \"primary\" }, currentSortLabel),\r\n React.createElement(Menu, { id: \"sort-menu\", anchorEl: anchorEl, keepMounted: true, open: Boolean(anchorEl), onClose: handleClose }, Children.map(children, child => cloneElement(child, Object.assign({ onClick: handleMenuItemClick }, child.props)))))) : null;\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n marginLeft: theme.spacing(),\r\n },\r\n}), {\r\n name: 'Layer7SortButton',\r\n});\r\nexport const SortMenuItem = forwardRef(({ label, sort, onClick }, ref) => {\r\n const translate = useTranslate();\r\n const handleClick = event => {\r\n onClick(event, { label, sort });\r\n };\r\n return (React.createElement(MenuItem, { ref: ref, onClick: handleClick }, translate(label, { _: label })));\r\n});\r\n//# sourceMappingURL=SortButton.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { Show as RaShow } from 'react-admin';\r\nimport { ViewTitle } from './ViewTitle';\r\nexport const Show = (_a) => {\r\n var { className } = _a, props = __rest(_a, [\"className\"]);\r\n return (React.createElement(\"div\", { className: className },\r\n React.createElement(ViewTitle, null),\r\n React.createElement(RaShow, Object.assign({}, props))));\r\n};\r\n//# sourceMappingURL=Show.js.map","import { DocumentList } from './DocumentList';\r\nimport { IconApps } from '../ui/icons';\r\nexport const documents = {\r\n icon: IconApps,\r\n list: DocumentList,\r\n};\r\nexport * from './DocumentList';\r\nexport * from './DocumentTitle';\r\nexport * from './Documentation';\r\nexport * from './useMarkdownContent';\r\n//# sourceMappingURL=index.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useEffect, useState, useRef } from 'react';\r\nimport classnames from 'classnames';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport { useMarkdownContent } from '../documentation';\r\nimport { ApplicationDetailsOverviewEditor } from './ApplicationDetailsOverviewEditor';\r\nimport { MarkdownView } from '../ui';\r\nexport const ApplicationDetailsOverviewField = (_a) => {\r\n var { id, record, canEdit } = _a, rest = __rest(_a, [\"id\", \"record\", \"canEdit\"]);\r\n const classes = useStyles(rest);\r\n const translate = useTranslate();\r\n const markdownElementRef = useRef();\r\n const [isEditingOverview, setIsEditingOverview] = useState(false);\r\n const [isOverviewScrollBottom, setIsOverviewScrollBottom] = useState(false);\r\n const [{ data, loading }, handleUpdate] = useMarkdownContent({\r\n entityType: 'application',\r\n entityUuid: record.id,\r\n navtitle: 'overview',\r\n });\r\n const handleOverviewScroll = event => {\r\n const { target } = event;\r\n setIsOverviewScrollBottom(!(target.scrollHeight - target.scrollTop <=\r\n target.clientHeight + 20));\r\n };\r\n useEffect(() => {\r\n if (!data || data.markdown == null || data.markdown === '') {\r\n setIsOverviewScrollBottom(false);\r\n return;\r\n }\r\n setTimeout(() => {\r\n setIsOverviewScrollBottom(markdownElementRef.current.scrollHeight >\r\n markdownElementRef.current.clientHeight + 20);\r\n }, 100);\r\n }, [data]);\r\n useEffect(() => {\r\n handleToggleViewing();\r\n }, [data]);\r\n const handleToggleEditing = () => {\r\n setIsEditingOverview(true);\r\n };\r\n const handleToggleViewing = () => {\r\n setIsEditingOverview(false);\r\n };\r\n if (loading) {\r\n return (React.createElement(Fade, { in: true, style: {\r\n transitionDelay: '300ms',\r\n }, unmountOnExit: true },\r\n React.createElement(LinearProgress, null)));\r\n }\r\n return (React.createElement(\"div\", { className: classes.overview },\r\n React.createElement(\"div\", { className: classes.overviewMarkdown },\r\n React.createElement(MarkdownView, { id: id, ref: markdownElementRef, className: classes.markdown, onScroll: handleOverviewScroll, value: data && data.markdown != null && data.markdown !== ''\r\n ? data.markdown\r\n : translate('resources.applications.notifications.empty_overview') }),\r\n React.createElement(\"div\", { className: classnames(classes.overviewScrollFadeColor, {\r\n [classes.overviewScrollFade]: isOverviewScrollBottom,\r\n [classes.hideOverviewScrollFade]: !isOverviewScrollBottom,\r\n }) })),\r\n canEdit ? (React.createElement(React.Fragment, null,\r\n React.createElement(IconButton, { color: \"primary\", title: translate('resources.applications.notifications.edit_overview'), className: classes.editButton, onClick: handleToggleEditing },\r\n React.createElement(EditIcon, { className: classes.icon })),\r\n React.createElement(ApplicationDetailsOverviewEditor, { initialValue: data ? data.markdown : null, onCancel: handleToggleViewing, onSave: handleUpdate, open: isEditingOverview }))) : null));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n overview: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n marginBottom: '-40px',\r\n width: '100%',\r\n },\r\n overviewMarkdown: {\r\n width: '100%',\r\n overflowWrap: 'anywhere',\r\n },\r\n markdown: {},\r\n editButton: {\r\n marginLeft: theme.spacing(),\r\n },\r\n overviewScrollFade: {\r\n position: 'relative',\r\n top: '-40px',\r\n height: '40px',\r\n width: `calc(100% - ${theme.spacing(2)})`,\r\n },\r\n hideOverviewScrollFade: {\r\n position: 'relative',\r\n top: '-40px',\r\n height: '40px',\r\n opacity: 0,\r\n transition: 'opacity 2s',\r\n },\r\n overviewScrollFadeColor: {\r\n pointerEvents: 'none',\r\n background: 'linear-gradient(to bottom, rgba(251, 251, 251, 0) 0%, rgba(251, 251, 251, 1) 100%)',\r\n },\r\n icon: {\r\n fontSize: '1rem',\r\n },\r\n}), {\r\n name: 'Layer7ApplicationOverviewField',\r\n});\r\n//# sourceMappingURL=ApplicationDetailsOverviewField.js.map","import React, { useState, useEffect, forwardRef } from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport SaveIcon from '@material-ui/icons/Save';\r\nimport { MarkdownEditor, markdownRenderer as defaultMarkdownRenderer, } from '../ui';\r\nexport const ApplicationDetailsOverviewEditor = ({ initialValue, markdownRenderer = defaultMarkdownRenderer, onCancel, onSave, open, }) => {\r\n const classes = useStyles();\r\n const [value, setValue] = useState(initialValue);\r\n const translate = useTranslate();\r\n useEffect(() => {\r\n // Be sure the value is updated when the initialValue changed\r\n setValue(initialValue);\r\n }, [initialValue]);\r\n const handleSave = () => {\r\n onSave(value);\r\n };\r\n const handleCancel = () => {\r\n setValue(initialValue);\r\n onCancel();\r\n };\r\n return (React.createElement(Dialog, { open: open, fullScreen: true, onClose: handleCancel, TransitionComponent: Transition },\r\n React.createElement(DialogTitle, null, translate('resources.applications.fields.overview')),\r\n React.createElement(DialogContent, null,\r\n React.createElement(MarkdownEditor, { className: classes.editor, value: value, onChange: setValue, markdownRenderer: markdownRenderer })),\r\n React.createElement(DialogActions, { className: classes.actions },\r\n React.createElement(Button, { color: \"primary\", variant: \"outlined\", onClick: handleCancel }, translate('resources.applications.actions.cancel')),\r\n React.createElement(Button, { color: \"primary\", variant: \"contained\", onClick: handleSave, startIcon: React.createElement(SaveIcon, null) }, translate('resources.applications.actions.save')))));\r\n};\r\nconst Transition = forwardRef(function Transition(props, ref) {\r\n return React.createElement(Slide, Object.assign({ direction: \"up\", ref: ref }, props));\r\n});\r\nconst useStyles = makeStyles(theme => ({\r\n editor: {\r\n height: `calc(100% - ${theme.spacing(2)}px)`,\r\n },\r\n actions: {\r\n margin: theme.spacing(2),\r\n },\r\n}), {\r\n name: 'Layer7ApplicationDetailsOverviewEditor',\r\n});\r\n//# sourceMappingURL=ApplicationDetailsOverviewEditor.js.map","import React from 'react';\r\nimport { Labeled } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport IconFileCopy from '@material-ui/icons/FileCopy';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport { useCopyToClipboard } from '../ui';\r\nexport const ApplicationKeyClient = props => {\r\n const { labelClasses, record, data, includeSecret, isEditMode } = props;\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n const copyToClipboard = useCopyToClipboard({\r\n successMessage: 'resources.applications.notifications.copy_success',\r\n errorMessage: 'resources.applications.notifications.copy_error',\r\n });\r\n if (!data || !data.apiKey) {\r\n return null;\r\n }\r\n return (React.createElement(Grid, null,\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // On , this will translate in a correct `for` attribute on the label\r\n , { \r\n // On , this will translate in a correct `for` attribute on the label\r\n id: \"apiKeyClientID\", label: React.createElement(\"span\", null,\r\n React.createElement(\"span\", null, translate('resources.applications.fields.apiKeyClientID')),\r\n isEditMode ? (React.createElement(Chip, { className: classes.chip, label: translate('resources.applications.fields.default') })) : null), classes: labelClasses, className: classes.field },\r\n React.createElement(Typography, { variant: \"body2\", className: classes.fieldContent },\r\n React.createElement(\"span\", { id: \"apiKeyClientID\" }, data.apiKey),\r\n React.createElement(IconButton, { className: classes.buttonCopy, color: \"primary\", title: translate('resources.applications.notifications.copy_to_clipboard'), value: data.apiKey, onClick: copyToClipboard },\r\n React.createElement(IconFileCopy, { className: classes.iconCopy }))))),\r\n includeSecret && (React.createElement(Grid, { item: true },\r\n React.createElement(Labeled\r\n // on Labeled, this will translate in a correct `for` attribute on the label\r\n , { \r\n // on Labeled, this will translate in a correct `for` attribute on the label\r\n id: \"sharedSecretClientSecret\", label: \"resources.applications.fields.sharedSecretClientSecret\", classes: labelClasses, className: classes.field },\r\n React.createElement(Typography, { variant: \"body2\", className: classes.fieldContent },\r\n React.createElement(\"span\", { id: \"sharedSecretClientSecret\" }, data.keySecret),\r\n data.keySecret &&\r\n !data.keySecret.includes('****') && (React.createElement(IconButton, { className: classes.buttonCopy, color: \"primary\", title: translate('resources.applications.notifications.copy_to_clipboard'), value: data.keySecret, onClick: copyToClipboard },\r\n React.createElement(IconFileCopy, { className: classes.iconCopy })))))))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n field: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n minWidth: '100px',\r\n },\r\n chip: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n fieldContent: {},\r\n buttonCopy: {},\r\n iconCopy: {\r\n fontSize: '1rem',\r\n color: theme.palette.secondary.main,\r\n },\r\n}), {\r\n name: 'Layer7ApplicationKeyClient',\r\n});\r\n//# sourceMappingURL=ApplicationKeyClient.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useGetOne, CRUD_GET_ONE } from 'react-admin';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { ENTITY_TYPE_CUSTOM } from '../dataProvider/documents';\r\nimport { CurrentUserId } from '../dataProvider/userContexts';\r\nimport { isPortalAdmin } from '../userContexts';\r\nimport { Documentation } from './Documentation';\r\nimport { DocumentTitle } from './DocumentTitle';\r\nimport { ViewTitle } from '../ui';\r\nexport const DocumentList = (_a) => {\r\n var { title = React.createElement(DocumentTitle, null) } = _a, props = __rest(_a, [\"title\"]);\r\n const classes = useStyles(props);\r\n const { data: userContexts } = useGetOne('userContexts', CurrentUserId, {\r\n action: CRUD_GET_ONE,\r\n });\r\n const isAdmin = isPortalAdmin(userContexts);\r\n const userCanDelete = isAdmin;\r\n const userCanEdit = isAdmin;\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(ViewTitle, null, title),\r\n React.createElement(Paper, { className: classes.root },\r\n React.createElement(Documentation, { entityType: ENTITY_TYPE_CUSTOM, entityUuid: \"wiki1\", userCanDelete: userCanDelete, userCanEdit: userCanEdit }))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n flexGrow: 1,\r\n },\r\n}), {\r\n name: 'Layer7DocumentList',\r\n});\r\n//# sourceMappingURL=DocumentList.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nexport const DocumentTitle = () => {\r\n const translate = useTranslate();\r\n return (React.createElement(\"span\", null, translate(`resources.documents.name`, {\r\n smart_count: 2,\r\n })));\r\n};\r\n//# sourceMappingURL=DocumentTitle.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport get from 'lodash/get';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport format from 'date-fns/format';\r\nexport const LastUpdateField = (_a) => {\r\n var { basePath, record, source, addPrefix } = _a, props = __rest(_a, [\"basePath\", \"record\", \"source\", \"addPrefix\"]);\r\n const value = get(record, source);\r\n const translate = useTranslate();\r\n if (!value) {\r\n return null;\r\n }\r\n const date = new Date(value);\r\n const formattedDate = format(date, 'P');\r\n let label = addPrefix\r\n ? translate('resources.apis.last_update.fields.updated', {\r\n date: formattedDate,\r\n })\r\n : formattedDate;\r\n return (React.createElement(Tooltip, { title: format(date, 'P') },\r\n React.createElement(Typography, Object.assign({ variant: \"body2\" }, props), label)));\r\n};\r\n//# sourceMappingURL=LastUpdateField.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { cloneElement } from 'react';\r\nimport { DateField, Filter, ReferenceArrayInput, sanitizeListRestProps, SelectArrayInput, SearchInput, SelectInput, TextField, TopToolbar, } from 'react-admin';\r\nimport { useTranslate } from 'ra-core';\r\nimport classnames from 'classnames';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport { AccessField, CardGrid, Datagrid, List, ListDisplayButton, ListDisplayProvider, LIST_DISPLAY_CARDS, LIST_DISPLAY_DATAGRID, MarkdownField, SortButton, SortMenuItem, TruncatedTextField, useListDisplay, } from '../ui';\r\nimport { ApiCard } from './ApiCard';\r\nimport { VisibilityField } from './VisibilityField';\r\nimport { TagsField } from './TagsField';\r\nimport { LastUpdateField } from './LastUpdateField';\r\nimport { readApiHubPreference } from '../preferences';\r\nexport const ApiList = props => {\r\n const initialListDisplay = readApiHubPreference(listDisplayPreferenceName, LIST_DISPLAY_DATAGRID);\r\n return (React.createElement(ListDisplayProvider, { initialListDisplay: initialListDisplay, preferenceName: listDisplayPreferenceName },\r\n React.createElement(List, Object.assign({ actions: React.createElement(ApiListActions, null), filters: React.createElement(ApiFilter, null), sort: defaultSort, bulkActionButtons: false, component: ApiListComponent }, props),\r\n React.createElement(ApiListDisplay, null))));\r\n};\r\nconst ApiFilter = props => {\r\n const translate = useTranslate();\r\n const classes = useApiFilterStyles();\r\n return (React.createElement(Filter, Object.assign({}, props),\r\n React.createElement(SearchInput, { source: \"q\", className: classes.searchInput, alwaysOn: true, placeholder: translate('resources.apis.list.filters.search') }),\r\n React.createElement(SelectInput, { source: \"accessStatus\", choices: [\r\n {\r\n id: 'public',\r\n name: 'resources.apis.accessStatus.public',\r\n },\r\n {\r\n id: 'private',\r\n name: 'resources.apis.accessStatus.private',\r\n },\r\n ] }),\r\n React.createElement(SelectInput, { source: \"portalStatus\", choices: [\r\n {\r\n id: 'Enabled',\r\n name: 'resources.apis.portalStatus.enabled',\r\n },\r\n {\r\n id: 'Disabled',\r\n name: 'resources.apis.portalStatus.disabled',\r\n },\r\n {\r\n id: 'Deprecated',\r\n name: 'resources.apis.portalStatus.deprecated',\r\n },\r\n {\r\n id: 'New',\r\n name: 'resources.apis.portalStatus.unpublished',\r\n },\r\n {\r\n id: 'Incomplete',\r\n name: 'resources.apis.portalStatus.incomplete',\r\n },\r\n ] }),\r\n React.createElement(SelectInput\r\n // The field is ssgServiceType in the response payload but apiServiceType in filters\r\n , { \r\n // The field is ssgServiceType in the response payload but apiServiceType in filters\r\n source: \"apiServiceType\", choices: [\r\n {\r\n id: 'SOAP',\r\n name: 'SOAP',\r\n },\r\n {\r\n id: 'REST',\r\n name: 'REST',\r\n },\r\n ] }),\r\n React.createElement(ReferenceArrayInput, { source: \"tags\", reference: \"tags\" },\r\n React.createElement(SelectArrayInput, { optionText: \"name\" }))));\r\n};\r\nconst ApiListDisplay = props => {\r\n const [display] = useListDisplay();\r\n if (display === LIST_DISPLAY_CARDS) {\r\n return (React.createElement(CardGrid, Object.assign({}, props),\r\n React.createElement(ApiCard, null)));\r\n }\r\n return (React.createElement(Card, null,\r\n React.createElement(Datagrid, Object.assign({ rowClick: \"show\" }, props),\r\n React.createElement(TruncatedTextField, { source: \"name\" }),\r\n React.createElement(MarkdownField, { source: \"description\", stripTags: true, truncate: true }),\r\n React.createElement(TagsField, { source: \"tags\", sortable: false }),\r\n React.createElement(DateField, { source: \"createTs\" }),\r\n React.createElement(TruncatedTextField, { source: \"version\", label: \"resources.apis.fields.versionShort\" }),\r\n React.createElement(TextField, { source: \"ssgServiceType\" }),\r\n React.createElement(VisibilityField, { source: \"accessStatus\" }),\r\n React.createElement(LastUpdateField, { source: \"modifyTs\" }),\r\n React.createElement(AccessField, { source: \"portalStatus\", translationKey: \"resources.apis.portalStatus\" }))));\r\n};\r\nconst ApiListActions = (_a) => {\r\n var { className, currentSort, displayedFilters, exporter, filters, filterValues, permanentFilter, resource, showFilter } = _a, props = __rest(_a, [\"className\", \"currentSort\", \"displayedFilters\", \"exporter\", \"filters\", \"filterValues\", \"permanentFilter\", \"resource\", \"showFilter\"]);\r\n const classes = useApiListActionsStyles();\r\n const [display] = useListDisplay();\r\n return (React.createElement(TopToolbar, Object.assign({ className: classnames(classes.root, className) }, sanitizeListRestProps(props)),\r\n filters &&\r\n cloneElement(filters, {\r\n resource,\r\n showFilter,\r\n displayedFilters,\r\n filterValues,\r\n context: 'button',\r\n }),\r\n display === LIST_DISPLAY_CARDS ? (React.createElement(ApiListSortButton, { resource: resource, currentSort: currentSort })) : null,\r\n React.createElement(ListDisplayButton, { className: classes.button })));\r\n};\r\nexport const ApiListSortButton = props => (React.createElement(SortButton, Object.assign({}, props),\r\n React.createElement(SortMenuItem, { label: \"resources.apis.list.sort.name.asc\", sort: SortByNameASC }),\r\n React.createElement(SortMenuItem, { label: \"resources.apis.list.sort.name.desc\", sort: SortByNameDESC }),\r\n React.createElement(SortMenuItem, { label: \"resources.apis.list.sort.createTs.desc\", sort: SortByCreateTsDESC }),\r\n React.createElement(SortMenuItem, { label: \"resources.apis.list.sort.createTs.asc\", sort: SortByCreateTsASC }),\r\n React.createElement(SortMenuItem, { label: \"resources.apis.list.sort.modifyTs.desc\", sort: SortByModifyTsDESC }),\r\n React.createElement(SortMenuItem, { label: \"resources.apis.list.sort.modifyTs.asc\", sort: SortByModifyTsASC })));\r\nconst defaultSort = { field: 'createTs', order: 'DESC' };\r\nconst listDisplayPreferenceName = 'listDisplay/apis';\r\nconst ApiListComponent = props => React.createElement(\"div\", Object.assign({}, props));\r\nconst SortByNameASC = { field: 'name', order: 'ASC' };\r\nconst SortByNameDESC = { field: 'name', order: 'DESC' };\r\nconst SortByCreateTsASC = { field: 'createTs', order: 'ASC' };\r\nconst SortByCreateTsDESC = { field: 'createTs', order: 'DESC' };\r\nconst SortByModifyTsASC = { field: 'modifyTs', order: 'ASC' };\r\nconst SortByModifyTsDESC = { field: 'modifyTs', order: 'DESC' };\r\nconst useApiFilterStyles = makeStyles({\r\n searchInput: {\r\n minWidth: '300px',\r\n },\r\n});\r\nconst useApiListActionsStyles = makeStyles(theme => ({\r\n root: {\r\n alignItems: 'center',\r\n },\r\n button: {\r\n marginLeft: theme.spacing(),\r\n },\r\n}), { name: 'Layer7ApiListActions' });\r\n//# sourceMappingURL=ApiList.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { cloneElement } from 'react';\r\nimport classNames from 'classnames';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Typography from '@material-ui/core/Typography';\r\nexport const Stats = (_a) => {\r\n var { children, icon, title } = _a, rest = __rest(_a, [\"children\", \"icon\", \"title\"]);\r\n const classes = useStyles(rest);\r\n return (React.createElement(Tooltip, { title: title },\r\n React.createElement(Grid, { container: true, alignItems: \"center\", className: classes.root },\r\n cloneElement(icon, {\r\n className: classNames(classes.icon, icon.className),\r\n }),\r\n children)));\r\n};\r\nexport const StatsText = (_a) => {\r\n var { children } = _a, rest = __rest(_a, [\"children\"]);\r\n const classes = useStyles(rest);\r\n return (React.createElement(Typography, { variant: \"caption\", color: \"textSecondary\", className: classes.text }, children));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n marginRight: theme.spacing(2),\r\n width: 'auto',\r\n },\r\n icon: {\r\n marginRight: theme.spacing(),\r\n },\r\n text: {},\r\n}), {\r\n name: 'Layer7Stats',\r\n});\r\n//# sourceMappingURL=Stats.js.map","import React from 'react';\r\nimport { useTranslate, linkToRecord } from 'ra-core';\r\nimport { Link } from 'react-router-dom';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardActions from '@material-ui/core/CardActions';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AppsIcon from '@material-ui/icons/Apps';\r\nimport TimeIcon from '@material-ui/icons/AccessTime';\r\nimport EventIcon from '@material-ui/icons/Event';\r\nimport format from 'date-fns/format';\r\nimport { MarkdownView, Stats, StatsText } from '../ui';\r\nimport { TagsField } from './TagsField';\r\nimport { ApiStatus } from './ApiStatus';\r\nexport const ApiCard = ({ basePath, record }) => {\r\n const classes = useStyles();\r\n const translate = useTranslate();\r\n const formattedDate = record && record.modifyTs ? format(record.modifyTs, 'P') : '';\r\n return (React.createElement(Card, { className: classes.root, component: Link, to: linkToRecord(basePath, record && record.id, 'show') },\r\n React.createElement(CardHeader, { className: classes.header, title: React.createElement(Tooltip, { title: record.name },\r\n React.createElement(Typography, { variant: \"h5\", component: \"span\", display: \"block\", className: classes.title, noWrap: true }, record.name)), disableTypography: true, subheader: React.createElement(React.Fragment, null,\r\n React.createElement(\"div\", { className: classes.subheader },\r\n React.createElement(ApiStatus, { record: record, variant: \"caption\" }),\r\n React.createElement(Divider, { orientation: \"vertical\", className: classes.divider }),\r\n React.createElement(Typography, { variant: \"caption\", color: \"textSecondary\", className: classes.ssgServiceType }, record.ssgServiceType),\r\n React.createElement(Divider, { orientation: \"vertical\", className: classes.divider }),\r\n React.createElement(Tooltip, { title: record.version },\r\n React.createElement(Typography, { variant: \"caption\", color: \"textSecondary\", noWrap: true }, translate('resources.apis.list.cards.fields.version', {\r\n version: record.version,\r\n }))))) }),\r\n React.createElement(CardContent, { className: classes.content },\r\n React.createElement(Tooltip, { title: record.description || '' },\r\n React.createElement(MarkdownView, { className: classes.description, value: record.description }))),\r\n React.createElement(CardActions, { className: classes.footer },\r\n React.createElement(Grid, { container: true, alignItems: \"center\", className: classes.tags },\r\n React.createElement(TagsField, { record: record, source: \"tags\", className: classes.tag })),\r\n React.createElement(Grid, { container: true, alignItems: \"center\", className: classes.stats },\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Stats, { icon: React.createElement(AppsIcon, null), title: translate('resources.apis.list.cards.fields.applications_long', {\r\n smart_count: record.applicationUsage || 0,\r\n }) },\r\n React.createElement(StatsText, null, translate('resources.apis.list.cards.fields.applications', {\r\n smart_count: record.applicationUsage || 0,\r\n })))),\r\n React.createElement(Grid, { item: true },\r\n React.createElement(Stats, { icon: React.createElement(TimeIcon, null), title: translate('resources.apis.list.cards.fields.averageLatency_long', {\r\n smart_count: record.averageLatency || 0,\r\n }) },\r\n React.createElement(StatsText, null, translate('resources.apis.list.cards.fields.averageLatency', {\r\n ms: record.averageLatency || 0,\r\n })))),\r\n formattedDate && (React.createElement(Grid, { item: true },\r\n React.createElement(Stats, { icon: React.createElement(EventIcon, null), title: translate('resources.apis.list.cards.fields.updated', {\r\n date: formattedDate,\r\n }) },\r\n React.createElement(StatsText, null, formattedDate))))))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n cursor: 'pointer',\r\n textDecoration: 'none',\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: 1,\r\n },\r\n header: {\r\n borderBottomColor: theme.palette.divider,\r\n borderBottomWidth: 1,\r\n borderBottomStyle: 'solid',\r\n },\r\n title: {\r\n fontFamily: theme.typography.subtitle2.fontFamily,\r\n fontSize: theme.typography.subtitle2.fontSize,\r\n fontWeight: theme.typography.fontWeightBold,\r\n wordBreak: 'break-word',\r\n maxWidth: '100%',\r\n },\r\n subheader: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n fontFamily: theme.typography.body2.fontFamily,\r\n fontSize: theme.typography.caption.fontSize,\r\n padding: theme.spacing(1, 0),\r\n },\r\n footer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: 0,\r\n },\r\n description: {\r\n flex: 1,\r\n overflow: 'hidden',\r\n // NOTE: We use some deprecated CSS props here but they are still well supported.\r\n // Besides, a new draft specification exists https://www.w3.org/TR/css-overflow-3/#propdef--webkit-line-clamp\r\n lineClamp: 3,\r\n boxOrient: 'vertical',\r\n display: '-webkit-box',\r\n },\r\n ssgServiceType: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n divider: {\r\n marginLeft: theme.spacing(),\r\n marginRight: theme.spacing(),\r\n minHeight: theme.spacing(2),\r\n },\r\n contentDivider: {\r\n width: '100%',\r\n marginBottom: theme.spacing(),\r\n marginTop: 0,\r\n },\r\n stats: {\r\n marginTop: 'auto',\r\n },\r\n tags: {\r\n borderTopStyle: 'solid',\r\n borderTopWidth: '1px',\r\n borderTopColor: theme.palette.grey[400],\r\n minHeight: theme.spacing(4),\r\n marginBottom: theme.spacing(1),\r\n },\r\n tag: {\r\n borderRadius: theme.spacing(0.5),\r\n fontWeight: theme.typography.fontWeightBold,\r\n '& + &': {\r\n marginLeft: theme.spacing(0.5),\r\n },\r\n },\r\n}), {\r\n name: 'Layer7ApiCard',\r\n});\r\n//# sourceMappingURL=ApiCard.js.map","const TokenUrlRegExp = /.*[#|%23]token\\/(.+)/;\r\nexport const extractTokenFromUrl = url => {\r\n const matches = TokenUrlRegExp.exec(url);\r\n if (matches && matches.length > 1) {\r\n return matches[1];\r\n }\r\n return null;\r\n};\r\n//# sourceMappingURL=extractTokenFromUrl.js.map","import { useEffect, useState } from 'react';\r\nimport JSEncrypt from 'jsencrypt';\r\nimport { useApiHub } from '../ApiHubContext';\r\nimport { getFetchJson } from '../fetchUtils';\r\nexport const defaultEncrypt = (publicKey, data) => {\r\n const encrypter = new JSEncrypt();\r\n encrypter.setPublicKey(publicKey);\r\n return Promise.resolve(encrypter.encrypt(data));\r\n};\r\n/**\r\n * A hook which will fetch the API public key and provide a function to encrypt data.\r\n * @param {*} encrypt The function to encrypt data.\r\n * It receives the public key as its first parameter and the dat to encrypt next.\r\n * It returns a promise resolving to the encrypted data.\r\n * @returns A tupple with the public key first and the encrypt function next.\r\n * @example\r\n *\r\n * const [publicKey, encrypt] = usePasswordEncryption();\r\n */\r\nexport const usePasswordEncryption = (encrypt = defaultEncrypt) => {\r\n const { urlWithTenant, originHubName } = useApiHub();\r\n const [publicKey, setPublicKey] = useState();\r\n useEffect(() => {\r\n fetchPublicKey(urlWithTenant, originHubName)\r\n .then(setPublicKey)\r\n .catch(console.error);\r\n }, [originHubName, urlWithTenant]);\r\n const encryptData = async (data) => {\r\n if (!publicKey) {\r\n return data;\r\n }\r\n const encryptedData = await encrypt(publicKey, data);\r\n return encryptedData;\r\n };\r\n return [publicKey, encryptData];\r\n};\r\nconst fetchPublicKey = async (apiBaseUrl, originHubName) => {\r\n const fetchJson = getFetchJson(originHubName);\r\n const { json: data } = await fetchJson(`${apiBaseUrl}/authenticate/getPublicKey`);\r\n return data.publicKey;\r\n};\r\n//# sourceMappingURL=usePasswordEncryption.js.map","import { composeValidators, maxLength, minLength, regex } from 'ra-core';\r\nimport forEach from 'lodash/forEach';\r\nexport const validatePassword = composeValidators([\r\n minLength(8),\r\n maxLength(60),\r\n regex(/[a-z]+/, 'apihub.validation.password.at_least_one_lowercase_character'),\r\n regex(/[A-Z]+/, 'apihub.validation.password.at_least_one_uppercase_character'),\r\n regex(/\\d+/, 'apihub.validation.password.at_least_one_number'),\r\n regex(/[!@#$%^&*-]+/, 'apihub.validation.password.at_least_one_special_character'),\r\n]);\r\nexport const getPwdTooltip = (regConfig, translate) => {\r\n if (!regConfig)\r\n return '';\r\n const rulesTypes = {\r\n MINIMUM_LENGTH: 'tooltip_password_min',\r\n MAXIMUM_LENGTH: 'tooltip_password_max',\r\n LOWERCASE: 'tooltip_password_lower',\r\n UPPERCASE: 'tooltip_password_upper',\r\n NUMBER: 'tooltip_password_number',\r\n };\r\n const messages = [];\r\n messages.push(translate('resources.userProfiles.validation.tooltip_password_title'));\r\n forEach(rulesTypes, (msgId, type) => {\r\n const configObj = regConfig[type];\r\n if (configObj && configObj.enabled) {\r\n messages.push(translate(`resources.userProfiles.validation.${msgId}`, {\r\n num: configObj.value,\r\n }));\r\n }\r\n });\r\n if (regConfig && regConfig['SYMBOL'] && regConfig['SYMBOL'].enabled) {\r\n messages.push(translate('resources.userProfiles.validation.tooltip_password_special', {\r\n num: regConfig['SYMBOL'].value,\r\n symbols: regConfig['SUPPORTED_SYMBOLS'].value,\r\n }));\r\n }\r\n return messages.join('\\n');\r\n};\r\n//# sourceMappingURL=validatePassword.js.map","import { getErrorMessage } from '../useLayer7Notify';\r\n// Fake id used because we can only access the current user context\r\nexport const CurrentUserId = 'layer7@currentUser';\r\nclass UserProfilesValidationError extends Error {\r\n constructor(message) {\r\n super(message);\r\n this.name = 'UserProfilesValidationError';\r\n this.status = 400;\r\n }\r\n}\r\nexport const userProfilesDataProvider = context => {\r\n const userProfileBasePath = `${context.apiUrl}/userProfile`;\r\n const pwdPolicyPath = `${context.apiUrl}/public/auth/schemes/passwordpolicy`;\r\n return {\r\n getOne: async () => {\r\n const { json: data } = await context.fetchJson(userProfileBasePath, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: Object.assign(Object.assign({}, data), { id: CurrentUserId }),\r\n };\r\n },\r\n update: async ({ id, data }) => {\r\n // The update method should only be used to update the user details\r\n const { firstName, lastName, email, userName, uuid, publicKey, password, newPassword, } = data;\r\n try {\r\n const options = {\r\n credentials: 'include',\r\n method: 'PUT',\r\n body: JSON.stringify({\r\n password,\r\n newPassword,\r\n firstName,\r\n lastName,\r\n email,\r\n userName,\r\n uuid,\r\n }),\r\n };\r\n if (publicKey) {\r\n options.headers = new Headers({\r\n Accept: 'application/json',\r\n });\r\n options.headers.set('Public-Key', publicKey);\r\n }\r\n await context.fetchJson(userProfileBasePath, options);\r\n }\r\n catch (error) {\r\n const message = getErrorMessage(error);\r\n throw new UserProfilesValidationError(message);\r\n }\r\n return {\r\n data: Object.assign({ id }, data),\r\n };\r\n },\r\n getPasswordPolicy: async () => {\r\n const { json: { authScheme: { passwordPolicies }, }, } = await context.fetchJson(pwdPolicyPath, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: passwordPolicies,\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=userProfiles.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport get from 'lodash/get';\r\nimport Typography from '@material-ui/core/Typography';\r\nexport const VisibilityField = (_a) => {\r\n var { basePath, record, source } = _a, props = __rest(_a, [\"basePath\", \"record\", \"source\"]);\r\n const value = get(record, source);\r\n const translate = useTranslate();\r\n return (React.createElement(Typography, Object.assign({ variant: \"body2\" }, props), translate(`resources.apis.accessStatus.${value.toLowerCase()}`)));\r\n};\r\n//# sourceMappingURL=VisibilityField.js.map","import React, { createContext, useContext } from 'react';\r\nimport { useApiHubPreference } from '../../preferences';\r\nexport const ListDisplayContext = createContext();\r\nexport const LIST_DISPLAY_CARDS = 'cards';\r\nexport const LIST_DISPLAY_DATAGRID = 'datagrid';\r\nexport const ListDisplayProvider = ({ children, preferenceName = 'listDisplay', initialListDisplay = LIST_DISPLAY_CARDS, }) => {\r\n const value = useApiHubPreference(preferenceName, initialListDisplay);\r\n return (React.createElement(ListDisplayContext.Provider, { value: value }, children));\r\n};\r\nexport const useListDisplay = () => {\r\n const context = useContext(ListDisplayContext);\r\n if (context === undefined) {\r\n throw new Error('useListDisplay must be used within a ListDisplayProvider');\r\n }\r\n return context;\r\n};\r\n//# sourceMappingURL=ListDisplayContext.js.map","import { useLocalStorage } from '@rehooks/local-storage';\r\nconst DEFAULT_STORAGE_KEY = '@layer7/preferences';\r\nexport const getPreferenceKey = preferenceName => `${DEFAULT_STORAGE_KEY}/${preferenceName}`;\r\n/**\r\n * An hook to get, write or delete a preference.\r\n * The preferences will be synchronized between all the browser tabs\r\n * that share same localstorage.\r\n *\r\n * @param {string} preferenceName The preference name\r\n * @param {*} defaultPreference the default preference (is case there isn't)\r\n *\r\n * @example Simple usage\r\n *\r\n * const MyComponent = () => {\r\n * const [customPreference, writeCustomPreference] = useApiHubPreference(\r\n * 'custom',\r\n * 'default value'\r\n * );\r\n *\r\n * console.log(customPreference); // 1st render: shows \"default value\", 2nd render: shows 'hello'\r\n *\r\n * const handleClick = () => {\r\n * writeCustomPreference('hello'); // Triggers an update of the useApiHubPreference hook\r\n * };\r\n *\r\n * return ;\r\n * };\r\n *\r\n */\r\nexport const useApiHubPreference = (preferenceName, defaultPreference) => {\r\n return useLocalStorage(getPreferenceKey(preferenceName), defaultPreference);\r\n};\r\n/**\r\n * A method to get a preference from the localstorage. Be careful, it's not a hook.\r\n * The preference will NOT be synchronized every time the preference is updated in the localstorage.\r\n *\r\n * Use it only to get an initial preference.\r\n *\r\n * @param {string} preferenceName The preference name\r\n * @param {*} defaultPreference the default preference (is case there isn't)\r\n *\r\n */\r\nexport const readApiHubPreference = (preferenceName, defaultPreference) => {\r\n return (localStorage.getItem(getPreferenceKey(preferenceName)) ||\r\n defaultPreference);\r\n};\r\n/**\r\n * A method to write a preference in the localstorage. Be careful, it's not a hook.\r\n * The new preference will NOT be synchronized.\r\n *\r\n * Use it only to set an initial preference.\r\n *\r\n * @param {string} preferenceName The preference name\r\n * @param {*} newPreference the new preference to save\r\n *\r\n */\r\nexport const writeApiHubPreference = (preferenceName, newPreference) => {\r\n localStorage.setItem(getPreferenceKey(preferenceName), newPreference);\r\n};\r\n/**\r\n * A method to delete a preference from the localstorage.\r\n *\r\n * @param {string} preferenceName The preference name\r\n *\r\n */\r\nexport const deleteApiHubPreference = preferenceName => {\r\n localStorage.removeItem(getPreferenceKey(preferenceName));\r\n};\r\n//# sourceMappingURL=useApiHubPreferences.js.map","import defaultMuiTheme from '@material-ui/core/styles/defaultTheme';\nimport { theme as defaultTheme } from 'layer7-apihub';\nimport merge from 'lodash/merge';\nimport createMuiTheme from '@material-ui/core/styles/createMuiTheme';\nimport createPalette from '@material-ui/core/styles/createPalette';\n\nconst palette = createPalette(\n merge({}, defaultTheme.palette, {\n secondary: {\n //csob colors\n main: '#fff',\n light: '#ae418e',\n dark: '#fa7ed6',\n lightBlue: '#0a7caf',\n lightGrayBlue: '#F1F1F1',\n darkBlue: '#111447',\n lightGray: '#eff1f3',\n darkWhite: '#F4F4F5',\n darkGray: '#333333',\n bgLightBlue: '#e4f3fc',\n bgDarkBlue: '#d8ebf9',\n },\n primary: {\n main: '#10054d',\n light: '#0b0335',\n dark: '#3f3770',\n },\n background: {\n default: '#e7e6ed',\n darker: '#dbdae4',\n },\n type: 'light',\n })\n);\n\nexport const theme = createMuiTheme(\n merge({}, defaultTheme, {\n typography: {\n fontFamily: 'Roboto Condensed',\n h1: {\n fontWeight: '900',\n textTransform: 'uppercase',\n fontFamily: 'Roboto Condensed',\n },\n h2: {\n fontWeight: '900',\n textTransform: 'uppercase',\n fontSize: '3rem',\n fontFamily: 'Roboto Condensed',\n },\n h3: {\n fontWeight: '700',\n fontSize: '2.75rem',\n fontFamily: 'Roboto Condensed',\n },\n h4: {\n fontWeight: '700',\n fontFamily: 'Roboto Condensed',\n },\n h5: {\n fontWeight: '500',\n fontFamily: 'Roboto Condensed',\n },\n h6: {\n fontWeight: '500',\n fontFamily: 'Roboto Condensed',\n },\n subtitle1: {\n color: palette.grey[700],\n fontFamily: 'Roboto Condensed',\n },\n subtitle2: {\n color: palette.grey[500],\n fontFamily: 'Roboto Condensed',\n },\n body1: {\n fontSize: '0.9rem',\n fontFamily: 'Roboto Condensed',\n color: palette.secondary.darkGray,\n },\n },\n palette,\n overrides: {\n // Material-UI\n\n MuiCssBaseline: {\n '@global': {\n '@font-face': 'Roboto Condensed',\n },\n },\n MuiAppBar: {\n root: {\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n background: `linear-gradient(127deg, #10054d, #33065b);`,\n },\n },\n MuiCard: {\n root: {\n borderRadius: 0,\n border: 'none',\n background: palette.common.white,\n '&:hover': {\n '& h4': {\n color: palette.secondary.darkBlue,\n },\n },\n },\n },\n MuiTabs: {\n flexContainer: {\n justifyContent: 'flex-end',\n color: palette.secondary.darkGray,\n },\n indicator: {\n backgroundColor: palette.secondary.lightBlue,\n },\n },\n MuiTab: {\n root: {\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n textTransform: 'uppercase',\n paddingBottom: defaultMuiTheme.spacing(4),\n paddingTop: defaultMuiTheme.spacing(4),\n '&$selected:': {\n color: palette.secondary.lightBlue,\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n },\n },\n },\n MuiButton: {\n root: {\n color: palette.secondary.lightBlue,\n paddingTop: defaultMuiTheme.spacing(1),\n paddingRight: defaultMuiTheme.spacing(4),\n paddingBottom: defaultMuiTheme.spacing(1),\n paddingLeft: defaultMuiTheme.spacing(4),\n borderRadius: defaultMuiTheme.spacing(4),\n textTransform: 'none',\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n '&:hover': {\n color: palette.secondary.darkBlue,\n },\n },\n sizeSmall: {\n paddingTop: defaultMuiTheme.spacing(0),\n paddingRight: defaultMuiTheme.spacing(2),\n paddingBottom: defaultMuiTheme.spacing(0),\n paddingLeft: defaultMuiTheme.spacing(2),\n borderRadius: defaultMuiTheme.spacing(2),\n },\n sizeLarge: {\n paddingTop: defaultMuiTheme.spacing(2),\n paddingRight: defaultMuiTheme.spacing(6),\n paddingBottom: defaultMuiTheme.spacing(2),\n paddingLeft: defaultMuiTheme.spacing(6),\n borderRadius: defaultMuiTheme.spacing(6),\n },\n contained: {\n boxShadow: 'none',\n textTransform: 'unset',\n },\n containedPrimary: {\n color: palette.common.white,\n backgroundColor: palette.primary.main,\n },\n containedSecondary: {\n color: palette.common.white,\n backgroundColor: palette.secondary.lightBlue,\n '&:hover': {\n color: palette.common.white,\n backgroundColor: palette.secondary.lightBlue,\n },\n },\n outlined: {\n textTransform: 'unset',\n },\n outlinedPrimary: {\n color: palette.secondary.lightBlue,\n borderColor: palette.secondary.lightBlue,\n },\n outlinedSecondary: {\n color: palette.common.white,\n borderColor: palette.common.white,\n },\n text: {},\n textPrimary: {\n color: palette.secondary.darkGray,\n },\n textSecondary: {\n color: palette.secondary.darkGray,\n },\n label: {},\n },\n MuiLink: {\n root: {\n color: palette.secondary.lightBlue,\n cursor: 'pointer',\n '&:hover': {\n color: palette.secondary.darkBlue,\n },\n },\n },\n MuiTreeView: {\n root: {\n padding: defaultMuiTheme.spacing(1),\n '& svg': {\n fill: palette.secondary.lightBlue,\n },\n },\n },\n MuiTablePagination: {\n root: {\n '& .previous-page': {\n color: palette.common.white,\n backgroundColor: palette.secondary.lightBlue,\n padding: defaultMuiTheme.spacing(1, 2, 1, 1),\n },\n '& .next-page': {\n color: palette.common.white,\n backgroundColor: palette.secondary.lightBlue,\n padding: defaultMuiTheme.spacing(1, 1, 1, 2),\n },\n },\n selectRoot: {\n borderStyle: 'solid',\n borderWidth: '2px',\n borderColor: palette.grey[300],\n borderRadius: defaultMuiTheme.shape.borderRadius,\n textTransform: 'uppercase',\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.primary.main,\n paddingLeft: defaultMuiTheme.spacing(2),\n paddingRight: defaultMuiTheme.spacing(2),\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n },\n toolbar: {\n marginTop: defaultMuiTheme.spacing(2),\n marginBottom: defaultMuiTheme.spacing(2),\n },\n spacer: {},\n caption: {},\n },\n MuiChip: {\n outlinedPrimary: {\n color: palette.secondary.darkBlue,\n },\n },\n // React-Admin\n\n RaSidebar: {\n drawerPaper: {\n backgroundColor: palette.common.white,\n color: palette.primary.main,\n height: `calc(100% - 0.5rem)`,\n boxShadow: `2px 0px 1px -1px rgba(0,0,0,0.2),\n 1px 0px 3px 0px rgba(0,0,0,0.1)`,\n },\n },\n RaMenuItemLink: {\n root: {\n color: palette.secondary.lightBlue,\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n '&:hover': {\n backgroundColor: palette.secondary.bgLightBlue,\n },\n },\n active: {\n borderLeftStyle: 'none',\n borderRightColor: palette.secondary.bgLightBlue,\n borderRightWidth: defaultMuiTheme.spacing(0.5),\n borderRightStyle: 'solid',\n backgroundColor: palette.secondary.bgLightBlue,\n color: palette.secondary.darkBlue,\n '& svg': {\n color: palette.secondary.darkBlue,\n },\n },\n icon: {\n color: palette.secondary.lightBlue,\n },\n },\n RaLayout: {\n contentWithSidebar: {\n marginTop: defaultMuiTheme.spacing(1),\n },\n content: {\n height: 'auto',\n backgroundColor: palette.secondary.bgLightBlue,\n paddingTop: defaultMuiTheme.spacing(0),\n paddingRight: defaultMuiTheme.spacing(0),\n paddingBottom: defaultMuiTheme.spacing(0),\n paddingLeft: defaultMuiTheme.spacing(0),\n display: 'flex',\n flexDirection: 'column',\n [defaultMuiTheme.breakpoints.up('xs')]: {\n paddingTop: defaultMuiTheme.spacing(0),\n paddingRight: defaultMuiTheme.spacing(0),\n paddingBottom: defaultMuiTheme.spacing(0),\n paddingLeft: defaultMuiTheme.spacing(0),\n },\n '& > div, & > h2': {\n paddingTop: defaultMuiTheme.spacing(4),\n paddingRight: defaultMuiTheme.spacing(3),\n paddingBottom: defaultMuiTheme.spacing(3),\n paddingLeft: defaultMuiTheme.spacing(3),\n [defaultMuiTheme.breakpoints.up('xs')]: {\n paddingLeft: defaultMuiTheme.spacing(6),\n },\n },\n },\n },\n RaTabbedShowLayout: {\n content: {\n borderRadius: defaultMuiTheme.shape.borderRadius,\n marginTop: defaultMuiTheme.spacing(4),\n backgroundColor: palette.common.white,\n boxShadow: defaultMuiTheme.shadows[3],\n paddingTop: 0,\n paddingBottom: 0,\n paddingLeft: 0,\n paddingRight: 0,\n },\n },\n RaShow: {\n main: {\n marginTop: defaultMuiTheme.spacing(2),\n },\n noActions: {\n marginTop: defaultMuiTheme.spacing(2),\n },\n },\n RaFilter: {\n form: {},\n button: {\n '& button': {\n borderStyle: 'solid',\n borderWidth: '2px',\n borderColor: palette.grey[300],\n borderRadius: defaultMuiTheme.shape.borderRadius,\n textTransform: 'uppercase',\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.secondary.darkBlue,\n paddingLeft: defaultMuiTheme.spacing(2),\n paddingRight: defaultMuiTheme.spacing(2),\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n },\n },\n },\n RaListToolbar: {\n toolbar: {\n paddingBottom: defaultMuiTheme.spacing(1),\n borderBottomStyle: 'solid',\n borderBottomWidth: '1px',\n borderBottomColor: palette.secondary.lightGray,\n marginBottom: defaultMuiTheme.spacing(2),\n },\n actions: {\n marginRight: '0px',\n },\n },\n\n // Layer7 ApiHub\n\n Layer7CardGrid: {\n root: {\n marginTop: '0px',\n marginRight: '0px',\n marginBottom: '0px',\n marginLeft: '0px',\n },\n },\n Layer7ViewTitle: {\n root: {\n marginTop: '0px',\n marginBottom: '0px',\n flexGrow: 0,\n flexShrink: 0,\n },\n title: {\n fontSize: '2rem',\n color: palette.secondary.darkGray,\n fontWeight: defaultMuiTheme.typography.fontWeightMedium,\n },\n },\n Layer7AccountSetupForm: {\n root: {}, // Don't override the root to have a great toolbar style\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n form: {\n '& >:first-child': {\n paddingTop: defaultMuiTheme.spacing(0),\n paddingBottom: defaultMuiTheme.spacing(0),\n },\n },\n },\n Layer7AccountSetupInvalidRequest: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7AccountSetupPreparingForm: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7AccountSetupSuccess: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7AccountSetupToolbar: {\n toolbar: {\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'center',\n padding: defaultMuiTheme.spacing(6, 4),\n flexBasis: 0,\n flexGrow: 0,\n },\n error: {\n padding: defaultMuiTheme.spacing(2, 4),\n },\n success: {\n padding: defaultMuiTheme.spacing(2, 4),\n },\n submit: {},\n },\n Layer7NewPasswordForm: {\n root: {}, // Don't override the root to have a great toolbar style\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n form: {\n '& >:first-child': {\n paddingTop: defaultMuiTheme.spacing(0),\n paddingBottom: defaultMuiTheme.spacing(0),\n },\n },\n },\n Layer7NewPasswordInvalidToken: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7NewPasswordSuccess: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7NewPasswordVerifyingToken: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7NewPasswordToolbar: {\n toolbar: {\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'center',\n flexBasis: 0,\n flexGrow: 0,\n },\n error: {\n padding: defaultMuiTheme.spacing(2, 4),\n },\n success: {\n padding: defaultMuiTheme.spacing(2, 4),\n },\n submit: {},\n },\n Layer7ResetPasswordForm: {\n root: {}, // Don't override the root to have a great toolbar style\n title: {\n color: palette.secondary.darkGray,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n '& >:first-child': {\n paddingTop: defaultMuiTheme.spacing(0),\n paddingBottom: defaultMuiTheme.spacing(0),\n flexGrow: 1,\n },\n },\n },\n Layer7ResetPasswordConfirm: {\n root: {},\n title: {\n color: palette.secondary.darkBlue,\n fontSize: '1.25rem',\n fontWeight: 500,\n textTransform: 'unset',\n marginBottom: defaultMuiTheme.spacing(4),\n },\n },\n Layer7ResetPasswordToolbar: {\n toolbar: {\n display: 'flex',\n flexGrow: 0,\n // justifyContent: 'center',\n flexBasis: 0,\n alignItems: 'start',\n marginTop: defaultMuiTheme.spacing(1),\n },\n error: {\n padding: defaultMuiTheme.spacing(2, 4),\n },\n success: {\n padding: defaultMuiTheme.spacing(2, 4),\n },\n },\n Layer7ApiShow: {\n root: {\n position: 'relative',\n '& #react-admin-title': {\n position: 'absolute',\n marginTop: 50,\n },\n },\n card: {\n backgroundColor: 'transparent',\n border: 'none',\n boxShadow: 'none',\n },\n },\n Layer7ApiOverview: {\n informations: {\n '&.MuiGrid-item': {\n backgroundColor: palette.secondary.bgDarkBlue,\n paddingTop: defaultMuiTheme.spacing(2),\n paddingBottom: defaultMuiTheme.spacing(2),\n paddingLeft: defaultMuiTheme.spacing(4),\n paddingRight: defaultMuiTheme.spacing(4),\n },\n '& label': {\n color: palette.secondary.darkBlue,\n fontSize: '1.3rem',\n },\n '& label ~ div': {\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.secondary.darkBlue,\n padding: defaultMuiTheme.spacing(0),\n },\n },\n applications: {\n '&.MuiGrid-item': {\n backgroundColor: palette.secondary.bgDarkBlue,\n paddingTop: defaultMuiTheme.spacing(2),\n paddingBottom: defaultMuiTheme.spacing(2),\n paddingLeft: defaultMuiTheme.spacing(4),\n paddingRight: defaultMuiTheme.spacing(4),\n },\n '& label': {\n color: palette.secondary.darkBlue,\n fontSize: '1.3rem',\n },\n '& label ~ div': {\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.secondary.darkBlue,\n padding: defaultMuiTheme.spacing(0),\n },\n },\n description: {\n '&.MuiGrid-item': {\n paddingTop: defaultMuiTheme.spacing(2),\n paddingBottom: defaultMuiTheme.spacing(2),\n paddingLeft: defaultMuiTheme.spacing(4),\n paddingRight: defaultMuiTheme.spacing(4),\n },\n '& label': {\n color: palette.secondary.darkBlue,\n fontWeight: 'normal',\n marginTop: defaultMuiTheme.spacing(2),\n marginBottom: defaultMuiTheme.spacing(1),\n },\n },\n assets: {\n '&.MuiGrid-item': {\n backgroundColor: palette.common.white,\n paddingTop: defaultMuiTheme.spacing(2),\n paddingBottom: defaultMuiTheme.spacing(2),\n paddingLeft: defaultMuiTheme.spacing(4),\n paddingRight: defaultMuiTheme.spacing(4),\n },\n '& label': {\n color: palette.secondary.darkBlue,\n fontWeight: 'normal',\n marginTop: defaultMuiTheme.spacing(2),\n marginBottom: defaultMuiTheme.spacing(1),\n },\n '& li': {\n '&::before': {\n content: \"'• '\",\n marginRight: defaultMuiTheme.spacing(1),\n fontSize: '1rem',\n color: palette.secondary.darkBlue,\n },\n },\n },\n },\n Layer7ApplicationOverviewField: {\n editButton: {\n top: '-35px', // Align the button with the field label\n },\n },\n Layer7ApplicationKeyClient: {\n field: {\n width: `calc(100% - ${defaultMuiTheme.spacing(2)}px)`,\n },\n fieldContent: {\n backgroundColor: palette.secondary.bgDarkBlue,\n padding: defaultMuiTheme.spacing(1, 1, 1, 2),\n borderRadius: defaultMuiTheme.shape.borderRadius,\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n },\n Layer7ApplicationKeySecret: {\n field: {\n width: `calc(100% - ${defaultMuiTheme.spacing(2)}px)`,\n },\n fieldContent: {\n backgroundColor: palette.secondary.bgDarkBlue,\n padding: defaultMuiTheme.spacing(1, 1, 1, 2),\n borderRadius: defaultMuiTheme.shape.borderRadius,\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n buttonGenerate: {},\n selectField: {\n color: palette.secondary.darkBlue,\n backgroundColor: 'transparent',\n border: `1px solid ${palette.secondary.darkBlue}`,\n padding: defaultMuiTheme.spacing(1, 2),\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n borderRadius: defaultMuiTheme.spacing(4),\n '&.MuiNativeSelect-select:focus, .MuiNativeSelect-select': {\n borderRadius: 'unset',\n },\n '&.MuiInput-underline:after, .MuiInput-underline:before': {\n borderBottom: 0,\n },\n '&.MuiInput-underline:before': {\n borderBottom: 0,\n },\n '&.MuiInput-underline:hover:not(.Mui-disabled):before': {\n borderBottom: 0,\n },\n '& .MuiNativeSelect-icon': {\n fill: palette.secondary.darkBlue,\n },\n },\n },\n Layer7HomePageButton: {\n root: {\n position: 'fixed',\n right: defaultMuiTheme.spacing(6),\n top: `calc(${defaultMuiTheme.spacing(\n 11\n )}px + ${defaultMuiTheme.spacing(6)}px)`,\n color: palette.secondary.darkBlue,\n },\n },\n Layer7DocumentList: {\n root: {\n marginTop: defaultMuiTheme.spacing(4),\n padding: defaultMuiTheme.spacing(0),\n },\n },\n Layer7Documentation: {\n root: {},\n treeContainer: {\n padding: 0,\n paddingRight: 0,\n marginTop: 0,\n marginBottom: 0,\n backgroundColor: palette.secondary.bgDarkBlue,\n },\n treeToolbar: {\n padding: defaultMuiTheme.spacing(1),\n backgroundColor: palette.secondary.bgDarkBlue,\n alignItems: 'flex-end',\n },\n localeButton: {\n borderStyle: 'solid',\n borderWidth: '2px',\n // borderColor: palette.secondary.lightBlue,\n textTransform: 'uppercase',\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.secondary.lightBlue,\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n alignItems: 'center',\n },\n addRootDocumentationButton: {\n marginBottom: defaultMuiTheme.spacing(1),\n },\n },\n Layer7ApiListActions: {\n root: {\n '& button': {\n borderStyle: 'solid',\n borderWidth: '2px',\n borderColor: palette.grey[300],\n textTransform: 'uppercase',\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.secondary.darkBlue,\n paddingLeft: defaultMuiTheme.spacing(2),\n paddingRight: defaultMuiTheme.spacing(2),\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n },\n },\n },\n Layer7ApiCard: {\n root: {\n borderRadius: defaultMuiTheme.shape.borderRadius,\n position: 'relative',\n '& svg': {\n fill: palette.secondary.lightBlue,\n },\n },\n header: {\n padding: 0,\n height: '140px',\n },\n title: {\n color: palette.secondary.darkBlue,\n backgroundColor: palette.secondary.bgDarkBlue,\n padding: defaultMuiTheme.spacing(4, 2),\n },\n subheader: {\n height: `calc(60px - ${defaultMuiTheme.spacing(5)}px)`, // height - paddingTop - paddingBottom\n padding: defaultMuiTheme.spacing(3, 2, 2, 2),\n '& span': {\n color: palette.secondary.darkBlue,\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n },\n },\n tags: {\n borderBottomStyle: 'solid',\n borderBottomWidth: '1px',\n borderBottomColor: palette.secondary.lightBlue,\n borderTopStyle: 'none',\n paddingTop: 0,\n paddingBottom: defaultMuiTheme.spacing(2),\n marginBottom: defaultMuiTheme.spacing(2),\n },\n stats: {\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n '& span': {\n color: palette.secondary.darkGray,\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n },\n },\n },\n Layer7ApiStatus: {\n status: {\n color: palette.secondary.darkBlue,\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n textTransform: 'uppercase',\n },\n },\n Layer7ApplicationCard: {\n root: {\n borderRadius: defaultMuiTheme.shape.borderRadius,\n position: 'relative',\n '& svg': {\n fill: palette.secondary.lightBlue,\n },\n },\n header: {\n padding: 0,\n height: '140px',\n },\n title: {\n color: palette.secondary.darkBlue,\n backgroundColor: palette.secondary.bgDarkBlue,\n padding: defaultMuiTheme.spacing(4, 2),\n },\n subheader: {\n height: `calc(60px - ${defaultMuiTheme.spacing(5)}px)`, // height - paddingTop - paddingBottom\n padding: defaultMuiTheme.spacing(3, 2, 2, 2),\n '& span': {\n color: palette.secondary.darkBlue,\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n },\n },\n },\n Layer7SortButton: {\n root: {\n borderStyle: 'solid',\n borderWidth: '2px',\n borderColor: palette.grey[300],\n borderRadius: defaultMuiTheme.shape.borderRadius,\n textTransform: 'uppercase',\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\n color: palette.secondary.darkBlue,\n paddingLeft: defaultMuiTheme.spacing(2),\n paddingRight: defaultMuiTheme.spacing(2),\n paddingTop: defaultMuiTheme.spacing(1),\n paddingBottom: defaultMuiTheme.spacing(1),\n },\n },\n Layer7ApiTags: {\n root: {\n '& .MuiTabs-flexContainer': {\n justifyContent: 'flex-start',\n },\n },\n },\n Layer7Datagrid: {\n headerCell: {\n backgroundColor: palette.secondary.bgDarkBlue,\n },\n },\n },\n props: {\n MuiFab: {\n color: 'secondary',\n },\n },\n })\n);\n","import { CRUD_CREATE, CRUD_GET_ONE, CRUD_UPDATE, useCreate, useGetOne, useLocale, useRefresh, useUpdate, } from 'ra-core';\r\nimport { useLayer7Notify } from '../useLayer7Notify';\r\nimport { documentationLocales } from '../i18n';\r\nimport { buildDocumentId } from '../dataProvider/documents';\r\n/**\r\n * This hook is responsible for fetching the markdown content used in such\r\n * places as the homepage and application details.\r\n * It returns the markdown directly.\r\n *\r\n * @param {object} options\r\n * @param {string} options.entityType The document type\r\n * @param {string} options.entityUuid The uuid of the content type to retrieve\r\n * @param {string} options.navtitle The navtitle of the document\r\n *\r\n * @example\r\n * import { useMarkdownContent, MarkdownView } from 'layer7-apihub';\r\n *\r\n * export const HomePageContent = () => {\r\n * const markdown = useMarkdownContent();\r\n * return ;\r\n * }\r\n */\r\nexport const useMarkdownContent = ({ entityType, entityUuid, navtitle }) => {\r\n const locale = useLocale();\r\n const notify = useLayer7Notify();\r\n const refresh = useRefresh();\r\n const id = buildDocumentId(entityType, entityUuid, navtitle, documentationLocales[locale]);\r\n const { data, loaded, loading } = useGetOne('documents', id, {\r\n action: CRUD_GET_ONE,\r\n });\r\n const [create] = useCreate('documents');\r\n const [update] = useUpdate('documents');\r\n const handleSave = markdown => {\r\n const options = {\r\n action: !!data ? CRUD_UPDATE : CRUD_CREATE,\r\n onSuccess: () => {\r\n notify('resources.documents.notifications.edit_success', 'info', undefined, !!data ? true : false);\r\n if (!data) {\r\n refresh();\r\n }\r\n },\r\n onFailure: error => {\r\n notify(error || 'resources.documents.notifications.edit_error', 'error');\r\n },\r\n undoable: !!data ? true : false,\r\n };\r\n if (!!data) {\r\n update({\r\n payload: {\r\n id,\r\n data: Object.assign(Object.assign({}, data), { markdown }),\r\n },\r\n }, options);\r\n return;\r\n }\r\n create({\r\n payload: {\r\n data: {\r\n id,\r\n locale: documentationLocales[locale],\r\n markdown,\r\n navtitle,\r\n ordinal: 0,\r\n status: 'PUBLISHED',\r\n title: navtitle,\r\n type: entityType,\r\n typeUuid: entityUuid,\r\n },\r\n },\r\n }, options);\r\n };\r\n return [{ data, loaded, loading }, handleSave];\r\n};\r\n//# sourceMappingURL=useMarkdownContent.js.map","import React from 'react';\nimport { ApiHubAdmin, userProfiles } from 'layer7-apihub';\nimport { Resource } from 'react-admin';\nimport { Helmet } from 'react-helmet';\nimport { Route } from 'react-router-dom';\nimport {\n LoginPage,\n ResetPasswordPage,\n NewPasswordPage,\n AccountSetupPage,\n SignUpPage,\n} from './authentication';\n\nimport { AuthenticatedLayout } from './layout';\nimport { LandingPage } from './LandingPage';\nimport { dataProvider } from './dataProvider';\nimport { apis } from './apis';\nimport { applications } from './applications';\nimport { documents } from './documentation';\n\nconst App = () => {\n const {\n PAGE_TITLE,\n APIHUB_URL,\n TENANT_NAME,\n ORIGIN_HUB_NAME,\n } = global.APIHUB_CONFIG;\n\n if (!ORIGIN_HUB_NAME) {\n throw new Error(\n 'Please provide a value for the ORIGIN_HUB_NAME parameter in your configuration file'\n );\n }\n\n return (\n <>\n \n {PAGE_TITLE}\n \n ,\n ,\n ,\n ]}\n dataProvider={dataProvider(\n APIHUB_URL,\n TENANT_NAME,\n ORIGIN_HUB_NAME\n )}\n >\n \n \n \n \n >\n );\n};\n\nexport default App;\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nexport const accountPlansDataProvider = context => {\r\n const basePath = `${context.apiUrl}/api-management/1.0/account-plans`;\r\n return {\r\n getList: async ({ filter = {}, pagination = { page: 1, perPage: 24 }, sort = null, }) => {\r\n const url = `${context.apiUrl}${basePath}?${stringify(Object.assign(Object.assign(Object.assign({}, filter), { page: pagination.page - 1, size: pagination.perPage }), (sort && { sort: `${sort.field},${sort.order}` })))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign({ id: uuid }, item));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n getOne: async ({ id }) => {\r\n const url = `${context.apiUrl}${basePath}/${id}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: Object.assign({ id }, json),\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=accountPlans.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nconst basePath = '/ApiEulas';\r\nexport const apiEulasDataProvider = context => {\r\n return {\r\n getOne: async ({ id }) => {\r\n const url = `${context.apiUrl}${basePath}('${id}')`;\r\n const data = __rest((await context.fetchJson(url, { credentials: 'include' })).json, []);\r\n return {\r\n data: Object.assign({ id }, data),\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=apiEulas.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nconst apiGroupsBasePath = '/api-management/internal/OrganizationApiGroups';\r\nconst eulaBasePath = '/api-management/internal/ApiGroups/';\r\nconst SearchFields = ['name', 'description'];\r\nexport const apiGroupsDataProvider = context => {\r\n return {\r\n getList: async ({ filter = {}, pagination = { page: 1, perPage: 24 }, }) => {\r\n const url = `${context.apiUrl}${apiGroupsBasePath}?${stringify(Object.assign(Object.assign({}, getFilter(filter)), { page: pagination.page - 1, size: pagination.perPage }))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign(Object.assign({}, item), { id: uuid }));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n getMany: async () => {\r\n return {\r\n data: [],\r\n };\r\n },\r\n getApiGroupEula: async ({ apiGroupId, filter = {} }) => {\r\n const url = `${context.apiUrl}${eulaBasePath}${apiGroupId}/Eulas?${stringify({\r\n filter: stringify(Object.assign({}, filter)),\r\n })}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.d.results[0],\r\n };\r\n },\r\n };\r\n};\r\nexport const getFilter = (_a, searchFields = SearchFields) => {\r\n var { q } = _a, filters = __rest(_a, [\"q\"]);\r\n let result = filters;\r\n if (!q) {\r\n return filters;\r\n }\r\n // The API does not support the `q` field for fulltext search.\r\n // Instead, we must add a filter for each searchable field supported by this resource\r\n if (!searchFields || searchFields.length === 0) {\r\n return result;\r\n }\r\n return searchFields.reduce((acc, field) => {\r\n acc[field] = q;\r\n return acc;\r\n }, Object.assign({}, filters));\r\n};\r\n//# sourceMappingURL=apiGroups.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nconst basePath = '/api-management/1.0/api-plans';\r\nconst internalBasePath = '/api-management/internal/api-plans';\r\nconst SearchFields = ['name', 'description'];\r\nexport const apiPlansDataProvider = context => {\r\n return {\r\n async getList({ filter, pagination, sort }) {\r\n const url = `${context.apiUrl}${basePath}?${stringify(Object.assign(Object.assign({}, getFilter(filter)), { page: pagination.page - 1, size: pagination.perPage, sort: `${sort.field},${sort.order}` }))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign(Object.assign({}, item), { id: uuid }));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n async getMany({ ids }) {\r\n const apiPlans = await Promise.all(ids.map(id => this.getOne({ id })));\r\n return {\r\n data: apiPlans.reduce((acc, getOneResult) => {\r\n acc.push(getOneResult.data);\r\n return acc;\r\n }, []),\r\n };\r\n },\r\n async getOne({ id }) {\r\n const url = `${context.apiUrl}${basePath}/${id}`;\r\n const _a = (await context.fetchJson(url, { credentials: 'include' })).json, { uuid } = _a, data = __rest(_a, [\"uuid\"]);\r\n return {\r\n data: Object.assign(Object.assign({}, data), { id: uuid }),\r\n };\r\n },\r\n async getApisByApiPlan({ apiPlanId }) {\r\n // Filter by API Plan\r\n const { json: apiPlanApisIds } = await context.fetchJson(`${context.apiUrl}${basePath}/${apiPlanId}/apis`, {\r\n credentials: 'include',\r\n });\r\n const apis = await Promise.all(apiPlanApisIds.map(({ uuid }) => {\r\n // Get APIs One By One\r\n return context\r\n .fetchJson(`${context.apiUrl}/api-management/1.0/apis/${uuid}`, {\r\n credentials: 'include',\r\n })\r\n .then(({ data }) => data);\r\n }));\r\n return {\r\n data: apis,\r\n total: apis.length,\r\n };\r\n },\r\n async getApiPlansByApi({ orgUuid, apiId }) {\r\n const params = { apiUuid: apiId };\r\n if (orgUuid) {\r\n params.orgUuid = orgUuid;\r\n }\r\n const url = `${context.apiUrl}${internalBasePath}?${stringify(params)}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include'\r\n });\r\n return {\r\n data: json,\r\n total: json.length,\r\n };\r\n },\r\n async getApiPlansFeatureFlag() {\r\n const url = `${context.apiUrl}/Settings('FEATURE_FLAG_API_PLANS')`;\r\n const data = __rest((await context.fetchJson(url, {\r\n credentials: 'include',\r\n })).json, []);\r\n return { data: { value: data.Value } };\r\n },\r\n };\r\n};\r\nexport const getFilter = (_a, searchFields = SearchFields) => {\r\n var { q } = _a, filters = __rest(_a, [\"q\"]);\r\n let result = filters;\r\n if (!q) {\r\n return filters;\r\n }\r\n // The API does not support the `q` field for fulltext search.\r\n // Instead, we must add a filter for each searchable field supported by this resource\r\n if (!searchFields || searchFields.length === 0) {\r\n return result;\r\n }\r\n return searchFields.reduce((acc, field) => {\r\n acc[field] = q;\r\n return acc;\r\n }, Object.assign({}, filters));\r\n};\r\n//# sourceMappingURL=apiPlans.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nconst basePath = '/api-management/1.0/apis';\r\nconst internalBasePath = '/api-management/internal';\r\nconst apisPath = '/2.0/Apis';\r\nconst SearchFields = ['name', 'description'];\r\nexport const apisDataProvider = context => {\r\n return {\r\n async getList({ filter, pagination, sort }) {\r\n const sortField = sort.field == 'id' ? 'uuid' : sort.field;\r\n const url = `${context.apiUrl}${basePath}?${stringify(Object.assign(Object.assign({}, getFilter(filter)), { page: pagination.page - 1, size: pagination.perPage, sort: `${sortField},${sort.order}` }))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign(Object.assign({}, item), { id: uuid }));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n async getMany({ ids }) {\r\n const apis = await Promise.all(ids.map(id => this.getOne({ id })));\r\n return {\r\n data: apis.reduce((acc, getOneResult) => {\r\n acc.push(getOneResult.data);\r\n return acc;\r\n }, []),\r\n };\r\n },\r\n async getOne({ id }) {\r\n const url = `${context.apiUrl}${basePath}/${id}`;\r\n const _a = (await context.fetchJson(url, { credentials: 'include' })).json, { uuid } = _a, data = __rest(_a, [\"uuid\"]);\r\n return {\r\n data: Object.assign(Object.assign({}, data), { id: uuid }),\r\n };\r\n },\r\n async getPermissions({ id }) {\r\n const url = `${context.apiUrl}${internalBasePath}/permissions/apis/${id}/permitted`;\r\n const { json: data } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: Object.assign(Object.assign({}, data), { id }),\r\n };\r\n },\r\n async getApis() {\r\n const url = `${context.apiUrl}${apisPath}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n // Capitalized keys are not used in the new api format.\r\n // To avoid future breaking changes,\r\n // we transform the capitalized key.\r\n return {\r\n data: json.map(item => (Object.assign({ id: item.Uuid, name: item.Name, description: item.Description, version: item.Version, portalStatus: item.PortalStatus }, item))) || [],\r\n total: json.length || 0,\r\n };\r\n },\r\n async getApisByApiGroup({ apiGroupId }) {\r\n // Filter by API Group\r\n const { json: apiGroupApisIds } = await context.fetchJson(`${context.apiUrl}/api-management/1.0/api-groups/${apiGroupId}/apis`, {\r\n credentials: 'include',\r\n });\r\n const apis = await Promise.all(apiGroupApisIds.map(({ uuid }) => {\r\n // Get APIs One By One\r\n return context\r\n .fetchJson(`${context.apiUrl}${basePath}/${uuid}`, {\r\n credentials: 'include',\r\n })\r\n .then(({ data }) => data);\r\n }));\r\n return {\r\n data: apis,\r\n total: apis.length,\r\n };\r\n },\r\n };\r\n};\r\nexport const getFilter = (_a, searchFields = SearchFields) => {\r\n var { q } = _a, filters = __rest(_a, [\"q\"]);\r\n let result = filters;\r\n if (!q) {\r\n return filters;\r\n }\r\n // The API does not support the `q` field for fulltext search.\r\n // Instead, we must add a filter for each searchable field supported by this resource\r\n if (!searchFields || searchFields.length === 0) {\r\n return result;\r\n }\r\n return searchFields.reduce((acc, field) => {\r\n acc[field] = q;\r\n return acc;\r\n }, Object.assign({}, filters));\r\n};\r\n//# sourceMappingURL=apis.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nexport const apiKeysDataProvider = context => {\r\n return {\r\n getList: async ({ applicationUuid, filter = {}, pagination = { page: 1, perPage: 24 }, sort = null, }) => {\r\n const basePath = `${context.apiUrl}/api-management/1.0/applications/${applicationUuid}/api-keys`;\r\n const url = `${basePath}?${stringify(Object.assign(Object.assign(Object.assign({}, filter), { page: pagination.page - 1, size: pagination.perPage }), (sort && { sort: `${sort.field},${sort.order}` })))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { apiKey } = _a, item = __rest(_a, [\"apiKey\"]);\r\n return (Object.assign({ id: apiKey, apiKey }, item));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=apiKeys.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nexport const applicationsDataProvider = context => {\r\n const basePath = `${context.apiUrl}/api-management/1.0/applications`;\r\n const legacyPath = `${context.apiUrl}/Applications`;\r\n return {\r\n getManyReference: async ({ pagination = { page: 1, perPage: 24 }, filter: { id }, }) => {\r\n const url = `${basePath}?${stringify({\r\n apiUuid: id,\r\n page: pagination.page - 1,\r\n size: pagination.perPage,\r\n })}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign({ id: uuid }, item));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n getList: async ({ filter = {}, pagination = { page: 1, perPage: 24 }, sort = null, }) => {\r\n const url = `${basePath}?${stringify(Object.assign(Object.assign(Object.assign({}, filter), { page: pagination.page - 1, size: pagination.perPage }), (sort && { sort: `${sort.field},${sort.order}` })))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign({ id: uuid }, item));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n getOne: async ({ id }) => {\r\n var _a;\r\n const url = `${legacyPath}('${id}')`;\r\n const _b = (await context.fetchJson(url, { credentials: 'include' })).json, { Uuid } = _b, data = __rest(_b, [\"Uuid\"]);\r\n // Capitalized keys are not used in the new api format.\r\n // To avoid future breaking changes,\r\n // we transform the capitalized key.\r\n return {\r\n data: Object.assign({ id: Uuid, name: data.Name, description: data.Description, status: data.Status, organizationUuid: data.OrganizationUuid, organizationName: data.OrganizationName, apiIds: data.ApiIds, apiApiPlanIds: data.ApiApiPlanIds, apiGroupIds: data.ApiGroupIds, apiKey: data.ApiKey, keySecret: data.KeySecret, disabledByType: data.DisabledByType, customFieldValues: ((_a = data.CustomFieldValues) === null || _a === void 0 ? void 0 : _a.results) || [] }, data),\r\n };\r\n },\r\n create: async ({ data }) => {\r\n // const url = `${context.baseUrl}/admin/Portal.svc/Applications`;\r\n const url = `${legacyPath}`;\r\n const _a = (await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'POST',\r\n body: JSON.stringify(data),\r\n })).json, { Uuid } = _a, responseData = __rest(_a, [\"Uuid\"]);\r\n return {\r\n data: Object.assign({ id: Uuid, name: responseData.Name, description: responseData.Description, status: responseData.Status, organizationUuid: responseData.OrganizationUuid, organizationName: responseData.OrganizationName, apiIds: responseData.ApiIds, apiApiPlanIds: responseData.ApiApiPlanIds, apiGroupIds: responseData.ApiGroupIds, apiKey: responseData.ApiKey, keySecret: responseData.KeySecret, disabledByType: responseData.DisabledByType }, responseData),\r\n };\r\n },\r\n update: async ({ id, data }) => {\r\n const url = `${legacyPath}('${id}')`;\r\n const responseData = __rest((await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'PUT',\r\n body: JSON.stringify(data),\r\n })).json, []);\r\n return {\r\n data: Object.assign({ id: responseData.Uuid, name: responseData.Name, description: responseData.Description, status: responseData.Status, organizationUuid: responseData.OrganizationUuid, organizationName: responseData.OrganizationName, apiIds: responseData.ApiIds, apiApiPlanIds: responseData.ApiApiPlanIds, apiGroupIds: responseData.ApiGroupIds, apiKey: responseData.ApiKey, keySecret: responseData.KeySecret, disabledByType: responseData.DisabledByType }, responseData),\r\n };\r\n },\r\n getSecretHashMetadata: async () => {\r\n // const url = `${portal.hostname}/api/${portal.tenantPrefix}/Settings('APP_SECRET_HASHING_METADATA')`;\r\n const url = `${context.apiUrl}/Settings('APP_SECRET_HASHING_METADATA')`;\r\n const _a = (await context.fetchJson(url, {\r\n credentials: 'include',\r\n })).json, { Uuid } = _a, data = __rest(_a, [\"Uuid\"]);\r\n return {\r\n data: {\r\n id: Uuid,\r\n name: data.Name,\r\n value: data.Value,\r\n },\r\n };\r\n },\r\n getGenerateNewSharedSecret: async ({ isPlainTextSelected, isHashedSecretSetting, id, record, }) => {\r\n const url = isHashedSecretSetting && isPlainTextSelected\r\n ? `${context.apiUrl}/GenerateNewSharedSecret?ApplicationUuid='${id}'&ShouldHash='false'`\r\n : `${context.apiUrl}/GenerateNewSharedSecret?ApplicationUuid='${id}'`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: {\r\n id,\r\n keySecret: json.result,\r\n },\r\n };\r\n },\r\n checkApplicationUniqueness: async ({ applicationName }) => {\r\n const url = `${context.baseUrl}/admin/Portal.svc/ApplicationNameUnique()?Name='${applicationName}'`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: {\r\n isNameUnique: json.d.result,\r\n },\r\n };\r\n },\r\n delete: async ({ id }) => {\r\n const url = `${legacyPath}('${id}')`;\r\n const data = __rest((await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'DELETE',\r\n })).json, []);\r\n return {\r\n data: { data },\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=applications.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nconst basePath = '/api-management/1.0/apis';\r\nexport const assetsDataProvider = context => ({\r\n getManyReference: async ({ id }) => {\r\n const url = `${context.apiUrl}${basePath}/${id}/assets`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign({ id: uuid }, item));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n});\r\n//# sourceMappingURL=assets.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nconst basePath = '/CustomFields';\r\nexport const customFieldsDataProvider = context => {\r\n return {\r\n // The CustomFields API route does not care about pagination or sorting\r\n // so we ignore those parameters\r\n getList: async ({ filter, entityName = 'APPLICATION' }) => {\r\n filter = filter || {\r\n $inlinecount: 'allpages',\r\n $filter: `EntityType eq '${entityName}' and Status eq 'ENABLED'`,\r\n };\r\n const url = new URL(`${context.apiUrl}${basePath}`);\r\n url.search = stringify(filter);\r\n const { json } = await context.fetchJson(url.toString(), {\r\n credentials: 'include',\r\n });\r\n if (!json) {\r\n return { data: [] };\r\n }\r\n return {\r\n data: json.map((_a) => {\r\n var { Uuid } = _a, item = __rest(_a, [\"Uuid\"]);\r\n return (Object.assign(Object.assign({}, item), { id: Uuid }));\r\n }) || [],\r\n total: json.length,\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=customFields.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { stringify } from 'query-string';\r\nexport const organizationsDataProvider = context => {\r\n const basePath = `${context.apiUrl}/api-management/1.0/organizations`; // GET ONE - GET LIST\r\n const legacyPath = `${context.apiUrl}/Organizations`; // CREATE - UPDATE - DELETE\r\n const orgPath = `${context.apiUrl}/tenant-admin/internal/organizations`; // GET ONE - GET LIST\r\n return {\r\n getList: async ({ filter = {}, pagination = { page: 1, perPage: 24 }, sort = null, }) => {\r\n const url = `${orgPath}?${stringify(Object.assign({ status: 'ENABLED', page: pagination.page - 1, size: pagination.perPage }, (sort && { sort: `${sort.field},${sort.order}` })))}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.results.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign(Object.assign({}, item), { id: uuid }));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n getOne: async ({ id }) => {\r\n const url = `${basePath}/${id}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: Object.assign({ id }, json),\r\n };\r\n },\r\n create: async ({ data }) => {\r\n const url = `${legacyPath}`;\r\n const body = {\r\n Name: data.name,\r\n Description: data.description,\r\n Status: data.status,\r\n AccountPlanUuid: data.accountPlanUuid,\r\n };\r\n const { json: { Uuid }, } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n });\r\n return {\r\n data: Object.assign({ id: Uuid }, data),\r\n };\r\n },\r\n update: async ({ id, data }) => {\r\n const url = `${legacyPath}('${id}')`;\r\n const body = {\r\n Name: data.name,\r\n Description: data.description,\r\n Status: data.status,\r\n AccountPlanUuid: data.accountPlanUuid,\r\n };\r\n await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n });\r\n return {\r\n data,\r\n };\r\n },\r\n delete: async ({ id, previousData }) => {\r\n const url = `${legacyPath}('${id}')`;\r\n await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'DELETE',\r\n });\r\n return {\r\n data: previousData,\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=organizations.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nconst basePath = '/Registrations';\r\nconst prepareCreateData = (_a) => {\r\n var body = __rest(_a, []);\r\n return JSON.stringify(body);\r\n};\r\nexport const registrationsDataProvider = context => {\r\n return {\r\n create: async (_a) => {\r\n var { data } = _a, body = __rest(_a, [\"data\"]);\r\n const url = `${context.apiUrl}${basePath}`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n method: 'POST',\r\n body: prepareCreateData(body),\r\n });\r\n return {\r\n data: Object.assign({}, json),\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=registrations.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nconst basePath = '/2.0/Apis';\r\nexport const specsDataProvider = context => {\r\n return {\r\n getOne: async ({ id }) => {\r\n const url = `${context.apiUrl}${basePath}('${id}')/SpecContent`;\r\n const data = __rest((await context.fetchJson(url, { credentials: 'include' })).json, []);\r\n return {\r\n data: Object.assign({ id }, data),\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=specs.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nexport const tagsDataProvider = context => {\r\n const basePath = `${context.apiUrl}/tags`;\r\n const basePathApi = `${context.apiUrl}/api-management/1.0/apis`;\r\n return {\r\n getManyReference: async ({ id }) => {\r\n const url = `${basePathApi}/${id}/tags`;\r\n const { json } = await context.fetchJson(url, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.map((_a) => {\r\n var { uuid } = _a, item = __rest(_a, [\"uuid\"]);\r\n return (Object.assign({ id: uuid }, item));\r\n }) || [],\r\n total: json.totalElements || 0,\r\n };\r\n },\r\n getList: async () => {\r\n const { json } = await context.fetchJson(basePath, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.map(item => (Object.assign({ id: item.name }, item))) || [],\r\n total: json.length,\r\n };\r\n },\r\n getMany: async () => {\r\n const { json } = await context.fetchJson(basePath, {\r\n credentials: 'include',\r\n });\r\n return {\r\n data: json.map(item => (Object.assign({ id: item.name }, item))) || [],\r\n total: json.length,\r\n };\r\n },\r\n };\r\n};\r\n//# sourceMappingURL=tags.js.map","import { getFetchJson } from '../fetchUtils';\r\nimport { accountPlansDataProvider } from './accountPlans';\r\nimport { apiEulasDataProvider } from './apiEulas';\r\nimport { apiGroupsDataProvider } from './apiGroups';\r\nimport { apiPlansDataProvider } from './apiPlans';\r\nimport { apisDataProvider } from './apis';\r\nimport { apiKeysDataProvider } from './apiKeys';\r\nimport { applicationsDataProvider } from './applications';\r\nimport { assetsDataProvider } from './assets';\r\nimport { customFieldsDataProvider } from './customFields';\r\nimport { documentsDataProvider } from './documents';\r\nimport { organizationsDataProvider } from './organizations';\r\nimport { registrationsDataProvider } from './registrations';\r\nimport { specsDataProvider } from './specs';\r\nimport { tagsDataProvider } from './tags';\r\nimport { userContextsDataProvider } from './userContexts';\r\nimport { userProfilesDataProvider } from './userProfiles';\r\nexport const dataProvider = (baseUrl, tenantName, originHubName, fetchJson = getFetchJson(originHubName)) => {\r\n const context = {\r\n baseUrl,\r\n adminUrl: `${baseUrl}/admin`,\r\n apiUrl: `${baseUrl}/api/${tenantName}`,\r\n fetchJson,\r\n originHubName,\r\n };\r\n const resourcesMap = {\r\n accountPlans: accountPlansDataProvider(context),\r\n apiEulas: apiEulasDataProvider(context),\r\n apiGroups: apiGroupsDataProvider(context),\r\n apiPlans: apiPlansDataProvider(context),\r\n apis: apisDataProvider(context),\r\n apiKeys: apiKeysDataProvider(context),\r\n applications: applicationsDataProvider(context),\r\n assets: assetsDataProvider(context),\r\n customFields: customFieldsDataProvider(context),\r\n documents: documentsDataProvider(context),\r\n organizations: organizationsDataProvider(context),\r\n registrations: registrationsDataProvider(context),\r\n specs: specsDataProvider(context),\r\n tags: tagsDataProvider(context),\r\n userContexts: userContextsDataProvider(context),\r\n userProfiles: userProfilesDataProvider(context),\r\n };\r\n const proxy = new Proxy(fakeDataProvider, {\r\n get: (target, name) => {\r\n return (resource, params) => {\r\n let resourceDataProvider = resourcesMap[resource];\r\n if (!resourceDataProvider) {\r\n throw new Error(`Invalid resource \"${resource}\"`);\r\n }\r\n if (!resourceDataProvider[name]) {\r\n throw new Error(`Invalid action \"${name}\" for resource \"${resource}\"`);\r\n }\r\n return resourceDataProvider[name](params);\r\n };\r\n },\r\n });\r\n return proxy;\r\n};\r\n// Only used to configure the proxy\r\nconst fakeDataProvider = {\r\n create: () => Promise.resolve(null),\r\n delete: () => Promise.resolve(null),\r\n deleteMany: () => Promise.resolve(null),\r\n getList: () => Promise.resolve(null),\r\n getMany: () => Promise.resolve(null),\r\n getManyReference: () => Promise.resolve(null),\r\n getOne: () => Promise.resolve(null),\r\n update: () => Promise.resolve(null),\r\n updateMany: () => Promise.resolve(null),\r\n};\r\n//# sourceMappingURL=index.js.map","import React from 'react';\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, makeStyles, } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\nimport { get } from 'lodash';\r\nconst styles = (theme) => ({\r\n paper: {\r\n backgroundColor: get(theme, 'color.uiBackground'),\r\n },\r\n title: {\r\n color: get(theme, 'color.bodyText'),\r\n fontSize: get(theme, 'fontSize.title'),\r\n fontFamily: get(theme, 'typography.bodyText'),\r\n fontWeight: 'bold',\r\n },\r\n cancelButton: {\r\n textTransform: 'none',\r\n color: get(theme, 'color.primaryButtonBackground'),\r\n backgroundColor: get(theme, 'color.primaryButtonText'),\r\n borderColor: get(theme, 'color.primaryButtonBackground'),\r\n },\r\n saveButton: {\r\n textTransform: 'none',\r\n color: get(theme, 'color.primaryButtonText'),\r\n backgroundColor: get(theme, 'color.primaryButtonBackground'),\r\n borderColor: get(theme, 'color.primaryButtonBackground'),\r\n },\r\n});\r\nexport const FormDialog = (props) => {\r\n const useStyles = makeStyles(styles);\r\n const classes = useStyles();\r\n const { children, isOpen, cancelText, submitText, title, dialogId, handleClose, onSubmit, onCancel, submitButtonDisabled, isDialogContentText = true, } = props;\r\n return (React.createElement(Dialog, { open: isOpen, onClose: handleClose, \"aria-labelledby\": \"alert-dialog-title\", \"aria-describedby\": \"alert-dialog-description\", id: dialogId, classes: {\r\n paper: classes.paper,\r\n } },\r\n React.createElement(DialogTitle, { id: \"alert-dialog-title\", className: classes.title }, title),\r\n React.createElement(DialogContent, null,\r\n isDialogContentText &&\r\n React.createElement(DialogContentText, { id: \"alert-dialog-content\" }, children),\r\n !isDialogContentText &&\r\n React.createElement(React.Fragment, null, children)),\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { onClick: onSubmit, variant: \"contained\", color: \"secondary\", className: classes.saveButton, disabled: !!submitButtonDisabled, \"data-apim-test\": \"dialog-submit\" }, submitText),\r\n React.createElement(Button, { onClick: onCancel, variant: \"outlined\", className: classes.cancelButton, \"data-apim-test\": \"dialog-cancel\" }, cancelText))));\r\n};\r\nFormDialog.propTypes = {\r\n children: PropTypes.node,\r\n isOpen: PropTypes.bool,\r\n cancelText: PropTypes.string,\r\n submitText: PropTypes.string,\r\n title: PropTypes.string,\r\n dialogId: PropTypes.string,\r\n handleClose: PropTypes.func,\r\n onCancel: PropTypes.func,\r\n onSubmit: PropTypes.func,\r\n submitButtonDisabled: PropTypes.bool,\r\n isDialogContentText: PropTypes.bool,\r\n};\r\n//# sourceMappingURL=FormDialog.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { cloneElement } from 'react';\r\nimport { useTranslate } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nexport const UserProfileTitle = (_a) => {\r\n var { actions, basePath, resource, record } = _a, rest = __rest(_a, [\"actions\", \"basePath\", \"resource\", \"record\"]);\r\n const translate = useTranslate();\r\n const classes = useStyles(rest);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n translate('resources.userContexts.title'),\r\n actions &&\r\n cloneElement(actions, {\r\n basePath,\r\n resource,\r\n record,\r\n })));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n },\r\n}), {\r\n name: 'Layer7UserContextTitle',\r\n});\r\n//# sourceMappingURL=UserProfileTitle.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useTranslate } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nexport const UserProfileSubtitle = (_a) => {\r\n var { actions } = _a, rest = __rest(_a, [\"actions\"]);\r\n const classes = useStyles(rest);\r\n const translate = useTranslate();\r\n return (React.createElement(Typography, { className: classes.root, variant: \"subtitle1\" }, translate('resources.userContexts.fields.userDetails.password')));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n fontWeight: theme.typography.fontWeightMedium,\r\n marginTop: theme.spacing(4),\r\n marginBottom: theme.spacing(2),\r\n color: theme.palette.getContrastText(theme.palette.background.default),\r\n },\r\n}), {\r\n name: 'Layer7UserContextSubtitle',\r\n});\r\n//# sourceMappingURL=UserProfileSubtitle.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState } from 'react';\r\nimport { BooleanInput, EditView, SimpleForm, Toolbar, TextField, TextInput, EditButton, SaveButton, required, maxLength, email, useEditController, useTranslate, FormDataConsumer, useQuery, } from 'react-admin';\r\nimport { Link } from 'react-router-dom';\r\nimport { makeStyles, Collapse } from '@material-ui/core';\r\nimport Button from '@material-ui/core/Button';\r\nimport createDecorator from 'final-form-calculate';\r\nimport get from 'lodash/get';\r\nimport { FormDialog, ViewTitle, PasswordInput } from '../ui';\r\nimport { usePasswordEncryption, getPwdTooltip } from '../authentication';\r\nimport { regex } from 'ra-core';\r\nimport { UserProfileTitle } from './UserProfileTitle';\r\nimport { UserProfileSubtitle } from './UserProfileSubtitle';\r\nimport { isPortalAdmin, useUserContext } from '../userContexts';\r\nexport const UserProfileEdit = props => {\r\n const _a = useEditController(Object.assign({ successMessage: 'resources.userProfiles.notifications.update_success' }, props)), { record, save } = _a, editControllerProps = __rest(_a, [\"record\", \"save\"]);\r\n const translate = useTranslate();\r\n const [publicKey, encrypt] = usePasswordEncryption();\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [showFormDialog, setShowFormDialog] = useState(false);\r\n const [savedFormData, setSavedFormData] = useState({});\r\n const classes = useUserProfileEditFormStyles();\r\n const [currentPwdError, setCurrentPwdError] = useState(false);\r\n const handleSave = async (formData) => {\r\n const { newPassword } = formData, userProfile = __rest(formData, [\"newPassword\"]);\r\n // if currentPassword and newPassword are available, then user\r\n // is updating password\r\n // if only currentPassword is available, then user is updating email\r\n if (newPassword && currentPassword) {\r\n if (publicKey) {\r\n userProfile.newPassword = await encrypt(newPassword);\r\n userProfile.password = await encrypt(currentPassword);\r\n userProfile.publicKey = publicKey;\r\n }\r\n else {\r\n userProfile.newPassword = newPassword;\r\n userProfile.password = currentPassword;\r\n }\r\n }\r\n else if (currentPassword) {\r\n if (publicKey) {\r\n userProfile.password = await encrypt(currentPassword);\r\n userProfile.publicKey = publicKey;\r\n }\r\n else {\r\n userProfile.password = await encrypt(currentPassword);\r\n }\r\n }\r\n const result = await save(userProfile, 'show');\r\n return result;\r\n };\r\n const handleSubmit = async (formData) => {\r\n const { email, newPassword, updatePassword } = formData;\r\n if (get(record, 'email') !== email || (updatePassword && newPassword)) {\r\n setSavedFormData(formData);\r\n setShowFormDialog(true);\r\n }\r\n else {\r\n await handleSave(formData);\r\n }\r\n };\r\n const handleFormDialogCancel = () => {\r\n setShowFormDialog(false);\r\n setCurrentPwdError(false);\r\n setCurrentPassword('');\r\n };\r\n const handleFormDialogSubmit = async () => {\r\n if (currentPassword) {\r\n setShowFormDialog(false);\r\n await handleSave(savedFormData);\r\n }\r\n else {\r\n setCurrentPwdError(true);\r\n }\r\n };\r\n const handleFormDialogFormSubmit = async (event) => {\r\n event.preventDefault();\r\n if (currentPassword) {\r\n setShowFormDialog(false);\r\n await handleSave(savedFormData);\r\n }\r\n else {\r\n setCurrentPwdError(true);\r\n }\r\n };\r\n const handleCurrentPasswordChange = event => {\r\n setCurrentPwdError(false);\r\n setCurrentPassword(event.target.value);\r\n };\r\n // workaround to hide form toolbar in formdialog\r\n const EmptyDiv = () => React.createElement(\"div\", null);\r\n // specified those props to avoid errors in console\r\n const ToolbarCustomEmptyDiv = (_a) => {\r\n var { handleSubmit, handleSubmitWithRedirect, onSave, invalid, pristine, saving, submitOnEnter } = _a, rest = __rest(_a, [\"handleSubmit\", \"handleSubmitWithRedirect\", \"onSave\", \"invalid\", \"pristine\", \"saving\", \"submitOnEnter\"]);\r\n return React.createElement(EmptyDiv, Object.assign({}, rest));\r\n };\r\n const modalFormValidate = ({ currentPassword }) => {\r\n const errors = {};\r\n if (!currentPassword) {\r\n errors.currentPassword =\r\n 'resources.userProfiles.validation.error_password_empty';\r\n }\r\n return errors;\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(ViewTitle, null),\r\n React.createElement(EditView, Object.assign({ undoable: false }, editControllerProps, { title: React.createElement(UserProfileTitle, { actions: React.createElement(EditButton, { disabled: true }) }), record: record, save: handleSubmit }),\r\n React.createElement(UserProfileEditForm, null)),\r\n React.createElement(FormDialog, { isOpen: showFormDialog, submitText: translate('resources.userProfiles.actions.submit'), cancelText: translate('resources.userProfiles.actions.cancel'), onSubmit: handleFormDialogSubmit, onCancel: handleFormDialogCancel, title: translate('resources.userProfiles.passwordDialogTitle'), submitButtonDisabled: false, isDialogContentText: false },\r\n React.createElement(SimpleForm, { toolbar: React.createElement(ToolbarCustomEmptyDiv, null), validate: modalFormValidate, onSubmit: handleFormDialogFormSubmit },\r\n React.createElement(PasswordInput, { className: classes.field, id: 'currentPassword', name: 'currentPassword', value: currentPassword, fullWidth: true, helperText: \"resources.userProfiles.validation.tooltip_current_password\", label: \"resources.userProfiles.passwordDialogTitle\", error: currentPwdError, onChange: handleCurrentPasswordChange, variant: \"filled\", style: {\r\n width: 448,\r\n } })))));\r\n};\r\nconst CancelButton = ({ record }) => {\r\n const translate = useTranslate();\r\n return (React.createElement(Button, { component: Link, to: record ? `/userProfiles/${record.id}/show` : '', variant: \"outlined\", color: \"primary\" }, translate('resources.userProfiles.actions.cancel')));\r\n};\r\nconst useUserProfileEditToolbarStyles = makeStyles(theme => ({\r\n toolbar: {\r\n backgroundColor: 'transparent',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n width: 456,\r\n },\r\n saveButton: {\r\n marginLeft: theme.spacing(2),\r\n },\r\n}), {\r\n name: 'Layer7UserContextEditToolbar',\r\n});\r\nconst UserProfileEditToolbar = (_a) => {\r\n var { record } = _a, rest = __rest(_a, [\"record\"]);\r\n const classes = useUserProfileEditToolbarStyles();\r\n const [userContext] = useUserContext();\r\n const isIdpUser = get(userContext, 'userDetails.isIdpUser', false);\r\n return (React.createElement(Toolbar, Object.assign({ className: classes.toolbar, record: record }, rest),\r\n React.createElement(CancelButton, { disabled: isIdpUser }),\r\n React.createElement(SaveButton, { disabled: isIdpUser, className: classes.saveButton, redirect: \"show\" })));\r\n};\r\nconst useUserProfileEditFormStyles = makeStyles(theme => ({\r\n root: {\r\n padding: `${theme.spacing(2)}px !important`,\r\n width: 480,\r\n },\r\n field: {\r\n display: 'block',\r\n },\r\n}), {\r\n name: 'Layer7UserProfileEditForm',\r\n});\r\nconst validateName = [required(), maxLength(60)];\r\nconst validateEmail = [required(), maxLength(256), email()];\r\nconst pwdResetDecorator = createDecorator({\r\n field: 'updatePassword',\r\n updates: {\r\n // ...clear new password and verified password if updatePassword is false\r\n newPassword: (updatePasswordValue, allValues) => updatePasswordValue ? allValues.newPassword : '',\r\n confirmNewPassword: (updatePasswordValue, allValues) => updatePasswordValue ? allValues.confirmNewPassword : '',\r\n },\r\n});\r\nexport const UserProfileEditForm = (_a) => {\r\n var { record, basePath, save } = _a, rest = __rest(_a, [\"record\", \"basePath\", \"save\"]);\r\n const classes = useUserProfileEditFormStyles();\r\n const validate = ({ newPassword, confirmNewPassword, updatePassword }) => {\r\n const errors = {};\r\n if (updatePassword && newPassword) {\r\n if (newPassword !== confirmNewPassword) {\r\n errors.confirmNewPassword =\r\n 'resources.userProfiles.validation.error_password_match';\r\n }\r\n }\r\n if (updatePassword && !newPassword) {\r\n errors.newPassword =\r\n 'resources.userProfiles.validation.error_password_empty';\r\n }\r\n return errors;\r\n };\r\n const [userContext] = useUserContext();\r\n const isAdmin = isPortalAdmin(userContext);\r\n const { data } = useQuery({\r\n type: 'getPasswordPolicy',\r\n resource: 'userProfiles',\r\n });\r\n const regexConfig = get(data, 'regexConfig', {});\r\n const regexStr = get(regexConfig, 'REGEX.value', '');\r\n const validatePassword = regexStr\r\n ? [\r\n regex(new RegExp(regexStr), 'resources.userProfiles.validation.error_password_not_matching_criteria'),\r\n ]\r\n : [];\r\n const translate = useTranslate();\r\n const passwordTooltip = getPwdTooltip(regexConfig, translate);\r\n const isIdpUser = get(userContext, 'userDetails.isIdpUser', false);\r\n return (React.createElement(SimpleForm, Object.assign({ className: classes.root, decorators: [pwdResetDecorator], record: record, save: save, toolbar: React.createElement(UserProfileEditToolbar, null), validate: validate }, rest),\r\n React.createElement(TextField, { className: classes.field, fullWidth: true, source: \"userName\" }),\r\n React.createElement(TextInput, { className: classes.field, fullWidth: true, source: \"lastName\", validate: validateName, disabled: isIdpUser }),\r\n React.createElement(TextInput, { className: classes.field, fullWidth: true, source: \"firstName\", validate: validateName, disabled: isIdpUser }),\r\n React.createElement(TextInput, { className: classes.field, fullWidth: true, source: \"email\", validate: validateEmail, disabled: !isAdmin || isIdpUser }),\r\n !isIdpUser && React.createElement(UserProfileSubtitle, null),\r\n !isIdpUser && (React.createElement(BooleanInput, { className: classes.field, fullWidth: true, source: \"updatePassword\" })),\r\n !isIdpUser && (React.createElement(FormDataConsumer, null, (_a) => {\r\n var { formData, className } = _a, rest = __rest(_a, [\"formData\", \"className\"]);\r\n return (React.createElement(Collapse, { in: formData.updatePassword },\r\n React.createElement(PasswordInput, Object.assign({ fullWidth: true, source: \"newPassword\", style: {\r\n width: 448,\r\n }, title: passwordTooltip, \"data-testid\": 'new-password', className: className, validate: validatePassword }, rest)),\r\n React.createElement(\"br\", null),\r\n React.createElement(PasswordInput, Object.assign({ fullWidth: true, source: \"confirmNewPassword\", style: {\r\n width: 448,\r\n }, title: \"resources.userProfiles.validation.tooltip_password_confirm\", \"data-testid\": 'confirm-new-password', className: className }, rest))));\r\n }))));\r\n};\r\n//# sourceMappingURL=UserProfileEdit.js.map","import React from 'react';\r\nimport { Show, SimpleShowLayout, TextField, EditButton } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { ViewTitle } from '../ui';\r\nimport { UserProfileTitle } from './UserProfileTitle';\r\nexport const UserProfileShow = props => {\r\n const classes = useStyles(props);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(ViewTitle, null),\r\n React.createElement(Show, Object.assign({}, props, { title: React.createElement(UserProfileTitle, Object.assign({ actions: React.createElement(EditButton, null) }, props)), actions: null }),\r\n React.createElement(SimpleShowLayout, { className: classes.root },\r\n React.createElement(TextField, { className: classes.field, source: \"userName\" }),\r\n React.createElement(TextField, { className: classes.field, source: \"lastName\" }),\r\n React.createElement(TextField, { className: classes.field, source: \"firstName\" }),\r\n React.createElement(TextField, { className: classes.field, source: \"email\" })))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n padding: `${theme.spacing(4)}px !important`,\r\n },\r\n field: {\r\n width: 456,\r\n },\r\n}), {\r\n name: 'Layer7UserProfileShow',\r\n});\r\n//# sourceMappingURL=UserProfileShow.js.map","import { UserProfileList } from './UserProfileList';\r\nimport { UserProfileEdit } from './UserProfileEdit';\r\nimport { UserProfileShow } from './UserProfileShow';\r\nexport const userProfiles = {\r\n list: UserProfileList,\r\n edit: UserProfileEdit,\r\n show: UserProfileShow,\r\n};\r\n//# sourceMappingURL=index.js.map","import React, { useEffect } from 'react';\r\nimport { useRedirect } from 'react-admin';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { CurrentUserId } from '../dataProvider/userProfiles';\r\n/**\r\n * The UserContext is a particular resource that cannot be listed,\r\n * and that contains only one element.\r\n * We perform a redirection to the edit page instead of displaying a blank page.\r\n */\r\nexport const UserProfileList = () => {\r\n const redirect = useRedirect();\r\n useEffect(() => {\r\n redirect(`/userProfiles/${CurrentUserId}/show`);\r\n }, [redirect]);\r\n return React.createElement(CircularProgress, { size: 20 });\r\n};\r\n//# sourceMappingURL=UserProfileList.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { useTranslate } from 'react-admin';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DefaultDialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Close } from '@material-ui/icons';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { useAuthenticationConfiguration } from '../useAuthenticationConfiguration';\r\nexport const TermsDialog = ({ open, onClose }) => {\r\n const translate = useTranslate();\r\n const { termsOfUse } = useAuthenticationConfiguration();\r\n return (React.createElement(Dialog, { \"aria-labelledby\": \"terms_of_use_dialog_title\", open: open, onClose: onClose, maxWidth: \"md\", fullWidth: true },\r\n React.createElement(DialogTitle, { id: \"terms_of_use_dialog_title\", onClose: onClose }, translate('apihub.account_setup.terms_of_use.terms_of_use_dialog.title')),\r\n React.createElement(DialogContent, { dividers: true },\r\n termsOfUse === null && React.createElement(LinearProgress, null),\r\n termsOfUse && React.createElement(TermsField, { content: termsOfUse })),\r\n React.createElement(DialogActions, null,\r\n React.createElement(Button, { autoFocus: true, onClick: onClose, color: \"primary\" }, translate('apihub.account_setup.terms_of_use.terms_of_use_dialog.close')))));\r\n};\r\nconst useTermsTitleStyles = makeStyles(theme => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n}), {\r\n name: 'Layer7AccountSetupTermsTitle',\r\n});\r\nconst DialogTitle = (_a) => {\r\n var { children, onClose } = _a, rest = __rest(_a, [\"children\", \"onClose\"]);\r\n const classes = useTermsTitleStyles(rest);\r\n const translate = useTranslate();\r\n return (React.createElement(DefaultDialogTitle, Object.assign({ disableTypography: true, className: classes.root }, rest),\r\n React.createElement(Typography, { variant: \"h6\" }, children),\r\n onClose ? (React.createElement(IconButton, { \"aria-label\": translate('apihub.account_setup.terms_of_use.terms_of_use_dialog.close'), className: classes.closeButton, onClick: onClose },\r\n React.createElement(Close, null))) : null));\r\n};\r\nconst TermsField = ({ content }) => {\r\n return (React.createElement(React.Fragment, null, content.split('\\\\n').map((section, index) => isEmpty(section) ? (React.createElement(\"br\", null)) : (React.createElement(Typography, { key: index, variant: \"body2\", paragraph: true }, section)))));\r\n};\r\n//# sourceMappingURL=TermsDialog.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useState, useCallback } from 'react';\r\nimport { Link, InputHelperText, useInput, useTranslate } from 'react-admin';\r\nimport { FormGroup, FormControlLabel, FormHelperText, Checkbox, Typography, } from '@material-ui/core';\r\nimport { TermsDialog } from './TermsDialog';\r\nexport const TermsInput = (_a) => {\r\n var { helperText } = _a, rest = __rest(_a, [\"helperText\"]);\r\n const _b = useInput(Object.assign({}, rest)), _c = _b.input, { onChange, type, value } = _c, inputProps = __rest(_c, [\"onChange\", \"type\", \"value\"]), { meta: { error, touched } } = _b;\r\n const handleChange = useCallback((_, value) => {\r\n onChange(value);\r\n }, [onChange]);\r\n return (React.createElement(FormGroup, null,\r\n React.createElement(FormControlLabel, { control: React.createElement(Checkbox, Object.assign({ color: \"primary\", onChange: handleChange }, inputProps)), label: React.createElement(TermsLabel, null), labelPlacement: \"end\" }),\r\n React.createElement(FormHelperText, { error: !!error },\r\n React.createElement(InputHelperText, { touched: touched, error: error, helperText: helperText }))));\r\n};\r\nexport const TermsLabel = () => {\r\n const translate = useTranslate();\r\n const [isOpen, setIsOpen] = useState();\r\n const handleOpen = event => {\r\n event.preventDefault();\r\n setIsOpen(true);\r\n };\r\n const handleClose = () => {\r\n setIsOpen(false);\r\n };\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(Typography, { variant: \"body1\" },\r\n translate('apihub.account_setup.terms_of_use.terms_of_use_acknowledgement'),\r\n React.createElement(Link, { to: \"#\", onClick: handleOpen }, translate('apihub.account_setup.terms_of_use.terms_of_use'))),\r\n isOpen === true && (React.createElement(TermsDialog, { open: isOpen, onClose: handleClose }))));\r\n};\r\n//# sourceMappingURL=TermsInput.js.map","import React from 'react';\r\nimport { SaveButton, Toolbar } from 'react-admin';\r\nimport { ValidationError } from 'ra-core';\r\nimport { makeStyles, Typography } from '@material-ui/core';\r\nimport { FormSpy } from 'react-final-form';\r\nimport get from 'lodash/get';\r\n/**\r\n * The Account Setup Toolbar displaying the submit button and the possible errors of the account setup form\r\n *\r\n * @param {string} button.color The color of the submit button\r\n * @param {string} button.variant The variant of the submit button\r\n * @param {string} button.size The size of the submit button\r\n *\r\n */\r\nexport const AccountSetupToolbar = props => {\r\n const classes = useStyles(props);\r\n const { button } = props;\r\n const color = get(button, 'color', 'primary');\r\n const variant = get(button, 'variant', 'outlined');\r\n const size = get(button, 'size', 'small');\r\n return (React.createElement(FormSpy, { subscription: subscription }, ({ error, touched }) => {\r\n const showError = error && touched.password && touched.confirm_password;\r\n return (React.createElement(React.Fragment, null,\r\n showError ? (React.createElement(Typography, { variant: \"body1\", color: \"error\", className: classes.error },\r\n React.createElement(ValidationError, { error: error }))) : null,\r\n React.createElement(Toolbar, Object.assign({ className: classes.toolbar }, props),\r\n React.createElement(SaveButton, { className: classes.submit, icon: React.createElement(\"span\", null), label: \"apihub.account_setup.actions.submit\", color: color, variant: variant, size: size }))));\r\n }));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'stretch',\r\n flexBasis: '100%',\r\n backgroundColor: 'transparent',\r\n padding: 0,\r\n marginTop: theme.spacing(2),\r\n },\r\n error: {\r\n marginTop: theme.spacing(2),\r\n },\r\n success: {\r\n color: theme.palette.success.main,\r\n marginTop: theme.spacing(2),\r\n },\r\n submit: {},\r\n}), {\r\n name: 'Layer7AccountSetupToolbar',\r\n});\r\nconst subscription = { error: true, touched: true, submitSucceeded: true };\r\n//# sourceMappingURL=AccountSetupToolbar.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { required, minLength, maxLength, SimpleForm, TextInput, useTranslate, } from 'react-admin';\r\nimport { makeStyles, InputAdornment } from '@material-ui/core';\r\nimport { InfoOutlined } from '@material-ui/icons';\r\nimport { FORM_ERROR } from 'final-form';\r\nimport { useApiHub } from '../../ApiHubContext';\r\nimport { HtmlTooltip, PasswordInput } from '../../ui';\r\nimport { TermsInput } from './TermsInput';\r\nimport { AccountSetupToolbar } from './AccountSetupToolbar';\r\nimport { validatePassword } from '../validatePassword';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { getErrorMessage } from '../../useLayer7Notify';\r\nexport const AccountSetupForm = props => {\r\n const { initialValues, onSubmit, toolbarProps, error = {} } = props, rest = __rest(props, [\"initialValues\", \"onSubmit\", \"toolbarProps\", \"error\"]);\r\n const classes = useStyles(rest);\r\n const translate = useTranslate();\r\n const { urlWithTenant, originHubName } = useApiHub();\r\n let flag = true;\r\n const validate = ({ password, confirm_password }) => {\r\n if (password !== confirm_password) {\r\n return {\r\n [FORM_ERROR]: 'apihub.account_setup.validation.error_password_match',\r\n };\r\n }\r\n if (!isEmpty(error) && flag) {\r\n const message = getErrorMessage(error);\r\n flag = false;\r\n return {\r\n userName: message,\r\n };\r\n }\r\n };\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(SimpleForm, Object.assign({ className: classes.form, save: onSubmit, toolbar: React.createElement(AccountSetupToolbar, Object.assign({}, toolbarProps)), validate: validate, initialValues: initialValues }, rest),\r\n React.createElement(TextInput, { source: \"firstName\", type: \"text\", label: \"apihub.account_setup.fields.firstname\", variant: \"outlined\", fullWidth: true, validate: required() }),\r\n React.createElement(TextInput, { source: \"lastName\", type: \"text\", label: \"apihub.account_setup.fields.lastname\", variant: \"outlined\", fullWidth: true, validate: required() }),\r\n React.createElement(TextInput, { source: \"email\", type: \"email\", label: \"apihub.account_setup.fields.email\", variant: \"outlined\", fullWidth: true, validate: required(), disabled: true }),\r\n React.createElement(TextInput, { source: \"userName\", type: \"text\", label: \"apihub.account_setup.fields.username\", variant: \"outlined\", autoComplete: \"new_username\", fullWidth: true, InputProps: {\r\n endAdornment: (React.createElement(InputAdornment, { position: \"end\" },\r\n React.createElement(HtmlTooltip, { className: classes.tootip, title: translate('apihub.account_setup.validation.tooltip_username'), placement: \"right\", arrow: true },\r\n React.createElement(InfoOutlined, null)))),\r\n }, validate: [required(), minLength(5), maxLength(60)] }),\r\n React.createElement(PasswordInput, { source: \"password\", label: \"apihub.account_setup.fields.password\", variant: \"outlined\", autoComplete: \"new_password\", fullWidth: true, validate: [required(), validatePassword], title: \"apihub.account_setup.validation.tooltip_password\" }),\r\n React.createElement(PasswordInput, { source: \"confirm_password\", label: \"apihub.account_setup.fields.confirm_password\", variant: \"outlined\", autoComplete: \"confirm_new_password\", fullWidth: true, validate: [required()], title: \"apihub.account_setup.validation.tooltip_password_confirm\" }),\r\n React.createElement(TermsInput, { source: \"terms\", type: \"checkbox\", validate: [mustBeTrue()] }))));\r\n};\r\nconst mustBeTrue = () => value => !value\r\n ? 'apihub.account_setup.terms_of_use.terms_of_use_validation'\r\n : undefined;\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n form: {\r\n '& >:first-child': {\r\n padding: 0,\r\n },\r\n '& .ra-input': {\r\n marginTop: theme.spacing(2),\r\n },\r\n paddingBottom: theme.spacing(4),\r\n },\r\n}), {\r\n name: 'Layer7AccountSetupForm',\r\n});\r\n//# sourceMappingURL=AccountSetupForm.js.map","import { defaultTheme } from 'react-admin';\r\nimport defaultMuiTheme from '@material-ui/core/styles/defaultTheme';\r\nimport createMuiTheme from '@material-ui/core/styles/createMuiTheme';\r\nimport createPalette from '@material-ui/core/styles/createPalette';\r\nimport merge from 'lodash/merge';\r\nimport blue from '@material-ui/core/colors/blue';\r\nconst palette = createPalette(merge({}, defaultTheme.palette, {\r\n secondary: {\r\n light: '#6ec6ff',\r\n main: '#43425d',\r\n dark: '#0069c0',\r\n contrastText: defaultMuiTheme.palette.common.white,\r\n },\r\n}));\r\n/**\r\n * Default Layer 7 Api Hub theme\r\n */\r\nexport const theme = createMuiTheme(merge({}, defaultTheme, {\r\n palette,\r\n overrides: {\r\n RaMenuItemLink: {\r\n root: {\r\n color: palette.common.white,\r\n borderLeftColor: 'transparent',\r\n borderLeftWidth: defaultMuiTheme.spacing(0.5),\r\n borderLeftStyle: 'solid',\r\n paddingTop: defaultMuiTheme.spacing(2),\r\n paddingBottom: defaultMuiTheme.spacing(2),\r\n },\r\n active: {\r\n borderLeftColor: blue[800],\r\n borderLeftWidth: defaultMuiTheme.spacing(0.5),\r\n borderLeftStyle: 'solid',\r\n backgroundColor: palette.action.selected,\r\n color: palette.common.white,\r\n '& svg': {\r\n color: '#a3a0fb',\r\n },\r\n },\r\n icon: {\r\n color: palette.common.white,\r\n },\r\n },\r\n RaSidebar: {\r\n drawerPaper: {\r\n backgroundColor: palette.secondary.main,\r\n marginTop: '1.5em',\r\n height: 'calc(100% - 1.5em)',\r\n [defaultMuiTheme.breakpoints.up('xs')]: {\r\n marginTop: '0',\r\n paddingTop: '1.5em',\r\n },\r\n [defaultMuiTheme.breakpoints.down('sm')]: {\r\n marginTop: '0',\r\n paddingTop: '1.5em',\r\n },\r\n },\r\n },\r\n RaLayout: {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n zIndex: 1,\r\n minHeight: '100vh',\r\n position: 'relative',\r\n minWidth: 'fit-content',\r\n width: '100%',\r\n },\r\n appFrame: {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n [defaultMuiTheme.breakpoints.up('xs')]: {\r\n marginTop: defaultMuiTheme.spacing(6),\r\n },\r\n [defaultMuiTheme.breakpoints.down('xs')]: {\r\n marginTop: defaultMuiTheme.spacing(9),\r\n },\r\n },\r\n contentWithSidebar: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n flexBasis: 0,\r\n padding: defaultMuiTheme.spacing(3),\r\n paddingTop: defaultMuiTheme.spacing(6),\r\n paddingLeft: 0,\r\n [defaultMuiTheme.breakpoints.up('xs')]: {\r\n paddingLeft: defaultMuiTheme.spacing(3),\r\n },\r\n [defaultMuiTheme.breakpoints.down('sm')]: {\r\n padding: 0,\r\n },\r\n },\r\n },\r\n MuiTab: {\r\n root: {\r\n textTransform: 'capitalize',\r\n '&$selected': {\r\n color: palette.primary,\r\n fontWeight: defaultMuiTheme.typography.fontWeightBold,\r\n },\r\n },\r\n },\r\n },\r\n props: {\r\n MuiFab: {\r\n color: 'primary',\r\n },\r\n },\r\n}));\r\n//# sourceMappingURL=theme.js.map","import React from 'react';\r\nimport Link from '@material-ui/core/Link';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport unified from 'unified';\r\nimport parse from 'remark-parse';\r\nimport remark2react from 'remark-react';\r\nimport removeMarkdown from 'remove-markdown';\r\nimport merge from 'lodash/merge';\r\nexport const removeTags = text => {\r\n return removeMarkdown(text);\r\n};\r\n// TODO: complete supported markdown syntax\r\nconst markdownOptions = {\r\n remarkReactComponents: {\r\n h1: props => React.createElement(Typography, Object.assign({ variant: \"h1\", color: \"textPrimary\" }, props)),\r\n h2: props => React.createElement(Typography, Object.assign({ variant: \"h2\", color: \"textPrimary\" }, props)),\r\n h3: props => React.createElement(Typography, Object.assign({ variant: \"h3\", color: \"textPrimary\" }, props)),\r\n h4: props => React.createElement(Typography, Object.assign({ variant: \"h4\", color: \"textPrimary\" }, props)),\r\n h5: props => React.createElement(Typography, Object.assign({ variant: \"h5\", color: \"textPrimary\" }, props)),\r\n h6: props => React.createElement(Typography, Object.assign({ variant: \"h6\", color: \"textPrimary\" }, props)),\r\n p: props => (React.createElement(Typography, Object.assign({ component: \"p\", variant: \"body1\", color: \"textPrimary\" }, props))),\r\n a: props => React.createElement(Link, Object.assign({}, props)),\r\n li: props => (React.createElement(Typography, Object.assign({ component: \"li\", variant: \"body1\", color: \"textPrimary\" }, props))),\r\n td: props => (React.createElement(Typography, Object.assign({ component: \"td\", variant: \"body1\", color: \"textPrimary\" }, props))),\r\n blockquote: props => {\r\n // eslint-disable-next-line react-hooks/rules-of-hooks\r\n const classes = useBlockquoteStyles(props);\r\n return React.createElement(\"blockquote\", Object.assign({ className: classes.root }, props));\r\n },\r\n code: props => {\r\n // eslint-disable-next-line react-hooks/rules-of-hooks\r\n const classes = useMarkdownStyles();\r\n return (React.createElement(Typography, Object.assign({ component: \"code\", variant: \"body1\", className: classes.code, color: \"textPrimary\" }, props)));\r\n },\r\n },\r\n};\r\nconst useBlockquoteStyles = makeStyles(theme => ({\r\n root: {\r\n color: theme.palette.text.secondary,\r\n position: 'relative',\r\n margin: '16px 0',\r\n padding: '5px 8px 5px 30px',\r\n background: 'none repeat scroll 0 0 rgba(102,128,153,.05)',\r\n border: 'none',\r\n borderLeft: '10px solid #d6dbdf',\r\n },\r\n}));\r\nconst useMarkdownStyles = makeStyles(theme => ({\r\n code: {\r\n fontFamily: 'initial',\r\n backgroundColor: theme.palette.grey['300'],\r\n paddingLeft: theme.spacing(1),\r\n paddingRight: theme.spacing(1),\r\n paddingTop: theme.spacing(0.5),\r\n paddingBottom: theme.spacing(0.5),\r\n },\r\n}));\r\nexport const markdownRenderer = (text, options = {}) => unified()\r\n .use(parse)\r\n .use(remark2react, merge({}, markdownOptions, options))\r\n .processSync(text).contents;\r\n//# sourceMappingURL=markdownRenderer.js.map","import React, { createContext, useContext, useRef } from 'react';\r\nimport get from 'lodash/get';\r\nexport const ApiHubContext = createContext();\r\nexport const ApiHubProvider = ({ url, tenantName, originHubName, children, }) => {\r\n const value = useRef({\r\n originHubName,\r\n tenantName,\r\n url,\r\n urlWithApi: `${url}/api`,\r\n urlWithTenant: `${url}/api/${tenantName}`,\r\n });\r\n return (React.createElement(ApiHubContext.Provider, { value: value.current }, children));\r\n};\r\nexport const useApiHub = () => useContext(ApiHubContext);\r\nexport const guessApihubUrl = (location = global.window.location) => {\r\n return get(location, 'origin', '');\r\n};\r\nexport const guessApihubTenantName = (location = global.window.location) => {\r\n return location.host.split('.')[0];\r\n};\r\n//# sourceMappingURL=ApiHubContext.js.map","import { fetchUtils } from 'ra-core';\r\nconst { APIHUB_URL, TENANT_NAME, ORIGIN_HUB_NAME } = global.APIHUB_CONFIG;\r\nexport function getFetchJson(originHubName) {\r\n if (!originHubName) {\r\n originHubName = ORIGIN_HUB_NAME;\r\n }\r\n return (url, options = {}) => {\r\n if (!options.headers) {\r\n options.headers = new Headers({ Accept: 'application/json' });\r\n }\r\n options.headers.set('Content-Type', 'application/json; charset=UTF-8');\r\n options.headers.set('Origin-Hub-Name', originHubName);\r\n options.credentials = options.credentials || 'include';\r\n return fetchUtils.fetchJson(url, options);\r\n };\r\n}\r\n//# sourceMappingURL=fetchUtils.js.map","import React, { Children, cloneElement, isValidElement, useState, useEffect, useCallback, } from 'react';\r\nimport classnames from 'classnames';\r\nimport { useTranslate } from 'ra-core';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Button from '@material-ui/core/Button';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport AccountCircle from '@material-ui/icons/AccountCircle';\r\nimport PersonAdd from '@material-ui/icons/PersonAdd';\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\r\nimport { Link, useLocation } from 'react-router-dom';\r\nimport { CurrentUserId } from './dataProvider/userContexts';\r\nimport { UserOrganizationSwitcher, useUserContext } from './userContexts';\r\n/**\r\n * An hook to get the path of the related list of resources\r\n * from the current location.\r\n *\r\n * @example Simple usage\r\n *\r\n * const MyComponent = () => {\r\n * const location = useLocation();\r\n * console.log(location.pathname); // Shows \"/apis/uuid-of-api/show\"\r\n *\r\n * const resourceListLocation = useResourceListLocation();\r\n * console.log(resourceListLocation) // Show \"/apis\"\r\n * };\r\n *\r\n */\r\n/* eslint-disable */\r\nconst { EXTERNAL_INVITE_LINK } = global.APIHUB_CONFIG;\r\nexport const useResourceListLocation = () => {\r\n const location = useLocation();\r\n const RESOURCE_LIST_MATCH = /\\/[^/]*/;\r\n const match = location.pathname.match(RESOURCE_LIST_MATCH);\r\n return match[0];\r\n};\r\n/**\r\n * The ApiHub UserMenu used in the ApiHub AppBar.\r\n *\r\n * @param {*} props UserMenu properties\r\n *\r\n * @example Simple usage\r\n * \r\n *\r\n * const MyAppBar = props => \r\n *\r\n */\r\nexport const ApiHubUserMenu = props => {\r\n var _a, _b;\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const redirectTo = useResourceListLocation();\r\n const [userContext, _handleChangeUserProfile, // eslint-disable-line no-unused-vars\r\n handleChangeUserActiveOrg,] = useUserContext(redirectTo);\r\n if (userContext) {\r\n localStorage.setItem('userContext', JSON.stringify(userContext));\r\n }\r\n const { children, label, icon, logout } = props;\r\n if (!logout && !children) {\r\n return null;\r\n }\r\n const userName = userContext\r\n ? translate('apihub.menu.user_details.full_name', {\r\n last_name: ((_a = userContext === null || userContext === void 0 ? void 0 : userContext.userDetails) === null || _a === void 0 ? void 0 : _a.lastName) ? userContext.userDetails.lastName\r\n : '',\r\n first_name: ((_b = userContext === null || userContext === void 0 ? void 0 : userContext.userDetails) === null || _b === void 0 ? void 0 : _b.firstName) ? userContext.userDetails.firstName\r\n : '',\r\n })\r\n : '';\r\n const open = Boolean(anchorEl);\r\n const handleMenu = useCallback(event => setAnchorEl(event.currentTarget));\r\n const handleClose = () => setAnchorEl(null);\r\n useEffect(() => {\r\n localStorage.setItem('useredirect', true);\r\n }, [handleMenu]);\r\n const handleChangeUserContext = value => {\r\n handleChangeUserActiveOrg(value);\r\n handleClose();\r\n };\r\n return (React.createElement(\"div\", null,\r\n React.createElement(Tooltip, { title: label && translate(label, { _: label }) },\r\n React.createElement(Button, { \"aria-label\": label && translate(label, { _: label }), \"aria-owns\": open ? 'menu-appbar' : null, \"aria-haspopup\": true, onClick: handleMenu, startIcon: icon, endIcon: React.createElement(ArrowDropDownIcon, null), key: userName }, userName)),\r\n React.createElement(Menu, { id: \"menu-appbar\", anchorEl: anchorEl, anchorOrigin: {\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }, transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }, open: open, onClose: handleClose },\r\n React.createElement(MenuItem, { component: Link, to: `/userProfiles/${CurrentUserId}/show`, onClick: handleClose, className: classes.menuItem },\r\n React.createElement(ListItemIcon, { className: classes.icon },\r\n React.createElement(AccountCircle, null)),\r\n translate('resources.userProfiles.actions.edit_profile')),\r\n React.createElement(\"a\", { href: EXTERNAL_INVITE_LINK, onClick: handleClose, className: \"MuiButtonBase-root MuiListItem-root MuiMenuItem-root ApiHubUserMenu-menuItem-150 MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button\" },\r\n React.createElement(ListItemIcon, { className: classes.icon },\r\n React.createElement(PersonAdd, null)),\r\n translate('resources.userProfiles.actions.admin_invite')),\r\n React.createElement(Divider, { className: classes.divider }),\r\n React.createElement(UserOrganizationSwitcher, { userContext: userContext, onChangeUserContext: handleChangeUserContext }),\r\n Children.map(children, menuItem => isValidElement(menuItem)\r\n ? cloneElement(menuItem, {\r\n className: classes.menuItem,\r\n onClick: handleClose,\r\n })\r\n : null),\r\n cloneElement(logout, {\r\n className: classnames(classes.menuItem, classes.menuItemLogout),\r\n }))));\r\n};\r\nApiHubUserMenu.defaultProps = {\r\n label: 'ra.auth.user_menu',\r\n icon: React.createElement(AccountCircle, null),\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n menuItem: {\r\n color: theme.palette.text.secondary,\r\n marginBottom: theme.spacing(),\r\n },\r\n menuItemLogout: {\r\n marginBottom: '0px',\r\n },\r\n divider: {\r\n marginBottom: theme.spacing(),\r\n },\r\n icon: {\r\n minWidth: theme.spacing(5),\r\n },\r\n}), {\r\n name: 'ApiHubUserMenu',\r\n});\r\n//# sourceMappingURL=ApiHubUserMenu.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React, { useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport classNames from 'classnames';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport { toggleSidebar, useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Tooltip } from '@material-ui/core';\r\nimport { useApiHubPreference } from './preferences';\r\nexport const SidebarButton = (_a) => {\r\n var { open } = _a, props = __rest(_a, [\"open\"]);\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const translate = useTranslate();\r\n const label = translate(open ? 'ra.actions.close_sidebar' : 'ra.actions.open_sidebar');\r\n const [sidebarOpenPreference, writeSidebarOpenPreference,] = useApiHubPreference('sidebarOpen');\r\n useEffect(() => {\r\n if (sidebarOpenPreference == null) {\r\n writeSidebarOpenPreference(open);\r\n return;\r\n }\r\n if (sidebarOpenPreference !== open) {\r\n dispatch(toggleSidebar());\r\n }\r\n }, [dispatch, open, sidebarOpenPreference, writeSidebarOpenPreference]);\r\n const handleToggleSidebar = () => {\r\n writeSidebarOpenPreference(!sidebarOpenPreference);\r\n };\r\n return (React.createElement(Tooltip, { title: label },\r\n React.createElement(IconButton, Object.assign({ color: \"inherit\", \"aria-label\": label, onClick: handleToggleSidebar, className: classNames(classes.root) }, props),\r\n React.createElement(MenuIcon, { classes: {\r\n root: open ? classes.open : classes.closed,\r\n } }))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n marginLeft: '0.5em',\r\n marginRight: '0.5em',\r\n color: theme.palette.secondary.darkBlue,\r\n },\r\n closed: {\r\n transition: theme.transitions.create(['transform'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n transform: 'rotate(0deg)',\r\n },\r\n open: {\r\n transition: theme.transitions.create(['transform'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n transform: 'rotate(180deg)',\r\n },\r\n}), { name: 'Layer7SidebarButton' });\r\n//# sourceMappingURL=SidebarButton.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { useEffect, useState } from 'react';\r\nimport { useApiHub } from '../../ApiHubContext';\r\nimport { extractTokenFromUrl } from '../extractTokenFromUrl';\r\nimport { usePasswordEncryption } from '../usePasswordEncryption';\r\nimport { getFetchJson } from '../../fetchUtils';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport const fetchAccountData = async (urlWithTenant, originHubName, token) => {\r\n const fetchJson = getFetchJson(originHubName);\r\n const { json } = await fetchJson(`${urlWithTenant}/accountSetup?token=${token}`);\r\n return json;\r\n};\r\nexport const submitAccountData = async (urlWithTenant, originHubName, token, notify, publicKey, data = {}) => {\r\n const { confirm_password, terms } = data, account = __rest(data, [\"confirm_password\", \"terms\"]);\r\n const fetchJson = getFetchJson(originHubName);\r\n const headers = new Headers({\r\n 'Content-Type': 'application/json; charset=UTF-8',\r\n Accept: 'text/plain, */*; q=0.01',\r\n });\r\n if (publicKey) {\r\n headers.set('Public-Key', publicKey);\r\n }\r\n const { json } = await fetchJson(`${urlWithTenant}/accountSetup?token=${token}`, {\r\n method: 'put',\r\n headers: headers,\r\n body: JSON.stringify(Object.assign({ token }, account)),\r\n })\r\n .then(({ json }) => !!json)\r\n .catch(error => {\r\n notify(error || 'apihub.new_password.notifications.invalid_token', 'error');\r\n throw error;\r\n });\r\n};\r\n/**\r\n * This hook extracts the token from the url, fetch the account data and provides\r\n * a function to set up the account.\r\n *\r\n * It returns a tupple containing\r\n * - the current status of the form (prepare, fill, invalid_request and success)\r\n * - the account data to initialize the form\r\n * - a function to submit the new account data\r\n */\r\nexport const useAccountData = (location = window.location.href) => {\r\n const [state, setState] = useState('prepare');\r\n const [accountData, setAccountData] = useState(null);\r\n const [serverError, setServerError] = useState(null);\r\n const notify = useLayer7Notify();\r\n const { urlWithTenant, originHubName } = useApiHub();\r\n const token = extractTokenFromUrl(location);\r\n const [publicKey, encrypt] = usePasswordEncryption();\r\n useEffect(() => {\r\n if (state === 'prepare') {\r\n fetchAccountData(urlWithTenant, originHubName, token)\r\n .then((_a) => {\r\n var { email } = _a, rest = __rest(_a, [\"email\"]);\r\n const isVerified = !!email;\r\n if (isVerified) {\r\n setState('fill');\r\n setAccountData(Object.assign({ email }, rest));\r\n return;\r\n }\r\n throw Error('Cannot get account setup data');\r\n })\r\n .catch(() => {\r\n setAccountData(null);\r\n setState('invalid_request');\r\n });\r\n }\r\n }, [urlWithTenant, token, state, accountData, originHubName]);\r\n const handleSubmitAccountData = async (data) => {\r\n let finalData = data;\r\n if (publicKey) {\r\n finalData = Object.assign(Object.assign({}, data), { password: await encrypt(data.password) });\r\n }\r\n return submitAccountData(urlWithTenant, originHubName, token, notify, publicKey, finalData)\r\n .then(() => {\r\n setState('success');\r\n })\r\n .catch(error => {\r\n setServerError(error);\r\n setState('error');\r\n });\r\n };\r\n return [state, accountData, handleSubmitAccountData, serverError];\r\n};\r\n//# sourceMappingURL=useAccountData.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { Typography, LinearProgress, makeStyles } from '@material-ui/core';\r\nexport const AccountSetupPreparingForm = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.account_setup.notifications.prepare')),\r\n React.createElement(LinearProgress, null)));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n color: theme.palette.text.primary,\r\n },\r\n}), {\r\n name: 'Layer7AccountSetupPreparingForm',\r\n});\r\n//# sourceMappingURL=AccountSetupPreparingForm.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport { Tooltip } from '@material-ui/core';\r\nexport const textToHtml = text => text.replace(/\\n/g, '
');\r\nexport const HtmlTooltip = (_a) => {\r\n var { children, title } = _a, rest = __rest(_a, [\"children\", \"title\"]);\r\n const html = textToHtml(title);\r\n return (React.createElement(Tooltip, Object.assign({ title: React.createElement(\"div\", { dangerouslySetInnerHTML: {\r\n __html: html,\r\n } }), \"aria-label\": title }, rest), children));\r\n};\r\n//# sourceMappingURL=HtmlTooltip.js.map","import { useEffect, useState } from 'react';\r\nimport { useApiHub } from '../ApiHubContext';\r\nimport { getFetchJson } from '../fetchUtils';\r\nconst DEFAULT_SIGNUP_ENABLED = false;\r\nconst DEFAULT_SIMPLE_CREDENTIALS_ENABLED = true;\r\nconst DEFAULT_SSO_ENABLED = false;\r\nconst DEFAULT_TERMS_OF_USE = '';\r\nexport const fetchAuthenticationConfiguration = async (urlWithTenant, originHubName) => {\r\n const fetchJson = getFetchJson(originHubName);\r\n const { json } = await fetchJson(`${urlWithTenant}/cmsSettings`);\r\n return {\r\n signUpEnabled: json.REGISTRATION_STATUS === 'ENABLED',\r\n simpleCredentialsEnabled: json.REGISTRATION_REQUEST_WORKFLOW === 'ENABLED',\r\n ssoEnabled: json.SSO_ENABLED === 'true',\r\n termsOfUse: json.REGISTRATION_TERMS_OF_USE || DEFAULT_TERMS_OF_USE,\r\n };\r\n};\r\nexport const useAuthenticationConfiguration = (signUpEnabled = DEFAULT_SIGNUP_ENABLED, simpleCredentialsEnabled = DEFAULT_SIMPLE_CREDENTIALS_ENABLED, ssoEnabled = DEFAULT_SSO_ENABLED, termsOfUse = null) => {\r\n const { urlWithTenant, originHubName } = useApiHub();\r\n const [configuration, setConfiguration] = useState({\r\n signUpEnabled,\r\n simpleCredentialsEnabled,\r\n ssoEnabled,\r\n termsOfUse,\r\n });\r\n useEffect(() => {\r\n fetchAuthenticationConfiguration(urlWithTenant, originHubName).then(setConfiguration);\r\n }, [originHubName, urlWithTenant]);\r\n return configuration;\r\n};\r\n//# sourceMappingURL=useAuthenticationConfiguration.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Link } from 'react-router-dom';\r\nexport const AccountSetupInvalidRequest = () => {\r\n const translate = useTranslate();\r\n const classes = useStyles();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.account_setup.notifications.invalid_request')),\r\n React.createElement(Button, { color: \"primary\", variant: \"contained\", component: Link, to: \"/login\", className: classes.button }, translate('apihub.account_setup.actions.open_login_page'))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n color: theme.palette.error.main,\r\n },\r\n button: {},\r\n}), {\r\n name: 'Layer7AccountSetupInvalidRequest',\r\n});\r\n//# sourceMappingURL=AccountSetupInvalidRequest.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Link } from 'react-router-dom';\r\nexport const AccountSetupSuccess = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.account_setup.notifications.success')),\r\n React.createElement(Button, { color: \"primary\", variant: \"contained\", component: Link, to: \"/login\", className: classes.button }, translate('apihub.account_setup.actions.open_login_page'))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n color: theme.palette.success.main,\r\n },\r\n button: {},\r\n}), {\r\n name: 'Layer7AccountSetupSuccess',\r\n});\r\n//# sourceMappingURL=AccountSetupSuccess.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { Typography, LinearProgress, makeStyles } from '@material-ui/core';\r\nexport const NewPasswordVerifyingToken = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.new_password.notifications.verifying_token')),\r\n React.createElement(LinearProgress, null)));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n color: theme.palette.text.primary,\r\n },\r\n}), {\r\n name: 'Layer7NewPasswordVerifyingToken',\r\n});\r\n//# sourceMappingURL=NewPasswordVerifyingToken.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Link } from 'react-router-dom';\r\nexport const NewPasswordInvalidToken = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.new_password.notifications.invalid_token')),\r\n React.createElement(Button, { className: classes.button, color: \"primary\", variant: \"contained\", component: Link, to: \"/login\" }, translate('apihub.new_password.actions.open_login_page'))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n color: theme.palette.error.main,\r\n },\r\n button: {},\r\n}), {\r\n name: 'Layer7NewPasswordInvalidToken',\r\n});\r\n//# sourceMappingURL=NewPasswordInvalidToken.js.map","import React from 'react';\r\nimport { useTranslate } from 'ra-core';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Link } from 'react-router-dom';\r\nexport const NewPasswordSuccess = props => {\r\n const translate = useTranslate();\r\n const classes = useStyles(props);\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.new_password.notifications.confirmation')),\r\n React.createElement(Button, { className: classes.button, color: \"primary\", variant: \"contained\", component: Link, to: \"/login\" }, translate('apihub.new_password.actions.open_login_page'))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n color: theme.palette.success.main,\r\n },\r\n button: {},\r\n}), {\r\n name: 'Layer7NewPasswordSuccess',\r\n});\r\n//# sourceMappingURL=NewPasswordSuccess.js.map","import { useEffect, useState } from 'react';\r\nimport { useApiHub } from '../ApiHubContext';\r\nimport { getFetchJson } from '../fetchUtils';\r\nexport const fetchResetPassword = async (urlWithTenant, originHubName, username, publicKey) => {\r\n var cookies = document.cookie.split('; ');\r\n for (var c = 0; c < cookies.length; c++) {\r\n var d = window.location.hostname.split('.');\r\n while (d.length > 0) {\r\n var cookieBase = encodeURIComponent(cookies[c].split(';')[0].split('=')[0]) +\r\n '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' +\r\n d.join('.') +\r\n ' ;path=';\r\n // eslint-disable-next-line no-restricted-globals\r\n var p = location.pathname.split('/');\r\n document.cookie = cookieBase + '/';\r\n while (p.length > 0) {\r\n document.cookie = cookieBase + p.join('/');\r\n p.pop();\r\n }\r\n d.shift();\r\n }\r\n }\r\n const fetchJson = getFetchJson(originHubName);\r\n const headers = new Headers({\r\n 'Content-Type': 'application/json; charset=UTF-8',\r\n Accept: 'text/plain, */*; q=0.01',\r\n });\r\n if (publicKey) {\r\n headers.set('Public-Key', publicKey);\r\n }\r\n const { json } = await fetchJson(`${urlWithTenant}/reset-my-password`, {\r\n credentials: 'include',\r\n method: 'PUT',\r\n headers: headers,\r\n body: JSON.stringify({ userName: username }),\r\n });\r\n return await json;\r\n};\r\nexport const useResetPassword = () => {\r\n const { urlWithTenant, originHubName } = useApiHub();\r\n const [username, setUsername] = useState('');\r\n const [fetched, setFetched] = useState(false);\r\n useEffect(() => {\r\n if (!fetched && username !== '') {\r\n fetchResetPassword(urlWithTenant, originHubName, username).then(() => {\r\n setFetched(true);\r\n });\r\n }\r\n }, [urlWithTenant, fetched, username, originHubName]);\r\n return [username, setUsername];\r\n};\r\n//# sourceMappingURL=useResetPassword.js.map","import React from 'react';\r\nimport { useTranslate } from 'react-admin';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Link } from 'react-router-dom';\r\nexport const ResetPasswordConfirm = props => {\r\n const classes = useStyles(props);\r\n const translate = useTranslate();\r\n return (React.createElement(\"div\", { className: classes.root },\r\n React.createElement(Typography, { className: classes.title, variant: \"body1\", gutterBottom: true }, translate('apihub.reset_password_confirm.title')),\r\n React.createElement(Typography, { variant: \"subtitle1\", color: \"textSecondary\", className: classes.instructions }, translate('apihub.reset_password_confirm.form_details.instructions')),\r\n React.createElement(Typography, { variant: \"subtitle2\", color: \"textSecondary\", className: classes.description }, translate('apihub.reset_password_confirm.form_details.description')),\r\n React.createElement(Button, { className: classes.button, color: \"primary\", variant: \"contained\", component: Link, to: \"/login\" }, translate('apihub.reset_password_confirm.actions.open_login_page'))));\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n title: {\r\n marginBottom: theme.spacing(6),\r\n },\r\n instructions: {\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n description: {\r\n color: theme.palette.text.secondary,\r\n marginBottom: theme.spacing(6),\r\n },\r\n button: {},\r\n}), {\r\n name: 'Layer7ResetPasswordConfirm',\r\n});\r\n//# sourceMappingURL=ResetPasswordConfirm.js.map","import { dataProvider as getDataProvider } from 'layer7-apihub';\nimport { fetchUtils } from 'ra-core';\n\nexport const dataProvider = (baseUrl, tenantName) => {\n const defaultDataProvider = getDataProvider(baseUrl, tenantName);\n\n const proxy = new Proxy(fakeDataProvider, {\n get: (target, name) => {\n return async (resource, params) => {\n if (\n resource === 'apis' &&\n name === 'getList' &&\n params.filter.apiGroup\n ) {\n const apiUrl = `${baseUrl}/api/${tenantName}`;\n const { apiGroup, ...filter } = params.filter;\n const hasMoreFilters = Object.keys(filter).length > 0;\n const { json } = await fetchUtils.fetchJson(\n `${apiUrl}/api-management/1.0/api-groups/${params.filter.apiGroup}/apis`,\n {\n credentials: 'include',\n }\n );\n\n const apis = await Promise.all(\n json.map(({ uuid }) =>\n defaultDataProvider\n .getOne('apis', { id: uuid })\n .then(({ data }) => data)\n )\n );\n\n if (\n apis.length <= params.pagination.perPage &&\n !hasMoreFilters\n ) {\n return { data: apis, total: apis.length };\n }\n\n // Will contains the APIs matching all filters except apiGroup\n let filteredApis = false;\n\n if (hasMoreFilters) {\n filteredApis = (\n await defaultDataProvider.getList(resource, {\n ...params,\n filter,\n pagination: {\n page: 0,\n size: 1000,\n },\n })\n ).data;\n\n const apisFromGroup = filteredApis.filter(api =>\n apis.some(({ uuid }) => api.uuid === uuid)\n );\n\n return {\n data: apisFromGroup,\n total: apisFromGroup.length,\n };\n }\n }\n\n return defaultDataProvider[name](resource, params);\n };\n },\n });\n\n return proxy;\n};\n\n// Only used to configure the proxy\nconst fakeDataProvider = {\n create: () => Promise.resolve(null),\n delete: () => Promise.resolve(null),\n deleteMany: () => Promise.resolve(null),\n getList: () => Promise.resolve(null),\n getMany: () => Promise.resolve(null),\n getManyReference: () => Promise.resolve(null),\n getOne: () => Promise.resolve(null),\n update: () => Promise.resolve(null),\n updateMany: () => Promise.resolve(null),\n};\n","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport { CRUD_DELETE, useDelete, useTranslate, useRefresh } from 'ra-core';\r\nimport { useLayer7Notify } from '../../useLayer7Notify';\r\nexport const DeleteDocumentButton = (_a) => {\r\n var { document, entityType, entityUuid, hasChildren, onClick } = _a, rest = __rest(_a, [\"document\", \"entityType\", \"entityUuid\", \"hasChildren\", \"onClick\"]);\r\n const translate = useTranslate();\r\n const notify = useLayer7Notify();\r\n const refresh = useRefresh();\r\n const [deleteDocument] = useDelete('documents', document.id, document, {\r\n action: CRUD_DELETE,\r\n onSuccess: () => {\r\n notify('resources.documents.notifications.delete_success', 'info', {\r\n smart_count: 1,\r\n });\r\n refresh();\r\n onClick();\r\n },\r\n onFailure: error => {\r\n notify(error || 'resources.documents.notifications.delete_error', 'error');\r\n },\r\n });\r\n const handleDeleteDocument = () => {\r\n const shouldDelete = global.window.confirm(hasChildren\r\n ? translate('resources.documents.confirm_delete_document_with_children')\r\n : translate('resources.documents.confirm_delete_document_without_children'));\r\n if (shouldDelete) {\r\n deleteDocument();\r\n }\r\n };\r\n return React.createElement(Button, Object.assign({ onClick: handleDeleteDocument }, rest));\r\n};\r\n//# sourceMappingURL=DeleteDocumentButton.js.map","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null &&\n contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n"],"sourceRoot":""}