@abtnode/webapp 1.6.13 → 1.6.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/blocklet.js +14 -14
  2. package/blocklet.yml +1 -1
  3. package/build/asset-manifest.json +18 -18
  4. package/build/index.html +1 -1
  5. package/build/{precache-manifest.3f2f324f896d80671d77a0418c17d1c4.js → precache-manifest.8160f7a6905012f6d2b9083c688c5273.js} +16 -16
  6. package/build/service-worker.js +1 -1
  7. package/build/static/js/{15.da775437.chunk.js → 15.403af260.chunk.js} +1 -1
  8. package/build/static/js/{15.da775437.chunk.js.map → 15.403af260.chunk.js.map} +1 -1
  9. package/build/static/js/{19.fc33fa61.chunk.js → 19.41a7de9e.chunk.js} +1 -1
  10. package/build/static/js/{19.fc33fa61.chunk.js.map → 19.41a7de9e.chunk.js.map} +1 -1
  11. package/build/static/js/6.0f4641da.chunk.js +3 -0
  12. package/build/static/js/{6.573ea107.chunk.js.LICENSE.txt → 6.0f4641da.chunk.js.LICENSE.txt} +0 -0
  13. package/build/static/js/6.0f4641da.chunk.js.map +1 -0
  14. package/build/static/js/{8.27e60ccf.chunk.js → 8.b76851ef.chunk.js} +3 -3
  15. package/build/static/js/{8.27e60ccf.chunk.js.LICENSE.txt → 8.b76851ef.chunk.js.LICENSE.txt} +0 -0
  16. package/build/static/js/8.b76851ef.chunk.js.map +1 -0
  17. package/build/static/js/{main.9098ab8e.chunk.js → main.3a4f2117.chunk.js} +2 -2
  18. package/build/static/js/main.3a4f2117.chunk.js.map +1 -0
  19. package/build/static/js/{runtime-main.a7211655.js → runtime-main.75ac0b98.js} +2 -2
  20. package/build/static/js/{runtime-main.a7211655.js.map → runtime-main.75ac0b98.js.map} +1 -1
  21. package/package.json +1 -1
  22. package/build/static/js/6.573ea107.chunk.js +0 -3
  23. package/build/static/js/6.573ea107.chunk.js.map +0 -1
  24. package/build/static/js/8.27e60ccf.chunk.js.map +0 -1
  25. package/build/static/js/main.9098ab8e.chunk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../mocks/lib/jspdf.js","components/actions.js","components/passport-tag.js","components/button-group-with-actions.js","components/pagination-list.js","components/team/members/invite-member.js","components/team/members/passport-issuances.js","components/team/members/issue-passport.js","components/team/members/passports.js","components/team/members/toggle-user-approval.js","components/team/members/member.js","components/team/members/invitations.js","components/team/members/actions.js","components/team/members/index.js","components/team/passports/mutate-role.js","components/team/passports/detail.js","icons/long-arrow.svg","components/team/passports/trusted-issuer.js","components/team/passports/trusted-issuers.js","components/team/passports/index.js","pages/team/index.js","hooks/mobile-width.js","components/confirm.js","contexts/team.js","components/click-to-copy.js","components/table-icons.js","components/table.js","components/team/styles/list-header.js","components/team/search-input.js","hooks/persistent-sort.js"],"names":["module","exports","Actions","actions","props","useState","anchorEl","setAnchorEl","open","Boolean","onClose","e","stopPropagation","preventDefault","Div","aria-label","aria-controls","aria-haspopup","data-cy","onClick","currentTarget","id","keepMounted","PaperProps","map","action","close","icon","text","disabled","opts","dense","style","minWidth","marginRight","primary","defaultProps","styled","div","PassportTag","passport","onDelete","rest","Tag","title","name","className","span","ButtonWithActions","children","anchorRef","useRef","unfold","setUnfold","variant","color","rounded","size","undefined","aria-expanded","ref","pre","current","role","placement","disablePortal","onClickAway","contains","target","PaginationList","list","rowsPerPage","empty","t","useLocaleContext","page","setPage","useEffect","length","count","Math","ceil","offset","data","slice","emptyElement","Box","mt","display","justifyContent","Pagination","onChange","value","InviteMember","teamDid","roles","onCancel","onSuccess","onError","authInfo","api","useNodeContext","loading","setLoading","error","setError","activeStep","setActiveStep","inviteInfo","setInviteInfo","setRole","remark","setRemark","onCreate","a","trimRemark","trim","createInvitation","input","info","errMsg","formatError","step","body","Typography","component","FormControl","width","InputLabel","Select","fullWidth","label","onKeyPress","key","filter","d","r","MenuItem","marginTop","marginBottom","TextField","autoComplete","cancel","confirm","onConfirm","link","getInviteLink","inviteId","endpoint","Bold","expireDate","formatToDatetime","showCloseButton","autoFocus","DialogContentText","type","PassportIssuances","issuances","onRefresh","client","useContext","LocaleContext","findInterfaceWithAuthService","useBlockletContext","delConfirm","setDelConfirm","enqueueSnackbar","useSnackbar","deleteIssuance","deletePassportIssuance","sessionId","message","autoHideDuration","getLink","column","getIssuePassportLink","Issuance","permission","can","description","x","params","IssuePassport","ownerDid","createPassportIssuance","disableBackdropClick","disableEscapeKeyDown","minHeight","ConfirmDescription","useTeamContext","find","fontWeight","Passports","user","session","useSessionContext","teamIssuerDid","refreshTeam","refresh","enablePassportIssuance","trustedPassports","toggleConfirm","setToggleConfirm","showIssueDialog","setShowIssueDialog","search","setSearch","passports","get","revoked","status","PASSPORT_STATUS","REVOKED","togglePassportStatus","method","userDid","did","passportId","revokeInfo","hasPermission","revokable","issuer","filteredPassports","includes","placeholder","approved","fontSize","alignItems","src","createPassportSvg","issuerDid","alt","upperFirst","some","y","Tooltip","ErrorOutlineIcon","mr","item","height","ToggleUserApproval","sessionUser","nodeInfo","show","setShow","updateUserApproval","Toast","approveConfirm","nodeOwner","isNodeOwner","Member","initTab","setIssuances","setUser","tab","setTab","getData","doBatchQuery","getUser","getPassportIssuances","res","useSubscription","tabConfigs","fullName","email","updatedAt","createdAt","row","valueComponent","nameWidth","nameFormatter","tabs","Object","values","tabConfig","maxWidth","BlockButton","Center","avatar","backgroundColor","mx","newTab","scrollButtons","Invitations","invitations","usePersistentSort","sortDirections","onSortChange","deleteInvitation","sleep","console","invitedUserOnly","textAlign","margin","columns","field","defaultSort","render","sorting","align","icons","tableIcons","onOrderChange","options","emptyRowsWhenPaging","actionsColumnIndex","tableLayout","maxBodyHeight","pageSize","pageSizeOptions","localization","toolbar","searchPlaceholder","emptyDataSourceMessage","MemberActions","onIssuePassport","setEnablePassportIssuance","o","ListItemIcon","ListItemText","hasRole","z","MemberList","users","showInviteMember","setShowInviteMember","showInviting","setShowInviting","memberDialog","setMemberDialog","roleTab","setRoleTab","usersBySearch","toLowerCase","sideList","num","unshift","push","isInvitationEnabled","sortedUsers","sort","b","Date","lastLoginAt","forEach","isFromExternal","marginLeft","edge","paginateUsers","main","ml","SimpleInfo","copyable","moment","fromNow","theme","breakpoints","md","MutateRole","mode","setTitle","setDescription","_title","desc","replace","md5","createRole","updateRole","paddingTop","helperText","multiline","rows","PassportDetail","roleName","permissions","isNodeTeam","binds","setBinds","updateForm","setUpdateForm","cloneDeep","isProtected","isProtectedRole","deletePassport","deleteRole","team","getPermissionsByRole","permissionList","bindList","bind","onBind","grantNames","updatePermissionsForRole","success","readPermissionsOnly","IconButton","fill","FormControlLabel","control","Checkbox","checked","state","withPermission","_path","_excluded","_extends","assign","i","arguments","source","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_ref","svgRef","createElement","viewBox","ForwardRef","forwardRef","canSave","mappings","from","to","TrustedIssuer","setIssuerDid","setMappings","editIndex","findIndex","configTrustedPassports","trustedList","prepend","event","ROLES","GUEST","index","my","flexGrow","flexBasis","flexShrink","select","splice","TrustedIssuers","trustedIssuer","setTrustedIssuer","deleteTrustedIssuer","filteredIssuers","ListHeader","PassportList","teamName","showCreate","setShowCreate","showTrustedIssuers","setShowTrustedIssuers","toggleShowIssue","configPassportIssuance","enable","filteredRoles","borderRight","TeamPage","history","useHistory","useParams","members","Members","member","Main","useMobileWidth","useTheme","useMediaQuery","down","sm","ConfirmDialog","showCancel","initialParams","setParams","setOpen","changeLocale","onCallback","cb","isBreakpointsDownSm","StyledDialog","fullScreen","DialogTitle","DialogContent","Alert","severity","DialogActions","padding","__disableConfirm","Dialog","TeamContext","React","createContext","Provider","Consumer","TeamProvider","blocklets","setUsers","setInvitations","setRoles","setPermissions","blocklet","meta","getTeamName","getTrustedPassports","environments","getTeamIssuerDid","getEnablePassportIssuance","getRoles","getPermissions","getUsers","getInvitations","RBAC_CONFIG","ci","onUserEvent","ClickToCopy","tip","copiedTip","Add","Check","Delete","Edit","Clear","DetailPanel","NextPage","Filter","FirstPage","LastPage","PreviousPage","Search","ResetSearch","SortArrow","Export","ThirdStateCheck","ViewColumn","TableStyle","SearchInput","InputProps","startAdornment","initialDirections","useLocalStorage","setSortDirections","columnIndex","directionValue","newSortDirections","Array"],"mappings":"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","file":"static/js/19.fc33fa61.chunk.js","sourcesContent":["module.exports = {};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MoreHorizIcon from '@material-ui/icons/MoreHoriz';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\n\nexport default function Actions({ actions, ...props }) {\n const [anchorEl, setAnchorEl] = useState(null);\n\n const open = Boolean(anchorEl);\n\n const onOpen = e => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(e.currentTarget);\n };\n\n const onClose = e => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(null);\n };\n\n return (\n <Div {...props}>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"actions-menu\"\n aria-haspopup=\"true\"\n data-cy=\"actions-menu-icon\"\n onClick={onOpen}>\n <MoreHorizIcon />\n </IconButton>\n\n <Menu\n id=\"actions-menu\"\n data-cy=\"actions-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n onClose={onClose}\n PaperProps={{}}>\n {actions.map(action => {\n if (typeof action === 'function') {\n return action({ close: onClose });\n }\n const { icon, text, onClick, disabled = false, ...opts } = action;\n return (\n <MenuItem\n {...opts}\n disabled={disabled}\n dense\n onClick={e => {\n onClose();\n onClick(e);\n }}>\n <ListItemIcon style={{ minWidth: 24, marginRight: 8 }}>{icon}</ListItemIcon>\n <ListItemText primary={text} />\n </MenuItem>\n );\n })}\n </Menu>\n </Div>\n );\n}\n\nActions.propTypes = {\n actions: PropTypes.array,\n};\n\nActions.defaultProps = {\n actions: [],\n};\n\nconst Div = styled.div``;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nexport default function PassportTag(props) {\n const { passport, onDelete, ...rest } = props;\n return (\n <Tag {...rest}>\n {passport.title || passport.name}{' '}\n {!!onDelete && <CloseIcon data-cy=\"delete-issuance\" className=\"delete\" onClick={onDelete} />}\n </Tag>\n );\n}\n\nPassportTag.propTypes = {\n passport: PropTypes.object.isRequired,\n onDelete: PropTypes.func,\n};\n\nPassportTag.defaultProps = {\n onDelete: null,\n};\n\nconst Tag = styled.span`\n display: inline-flex;\n padding: 2px 8px;\n background: #4f6af6;\n border-radius: 4px;\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n color: #fff;\n align-items: center;\n .delete {\n font-size: 1em;\n margin-left: 6px;\n cursor: pointer;\n }\n`;\n","import React, { useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\nimport Popper from '@material-ui/core/Popper';\nimport Paper from '@material-ui/core/Paper';\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\nimport MenuList from '@material-ui/core/MenuList';\nimport ButtonGroup from '@arcblock/ux/lib/ButtonGroup';\nimport Button from '@arcblock/ux/lib/Button';\n\nexport default function ButtonWithActions({ actions, children }) {\n const anchorRef = useRef(null);\n const [unfold, setUnfold] = useState(false);\n\n const onToggle = () => {\n setUnfold(pre => !pre);\n };\n\n const onClose = e => {\n if (anchorRef.current && anchorRef.current.contains(e.target)) {\n return;\n }\n\n setUnfold(false);\n };\n\n return (\n <ButtonGroup variant=\"contained\" color=\"primary\" aria-label=\"split button\" rounded>\n {children}\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n aria-controls={unfold ? 'split-button-menu' : undefined}\n aria-expanded={unfold ? 'true' : undefined}\n ref={anchorRef}\n data-cy=\"trusted-issuers-more\"\n onClick={onToggle}>\n <ArrowDropDownIcon />\n </Button>\n <Popper\n open={unfold}\n anchorEl={anchorRef.current}\n role={undefined}\n placement=\"bottom-end\"\n disablePortal={false}\n className=\"popper\">\n <Paper>\n <ClickAwayListener onClickAway={onClose}>\n <MenuList id=\"split-button-menu\">{actions.map(action => action)}</MenuList>\n </ClickAwayListener>\n </Paper>\n </Popper>\n </ButtonGroup>\n );\n}\n\nButtonWithActions.propTypes = {\n actions: PropTypes.array,\n children: PropTypes.any,\n};\n\nButtonWithActions.defaultProps = {\n actions: [],\n children: null,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport Box from '@material-ui/core/Box';\nimport Pagination from '@material-ui/lab/Pagination';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nexport default function PaginationList({ list, rowsPerPage, children, empty }) {\n const { t } = useLocaleContext();\n const [page, setPage] = useState(1);\n\n useEffect(() => {\n setPage(1);\n }, [list.length]);\n\n const count = Math.ceil(list.length / rowsPerPage);\n const offset = (page - 1) * rowsPerPage;\n const data = list.slice(offset, offset + rowsPerPage);\n\n const emptyElement = empty !== undefined ? empty : <Empty>{t('common.empty')}</Empty>;\n\n return (\n <>\n {children(data)}\n {!list.length && emptyElement}\n {!!list.length && count > 1 && (\n <Box mt={2} display=\"flex\" justifyContent=\"flex-end\">\n <Pagination\n count={count}\n page={page}\n onChange={(e, value) => {\n setPage(value);\n }}\n />\n </Box>\n )}\n </>\n );\n}\n\nPaginationList.propTypes = {\n list: PropTypes.array,\n rowsPerPage: PropTypes.number,\n children: PropTypes.func,\n empty: PropTypes.element,\n};\n\nPaginationList.defaultProps = {\n list: [],\n rowsPerPage: 10,\n children: () => null,\n empty: undefined,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Typography from '@material-ui/core/Typography';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport ClickToCopy from '../../click-to-copy';\nimport { useNodeContext } from '../../../contexts/node';\nimport { formatError, getInviteLink, formatToDatetime } from '../../../libs/util';\n\nexport default function InviteMember({ teamDid, roles, onCancel, onSuccess, onError, authInfo }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [activeStep, setActiveStep] = useState(0);\n\n const [inviteInfo, setInviteInfo] = useState('');\n const [role, setRole] = useState('');\n const [remark, setRemark] = useState('');\n\n const onCreate = async () => {\n if (!role) {\n setError(t('team.member.error.passportEmpty'));\n return;\n }\n\n const trimRemark = remark.trim();\n\n setError(null);\n setLoading(true);\n\n try {\n const { inviteInfo: info } = await api.createInvitation({\n input: { teamDid, role, remark: trimRemark },\n });\n setInviteInfo(info);\n setActiveStep(1);\n } catch (err) {\n const errMsg = formatError(err);\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n const steps = [\n {\n body: (\n <Typography component=\"div\">\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"invite-member-select-role\"\n value={role}\n onChange={e => {\n setError(null);\n setRole(e.target.value);\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onCreate();\n }\n }}>\n {roles\n .filter(d => d.name !== 'owner')\n .map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`invite-member-select-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <div style={{ marginTop: 20, marginBottom: 10 }} />\n <TextField\n label={t('common.remark')}\n autoComplete=\"off\"\n variant=\"outlined\"\n fullWidth\n style={{ marginBottom: 8 }}\n value={remark}\n onChange={e => {\n setError(null);\n setRemark(e.target.value);\n }}\n disabled={loading}\n data-cy=\"invite-member-input-remark\"\n />\n <div style={{ marginTop: 20, marginBottom: 10 }} />\n </Typography>\n ),\n cancel: t('common.cancel'),\n confirm: t('team.member.inviteDialog.createInviteLink'),\n onCancel,\n onConfirm: onCreate,\n },\n {\n body: () => {\n const link = getInviteLink({\n inviteId: inviteInfo.inviteId,\n endpoint: authInfo.endpoint,\n });\n return (\n <div>\n <Bold>\n {t('team.member.inviteDialog.createSuccessTip', { expireDate: formatToDatetime(inviteInfo.expireDate) })}\n </Bold>\n <div style={{ marginTop: '40px' }} />\n <ClickToCopy>{link}</ClickToCopy>\n </div>\n );\n },\n confirm: t('common.confirm'),\n onConfirm: onSuccess,\n },\n ];\n const step = steps[activeStep];\n\n return (\n <Dialog\n title={t('common.invite')}\n fullWidth\n open\n showCloseButton={false}\n actions={\n <>\n {step.cancel && (\n <Button onClick={step.onCancel} color=\"default\" rounded size=\"small\">\n {step.cancel}\n </Button>\n )}\n <Button\n onClick={step.onConfirm}\n color=\"primary\"\n size=\"small\"\n disabled={loading || !role}\n variant=\"contained\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {step.confirm}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">{typeof step.body === 'function' ? step.body() : step.body}</DialogContentText>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\">\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nInviteMember.propTypes = {\n teamDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n roles: PropTypes.array,\n authInfo: PropTypes.object,\n};\n\nInviteMember.defaultProps = {\n onError: () => {},\n roles: [],\n authInfo: {},\n};\n\nconst Bold = styled.div`\n font-size: 16px;\n font-weight: bold;\n`;\n","/* eslint-disable react/prop-types */\nimport React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport { useSnackbar } from 'notistack';\nimport Box from '@material-ui/core/Box';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport Confirm from '../../confirm';\nimport Permission from '../../permission';\nimport ClickToCopy from '../../click-to-copy';\nimport PassportTag from '../../passport-tag';\nimport { getIssuePassportLink, formatToDatetime } from '../../../libs/util';\n\nexport default function PassportIssuances({ issuances, teamDid, onRefresh }) {\n const { api: client } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const { findInterfaceWithAuthService } = useBlockletContext();\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n const { enqueueSnackbar } = useSnackbar();\n\n const deleteIssuance = async ({ id }) => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await client.deletePassportIssuance({ input: { teamDid, sessionId: id } });\n onRefresh();\n } catch (error) {\n enqueueSnackbar(error.message, { autoHideDuration: 5000, variant: 'error' });\n } finally {\n setLoading(false);\n setDelConfirm(null);\n }\n };\n\n const onCancel = () => {\n setLoading(false);\n setDelConfirm(null);\n };\n\n const authInfo = findInterfaceWithAuthService(teamDid);\n\n const getLink = column => (authInfo ? getIssuePassportLink({ id: column.id, endpoint: authInfo.endpoint }) : '');\n\n // eslint-disable-next-line react/prop-types\n const Issuance = ({ data: d }) => (\n <div className=\"issuance\">\n <Box display=\"flex\" justifyContent=\"space-between\">\n <Permission permission=\"mutate_team\">\n {can =>\n can ? (\n <PassportTag\n passport={{ title: d.title, name: d.name }}\n onDelete={() =>\n setDelConfirm({\n title: t('team.passport.issuance.delete.title'),\n description: t('team.passport.issuance.delete.description', { link: getLink(d) }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n deleteIssuance(d);\n },\n onCancel,\n })\n }\n />\n ) : (\n <PassportTag passport={{ title: d.title, name: d.name }} />\n )\n }\n </Permission>\n <div style={{ color: '#999' }}>\n {t('common.expires')}\n :&nbsp;\n {formatToDatetime(d.expireDate)}\n </div>\n </Box>\n <Box mt={2}>\n <ClickToCopy>{getLink(d)}</ClickToCopy>\n </Box>\n </div>\n );\n\n return (\n <Div>\n {issuances.map(x => (\n <Issuance data={x} />\n ))}\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .MuiTableHead-root {\n display: none;\n }\n .issuance {\n padding: 16px 0;\n border-bottom: 1px solid #f0f0f0;\n .MuiTypography-root {\n display: inline-block;\n width: 100%;\n background: #f3f3f3;\n border-radius: 4px;\n padding-top: 6px;\n padding-bottom: 6px;\n }\n }\n`;\n\nPassportIssuances.propTypes = {\n teamDid: PropTypes.string.isRequired,\n issuances: PropTypes.array,\n onRefresh: PropTypes.func,\n};\n\nPassportIssuances.defaultProps = {\n issuances: [],\n onRefresh: () => {},\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Typography from '@material-ui/core/Typography';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { formatError } from '../../../libs/util';\n\nexport default function IssuePassport({ teamDid, ownerDid, roles, onCancel, onSuccess, onError }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [role, setRole] = useState('');\n\n const onCreate = async () => {\n if (!role) {\n setError(t('team.member.error.passportEmpty'));\n return;\n }\n\n setError(null);\n setLoading(true);\n\n try {\n await api.createPassportIssuance({ input: { teamDid, name: role, ownerDid } });\n onSuccess();\n } catch (err) {\n const errMsg = formatError(err);\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog\n title={t('team.passport.issue')}\n fullWidth\n open\n onClick={e => e.stopPropagation()}\n onClose={onCancel}\n disableBackdropClick\n disableEscapeKeyDown\n PaperProps={{ style: { minHeight: 'auto' } }}\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded size=\"small\">\n {t('common.cancel')}\n </Button>\n <Button\n onClick={onCreate}\n color=\"primary\"\n size=\"small\"\n disabled={loading || !role}\n variant=\"contained\"\n autoFocus\n data-cy=\"issue-passport-create-btn\"\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {t('team.passport.issuance.create.title')}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">\n <Typography component=\"div\">\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"issue-passport-select-passport\"\n value={role}\n onChange={e => {\n setError(null);\n setRole(e.target.value);\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onCreate();\n }\n }}>\n {roles\n .filter(d => d.name !== 'owner')\n .map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`issue-passport-select-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Typography>\n </DialogContentText>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\">\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nIssuePassport.propTypes = {\n teamDid: PropTypes.string.isRequired,\n ownerDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n roles: PropTypes.array,\n};\n\nIssuePassport.defaultProps = {\n onError: () => {},\n roles: [],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { useSnackbar } from 'notistack';\nimport get from 'lodash/get';\nimport upperFirst from 'lodash/upperFirst';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Box from '@material-ui/core/Box';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport RevokeIcon from '@arcblock/icons/lib/RevokeIcon';\nimport ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport { PASSPORT_STATUS } from '@abtnode/constant';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useSessionContext } from '../../../contexts/session';\nimport { useTeamContext } from '../../../contexts/team';\nimport { formatError, createPassportSvg } from '../../../libs/util';\nimport Confirm from '../../confirm';\nimport Permission from '../../permission';\nimport SearchInput from '../search-input';\nimport ListHeader from '../styles/list-header';\nimport IssuePassport from './issue-passport';\n\nconst ConfirmDescription = ({ action, passport }) => {\n const { t } = useLocaleContext();\n const { roles } = useTeamContext();\n const role = roles.find(x => x.name === passport.role);\n return (\n <div>\n <div>\n {action === 'enable' ? t('team.member.enablePassportDescription') : t('team.member.revokePassportDescription')}\n </div>\n {role && (\n <Box mt={3} fontWeight=\"bold\">\n {t('team.member.passportPermissionTitle')}\n </Box>\n )}\n {role && <Box mt={1}>{role.description}</Box>}\n </div>\n );\n};\nConfirmDescription.propTypes = {\n action: PropTypes.string.isRequired,\n passport: PropTypes.object.isRequired,\n};\nConfirmDescription.defaultProps = {};\n\nexport default function Passports({ user, onCreate }) {\n const { t } = useLocaleContext();\n const { session } = useSessionContext();\n const {\n roles,\n teamDid,\n teamIssuerDid,\n refresh: refreshTeam,\n enablePassportIssuance,\n trustedPassports,\n } = useTeamContext();\n const { api } = useNodeContext();\n const { enqueueSnackbar } = useSnackbar();\n const [loading, setLoading] = useState(false);\n const [toggleConfirm, setToggleConfirm] = useState(null);\n const [showIssueDialog, setShowIssueDialog] = useState(false);\n const [search, setSearch] = useState('');\n\n const passports = (get(user, 'passports') || []).map(x => ({ ...x, revoked: x.status === PASSPORT_STATUS.REVOKED }));\n\n const togglePassportStatus = async passport => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n const method = passport.status === PASSPORT_STATUS.REVOKED ? 'enableUserPassport' : 'revokeUserPassport';\n await api[method]({ input: { teamDid, userDid: user.did, passportId: passport.id } });\n refreshTeam();\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 5000, variant: 'error' });\n } finally {\n setLoading(false);\n setToggleConfirm(null);\n }\n };\n\n const confirmToggle = item =>\n item.status === PASSPORT_STATUS.REVOKED\n ? setToggleConfirm({\n title: t('team.member.enablePassport'),\n description: <ConfirmDescription action=\"enable\" passport={item} />,\n confirm: t('common.enable'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n togglePassportStatus(item);\n },\n onCancel: () => {\n setLoading(false);\n setToggleConfirm(null);\n },\n color: 'primary',\n })\n : setToggleConfirm({\n title: t('team.member.revokePassport'),\n description: <ConfirmDescription action=\"revoke\" passport={item} />,\n confirm: t('common.revoke'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n togglePassportStatus(item);\n },\n onCancel: () => {\n setLoading(false);\n setToggleConfirm(null);\n },\n });\n\n const revokeInfo = (hasPermission, passport) => {\n if (user.did === session.user.did && session.user.passportId && session.user.passportId === passport.id) {\n return {\n revokable: false,\n message: t('team.passport.shouldNotDeleteCurrent'),\n };\n }\n\n if (!hasPermission) {\n return {\n revokable: false,\n message: t('team.passport.noPermission'),\n };\n }\n\n if (teamDid === passport.issuer.id && passport.name === 'owner') {\n return {\n revokable: false,\n message: t('team.passport.noPermission'),\n };\n }\n\n return {\n revokable: true,\n };\n };\n\n const filteredPassports = passports.filter(x => !search || x.title.includes(search) || x.name.includes(search));\n\n return (\n <Div>\n <ListHeader>\n <div className=\"left\">\n <SearchInput\n placeholder={t('team.passport.search')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n />\n </div>\n <div className=\"right\">\n {enablePassportIssuance && !!user.approved && (\n <Permission permission=\"mutate_team\">\n <Button\n variant=\"contained\"\n rounded\n color=\"primary\"\n data-cy=\"issue-passport\"\n onClick={() => setShowIssueDialog(true)}>\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.passport.issue')}\n </Button>\n </Permission>\n )}\n </div>\n </ListHeader>\n\n <Box>\n {filteredPassports.map(x => (\n <Permission permission=\"mutate_team\">\n {can => (\n <Box className=\"passport-item\" display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mt={3}>\n <Box display=\"flex\" alignItems=\"center\">\n <div>\n <img\n style={{ width: 120 }}\n src={createPassportSvg({\n issuer: x.issuer && x.issuer.name,\n issuerDid: x.issuer && x.issuer.id,\n title: x.title || x.name,\n })}\n alt={x.title}\n />\n </div>\n <div className=\"body\">\n <Box className=\"title\" display=\"flex\" alignItems=\"center\">\n {upperFirst(x.title)}\n <div className=\"status-icons\">\n {!!teamIssuerDid && x.issuer.id !== teamIssuerDid && <ExternalIssuerIcon />}\n {x.revoked && <RevokeIcon />}\n </div>\n </Box>\n {!!teamIssuerDid && x.issuer.id !== teamIssuerDid && (\n <div className=\"tip\">\n {x.issuer.id !== teamIssuerDid && !trustedPassports.some(y => y.issuerDid === x.issuer.id) && (\n <Tooltip title={t('team.passport.notTrustedIssuerTip')}>\n <Box\n component={ErrorOutlineIcon}\n style={{ fontSize: '1.3em' }}\n color=\"error.main\"\n mr={0.5}\n />\n </Tooltip>\n )}\n <span>{t('team.passport.issueBy', { name: x.issuer.name })}</span>\n </div>\n )}\n </div>\n </Box>\n <Box>\n {revokeInfo(can, x).revokable ? (\n <Button\n variant=\"outlined\"\n rounded\n color={x.revoked ? 'primary' : 'secondary'}\n onClick={() => confirmToggle(x)}>\n {x.revoked ? (\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n ) : (\n <RevokeIcon style={{ height: 16, marginRight: 4 }} />\n )}\n {x.revoked ? t('common.enable') : t('common.revoke')}\n </Button>\n ) : (\n <Tooltip title={revokeInfo(can, x).message}>\n <ErrorOutlineIcon style={{ color: '#ddd' }} />\n </Tooltip>\n )}\n </Box>\n </Box>\n )}\n </Permission>\n ))}\n {!filteredPassports.length && <Empty>{t('common.empty')}</Empty>}\n </Box>\n\n {showIssueDialog && (\n <IssuePassport\n teamDid={teamDid}\n ownerDid={user.did}\n roles={roles}\n onCancel={() => setShowIssueDialog(false)}\n onSuccess={() => {\n onCreate();\n setShowIssueDialog(false);\n }}\n />\n )}\n\n {toggleConfirm && (\n <Confirm\n title={toggleConfirm.title}\n description={toggleConfirm.description}\n confirm={toggleConfirm.confirm}\n cancel={toggleConfirm.cancel}\n params={toggleConfirm.params}\n onConfirm={toggleConfirm.onConfirm}\n onCancel={toggleConfirm.onCancel}\n color={toggleConfirm.color}\n />\n )}\n </Div>\n );\n}\n\nPassports.propTypes = {\n user: PropTypes.object.isRequired,\n onCreate: PropTypes.func,\n};\n\nPassports.defaultProps = {\n onCreate: () => {},\n};\n\nconst Div = styled.div`\n .passport-item {\n .body {\n padding: 0;\n margin-left: 24px;\n margin-top: 0;\n }\n .title {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #222222;\n }\n .tip {\n display: flex;\n align-items: center;\n font-size: 14px;\n margin-top: 6px;\n color: #bbb;\n }\n .status-icons {\n svg {\n fill: #bfbfbf;\n height: 1.2em;\n margin-left: 0.4em;\n }\n }\n .MuiButton-outlinedSecondary {\n color: #f16e6e;\n fill: #f16e6e;\n background: #fcf3f3;\n border: 0;\n &:hover {\n border: 0;\n }\n }\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Confirm from '../../confirm';\nimport Toast from '../../toast';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { useSessionContext } from '../../../contexts/session';\nimport { formatError } from '../../../libs/util';\n\nconst isNodeOwner = (nodeInfo, userDid) => nodeInfo.nodeOwner.did === userDid;\nconst isSelf = (sessionUser, userDid) => sessionUser && sessionUser.did === userDid;\n\nexport default function ToggleUserApproval({ user, onCancel, onSuccess, onError, children }) {\n const { api, info: nodeInfo } = useNodeContext();\n const { session } = useSessionContext();\n const { teamDid, refresh } = useTeamContext();\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [show, setShow] = useState(false);\n\n const open = () => setShow(true);\n\n const updateUserApproval = async d => {\n const { did, approved } = d;\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await api.updateUserApproval({\n input: {\n teamDid,\n user: {\n did,\n approved: !approved,\n },\n },\n });\n setShow(false);\n onSuccess();\n refresh();\n } catch (error) {\n Toast.error(formatError(error));\n onError();\n } finally {\n setLoading(false);\n }\n };\n\n const approveConfirm = {\n title: user.approved ? t('team.member.forbidLogin') : t('team.member.allowLogin'),\n description: user.approved ? t('team.member.forbidLoginDescription') : t('team.member.allowLoginDescription'),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n updateUserApproval(user);\n },\n onCancel: () => {\n setLoading(false);\n setShow(false);\n onCancel();\n },\n color: user.approved ? 'danger' : 'primary',\n };\n\n const can = nodeInfo.nodeOwner && !isNodeOwner(nodeInfo, user.did) && !isSelf(session.user, user.did);\n\n if (!can) {\n return null;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ can, open }) : children}\n\n {show ? (\n <Confirm\n title={approveConfirm.title}\n description={approveConfirm.description}\n confirm={approveConfirm.confirm}\n cancel={approveConfirm.cancel}\n params={approveConfirm.params}\n onConfirm={approveConfirm.onConfirm}\n onCancel={approveConfirm.onCancel}\n color={approveConfirm.color}\n />\n ) : null}\n </>\n );\n}\n\nToggleUserApproval.propTypes = {\n user: PropTypes.object,\n onSuccess: PropTypes.func,\n onCancel: PropTypes.func,\n onError: PropTypes.func,\n children: PropTypes.object,\n};\n\nToggleUserApproval.defaultProps = {\n user: {},\n onSuccess: () => {},\n onCancel: () => {},\n onError: () => {},\n children: null,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { useSnackbar } from 'notistack';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Box from '@material-ui/core/Box';\nimport Avatar from '@material-ui/core/Avatar';\n\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport ForbidLoginIcon from '@arcblock/icons/lib/ForbidLoginIcon';\nimport AllowLoginIcon from '@arcblock/icons/lib/AllowLoginIcon';\n\nimport Permission from '../../permission';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { formatError, formatToDatetime } from '../../../libs/util';\nimport { useSubscription } from '../../../libs/ws';\nimport PassportIssuances from './passport-issuances';\nimport Passports from './passports';\nimport ToggleUserApproval from './toggle-user-approval';\n\nexport default function Member({ userDid, onCancel, initTab }) {\n const { api } = useNodeContext();\n const { roles, teamDid, enablePassportIssuance } = useTeamContext();\n const { t } = useLocaleContext();\n const [issuances, setIssuances] = useState(null);\n const [user, setUser] = useState(null);\n const { enqueueSnackbar } = useSnackbar();\n const [tab, setTab] = useState(initTab || 'info');\n\n const getData = async () => {\n try {\n const res = await api.doBatchQuery({\n getUser: { input: { teamDid, user: { did: userDid } } },\n getPassportIssuances: { input: { teamDid, ownerDid: userDid } },\n });\n setUser(res.getUser.user || {});\n setIssuances(res.getPassportIssuances.list || []);\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 5000, variant: 'error' });\n }\n };\n\n useEffect(() => {\n if (teamDid) {\n getData();\n }\n }, [userDid, teamDid]); // eslint-disable-line\n\n const onUserEvent = data => {\n if (data.teamDid === teamDid && data.user && data.user.did === userDid) {\n getData();\n }\n };\n\n useSubscription('user.updated', onUserEvent, [userDid, teamDid]);\n\n useEffect(() => {\n if (issuances && !issuances.length && tab === 'issuances') {\n setTab('info');\n }\n }, [issuances]); // eslint-disable-line\n\n // tab\n const Info = () => {\n const rows = user\n ? [\n { name: t('team.member.name'), value: user.fullName },\n { name: t('common.email'), value: user.email },\n { name: t('team.member.allowLogin'), value: user.approved ? t('common.yes') : t('common.no') },\n { name: t('team.member.lastLogin'), value: formatToDatetime(user.updatedAt) },\n { name: t('common.createdAt'), value: formatToDatetime(user.createdAt) },\n { name: t('common.remark'), value: user.remark || '--' },\n ].filter(Boolean)\n : [];\n\n return rows.map(row => {\n if (row.name === t('common.did')) {\n return (\n <InfoRow\n valueComponent=\"div\"\n key={row.name}\n nameWidth={120}\n name={row.name}\n nameFormatter={() => t('common.did')}>\n {row.value}\n </InfoRow>\n );\n }\n\n return (\n <InfoRow\n style={{ alignItems: 'flex-start' }}\n valueComponent=\"div\"\n key={row.name}\n nameWidth={120}\n name={row.name}>\n {row.value}\n </InfoRow>\n );\n });\n };\n\n const tabConfigs = {\n info: {\n label: t('common.basicInfo'),\n value: 'info',\n component: Info,\n },\n passports: {\n label: t('common.passport'),\n value: 'passports',\n component: () => (\n <Passports\n user={user}\n teamDid={teamDid}\n roles={roles}\n onCreate={() => {\n getData(teamDid);\n setTab('issuances');\n }}\n onRefresh={() => {\n getData(teamDid);\n }}\n />\n ),\n },\n issuances: {\n label: t('team.passport.issuance.pending'),\n value: 'issuances',\n component: () => (\n <PassportIssuances issuances={issuances || []} teamDid={teamDid} onRefresh={() => getData(teamDid)} />\n ),\n },\n };\n\n const tabs = Object.values(tabConfigs)\n .map(({ label, value }) => ({ label, value }))\n .filter(x => {\n if (x.value === 'issuances') {\n return enablePassportIssuance && issuances && !!issuances.length;\n }\n\n return true;\n });\n const tabConfig = tabConfigs[tab] || tabConfigs.info;\n const onTabChange = newTab => {\n setTab(newTab);\n };\n\n return (\n <Dialog\n title={t('common.member')}\n onClose={onCancel}\n open\n PaperProps={{ style: { maxWidth: 632, minHeight: '80vh' } }}\n fullWidth\n actions={\n user && (\n <Permission permission=\"mutate_team\">\n <ToggleUserApproval user={user}>\n {({ open }) => (\n <BlockButton onClick={open}>\n {user.approved ? (\n <ForbidLoginIcon style={{ fontSize: '1.2em', marginRight: '0.4em' }} />\n ) : (\n <AllowLoginIcon style={{ fontSize: '1.2em', marginRight: '0.4em' }} />\n )}\n {user.approved ? t('team.member.forbidLogin') : t('team.member.allowLogin')}\n </BlockButton>\n )}\n </ToggleUserApproval>\n </Permission>\n )\n }>\n <Div>\n {!user && (\n <Center>\n <Spinner />\n </Center>\n )}\n\n {user && (\n <div>\n {/* info */}\n <Box display=\"flex\" alignItems=\"center\" className=\"info\">\n <Avatar\n src={user.avatar}\n style={{ width: 48, height: 48, backgroundColor: 'transparent', marginRight: 16 }}\n />\n <Box>\n <Box className=\"name\">{user.fullName}</Box>\n <Box className=\"did\" mt={1}>\n <DidAddress>{user.did}</DidAddress>\n </Box>\n </Box>\n </Box>\n\n {/* tabs */}\n <Box mx={3} className=\"tabs\">\n <Tabs tabs={tabs} current={tab} onChange={onTabChange} scrollButtons=\"auto\" />\n </Box>\n\n {/* body */}\n <div className=\"body\">\n <tabConfig.component />\n </div>\n </div>\n )}\n </Div>\n </Dialog>\n );\n}\n\nMember.propTypes = {\n userDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n initTab: PropTypes.string,\n};\n\nMember.defaultProps = {\n initTab: 'info',\n};\n\nconst Div = styled.div`\n .info {\n .name {\n font-weight: 500;\n font-size: 18px;\n line-height: 25px;\n color: #222222;\n }\n }\n\n .tabs {\n margin-top: 24px;\n margin-left: 0;\n margin-right: 0;\n }\n\n .body {\n margin-top: 24px;\n }\n`;\n\nconst Center = styled.div`\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n`;\n\nconst BlockButton = styled.div`\n flex-shrink: 0;\n width: 100%;\n height: 64px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n color: #999;\n fill: #999;\n font-size: 16px;\n border-top: 1px solid #f0f0f0;\n position: sticky;\n bottom: 0;\n background: #fff;\n z-index: 10;\n`;\n","import React, { useContext, useState } from 'react';\nimport styled from 'styled-components';\n\nimport MaterialTable from 'material-table';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport Confirm from '../../confirm';\nimport tableIcons from '../../table-icons';\nimport TableStyle from '../../table';\nimport usePersistentSort from '../../../hooks/persistent-sort';\nimport Permission from '../../permission';\nimport ClickToCopy from '../../click-to-copy';\nimport { sleep, getInviteLink, formatToDatetime } from '../../../libs/util';\n\nexport default function Invitations() {\n const { api: client } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const { findInterfaceWithAuthService } = useBlockletContext();\n const { teamDid, invitations, refresh } = useTeamContext();\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n\n const { sortDirections, onSortChange } = usePersistentSort('invitations', ['', '', '', '', '', '']);\n\n const deleteInvitation = async ({ inviteId }) => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await client.deleteInvitation({ input: { teamDid, inviteId } });\n refresh();\n await sleep(800);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setDelConfirm(null);\n }\n };\n\n const onCancel = () => {\n setLoading(false);\n setDelConfirm(null);\n };\n\n const authInfo = findInterfaceWithAuthService(teamDid);\n\n const isInvitationEnabled = authInfo && authInfo.invitedUserOnly;\n if (!isInvitationEnabled) {\n return <h2 style={{ textAlign: 'center', margin: '100px 0', color: '#bbb' }}>{t('team.inviting.disabledTip')}</h2>;\n }\n\n const getLink = column => {\n if (!authInfo) {\n return '';\n }\n return getInviteLink({ inviteId: column.inviteId, endpoint: authInfo.endpoint });\n };\n\n const columns = [\n {\n title: t('team.inviting.link'),\n field: 'inviteId',\n defaultSort: sortDirections[0],\n render: d => {\n if (!authInfo) {\n return null;\n }\n return <ClickToCopy>{getLink(d)}</ClickToCopy>;\n },\n },\n {\n title: t('common.remark'),\n field: 'remark',\n defaultSort: sortDirections[1],\n render: d => d.remark || '--',\n },\n {\n title: t('team.inviting.inviter'),\n field: 'inviter.fullName',\n defaultSort: sortDirections[2],\n },\n {\n title: t('common.expires'),\n field: 'inviter.expireDate',\n defaultSort: sortDirections[3],\n render: d => formatToDatetime(d.expireDate),\n },\n {\n title: t('common.actions'),\n sorting: false,\n align: 'center',\n render: item => (\n <Permission permission=\"mutate_team\">\n <Button\n rounded\n onClick={() =>\n setDelConfirm({\n title: t('team.inviting.delete.title'),\n description: t('team.inviting.delete.description', { link: getLink(item) }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => deleteInvitation(item),\n onCancel,\n })\n }\n size=\"small\"\n color=\"danger\"\n variant=\"text\">\n <DeleteIcon style={{ fontSize: '1.2em' }} />\n {t('common.delete')}\n </Button>\n </Permission>\n ),\n },\n ];\n\n return (\n <Div>\n <TableStyle>\n {invitations.length ? (\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n onOrderChange={onSortChange}\n options={{\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n search: false,\n pageSize: 20,\n pageSizeOptions: [20, 50, 100],\n }}\n localization={{\n toolbar: { searchPlaceholder: t('common.search') },\n body: {\n emptyDataSourceMessage: t('common.noData'),\n },\n }}\n data={invitations}\n />\n ) : (\n <Empty>{t('common.empty')}</Empty>\n )}\n </TableStyle>\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .table-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 20px;\n font-size: 14px;\n }\n`;\n\nInvitations.propTypes = {};\n\nInvitations.defaultProps = {};\n","import React, { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport MenuItem from '@material-ui/core/MenuItem';\nimport AddIcon from '@material-ui/icons/Add';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ForbidLoginIcon from '@arcblock/icons/lib/ForbidLoginIcon';\nimport AllowLoginIcon from '@arcblock/icons/lib/AllowLoginIcon';\n\nimport { useTeamContext } from '../../../contexts/team';\nimport Actions from '../../actions';\nimport IssuePassport from './issue-passport';\nimport ToggleUserApproval from './toggle-user-approval';\n\nexport default function MemberActions({ user, onIssuePassport }) {\n const { teamDid, roles } = useTeamContext();\n const { t } = useContext(LocaleContext);\n const [enablePassportIssuance, setEnablePassportIssuance] = useState(false);\n\n return (\n <>\n <Actions\n data-cy=\"member-actions\"\n actions={[\n {\n icon: <AddIcon fontSize=\"small\" />,\n text: t('team.passport.issue'),\n 'data-cy': 'action-issue-passport',\n onClick: e => {\n e.stopPropagation();\n setEnablePassportIssuance(true);\n },\n },\n ({ close }) => (\n <ToggleUserApproval user={user}>\n {({ open: o }) => (\n <MenuItem\n dense\n key=\"toggle-approval\"\n onClick={e => {\n e.stopPropagation();\n close();\n o(e);\n }}\n data-cy=\"action-toggle-block\">\n <ListItemIcon style={{ minWidth: 24, marginRight: 8 }}>\n {user.approved ? <ForbidLoginIcon /> : <AllowLoginIcon />}\n </ListItemIcon>\n <ListItemText primary={user.approved ? t('team.member.forbidLogin') : t('team.member.allowLogin')} />\n </MenuItem>\n )}\n </ToggleUserApproval>\n ),\n ]}\n />\n {enablePassportIssuance && (\n <IssuePassport\n teamDid={teamDid}\n ownerDid={user.did}\n roles={roles}\n onCancel={() => setEnablePassportIssuance(false)}\n onSuccess={() => {\n onIssuePassport();\n setEnablePassportIssuance(false);\n }}\n />\n )}\n </>\n );\n}\n\nMemberActions.propTypes = {\n user: PropTypes.object.isRequired,\n onIssuePassport: PropTypes.func,\n};\n\nMemberActions.defaultProps = {\n onIssuePassport: () => {},\n};\n","import React, { useContext, useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport moment from 'moment';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Box from '@material-ui/core/Box';\nimport AddIcon from '@material-ui/icons/Add';\nimport Address from '@arcblock/did-connect/lib/Address';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport PersonIcon from '@arcblock/icons/lib/PersonIcon';\nimport ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';\n\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport { useTeamContext } from '../../../contexts/team';\nimport PaginationList from '../../pagination-list';\nimport Permission from '../../permission';\nimport ListHeader from '../styles/list-header';\nimport SearchInput from '../search-input';\nimport InviteMember from './invite-member';\nimport Member from './member';\nimport Invitations from './invitations';\nimport Actions from './actions';\n\nconst ROLE_NONE = '__none__';\n\nconst hasRole = (user, role) => {\n if (role === ROLE_NONE) {\n return !user.passports || !user.passports.length;\n }\n\n return (user.passports || []).some(z => z.role === role);\n};\n\nconst isFromExternal = (user, teamIssuerDid) => {\n const list = user.passports || [];\n if (!list.length) {\n return false;\n }\n\n return !list.some(z => z.issuer.id === teamIssuerDid);\n};\n\nexport default function MemberList() {\n const { teamDid, teamIssuerDid, users, invitations, roles, refresh, enablePassportIssuance } = useTeamContext();\n const { findInterfaceWithAuthService } = useBlockletContext();\n const { t } = useContext(LocaleContext);\n const [showInviteMember, setShowInviteMember] = useState(false);\n const [showInviting, setShowInviting] = useState(false);\n const [memberDialog, setMemberDialog] = useState(false); // member, inviting\n const [roleTab, setRoleTab] = useState('all');\n const [search, setSearch] = useState('');\n\n const usersBySearch = users.filter(\n x => !search || x.did.includes(search) || x.fullName.toLowerCase().includes(search.toLowerCase())\n );\n\n const sideList = (roles || []).map(x => ({\n name: x.name,\n title: x.title,\n num: (usersBySearch || []).filter(y => hasRole(y, x.name)).length || 0,\n }));\n sideList.unshift({\n name: 'all',\n title: 'All Members',\n num: (usersBySearch || []).length,\n });\n sideList.push({\n name: ROLE_NONE,\n title: 'Other',\n num: (usersBySearch || []).filter(x => hasRole(x, ROLE_NONE)).length || 0,\n });\n\n useEffect(() => {\n setRoleTab('all');\n }, [search]);\n\n const SimpleInfo = d => {\n const main = (\n <div className=\"info\">\n <div className=\"avatar\">\n <div className=\"icon\">\n <Avatar size={46} did={d.did} />\n </div>\n {!d.approved && <did className=\"badge-block\" />}\n </div>\n <Box className=\"title\" display=\"flex\" alignItems=\"center\">\n <div className=\"text\">{d.fullName}</div>\n {d.isFromExternal && (\n <Tooltip title={t('team.passport.externalPassport')}>\n <Box ml={1} className=\"icon\">\n <ExternalIssuerIcon />\n </Box>\n </Tooltip>\n )}\n </Box>\n </div>\n );\n return d.approved ? (\n main\n ) : (\n <Box display=\"flex\" alignItems=\"center\">\n <Tooltip title={t('team.member.forbidLoginDescription')}>{main}</Tooltip>\n </Box>\n );\n };\n\n const authInfo = findInterfaceWithAuthService(teamDid);\n const isInvitationEnabled = authInfo && authInfo.invitedUserOnly && enablePassportIssuance;\n\n const filteredUsers = usersBySearch.filter(x => roleTab === 'all' || hasRole(x, roleTab));\n const sortedUsers = filteredUsers.sort((a, b) => (new Date(a.lastLoginAt) > new Date(b.lastLoginAt) ? -1 : 1));\n sortedUsers.forEach(x => {\n x.isFromExternal = isFromExternal(x, teamIssuerDid);\n });\n\n return (\n <Div>\n {/* header */}\n <ListHeader>\n <div className=\"left\">\n <SearchInput placeholder={t('team.member.search')} value={search} onChange={e => setSearch(e.target.value)} />\n </div>\n <div className=\"right\">\n {isInvitationEnabled && (\n <>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n rounded\n onClick={() => {\n setShowInviting(true);\n }}>\n <PersonIcon style={{ height: '1em', marginRight: 4 }} />\n {t('common.inviting')}\n {invitations.length ? ` (${invitations.length})` : ''}\n </Button>\n <Permission permission=\"mutate_team\">\n <Button\n style={{ marginLeft: 16 }}\n variant=\"contained\"\n rounded\n edge=\"end\"\n color=\"primary\"\n data-cy=\"invite-member\"\n onClick={() => setShowInviteMember(true)}>\n <AddIcon style={{ fontSize: '1.3em', marginRight: 4 }} />\n {t('team.invite')}\n </Button>\n </Permission>\n </>\n )}\n {showInviteMember && (\n <InviteMember\n teamDid={teamDid}\n authInfo={authInfo}\n roles={roles}\n onCancel={() => setShowInviteMember(false)}\n onSuccess={() => {\n refresh();\n setShowInviteMember(false);\n }}\n />\n )}\n </div>\n </ListHeader>\n\n <Box mt={3} className=\"main\" display=\"flex\">\n <div className=\"left\">\n <div className=\"tabs\">\n {sideList.map(x => (\n <div className={`tab ${roleTab === x.name ? 'active' : ''}`} onClick={() => setRoleTab(x.name)}>\n <span className=\"text\">{x.title}</span>\n <span className=\"badge\">{x.num}</span>\n </div>\n ))}\n </div>\n </div>\n <div className=\"right\">\n <PaginationList list={sortedUsers}>\n {paginateUsers => (\n <Box className=\"list\">\n {paginateUsers.map(x => (\n <Box\n className=\"item\"\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n data-cy={`member-name-${x.fullName}`}\n onClick={() => setMemberDialog(x)}>\n <Box display=\"flex\" alignItems=\"center\">\n {SimpleInfo(x)}\n <Box ml={5} className=\"address\">\n <Address copyable={false}>{x.did}</Address>\n </Box>\n </Box>\n <Box display=\"flex\" alignItems=\"center\">\n <Box mr={5} style={{ color: '#999', fontSize: 14 }}>\n {x.lastLoginAt ? moment(x.lastLoginAt).fromNow() : '--'}\n </Box>\n <Permission permission=\"mutate_team\">\n <Actions user={x} onIssuePassport={() => setMemberDialog({ ...x, initTab: 'issuances' })} />\n </Permission>\n </Box>\n </Box>\n ))}\n </Box>\n )}\n </PaginationList>\n </div>\n </Box>\n\n {/* table */}\n <Dialog\n title={t('common.inviting')}\n onClose={() => setShowInviting(false)}\n open={showInviting}\n maxWidth=\"lg\"\n fullWidth>\n <Invitations />\n </Dialog>\n\n {memberDialog && (\n <Member onCancel={() => setMemberDialog(null)} userDid={memberDialog.did} initTab={memberDialog.initTab} />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .main {\n .left {\n width: 168px;\n flex-shrink: 0;\n margin-right: 65px;\n .tabs {\n padding-top: 16px;\n .tab {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n transition: background 0.4s;\n\n width: 168px;\n height: 36px;\n border-radius: 8px;\n\n cursor: pointer;\n user-select: none;\n\n &:nth-child(n + 2) {\n margin-top: 24px;\n }\n\n &.active {\n background: #f2f2f2;\n }\n\n &:hover {\n background: #f2f2f2;\n }\n\n .text {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n\n color: #222222;\n }\n\n .badge {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 20px;\n height: 20px;\n border-radius: 100%;\n color: #fff;\n background: #666666;\n font-size: 10px;\n font-weight: 500;\n }\n }\n }\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n display: none;\n }\n }\n .right {\n flex-grow: 1;\n }\n }\n\n .list {\n margin-top: 4px;\n margin-left: 40px;\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n margin-left: 0;\n }\n .item {\n padding: 12px;\n margin: 0 -12px;\n cursor: pointer;\n transition: box-shadow 0.4s;\n &:hover {\n box-shadow: 0 0 10px 4px rgba(0, 0, 0, 0.1);\n }\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n .address {\n display: none;\n }\n }\n .info {\n display: flex;\n align-items: center;\n .avatar {\n position: relative;\n box-sizing: border-box;\n width: 48px;\n height: 48px;\n .icon {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border: 1px solid #eee;\n border-radius: 100%;\n background: #eee;\n overflow: hidden;\n }\n .badge-block {\n width: 20px;\n height: 20px;\n position: absolute;\n right: -4px;\n bottom: -4px;\n background: #ff5757;\n border-radius: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n &::after {\n content: '';\n width: 11px;\n height: 2px;\n background: #fefefe;\n }\n }\n }\n .title {\n width: 100px;\n margin-left: 24px;\n .text {\n color: #666;\n font-size: 16px;\n }\n .icon {\n font-size: 14px;\n line-height: 1;\n fill: #bfbfbf;\n }\n }\n }\n }\n }\n`;\n\nMemberList.propTypes = {};\n\nMemberList.defaultProps = {};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport md5 from 'md5';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { formatError } from '../../../libs/util';\n\nexport default function MutateRole({ teamDid, onCancel, onSuccess, onError, mode, item }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [title, setTitle] = useState(item.title || '');\n const [description, setDescription] = useState(item.description || '');\n\n const onCreate = async () => {\n const _title = title.trim();\n if (!_title) {\n setError(t('team.passport.error.titleEmpty'));\n return;\n }\n\n if (_title.length > 64) {\n setError(t('team.passport.error.titleTooLong', { length: 64 }));\n return;\n }\n\n const desc = description.replace(/\\n/g, ' ');\n if (!desc) {\n setError(t('team.passport.error.descriptionEmpty'));\n return;\n }\n\n const name = mode === 'create' ? md5(_title) : item.name;\n\n setError(null);\n setLoading(true);\n\n try {\n if (mode === 'create') {\n await api.createRole({ input: { teamDid, name, title: _title, description: desc } });\n } else {\n await api.updateRole({ input: { teamDid, role: { name, title: _title, description: desc } } });\n }\n onSuccess();\n } catch (err) {\n const errMsg = formatError(err);\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n const body = (\n <div>\n {mode === 'update' && (\n <Typography component=\"div\" style={{ paddingTop: 24 }}>\n <TextField\n label=\"ID\"\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"url\"\n data-cy=\"mutate-role-input-name\"\n fullWidth\n autoFocus\n value={item.name}\n disabled\n />\n </Typography>\n )}\n\n <Typography component=\"div\" style={{ marginTop: 24 }}>\n <TextField\n label={t('common.title')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"title\"\n data-cy=\"mutate-role-input-title\"\n fullWidth\n autoFocus\n value={title}\n onChange={e => {\n setError(null);\n setTitle(e.target.value);\n }}\n disabled={mode === 'update' || loading}\n helperText={t('team.passport.create.titleTip')}\n />\n </Typography>\n\n <Typography component=\"div\" style={{ marginTop: 24, marginBottom: 24 }}>\n <TextField\n label={t('common.description')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"description\"\n data-cy=\"mutate-role-input-description\"\n fullWidth\n autoFocus\n value={description}\n onChange={e => {\n setError(null);\n setDescription(e.target.value);\n }}\n disabled={loading}\n multiline\n rows={3}\n />\n </Typography>\n </div>\n );\n\n return (\n <Dialog\n title={mode === 'create' ? t('team.passport.create.title') : ''}\n fullWidth\n open\n onClose={onCancel}\n showCloseButton={false}\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded size=\"small\">\n {t('common.cancel')}\n </Button>\n <Button\n data-cy=\"mutate-role-confirm\"\n onClick={onCreate}\n color=\"primary\"\n size=\"small\"\n disabled={loading}\n variant=\"contained\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {mode === 'create' ? t('common.create') : t('common.update')}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">{body}</DialogContentText>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\" style={{ width: '100%', margin: 0 }}>\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nMutateRole.propTypes = {\n teamDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n mode: PropTypes.oneOf(['create', 'update']),\n item: PropTypes.object,\n};\n\nMutateRole.defaultProps = {\n onError: () => {},\n mode: 'create',\n item: {},\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport IconButton from '@material-ui/core/IconButton';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport EditIcon from '@arcblock/icons/lib/EditIcon';\nimport DeleteIcon from '@arcblock/icons/lib/DeleteIcon';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { formatError, isProtectedRole } from '../../../libs/util';\nimport { withPermission } from '../../permission';\nimport Confirm from '../../confirm';\nimport Toast from '../../toast';\nimport MutateRole from './mutate-role';\n\nfunction PassportDetail({ onCancel, onSuccess, onDelete, roleName, hasPermission }) {\n const { api } = useNodeContext();\n const { roles, permissions, teamDid, refresh: refreshTeam, isNodeTeam } = useTeamContext();\n const { t } = useLocaleContext();\n const [binds, setBinds] = useState([]);\n const [updateForm, setUpdateForm] = useState(false);\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n\n const role = cloneDeep(roles.find(x => x.name === roleName));\n\n const isProtected = isProtectedRole(roleName);\n\n const deletePassport = async name => {\n if (loading) return;\n try {\n setLoading(true);\n await api.deleteRole({ input: { teamDid, name } });\n onDelete();\n } catch (err) {\n Toast.error(err.message);\n } finally {\n setLoading(false);\n setDelConfirm(null);\n }\n };\n\n const getData = async (team, name) => {\n const res = await api.getPermissionsByRole({ input: { teamDid: team, role: { name } } });\n const permissionList = res.permissions || [];\n const bindList = permissions.map(x => ({\n ...x,\n bind: permissionList.some(y => y.name === x.name),\n }));\n setBinds(bindList);\n };\n\n const onBind = async () => {\n setLoading(true);\n\n const grantNames = binds.filter(x => x.bind).map(x => x.name);\n\n try {\n await api.updatePermissionsForRole({ input: { teamDid, roleName: role.name, grantNames } });\n Toast.success(t('common.saveSuccess'));\n onSuccess();\n } catch (err) {\n Toast.error(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (teamDid && roleName) {\n getData(teamDid, roleName);\n }\n }, [teamDid, roleName]); // eslint-disable-line\n\n const readPermissionsOnly = isNodeTeam || !hasPermission;\n\n return (\n <Dialog\n title={t('common.passport')}\n onClose={onCancel}\n open\n fullWidth\n toolbar={\n hasPermission &&\n !isProtected && (\n <>\n <IconButton onClick={() => setUpdateForm(role)} data-cy={`edit-passport-${role.name}`}>\n <EditIcon fill=\"#bfbfbf\" />\n </IconButton>\n <IconButton\n onClick={() =>\n setDelConfirm({\n title: t('team.passport.delete.title'),\n description: t('team.passport.delete.description', { name: role.title }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n deletePassport(role.name);\n },\n onCancel: () => {\n setLoading(false);\n setDelConfirm(null);\n },\n })\n }\n data-cy={`delete-passport-${role.name}`}>\n <DeleteIcon fill=\"#bfbfbf\" />\n </IconButton>\n </>\n )\n }\n actions={\n !readPermissionsOnly && (\n <>\n <Button onClick={onCancel} color=\"default\" rounded>\n {t('common.cancel')}\n </Button>\n <Button\n onClick={onBind}\n color=\"primary\"\n disabled={loading || !role}\n variant=\"contained\"\n autoFocus\n data-cy=\"bind-permission-btn-confirm\"\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {t('common.save')}\n </Button>\n </>\n )\n }>\n <Div>\n {!role && (\n <Center>\n <Spinner />\n </Center>\n )}\n\n {/* content */}\n {role && (\n <div className=\"dialog-content\">\n <div className=\"header\">\n <div className=\"title\">{role.title}</div>\n <div className=\"description\">{role.description}</div>\n </div>\n\n {/* bind permission */}\n <div className=\"bind\">\n <div className=\"title\">{t('common.permission')}</div>\n <div className=\"list\">\n {binds\n // if readonly, show obtained permissions only\n .filter(x => (readPermissionsOnly ? x.bind : true))\n .map(x => (\n <div className=\"item\">\n <FormControlLabel\n control={\n <Checkbox\n disabled={readPermissionsOnly}\n checked={x.bind}\n onChange={() => {\n setBinds(state =>\n state.map(y => {\n if (y.name === x.name) {\n y.bind = !y.bind;\n }\n return y;\n })\n );\n }}\n name={x.name}\n />\n }\n label={x.description}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </Div>\n\n {updateForm && (\n <MutateRole\n teamDid={teamDid}\n onCancel={() => setUpdateForm(null)}\n onSuccess={() => {\n setUpdateForm(null);\n refreshTeam();\n }}\n mode=\"update\"\n roleName={updateForm.name}\n item={updateForm}\n />\n )}\n\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Dialog>\n );\n}\n\nexport default withPermission(PassportDetail, 'mutate_team');\n\nPassportDetail.propTypes = {\n roleName: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n hasPermission: PropTypes.bool,\n};\n\nPassportDetail.defaultProps = {\n hasPermission: false,\n};\n\nconst Div = styled.div`\n .header {\n .title {\n font-weight: 500;\n font-size: 24px;\n line-height: 28px;\n color: #222222;\n }\n\n .description {\n margin-top: 16px;\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #999999;\n }\n }\n\n .bind {\n margin-top: 24px;\n .title {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666666;\n margin-bottom: 24px;\n }\n .item {\n margin-top: 24px;\n }\n\n .MuiFormControlLabel-label {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666;\n }\n\n .PrivateSwitchBase-root-45 {\n padding: 0;\n padding-right: 12px;\n }\n }\n`;\n\nconst Center = styled.div`\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n`;\n","var _path;\n\nvar _excluded = [\"svgRef\", \"title\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar SvgLongArrow = function SvgLongArrow(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 65,\n height: 16,\n viewBox: \"0 0 65 16\",\n fill: \"none\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M64.7071 8.70711C65.0976 8.31658 65.0976 7.68342 64.7071 7.29289L58.3431 0.928932C57.9526 0.538408 57.3195 0.538408 56.9289 0.928932C56.5384 1.31946 56.5384 1.95262 56.9289 2.34315L62.5858 8L56.9289 13.6569C56.5384 14.0474 56.5384 14.6805 56.9289 15.0711C57.3195 15.4616 57.9526 15.4616 58.3431 15.0711L64.7071 8.70711ZM0 9H64V7H0V9Z\",\n fill: \"#666666\"\n })));\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgLongArrow, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/long-arrow.4be14920.svg\";\nexport { ForwardRef as ReactComponent };","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Box from '@material-ui/core/Box';\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\nimport IconButton from '@material-ui/core/IconButton';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport TextField from '@material-ui/core/TextField';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport DeleteIcon from '@arcblock/icons/lib/DeleteIcon';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport { ROLES } from '@abtnode/constant';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { sleep } from '../../../libs/util';\nimport { ReactComponent as LongArrow } from '../../../icons/long-arrow.svg';\nimport Toast from '../../toast';\n\nconst canSave = (issuerDid, mappings) => {\n if (!issuerDid) {\n return false;\n }\n\n if (mappings.some(x => !x.from.passport || !x.to.role)) {\n return false;\n }\n\n return true;\n};\n\nexport default function TrustedIssuer({ onCancel, onSuccess, data, trustedPassports }) {\n const { api } = useNodeContext();\n const { roles, teamDid } = useTeamContext();\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [issuerDid, setIssuerDid] = useState(data.issuerDid || '');\n const [mappings, setMappings] = useState(cloneDeep(data.mappings) || []);\n\n const editIndex = trustedPassports.findIndex(x => x.issuerDid === data.issuerDid);\n\n const configTrustedPassports = async () => {\n if (loading) {\n return;\n }\n\n const trustedList = [...trustedPassports];\n\n if (editIndex === -1) {\n trustedList.unshift({\n issuerDid,\n mappings,\n });\n } else {\n trustedList[editIndex] = {\n issuerDid,\n mappings,\n };\n }\n\n try {\n setLoading(true);\n await api.configTrustedPassports({ input: { teamDid, trustedPassports: trustedList } });\n await sleep(800);\n setLoading(false);\n Toast.success(t('common.saveSuccess'));\n onSuccess();\n } catch (err) {\n setLoading(false);\n Toast.error(err.message);\n }\n };\n\n return (\n <Dialog\n title={t('team.passport.trustedIssuers')}\n open\n showCloseButton={false}\n PaperProps={{ style: { minHeight: '80vh' } }}\n fullWidth\n prepend={\n <IconButton onClick={onCancel} data-cy=\"trusted-issuer-close\">\n <ArrowBackIcon />\n </IconButton>\n }\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded>\n {t('common.cancel')}\n </Button>\n <Button\n onClick={() => configTrustedPassports()}\n color=\"primary\"\n disabled={!canSave(issuerDid, mappings) || loading}\n variant=\"contained\"\n autoFocus\n data-cy=\"save-mapping\"\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {t('common.save')}\n </Button>\n </>\n }>\n <Div>\n <div className=\"dialog-content\">\n <TextField\n fullWidth\n data-cy=\"input-issuer-did\"\n placeholder={t('team.passport.issuerDid')}\n value={issuerDid}\n onChange={event => {\n setIssuerDid(event.target.value);\n }}\n />\n\n <Box mt=\"30px\" display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\n <Box className=\"dialog-h1\">{t('team.passport.mappingRule')}</Box>\n <Box>\n <Button\n variant=\"outlined\"\n rounded\n color=\"primary\"\n data-cy=\"add-mapping\"\n onClick={() => {\n setMappings(d => {\n const res = [...d];\n res.unshift({ from: { passport: '' }, to: { role: ROLES.GUEST } });\n return res;\n });\n }}>\n {t('team.add')}\n </Button>\n </Box>\n </Box>\n\n <Box className=\"list\" mt={-0.5}>\n {mappings.map((item, index) => (\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" my={3}>\n <Box display=\"flex\" alignItems=\"center\" flexGrow={1}>\n <Box flexGrow={1} flexBasis={1}>\n <TextField\n fullWidth\n size=\"small\"\n data-cy={`input-${index}-from`}\n placeholder=\"Issuer’s Passport Name/ID\"\n value={item.from.passport}\n onChange={event => {\n const { value } = event.target;\n setMappings(d => {\n const res = [...d];\n res[index].from.passport = value;\n return res;\n });\n }}\n />\n </Box>\n\n <Box flexShrink={0} mx={4}>\n <LongArrow />\n </Box>\n\n {/* role */}\n <Box flexGrow={1} flexBasis={1}>\n <TextField\n fullWidth\n size=\"small\"\n select\n value={item.to.role}\n onChange={e => {\n setMappings(d => {\n const res = [...d];\n res[index].to.role = e.target.value;\n return res;\n });\n }}\n variant=\"outlined\">\n {roles\n .filter(d => d.name !== 'owner')\n .map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`passport-mapping-select-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </TextField>\n </Box>\n </Box>\n\n {/* delete */}\n <Box flexShrink={0} ml={4}>\n <IconButton\n onClick={() => {\n setMappings(d => {\n const res = [...d];\n res.splice(index, 1);\n return res;\n });\n }}>\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n ))}\n\n {!mappings.length && (\n <Box my={2} color=\"text.secondary\" fontSize=\"16px\">\n <Empty>{t('common.empty')}</Empty>\n </Box>\n )}\n </Box>\n </div>\n </Div>\n </Dialog>\n );\n}\n\nTrustedIssuer.propTypes = {\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n trustedPassports: PropTypes.array,\n data: PropTypes.object,\n};\n\nTrustedIssuer.defaultProps = {\n data: {},\n trustedPassports: [],\n};\n\nconst Div = styled.div`\n .dialog-h1 {\n font-size: 18px;\n }\n\n .MuiOutlinedInput-root {\n border-radius: 36px;\n .MuiSelect-root.MuiOutlinedInput-input {\n padding-top: 8.5px;\n padding-bottom: 8.5px;\n }\n }\n\n .list {\n .MuiIconButton-root {\n svg {\n fill: #bfbfbf;\n }\n }\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Box from '@material-ui/core/Box';\nimport AddIcon from '@material-ui/icons/Add';\nimport IconButton from '@material-ui/core/IconButton';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Empty from '@arcblock/ux/lib/Empty';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport EditIcon from '@arcblock/icons/lib/EditIcon';\nimport DeleteIcon from '@arcblock/icons/lib/DeleteIcon';\n\nimport { withPermission } from '../../permission';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { sleep } from '../../../libs/util';\nimport Toast from '../../toast';\nimport Confirm from '../../confirm';\nimport ListHeader from '../styles/list-header';\nimport SearchInput from '../search-input';\nimport TrustedIssuer from './trusted-issuer';\n\nfunction TrustedIssuers({ onCancel, hasPermission }) {\n const { api } = useNodeContext();\n const { teamDid, trustedPassports } = useTeamContext();\n const { t } = useLocaleContext();\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n const [trustedIssuer, setTrustedIssuer] = useState(false);\n const [search, setSearch] = useState('');\n\n const deleteTrustedIssuer = async did => {\n if (loading) {\n return;\n }\n\n const index = trustedPassports.findIndex(x => x.issuerDid === did);\n\n if (index === -1) {\n // should not be here\n Toast.error('Cannot find passports');\n }\n\n const trustedList = [...trustedPassports];\n trustedList.splice(index, 1);\n\n try {\n setLoading(true);\n await api.configTrustedPassports({ input: { teamDid, trustedPassports: trustedList } });\n await sleep(800);\n setLoading(false);\n Toast.success(t('common.saveSuccess'));\n setDelConfirm(false);\n } catch (err) {\n setLoading(false);\n Toast.error(err.message);\n }\n };\n\n const filteredIssuers = trustedPassports.filter(\n x => !search || x.issuerDid.toLowerCase().includes(search.toLowerCase())\n );\n\n return (\n <Dialog\n title={t('team.passport.trustedIssuers')}\n open\n onClose={onCancel}\n fullWidth\n PaperProps={{ style: { minHeight: '80vh' } }}>\n <Div>\n <div className=\"dialog-content\">\n <div className=\"dialog-h1\">{t('team.passport.trustedPassportIssuers')}</div>\n\n <Box component={ListHeader} mt={3}>\n <div className=\"left\">\n <SearchInput\n placeholder={t('team.passport.searchIssuerDid')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n />\n </div>\n <div className=\"right\">\n {hasPermission && (\n <Button\n variant=\"contained\"\n rounded\n color=\"primary\"\n data-cy=\"add-trusted-issuer\"\n onClick={() => setTrustedIssuer({ mode: 'add' })}>\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.add')}\n </Button>\n )}\n </div>\n </Box>\n\n <div className=\"list\">\n {filteredIssuers.map(x => (\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" mt=\"20px\">\n <Box flexShrink={0}>\n <DidAddress copyable={false}>\n <span style={{ fontSize: 16 }}>{x.issuerDid}</span>\n </DidAddress>\n </Box>\n <Box color=\"gray\" ml=\"28px\" flexGrow={1}>\n {x.mappings && x.mappings.length\n ? `${x.mappings.length} ${t('team.passport.mappingRule')}`\n : t('team.passport.defaultRule')}\n </Box>\n <Box flexShrink={0} display=\"flex\" alignItems=\"center\">\n <IconButton\n onClick={() => setTrustedIssuer({ mode: 'update', data: cloneDeep(x) })}\n data-cy=\"edit-mapping-rule\">\n <EditIcon />\n </IconButton>\n <IconButton\n data-cy=\"delete-mapping-rule\"\n onClick={() =>\n setDelConfirm({\n title: t('common.delete'),\n description: t('common.delConfirmDescription'),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => deleteTrustedIssuer(x.issuerDid),\n onCancel: () => {\n setLoading(false);\n setDelConfirm(null);\n },\n })\n }>\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n ))}\n {!trustedPassports.length && <Empty>{t('common.empty')}</Empty>}\n </div>\n </div>\n </Div>\n\n {trustedIssuer && (\n <TrustedIssuer\n mode={trustedIssuer.mode}\n data={trustedIssuer.data}\n trustedPassports={cloneDeep(trustedPassports)}\n onCancel={() => setTrustedIssuer(null)}\n onSuccess={() => {\n setTrustedIssuer(null);\n }}\n />\n )}\n\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Dialog>\n );\n}\n\nTrustedIssuers.propTypes = {\n onCancel: PropTypes.func.isRequired,\n hasPermission: PropTypes.bool,\n};\n\nTrustedIssuers.defaultProps = {\n hasPermission: false,\n};\n\nexport default withPermission(TrustedIssuers, 'mutate_team');\n\nconst Div = styled.div`\n .list {\n .MuiIconButton-root {\n svg {\n fill: #bfbfbf;\n }\n }\n }\n`;\n","import React, { useContext, useState } from 'react';\nimport styled from 'styled-components';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Box from '@material-ui/core/Box';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport EditIcon from '@arcblock/icons/lib/EditIcon';\nimport LockIcon from '@arcblock/icons/lib/LockIcon';\nimport ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { sleep, createPassportSvg, isProtectedRole } from '../../../libs/util';\nimport Permission from '../../permission';\nimport Toast from '../../toast';\nimport ButtonGroupWithActions from '../../button-group-with-actions';\nimport SearchInput from '../search-input';\nimport ListHeader from '../styles/list-header';\nimport Detail from './detail';\nimport MutateRole from './mutate-role';\nimport TrustedIssuers from './trusted-issuers';\n\nexport default function PassportList() {\n const { t } = useContext(LocaleContext);\n const { api, info: nodeInfo } = useNodeContext();\n const { roles, teamDid, teamName, refresh: refreshTeam, enablePassportIssuance } = useTeamContext();\n\n const [showCreate, setShowCreate] = useState(false);\n const [updateForm, setUpdateForm] = useState(false);\n const [showTrustedIssuers, setShowTrustedIssuers] = useState(null);\n const [search, setSearch] = useState('');\n const [loading, setLoading] = useState(false);\n\n const toggleShowIssue = async () => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await api.configPassportIssuance({ input: { teamDid, enable: !enablePassportIssuance } });\n refreshTeam();\n await sleep(800);\n Toast.success(t('common.configSuccess'));\n setLoading(false);\n } catch (error) {\n Toast.error(error.message);\n setLoading(false);\n }\n };\n\n const filteredRoles = roles.filter(x => !search || x.title.includes(search) || x.name.includes(search));\n\n return (\n <Div>\n <ListHeader>\n <div className=\"left\">\n <SearchInput\n placeholder={t('team.passport.search')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n />\n </div>\n <div className=\"right\">\n <Permission permission=\"mutate_team\">\n <ButtonGroupWithActions\n actions={[\n <MenuItem\n data-cy=\"config-show-issue-passport\"\n onClick={() => {\n toggleShowIssue();\n }}>\n <Box display=\"flex\" alignItems=\"center\">\n {loading && <Spinner size={[16, 10]} style={{ marginRight: 8 }} />}\n <Box>\n {enablePassportIssuance ? t('team.passport.disableIssuance') : t('team.passport.enableIssuance')}\n <Box fontSize={12} color=\"#888\">\n {enablePassportIssuance\n ? t('team.passport.disableIssuanceTip')\n : t('team.passport.enableIssuanceTip')}\n </Box>\n </Box>\n </Box>\n </MenuItem>,\n ]}>\n <Button\n style={{ borderRight: 0 }}\n variant=\"outlined\"\n color=\"primary\"\n data-cy=\"config-trusted-issuers\"\n onClick={() => {\n setShowTrustedIssuers(true);\n }}>\n <ExternalIssuerIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.passport.trustedPassportIssuers')}\n </Button>\n </ButtonGroupWithActions>\n\n {nodeInfo.did !== teamDid && (\n <Button\n style={{ marginLeft: 16 }}\n variant=\"contained\"\n rounded\n edge=\"end\"\n color=\"primary\"\n data-cy=\"create-role\"\n onClick={() => setShowCreate(true)}>\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.add')}\n </Button>\n )}\n </Permission>\n </div>\n </ListHeader>\n\n <Box mt={3} />\n\n <Box className=\"list\">\n {filteredRoles.map(role => (\n <Box\n data-cy={`passport-${role.name}`}\n className=\"item\"\n display=\"flex\"\n alignItems=\"center\"\n onClick={() => setUpdateForm(role)}>\n <Box display=\"flex\" alignItems=\"center\">\n <img\n style={{ width: 120 }}\n alt=\"\"\n src={createPassportSvg({\n issuer: teamName,\n title: role.title,\n })}\n />\n <Box ml={3} className=\"title\">\n {role.title}\n </Box>\n </Box>\n\n <Box className=\"description\">{role.description}</Box>\n\n <Permission permission=\"mutate_team\">\n <div className=\"action\">{isProtectedRole(role.name) ? <LockIcon /> : <EditIcon />}</div>\n </Permission>\n </Box>\n ))}\n </Box>\n\n {showCreate && (\n <MutateRole\n teamDid={teamDid}\n onCancel={() => setShowCreate(false)}\n onSuccess={() => {\n setShowCreate(false);\n refreshTeam();\n }}\n />\n )}\n\n {updateForm && (\n <Detail\n onCancel={() => setUpdateForm(null)}\n onSuccess={() => {\n setUpdateForm(null);\n refreshTeam();\n }}\n onDelete={() => {\n setUpdateForm(null);\n refreshTeam();\n }}\n mode=\"update\"\n roleName={updateForm.name}\n item={updateForm}\n />\n )}\n\n {/* showTrustedIssuers */}\n {showTrustedIssuers && <TrustedIssuers onCancel={() => setShowTrustedIssuers(false)} />}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .list {\n .item {\n padding: 12px;\n margin: 12px -12px;\n cursor: pointer;\n transition: box-shadow 0.4s;\n &:hover {\n box-shadow: 0 0 10px 4px rgba(0, 0, 0, 0.1);\n }\n }\n\n .title {\n font-weight: 500;\n font-size: 18px;\n width: 80px;\n line-height: 21px;\n color: #222222;\n }\n\n .description {\n flex: 1;\n margin-left: 64px;\n color: #999999;\n }\n\n .action {\n color: #bfbfbf;\n fill: #bfbfbf;\n }\n }\n`;\n\nPassportList.propTypes = {};\n\nPassportList.defaultProps = {};\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React from 'react';\nimport styled from 'styled-components';\nimport { useParams, useHistory } from 'react-router-dom';\n\nimport Typography from '@material-ui/core/Typography';\n\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { TeamProvider } from '../../contexts/team';\nimport Members from '../../components/team/members';\nimport Passports from '../../components/team/passports';\n\nexport default function TeamPage() {\n const history = useHistory();\n const { t } = useLocaleContext();\n const { nodeInfo } = useNodeContext();\n const { tab = 'members' } = useParams(); // members, passports\n\n const teamDid = nodeInfo.did;\n\n const onTabChange = newTab => {\n history.push(`/team/${newTab}`);\n };\n\n const tabConfigs = {\n members: {\n label: t('common.members'),\n value: 'members',\n component: Members,\n },\n passports: {\n label: t('common.passport'),\n value: 'passports',\n component: Passports,\n },\n };\n\n const tabs = Object.values(tabConfigs).map(({ label, value }) => ({ label, value }));\n\n const tabConfig = tabConfigs[tab] || tabConfigs.member;\n\n return (\n <TeamProvider teamDid={teamDid}>\n <Main>\n <Typography component=\"h2\" variant=\"h4\" className=\"page-header\" color=\"textPrimary\">\n {t('common.team')}\n </Typography>\n <Tabs tabs={tabs} current={tab} onChange={onTabChange} scrollButtons=\"auto\" />\n <div className=\"page-content\">\n <tabConfig.component />\n </div>\n </Main>\n </TeamProvider>\n );\n}\n\nconst Main = styled.main`\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .page-content {\n margin-top: 24px;\n }\n`;\n","import { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nfunction useMobileWidth() {\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n const minWidth = isBreakpointsDownSm ? 300 : theme.breakpoints.values.sm;\n return { minWidth };\n}\n\nexport default useMobileWidth;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Alert from '@material-ui/lab/Alert';\nimport useTheme from '@material-ui/core/styles/useTheme';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { formatError } from '../libs/util';\nimport useMobileWidth from '../hooks/mobile-width';\n\nexport default function ConfirmDialog({\n title,\n description,\n showCancel,\n cancel,\n confirm,\n color,\n params: initialParams,\n onCancel,\n onConfirm,\n}) {\n const [params, setParams] = useState(initialParams);\n const [open, setOpen] = useState(true);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t: changeLocale } = useLocaleContext();\n const theme = useTheme();\n\n const onCallback = async cb => {\n if (typeof cb === 'function') {\n setLoading(true);\n try {\n await cb(params);\n setOpen(false);\n } catch (err) {\n setError(formatError(err));\n console.error(err);\n } finally {\n setLoading(false);\n }\n } else {\n setOpen(false);\n }\n };\n\n const t = typeof title === 'function' ? title() : title;\n const d = typeof description === 'function' ? description(params, setParams, setError) : description;\n\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n\n const handleClick = e => {\n e.stopPropagation();\n };\n const { minWidth } = useMobileWidth();\n\n return (\n <StyledDialog onClick={handleClick} fullScreen={isBreakpointsDownSm} open={open} style={{ minWidth }}>\n <DialogTitle>{t}</DialogTitle>\n <DialogContent style={{ minWidth }}>\n <DialogContentText component=\"div\">{d}</DialogContentText>\n {!!error && (\n <Alert severity=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </DialogContent>\n <DialogActions className=\"delete-actions\" style={{ padding: '8px 24px 24px' }}>\n {showCancel && (\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onCancel);\n }}\n color=\"default\"\n data-cy=\"cancel-confirm-dialog\"\n rounded\n size=\"small\">\n {cancel || changeLocale('common.cancel')}\n </Button>\n )}\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onConfirm);\n }}\n color={color}\n size=\"small\"\n // eslint-disable-next-line no-underscore-dangle\n disabled={params.__disableConfirm || loading}\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {confirm}\n </Button>\n </DialogActions>\n </StyledDialog>\n );\n}\n\nConfirmDialog.propTypes = {\n title: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n showCancel: PropTypes.bool,\n cancel: PropTypes.string,\n color: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nConfirmDialog.defaultProps = {\n onCancel: () => {},\n showCancel: true,\n cancel: '',\n confirm: 'Confirm',\n color: 'danger',\n params: {},\n};\n\nconst StyledDialog = styled(Dialog)`\n .delete-actions .Mui-disabled {\n color: rgba(0, 0, 0, 0.26) !important;\n box-shadow: none;\n background-color: rgba(0, 0, 0, 0.12) !important;\n }\n`;\n","import React, { useState, useContext, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { RBAC_CONFIG } from '@abtnode/constant';\n\nimport { useNodeContext } from './node';\nimport { useBlockletContext } from './blocklets';\n\nimport { useSubscription } from '../libs/ws';\n\nconst TeamContext = React.createContext({});\nconst { Provider, Consumer } = TeamContext;\n\nconst getTeamName = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return nodeInfo.name;\n }\n\n if (blocklet) {\n return blocklet.meta.title || blocklet.meta.name;\n }\n\n return '';\n};\n\nconst getTrustedPassports = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return nodeInfo.trustedPassports || [];\n }\n\n if (blocklet) {\n return blocklet.trustedPassports || [];\n }\n\n return [];\n};\n\nconst getTeamIssuerDid = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return teamDid;\n }\n\n if (blocklet) {\n const item = (blocklet.environments || []).find(x => x.key === 'BLOCKLET_APP_ID') || {};\n return item.value || '';\n }\n\n return '';\n};\n\nconst getEnablePassportIssuance = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return nodeInfo.enablePassportIssuance !== false;\n }\n\n if (blocklet) {\n return blocklet.enablePassportIssuance !== false;\n }\n\n return true;\n};\n\nfunction TeamProvider({ teamDid, children }) {\n const { api, nodeInfo } = useNodeContext();\n const { data: blocklets } = useBlockletContext();\n\n const [users, setUsers] = useState([]);\n const [invitations, setInvitations] = useState([]);\n const [roles, setRoles] = useState([]);\n const [permissions, setPermissions] = useState([]);\n\n const blocklet = blocklets.find(x => x.meta.did === teamDid);\n const teamName = getTeamName(teamDid, nodeInfo, blocklet);\n const trustedPassports = getTrustedPassports(teamDid, nodeInfo, blocklet);\n const teamIssuerDid = getTeamIssuerDid(teamDid, nodeInfo, blocklet);\n const enablePassportIssuance = getEnablePassportIssuance(teamDid, nodeInfo, blocklet);\n\n const getData = async did => {\n try {\n const res = await api.doBatchQuery({\n getRoles: { input: { teamDid: did } },\n getPermissions: { input: { teamDid: did } },\n getUsers: { input: { teamDid: did } },\n getInvitations: { input: { teamDid: did } },\n });\n\n setRoles(\n (res.getRoles.roles || [])\n // exclude some roles: not passport or only for ci\n .filter(x => !RBAC_CONFIG.roles.some(y => y.name === x.name && (!y.passport || y.ci)))\n // backwards compatibility\n .map(x => {\n x.description = x.description || `Use this passport to connect ${teamName} as ${x.title}`;\n return x;\n })\n );\n setPermissions(res.getPermissions.permissions || []);\n // FIXME: performance optimization\n setUsers(res.getUsers.users || []);\n setInvitations(res.getInvitations.invitations || []);\n } catch {\n // do nothing\n }\n };\n\n const refresh = () => getData(teamDid);\n\n useEffect(() => {\n getData(teamDid);\n }, [teamDid]); // eslint-disable-line\n\n const onUserEvent = data => {\n if (data.teamDid === teamDid) {\n getData();\n }\n };\n\n useSubscription('user.added', onUserEvent, [teamDid]);\n useSubscription('user.removed', onUserEvent, [teamDid]);\n useSubscription('user.updated', onUserEvent, [teamDid]);\n\n const data = {\n teamDid,\n teamIssuerDid,\n teamName,\n users,\n invitations,\n roles,\n permissions,\n trustedPassports,\n isNodeTeam: teamDid === nodeInfo.did,\n enablePassportIssuance,\n refresh,\n };\n\n return <Provider value={data}>{children}</Provider>;\n}\n\nTeamProvider.propTypes = {\n teamDid: PropTypes.string.isRequired,\n children: PropTypes.object.isRequired,\n};\n\nTeamProvider.defaultProps = {};\n\nfunction useTeamContext() {\n return useContext(TeamContext);\n}\n\nexport { TeamContext, TeamProvider, Consumer as TeamConsumer, useTeamContext };\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport Copy from '@arcblock/ux/lib/ClickToCopy';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function ClickToCopy({ children, ...rest }) {\n const { t } = useContext(LocaleContext);\n return (\n <Copy tip={t('common.copyTip')} copiedTip={t('common.copiedTip')} {...rest}>\n {children}\n </Copy>\n );\n}\n\nClickToCopy.propTypes = {\n children: PropTypes.any.isRequired,\n};\n","import Add from '@material-ui/icons/Add';\nimport Check from '@material-ui/icons/Check';\nimport Delete from '@material-ui/icons/Delete';\nimport Clear from '@material-ui/icons/Clear';\nimport Export from '@material-ui/icons/SaveAlt';\nimport Edit from '@material-ui/icons/Edit';\nimport Filter from '@material-ui/icons/Filter';\nimport FirstPage from '@material-ui/icons/FirstPage';\nimport LastPage from '@material-ui/icons/LastPage';\nimport NextPage from '@material-ui/icons/ChevronRight';\nimport PreviousPage from '@material-ui/icons/ChevronLeft';\nimport Search from '@material-ui/icons/Search';\nimport SortArrow from '@material-ui/icons/ArrowDropDown';\nimport ThirdStateCheck from '@material-ui/icons/Remove';\nimport ViewColumn from '@material-ui/icons/ViewColumn';\n\nexport default {\n Add,\n Check,\n Delete,\n Edit,\n Clear,\n DetailPanel: NextPage,\n Filter,\n FirstPage,\n LastPage,\n NextPage,\n PreviousPage,\n Search,\n ResetSearch: Clear,\n SortArrow,\n Export,\n ThirdStateCheck,\n ViewColumn,\n};\n","import styled from 'styled-components';\n\nconst TableStyle = styled.div`\n .MuiPaper-root {\n box-shadow: none !important;\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n .MuiToolbar-root {\n background: transparent;\n padding-left: 0;\n display: none;\n }\n\n .MuiTableHead-root th {\n min-width: 100px;\n background: transparent;\n }\n\n .MuiTable-root {\n overflow-y: hidden;\n }\n .MuiTableRow-root {\n border: none !important;\n }\n\n .MuiTableCell-root {\n padding-right: 16px;\n &:last-of-type {\n padding-right: 0;\n }\n }\n`;\n\nexport default TableStyle;\n","import styled from 'styled-components';\n\nconst ListHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 14px;\n .left,\n .right {\n }\n .right {\n display: flex;\n align-items: center;\n }\n .tabs {\n .MuiButton-root {\n border: none;\n color: #999;\n &.active {\n color: #222;\n }\n }\n }\n`;\n\nexport default ListHeader;\n","import React from 'react';\nimport styled from 'styled-components';\nimport TextField from '@material-ui/core/TextField';\nimport SearchIcon from '@material-ui/icons/Search';\n\nconst SearchInput = styled(({ children, ...props }) => (\n <TextField\n {...props}\n id=\"outlined-basic\"\n variant=\"outlined\"\n InputProps={{\n startAdornment: <SearchIcon />,\n }}\n size=\"small\">\n {children}\n </TextField>\n))`\n .MuiOutlinedInput-root {\n color: #999;\n &.MuiInputBase-adornedStart .MuiSvgIcon-root {\n color: #bfbfbf;\n }\n opacity: 1;\n border-radius: 36px;\n background: #f8f8f8;\n padding-left: 16px;\n input {\n padding-left: 8px;\n font-weight: bold;\n &::placeholder {\n opacity: 1;\n color: #bfbfbf;\n }\n padding-top: 8.5px;\n padding-bottom: 8.5px;\n }\n }\n\n .MuiOutlinedInput-notchedOutline,\n .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline,\n .Mui-focused .MuiOutlinedInput-notchedOutline {\n border-color: #eee;\n border-width: 1px;\n }\n`;\n\nexport default SearchInput;\n","/* eslint-disable no-use-before-define */\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\n\nexport default function usePersistentSort(name, initialDirections) {\n const [sortDirections, setSortDirections] = useLocalStorage(`ps_${name}`, initialDirections);\n\n const onSortChange = (columnIndex, directionValue) => {\n const newSortDirections = directionValue ? new Array(initialDirections.length).fill('') : [...initialDirections];\n\n if (columnIndex > -1) {\n newSortDirections[columnIndex] = directionValue;\n }\n\n setSortDirections(newSortDirections);\n };\n\n return {\n sortDirections, // 当前的排序\n onSortChange, // 给外部的回调,可以更新内部的 sort\n };\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["../../mocks/lib/jspdf.js","components/actions.js","components/passport-tag.js","components/button-group-with-actions.js","components/pagination-list.js","components/team/members/invite-member.js","components/team/members/passport-issuances.js","components/team/members/issue-passport.js","components/team/members/passports.js","components/team/members/toggle-user-approval.js","components/team/members/member.js","components/team/members/invitations.js","components/team/members/actions.js","components/team/members/index.js","components/team/passports/mutate-role.js","components/team/passports/detail.js","icons/long-arrow.svg","components/team/passports/trusted-issuer.js","components/team/passports/trusted-issuers.js","components/team/passports/index.js","pages/team/index.js","hooks/mobile-width.js","components/confirm.js","contexts/team.js","components/click-to-copy.js","components/table-icons.js","components/table.js","components/team/styles/list-header.js","components/team/search-input.js","hooks/persistent-sort.js"],"names":["module","exports","Actions","actions","props","useState","anchorEl","setAnchorEl","open","Boolean","onClose","e","stopPropagation","preventDefault","Div","aria-label","aria-controls","aria-haspopup","data-cy","onClick","currentTarget","id","keepMounted","PaperProps","map","action","close","icon","text","disabled","opts","dense","style","minWidth","marginRight","primary","defaultProps","styled","div","PassportTag","passport","onDelete","rest","Tag","title","name","className","span","ButtonWithActions","children","anchorRef","useRef","unfold","setUnfold","variant","color","rounded","size","undefined","aria-expanded","ref","pre","current","role","placement","disablePortal","onClickAway","contains","target","PaginationList","list","rowsPerPage","empty","t","useLocaleContext","page","setPage","useEffect","length","count","Math","ceil","offset","data","slice","emptyElement","Box","mt","display","justifyContent","Pagination","onChange","value","InviteMember","teamDid","roles","onCancel","onSuccess","onError","authInfo","api","useNodeContext","loading","setLoading","error","setError","activeStep","setActiveStep","inviteInfo","setInviteInfo","setRole","remark","setRemark","onCreate","a","trimRemark","trim","createInvitation","input","info","errMsg","formatError","step","body","Typography","component","FormControl","width","InputLabel","Select","fullWidth","label","onKeyPress","key","filter","d","r","MenuItem","marginTop","marginBottom","TextField","autoComplete","cancel","confirm","onConfirm","link","getInviteLink","inviteId","endpoint","Bold","expireDate","formatToDatetime","showCloseButton","autoFocus","DialogContentText","type","PassportIssuances","issuances","onRefresh","client","useContext","LocaleContext","findInterfaceWithAuthService","useBlockletContext","delConfirm","setDelConfirm","enqueueSnackbar","useSnackbar","deleteIssuance","deletePassportIssuance","sessionId","message","autoHideDuration","getLink","column","getIssuePassportLink","Issuance","permission","can","description","x","params","IssuePassport","ownerDid","createPassportIssuance","disableBackdropClick","disableEscapeKeyDown","minHeight","ConfirmDescription","useTeamContext","find","fontWeight","Passports","user","session","useSessionContext","teamIssuerDid","refreshTeam","refresh","enablePassportIssuance","trustedPassports","toggleConfirm","setToggleConfirm","showIssueDialog","setShowIssueDialog","search","setSearch","passports","get","revoked","status","PASSPORT_STATUS","REVOKED","togglePassportStatus","method","userDid","did","passportId","revokeInfo","hasPermission","revokable","issuer","filteredPassports","includes","placeholder","approved","fontSize","alignItems","src","createPassportSvg","issuerDid","alt","upperFirst","some","y","Tooltip","ErrorOutlineIcon","mr","item","height","ToggleUserApproval","sessionUser","nodeInfo","show","setShow","updateUserApproval","Toast","approveConfirm","nodeOwner","isNodeOwner","Member","initTab","setIssuances","setUser","tab","setTab","getData","doBatchQuery","getUser","getPassportIssuances","res","useSubscription","tabConfigs","fullName","email","updatedAt","createdAt","row","valueComponent","nameWidth","nameFormatter","tabs","Object","values","tabConfig","maxWidth","BlockButton","Center","avatar","backgroundColor","mx","newTab","scrollButtons","Invitations","invitations","usePersistentSort","sortDirections","onSortChange","deleteInvitation","sleep","console","invitedUserOnly","textAlign","margin","columns","field","defaultSort","render","sorting","align","icons","tableIcons","onOrderChange","options","emptyRowsWhenPaging","actionsColumnIndex","tableLayout","maxBodyHeight","pageSize","pageSizeOptions","localization","toolbar","searchPlaceholder","emptyDataSourceMessage","MemberActions","onIssuePassport","setEnablePassportIssuance","o","ListItemIcon","ListItemText","hasRole","z","MemberList","users","showInviteMember","setShowInviteMember","showInviting","setShowInviting","memberDialog","setMemberDialog","roleTab","setRoleTab","usersBySearch","toLowerCase","sideList","num","unshift","push","isInvitationEnabled","sortedUsers","sort","b","Date","lastLoginAt","forEach","isFromExternal","marginLeft","edge","paginateUsers","main","ml","SimpleInfo","copyable","moment","fromNow","theme","breakpoints","md","MutateRole","mode","setTitle","setDescription","_title","desc","replace","md5","createRole","updateRole","paddingTop","helperText","multiline","rows","PassportDetail","roleName","permissions","isNodeTeam","binds","setBinds","updateForm","setUpdateForm","cloneDeep","isProtected","isProtectedRole","deletePassport","deleteRole","team","getPermissionsByRole","permissionList","bindList","bind","onBind","grantNames","updatePermissionsForRole","success","readPermissionsOnly","IconButton","fill","FormControlLabel","control","Checkbox","checked","state","withPermission","_path","_excluded","_extends","assign","i","arguments","source","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_ref","svgRef","createElement","viewBox","ForwardRef","forwardRef","canSave","mappings","from","to","TrustedIssuer","setIssuerDid","setMappings","editIndex","findIndex","configTrustedPassports","trustedList","prepend","event","ROLES","GUEST","index","my","flexGrow","flexBasis","flexShrink","select","splice","TrustedIssuers","trustedIssuer","setTrustedIssuer","deleteTrustedIssuer","filteredIssuers","ListHeader","PassportList","teamName","showCreate","setShowCreate","showTrustedIssuers","setShowTrustedIssuers","toggleShowIssue","configPassportIssuance","enable","filteredRoles","borderRight","TeamPage","history","useHistory","useParams","members","Members","member","Main","useMobileWidth","useTheme","useMediaQuery","down","sm","ConfirmDialog","showCancel","initialParams","setParams","setOpen","changeLocale","onCallback","cb","isBreakpointsDownSm","StyledDialog","fullScreen","DialogTitle","DialogContent","Alert","severity","DialogActions","padding","__disableConfirm","Dialog","TeamContext","React","createContext","Provider","Consumer","TeamProvider","blocklets","setUsers","setInvitations","setRoles","setPermissions","blocklet","meta","getTeamName","getTrustedPassports","environments","getTeamIssuerDid","getEnablePassportIssuance","getRoles","getPermissions","getUsers","getInvitations","RBAC_CONFIG","ci","onUserEvent","ClickToCopy","tip","copiedTip","Add","Check","Delete","Edit","Clear","DetailPanel","NextPage","Filter","FirstPage","LastPage","PreviousPage","Search","ResetSearch","SortArrow","Export","ThirdStateCheck","ViewColumn","TableStyle","SearchInput","InputProps","startAdornment","initialDirections","useLocalStorage","setSortDirections","columnIndex","directionValue","newSortDirections","Array"],"mappings":"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","file":"static/js/19.41a7de9e.chunk.js","sourcesContent":["module.exports = {};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MoreHorizIcon from '@material-ui/icons/MoreHoriz';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\n\nexport default function Actions({ actions, ...props }) {\n const [anchorEl, setAnchorEl] = useState(null);\n\n const open = Boolean(anchorEl);\n\n const onOpen = e => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(e.currentTarget);\n };\n\n const onClose = e => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(null);\n };\n\n return (\n <Div {...props}>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"actions-menu\"\n aria-haspopup=\"true\"\n data-cy=\"actions-menu-icon\"\n onClick={onOpen}>\n <MoreHorizIcon />\n </IconButton>\n\n <Menu\n id=\"actions-menu\"\n data-cy=\"actions-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n onClose={onClose}\n PaperProps={{}}>\n {actions.map(action => {\n if (typeof action === 'function') {\n return action({ close: onClose });\n }\n const { icon, text, onClick, disabled = false, ...opts } = action;\n return (\n <MenuItem\n {...opts}\n disabled={disabled}\n dense\n onClick={e => {\n onClose();\n onClick(e);\n }}>\n <ListItemIcon style={{ minWidth: 24, marginRight: 8 }}>{icon}</ListItemIcon>\n <ListItemText primary={text} />\n </MenuItem>\n );\n })}\n </Menu>\n </Div>\n );\n}\n\nActions.propTypes = {\n actions: PropTypes.array,\n};\n\nActions.defaultProps = {\n actions: [],\n};\n\nconst Div = styled.div``;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nexport default function PassportTag(props) {\n const { passport, onDelete, ...rest } = props;\n return (\n <Tag {...rest}>\n {passport.title || passport.name}{' '}\n {!!onDelete && <CloseIcon data-cy=\"delete-issuance\" className=\"delete\" onClick={onDelete} />}\n </Tag>\n );\n}\n\nPassportTag.propTypes = {\n passport: PropTypes.object.isRequired,\n onDelete: PropTypes.func,\n};\n\nPassportTag.defaultProps = {\n onDelete: null,\n};\n\nconst Tag = styled.span`\n display: inline-flex;\n padding: 2px 8px;\n background: #4f6af6;\n border-radius: 4px;\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n color: #fff;\n align-items: center;\n .delete {\n font-size: 1em;\n margin-left: 6px;\n cursor: pointer;\n }\n`;\n","import React, { useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\nimport Popper from '@material-ui/core/Popper';\nimport Paper from '@material-ui/core/Paper';\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\nimport MenuList from '@material-ui/core/MenuList';\nimport ButtonGroup from '@arcblock/ux/lib/ButtonGroup';\nimport Button from '@arcblock/ux/lib/Button';\n\nexport default function ButtonWithActions({ actions, children }) {\n const anchorRef = useRef(null);\n const [unfold, setUnfold] = useState(false);\n\n const onToggle = () => {\n setUnfold(pre => !pre);\n };\n\n const onClose = e => {\n if (anchorRef.current && anchorRef.current.contains(e.target)) {\n return;\n }\n\n setUnfold(false);\n };\n\n return (\n <ButtonGroup variant=\"contained\" color=\"primary\" aria-label=\"split button\" rounded>\n {children}\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n aria-controls={unfold ? 'split-button-menu' : undefined}\n aria-expanded={unfold ? 'true' : undefined}\n ref={anchorRef}\n data-cy=\"trusted-issuers-more\"\n onClick={onToggle}>\n <ArrowDropDownIcon />\n </Button>\n <Popper\n open={unfold}\n anchorEl={anchorRef.current}\n role={undefined}\n placement=\"bottom-end\"\n disablePortal={false}\n className=\"popper\">\n <Paper>\n <ClickAwayListener onClickAway={onClose}>\n <MenuList id=\"split-button-menu\">{actions.map(action => action)}</MenuList>\n </ClickAwayListener>\n </Paper>\n </Popper>\n </ButtonGroup>\n );\n}\n\nButtonWithActions.propTypes = {\n actions: PropTypes.array,\n children: PropTypes.any,\n};\n\nButtonWithActions.defaultProps = {\n actions: [],\n children: null,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport Box from '@material-ui/core/Box';\nimport Pagination from '@material-ui/lab/Pagination';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nexport default function PaginationList({ list, rowsPerPage, children, empty }) {\n const { t } = useLocaleContext();\n const [page, setPage] = useState(1);\n\n useEffect(() => {\n setPage(1);\n }, [list.length]);\n\n const count = Math.ceil(list.length / rowsPerPage);\n const offset = (page - 1) * rowsPerPage;\n const data = list.slice(offset, offset + rowsPerPage);\n\n const emptyElement = empty !== undefined ? empty : <Empty>{t('common.empty')}</Empty>;\n\n return (\n <>\n {children(data)}\n {!list.length && emptyElement}\n {!!list.length && count > 1 && (\n <Box mt={2} display=\"flex\" justifyContent=\"flex-end\">\n <Pagination\n count={count}\n page={page}\n onChange={(e, value) => {\n setPage(value);\n }}\n />\n </Box>\n )}\n </>\n );\n}\n\nPaginationList.propTypes = {\n list: PropTypes.array,\n rowsPerPage: PropTypes.number,\n children: PropTypes.func,\n empty: PropTypes.element,\n};\n\nPaginationList.defaultProps = {\n list: [],\n rowsPerPage: 10,\n children: () => null,\n empty: undefined,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Typography from '@material-ui/core/Typography';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport ClickToCopy from '../../click-to-copy';\nimport { useNodeContext } from '../../../contexts/node';\nimport { formatError, getInviteLink, formatToDatetime } from '../../../libs/util';\n\nexport default function InviteMember({ teamDid, roles, onCancel, onSuccess, onError, authInfo }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [activeStep, setActiveStep] = useState(0);\n\n const [inviteInfo, setInviteInfo] = useState('');\n const [role, setRole] = useState('');\n const [remark, setRemark] = useState('');\n\n const onCreate = async () => {\n if (!role) {\n setError(t('team.member.error.passportEmpty'));\n return;\n }\n\n const trimRemark = remark.trim();\n\n setError(null);\n setLoading(true);\n\n try {\n const { inviteInfo: info } = await api.createInvitation({\n input: { teamDid, role, remark: trimRemark },\n });\n setInviteInfo(info);\n setActiveStep(1);\n } catch (err) {\n const errMsg = formatError(err);\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n const steps = [\n {\n body: (\n <Typography component=\"div\">\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"invite-member-select-role\"\n value={role}\n onChange={e => {\n setError(null);\n setRole(e.target.value);\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onCreate();\n }\n }}>\n {roles\n .filter(d => d.name !== 'owner')\n .map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`invite-member-select-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <div style={{ marginTop: 20, marginBottom: 10 }} />\n <TextField\n label={t('common.remark')}\n autoComplete=\"off\"\n variant=\"outlined\"\n fullWidth\n style={{ marginBottom: 8 }}\n value={remark}\n onChange={e => {\n setError(null);\n setRemark(e.target.value);\n }}\n disabled={loading}\n data-cy=\"invite-member-input-remark\"\n />\n <div style={{ marginTop: 20, marginBottom: 10 }} />\n </Typography>\n ),\n cancel: t('common.cancel'),\n confirm: t('team.member.inviteDialog.createInviteLink'),\n onCancel,\n onConfirm: onCreate,\n },\n {\n body: () => {\n const link = getInviteLink({\n inviteId: inviteInfo.inviteId,\n endpoint: authInfo.endpoint,\n });\n return (\n <div>\n <Bold>\n {t('team.member.inviteDialog.createSuccessTip', { expireDate: formatToDatetime(inviteInfo.expireDate) })}\n </Bold>\n <div style={{ marginTop: '40px' }} />\n <ClickToCopy>{link}</ClickToCopy>\n </div>\n );\n },\n confirm: t('common.confirm'),\n onConfirm: onSuccess,\n },\n ];\n const step = steps[activeStep];\n\n return (\n <Dialog\n title={t('common.invite')}\n fullWidth\n open\n showCloseButton={false}\n actions={\n <>\n {step.cancel && (\n <Button onClick={step.onCancel} color=\"default\" rounded size=\"small\">\n {step.cancel}\n </Button>\n )}\n <Button\n onClick={step.onConfirm}\n color=\"primary\"\n size=\"small\"\n disabled={loading || !role}\n variant=\"contained\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {step.confirm}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">{typeof step.body === 'function' ? step.body() : step.body}</DialogContentText>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\">\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nInviteMember.propTypes = {\n teamDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n roles: PropTypes.array,\n authInfo: PropTypes.object,\n};\n\nInviteMember.defaultProps = {\n onError: () => {},\n roles: [],\n authInfo: {},\n};\n\nconst Bold = styled.div`\n font-size: 16px;\n font-weight: bold;\n`;\n","/* eslint-disable react/prop-types */\nimport React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport { useSnackbar } from 'notistack';\nimport Box from '@material-ui/core/Box';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport Confirm from '../../confirm';\nimport Permission from '../../permission';\nimport ClickToCopy from '../../click-to-copy';\nimport PassportTag from '../../passport-tag';\nimport { getIssuePassportLink, formatToDatetime } from '../../../libs/util';\n\nexport default function PassportIssuances({ issuances, teamDid, onRefresh }) {\n const { api: client } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const { findInterfaceWithAuthService } = useBlockletContext();\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n const { enqueueSnackbar } = useSnackbar();\n\n const deleteIssuance = async ({ id }) => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await client.deletePassportIssuance({ input: { teamDid, sessionId: id } });\n onRefresh();\n } catch (error) {\n enqueueSnackbar(error.message, { autoHideDuration: 5000, variant: 'error' });\n } finally {\n setLoading(false);\n setDelConfirm(null);\n }\n };\n\n const onCancel = () => {\n setLoading(false);\n setDelConfirm(null);\n };\n\n const authInfo = findInterfaceWithAuthService(teamDid);\n\n const getLink = column => (authInfo ? getIssuePassportLink({ id: column.id, endpoint: authInfo.endpoint }) : '');\n\n // eslint-disable-next-line react/prop-types\n const Issuance = ({ data: d }) => (\n <div className=\"issuance\">\n <Box display=\"flex\" justifyContent=\"space-between\">\n <Permission permission=\"mutate_team\">\n {can =>\n can ? (\n <PassportTag\n passport={{ title: d.title, name: d.name }}\n onDelete={() =>\n setDelConfirm({\n title: t('team.passport.issuance.delete.title'),\n description: t('team.passport.issuance.delete.description', { link: getLink(d) }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n deleteIssuance(d);\n },\n onCancel,\n })\n }\n />\n ) : (\n <PassportTag passport={{ title: d.title, name: d.name }} />\n )\n }\n </Permission>\n <div style={{ color: '#999' }}>\n {t('common.expires')}\n :&nbsp;\n {formatToDatetime(d.expireDate)}\n </div>\n </Box>\n <Box mt={2}>\n <ClickToCopy>{getLink(d)}</ClickToCopy>\n </Box>\n </div>\n );\n\n return (\n <Div>\n {issuances.map(x => (\n <Issuance data={x} />\n ))}\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .MuiTableHead-root {\n display: none;\n }\n .issuance {\n padding: 16px 0;\n border-bottom: 1px solid #f0f0f0;\n .MuiTypography-root {\n display: inline-block;\n width: 100%;\n background: #f3f3f3;\n border-radius: 4px;\n padding-top: 6px;\n padding-bottom: 6px;\n }\n }\n`;\n\nPassportIssuances.propTypes = {\n teamDid: PropTypes.string.isRequired,\n issuances: PropTypes.array,\n onRefresh: PropTypes.func,\n};\n\nPassportIssuances.defaultProps = {\n issuances: [],\n onRefresh: () => {},\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Typography from '@material-ui/core/Typography';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { formatError } from '../../../libs/util';\n\nexport default function IssuePassport({ teamDid, ownerDid, roles, onCancel, onSuccess, onError }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [role, setRole] = useState('');\n\n const onCreate = async () => {\n if (!role) {\n setError(t('team.member.error.passportEmpty'));\n return;\n }\n\n setError(null);\n setLoading(true);\n\n try {\n await api.createPassportIssuance({ input: { teamDid, name: role, ownerDid } });\n onSuccess();\n } catch (err) {\n const errMsg = formatError(err);\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog\n title={t('team.passport.issue')}\n fullWidth\n open\n onClick={e => e.stopPropagation()}\n onClose={onCancel}\n disableBackdropClick\n disableEscapeKeyDown\n PaperProps={{ style: { minHeight: 'auto' } }}\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded size=\"small\">\n {t('common.cancel')}\n </Button>\n <Button\n onClick={onCreate}\n color=\"primary\"\n size=\"small\"\n disabled={loading || !role}\n variant=\"contained\"\n autoFocus\n data-cy=\"issue-passport-create-btn\"\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {t('team.passport.issuance.create.title')}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">\n <Typography component=\"div\">\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"issue-passport-select-passport\"\n value={role}\n onChange={e => {\n setError(null);\n setRole(e.target.value);\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onCreate();\n }\n }}>\n {roles\n .filter(d => d.name !== 'owner')\n .map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`issue-passport-select-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Typography>\n </DialogContentText>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\">\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nIssuePassport.propTypes = {\n teamDid: PropTypes.string.isRequired,\n ownerDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n roles: PropTypes.array,\n};\n\nIssuePassport.defaultProps = {\n onError: () => {},\n roles: [],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { useSnackbar } from 'notistack';\nimport get from 'lodash/get';\nimport upperFirst from 'lodash/upperFirst';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Box from '@material-ui/core/Box';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport RevokeIcon from '@arcblock/icons/lib/RevokeIcon';\nimport ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport { PASSPORT_STATUS } from '@abtnode/constant';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useSessionContext } from '../../../contexts/session';\nimport { useTeamContext } from '../../../contexts/team';\nimport { formatError, createPassportSvg } from '../../../libs/util';\nimport Confirm from '../../confirm';\nimport Permission from '../../permission';\nimport SearchInput from '../search-input';\nimport ListHeader from '../styles/list-header';\nimport IssuePassport from './issue-passport';\n\nconst ConfirmDescription = ({ action, passport }) => {\n const { t } = useLocaleContext();\n const { roles } = useTeamContext();\n const role = roles.find(x => x.name === passport.role);\n return (\n <div>\n <div>\n {action === 'enable' ? t('team.member.enablePassportDescription') : t('team.member.revokePassportDescription')}\n </div>\n {role && (\n <Box mt={3} fontWeight=\"bold\">\n {t('team.member.passportPermissionTitle')}\n </Box>\n )}\n {role && <Box mt={1}>{role.description}</Box>}\n </div>\n );\n};\nConfirmDescription.propTypes = {\n action: PropTypes.string.isRequired,\n passport: PropTypes.object.isRequired,\n};\nConfirmDescription.defaultProps = {};\n\nexport default function Passports({ user, onCreate }) {\n const { t } = useLocaleContext();\n const { session } = useSessionContext();\n const {\n roles,\n teamDid,\n teamIssuerDid,\n refresh: refreshTeam,\n enablePassportIssuance,\n trustedPassports,\n } = useTeamContext();\n const { api } = useNodeContext();\n const { enqueueSnackbar } = useSnackbar();\n const [loading, setLoading] = useState(false);\n const [toggleConfirm, setToggleConfirm] = useState(null);\n const [showIssueDialog, setShowIssueDialog] = useState(false);\n const [search, setSearch] = useState('');\n\n const passports = (get(user, 'passports') || []).map(x => ({ ...x, revoked: x.status === PASSPORT_STATUS.REVOKED }));\n\n const togglePassportStatus = async passport => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n const method = passport.status === PASSPORT_STATUS.REVOKED ? 'enableUserPassport' : 'revokeUserPassport';\n await api[method]({ input: { teamDid, userDid: user.did, passportId: passport.id } });\n refreshTeam();\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 5000, variant: 'error' });\n } finally {\n setLoading(false);\n setToggleConfirm(null);\n }\n };\n\n const confirmToggle = item =>\n item.status === PASSPORT_STATUS.REVOKED\n ? setToggleConfirm({\n title: t('team.member.enablePassport'),\n description: <ConfirmDescription action=\"enable\" passport={item} />,\n confirm: t('common.enable'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n togglePassportStatus(item);\n },\n onCancel: () => {\n setLoading(false);\n setToggleConfirm(null);\n },\n color: 'primary',\n })\n : setToggleConfirm({\n title: t('team.member.revokePassport'),\n description: <ConfirmDescription action=\"revoke\" passport={item} />,\n confirm: t('common.revoke'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n togglePassportStatus(item);\n },\n onCancel: () => {\n setLoading(false);\n setToggleConfirm(null);\n },\n });\n\n const revokeInfo = (hasPermission, passport) => {\n if (user.did === session.user.did && session.user.passportId && session.user.passportId === passport.id) {\n return {\n revokable: false,\n message: t('team.passport.shouldNotDeleteCurrent'),\n };\n }\n\n if (!hasPermission) {\n return {\n revokable: false,\n message: t('team.passport.noPermission'),\n };\n }\n\n if (teamDid === passport.issuer.id && passport.name === 'owner') {\n return {\n revokable: false,\n message: t('team.passport.noPermission'),\n };\n }\n\n return {\n revokable: true,\n };\n };\n\n const filteredPassports = passports.filter(x => !search || x.title.includes(search) || x.name.includes(search));\n\n return (\n <Div>\n <ListHeader>\n <div className=\"left\">\n <SearchInput\n placeholder={t('team.passport.search')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n />\n </div>\n <div className=\"right\">\n {enablePassportIssuance && !!user.approved && (\n <Permission permission=\"mutate_team\">\n <Button\n variant=\"contained\"\n rounded\n color=\"primary\"\n data-cy=\"issue-passport\"\n onClick={() => setShowIssueDialog(true)}>\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.passport.issue')}\n </Button>\n </Permission>\n )}\n </div>\n </ListHeader>\n\n <Box>\n {filteredPassports.map(x => (\n <Permission permission=\"mutate_team\">\n {can => (\n <Box className=\"passport-item\" display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mt={3}>\n <Box display=\"flex\" alignItems=\"center\">\n <div>\n <img\n style={{ width: 120 }}\n src={createPassportSvg({\n issuer: x.issuer && x.issuer.name,\n issuerDid: x.issuer && x.issuer.id,\n title: x.title || x.name,\n })}\n alt={x.title}\n />\n </div>\n <div className=\"body\">\n <Box className=\"title\" display=\"flex\" alignItems=\"center\">\n {upperFirst(x.title)}\n <div className=\"status-icons\">\n {!!teamIssuerDid && x.issuer.id !== teamIssuerDid && <ExternalIssuerIcon />}\n {x.revoked && <RevokeIcon />}\n </div>\n </Box>\n {!!teamIssuerDid && x.issuer.id !== teamIssuerDid && (\n <div className=\"tip\">\n {x.issuer.id !== teamIssuerDid && !trustedPassports.some(y => y.issuerDid === x.issuer.id) && (\n <Tooltip title={t('team.passport.notTrustedIssuerTip')}>\n <Box\n component={ErrorOutlineIcon}\n style={{ fontSize: '1.3em' }}\n color=\"error.main\"\n mr={0.5}\n />\n </Tooltip>\n )}\n <span>{t('team.passport.issueBy', { name: x.issuer.name })}</span>\n </div>\n )}\n </div>\n </Box>\n <Box>\n {revokeInfo(can, x).revokable ? (\n <Button\n variant=\"outlined\"\n rounded\n color={x.revoked ? 'primary' : 'secondary'}\n onClick={() => confirmToggle(x)}>\n {x.revoked ? (\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n ) : (\n <RevokeIcon style={{ height: 16, marginRight: 4 }} />\n )}\n {x.revoked ? t('common.enable') : t('common.revoke')}\n </Button>\n ) : (\n <Tooltip title={revokeInfo(can, x).message}>\n <ErrorOutlineIcon style={{ color: '#ddd' }} />\n </Tooltip>\n )}\n </Box>\n </Box>\n )}\n </Permission>\n ))}\n {!filteredPassports.length && <Empty>{t('common.empty')}</Empty>}\n </Box>\n\n {showIssueDialog && (\n <IssuePassport\n teamDid={teamDid}\n ownerDid={user.did}\n roles={roles}\n onCancel={() => setShowIssueDialog(false)}\n onSuccess={() => {\n onCreate();\n setShowIssueDialog(false);\n }}\n />\n )}\n\n {toggleConfirm && (\n <Confirm\n title={toggleConfirm.title}\n description={toggleConfirm.description}\n confirm={toggleConfirm.confirm}\n cancel={toggleConfirm.cancel}\n params={toggleConfirm.params}\n onConfirm={toggleConfirm.onConfirm}\n onCancel={toggleConfirm.onCancel}\n color={toggleConfirm.color}\n />\n )}\n </Div>\n );\n}\n\nPassports.propTypes = {\n user: PropTypes.object.isRequired,\n onCreate: PropTypes.func,\n};\n\nPassports.defaultProps = {\n onCreate: () => {},\n};\n\nconst Div = styled.div`\n .passport-item {\n .body {\n padding: 0;\n margin-left: 24px;\n margin-top: 0;\n }\n .title {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #222222;\n }\n .tip {\n display: flex;\n align-items: center;\n font-size: 14px;\n margin-top: 6px;\n color: #bbb;\n }\n .status-icons {\n svg {\n fill: #bfbfbf;\n height: 1.2em;\n margin-left: 0.4em;\n }\n }\n .MuiButton-outlinedSecondary {\n color: #f16e6e;\n fill: #f16e6e;\n background: #fcf3f3;\n border: 0;\n &:hover {\n border: 0;\n }\n }\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Confirm from '../../confirm';\nimport Toast from '../../toast';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { useSessionContext } from '../../../contexts/session';\nimport { formatError } from '../../../libs/util';\n\nconst isNodeOwner = (nodeInfo, userDid) => nodeInfo.nodeOwner.did === userDid;\nconst isSelf = (sessionUser, userDid) => sessionUser && sessionUser.did === userDid;\n\nexport default function ToggleUserApproval({ user, onCancel, onSuccess, onError, children }) {\n const { api, info: nodeInfo } = useNodeContext();\n const { session } = useSessionContext();\n const { teamDid, refresh } = useTeamContext();\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [show, setShow] = useState(false);\n\n const open = () => setShow(true);\n\n const updateUserApproval = async d => {\n const { did, approved } = d;\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await api.updateUserApproval({\n input: {\n teamDid,\n user: {\n did,\n approved: !approved,\n },\n },\n });\n setShow(false);\n onSuccess();\n refresh();\n } catch (error) {\n Toast.error(formatError(error));\n onError();\n } finally {\n setLoading(false);\n }\n };\n\n const approveConfirm = {\n title: user.approved ? t('team.member.forbidLogin') : t('team.member.allowLogin'),\n description: user.approved ? t('team.member.forbidLoginDescription') : t('team.member.allowLoginDescription'),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n updateUserApproval(user);\n },\n onCancel: () => {\n setLoading(false);\n setShow(false);\n onCancel();\n },\n color: user.approved ? 'danger' : 'primary',\n };\n\n const can = nodeInfo.nodeOwner && !isNodeOwner(nodeInfo, user.did) && !isSelf(session.user, user.did);\n\n if (!can) {\n return null;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ can, open }) : children}\n\n {show ? (\n <Confirm\n title={approveConfirm.title}\n description={approveConfirm.description}\n confirm={approveConfirm.confirm}\n cancel={approveConfirm.cancel}\n params={approveConfirm.params}\n onConfirm={approveConfirm.onConfirm}\n onCancel={approveConfirm.onCancel}\n color={approveConfirm.color}\n />\n ) : null}\n </>\n );\n}\n\nToggleUserApproval.propTypes = {\n user: PropTypes.object,\n onSuccess: PropTypes.func,\n onCancel: PropTypes.func,\n onError: PropTypes.func,\n children: PropTypes.object,\n};\n\nToggleUserApproval.defaultProps = {\n user: {},\n onSuccess: () => {},\n onCancel: () => {},\n onError: () => {},\n children: null,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { useSnackbar } from 'notistack';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Box from '@material-ui/core/Box';\nimport Avatar from '@material-ui/core/Avatar';\n\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport ForbidLoginIcon from '@arcblock/icons/lib/ForbidLoginIcon';\nimport AllowLoginIcon from '@arcblock/icons/lib/AllowLoginIcon';\n\nimport Permission from '../../permission';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { formatError, formatToDatetime } from '../../../libs/util';\nimport { useSubscription } from '../../../libs/ws';\nimport PassportIssuances from './passport-issuances';\nimport Passports from './passports';\nimport ToggleUserApproval from './toggle-user-approval';\n\nexport default function Member({ userDid, onCancel, initTab }) {\n const { api } = useNodeContext();\n const { roles, teamDid, enablePassportIssuance } = useTeamContext();\n const { t } = useLocaleContext();\n const [issuances, setIssuances] = useState(null);\n const [user, setUser] = useState(null);\n const { enqueueSnackbar } = useSnackbar();\n const [tab, setTab] = useState(initTab || 'info');\n\n const getData = async () => {\n try {\n const res = await api.doBatchQuery({\n getUser: { input: { teamDid, user: { did: userDid } } },\n getPassportIssuances: { input: { teamDid, ownerDid: userDid } },\n });\n setUser(res.getUser.user || {});\n setIssuances(res.getPassportIssuances.list || []);\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 5000, variant: 'error' });\n }\n };\n\n useEffect(() => {\n if (teamDid) {\n getData();\n }\n }, [userDid, teamDid]); // eslint-disable-line\n\n const onUserEvent = data => {\n if (data.teamDid === teamDid && data.user && data.user.did === userDid) {\n getData();\n }\n };\n\n useSubscription('user.updated', onUserEvent, [userDid, teamDid]);\n\n useEffect(() => {\n if (issuances && !issuances.length && tab === 'issuances') {\n setTab('info');\n }\n }, [issuances]); // eslint-disable-line\n\n // tab\n const Info = () => {\n const rows = user\n ? [\n { name: t('team.member.name'), value: user.fullName },\n { name: t('common.email'), value: user.email },\n { name: t('team.member.allowLogin'), value: user.approved ? t('common.yes') : t('common.no') },\n { name: t('team.member.lastLogin'), value: formatToDatetime(user.updatedAt) },\n { name: t('common.createdAt'), value: formatToDatetime(user.createdAt) },\n { name: t('common.remark'), value: user.remark || '--' },\n ].filter(Boolean)\n : [];\n\n return rows.map(row => {\n if (row.name === t('common.did')) {\n return (\n <InfoRow\n valueComponent=\"div\"\n key={row.name}\n nameWidth={120}\n name={row.name}\n nameFormatter={() => t('common.did')}>\n {row.value}\n </InfoRow>\n );\n }\n\n return (\n <InfoRow\n style={{ alignItems: 'flex-start' }}\n valueComponent=\"div\"\n key={row.name}\n nameWidth={120}\n name={row.name}>\n {row.value}\n </InfoRow>\n );\n });\n };\n\n const tabConfigs = {\n info: {\n label: t('common.basicInfo'),\n value: 'info',\n component: Info,\n },\n passports: {\n label: t('common.passport'),\n value: 'passports',\n component: () => (\n <Passports\n user={user}\n teamDid={teamDid}\n roles={roles}\n onCreate={() => {\n getData(teamDid);\n setTab('issuances');\n }}\n onRefresh={() => {\n getData(teamDid);\n }}\n />\n ),\n },\n issuances: {\n label: t('team.passport.issuance.pending'),\n value: 'issuances',\n component: () => (\n <PassportIssuances issuances={issuances || []} teamDid={teamDid} onRefresh={() => getData(teamDid)} />\n ),\n },\n };\n\n const tabs = Object.values(tabConfigs)\n .map(({ label, value }) => ({ label, value }))\n .filter(x => {\n if (x.value === 'issuances') {\n return enablePassportIssuance && issuances && !!issuances.length;\n }\n\n return true;\n });\n const tabConfig = tabConfigs[tab] || tabConfigs.info;\n const onTabChange = newTab => {\n setTab(newTab);\n };\n\n return (\n <Dialog\n title={t('common.member')}\n onClose={onCancel}\n open\n PaperProps={{ style: { maxWidth: 632, minHeight: '80vh' } }}\n fullWidth\n actions={\n user && (\n <Permission permission=\"mutate_team\">\n <ToggleUserApproval user={user}>\n {({ open }) => (\n <BlockButton onClick={open}>\n {user.approved ? (\n <ForbidLoginIcon style={{ fontSize: '1.2em', marginRight: '0.4em' }} />\n ) : (\n <AllowLoginIcon style={{ fontSize: '1.2em', marginRight: '0.4em' }} />\n )}\n {user.approved ? t('team.member.forbidLogin') : t('team.member.allowLogin')}\n </BlockButton>\n )}\n </ToggleUserApproval>\n </Permission>\n )\n }>\n <Div>\n {!user && (\n <Center>\n <Spinner />\n </Center>\n )}\n\n {user && (\n <div>\n {/* info */}\n <Box display=\"flex\" alignItems=\"center\" className=\"info\">\n <Avatar\n src={user.avatar}\n style={{ width: 48, height: 48, backgroundColor: 'transparent', marginRight: 16 }}\n />\n <Box>\n <Box className=\"name\">{user.fullName}</Box>\n <Box className=\"did\" mt={1}>\n <DidAddress>{user.did}</DidAddress>\n </Box>\n </Box>\n </Box>\n\n {/* tabs */}\n <Box mx={3} className=\"tabs\">\n <Tabs tabs={tabs} current={tab} onChange={onTabChange} scrollButtons=\"auto\" />\n </Box>\n\n {/* body */}\n <div className=\"body\">\n <tabConfig.component />\n </div>\n </div>\n )}\n </Div>\n </Dialog>\n );\n}\n\nMember.propTypes = {\n userDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n initTab: PropTypes.string,\n};\n\nMember.defaultProps = {\n initTab: 'info',\n};\n\nconst Div = styled.div`\n .info {\n .name {\n font-weight: 500;\n font-size: 18px;\n line-height: 25px;\n color: #222222;\n }\n }\n\n .tabs {\n margin-top: 24px;\n margin-left: 0;\n margin-right: 0;\n }\n\n .body {\n margin-top: 24px;\n }\n`;\n\nconst Center = styled.div`\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n`;\n\nconst BlockButton = styled.div`\n flex-shrink: 0;\n width: 100%;\n height: 64px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n color: #999;\n fill: #999;\n font-size: 16px;\n border-top: 1px solid #f0f0f0;\n position: sticky;\n bottom: 0;\n background: #fff;\n z-index: 10;\n`;\n","import React, { useContext, useState } from 'react';\nimport styled from 'styled-components';\n\nimport MaterialTable from 'material-table';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport Confirm from '../../confirm';\nimport tableIcons from '../../table-icons';\nimport TableStyle from '../../table';\nimport usePersistentSort from '../../../hooks/persistent-sort';\nimport Permission from '../../permission';\nimport ClickToCopy from '../../click-to-copy';\nimport { sleep, getInviteLink, formatToDatetime } from '../../../libs/util';\n\nexport default function Invitations() {\n const { api: client } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const { findInterfaceWithAuthService } = useBlockletContext();\n const { teamDid, invitations, refresh } = useTeamContext();\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n\n const { sortDirections, onSortChange } = usePersistentSort('invitations', ['', '', '', '', '', '']);\n\n const deleteInvitation = async ({ inviteId }) => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await client.deleteInvitation({ input: { teamDid, inviteId } });\n refresh();\n await sleep(800);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setDelConfirm(null);\n }\n };\n\n const onCancel = () => {\n setLoading(false);\n setDelConfirm(null);\n };\n\n const authInfo = findInterfaceWithAuthService(teamDid);\n\n const isInvitationEnabled = authInfo && authInfo.invitedUserOnly;\n if (!isInvitationEnabled) {\n return <h2 style={{ textAlign: 'center', margin: '100px 0', color: '#bbb' }}>{t('team.inviting.disabledTip')}</h2>;\n }\n\n const getLink = column => {\n if (!authInfo) {\n return '';\n }\n return getInviteLink({ inviteId: column.inviteId, endpoint: authInfo.endpoint });\n };\n\n const columns = [\n {\n title: t('team.inviting.link'),\n field: 'inviteId',\n defaultSort: sortDirections[0],\n render: d => {\n if (!authInfo) {\n return null;\n }\n return <ClickToCopy>{getLink(d)}</ClickToCopy>;\n },\n },\n {\n title: t('common.remark'),\n field: 'remark',\n defaultSort: sortDirections[1],\n render: d => d.remark || '--',\n },\n {\n title: t('team.inviting.inviter'),\n field: 'inviter.fullName',\n defaultSort: sortDirections[2],\n },\n {\n title: t('common.expires'),\n field: 'inviter.expireDate',\n defaultSort: sortDirections[3],\n render: d => formatToDatetime(d.expireDate),\n },\n {\n title: t('common.actions'),\n sorting: false,\n align: 'center',\n render: item => (\n <Permission permission=\"mutate_team\">\n <Button\n rounded\n onClick={() =>\n setDelConfirm({\n title: t('team.inviting.delete.title'),\n description: t('team.inviting.delete.description', { link: getLink(item) }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => deleteInvitation(item),\n onCancel,\n })\n }\n size=\"small\"\n color=\"danger\"\n variant=\"text\">\n <DeleteIcon style={{ fontSize: '1.2em' }} />\n {t('common.delete')}\n </Button>\n </Permission>\n ),\n },\n ];\n\n return (\n <Div>\n <TableStyle>\n {invitations.length ? (\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n onOrderChange={onSortChange}\n options={{\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n search: false,\n pageSize: 20,\n pageSizeOptions: [20, 50, 100],\n }}\n localization={{\n toolbar: { searchPlaceholder: t('common.search') },\n body: {\n emptyDataSourceMessage: t('common.noData'),\n },\n }}\n data={invitations}\n />\n ) : (\n <Empty>{t('common.empty')}</Empty>\n )}\n </TableStyle>\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .table-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 20px;\n font-size: 14px;\n }\n`;\n\nInvitations.propTypes = {};\n\nInvitations.defaultProps = {};\n","import React, { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport MenuItem from '@material-ui/core/MenuItem';\nimport AddIcon from '@material-ui/icons/Add';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ForbidLoginIcon from '@arcblock/icons/lib/ForbidLoginIcon';\nimport AllowLoginIcon from '@arcblock/icons/lib/AllowLoginIcon';\n\nimport { useTeamContext } from '../../../contexts/team';\nimport Actions from '../../actions';\nimport IssuePassport from './issue-passport';\nimport ToggleUserApproval from './toggle-user-approval';\n\nexport default function MemberActions({ user, onIssuePassport }) {\n const { teamDid, roles } = useTeamContext();\n const { t } = useContext(LocaleContext);\n const [enablePassportIssuance, setEnablePassportIssuance] = useState(false);\n\n return (\n <>\n <Actions\n data-cy=\"member-actions\"\n actions={[\n {\n icon: <AddIcon fontSize=\"small\" />,\n text: t('team.passport.issue'),\n 'data-cy': 'action-issue-passport',\n onClick: e => {\n e.stopPropagation();\n setEnablePassportIssuance(true);\n },\n },\n ({ close }) => (\n <ToggleUserApproval user={user}>\n {({ open: o }) => (\n <MenuItem\n dense\n key=\"toggle-approval\"\n onClick={e => {\n e.stopPropagation();\n close();\n o(e);\n }}\n data-cy=\"action-toggle-block\">\n <ListItemIcon style={{ minWidth: 24, marginRight: 8 }}>\n {user.approved ? <ForbidLoginIcon /> : <AllowLoginIcon />}\n </ListItemIcon>\n <ListItemText primary={user.approved ? t('team.member.forbidLogin') : t('team.member.allowLogin')} />\n </MenuItem>\n )}\n </ToggleUserApproval>\n ),\n ]}\n />\n {enablePassportIssuance && (\n <IssuePassport\n teamDid={teamDid}\n ownerDid={user.did}\n roles={roles}\n onCancel={() => setEnablePassportIssuance(false)}\n onSuccess={() => {\n onIssuePassport();\n setEnablePassportIssuance(false);\n }}\n />\n )}\n </>\n );\n}\n\nMemberActions.propTypes = {\n user: PropTypes.object.isRequired,\n onIssuePassport: PropTypes.func,\n};\n\nMemberActions.defaultProps = {\n onIssuePassport: () => {},\n};\n","import React, { useContext, useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport moment from 'moment';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Box from '@material-ui/core/Box';\nimport AddIcon from '@material-ui/icons/Add';\nimport Address from '@arcblock/did-connect/lib/Address';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport PersonIcon from '@arcblock/icons/lib/PersonIcon';\nimport ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';\n\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport { useTeamContext } from '../../../contexts/team';\nimport PaginationList from '../../pagination-list';\nimport Permission from '../../permission';\nimport ListHeader from '../styles/list-header';\nimport SearchInput from '../search-input';\nimport InviteMember from './invite-member';\nimport Member from './member';\nimport Invitations from './invitations';\nimport Actions from './actions';\n\nconst ROLE_NONE = '__none__';\n\nconst hasRole = (user, role) => {\n if (role === ROLE_NONE) {\n return !user.passports || !user.passports.length;\n }\n\n return (user.passports || []).some(z => z.role === role);\n};\n\nconst isFromExternal = (user, teamIssuerDid) => {\n const list = user.passports || [];\n if (!list.length) {\n return false;\n }\n\n return !list.some(z => z.issuer.id === teamIssuerDid);\n};\n\nexport default function MemberList() {\n const { teamDid, teamIssuerDid, users, invitations, roles, refresh, enablePassportIssuance } = useTeamContext();\n const { findInterfaceWithAuthService } = useBlockletContext();\n const { t } = useContext(LocaleContext);\n const [showInviteMember, setShowInviteMember] = useState(false);\n const [showInviting, setShowInviting] = useState(false);\n const [memberDialog, setMemberDialog] = useState(false); // member, inviting\n const [roleTab, setRoleTab] = useState('all');\n const [search, setSearch] = useState('');\n\n const usersBySearch = users.filter(\n x => !search || x.did.includes(search) || x.fullName.toLowerCase().includes(search.toLowerCase())\n );\n\n const sideList = (roles || []).map(x => ({\n name: x.name,\n title: x.title,\n num: (usersBySearch || []).filter(y => hasRole(y, x.name)).length || 0,\n }));\n sideList.unshift({\n name: 'all',\n title: 'All Members',\n num: (usersBySearch || []).length,\n });\n sideList.push({\n name: ROLE_NONE,\n title: 'Other',\n num: (usersBySearch || []).filter(x => hasRole(x, ROLE_NONE)).length || 0,\n });\n\n useEffect(() => {\n setRoleTab('all');\n }, [search]);\n\n const SimpleInfo = d => {\n const main = (\n <div className=\"info\">\n <div className=\"avatar\">\n <div className=\"icon\">\n <Avatar size={46} did={d.did} />\n </div>\n {!d.approved && <did className=\"badge-block\" />}\n </div>\n <Box className=\"title\" display=\"flex\" alignItems=\"center\">\n <div className=\"text\">{d.fullName}</div>\n {d.isFromExternal && (\n <Tooltip title={t('team.passport.externalPassport')}>\n <Box ml={1} className=\"icon\">\n <ExternalIssuerIcon />\n </Box>\n </Tooltip>\n )}\n </Box>\n </div>\n );\n return d.approved ? (\n main\n ) : (\n <Box display=\"flex\" alignItems=\"center\">\n <Tooltip title={t('team.member.forbidLoginDescription')}>{main}</Tooltip>\n </Box>\n );\n };\n\n const authInfo = findInterfaceWithAuthService(teamDid);\n const isInvitationEnabled = authInfo && authInfo.invitedUserOnly && enablePassportIssuance;\n\n const filteredUsers = usersBySearch.filter(x => roleTab === 'all' || hasRole(x, roleTab));\n const sortedUsers = filteredUsers.sort((a, b) => (new Date(a.lastLoginAt) > new Date(b.lastLoginAt) ? -1 : 1));\n sortedUsers.forEach(x => {\n x.isFromExternal = isFromExternal(x, teamIssuerDid);\n });\n\n return (\n <Div>\n {/* header */}\n <ListHeader>\n <div className=\"left\">\n <SearchInput placeholder={t('team.member.search')} value={search} onChange={e => setSearch(e.target.value)} />\n </div>\n <div className=\"right\">\n {isInvitationEnabled && (\n <>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n rounded\n onClick={() => {\n setShowInviting(true);\n }}>\n <PersonIcon style={{ height: '1em', marginRight: 4 }} />\n {t('common.inviting')}\n {invitations.length ? ` (${invitations.length})` : ''}\n </Button>\n <Permission permission=\"mutate_team\">\n <Button\n style={{ marginLeft: 16 }}\n variant=\"contained\"\n rounded\n edge=\"end\"\n color=\"primary\"\n data-cy=\"invite-member\"\n onClick={() => setShowInviteMember(true)}>\n <AddIcon style={{ fontSize: '1.3em', marginRight: 4 }} />\n {t('team.invite')}\n </Button>\n </Permission>\n </>\n )}\n {showInviteMember && (\n <InviteMember\n teamDid={teamDid}\n authInfo={authInfo}\n roles={roles}\n onCancel={() => setShowInviteMember(false)}\n onSuccess={() => {\n refresh();\n setShowInviteMember(false);\n }}\n />\n )}\n </div>\n </ListHeader>\n\n <Box mt={3} className=\"main\" display=\"flex\">\n <div className=\"left\">\n <div className=\"tabs\">\n {sideList.map(x => (\n <div className={`tab ${roleTab === x.name ? 'active' : ''}`} onClick={() => setRoleTab(x.name)}>\n <span className=\"text\">{x.title}</span>\n <span className=\"badge\">{x.num}</span>\n </div>\n ))}\n </div>\n </div>\n <div className=\"right\">\n <PaginationList list={sortedUsers}>\n {paginateUsers => (\n <Box className=\"list\">\n {paginateUsers.map(x => (\n <Box\n className=\"item\"\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n data-cy={`member-name-${x.fullName}`}\n onClick={() => setMemberDialog(x)}>\n <Box display=\"flex\" alignItems=\"center\">\n {SimpleInfo(x)}\n <Box ml={5} className=\"address\">\n <Address copyable={false}>{x.did}</Address>\n </Box>\n </Box>\n <Box display=\"flex\" alignItems=\"center\">\n <Box mr={5} style={{ color: '#999', fontSize: 14 }}>\n {x.lastLoginAt ? moment(x.lastLoginAt).fromNow() : '--'}\n </Box>\n <Permission permission=\"mutate_team\">\n <Actions user={x} onIssuePassport={() => setMemberDialog({ ...x, initTab: 'issuances' })} />\n </Permission>\n </Box>\n </Box>\n ))}\n </Box>\n )}\n </PaginationList>\n </div>\n </Box>\n\n {/* table */}\n <Dialog\n title={t('common.inviting')}\n onClose={() => setShowInviting(false)}\n open={showInviting}\n maxWidth=\"lg\"\n fullWidth>\n <Invitations />\n </Dialog>\n\n {memberDialog && (\n <Member onCancel={() => setMemberDialog(null)} userDid={memberDialog.did} initTab={memberDialog.initTab} />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .main {\n .left {\n width: 168px;\n flex-shrink: 0;\n margin-right: 65px;\n .tabs {\n padding-top: 16px;\n .tab {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n transition: background 0.4s;\n\n width: 168px;\n height: 36px;\n border-radius: 8px;\n\n cursor: pointer;\n user-select: none;\n\n &:nth-child(n + 2) {\n margin-top: 24px;\n }\n\n &.active {\n background: #f2f2f2;\n }\n\n &:hover {\n background: #f2f2f2;\n }\n\n .text {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n\n color: #222222;\n }\n\n .badge {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 20px;\n height: 20px;\n border-radius: 100%;\n color: #fff;\n background: #666666;\n font-size: 10px;\n font-weight: 500;\n }\n }\n }\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n display: none;\n }\n }\n .right {\n flex-grow: 1;\n }\n }\n\n .list {\n margin-top: 4px;\n margin-left: 40px;\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n margin-left: 0;\n }\n .item {\n padding: 12px;\n margin: 0 -12px;\n cursor: pointer;\n transition: box-shadow 0.4s;\n &:hover {\n box-shadow: 0 0 10px 4px rgba(0, 0, 0, 0.1);\n }\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n .address {\n display: none;\n }\n }\n .info {\n display: flex;\n align-items: center;\n .avatar {\n position: relative;\n box-sizing: border-box;\n width: 48px;\n height: 48px;\n .icon {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border: 1px solid #eee;\n border-radius: 100%;\n background: #eee;\n overflow: hidden;\n }\n .badge-block {\n width: 20px;\n height: 20px;\n position: absolute;\n right: -4px;\n bottom: -4px;\n background: #ff5757;\n border-radius: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n &::after {\n content: '';\n width: 11px;\n height: 2px;\n background: #fefefe;\n }\n }\n }\n .title {\n width: 100px;\n margin-left: 24px;\n .text {\n color: #666;\n font-size: 16px;\n }\n .icon {\n font-size: 14px;\n line-height: 1;\n fill: #bfbfbf;\n }\n }\n }\n }\n }\n`;\n\nMemberList.propTypes = {};\n\nMemberList.defaultProps = {};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport md5 from 'md5';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { formatError } from '../../../libs/util';\n\nexport default function MutateRole({ teamDid, onCancel, onSuccess, onError, mode, item }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [title, setTitle] = useState(item.title || '');\n const [description, setDescription] = useState(item.description || '');\n\n const onCreate = async () => {\n const _title = title.trim();\n if (!_title) {\n setError(t('team.passport.error.titleEmpty'));\n return;\n }\n\n if (_title.length > 64) {\n setError(t('team.passport.error.titleTooLong', { length: 64 }));\n return;\n }\n\n const desc = description.replace(/\\n/g, ' ');\n if (!desc) {\n setError(t('team.passport.error.descriptionEmpty'));\n return;\n }\n\n const name = mode === 'create' ? md5(_title) : item.name;\n\n setError(null);\n setLoading(true);\n\n try {\n if (mode === 'create') {\n await api.createRole({ input: { teamDid, name, title: _title, description: desc } });\n } else {\n await api.updateRole({ input: { teamDid, role: { name, title: _title, description: desc } } });\n }\n onSuccess();\n } catch (err) {\n const errMsg = formatError(err);\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n const body = (\n <div>\n {mode === 'update' && (\n <Typography component=\"div\" style={{ paddingTop: 24 }}>\n <TextField\n label=\"ID\"\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"url\"\n data-cy=\"mutate-role-input-name\"\n fullWidth\n autoFocus\n value={item.name}\n disabled\n />\n </Typography>\n )}\n\n <Typography component=\"div\" style={{ marginTop: 24 }}>\n <TextField\n label={t('common.title')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"title\"\n data-cy=\"mutate-role-input-title\"\n fullWidth\n autoFocus\n value={title}\n onChange={e => {\n setError(null);\n setTitle(e.target.value);\n }}\n disabled={mode === 'update' || loading}\n helperText={t('team.passport.create.titleTip')}\n />\n </Typography>\n\n <Typography component=\"div\" style={{ marginTop: 24, marginBottom: 24 }}>\n <TextField\n label={t('common.description')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"description\"\n data-cy=\"mutate-role-input-description\"\n fullWidth\n autoFocus\n value={description}\n onChange={e => {\n setError(null);\n setDescription(e.target.value);\n }}\n disabled={loading}\n multiline\n rows={3}\n />\n </Typography>\n </div>\n );\n\n return (\n <Dialog\n title={mode === 'create' ? t('team.passport.create.title') : ''}\n fullWidth\n open\n onClose={onCancel}\n showCloseButton={false}\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded size=\"small\">\n {t('common.cancel')}\n </Button>\n <Button\n data-cy=\"mutate-role-confirm\"\n onClick={onCreate}\n color=\"primary\"\n size=\"small\"\n disabled={loading}\n variant=\"contained\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {mode === 'create' ? t('common.create') : t('common.update')}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">{body}</DialogContentText>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\" style={{ width: '100%', margin: 0 }}>\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nMutateRole.propTypes = {\n teamDid: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n mode: PropTypes.oneOf(['create', 'update']),\n item: PropTypes.object,\n};\n\nMutateRole.defaultProps = {\n onError: () => {},\n mode: 'create',\n item: {},\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport IconButton from '@material-ui/core/IconButton';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport EditIcon from '@arcblock/icons/lib/EditIcon';\nimport DeleteIcon from '@arcblock/icons/lib/DeleteIcon';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { formatError, isProtectedRole } from '../../../libs/util';\nimport { withPermission } from '../../permission';\nimport Confirm from '../../confirm';\nimport Toast from '../../toast';\nimport MutateRole from './mutate-role';\n\nfunction PassportDetail({ onCancel, onSuccess, onDelete, roleName, hasPermission }) {\n const { api } = useNodeContext();\n const { roles, permissions, teamDid, refresh: refreshTeam, isNodeTeam } = useTeamContext();\n const { t } = useLocaleContext();\n const [binds, setBinds] = useState([]);\n const [updateForm, setUpdateForm] = useState(false);\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n\n const role = cloneDeep(roles.find(x => x.name === roleName));\n\n const isProtected = isProtectedRole(roleName);\n\n const deletePassport = async name => {\n if (loading) return;\n try {\n setLoading(true);\n await api.deleteRole({ input: { teamDid, name } });\n onDelete();\n } catch (err) {\n Toast.error(err.message);\n } finally {\n setLoading(false);\n setDelConfirm(null);\n }\n };\n\n const getData = async (team, name) => {\n const res = await api.getPermissionsByRole({ input: { teamDid: team, role: { name } } });\n const permissionList = res.permissions || [];\n const bindList = permissions.map(x => ({\n ...x,\n bind: permissionList.some(y => y.name === x.name),\n }));\n setBinds(bindList);\n };\n\n const onBind = async () => {\n setLoading(true);\n\n const grantNames = binds.filter(x => x.bind).map(x => x.name);\n\n try {\n await api.updatePermissionsForRole({ input: { teamDid, roleName: role.name, grantNames } });\n Toast.success(t('common.saveSuccess'));\n onSuccess();\n } catch (err) {\n Toast.error(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (teamDid && roleName) {\n getData(teamDid, roleName);\n }\n }, [teamDid, roleName]); // eslint-disable-line\n\n const readPermissionsOnly = isNodeTeam || !hasPermission;\n\n return (\n <Dialog\n title={t('common.passport')}\n onClose={onCancel}\n open\n fullWidth\n toolbar={\n hasPermission &&\n !isProtected && (\n <>\n <IconButton onClick={() => setUpdateForm(role)} data-cy={`edit-passport-${role.name}`}>\n <EditIcon fill=\"#bfbfbf\" />\n </IconButton>\n <IconButton\n onClick={() =>\n setDelConfirm({\n title: t('team.passport.delete.title'),\n description: t('team.passport.delete.description', { name: role.title }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => {\n deletePassport(role.name);\n },\n onCancel: () => {\n setLoading(false);\n setDelConfirm(null);\n },\n })\n }\n data-cy={`delete-passport-${role.name}`}>\n <DeleteIcon fill=\"#bfbfbf\" />\n </IconButton>\n </>\n )\n }\n actions={\n !readPermissionsOnly && (\n <>\n <Button onClick={onCancel} color=\"default\" rounded>\n {t('common.cancel')}\n </Button>\n <Button\n onClick={onBind}\n color=\"primary\"\n disabled={loading || !role}\n variant=\"contained\"\n autoFocus\n data-cy=\"bind-permission-btn-confirm\"\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {t('common.save')}\n </Button>\n </>\n )\n }>\n <Div>\n {!role && (\n <Center>\n <Spinner />\n </Center>\n )}\n\n {/* content */}\n {role && (\n <div className=\"dialog-content\">\n <div className=\"header\">\n <div className=\"title\">{role.title}</div>\n <div className=\"description\">{role.description}</div>\n </div>\n\n {/* bind permission */}\n <div className=\"bind\">\n <div className=\"title\">{t('common.permission')}</div>\n <div className=\"list\">\n {binds\n // if readonly, show obtained permissions only\n .filter(x => (readPermissionsOnly ? x.bind : true))\n .map(x => (\n <div className=\"item\">\n <FormControlLabel\n control={\n <Checkbox\n disabled={readPermissionsOnly}\n checked={x.bind}\n onChange={() => {\n setBinds(state =>\n state.map(y => {\n if (y.name === x.name) {\n y.bind = !y.bind;\n }\n return y;\n })\n );\n }}\n name={x.name}\n />\n }\n label={x.description}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </Div>\n\n {updateForm && (\n <MutateRole\n teamDid={teamDid}\n onCancel={() => setUpdateForm(null)}\n onSuccess={() => {\n setUpdateForm(null);\n refreshTeam();\n }}\n mode=\"update\"\n roleName={updateForm.name}\n item={updateForm}\n />\n )}\n\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Dialog>\n );\n}\n\nexport default withPermission(PassportDetail, 'mutate_team');\n\nPassportDetail.propTypes = {\n roleName: PropTypes.string.isRequired,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n hasPermission: PropTypes.bool,\n};\n\nPassportDetail.defaultProps = {\n hasPermission: false,\n};\n\nconst Div = styled.div`\n .header {\n .title {\n font-weight: 500;\n font-size: 24px;\n line-height: 28px;\n color: #222222;\n }\n\n .description {\n margin-top: 16px;\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #999999;\n }\n }\n\n .bind {\n margin-top: 24px;\n .title {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666666;\n margin-bottom: 24px;\n }\n .item {\n margin-top: 24px;\n }\n\n .MuiFormControlLabel-label {\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666;\n }\n\n .PrivateSwitchBase-root-45 {\n padding: 0;\n padding-right: 12px;\n }\n }\n`;\n\nconst Center = styled.div`\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n`;\n","var _path;\n\nvar _excluded = [\"svgRef\", \"title\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar SvgLongArrow = function SvgLongArrow(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 65,\n height: 16,\n viewBox: \"0 0 65 16\",\n fill: \"none\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M64.7071 8.70711C65.0976 8.31658 65.0976 7.68342 64.7071 7.29289L58.3431 0.928932C57.9526 0.538408 57.3195 0.538408 56.9289 0.928932C56.5384 1.31946 56.5384 1.95262 56.9289 2.34315L62.5858 8L56.9289 13.6569C56.5384 14.0474 56.5384 14.6805 56.9289 15.0711C57.3195 15.4616 57.9526 15.4616 58.3431 15.0711L64.7071 8.70711ZM0 9H64V7H0V9Z\",\n fill: \"#666666\"\n })));\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgLongArrow, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/long-arrow.4be14920.svg\";\nexport { ForwardRef as ReactComponent };","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Box from '@material-ui/core/Box';\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\nimport IconButton from '@material-ui/core/IconButton';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport TextField from '@material-ui/core/TextField';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport DeleteIcon from '@arcblock/icons/lib/DeleteIcon';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport { ROLES } from '@abtnode/constant';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { sleep } from '../../../libs/util';\nimport { ReactComponent as LongArrow } from '../../../icons/long-arrow.svg';\nimport Toast from '../../toast';\n\nconst canSave = (issuerDid, mappings) => {\n if (!issuerDid) {\n return false;\n }\n\n if (mappings.some(x => !x.from.passport || !x.to.role)) {\n return false;\n }\n\n return true;\n};\n\nexport default function TrustedIssuer({ onCancel, onSuccess, data, trustedPassports }) {\n const { api } = useNodeContext();\n const { roles, teamDid } = useTeamContext();\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [issuerDid, setIssuerDid] = useState(data.issuerDid || '');\n const [mappings, setMappings] = useState(cloneDeep(data.mappings) || []);\n\n const editIndex = trustedPassports.findIndex(x => x.issuerDid === data.issuerDid);\n\n const configTrustedPassports = async () => {\n if (loading) {\n return;\n }\n\n const trustedList = [...trustedPassports];\n\n if (editIndex === -1) {\n trustedList.unshift({\n issuerDid,\n mappings,\n });\n } else {\n trustedList[editIndex] = {\n issuerDid,\n mappings,\n };\n }\n\n try {\n setLoading(true);\n await api.configTrustedPassports({ input: { teamDid, trustedPassports: trustedList } });\n await sleep(800);\n setLoading(false);\n Toast.success(t('common.saveSuccess'));\n onSuccess();\n } catch (err) {\n setLoading(false);\n Toast.error(err.message);\n }\n };\n\n return (\n <Dialog\n title={t('team.passport.trustedIssuers')}\n open\n showCloseButton={false}\n PaperProps={{ style: { minHeight: '80vh' } }}\n fullWidth\n prepend={\n <IconButton onClick={onCancel} data-cy=\"trusted-issuer-close\">\n <ArrowBackIcon />\n </IconButton>\n }\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded>\n {t('common.cancel')}\n </Button>\n <Button\n onClick={() => configTrustedPassports()}\n color=\"primary\"\n disabled={!canSave(issuerDid, mappings) || loading}\n variant=\"contained\"\n autoFocus\n data-cy=\"save-mapping\"\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {t('common.save')}\n </Button>\n </>\n }>\n <Div>\n <div className=\"dialog-content\">\n <TextField\n fullWidth\n data-cy=\"input-issuer-did\"\n placeholder={t('team.passport.issuerDid')}\n value={issuerDid}\n onChange={event => {\n setIssuerDid(event.target.value);\n }}\n />\n\n <Box mt=\"30px\" display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\n <Box className=\"dialog-h1\">{t('team.passport.mappingRule')}</Box>\n <Box>\n <Button\n variant=\"outlined\"\n rounded\n color=\"primary\"\n data-cy=\"add-mapping\"\n onClick={() => {\n setMappings(d => {\n const res = [...d];\n res.unshift({ from: { passport: '' }, to: { role: ROLES.GUEST } });\n return res;\n });\n }}>\n {t('team.add')}\n </Button>\n </Box>\n </Box>\n\n <Box className=\"list\" mt={-0.5}>\n {mappings.map((item, index) => (\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" my={3}>\n <Box display=\"flex\" alignItems=\"center\" flexGrow={1}>\n <Box flexGrow={1} flexBasis={1}>\n <TextField\n fullWidth\n size=\"small\"\n data-cy={`input-${index}-from`}\n placeholder=\"Issuer’s Passport Name/ID\"\n value={item.from.passport}\n onChange={event => {\n const { value } = event.target;\n setMappings(d => {\n const res = [...d];\n res[index].from.passport = value;\n return res;\n });\n }}\n />\n </Box>\n\n <Box flexShrink={0} mx={4}>\n <LongArrow />\n </Box>\n\n {/* role */}\n <Box flexGrow={1} flexBasis={1}>\n <TextField\n fullWidth\n size=\"small\"\n select\n value={item.to.role}\n onChange={e => {\n setMappings(d => {\n const res = [...d];\n res[index].to.role = e.target.value;\n return res;\n });\n }}\n variant=\"outlined\">\n {roles\n .filter(d => d.name !== 'owner')\n .map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`passport-mapping-select-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </TextField>\n </Box>\n </Box>\n\n {/* delete */}\n <Box flexShrink={0} ml={4}>\n <IconButton\n onClick={() => {\n setMappings(d => {\n const res = [...d];\n res.splice(index, 1);\n return res;\n });\n }}>\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n ))}\n\n {!mappings.length && (\n <Box my={2} color=\"text.secondary\" fontSize=\"16px\">\n <Empty>{t('common.empty')}</Empty>\n </Box>\n )}\n </Box>\n </div>\n </Div>\n </Dialog>\n );\n}\n\nTrustedIssuer.propTypes = {\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n trustedPassports: PropTypes.array,\n data: PropTypes.object,\n};\n\nTrustedIssuer.defaultProps = {\n data: {},\n trustedPassports: [],\n};\n\nconst Div = styled.div`\n .dialog-h1 {\n font-size: 18px;\n }\n\n .MuiOutlinedInput-root {\n border-radius: 36px;\n .MuiSelect-root.MuiOutlinedInput-input {\n padding-top: 8.5px;\n padding-bottom: 8.5px;\n }\n }\n\n .list {\n .MuiIconButton-root {\n svg {\n fill: #bfbfbf;\n }\n }\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Box from '@material-ui/core/Box';\nimport AddIcon from '@material-ui/icons/Add';\nimport IconButton from '@material-ui/core/IconButton';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Empty from '@arcblock/ux/lib/Empty';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport EditIcon from '@arcblock/icons/lib/EditIcon';\nimport DeleteIcon from '@arcblock/icons/lib/DeleteIcon';\n\nimport { withPermission } from '../../permission';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { sleep } from '../../../libs/util';\nimport Toast from '../../toast';\nimport Confirm from '../../confirm';\nimport ListHeader from '../styles/list-header';\nimport SearchInput from '../search-input';\nimport TrustedIssuer from './trusted-issuer';\n\nfunction TrustedIssuers({ onCancel, hasPermission }) {\n const { api } = useNodeContext();\n const { teamDid, trustedPassports } = useTeamContext();\n const { t } = useLocaleContext();\n const [delConfirm, setDelConfirm] = useState(null);\n const [loading, setLoading] = useState(false);\n const [trustedIssuer, setTrustedIssuer] = useState(false);\n const [search, setSearch] = useState('');\n\n const deleteTrustedIssuer = async did => {\n if (loading) {\n return;\n }\n\n const index = trustedPassports.findIndex(x => x.issuerDid === did);\n\n if (index === -1) {\n // should not be here\n Toast.error('Cannot find passports');\n }\n\n const trustedList = [...trustedPassports];\n trustedList.splice(index, 1);\n\n try {\n setLoading(true);\n await api.configTrustedPassports({ input: { teamDid, trustedPassports: trustedList } });\n await sleep(800);\n setLoading(false);\n Toast.success(t('common.saveSuccess'));\n setDelConfirm(false);\n } catch (err) {\n setLoading(false);\n Toast.error(err.message);\n }\n };\n\n const filteredIssuers = trustedPassports.filter(\n x => !search || x.issuerDid.toLowerCase().includes(search.toLowerCase())\n );\n\n return (\n <Dialog\n title={t('team.passport.trustedIssuers')}\n open\n onClose={onCancel}\n fullWidth\n PaperProps={{ style: { minHeight: '80vh' } }}>\n <Div>\n <div className=\"dialog-content\">\n <div className=\"dialog-h1\">{t('team.passport.trustedPassportIssuers')}</div>\n\n <Box component={ListHeader} mt={3}>\n <div className=\"left\">\n <SearchInput\n placeholder={t('team.passport.searchIssuerDid')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n />\n </div>\n <div className=\"right\">\n {hasPermission && (\n <Button\n variant=\"contained\"\n rounded\n color=\"primary\"\n data-cy=\"add-trusted-issuer\"\n onClick={() => setTrustedIssuer({ mode: 'add' })}>\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.add')}\n </Button>\n )}\n </div>\n </Box>\n\n <div className=\"list\">\n {filteredIssuers.map(x => (\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" mt=\"20px\">\n <Box flexShrink={0}>\n <DidAddress copyable={false}>\n <span style={{ fontSize: 16 }}>{x.issuerDid}</span>\n </DidAddress>\n </Box>\n <Box color=\"gray\" ml=\"28px\" flexGrow={1}>\n {x.mappings && x.mappings.length\n ? `${x.mappings.length} ${t('team.passport.mappingRule')}`\n : t('team.passport.defaultRule')}\n </Box>\n <Box flexShrink={0} display=\"flex\" alignItems=\"center\">\n <IconButton\n onClick={() => setTrustedIssuer({ mode: 'update', data: cloneDeep(x) })}\n data-cy=\"edit-mapping-rule\">\n <EditIcon />\n </IconButton>\n <IconButton\n data-cy=\"delete-mapping-rule\"\n onClick={() =>\n setDelConfirm({\n title: t('common.delete'),\n description: t('common.delConfirmDescription'),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm: () => deleteTrustedIssuer(x.issuerDid),\n onCancel: () => {\n setLoading(false);\n setDelConfirm(null);\n },\n })\n }>\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n ))}\n {!trustedPassports.length && <Empty>{t('common.empty')}</Empty>}\n </div>\n </div>\n </Div>\n\n {trustedIssuer && (\n <TrustedIssuer\n mode={trustedIssuer.mode}\n data={trustedIssuer.data}\n trustedPassports={cloneDeep(trustedPassports)}\n onCancel={() => setTrustedIssuer(null)}\n onSuccess={() => {\n setTrustedIssuer(null);\n }}\n />\n )}\n\n {delConfirm && (\n <Confirm\n title={delConfirm.title}\n description={delConfirm.description}\n confirm={delConfirm.confirm}\n cancel={delConfirm.cancel}\n params={delConfirm.params}\n onConfirm={delConfirm.onConfirm}\n onCancel={delConfirm.onCancel}\n />\n )}\n </Dialog>\n );\n}\n\nTrustedIssuers.propTypes = {\n onCancel: PropTypes.func.isRequired,\n hasPermission: PropTypes.bool,\n};\n\nTrustedIssuers.defaultProps = {\n hasPermission: false,\n};\n\nexport default withPermission(TrustedIssuers, 'mutate_team');\n\nconst Div = styled.div`\n .list {\n .MuiIconButton-root {\n svg {\n fill: #bfbfbf;\n }\n }\n }\n`;\n","import React, { useContext, useState } from 'react';\nimport styled from 'styled-components';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Box from '@material-ui/core/Box';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport EditIcon from '@arcblock/icons/lib/EditIcon';\nimport LockIcon from '@arcblock/icons/lib/LockIcon';\nimport ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useTeamContext } from '../../../contexts/team';\nimport { sleep, createPassportSvg, isProtectedRole } from '../../../libs/util';\nimport Permission from '../../permission';\nimport Toast from '../../toast';\nimport ButtonGroupWithActions from '../../button-group-with-actions';\nimport SearchInput from '../search-input';\nimport ListHeader from '../styles/list-header';\nimport Detail from './detail';\nimport MutateRole from './mutate-role';\nimport TrustedIssuers from './trusted-issuers';\n\nexport default function PassportList() {\n const { t } = useContext(LocaleContext);\n const { api, info: nodeInfo } = useNodeContext();\n const { roles, teamDid, teamName, refresh: refreshTeam, enablePassportIssuance } = useTeamContext();\n\n const [showCreate, setShowCreate] = useState(false);\n const [updateForm, setUpdateForm] = useState(false);\n const [showTrustedIssuers, setShowTrustedIssuers] = useState(null);\n const [search, setSearch] = useState('');\n const [loading, setLoading] = useState(false);\n\n const toggleShowIssue = async () => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n await api.configPassportIssuance({ input: { teamDid, enable: !enablePassportIssuance } });\n refreshTeam();\n await sleep(800);\n Toast.success(t('common.configSuccess'));\n setLoading(false);\n } catch (error) {\n Toast.error(error.message);\n setLoading(false);\n }\n };\n\n const filteredRoles = roles.filter(x => !search || x.title.includes(search) || x.name.includes(search));\n\n return (\n <Div>\n <ListHeader>\n <div className=\"left\">\n <SearchInput\n placeholder={t('team.passport.search')}\n value={search}\n onChange={e => setSearch(e.target.value)}\n />\n </div>\n <div className=\"right\">\n <Permission permission=\"mutate_team\">\n <ButtonGroupWithActions\n actions={[\n <MenuItem\n data-cy=\"config-show-issue-passport\"\n onClick={() => {\n toggleShowIssue();\n }}>\n <Box display=\"flex\" alignItems=\"center\">\n {loading && <Spinner size={[16, 10]} style={{ marginRight: 8 }} />}\n <Box>\n {enablePassportIssuance ? t('team.passport.disableIssuance') : t('team.passport.enableIssuance')}\n <Box fontSize={12} color=\"#888\">\n {enablePassportIssuance\n ? t('team.passport.disableIssuanceTip')\n : t('team.passport.enableIssuanceTip')}\n </Box>\n </Box>\n </Box>\n </MenuItem>,\n ]}>\n <Button\n style={{ borderRight: 0 }}\n variant=\"outlined\"\n color=\"primary\"\n data-cy=\"config-trusted-issuers\"\n onClick={() => {\n setShowTrustedIssuers(true);\n }}>\n <ExternalIssuerIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.passport.trustedPassportIssuers')}\n </Button>\n </ButtonGroupWithActions>\n\n {nodeInfo.did !== teamDid && (\n <Button\n style={{ marginLeft: 16 }}\n variant=\"contained\"\n rounded\n edge=\"end\"\n color=\"primary\"\n data-cy=\"create-role\"\n onClick={() => setShowCreate(true)}>\n <AddIcon style={{ fontSize: 16, marginRight: 4 }} />\n {t('team.add')}\n </Button>\n )}\n </Permission>\n </div>\n </ListHeader>\n\n <Box mt={3} />\n\n <Box className=\"list\">\n {filteredRoles.map(role => (\n <Box\n data-cy={`passport-${role.name}`}\n className=\"item\"\n display=\"flex\"\n alignItems=\"center\"\n onClick={() => setUpdateForm(role)}>\n <Box display=\"flex\" alignItems=\"center\">\n <img\n style={{ width: 120 }}\n alt=\"\"\n src={createPassportSvg({\n issuer: teamName,\n title: role.title,\n })}\n />\n <Box ml={3} className=\"title\">\n {role.title}\n </Box>\n </Box>\n\n <Box className=\"description\">{role.description}</Box>\n\n <Permission permission=\"mutate_team\">\n <div className=\"action\">{isProtectedRole(role.name) ? <LockIcon /> : <EditIcon />}</div>\n </Permission>\n </Box>\n ))}\n </Box>\n\n {showCreate && (\n <MutateRole\n teamDid={teamDid}\n onCancel={() => setShowCreate(false)}\n onSuccess={() => {\n setShowCreate(false);\n refreshTeam();\n }}\n />\n )}\n\n {updateForm && (\n <Detail\n onCancel={() => setUpdateForm(null)}\n onSuccess={() => {\n setUpdateForm(null);\n refreshTeam();\n }}\n onDelete={() => {\n setUpdateForm(null);\n refreshTeam();\n }}\n mode=\"update\"\n roleName={updateForm.name}\n item={updateForm}\n />\n )}\n\n {/* showTrustedIssuers */}\n {showTrustedIssuers && <TrustedIssuers onCancel={() => setShowTrustedIssuers(false)} />}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .list {\n .item {\n padding: 12px;\n margin: 12px -12px;\n cursor: pointer;\n transition: box-shadow 0.4s;\n &:hover {\n box-shadow: 0 0 10px 4px rgba(0, 0, 0, 0.1);\n }\n }\n\n .title {\n font-weight: 500;\n font-size: 18px;\n width: 80px;\n line-height: 21px;\n color: #222222;\n }\n\n .description {\n flex: 1;\n margin-left: 64px;\n color: #999999;\n }\n\n .action {\n color: #bfbfbf;\n fill: #bfbfbf;\n }\n }\n`;\n\nPassportList.propTypes = {};\n\nPassportList.defaultProps = {};\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React from 'react';\nimport styled from 'styled-components';\nimport { useParams, useHistory } from 'react-router-dom';\n\nimport Typography from '@material-ui/core/Typography';\n\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { TeamProvider } from '../../contexts/team';\nimport Members from '../../components/team/members';\nimport Passports from '../../components/team/passports';\n\nexport default function TeamPage() {\n const history = useHistory();\n const { t } = useLocaleContext();\n const { nodeInfo } = useNodeContext();\n const { tab = 'members' } = useParams(); // members, passports\n\n const teamDid = nodeInfo.did;\n\n const onTabChange = newTab => {\n history.push(`/team/${newTab}`);\n };\n\n const tabConfigs = {\n members: {\n label: t('common.members'),\n value: 'members',\n component: Members,\n },\n passports: {\n label: t('common.passport'),\n value: 'passports',\n component: Passports,\n },\n };\n\n const tabs = Object.values(tabConfigs).map(({ label, value }) => ({ label, value }));\n\n const tabConfig = tabConfigs[tab] || tabConfigs.member;\n\n return (\n <TeamProvider teamDid={teamDid}>\n <Main>\n <Typography component=\"h2\" variant=\"h4\" className=\"page-header\" color=\"textPrimary\">\n {t('common.team')}\n </Typography>\n <Tabs tabs={tabs} current={tab} onChange={onTabChange} scrollButtons=\"auto\" />\n <div className=\"page-content\">\n <tabConfig.component />\n </div>\n </Main>\n </TeamProvider>\n );\n}\n\nconst Main = styled.main`\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .page-content {\n margin-top: 24px;\n }\n`;\n","import { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nfunction useMobileWidth() {\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n const minWidth = isBreakpointsDownSm ? 300 : theme.breakpoints.values.sm;\n return { minWidth };\n}\n\nexport default useMobileWidth;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Alert from '@material-ui/lab/Alert';\nimport useTheme from '@material-ui/core/styles/useTheme';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { formatError } from '../libs/util';\nimport useMobileWidth from '../hooks/mobile-width';\n\nexport default function ConfirmDialog({\n title,\n description,\n showCancel,\n cancel,\n confirm,\n color,\n params: initialParams,\n onCancel,\n onConfirm,\n}) {\n const [params, setParams] = useState(initialParams);\n const [open, setOpen] = useState(true);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t: changeLocale } = useLocaleContext();\n const theme = useTheme();\n\n const onCallback = async cb => {\n if (typeof cb === 'function') {\n setLoading(true);\n try {\n await cb(params);\n setOpen(false);\n } catch (err) {\n setError(formatError(err));\n console.error(err);\n } finally {\n setLoading(false);\n }\n } else {\n setOpen(false);\n }\n };\n\n const t = typeof title === 'function' ? title() : title;\n const d = typeof description === 'function' ? description(params, setParams, setError) : description;\n\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n\n const handleClick = e => {\n e.stopPropagation();\n };\n const { minWidth } = useMobileWidth();\n\n return (\n <StyledDialog onClick={handleClick} fullScreen={isBreakpointsDownSm} open={open} style={{ minWidth }}>\n <DialogTitle>{t}</DialogTitle>\n <DialogContent style={{ minWidth }}>\n <DialogContentText component=\"div\">{d}</DialogContentText>\n {!!error && (\n <Alert severity=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </DialogContent>\n <DialogActions className=\"delete-actions\" style={{ padding: '8px 24px 24px' }}>\n {showCancel && (\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onCancel);\n }}\n color=\"default\"\n data-cy=\"cancel-confirm-dialog\"\n rounded\n size=\"small\">\n {cancel || changeLocale('common.cancel')}\n </Button>\n )}\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onConfirm);\n }}\n color={color}\n size=\"small\"\n // eslint-disable-next-line no-underscore-dangle\n disabled={params.__disableConfirm || loading}\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {confirm}\n </Button>\n </DialogActions>\n </StyledDialog>\n );\n}\n\nConfirmDialog.propTypes = {\n title: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n showCancel: PropTypes.bool,\n cancel: PropTypes.string,\n color: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nConfirmDialog.defaultProps = {\n onCancel: () => {},\n showCancel: true,\n cancel: '',\n confirm: 'Confirm',\n color: 'danger',\n params: {},\n};\n\nconst StyledDialog = styled(Dialog)`\n .delete-actions .Mui-disabled {\n color: rgba(0, 0, 0, 0.26) !important;\n box-shadow: none;\n background-color: rgba(0, 0, 0, 0.12) !important;\n }\n`;\n","import React, { useState, useContext, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { RBAC_CONFIG } from '@abtnode/constant';\n\nimport { useNodeContext } from './node';\nimport { useBlockletContext } from './blocklets';\n\nimport { useSubscription } from '../libs/ws';\n\nconst TeamContext = React.createContext({});\nconst { Provider, Consumer } = TeamContext;\n\nconst getTeamName = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return nodeInfo.name;\n }\n\n if (blocklet) {\n return blocklet.meta.title || blocklet.meta.name;\n }\n\n return '';\n};\n\nconst getTrustedPassports = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return nodeInfo.trustedPassports || [];\n }\n\n if (blocklet) {\n return blocklet.trustedPassports || [];\n }\n\n return [];\n};\n\nconst getTeamIssuerDid = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return teamDid;\n }\n\n if (blocklet) {\n const item = (blocklet.environments || []).find(x => x.key === 'BLOCKLET_APP_ID') || {};\n return item.value || '';\n }\n\n return '';\n};\n\nconst getEnablePassportIssuance = (teamDid, nodeInfo, blocklet) => {\n if (teamDid === nodeInfo.did) {\n return nodeInfo.enablePassportIssuance !== false;\n }\n\n if (blocklet) {\n return blocklet.enablePassportIssuance !== false;\n }\n\n return true;\n};\n\nfunction TeamProvider({ teamDid, children }) {\n const { api, nodeInfo } = useNodeContext();\n const { data: blocklets } = useBlockletContext();\n\n const [users, setUsers] = useState([]);\n const [invitations, setInvitations] = useState([]);\n const [roles, setRoles] = useState([]);\n const [permissions, setPermissions] = useState([]);\n\n const blocklet = blocklets.find(x => x.meta.did === teamDid);\n const teamName = getTeamName(teamDid, nodeInfo, blocklet);\n const trustedPassports = getTrustedPassports(teamDid, nodeInfo, blocklet);\n const teamIssuerDid = getTeamIssuerDid(teamDid, nodeInfo, blocklet);\n const enablePassportIssuance = getEnablePassportIssuance(teamDid, nodeInfo, blocklet);\n\n const getData = async did => {\n try {\n const res = await api.doBatchQuery({\n getRoles: { input: { teamDid: did } },\n getPermissions: { input: { teamDid: did } },\n getUsers: { input: { teamDid: did } },\n getInvitations: { input: { teamDid: did } },\n });\n\n setRoles(\n (res.getRoles.roles || [])\n // exclude some roles: not passport or only for ci\n .filter(x => !RBAC_CONFIG.roles.some(y => y.name === x.name && (!y.passport || y.ci)))\n // backwards compatibility\n .map(x => {\n x.description = x.description || `Use this passport to connect ${teamName} as ${x.title}`;\n return x;\n })\n );\n setPermissions(res.getPermissions.permissions || []);\n // FIXME: performance optimization\n setUsers(res.getUsers.users || []);\n setInvitations(res.getInvitations.invitations || []);\n } catch {\n // do nothing\n }\n };\n\n const refresh = () => getData(teamDid);\n\n useEffect(() => {\n getData(teamDid);\n }, [teamDid]); // eslint-disable-line\n\n const onUserEvent = data => {\n if (data.teamDid === teamDid) {\n getData();\n }\n };\n\n useSubscription('user.added', onUserEvent, [teamDid]);\n useSubscription('user.removed', onUserEvent, [teamDid]);\n useSubscription('user.updated', onUserEvent, [teamDid]);\n\n const data = {\n teamDid,\n teamIssuerDid,\n teamName,\n users,\n invitations,\n roles,\n permissions,\n trustedPassports,\n isNodeTeam: teamDid === nodeInfo.did,\n enablePassportIssuance,\n refresh,\n };\n\n return <Provider value={data}>{children}</Provider>;\n}\n\nTeamProvider.propTypes = {\n teamDid: PropTypes.string.isRequired,\n children: PropTypes.object.isRequired,\n};\n\nTeamProvider.defaultProps = {};\n\nfunction useTeamContext() {\n return useContext(TeamContext);\n}\n\nexport { TeamContext, TeamProvider, Consumer as TeamConsumer, useTeamContext };\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport Copy from '@arcblock/ux/lib/ClickToCopy';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function ClickToCopy({ children, ...rest }) {\n const { t } = useContext(LocaleContext);\n return (\n <Copy tip={t('common.copyTip')} copiedTip={t('common.copiedTip')} {...rest}>\n {children}\n </Copy>\n );\n}\n\nClickToCopy.propTypes = {\n children: PropTypes.any.isRequired,\n};\n","import Add from '@material-ui/icons/Add';\nimport Check from '@material-ui/icons/Check';\nimport Delete from '@material-ui/icons/Delete';\nimport Clear from '@material-ui/icons/Clear';\nimport Export from '@material-ui/icons/SaveAlt';\nimport Edit from '@material-ui/icons/Edit';\nimport Filter from '@material-ui/icons/Filter';\nimport FirstPage from '@material-ui/icons/FirstPage';\nimport LastPage from '@material-ui/icons/LastPage';\nimport NextPage from '@material-ui/icons/ChevronRight';\nimport PreviousPage from '@material-ui/icons/ChevronLeft';\nimport Search from '@material-ui/icons/Search';\nimport SortArrow from '@material-ui/icons/ArrowDropDown';\nimport ThirdStateCheck from '@material-ui/icons/Remove';\nimport ViewColumn from '@material-ui/icons/ViewColumn';\n\nexport default {\n Add,\n Check,\n Delete,\n Edit,\n Clear,\n DetailPanel: NextPage,\n Filter,\n FirstPage,\n LastPage,\n NextPage,\n PreviousPage,\n Search,\n ResetSearch: Clear,\n SortArrow,\n Export,\n ThirdStateCheck,\n ViewColumn,\n};\n","import styled from 'styled-components';\n\nconst TableStyle = styled.div`\n .MuiPaper-root {\n box-shadow: none !important;\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n .MuiToolbar-root {\n background: transparent;\n padding-left: 0;\n display: none;\n }\n\n .MuiTableHead-root th {\n min-width: 100px;\n background: transparent;\n }\n\n .MuiTable-root {\n overflow-y: hidden;\n }\n .MuiTableRow-root {\n border: none !important;\n }\n\n .MuiTableCell-root {\n padding-right: 16px;\n &:last-of-type {\n padding-right: 0;\n }\n }\n`;\n\nexport default TableStyle;\n","import styled from 'styled-components';\n\nconst ListHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 14px;\n .left,\n .right {\n }\n .right {\n display: flex;\n align-items: center;\n }\n .tabs {\n .MuiButton-root {\n border: none;\n color: #999;\n &.active {\n color: #222;\n }\n }\n }\n`;\n\nexport default ListHeader;\n","import React from 'react';\nimport styled from 'styled-components';\nimport TextField from '@material-ui/core/TextField';\nimport SearchIcon from '@material-ui/icons/Search';\n\nconst SearchInput = styled(({ children, ...props }) => (\n <TextField\n {...props}\n id=\"outlined-basic\"\n variant=\"outlined\"\n InputProps={{\n startAdornment: <SearchIcon />,\n }}\n size=\"small\">\n {children}\n </TextField>\n))`\n .MuiOutlinedInput-root {\n color: #999;\n &.MuiInputBase-adornedStart .MuiSvgIcon-root {\n color: #bfbfbf;\n }\n opacity: 1;\n border-radius: 36px;\n background: #f8f8f8;\n padding-left: 16px;\n input {\n padding-left: 8px;\n font-weight: bold;\n &::placeholder {\n opacity: 1;\n color: #bfbfbf;\n }\n padding-top: 8.5px;\n padding-bottom: 8.5px;\n }\n }\n\n .MuiOutlinedInput-notchedOutline,\n .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline,\n .Mui-focused .MuiOutlinedInput-notchedOutline {\n border-color: #eee;\n border-width: 1px;\n }\n`;\n\nexport default SearchInput;\n","/* eslint-disable no-use-before-define */\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\n\nexport default function usePersistentSort(name, initialDirections) {\n const [sortDirections, setSortDirections] = useLocalStorage(`ps_${name}`, initialDirections);\n\n const onSortChange = (columnIndex, directionValue) => {\n const newSortDirections = directionValue ? new Array(initialDirections.length).fill('') : [...initialDirections];\n\n if (columnIndex > -1) {\n newSortDirections[columnIndex] = directionValue;\n }\n\n setSortDirections(newSortDirections);\n };\n\n return {\n sortDirections, // 当前的排序\n onSortChange, // 给外部的回调,可以更新内部的 sort\n };\n}\n"],"sourceRoot":""}