1{"version":3,"sources":["pages/org-admin/side-panel.js","pages/org-admin/org-users-nav.js","components/select-editor/user-status-editor.js","pages/org-admin/org-user-item.js","pages/org-admin/org-users-list.js","pages/org-admin/main-panel-topbar.js","components/dialog/org-add-user-dialog.js","components/dialog/org-admin-invite-user-dialog.js","models/org-user.js","pages/org-admin/org-users-users.js","pages/org-admin/org-users-search-users.js","pages/org-admin/org-admin-list.js","components/dialog/org-add-admin-dialog.js","pages/org-admin/org-users-admins.js","components/org-admin-user-nav.js","components/dialog/set-org-user-name.js","components/dialog/set-org-user-contact-email.js","components/dialog/set-org-user-quota.js","pages/org-admin/org-user-profile.js","pages/org-admin/org-user-repos.js","pages/org-admin/org-user-shared-repos.js","models/org-group.js","pages/org-admin/org-groups.js","pages/org-admin/org-groups-search-groups.js","components/org-admin-group-nav.js","pages/org-admin/org-group-info.js","pages/org-admin/org-group-repos.js","pages/org-admin/org-group-members.js","models/org-admin-repo.js","pages/org-admin/org-libraries.js","pages/org-admin/org-info.js","components/dialog/view-link-dialog.js","pages/org-admin/org-links.js","pages/org-admin/org-departments.js","components/dialog/org-add-department-dialog.js","components/dialog/org-delete-department-dialog.js","components/dialog/org-set-group-quota-dialog.js","pages/org-admin/org-departments-list.js","components/dialog/org-add-member-dialog.js","components/dialog/org-delete-member-dialog.js","components/dialog/org-add-repo-dialog.js","components/dialog/org-delete-repo-dialog.js","pages/org-admin/org-department-item.js","pages/org-admin/org-logs.js","models/org-logs-file-audit.js","pages/org-admin/org-logs-file-audit.js","models/org-logs-file-update.js","components/dialog/org-logs-file-update-detail.js","pages/org-admin/org-logs-file-update.js","models/org-logs-perm-audit.js","pages/org-admin/org-logs-perm-audit.js","pages/org-admin/index.js"],"names":["SidePanel","getActiveClass","tab","props","currentTab","tabItemClick","className","this","isSidePanelClosed","onCloseSidePanel","style","gettext","to","siteRoot","onClick","React","Component","Nav","navItems","name","urlPart","text","currentItem","map","item","index","UserStatusEditor","translateStatus","userStatus","isTextMode","isEditIconShow","options","statusArray","currentOption","currentStatus","onOptionChanged","onStatusChanged","translateOption","UserItem","onMouseEnter","isItemFreezed","setState","showMenu","highlight","onMouseLeave","toggleDelete","email","user","toggleResetPW","toaster","success","seafileAPI","orgAdminResetOrgUserPassword","orgID","then","res","msg","replace","data","new_password","duration","catch","error","errMessage","Utils","getErrorMsg","danger","toggleRevokeAdmin","changeStatus","st","isActive","orgAdminChangeOrgUserStatus","onDropdownToggleClick","e","preventDefault","toggleOperationMenu","stopPropagation","isItemMenuShow","state","onFreezedItem","onUnfreezedItem","getQuotaTotal","formatSize","bytes","is_active","href","encodeURIComponent","isOperationMenuShow","username","quota_usage","quota_total","ctime","last_login","isOpen","toggle","tag","title","data-toggle","aria-expanded","OrgUsersList","onChangePageNum","num","page","initOrgUsersData","sortByQuotaUsage","sortIcon","sortBy","sortOrder","orgUsers","pageNext","width","MainPanelTopbar","children","search","isAdminPanel","AddOrgUserDialog","handleSubmit","validateInputParams","password","isAddingUser","trim","handleKeyPress","key","togglePasswordVisible","isPasswordVisible","passwdInput","type","passwdNewInput","generatePassword","val","Math","random","toString","substr","passwdnew","inputEmail","target","value","inputName","inputPassword","passwd","inputPasswordNew","createRef","length","password1","password2","for","id","onChange","innerRef","input","addonType","color","disabled","InviteUserDialog","copyLink","copy","invitationLink","message","moment","locale","lang","OrgUserInfo","object","contact_email","owner_contact_email","fromNow","format","Search","handleInputChange","submit","placeholder","onKeyPress","autoComplete","OrgUsers","url","URL","location","searchParams","URLSearchParams","set","navigate","toggleAddOrgUser","isShowAddOrgUserDialog","toggleInviteUserDialog","isInviteUserDialogOpen","orgAdminListOrgUsers","userList","user_list","page_next","addOrgUser","orgAdminAddOrgUser","userInfo","unshift","toggleOrgUsersDelete","orgAdminDeleteOrgUser","users","filter","searchItems","keyword","getSearch","urlParams","window","parseInt","get","topbarChildren","topBtn","OrgUsersSearchUsersResult","OrgUsersSearchUsers","getItems","orgAdminSearchUser","query","loading","errorMsg","deleteUser","newUserList","updateUser","sysAdminUpdateUser","update_status_tip","checkSubmitBtnActive","isSubmitBtnActive","org_id","params","document","row","sm","size","OrgAdminList","initOrgAdmin","orgAdminUsers","AddOrgAdminDialog","handleSelectChange","option","selectedOption","addOrgAdmin","userEmail","orgAdminSetOrgAdmin","onAddedOrgAdmin","ref","isMulti","onSelectChange","toggleAddOrgAdmin","isShowAddOrgAdminDialog","toggleOrgAdminDelete","OrgAdminUserNav","urlBase","SetOrgUserName","inputValue","formSubmit","submitBtnDisabled","orgAdminSetOrgUserName","newName","updateName","toggleDialog","formErrorMsg","centered","Fragment","SetOrgUserContactEmail","contactEmail","orgAdminSetOrgUserContactEmail","newContactEmail","updateContactEmail","SetOrgUserQuota","quota","orgAdminSetOrgUserQuota","updateQuota","initialQuota","quotaTotal","org","pageOptions","orgName","OrgUserProfile","orgAdminGetOrgUserInfo","Object","assign","Content","toggleSetNameDialog","isSetNameDialogOpen","toggleSetContactEmailDialog","isSetContactEmailDialogOpen","toggleSetQuotaDialog","isSetQuotaDialogOpen","avatar_url","src","height","alt","bytesToSize","OrgUserOwnedRepos","orgAdminGetOrgUserOwnedRepos","repo_list","Item","handleMouseOver","isOpIconShown","handleMouseOut","handleDeleteIconClick","toggleDeleteRepoDialog","isDeleteRepoDialogOpen","deleteRepo","repo","orgAdminDeleteOrgRepo","repo_id","deleted","isRepoDeleted","repo_name","onMouseOver","onMouseOut","getLibIconUrl","getLibIconTitle","last_modified","onDeleteRepo","OrgUserSharedRepos","orgAdminGetOrgUserBesharedRepos","owner_name","OrgGroupInfo","groupName","group_name","creatorName","creator_name","creatorEmail","creator_email","creatorContactEmail","creator_contact_email","OrgGroups","initData","orgAdminListOrgGroups","orgGroups","groups","deleteGroupItem","group","orgAdminDeleteOrgGroup","GroupItem","renderGroupHref","renderGroupCreator","userInfoHref","OrgGroupsSearchGroupsResult","OrgGroupsSearchGroups","orgAdminSearchGroup","groupList","group_list","OrgAdminGroupNav","groupID","orgAdminGetGroup","OrgGroupRepos","orgAdminListGroupRepos","libraries","shared_by","shared_by_name","OrgGroupMembers","orgAdminListGroupMembers","members","role","getRoleText","OrgAdminRepo","repoID","repoName","ownerName","ownerEmail","owner_email","file_count","encrypted","isDepartmentRepo","is_department_repo","group_id","OrgLibraries","listRepos","orgAdminListOrgRepos","orgRepos","deleteRepoItem","transferRepoItem","sortItems","sortByFileCount","sortBySize","initialSortIcon","RepoItem","toggleTransfer","renderLibIcon","iconTitle","mediaUrl","renderRepoOwnerHref","isTransferDialogShow","onTransferRepo","orgAdminTransferOrgRepo","itemName","OrgInfo","storage_quota","storage_usage","member_quota","member_usage","active_members","orgAdminGetOrgInfo","orgMemberQuotaEnabled","ViewLinkDialog","copyToClipBoard","currentLinkHref","OrgLinks","listOrgLinks","orgAdminListOrgLinks","linkList","link_list","event","deleteOrgLink","token","orgAdminDeleteOrgLink","openLinkDialog","link","indexOf","serviceURL","toggleLinkDialog","isShowLinkDialog","created_time","view_count","bind","OrgDepartments","AddDepartDialog","validateName","parentGroup","parentGroupID","orgAdminAddDepartGroup","departName","onDepartChanged","response","error_msg","handleChange","newInput","focus","setSelectionRange","header","DeleteDepartDialog","deleteDepart","orgAdminDeleteDepartGroup","subtitle","HTMLescape","dangerouslySetInnerHTML","__html","SetGroupQuotaDialog","setGroupQuota","test","newQuota","orgAdminSetGroupQuota","err","OrgDepartmentsList","listDepartGroups","orgAdminListDepartGroups","showDeleteDepartDialog","showSetGroupQuotaDialog","toggleAddDepartDialog","isShowAddDepartDialog","toggleCancel","newHref","created_at","AddMemberDialog","Options","refs","orgSelect","clearSelect","orgAdminAddGroupMember","failed","onMemberChanged","DeleteMemberDialog","deleteMember","member","orgAdminDeleteGroupMember","AddRepoDialog","orgAdminAddDepartmentRepo","onRepoChanged","DeleteRepoDialog","orgAdminDeleteDepartmentRepo","OrgDepartmentItem","listOrgGroupRepo","repos","listOrgMembers","orgAdminListGroupInfo","ancestorGroups","ancestor_groups","listSubDepartGroups","showDeleteMemberDialog","showDeleteRepoDialog","onSubDepartChanged","toggleItemFreezed","isFreezed","deletedMember","deletedRepo","toggleAddRepoDialog","isShowAddRepoDialog","toggleAddMemberDialog","isShowAddMemberDialog","subGroup","subGroupID","subGroupName","nextProps","ancestor","MemberItem","toggleMemberRoleMenu","showRoleMenu","onChangeUserRole","isAdmin","orgAdminSetGroupMemberRole","roles","memberLink","currentRole","onRoleChanged","iconUrl","OrgLogs","param","OrgLogsFileAuditEvent","ip","device","file_name","file_path","user_name","user_email","user_contact_email","time","OrgLogsFileAudit","orgAdminListFileAudit","eventList","log_list","userSelected","user_selected","repoSelected","repo_selected","filterUser","filterRepo","fileEvent","FileAuditItem","toggleUserDropdown","userDropdownOpen","renderUser","renderType","toggleRepoDropdown","repoDropdownOpen","renderRepo","OrgLogsFileUpdateEvent","description","repo_encrypted","repo_commit_id","FileUpdateDetailDialog","renderContentItem","items","con","i","len","renderContent","newfile","removed","renamed","modified","newdir","deldir","orgAdminGetFileUpdateDetail","commitID","date_time","concat","new","OrgLogsFileUpdate","orgAdminListFileUpdate","toggleCancelDetail","showDetails","onDetails","FileUpdateItem","renderAction","OrgLogsPermAuditEvent","from_user_name","from_user_email","from_user_contact_email","to_user_email","to_user_name","to_user_contact_email","to_group_name","to_group_id","folder_name","folder_path","permission","orgAdminListPermAudit","OrgLogsFilePermEvent","permEvent","PermAuditItem","renderFromUser","renderToUser","renderFolder","folderName","sharePerms","Org","split","path","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/orgAdmin.chunk.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport Logo from '../../components/logo';\nimport { gettext, siteRoot } from '../../utils/constants';\n\nconst propTypes = {\n isSidePanelClosed: PropTypes.bool.isRequired,\n onCloseSidePanel: PropTypes.func.isRequired,\n currentTab: PropTypes.string.isRequired,\n tabItemClick: PropTypes.func.isRequired\n};\n\nclass SidePanel extends React.Component {\n\n getActiveClass = (tab) => {\n return this.props.currentTab == tab ? 'active' : '';\n }\n\n tabItemClick = (tab) => {\n this.props.tabItemClick(tab);\n }\n\n render() {\n return (\n <div className={`side-panel ${this.props.isSidePanelClosed ? '' : 'left-zero'}`}>\n <div className=\"side-panel-north\">\n <Logo onCloseSidePanel={this.props.onCloseSidePanel}/>\n </div>\n <div className=\"side-panel-center\">\n <div className=\"side-nav\">\n <div className=\"side-nav-con\">\n <h3 className=\"sf-heading\" style={{ 'color': '#f7941d' }}>{gettext('Admin')}</h3>\n <ul className=\"nav nav-pills flex-column nav-container\">\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('orgmanage')}`} to={siteRoot + 'org/orgmanage/'} onClick={() => this.tabItemClick('orgmanage')} >\n <span className=\"sf2-icon-info\"></span>\n <span className=\"nav-text\">{gettext('Info')}</span>\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('repoadmin')}`} to={siteRoot + 'org/repoadmin/'} onClick={() => this.tabItemClick('repoadmin')} >\n <span className=\"sf2-icon-library\"></span>\n <span className=\"nav-text\">{gettext('Libraries')}</span>\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('users') || this.getActiveClass('admins')}`} to={siteRoot + 'org/useradmin/'} onClick={() => this.tabItemClick('users')} >\n <span className=\"sf2-icon-user\"></span>\n <span className=\"nav-text\">{gettext('Users')}</span>\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('groupadmin')}`} to={siteRoot + 'org/groupadmin/'} onClick={() => this.tabItemClick('groupadmin')}>\n <span className=\"sf2-icon-group\"></span>\n <span className=\"nav-text\">{gettext('Groups')}</span>\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('departmentadmin')}`} to={siteRoot + 'org/departmentadmin/'} onClick={() => this.tabItemClick('departmentadmin')} >\n <span className=\"sf2-icon-organization\"></span>\n <span className=\"nav-text\">{gettext('Departments')}</span>\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('publinkadmin')}`} to={siteRoot + 'org/publinkadmin/'} onClick={() => this.tabItemClick('publinkadmin')} >\n <span className=\"sf2-icon-link\"></span>\n <span className=\"nav-text\">{gettext('Links')}</span>\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link className={`nav-link ellipsis ${this.getActiveClass('logadmin') || this.getActiveClass('file-update') || this.getActiveClass('perm-audit')}`} to={siteRoot + 'org/logadmin/'} onClick={() => this.tabItemClick('logadmin')} >\n <span className=\"sf2-icon-clock\"></span>\n <span className=\"nav-text\">{gettext('Logs')}</span>\n </Link>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nSidePanel.propTypes = propTypes;\n\nexport default SidePanel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../utils/constants';\n\nconst propTypes = {\n currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n constructor(props) {\n super(props);\n this.navItems = [\n {name: 'all', urlPart: 'useradmin', text: gettext('All')},\n {name: 'admins', urlPart: 'useradmin/admins', text: gettext('Admin')}\n ];\n }\n\n render() {\n const { currentItem } = this.props;\n return (\n <div className=\"cur-view-path tab-nav-container\">\n <ul className=\"nav\">\n {this.navItems.map((item, index) => {\n return (\n <li className=\"nav-item\" key={index}>\n <Link to={`${siteRoot}org/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport SelectEditor from './select-editor';\n\nconst propTypes = {\n isTextMode: PropTypes.bool.isRequired,\n isEditIconShow: PropTypes.bool.isRequired,\n statusArray: PropTypes.array.isRequired,\n currentStatus: PropTypes.string.isRequired,\n onStatusChanged: PropTypes.func.isRequired\n};\n\nclass UserStatusEditor extends React.Component {\n\n translateStatus = (userStatus) => {\n if (userStatus === 'active') {\n return gettext('Active');\n }\n\n if (userStatus === 'inactive') {\n return gettext('Inactive');\n }\n }\n\n render() {\n return (\n <SelectEditor\n isTextMode={this.props.isTextMode}\n isEditIconShow={this.props.isEditIconShow}\n options={this.props.statusArray}\n currentOption={this.props.currentStatus}\n onOptionChanged={this.props.onStatusChanged}\n translateOption={this.translateStatus}\n />\n );\n }\n\n}\n\nUserStatusEditor.propTypes = propTypes;\n\nexport default UserStatusEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { gettext, siteRoot, orgID, username } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport UserStatusEditor from '../../components/select-editor/user-status-editor';\n\nconst propTypes = {\n user: PropTypes.object,\n currentTab: PropTypes.string,\n toggleRevokeAdmin: PropTypes.func,\n isItemFreezed: PropTypes.bool.isRequired,\n toggleDelete: PropTypes.func.isRequired,\n onFreezedItem: PropTypes.func.isRequired,\n onUnfreezedItem: PropTypes.func.isRequired,\n};\n\nclass UserItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n currentStatus: this.props.user.is_active ? 'active' : 'inactive',\n isItemMenuShow: false\n };\n\n this.statusArray = ['active', 'inactive'];\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n toggleDelete = () => {\n const email = this.props.user.email;\n this.props.toggleDelete(email);\n }\n\n toggleResetPW = () => {\n const { email, name } = this.props.user;\n toaster.success(gettext('Resetting user\\'s password, please wait for a moment.'));\n seafileAPI.orgAdminResetOrgUserPassword(orgID, email).then(res => {\n let msg;\n msg = gettext('Successfully reset password to %(passwd)s for user %(user)s.');\n msg = msg.replace('%(passwd)s', res.data.new_password);\n msg = msg.replace('%(user)s', name);\n toaster.success(msg, {\n duration: 15\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n toggleRevokeAdmin = () => {\n const email = this.props.user.email;\n this.props.toggleRevokeAdmin(email);\n }\n\n changeStatus = (st) => {\n let isActive;\n if (st == 'active') {\n isActive = 'true';\n } else {\n isActive = 'false';\n }\n\n seafileAPI.orgAdminChangeOrgUserStatus(orgID, this.props.user.email, isActive).then(res => {\n this.setState({\n currentStatus: isActive == 'true' ? 'active' : 'inactive',\n highlight: false,\n showMenu: false,\n });\n toaster.success(gettext('Edit succeeded.'));\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n if (errMessage === gettext('Error')) {\n errMessage = gettext('Edit failed.');\n }\n toaster.danger(errMessage);\n });\n }\n\n onDropdownToggleClick = (e) => {\n e.preventDefault();\n this.toggleOperationMenu(e);\n }\n\n toggleOperationMenu = (e) => {\n e.stopPropagation();\n this.setState(\n {isItemMenuShow: !this.state.isItemMenuShow }, () => {\n if (this.state.isItemMenuShow) {\n this.props.onFreezedItem();\n } else {\n this.setState({\n highlight: false,\n showMenu: false,\n });\n this.props.onUnfreezedItem();\n }\n }\n );\n }\n\n getQuotaTotal = (data) => {\n switch (data) {\n case -1: // failed to fetch quota\n return gettext('Failed');\n case -2:\n return '--';\n default: // data > 0\n return Utils.formatSize({bytes: data});\n }\n }\n\n render() {\n let { user, currentTab } = this.props;\n let href = siteRoot + 'org/useradmin/info/' + encodeURIComponent(user.email) + '/';\n let isOperationMenuShow = (user.email !== username) && this.state.showMenu;\n let isEditIconShow = isOperationMenuShow;\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>\n <a href={href}>{user.name}</a>\n </td>\n <td>\n <UserStatusEditor\n isTextMode={true}\n isEditIconShow={isEditIconShow}\n currentStatus={this.state.currentStatus}\n statusArray={this.statusArray}\n onStatusChanged={this.changeStatus}\n />\n </td>\n <td>{`${Utils.formatSize({bytes: user.quota_usage})} / ${this.getQuotaTotal(user.quota_total)}`}</td>\n <td>\n {user.ctime} /\n <br />\n {user.last_login ? user.last_login : '--'}\n </td>\n <td className=\"text-center cursor-pointer\">\n {isOperationMenuShow && (\n <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>\n <DropdownToggle\n tag=\"a\"\n className=\"attr-action-icon fas fa-ellipsis-v\"\n title={gettext('More Operations')}\n data-toggle=\"dropdown\"\n aria-expanded={this.state.isItemMenuShow}\n onClick={this.onDropdownToggleClick}\n />\n <DropdownMenu>\n <DropdownItem onClick={this.toggleDelete}>{gettext('Delete')}</DropdownItem>\n <DropdownItem onClick={this.toggleResetPW}>{gettext('ResetPwd')}</DropdownItem>\n {currentTab == 'admins' && <DropdownItem onClick={this.toggleRevokeAdmin}>{gettext('Revoke Admin')}</DropdownItem>}\n </DropdownMenu>\n </Dropdown>\n )}\n </td>\n </tr>\n );\n }\n}\n\nUserItem.propTypes = propTypes;\n\nexport default UserItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport UserItem from './org-user-item';\n\nconst propTypes = {\n initOrgUsersData: PropTypes.func.isRequired,\n toggleDelete: PropTypes.func.isRequired,\n orgUsers: PropTypes.array.isRequired,\n page: PropTypes.number.isRequired,\n pageNext: PropTypes.bool.isRequired,\n};\n\nclass OrgUsersList extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isItemFreezed: false\n };\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n onChangePageNum = (e, num) => {\n e.preventDefault();\n let page = this.props.page;\n\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n\n this.props.initOrgUsersData(page);\n }\n\n sortByQuotaUsage = (e) => {\n e.preventDefault();\n this.props.sortByQuotaUsage();\n }\n\n render() {\n const { sortBy, sortOrder } = this.props;\n let sortIcon;\n if (sortBy == '') {\n // initial sort icon\n sortIcon = <span className=\"fas fa-sort\"></span>;\n } else {\n sortIcon = <span className={`fas ${sortOrder == 'asc' ? 'fa-caret-up' : 'fa-caret-down'}`}></span>;\n }\n let { orgUsers, page, pageNext } = this.props;\n return (\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"30%\">{gettext('Name')}</th>\n <th width=\"15%\">{gettext('Status')}</th>\n <th width=\"20%\">\n <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortByQuotaUsage}>{gettext('Space Used')} {sortIcon}</a> / {gettext('Quota')}\n </th>\n <th width=\"25%\">{gettext('Created At')} / {gettext('Last Login')}</th>\n <th width=\"10%\">{/*Operations*/}</th>\n </tr>\n </thead>\n <tbody>\n {orgUsers.map((item, index) => {\n return (\n <UserItem\n key={index}\n user={item}\n currentTab=\"users\"\n isItemFreezed={this.state.isItemFreezed}\n toggleDelete={this.props.toggleDelete}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n />\n );})}\n </tbody>\n </table>\n <div className=\"paginator\">\n {page !=1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(page != 1 && pageNext) && <span> | </span>}\n {pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n </div>\n );\n }\n}\n\nOrgUsersList.propTypes = propTypes;\n\nexport default OrgUsersList;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Account from '../../components/common/account';\n\nconst propTypes = {\n children: PropTypes.object,\n};\n\nclass MainPanelTopbar extends Component {\n\n render() {\n return (\n <div className={`main-panel-north ${this.props.children ? 'border-left-show' : ''}`}>\n <div className=\"cur-view-toolbar\">\n <span className=\"sf2-icon-menu side-nav-toggle hidden-md-up d-md-none\" title=\"Side Nav Menu\"></span>\n <div className=\"operation\">\n {this.props.children}\n </div>\n </div>\n <div className=\"common-toolbar\">\n {this.props.search && this.props.search}\n <Account isAdminPanel={true}/>\n </div>\n </div>\n );\n }\n}\n\nMainPanelTopbar.propTypes = propTypes;\n\nexport default MainPanelTopbar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, Input, ModalHeader, ModalBody, ModalFooter, Label, Form, InputGroup, InputGroupAddon, FormGroup } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\n\nconst propTypes = {\n toggle: PropTypes.func.isRequired,\n handleSubmit: PropTypes.func.isRequired,\n};\n\nclass AddOrgUserDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isPasswordVisible: true,\n email: '',\n name: '',\n password: '',\n passwdnew: '',\n errMessage: '',\n isAddingUser: false,\n };\n this.passwdInput = React.createRef();\n this.passwdNewInput = React.createRef();\n }\n\n handleSubmit = () => {\n let isValid = this.validateInputParams();\n if (isValid) {\n let { email, name, password } = this.state;\n this.setState({isAddingUser: true});\n this.props.handleSubmit(email, name.trim(), password);\n }\n }\n\n handleKeyPress = (e) => {\n e.preventDefault();\n if (e.key == 'Enter') {\n this.handleSubmit(e);\n }\n };\n\n togglePasswordVisible = () => {\n this.setState({isPasswordVisible: !this.state.isPasswordVisible}, () => {\n if (this.state.isPasswordVisible) {\n this.passwdInput.type = 'password';\n this.passwdNewInput.type = 'password';\n } else {\n this.passwdInput.type = 'text';\n this.passwdNewInput.type = 'text';\n }\n });\n }\n\n generatePassword = () => {\n let val = Math.random().toString(36).substr(5);\n this.setState({\n password: val,\n passwdnew: val,\n isPasswordVisible: false\n }, () => {\n this.passwdInput.type = 'text';\n this.passwdNewInput.type = 'text';\n });\n }\n\n inputEmail = (e) => {\n let email = e.target.value.trim();\n this.setState({email: email});\n }\n\n inputName = (e) => {\n let name = e.target.value;\n this.setState({name: name});\n }\n\n inputPassword = (e) => {\n let passwd = e.target.value.trim();\n this.setState({password: passwd}, () => {\n if (this.state.isPasswordVisible) {\n this.passwdInput.type = 'password';\n this.passwdNewInput.type = 'password';\n }\n });\n }\n\n inputPasswordNew = (e) => {\n let passwd = e.target.value.trim();\n this.setState({passwdnew: passwd}, () => {\n if (this.state.isPasswordVisible) {\n this.passwdInput.type = 'password';\n this.passwdNewInput.type = 'password';\n }\n });\n }\n\n toggle = () => {\n this.props.toggle();\n }\n\n validateInputParams() {\n let errMessage;\n let email = this.state.email;\n if (!email.length) {\n errMessage = gettext('email is required');\n this.setState({errMessage: errMessage});\n return false;\n }\n let name = this.state.name.trim();\n if (!name.length) {\n errMessage = gettext('Name is required');\n this.setState({errMessage: errMessage});\n return false;\n }\n\n let password1 = this.state.password;\n let password2 = this.state.passwdnew;\n if (!password1.length) {\n errMessage = gettext('Please enter password');\n this.setState({errMessage: errMessage});\n return false;\n }\n if (!password2.length) {\n errMessage = gettext('Please enter the password again');\n this.setState({errMessage: errMessage});\n return false;\n }\n if (password1 !== password2) {\n errMessage = gettext('Passwords don\\'t match');\n this.setState({errMessage: errMessage});\n return false;\n }\n return true;\n }\n\n render() {\n return (\n <Modal isOpen={true} toggle={this.toggle}>\n <ModalHeader toggle={this.toggle}>{gettext('Add User')}</ModalHeader>\n <ModalBody>\n <Form>\n <FormGroup>\n <Label for=\"userEmail\">{gettext('Email')}</Label>\n <Input id=\"userEmail\" value={this.state.email || ''} onChange={this.inputEmail} />\n </FormGroup>\n <FormGroup>\n <Label for=\"userName\">{gettext('Name')}</Label>\n <Input id=\"userName\" value={this.state.name || ''} onChange={this.inputName} />\n </FormGroup>\n <FormGroup>\n <Label for=\"userPwd\">{gettext('Password')}</Label>\n <InputGroup className=\"passwd\">\n <Input id=\"userPwd\" innerRef={input => {this.passwdInput = input;}} value={this.state.password || ''} onChange={this.inputPassword} />\n <InputGroupAddon addonType=\"append\">\n <Button onClick={this.togglePasswordVisible}><i className={`link-operation-icon fas ${this.state.isPasswordVisible ? 'fa-eye-slash' : 'fa-eye'}`}></i></Button>\n <Button onClick={this.generatePassword}><i className=\"link-operation-icon fas fa-magic\"></i></Button>\n </InputGroupAddon>\n </InputGroup>\n </FormGroup>\n <FormGroup>\n <Label for=\"userPwdNew\">{gettext('Confirm Password')}</Label>\n <Input id=\"userPwdNew\" innerRef={input => {this.passwdNewInput = input;}} className=\"passwd\" value={this.state.passwdnew || ''} onChange={this.inputPasswordNew} />\n </FormGroup>\n </Form>\n {this.state.errMessage && <Label className=\"err-message\">{this.state.errMessage}</Label>}\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" disabled={this.state.isAddingUser} onClick={this.handleSubmit} className={this.state.isAddingUser ? 'btn-loading' : ''}>{gettext('Submit')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nAddOrgUserDialog.propTypes = propTypes;\n\nexport default AddOrgUserDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport toaster from '../toast';\nimport copy from '../copy-to-clipboard';\n\nconst propTypes = {\n toggle: PropTypes.func.isRequired,\n invitationLink: PropTypes.string.isRequired\n};\n\nclass InviteUserDialog extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n copyLink = () => {\n copy(this.props.invitationLink);\n this.props.toggle();\n const message = gettext('Internal link has been copied to clipboard');\n toaster.success(message), {\n duration: 2\n };\n }\n\n render() {\n return (\n <Modal isOpen={true}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Invite user')}</ModalHeader>\n <ModalBody>\n <p>{gettext('Send the invitation link to the others, and they will be able to join the organization via scanning the QR code.')}</p>\n <p>{this.props.invitationLink}</p>\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.copyLink}>{gettext('Copy')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nInviteUserDialog.propTypes = propTypes;\n\nexport default InviteUserDialog;\n","import { Utils } from '../utils/utils';\nimport { lang } from '../utils/constants';\nimport moment from 'moment';\n\nmoment.locale(lang);\n\nclass OrgUserInfo {\n constructor(object) {\n this.id = object.id;\n this.name = object.name;\n this.email = object.email;\n this.contact_email = object.owner_contact_email;\n this.is_active = object.is_active;\n this.quota_usage = object.quota_usage;\n this.quota_total = object.quota_total;\n this.last_login = object.last_login ? moment(object.last_login).fromNow() : '--';\n this.ctime = moment(object.ctime).format('YYYY-MM-DD HH:mm:ss');\n }\n}\n\nexport default OrgUserInfo;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport Nav from './org-users-nav';\nimport OrgUsersList from './org-users-list';\nimport MainPanelTopbar from './main-panel-topbar';\nimport ModalPortal from '../../components/modal-portal';\nimport AddOrgUserDialog from '../../components/dialog/org-add-user-dialog';\nimport InviteUserDialog from '../../components/dialog/org-admin-invite-user-dialog';\nimport toaster from '../../components/toast';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport OrgUserInfo from '../../models/org-user';\nimport { gettext, invitationLink, orgID, siteRoot } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nclass Search extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n value: ''\n };\n }\n\n handleInputChange = (e) => {\n this.setState({\n value: e.target.value\n });\n }\n\n handleKeyPress = (e) => {\n if (e.key == 'Enter') {\n e.preventDefault();\n this.handleSubmit();\n }\n }\n\n handleSubmit = () => {\n const value = this.state.value.trim();\n if (!value) {\n return false;\n }\n this.props.submit(value);\n }\n\n render() {\n return (\n <div className=\"input-icon\">\n <i className=\"d-flex input-icon-addon fas fa-search\"></i>\n <input\n type=\"text\"\n className=\"form-control search-input h-6 mr-1\"\n style={{width: '15rem'}}\n placeholder={this.props.placeholder}\n value={this.state.value}\n onChange={this.handleInputChange}\n onKeyPress={this.handleKeyPress}\n autoComplete=\"off\"\n />\n </div>\n );\n }\n}\n\nclass OrgUsers extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n orgUsers: [],\n page: 1,\n pageNext: false,\n sortBy: '',\n sortOrder: 'asc',\n isShowAddOrgUserDialog: false,\n isInviteUserDialogOpen: false\n };\n }\n\n componentDidMount() {\n let urlParams = (new URL(window.location)).searchParams;\n const { page, sortBy, sortOrder } = this.state;\n this.setState({\n /*\n perPage: parseInt(urlParams.get('per_page') || perPage),\n currentPage: parseInt(urlParams.get('page') || currentPage),\n */\n page: parseInt(urlParams.get('page') || page),\n sortBy: urlParams.get('order_by') || sortBy,\n sortOrder: urlParams.get('direction') || sortOrder\n }, () => {\n this.initOrgUsersData(this.state.page);\n });\n }\n\n sortByQuotaUsage = () => {\n this.setState({\n sortBy: 'quota_usage',\n sortOrder: this.state.sortOrder == 'asc' ? 'desc' : 'asc',\n page: 1\n }, () => {\n let url = new URL(location.href);\n let searchParams = new URLSearchParams(url.search);\n const { page, sortBy, sortOrder } = this.state;\n searchParams.set('page', page);\n searchParams.set('order_by', sortBy);\n searchParams.set('direction', sortOrder);\n url.search = searchParams.toString();\n navigate(url.toString());\n this.initOrgUsersData(page);\n });\n }\n\n toggleAddOrgUser = () => {\n this.setState({isShowAddOrgUserDialog: !this.state.isShowAddOrgUserDialog});\n }\n\n toggleInviteUserDialog = () => {\n this.setState({isInviteUserDialogOpen: !this.state.isInviteUserDialogOpen});\n }\n\n initOrgUsersData = (page) => {\n const { sortBy, sortOrder } = this.state;\n seafileAPI.orgAdminListOrgUsers(orgID, '', page, sortBy, sortOrder).then(res => {\n let userList = res.data.user_list.map(item => {\n return new OrgUserInfo(item);\n });\n this.setState({\n orgUsers: userList,\n pageNext: res.data.page_next,\n page: res.data.page,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n addOrgUser = (email, name, password) => {\n seafileAPI.orgAdminAddOrgUser(orgID, email, name, password).then(res => {\n let userInfo = new OrgUserInfo(res.data);\n this.state.orgUsers.unshift(userInfo);\n this.setState({\n orgUsers: this.state.orgUsers\n });\n this.toggleAddOrgUser();\n let msg = gettext('successfully added user %s.');\n msg = msg.replace('%s', email);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n this.toggleAddOrgUser();\n });\n }\n\n toggleOrgUsersDelete = (email) => {\n seafileAPI.orgAdminDeleteOrgUser(orgID, email).then(res => {\n let users = this.state.orgUsers.filter(item => item.email != email);\n this.setState({orgUsers: users});\n let msg = gettext('Successfully deleted %s');\n msg = msg.replace('%s', email);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n searchItems = (keyword) => {\n navigate(`${siteRoot}org/useradmin/search-users/?query=${encodeURIComponent(keyword)}`);\n }\n\n getSearch = () => {\n return <Search\n placeholder={gettext('Search users')}\n submit={this.searchItems}\n />;\n }\n\n render() {\n const topBtn = 'btn btn-secondary operation-item';\n let topbarChildren;\n topbarChildren = (\n <Fragment>\n <button className={topBtn} title={gettext('Add user')} onClick={this.toggleAddOrgUser}>\n <i className=\"fas fa-plus-square text-secondary mr-1\"></i>{gettext('Add user')}</button>\n {invitationLink &&\n <button className={topBtn} title={gettext('Invite user')} onClick={this.toggleInviteUserDialog}>\n <i className=\"fas fa-plus-square text-secondary mr-1\"></i>{gettext('Invite user')}</button>\n }\n {this.state.isShowAddOrgUserDialog &&\n <ModalPortal>\n <AddOrgUserDialog handleSubmit={this.addOrgUser} toggle={this.toggleAddOrgUser}/>\n </ModalPortal>\n }\n {this.state.isInviteUserDialogOpen &&\n <ModalPortal>\n <InviteUserDialog invitationLink={invitationLink} toggle={this.toggleInviteUserDialog}/>\n </ModalPortal>\n }\n </Fragment>\n );\n\n return (\n <Fragment>\n <MainPanelTopbar children={topbarChildren} search={this.getSearch()}/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <Nav currentItem=\"all\" />\n <OrgUsersList\n initOrgUsersData={this.initOrgUsersData}\n toggleDelete={this.toggleOrgUsersDelete}\n orgUsers={this.state.orgUsers}\n page={this.state.page}\n pageNext={this.state.pageNext}\n sortBy={this.state.sortBy}\n sortOrder={this.state.sortOrder}\n sortByQuotaUsage={this.sortByQuotaUsage}\n />\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default OrgUsers;\n","import React, { Component, Fragment } from 'react';\nimport { Button, Form, FormGroup, Input, Col } from 'reactstrap';\nimport { Utils } from '../../utils/utils';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, orgID } from '../../utils/constants';\nimport toaster from '../../components/toast';\nimport UserItem from './org-user-item';\nimport OrgUserInfo from '../../models/org-user';\n\nclass OrgUsersSearchUsersResult extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isItemFreezed: false\n };\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n render() {\n let { orgUsers } = this.props;\n return (\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"30%\">{gettext('Name')}</th>\n <th width=\"15%\">{gettext('Status')}</th>\n <th width=\"20%\">\n <a className=\"d-inline-block table-sort-op\" href=\"#\" >{gettext('Space Used')}</a> / {gettext('Quota')}\n </th>\n <th width=\"25%\">{gettext('Created At')} / {gettext('Last Login')}</th>\n <th width=\"10%\">{/*Operations*/}</th>\n </tr>\n </thead>\n <tbody>\n {orgUsers.map((item, index) => {\n return (\n <UserItem\n key={index}\n user={item}\n currentTab=\"users\"\n isItemFreezed={this.state.isItemFreezed}\n toggleDelete={this.props.toggleDelete}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n />\n );})}\n </tbody>\n </table>\n </div>\n );\n }\n}\n\nclass OrgUsersSearchUsers extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n query: '',\n orgUsers: [],\n org_id: '',\n isSubmitBtnActive: false,\n loading: true,\n errorMsg: '',\n };\n }\n\n componentDidMount () {\n let params = (new URL(document.location)).searchParams;\n this.setState({\n query: params.get('query') || '',\n }, () => {this.getItems();});\n }\n\n getItems = () => {\n seafileAPI.orgAdminSearchUser(orgID, this.state.query.trim()).then(res => {\n let userList = res.data.user_list.map(item => {\n return new OrgUserInfo(item);\n });\n this.setState({\n orgUsers: userList,\n loading: false,\n });\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n deleteUser = (email) => {\n seafileAPI.orgAdminDeleteOrgUser(orgID, email).then(res => {\n let newUserList = this.state.orgUsers.filter(item => {\n return item.email != email;\n });\n this.setState({orgUsers: newUserList});\n toaster.success(gettext('Successfully deleted 1 item.'));\n }).catch((error) => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n updateUser = (email, key, value) => {\n seafileAPI.sysAdminUpdateUser(email, key, value).then(res => {\n let newUserList = this.state.orgUsers.map(item => {\n if (item.email == email) {\n item[key]= res.data[key];\n }\n return item;\n });\n this.setState({orgUsers: newUserList});\n const msg = (key == 'is_active' && value) ?\n res.data.update_status_tip : gettext('Edit succeeded');\n toaster.success(msg);\n }).catch((error) => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n handleInputChange = (e) => {\n this.setState({\n query: e.target.value\n }, this.checkSubmitBtnActive);\n }\n\n checkSubmitBtnActive = () => {\n const { query } = this.state;\n this.setState({\n isSubmitBtnActive: query.trim()\n });\n }\n\n render() {\n const { query, isSubmitBtnActive } = this.state;\n\n return (\n <Fragment>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path\">\n <h3 className=\"sf-heading\">{gettext('Users')}</h3>\n </div>\n <div className=\"cur-view-content\">\n <div className=\"mt-4 mb-6\">\n <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Search Users')}</h4>\n <Form>\n <FormGroup row>\n <Col sm={5}>\n <Input type=\"text\" name=\"query\" value={query} placeholder={gettext('Search users')} onChange={this.handleInputChange} />\n </Col>\n </FormGroup>\n <FormGroup row>\n <Col sm={{size: 5}}>\n <button className=\"btn btn-outline-primary\" disabled={!isSubmitBtnActive} onClick={this.getItems}>{gettext('Submit')}</button>\n </Col>\n </FormGroup>\n </Form>\n </div>\n <div className=\"mt-4 mb-6\">\n <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Result')}</h4>\n <OrgUsersSearchUsersResult\n toggleDelete={this.deleteUser}\n orgUsers={this.state.orgUsers}\n />\n </div>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default OrgUsersSearchUsers;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport UserItem from './org-user-item';\n\nimport '../../css/org-admin-paginator.css';\n\nconst propTypes = {\n currentTab: PropTypes.string.isRequired,\n toggleDelete: PropTypes.func.isRequired,\n toggleRevokeAdmin: PropTypes.func.isRequired,\n orgAdminUsers: PropTypes.array.isRequired,\n initOrgAdmin: PropTypes.func.isRequired\n};\n\nclass OrgAdminList extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isItemFreezed: false\n };\n }\n\n componentDidMount() {\n this.props.initOrgAdmin();\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n render() {\n let orgAdminUsers = this.props.orgAdminUsers;\n\n return (\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"30%\">{gettext('Name')}</th>\n <th width=\"15%\">{gettext('Status')}</th>\n <th width=\"20%\">{gettext('Space Used')} / {gettext('Quota')}</th>\n <th width=\"25%\">{gettext('Created At')} / {gettext('Last Login')}</th>\n <th width=\"10%\">{/*Operations*/}</th>\n </tr>\n </thead>\n <tbody>\n {orgAdminUsers.map(item => {\n return (\n <UserItem\n key={item.index}\n user={item}\n currentTab=\"admins\"\n isItemFreezed={this.state.isItemFreezed}\n toggleDelete={this.props.toggleDelete}\n toggleRevokeAdmin={this.props.toggleRevokeAdmin}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n />\n );\n })}\n </tbody>\n </table>\n </div>\n );\n }\n}\n\nOrgAdminList.propTypes = propTypes;\n\nexport default OrgAdminList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Alert } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\nimport UserSelect from '../user-select';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport OrgUserInfo from '../../models/org-user';\n\nconst propTypes = {\n toggle: PropTypes.func.isRequired,\n onAddedOrgAdmin: PropTypes.func.isRequired,\n};\n\nclass AddOrgAdminDialog extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedOption: null,\n errMessage: '',\n };\n this.options = [];\n }\n\n handleSelectChange = (option) => {\n this.setState({\n selectedOption: option,\n errMessage: ''\n });\n this.options = [];\n }\n\n addOrgAdmin = () => {\n if (!this.state.selectedOption) return;\n const userEmail = this.state.selectedOption.email;\n seafileAPI.orgAdminSetOrgAdmin(orgID, userEmail, true).then(res => {\n let userInfo = new OrgUserInfo(res.data);\n this.props.onAddedOrgAdmin(userInfo);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n toggle = () => {\n this.props.toggle();\n }\n\n render() {\n return (\n <Modal isOpen={true} toggle={this.toggle}>\n <ModalHeader toggle={this.toggle}>{gettext('Add Admins')}</ModalHeader>\n <ModalBody>\n <UserSelect\n ref=\"userSelect\"\n isMulti={false}\n className=\"reviewer-select\"\n placeholder={gettext('Select a user as admin...')}\n onSelectChange={this.handleSelectChange}\n />\n {this.state.errMessage && <Alert color=\"danger\" className=\"mt-2\">{this.state.errMessage}</Alert>}\n </ModalBody>\n <ModalFooter>\n <Button color=\"secondary\" onClick={this.toggle}>{gettext('Close')}</Button>\n <Button color=\"primary\" onClick={this.addOrgAdmin}>{gettext('Submit')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nAddOrgAdminDialog.propTypes = propTypes;\n\nexport default AddOrgAdminDialog;\n","import React, { Component, Fragment } from 'react';\nimport Nav from './org-users-nav';\nimport OrgAdminList from './org-admin-list';\nimport MainPanelTopbar from './main-panel-topbar';\nimport AddOrgAdminDialog from '../../components/dialog/org-add-admin-dialog';\nimport ModalPortal from '../../components/modal-portal';\nimport toaster from '../../components/toast';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport OrgUserInfo from '../../models/org-user';\nimport { gettext, orgID } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nclass OrgUsers extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n orgAdminUsers: [],\n isShowAddOrgAdminDialog: false\n };\n }\n\n toggleAddOrgAdmin = () => {\n this.setState({isShowAddOrgAdminDialog: !this.state.isShowAddOrgAdminDialog});\n }\n\n initOrgAdmin = () => {\n seafileAPI.orgAdminListOrgUsers(orgID, true).then(res => {\n let userList = res.data.user_list.map(item => {\n return new OrgUserInfo(item);\n });\n this.setState({orgAdminUsers: userList});\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n toggleOrgAdminDelete = (email) => {\n seafileAPI.orgAdminDeleteOrgUser(orgID, email).then(res => {\n this.setState({\n orgAdminUsers: this.state.orgAdminUsers.filter(item => item.email != email)\n });\n let msg = gettext('Successfully deleted %s');\n msg = msg.replace('%s', email);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n toggleRevokeAdmin = (email) => {\n seafileAPI.orgAdminSetOrgAdmin(orgID, email, false).then(res => {\n this.setState({\n orgAdminUsers: this.state.orgAdminUsers.filter(item => item.email != email)\n });\n let msg = gettext('Successfully revoke the admin permission of %s');\n msg = msg.replace('%s', res.data.name);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n onAddedOrgAdmin = (userInfo) => {\n this.state.orgAdminUsers.unshift(userInfo);\n this.setState({\n orgAdminUsers: this.state.orgAdminUsers\n });\n let msg = gettext('Successfully set %s as admin.');\n msg = msg.replace('%s', userInfo.email);\n toaster.success(msg);\n this.toggleAddOrgAdmin();\n }\n\n render() {\n const topBtn = 'btn btn-secondary operation-item';\n let topbarChildren;\n topbarChildren = (\n <Fragment>\n <button className={topBtn} title={gettext('Add admin')} onClick={this.toggleAddOrgAdmin}>\n <i className=\"fas fa-plus-square text-secondary mr-1\"></i>{gettext('Add admin')}\n </button>\n {this.state.isShowAddOrgAdminDialog &&\n <ModalPortal>\n <AddOrgAdminDialog toggle={this.toggleAddOrgAdmin} onAddedOrgAdmin={this.onAddedOrgAdmin}/>\n </ModalPortal>\n }\n </Fragment>\n );\n\n return (\n <Fragment>\n <MainPanelTopbar children={topbarChildren}/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <Nav currentItem=\"admins\" />\n <OrgAdminList\n currentTab=\"admins\"\n toggleDelete={this.toggleOrgAdminDelete}\n toggleRevokeAdmin={this.toggleRevokeAdmin}\n orgAdminUsers={this.state.orgAdminUsers}\n initOrgAdmin={this.initOrgAdmin}\n />\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default OrgUsers;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../utils/constants';\n\nconst propTypes = {\n email: PropTypes.string.isRequired,\n currentItem: PropTypes.string.isRequired\n};\n\nclass OrgAdminUserNav extends React.Component {\n\n render() {\n const { email, currentItem } = this.props;\n const urlBase = `${siteRoot}org/useradmin/info/${encodeURIComponent(email)}/`;\n return (\n <div className=\"cur-view-path org-admin-user-nav\">\n <ul className=\"nav\">\n <li className=\"nav-item\">\n <Link to={urlBase} className={`nav-link${currentItem == 'profile' ? ' active' : ''}`}>{gettext('Profile')}</Link>\n </li>\n <li className=\"nav-item\">\n <Link to={`${urlBase}repos/`} className={`nav-link${currentItem == 'owned-repos' ? ' active' : ''}`}>{gettext('Owned Libraries')}</Link>\n </li>\n <li className=\"nav-item\">\n <Link to={`${urlBase}shared-repos/`} className={`nav-link${currentItem == 'shared-repos' ? ' active' : ''}`}>{gettext('Shared Libraries')}</Link>\n </li>\n </ul>\n </div>\n );\n }\n}\n\nOrgAdminUserNav.propTypes = propTypes;\n\nexport default OrgAdminUserNav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n orgID: PropTypes.string.isRequired,\n email: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n updateName: PropTypes.func.isRequired,\n toggleDialog: PropTypes.func.isRequired\n};\n\nclass SetOrgUserName extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n inputValue: this.props.name,\n submitBtnDisabled: false\n };\n }\n\n handleInputChange = (e) => {\n this.setState({\n inputValue: e.target.value\n });\n }\n\n formSubmit = () => {\n const { orgID, email } = this.props;\n const name = this.state.inputValue.trim();\n\n this.setState({\n submitBtnDisabled: true\n });\n\n // when name is '', api returns the previous name\n // but newName needs to be ''\n seafileAPI.orgAdminSetOrgUserName(orgID, email, name).then((res) => {\n const newName = name ? res.data.name : '';\n this.props.updateName(newName);\n this.props.toggleDialog();\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n formErrorMsg: errorMsg,\n submitBtnDisabled: false\n });\n });\n }\n\n render() {\n const { inputValue, formErrorMsg, submitBtnDisabled } = this.state;\n return (\n <Modal isOpen={true} centered={true} toggle={this.props.toggleDialog}>\n <ModalHeader toggle={this.props.toggleDialog}>{gettext('Set user name')}</ModalHeader>\n <ModalBody>\n <React.Fragment>\n <input type=\"text\" className=\"form-control\" value={inputValue} onChange={this.handleInputChange} />\n {formErrorMsg && <p className=\"error m-0 mt-2\">{formErrorMsg}</p>}\n </React.Fragment>\n </ModalBody>\n <ModalFooter>\n <button className=\"btn btn-secondary\" onClick={this.props.toggleDialog}>{gettext('Cancel')}</button>\n <button className=\"btn btn-primary\" disabled={submitBtnDisabled} onClick={this.formSubmit}>{gettext('Submit')}</button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nSetOrgUserName.propTypes = propTypes;\n\nexport default SetOrgUserName;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n orgID: PropTypes.string.isRequired,\n email: PropTypes.string.isRequired,\n contactEmail: PropTypes.string.isRequired,\n updateContactEmail: PropTypes.func.isRequired,\n toggleDialog: PropTypes.func.isRequired\n};\n\nclass SetOrgUserContactEmail extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n inputValue: this.props.contactEmail,\n submitBtnDisabled: false\n };\n }\n\n handleInputChange = (e) => {\n this.setState({\n inputValue: e.target.value\n });\n }\n\n formSubmit = () => {\n const { orgID, email } = this.props;\n const contactEmail = this.state.inputValue.trim();\n\n this.setState({\n submitBtnDisabled: true\n });\n\n seafileAPI.orgAdminSetOrgUserContactEmail(orgID, email, contactEmail).then((res) => {\n const newContactEmail = contactEmail ? res.data.contact_email : '';\n this.props.updateContactEmail(newContactEmail);\n this.props.toggleDialog();\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n formErrorMsg: errorMsg,\n submitBtnDisabled: false\n });\n });\n }\n\n render() {\n const { inputValue, formErrorMsg, submitBtnDisabled } = this.state;\n return (\n <Modal isOpen={true} centered={true} toggle={this.props.toggleDialog}>\n <ModalHeader toggle={this.props.toggleDialog}>{gettext('Set user contact email')}</ModalHeader>\n <ModalBody>\n <React.Fragment>\n <input type=\"text\" className=\"form-control\" value={inputValue} onChange={this.handleInputChange} />\n {formErrorMsg && <p className=\"error m-0 mt-2\">{formErrorMsg}</p>}\n </React.Fragment>\n </ModalBody>\n <ModalFooter>\n <button className=\"btn btn-secondary\" onClick={this.props.toggleDialog}>{gettext('Cancel')}</button>\n <button className=\"btn btn-primary\" disabled={submitBtnDisabled} onClick={this.formSubmit}>{gettext('Submit')}</button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nSetOrgUserContactEmail.propTypes = propTypes;\n\nexport default SetOrgUserContactEmail;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, ModalFooter, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n orgID: PropTypes.string.isRequired,\n email: PropTypes.string.isRequired,\n quotaTotal: PropTypes.string.isRequired,\n updateQuota: PropTypes.func.isRequired,\n toggleDialog: PropTypes.func.isRequired\n};\n\nclass SetOrgUserQuota extends React.Component {\n\n constructor(props) {\n super(props);\n const initialQuota = this.props.quotaTotal < 0 ? '' :\n this.props.quotaTotal / (1000 * 1000);\n this.state = {\n inputValue: initialQuota,\n submitBtnDisabled: false\n };\n }\n\n handleInputChange = (e) => {\n this.setState({\n inputValue: e.target.value\n });\n }\n\n formSubmit = () => {\n const { orgID, email } = this.props;\n const quota = this.state.inputValue.trim();\n\n if (!quota) {\n this.setState({\n formErrorMsg: gettext('It is required.')\n });\n return false;\n }\n\n this.setState({\n submitBtnDisabled: true\n });\n\n seafileAPI.orgAdminSetOrgUserQuota(orgID, email, quota).then((res) => {\n this.props.updateQuota(res.data.quota_total);\n this.props.toggleDialog();\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n formErrorMsg: errorMsg,\n submitBtnDisabled: false\n });\n });\n }\n\n render() {\n const { inputValue, formErrorMsg, submitBtnDisabled } = this.state;\n return (\n <Modal isOpen={true} centered={true} toggle={this.props.toggleDialog}>\n <ModalHeader toggle={this.props.toggleDialog}>{gettext('Set user quota')}</ModalHeader>\n <ModalBody>\n <React.Fragment>\n <InputGroup>\n <input type=\"text\" className=\"form-control\" value={inputValue} onChange={this.handleInputChange} />\n <InputGroupAddon addonType=\"append\">\n <InputGroupText>MB</InputGroupText>\n </InputGroupAddon>\n </InputGroup>\n <p className=\"small text-secondary mt-2 mb-2\">{gettext('Tip: 0 means default limit')}</p>\n {formErrorMsg && <p className=\"error m-0 mt-2\">{formErrorMsg}</p>}\n </React.Fragment>\n </ModalBody>\n <ModalFooter>\n <button className=\"btn btn-secondary\" onClick={this.props.toggleDialog}>{gettext('Cancel')}</button>\n <button className=\"btn btn-primary\" disabled={submitBtnDisabled} onClick={this.formSubmit}>{gettext('Submit')}</button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nSetOrgUserQuota.propTypes = propTypes;\n\nexport default SetOrgUserQuota;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport OrgAdminUserNav from '../../components/org-admin-user-nav';\nimport SetOrgUserName from '../../components/dialog/set-org-user-name';\nimport SetOrgUserContactEmail from '../../components/dialog/set-org-user-contact-email';\nimport SetOrgUserQuota from '../../components/dialog/set-org-user-quota';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/org-admin-user.css';\n\nconst { orgID, orgName } = window.org.pageOptions;\n\nclass OrgUserProfile extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminGetOrgUserInfo(orgID, this.props.email).then((res) => {\n this.setState(Object.assign({\n loading: false\n }, res.data));\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n updateName = (name) => {\n this.setState({\n name: name\n });\n }\n\n updateContactEmail = (contactEmail) => {\n this.setState({\n contact_email: contactEmail\n });\n }\n\n updateQuota = (quota) => {\n this.setState({\n quota_total: quota\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <OrgAdminUserNav email={this.props.email} currentItem='profile' />\n <div className=\"cur-view-content\">\n <Content\n data={this.state}\n updateName={this.updateName}\n updateContactEmail={this.updateContactEmail}\n updateQuota={this.updateQuota}\n />\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass Content extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isSetNameDialogOpen: false,\n isSetContactEmailDialogOpen: false,\n isSetQuotaDialogOpen: false\n };\n }\n\n toggleSetNameDialog = () => {\n this.setState({\n isSetNameDialogOpen: !this.state.isSetNameDialogOpen\n });\n }\n\n toggleSetContactEmailDialog = () => {\n this.setState({\n isSetContactEmailDialogOpen: !this.state.isSetContactEmailDialogOpen\n });\n }\n\n toggleSetQuotaDialog = () => {\n this.setState({\n isSetQuotaDialogOpen: !this.state.isSetQuotaDialogOpen\n });\n }\n\n render() {\n const {\n loading, errorMsg,\n avatar_url, email, contact_email,\n name, quota_total, quota_usage\n } = this.props.data;\n const { isSetNameDialogOpen, isSetContactEmailDialogOpen, isSetQuotaDialogOpen } = this.state;\n\n if (loading) {\n return <Loading />;\n }\n if (errorMsg) {\n return <p className=\"error text-center\">{errorMsg}</p>;\n }\n\n return (\n <Fragment>\n <dl>\n <dt>{gettext('Avatar')}</dt>\n <dd>\n <img src={avatar_url} width=\"48\" height=\"48\" className=\"rounded\" alt=\"\" />\n </dd>\n\n <dt>ID</dt>\n <dd>{email}</dd>\n\n <dt>{gettext('Name')}</dt>\n <dd>\n {name || '--'}\n <span title={gettext('Edit')} className=\"attr-action-icon fa fa-pencil-alt\" onClick={this.toggleSetNameDialog}></span>\n </dd>\n\n <dt>{gettext('Contact Email')}</dt>\n <dd>\n {contact_email || '--'}\n <span title={gettext('Edit')} className=\"attr-action-icon fa fa-pencil-alt\" onClick={this.toggleSetContactEmailDialog}></span>\n </dd>\n\n <dt>{gettext('Organization')}</dt>\n <dd>{orgName}</dd>\n\n <dt>{gettext('Space Used / Quota')}</dt>\n <dd>\n {`${Utils.bytesToSize(quota_usage)}${quota_total > 0 ? ' / ' + Utils.bytesToSize(quota_total) : ''}`}\n <span title={gettext('Edit')} className=\"attr-action-icon fa fa-pencil-alt\" onClick={this.toggleSetQuotaDialog}></span>\n </dd>\n </dl>\n {isSetNameDialogOpen &&\n <SetOrgUserName\n orgID={orgID}\n email={email}\n name={name}\n updateName={this.props.updateName}\n toggleDialog={this.toggleSetNameDialog}\n />\n }\n {isSetContactEmailDialogOpen &&\n <SetOrgUserContactEmail\n orgID={orgID}\n email={email}\n contactEmail={contact_email}\n updateContactEmail={this.props.updateContactEmail}\n toggleDialog={this.toggleSetContactEmailDialog}\n />\n }\n {isSetQuotaDialogOpen &&\n <SetOrgUserQuota\n orgID={orgID}\n email={email}\n quotaTotal={quota_total}\n updateQuota={this.props.updateQuota}\n toggleDialog={this.toggleSetQuotaDialog}\n />\n }\n </Fragment>\n );\n }\n}\n\nexport default OrgUserProfile;\n","import React, { Component, Fragment } from 'react';\nimport moment from 'moment';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport toaster from '../../components/toast';\nimport OrgAdminUserNav from '../../components/org-admin-user-nav';\nimport DeleteRepoDialog from '../../components/dialog/delete-repo-dialog';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/org-admin-user.css';\n\nconst { orgID } = window.org.pageOptions;\n\nclass OrgUserOwnedRepos extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminGetOrgUserOwnedRepos(orgID, this.props.email).then((res) => {\n this.setState(Object.assign({\n loading: false\n }, res.data));\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <OrgAdminUserNav email={this.props.email} currentItem='owned-repos' />\n <div className=\"cur-view-content\">\n <Content\n data={this.state}\n />\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass Content extends Component {\n\n constructor(props) {\n super(props);\n }\n\n render() {\n const {\n loading, errorMsg, repo_list\n } = this.props.data;\n\n if (loading) {\n return <Loading />;\n }\n if (errorMsg) {\n return <p className=\"error text-center\">{errorMsg}</p>;\n }\n\n return (\n <Fragment>\n <table className=\"table-hover\">\n <thead>\n <tr>\n <th width=\"4%\">{/*icon*/}</th>\n <th width=\"35%\">{gettext('Name')}</th>\n <th width=\"16%\">{gettext('Size')}</th>\n <th width=\"25%\">{gettext('Last Update')}</th>\n <th width=\"20%\"></th>\n </tr>\n </thead>\n <tbody>\n {repo_list.map((item, index) => {\n return <Item key={index} data={item} />;\n })}\n </tbody>\n </table>\n </Fragment>\n );\n }\n}\n\nclass Item extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isOpIconShown: false,\n deleted: false,\n isDeleteRepoDialogOpen: false,\n isRepoDeleted: false,\n };\n }\n\n handleMouseOver = () => {\n this.setState({\n isOpIconShown: true\n });\n }\n\n handleMouseOut = () => {\n this.setState({\n isOpIconShown: false\n });\n }\n\n handleDeleteIconClick = (e) => {\n e.preventDefault();\n this.toggleDeleteRepoDialog();\n }\n\n toggleDeleteRepoDialog = () => {\n this.setState({\n isDeleteRepoDialogOpen: !this.state.isDeleteRepoDialogOpen\n });\n }\n\n deleteRepo = () => {\n const repo = this.props.data;\n seafileAPI.orgAdminDeleteOrgRepo(orgID, repo.repo_id).then((res) => {\n this.setState({\n deleted: true,\n isRepoDeleted: true,\n });\n const msg = gettext('Successfully deleted {name}.').replace('{name}', repo.repo_name);\n toaster.success(msg);\n }).catch((error) => {\n const errorMsg = Utils.getErrorMsg(error);\n toaster.danger(errorMsg);\n\n this.setState({isRepoDeleted: false});\n });\n }\n\n render() {\n const { deleted, isOpIconShown, isDeleteRepoDialogOpen } = this.state;\n const repo = this.props.data;\n\n if (deleted) {\n return null;\n }\n\n return (\n <Fragment>\n <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n <td>\n <img src={Utils.getLibIconUrl(repo, false)} alt={Utils.getLibIconTitle(repo)} title={Utils.getLibIconTitle(repo)} width=\"24\" />\n </td>\n <td>{repo.repo_name}</td>\n <td>{Utils.bytesToSize(repo.size)}</td>\n <td title={moment(repo.last_modified).format('LLLL')}>{moment(repo.last_modified).format('YYYY-MM-DD')}</td>\n <td>\n <a href=\"#\" className={`action-icon sf2-icon-delete${isOpIconShown ? '' : ' invisible'}`} title={gettext('Delete')} onClick={this.handleDeleteIconClick}></a>\n </td>\n </tr>\n {isDeleteRepoDialogOpen && (\n <DeleteRepoDialog\n repo={repo}\n isRepoDeleted={this.state.isRepoDeleted}\n onDeleteRepo={this.deleteRepo}\n toggle={this.toggleDeleteRepoDialog}\n />\n )}\n </Fragment>\n );\n }\n}\n\nexport default OrgUserOwnedRepos;\n","import React, { Component, Fragment } from 'react';\nimport moment from 'moment';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport OrgAdminUserNav from '../../components/org-admin-user-nav';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/org-admin-user.css';\n\nconst { orgID } = window.org.pageOptions;\n\nclass OrgUserSharedRepos extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminGetOrgUserBesharedRepos(orgID, this.props.email).then((res) => {\n this.setState(Object.assign({\n loading: false\n }, res.data));\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <OrgAdminUserNav email={this.props.email} currentItem='shared-repos' />\n <div className=\"cur-view-content\">\n <Content\n data={this.state}\n />\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass Content extends Component {\n\n constructor(props) {\n super(props);\n }\n\n render() {\n const {\n loading, errorMsg, repo_list\n } = this.props.data;\n\n if (loading) {\n return <Loading />;\n }\n if (errorMsg) {\n return <p className=\"error text-center\">{errorMsg}</p>;\n }\n\n return (\n <table className=\"table-hover\">\n <thead>\n <tr>\n <th width=\"4%\">{/*icon*/}</th>\n <th width=\"30%\">{gettext('Name')}</th>\n <th width=\"26%\">{gettext('Owner')}</th>\n <th width=\"15%\">{gettext('Size')}</th>\n <th width=\"25%\">{gettext('Last Update')}</th>\n </tr>\n </thead>\n <tbody>\n {repo_list.map((item, index) => {\n return <Item key={index} data={item} />;\n })}\n </tbody>\n </table>\n );\n }\n}\n\nclass Item extends Component {\n\n constructor(props) {\n super(props);\n }\n\n render() {\n const repo = this.props.data;\n return (\n <tr>\n <td>\n <img src={Utils.getLibIconUrl(repo, false)} alt={Utils.getLibIconTitle(repo)} title={Utils.getLibIconTitle(repo)} width=\"24\" />\n </td>\n <td>{repo.repo_name}</td>\n <td>{repo.owner_name}</td>\n <td>{Utils.bytesToSize(repo.size)}</td>\n <td title={moment(repo.last_modified).format('LLLL')}>{moment(repo.last_modified).format('YYYY-MM-DD')}</td>\n </tr>\n );\n }\n}\n\nexport default OrgUserSharedRepos;\n","import { lang } from '../utils/constants';\nimport moment from 'moment';\n\nmoment.locale(lang);\n\nclass OrgGroupInfo {\n constructor(object) {\n this.id = object.id;\n this.groupName = object.group_name;\n this.creatorName = object.creator_name;\n this.creatorEmail = object.creator_email;\n this.creatorContactEmail = object.creator_contact_email;\n this.ctime = moment(object.ctime).format('YYYY-MM-DD HH:mm:ss');\n }\n}\n\nexport default OrgGroupInfo;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport PropTypes from 'prop-types';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { siteRoot, gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport OrgGroupInfo from '../../models/org-group';\nimport MainPanelTopbar from './main-panel-topbar';\n\nclass Search extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n value: ''\n };\n }\n\n handleInputChange = (e) => {\n this.setState({\n value: e.target.value\n });\n }\n\n handleKeyPress = (e) => {\n if (e.key == 'Enter') {\n e.preventDefault();\n this.handleSubmit();\n }\n }\n\n handleSubmit = () => {\n const value = this.state.value.trim();\n if (!value) {\n return false;\n }\n this.props.submit(value);\n }\n\n render() {\n return (\n <div className=\"input-icon\">\n <i className=\"d-flex input-icon-addon fas fa-search\"></i>\n <input\n type=\"text\"\n className=\"form-control search-input h-6 mr-1\"\n style={{width: '15rem'}}\n placeholder={this.props.placeholder}\n value={this.state.value}\n onChange={this.handleInputChange}\n onKeyPress={this.handleKeyPress}\n autoComplete=\"off\"\n />\n </div>\n );\n }\n}\n\nclass OrgGroups extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n page: 1,\n pageNext: false,\n orgGroups: [],\n isItemFreezed: false\n };\n }\n\n componentDidMount() {\n let page = this.state.page;\n this.initData(page);\n }\n\n initData = (page) => {\n seafileAPI.orgAdminListOrgGroups(orgID, page).then(res => {\n let orgGroups = res.data.groups.map(item => {\n return new OrgGroupInfo(item);\n });\n\n this.setState({\n orgGroups: orgGroups,\n pageNext: res.data.page_next,\n page: res.data.page,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n\n onChangePageNum = (e, num) => {\n e.preventDefault();\n let page = this.state.page;\n\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n this.initData(page);\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n deleteGroupItem = (group) => {\n seafileAPI.orgAdminDeleteOrgGroup(orgID, group.id).then(res => {\n this.setState({\n orgGroups: this.state.orgGroups.filter(item => item.id != group.id)\n });\n let msg = gettext('Successfully deleted {name}');\n msg = msg.replace('{name}', group.groupName);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n searchItems = (keyword) => {\n navigate(`${siteRoot}org/groupadmin/search-groups/?query=${encodeURIComponent(keyword)}`);\n }\n\n getSearch = () => {\n return <Search\n placeholder={gettext('Search groups by name')}\n submit={this.searchItems}\n />;\n }\n\n render() {\n let groups = this.state.orgGroups;\n return (\n <Fragment>\n <MainPanelTopbar search={this.getSearch()}/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path\">\n <h3 className=\"sf-heading\">{gettext('All Groups')}</h3>\n </div>\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"30%\">{gettext('Name')}</th>\n <th width=\"35%\">{gettext('Creator')}</th>\n <th width=\"23%\">{gettext('Created At')}</th>\n <th width=\"12%\" className=\"text-center\">{gettext('Operations')}</th>\n </tr>\n </thead>\n <tbody>\n {groups.map(item => {\n return (\n <GroupItem\n key={item.id}\n group={item}\n isItemFreezed={this.state.isItemFreezed}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n deleteGroupItem={this.deleteGroupItem}\n />\n );\n })}\n </tbody>\n </table>\n <div className=\"paginator\">\n {this.state.page != 1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(this.state.page != 1 && this.state.pageNext) && <span> | </span>}\n {this.state.pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nconst GroupItemPropTypes = {\n group: PropTypes.object.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n onFreezedItem: PropTypes.func.isRequired,\n onUnfreezedItem: PropTypes.func.isRequired,\n deleteGroupItem: PropTypes.func.isRequired,\n};\n\nclass GroupItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n onDropdownToggleClick = (e) => {\n e.preventDefault();\n this.toggleOperationMenu(e);\n }\n\n toggleOperationMenu = (e) => {\n e.stopPropagation();\n this.setState(\n {isItemMenuShow: !this.state.isItemMenuShow }, () => {\n if (this.state.isItemMenuShow) {\n this.props.onFreezedItem();\n } else {\n this.setState({\n highlight: false,\n showMenu: false,\n });\n this.props.onUnfreezedItem();\n }\n }\n );\n }\n\n toggleDelete = () => {\n this.props.deleteGroupItem(this.props.group);\n }\n\n renderGroupHref = (group) => {\n let groupInfoHref;\n if (group.creatorName == 'system admin') {\n groupInfoHref = siteRoot + 'org/departmentadmin/groups/' + group.id + '/';\n } else {\n groupInfoHref = siteRoot + 'org/groupadmin/' + group.id + '/';\n }\n\n return groupInfoHref;\n }\n\n renderGroupCreator = (group) => {\n let userInfoHref = siteRoot + 'org/useradmin/info/' + group.creatorEmail + '/';\n if (group.creatorName == 'system admin') {\n return (\n <td> -- </td>\n );\n } else {\n return(\n <td>\n <a href={userInfoHref} className=\"font-weight-normal\">{group.creatorName}</a>\n </td>\n );\n }\n }\n\n render() {\n let { group } = this.props;\n let isOperationMenuShow = (group.creatorName != 'system admin') && this.state.showMenu;\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>\n <a href={this.renderGroupHref(group)} className=\"font-weight-normal\">{group.groupName}</a>\n </td>\n {this.renderGroupCreator(group)}\n <td>{group.ctime}</td>\n <td className=\"text-center cursor-pointer\">\n {isOperationMenuShow &&\n <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>\n <DropdownToggle\n tag=\"a\"\n className=\"attr-action-icon fas fa-ellipsis-v\"\n title={gettext('More Operations')}\n data-toggle=\"dropdown\"\n aria-expanded={this.state.isItemMenuShow}\n onClick={this.onDropdownToggleClick}\n />\n <DropdownMenu>\n <DropdownItem onClick={this.toggleDelete}>{gettext('Delete')}</DropdownItem>\n </DropdownMenu>\n </Dropdown>\n }\n </td>\n </tr>\n );\n }\n\n}\n\nGroupItem.propTypes = GroupItemPropTypes;\n\nexport default OrgGroups;\n","import React, { Component, Fragment } from 'react';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { Button, Form, FormGroup, Input, Col } from 'reactstrap';\nimport { Utils } from '../../utils/utils';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, orgID, siteRoot } from '../../utils/constants';\nimport toaster from '../../components/toast';\nimport OrgGroupInfo from '../../models/org-group';\n\nclass GroupItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n onDropdownToggleClick = (e) => {\n e.preventDefault();\n this.toggleOperationMenu(e);\n }\n\n toggleOperationMenu = (e) => {\n e.stopPropagation();\n this.setState(\n {isItemMenuShow: !this.state.isItemMenuShow }, () => {\n if (this.state.isItemMenuShow) {\n this.props.onFreezedItem();\n } else {\n this.setState({\n highlight: false,\n showMenu: false,\n });\n this.props.onUnfreezedItem();\n }\n }\n );\n }\n\n toggleDelete = () => {\n this.props.deleteGroupItem(this.props.group);\n }\n\n renderGroupHref = (group) => {\n let groupInfoHref;\n if (group.creatorName == 'system admin') {\n groupInfoHref = siteRoot + 'org/departmentadmin/groups/' + group.id + '/';\n } else {\n groupInfoHref = siteRoot + 'org/groupadmin/' + group.id + '/';\n }\n\n return groupInfoHref;\n }\n\n renderGroupCreator = (group) => {\n let userInfoHref = siteRoot + 'org/useradmin/info/' + group.creatorEmail + '/';\n if (group.creatorName == 'system admin') {\n return (\n <td> -- </td>\n );\n } else {\n return(\n <td>\n <a href={userInfoHref} className=\"font-weight-normal\">{group.creatorName}</a>\n </td>\n );\n }\n }\n\n render() {\n let { group } = this.props;\n let isOperationMenuShow = (group.creatorName != 'system admin') && this.state.showMenu;\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>\n <a href={this.renderGroupHref(group)} className=\"font-weight-normal\">{group.groupName}</a>\n </td>\n {this.renderGroupCreator(group)}\n <td>{group.ctime}</td>\n <td className=\"text-center cursor-pointer\">\n {isOperationMenuShow &&\n <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>\n <DropdownToggle\n tag=\"a\"\n className=\"attr-action-icon fas fa-ellipsis-v\"\n title={gettext('More Operations')}\n data-toggle=\"dropdown\"\n aria-expanded={this.state.isItemMenuShow}\n onClick={this.onDropdownToggleClick}\n />\n <DropdownMenu>\n <DropdownItem onClick={this.toggleDelete}>{gettext('Delete')}</DropdownItem>\n </DropdownMenu>\n </Dropdown>\n }\n </td>\n </tr>\n );\n }\n}\n\n\nclass OrgGroupsSearchGroupsResult extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isItemFreezed: false\n };\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n render() {\n let { orgGroups } = this.props;\n return (\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"30%\">{gettext('Name')}</th>\n <th width=\"35%\">{gettext('Creator')}</th>\n <th width=\"23%\">{gettext('Created At')}</th>\n <th width=\"12%\" className=\"text-center\">{gettext('Operations')}</th>\n </tr>\n </thead>\n <tbody>\n {orgGroups.map(item => {\n return (\n <GroupItem\n key={item.id}\n group={item}\n isItemFreezed={this.state.isItemFreezed}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n deleteGroupItem={this.props.toggleDelete}\n />\n );\n })}\n </tbody>\n </table>\n </div>\n );\n }\n}\n\nclass OrgGroupsSearchGroups extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n query: '',\n orgGroups: [],\n isSubmitBtnActive: false,\n loading: true,\n errorMsg: '',\n };\n }\n\n componentDidMount () {\n let params = (new URL(document.location)).searchParams;\n this.setState({\n query: params.get('query') || '',\n }, () => {this.getItems();});\n }\n\n getItems = () => {\n seafileAPI.orgAdminSearchGroup(orgID, this.state.query.trim()).then(res => {\n let groupList = res.data.group_list.map(item => {\n return new OrgGroupInfo(item);\n });\n this.setState({\n orgGroups: groupList,\n loading: false,\n });\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n deleteGroupItem = (group) => {\n seafileAPI.orgAdminDeleteOrgGroup(orgID, group.id).then(res => {\n this.setState({\n orgGroups: this.state.orgGroups.filter(item => item.id != group.id)\n });\n let msg = gettext('Successfully deleted {name}');\n msg = msg.replace('{name}', group.groupName);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n handleInputChange = (e) => {\n this.setState({\n query: e.target.value\n }, this.checkSubmitBtnActive);\n }\n\n checkSubmitBtnActive = () => {\n const { query } = this.state;\n this.setState({\n isSubmitBtnActive: query.trim()\n });\n }\n\n render() {\n const { query, isSubmitBtnActive } = this.state;\n\n return (\n <Fragment>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path\">\n <h3 className=\"sf-heading\">{gettext('Groups')}</h3>\n </div>\n <div className=\"cur-view-content\">\n <div className=\"mt-4 mb-6\">\n <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Search Groups')}</h4>\n <Form>\n <FormGroup row>\n <Col sm={5}>\n <Input type=\"text\" name=\"query\" value={query} placeholder={gettext('Search groups')} onChange={this.handleInputChange} />\n </Col>\n </FormGroup>\n <FormGroup row>\n <Col sm={{size: 5}}>\n <button className=\"btn btn-outline-primary\" disabled={!isSubmitBtnActive} onClick={this.getItems}>{gettext('Submit')}</button>\n </Col>\n </FormGroup>\n </Form>\n </div>\n <div className=\"mt-4 mb-6\">\n <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Result')}</h4>\n <OrgGroupsSearchGroupsResult\n toggleDelete={this.deleteGroupItem}\n orgGroups={this.state.orgGroups}\n />\n </div>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default OrgGroupsSearchGroups;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../utils/constants';\n\nconst propTypes = {\n groupID: PropTypes.string.isRequired,\n currentItem: PropTypes.string.isRequired\n};\n\nclass OrgAdminGroupNav extends React.Component {\n\n render() {\n const { groupID, currentItem } = this.props;\n const urlBase = `${siteRoot}org/groupadmin/${groupID}/`;\n return (\n <div className=\"cur-view-path org-admin-user-nav\">\n <ul className=\"nav\">\n <li className=\"nav-item\">\n <Link to={urlBase} className={`nav-link${currentItem == 'info' ? ' active' : ''}`}>{gettext('Group Info')}</Link>\n </li>\n <li className=\"nav-item\">\n <Link to={`${urlBase}repos/`} className={`nav-link${currentItem == 'repos' ? ' active' : ''}`}>{gettext('Libraries')}</Link>\n </li>\n <li className=\"nav-item\">\n <Link to={`${urlBase}members/`} className={`nav-link${currentItem == 'members' ? ' active' : ''}`}>{gettext('Members')}</Link>\n </li>\n </ul>\n </div>\n );\n }\n}\n\nOrgAdminGroupNav.propTypes = propTypes;\n\nexport default OrgAdminGroupNav;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport OrgAdminGroupNav from '../../components/org-admin-group-nav';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/org-admin-user.css';\n\nconst { orgID } = window.org.pageOptions;\n\nclass OrgGroupInfo extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminGetGroup(orgID, this.props.groupID).then((res) => {\n this.setState(Object.assign({\n loading: false\n }, res.data));\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <OrgAdminGroupNav groupID={this.props.groupID} currentItem='info' />\n <div className=\"cur-view-content\">\n <Content\n data={this.state}\n />\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass Content extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n };\n }\n\n render() {\n const {\n loading, errorMsg,\n group_name, creator_email, creator_name\n } = this.props.data;\n\n if (loading) {\n return <Loading />;\n }\n if (errorMsg) {\n return <p className=\"error text-center mt-2\">{errorMsg}</p>;\n }\n\n return (\n <dl>\n <dt>{gettext('Name')}</dt>\n <dd>{group_name}</dd>\n\n <dt>{gettext('Creator')}</dt>\n <dd>\n <Link to={`${siteRoot}org/useradmin/info/${encodeURIComponent(creator_email)}/`}>{creator_name}</Link>\n </dd>\n </dl>\n );\n }\n}\n\nexport default OrgGroupInfo;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport toaster from '../../components/toast';\nimport OrgAdminGroupNav from '../../components/org-admin-group-nav';\nimport DeleteRepoDialog from '../../components/dialog/delete-repo-dialog';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/org-admin-user.css';\n\nconst { orgID } = window.org.pageOptions;\n\nclass OrgGroupRepos extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminListGroupRepos(orgID, this.props.groupID).then((res) => {\n this.setState(Object.assign({\n loading: false\n }, res.data));\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <OrgAdminGroupNav groupID={this.props.groupID} currentItem='repos' />\n <div className=\"cur-view-content\">\n <Content\n data={this.state}\n />\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass Content extends Component {\n\n constructor(props) {\n super(props);\n }\n\n render() {\n const {\n loading, errorMsg, libraries\n } = this.props.data;\n\n if (loading) {\n return <Loading />;\n }\n if (errorMsg) {\n return <p className=\"error text-center mt-2\">{errorMsg}</p>;\n }\n\n return (\n <Fragment>\n <table className=\"table-hover\">\n <thead>\n <tr>\n <th width=\"4%\">{/*icon*/}</th>\n <th width=\"35%\">{gettext('Name')}</th>\n <th width=\"20%\">{gettext('Size')}</th>\n <th width=\"26%\">{gettext('Shared By')}</th>\n <th width=\"15%\"></th>\n </tr>\n </thead>\n <tbody>\n {libraries.map((item, index) => {\n return <Item key={index} data={item} />;\n })}\n </tbody>\n </table>\n </Fragment>\n );\n }\n}\n\nclass Item extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isOpIconShown: false,\n deleted: false,\n isDeleteRepoDialogOpen: false,\n isRepoDeleted: false,\n };\n }\n\n handleMouseOver = () => {\n this.setState({\n isOpIconShown: true\n });\n }\n\n handleMouseOut = () => {\n this.setState({\n isOpIconShown: false\n });\n }\n\n handleDeleteIconClick = (e) => {\n e.preventDefault();\n this.toggleDeleteRepoDialog();\n }\n\n toggleDeleteRepoDialog = () => {\n this.setState({\n isDeleteRepoDialogOpen: !this.state.isDeleteRepoDialogOpen\n });\n }\n\n deleteRepo = () => {\n const repo = this.props.data;\n seafileAPI.orgAdminDeleteOrgRepo(orgID, repo.repo_id).then((res) => {\n this.setState({\n deleted: true,\n isRepoDeleted: true,\n });\n const msg = gettext('Successfully deleted {name}.').replace('{name}', repo.name);\n toaster.success(msg);\n }).catch((error) => {\n const errorMsg = Utils.getErrorMsg(error);\n toaster.danger(errorMsg);\n\n this.setState({isRepoDeleted: false});\n });\n }\n\n render() {\n const { deleted, isOpIconShown, isDeleteRepoDialogOpen } = this.state;\n const repo = this.props.data;\n\n if (deleted) {\n return null;\n }\n\n return (\n <Fragment>\n <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n <td>\n <img src={Utils.getLibIconUrl(repo, false)} alt={Utils.getLibIconTitle(repo)} title={Utils.getLibIconTitle(repo)} width=\"24\" />\n </td>\n <td>{repo.name}</td>\n <td>{Utils.bytesToSize(repo.size)}</td>\n <td><Link to={`${siteRoot}org/useradmin/info/${encodeURIComponent(repo.shared_by)}/`}>{repo.shared_by_name}</Link></td>\n <td>\n <a href=\"#\" className={`action-icon sf2-icon-delete${isOpIconShown ? '' : ' invisible'}`} title={gettext('Delete')} onClick={this.handleDeleteIconClick}></a>\n </td>\n </tr>\n {isDeleteRepoDialogOpen && (\n <DeleteRepoDialog\n repo={repo}\n isRepoDeleted={this.state.isRepoDeleted}\n onDeleteRepo={this.deleteRepo}\n toggle={this.toggleDeleteRepoDialog}\n />\n )}\n </Fragment>\n );\n }\n}\n\nexport default OrgGroupRepos;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport OrgAdminGroupNav from '../../components/org-admin-group-nav';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/org-admin-user.css';\n\nconst { orgID } = window.org.pageOptions;\n\nclass OrgGroupMembers extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminListGroupMembers(orgID, this.props.groupID).then((res) => {\n this.setState(Object.assign({\n loading: false\n }, res.data));\n }).catch((error) => {\n this.setState({\n loading: false,\n errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n });\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <OrgAdminGroupNav groupID={this.props.groupID} currentItem='members' />\n <div className=\"cur-view-content\">\n <Content\n data={this.state}\n />\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass Content extends Component {\n\n constructor(props) {\n super(props);\n }\n\n render() {\n const {\n loading, errorMsg, members\n } = this.props.data;\n\n if (loading) {\n return <Loading />;\n }\n if (errorMsg) {\n return <p className=\"error text-center mt-2\">{errorMsg}</p>;\n }\n\n return (\n <Fragment>\n <table className=\"table-hover\">\n <thead>\n <tr>\n <th width=\"10%\"></th>\n <th width=\"50%\">{gettext('Name')}</th>\n <th width=\"40%\">{gettext('Role')}</th>\n </tr>\n </thead>\n <tbody>\n {members.map((item, index) => {\n return <Item key={index} data={item} />;\n })}\n </tbody>\n </table>\n </Fragment>\n );\n }\n}\n\nclass Item extends Component {\n\n constructor(props) {\n super(props);\n }\n\n getRoleText() {\n switch (this.props.data.role) {\n case 'Owner':\n return gettext('Owner');\n case 'Admin':\n return gettext('Admin');\n case 'Member':\n return gettext('Member');\n }\n }\n\n render() {\n const item = this.props.data;\n return (\n <Fragment>\n <tr>\n <td className=\"text-center\">\n <img src={item.avatar_url} alt=\"\" className=\"avatar\" width=\"32\" />\n </td>\n <td>\n <Link to={`${siteRoot}org/useradmin/info/${encodeURIComponent(item.email)}/`}>{item.name}</Link>\n </td>\n <td>\n {this.getRoleText()}\n </td>\n </tr>\n </Fragment>\n );\n }\n}\n\nexport default OrgGroupMembers;\n","class OrgAdminRepo {\n constructor(object) {\n this.repoID = object.repo_id;\n this.repoName = object.repo_name;\n this.ownerName = object.owner_name;\n this.ownerEmail = object.owner_email;\n this.size = object.size;\n this.file_count = object.file_count;\n this.encrypted = object.encrypted;\n this.isDepartmentRepo = object.is_department_repo;\n this.groupID = object.group_id;\n }\n}\n\nexport default OrgAdminRepo;\n","import React, { Fragment, Component } from 'react';\nimport { navigate } from '@reach/router';\nimport PropTypes from 'prop-types';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport MainPanelTopbar from './main-panel-topbar';\nimport OrgAdminRepo from '../../models/org-admin-repo';\nimport toaster from '../../components/toast';\nimport TransferDialog from '../../components/dialog/transfer-dialog';\nimport ModalPortal from '../../components/modal-portal';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport { mediaUrl, siteRoot, gettext, orgID } from '../../utils/constants';\n\nclass OrgLibraries extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n page: 1,\n pageNext: false,\n orgRepos: [],\n sortBy: '',\n isItemFreezed: false\n };\n }\n\n componentDidMount() {\n let urlParams = (new URL(window.location)).searchParams;\n const { page, /*currentPage = 1, perPage, */sortBy } = this.state;\n this.setState({\n sortBy: urlParams.get('order_by') || sortBy,\n //perPage: parseInt(urlParams.get('per_page') || perPage),\n //currentPage: parseInt(urlParams.get('page') || currentPage)\n page: parseInt(urlParams.get('page') || page)\n }, () => {\n this.listRepos(this.state.page);\n });\n }\n\n listRepos = (page) => {\n seafileAPI.orgAdminListOrgRepos(orgID, page, this.state.sortBy).then(res => {\n let orgRepos = res.data.repo_list.map(item => {\n return new OrgAdminRepo(item);\n });\n\n this.setState({\n orgRepos: orgRepos,\n pageNext: res.data.page_next,\n page: res.data.page,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n\n onChangePageNum = (e, num) => {\n e.preventDefault();\n let page = this.state.page;\n\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n this.listRepos(page);\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n deleteRepoItem = (repo) => {\n seafileAPI.orgAdminDeleteOrgRepo(orgID, repo.repoID).then(res => {\n this.setState({\n orgRepos: this.state.orgRepos.filter(item => item.repoID != repo.repoID)\n });\n let msg = gettext('Successfully deleted {name}');\n msg = msg.replace('{name}', repo.repoName);\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n transferRepoItem = (repoID, user) => {\n this.setState({\n orgRepos: this.state.orgRepos.map(item =>{\n if (item.repoID == repoID) {\n item.ownerEmail = user.email;\n item.ownerName = user.value;\n }\n return item;\n })\n });\n }\n\n sortItems = (sortBy) => {\n this.setState({\n page: 1,\n sortBy: sortBy\n }, () => {\n let url = new URL(location.href);\n let searchParams = new URLSearchParams(url.search);\n const { page, sortBy } = this.state;\n searchParams.set('page', page);\n searchParams.set('order_by', sortBy);\n url.search = searchParams.toString();\n navigate(url.toString());\n this.listRepos(page);\n });\n }\n\n sortByFileCount = (e) => {\n e.preventDefault();\n this.sortItems('file_count');\n }\n\n sortBySize = (e) => {\n e.preventDefault();\n this.sortItems('size');\n }\n\n render() {\n const { orgRepos, sortBy } = this.state;\n const initialSortIcon = <span className=\"fas fa-sort\"></span>;\n const sortIcon = <span className=\"fas fa-caret-down\"></span>;\n return (\n <Fragment>\n <MainPanelTopbar />\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path\">\n <h3 className=\"sf-heading\">{gettext('All Libraries')}</h3>\n </div>\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"5%\">{/*icon*/}</th>\n <th width=\"25%\">{gettext('Name')}</th>\n <th width=\"15%\">\n <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortByFileCount}>{gettext('Files')} {sortBy == 'file_count' ? sortIcon : initialSortIcon}</a>{' / '}\n <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortBySize}>{gettext('Size')} {sortBy == 'size' ? sortIcon : initialSortIcon}</a>\n </th>\n <th width=\"32%\">ID</th>\n <th width=\"18%\">{gettext('Owner')}</th>\n <th width=\"5%\">{/*Operations*/}</th>\n </tr>\n </thead>\n <tbody>\n {orgRepos.map(item => {\n return (\n <RepoItem\n key={item.repoID}\n repo={item}\n isItemFreezed={this.state.isItemFreezed}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n deleteRepoItem={this.deleteRepoItem}\n transferRepoItem={this.transferRepoItem}\n />\n );}\n )}\n </tbody>\n </table>\n <div className=\"paginator\">\n {this.state.page != 1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(this.state.page != 1 && this.state.pageNext) && <span> | </span>}\n {this.state.pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nconst propTypes = {\n repo: PropTypes.object.isRequired,\n isItemFreezed: PropTypes.bool,\n onFreezedItem: PropTypes.func.isRequired,\n onUnfreezedItem: PropTypes.func.isRequired,\n deleteRepoItem: PropTypes.func.isRequired,\n transferRepoItem: PropTypes.func.isRequired,\n};\n\nclass RepoItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false,\n isTransferDialogShow: false\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n onDropdownToggleClick = (e) => {\n e.preventDefault();\n this.toggleOperationMenu(e);\n }\n\n toggleOperationMenu = (e) => {\n e.stopPropagation();\n this.setState(\n {isItemMenuShow: !this.state.isItemMenuShow }, () => {\n if (this.state.isItemMenuShow) {\n this.props.onFreezedItem();\n } else {\n this.setState({\n highlight: false,\n showMenu: false,\n });\n this.props.onUnfreezedItem();\n }\n }\n );\n }\n\n toggleDelete = () => {\n this.props.deleteRepoItem(this.props.repo);\n }\n\n toggleTransfer = () => {\n this.props.transferRepoItem(this.props.repo);\n }\n\n renderLibIcon = (repo) => {\n let href;\n let iconTitle;\n if (repo.encrypted) {\n href = mediaUrl + 'img/lib/48/lib-encrypted.png';\n iconTitle = gettext('Encrypted library');\n } else {\n href = mediaUrl + 'img/lib/48/lib.png';\n iconTitle = gettext('Read-Write library');\n }\n return <img src={href} title={iconTitle} alt={iconTitle} width=\"24\" />;\n }\n\n renderRepoOwnerHref = (repo) => {\n let href;\n if (repo.isDepartmentRepo) {\n href = siteRoot + 'org/admin/#address-book/groups/' + repo.groupID + '/';\n } else {\n href = siteRoot + 'org/useradmin/info/' + repo.ownerEmail + '/';\n }\n return href;\n }\n\n toggleTransfer = () => {\n this.setState({isTransferDialogShow: !this.state.isTransferDialogShow});\n }\n\n onTransferRepo = (user) => {\n let repo = this.props.repo;\n seafileAPI.orgAdminTransferOrgRepo(orgID, repo.repoID, user.email).then(res => {\n this.props.transferRepoItem(repo.repoID, user);\n let msg = gettext('Successfully transferred the library.');\n toaster.success(msg);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n this.toggleTransfer();\n }\n\n render() {\n let { repo } = this.props;\n\n let isOperationMenuShow = this.state.showMenu && !repo.isDepartmentRepo;\n return (\n <Fragment>\n <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>{this.renderLibIcon(repo)}</td>\n <td>{repo.repoName}</td>\n <td>{`${repo.file_count} / ${Utils.bytesToSize(repo.size)}`}</td>\n <td>{repo.repoID}</td>\n <td><a href={this.renderRepoOwnerHref(repo)}>{repo.ownerName}</a></td>\n <td className=\"text-center cursor-pointer\">\n {isOperationMenuShow &&\n <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>\n <DropdownToggle\n tag=\"a\"\n className=\"attr-action-icon fas fa-ellipsis-v\"\n title={gettext('More Operations')}\n data-toggle=\"dropdown\"\n aria-expanded={this.state.isItemMenuShow}\n onClick={this.onDropdownToggleClick}\n />\n <DropdownMenu>\n <DropdownItem onClick={this.toggleDelete}>{gettext('Delete')}</DropdownItem>\n <DropdownItem onClick={this.toggleTransfer}>{gettext('Transfer')}</DropdownItem>\n </DropdownMenu>\n </Dropdown>\n }\n </td>\n </tr>\n {this.state.isTransferDialogShow && (\n <ModalPortal>\n <TransferDialog\n itemName={repo.repoName}\n submit={this.onTransferRepo}\n toggleDialog={this.toggleTransfer}\n />\n </ModalPortal>\n )}\n </Fragment>\n );\n }\n}\n\nRepoItem.propTypes = propTypes;\n\nexport default OrgLibraries;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, orgMemberQuotaEnabled} from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport MainPanelTopbar from './main-panel-topbar';\n\nclass OrgInfo extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n storage_quota: 0,\n storage_usage: 0,\n member_quota: 0,\n member_usage: 0,\n active_members: 0\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminGetOrgInfo().then(res => {\n this.setState({\n storage_quota: res.data.storage_quota,\n storage_usage: res.data.storage_usage,\n member_quota: res.data.member_quota,\n member_usage: res.data.member_usage,\n active_members: res.data.active_members\n });\n });\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path\">\n <h3 className=\"sf-heading\">{gettext('Info')}</h3>\n </div>\n <div className=\"cur-view-content\">\n <dl>\n <dt>{gettext('Space Used')}</dt>\n\n {(this.state.storage_quota > 0) ? <dd>{Utils.bytesToSize(this.state.storage_usage)} / {Utils.bytesToSize(this.state.storage_quota)}</dd> : <dd>{Utils.bytesToSize(this.state.storage_usage)}</dd>}\n\n {orgMemberQuotaEnabled ? <dt>{gettext('Active Users')} / {gettext('Total Users')} / {gettext('Limits')}</dt> : <dt>{gettext('Active Users')} / {gettext('Total Users')}</dt>}\n\n {orgMemberQuotaEnabled ? <dd>{(this.state.active_members > 0) ? this.state.active_members : '--'} / {(this.state.member_usage > 0) ? this.state.member_usage : '--'} / {(this.state.member_quota > 0) ? this.state.member_quota : '--'}</dd> : <dd>{this.state.active_members > 0 ? this.state.active_members : '--'} / {this.state.member_usage > 0 ? this.state.member_usage : '--'}</dd>}\n\n </dl>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default OrgInfo;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport toaster from '../toast';\nimport copy from '../copy-to-clipboard';\nimport { gettext } from '../../utils/constants';\n\nconst propTypes = {\n currentLinkHref: PropTypes.string.isRequired,\n toggle: PropTypes.func.isRequired,\n};\n\nclass ViewLinkDialog extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n copyToClipBoard = () => {\n copy(this.props.currentLinkHref);\n let message = gettext('Link has been copied to clipboard');\n toaster.success(message), {\n duration: 2\n };\n this.props.toggle();\n }\n\n render() {\n const href = this.props.currentLinkHref;\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Link')}</ModalHeader>\n <ModalBody>\n <p><a target=\"_blank\" href={href}>{href}</a></p>\n </ModalBody>\n <ModalFooter>\n <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>{' '}\n <Button color=\"primary\" onClick={this.copyToClipBoard}>{gettext('Copy')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nViewLinkDialog.propTypes = propTypes;\n\nexport default ViewLinkDialog;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { siteRoot, gettext, serviceURL } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport MainPanelTopbar from './main-panel-topbar';\nimport ViewLinkDialog from '../../components/dialog/view-link-dialog';\n\nclass OrgLinks extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n linkList: null,\n page: 1,\n pageNext: false,\n isItemFreezed: false,\n isShowLinkDialog: false,\n currentLinkHref: '',\n };\n }\n\n listOrgLinks = (page) => {\n seafileAPI.orgAdminListOrgLinks(this.state.page).then(res => {\n const data = res.data;\n this.setState({\n linkList: data.link_list,\n page: data.page,\n pageNext: data.page_next,\n });\n });\n }\n\n onFreezedItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n onUnfreezedItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n onChangePageNum = (event, num) => {\n event.preventDefault();\n let page = this.state.page;\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n this.listOrgLinks(page);\n }\n\n deleteOrgLink = (token) => {\n seafileAPI.orgAdminDeleteOrgLink(token).then(res => {\n if (res.data.success === true) {\n this.listOrgLinks(this.state.page);\n }\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n openLinkDialog = (link) => {\n let href;\n if (link.name.indexOf('/') > -1) {\n href = serviceURL + '/d/' + link.token + '/';\n } else {\n href = serviceURL + '/f/' + link.token + '/';\n }\n this.setState({ currentLinkHref: href });\n this.toggleLinkDialog();\n }\n\n toggleLinkDialog = () => {\n this.setState({isShowLinkDialog: !this.state.isShowLinkDialog});\n }\n\n componentDidMount() {\n this.listOrgLinks(this.state.page);\n }\n\n render() {\n const linkList = this.state.linkList;\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path\">\n <h3 className=\"sf-heading\">{gettext('All Public Links')}</h3>\n </div>\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"50%\">{gettext('Name')}</th>\n <th width=\"15%\">{gettext('Owner')}</th>\n <th width=\"15%\">{gettext('Created At')}</th>\n <th width=\"10%\">{gettext('Count')}</th>\n <th width=\"10%\"></th>\n </tr>\n </thead>\n <tbody>\n {linkList && linkList.map((item, index) => {\n return(\n <React.Fragment key={index}>\n <RepoItem\n link={item}\n isItemFreezed={this.state.isItemFreezed}\n onFreezedItem={this.onFreezedItem}\n onUnfreezedItem={this.onUnfreezedItem}\n deleteOrgLink={this.deleteOrgLink}\n openLinkDialog={this.openLinkDialog}\n />\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n <div className=\"paginator\">\n {this.state.page != 1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(this.state.page != 1 && this.state.pageNext) && <span> | </span>}\n {this.state.pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n </div>\n </div>\n </div>\n {this.state.isShowLinkDialog &&\n <ViewLinkDialog currentLinkHref={this.state.currentLinkHref} toggle={this.toggleLinkDialog}/>\n }\n </Fragment>\n );\n }\n}\n\nconst propTypes = {\n link: PropTypes.object.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n onFreezedItem: PropTypes.func.isRequired,\n onUnfreezedItem: PropTypes.func.isRequired,\n deleteOrgLink: PropTypes.func.isRequired,\n openLinkDialog: PropTypes.func.isRequired,\n};\n\nclass RepoItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false,\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({ showMenu: true, highlight: true });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({ showMenu: false, highlight: false });\n }\n }\n\n onDropdownToggleClick = (e) => {\n e.preventDefault();\n this.toggleOperationMenu(e);\n }\n\n toggleOperationMenu = (e) => {\n e.stopPropagation();\n this.setState(\n {isItemMenuShow: !this.state.isItemMenuShow }, () => {\n if (this.state.isItemMenuShow) {\n this.props.onFreezedItem();\n } else {\n this.setState({\n highlight: false,\n showMenu: false,\n });\n this.props.onUnfreezedItem();\n }\n }\n );\n }\n\n render() {\n const { link, deleteOrgLink } = this.props;\n const href = siteRoot + 'org/useradmin/info/' + encodeURIComponent(link.owner_email) + '/';\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} >\n <td>{link.name}</td>\n <td><a href={href}>{link.owner_name}</a></td>\n <td>{moment(link.created_time).fromNow()}</td>\n <td>{link.view_count}</td>\n <td className=\"cursor-pointer text-center\">\n {this.state.showMenu &&\n <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>\n <DropdownToggle\n tag=\"a\"\n className=\"attr-action-icon fas fa-ellipsis-v\"\n title={gettext('More Operations')}\n data-toggle=\"dropdown\"\n aria-expanded={this.state.isItemMenuShow}\n onClick={this.onDropdownToggleClick}\n />\n <DropdownMenu>\n <DropdownItem onClick={deleteOrgLink.bind(this, link.token)}>{gettext('Delete')}</DropdownItem>\n <DropdownItem onClick={this.props.openLinkDialog.bind(this, link)}>{gettext('View Link')}</DropdownItem>\n </DropdownMenu>\n </Dropdown>\n }\n </td>\n </tr>\n );\n }\n}\n\nRepoItem.propTypes = propTypes;\n\nexport default OrgLinks;\n","import React from 'react';\nimport '../../css/org-department-item.css';\n\nclass OrgDepartments extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n <div className=\"h-100 org-departments\">\n {this.props.children}\n </div>\n );\n }\n}\n\nexport default OrgDepartments;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Form, FormGroup, Label } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\n\nconst propTypes = {\n groupID: PropTypes.string,\n parentGroupID: PropTypes.string,\n toggle: PropTypes.func.isRequired,\n onDepartChanged: PropTypes.func.isRequired,\n};\n\nclass AddDepartDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n departName: '',\n errMessage: '',\n };\n this.newInput = React.createRef();\n }\n\n componentDidMount() {\n this.newInput.focus();\n this.newInput.setSelectionRange(0, 0);\n }\n\n handleSubmit = () => {\n let isValid = this.validateName();\n if (isValid) {\n let parentGroup = -1;\n if (this.props.parentGroupID) {\n parentGroup = this.props.parentGroupID;\n }\n seafileAPI.orgAdminAddDepartGroup(orgID, parentGroup, this.state.departName.trim()).then((res) => {\n this.props.toggle();\n this.props.onDepartChanged();\n }).catch(error => {\n let errorMsg = gettext(error.response.data.error_msg);\n this.setState({ errMessage: errorMsg });\n });\n }\n }\n\n validateName = () => {\n let errMessage = '';\n const name = this.state.departName.trim();\n if (!name.length) {\n errMessage = gettext('Name is required');\n this.setState({ errMessage: errMessage });\n return false;\n }\n return true;\n }\n\n handleChange = (e) => {\n this.setState({\n departName: e.target.value,\n });\n }\n\n handleKeyPress = (e) => {\n if (e.key === 'Enter') {\n this.handleSubmit();\n e.preventDefault();\n }\n }\n\n render() {\n let header = this.props.parentGroupID ? gettext('New Sub-department') : gettext('New Department');\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{header}</ModalHeader>\n <ModalBody>\n <Form>\n <FormGroup>\n <Label for=\"departName\">{gettext('Name')}</Label>\n <Input\n id=\"departName\"\n onKeyPress={this.handleKeyPress}\n value={this.state.departName}\n onChange={this.handleChange}\n innerRef={input => {this.newInput = input;}}\n />\n </FormGroup>\n </Form>\n { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nAddDepartDialog.propTypes = propTypes;\n\nexport default AddDepartDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\n\nconst propTypes = {\n groupName: PropTypes.string,\n groupID: PropTypes.number.isRequired,\n toggle: PropTypes.func.isRequired,\n onDepartChanged: PropTypes.func.isRequired\n};\n\nclass DeleteDepartDialog extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n deleteDepart = () => {\n this.props.toggle();\n seafileAPI.orgAdminDeleteDepartGroup(orgID, this.props.groupID).then((res) => {\n this.props.onDepartChanged();\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n let subtitle = gettext('Are you sure you want to delete {placeholder} ?');\n subtitle = subtitle.replace('{placeholder}', '<span class=\"op-target\">' + Utils.HTMLescape(this.props.groupName) + '</span>');\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Delete Department')}</ModalHeader>\n <ModalBody>\n <p dangerouslySetInnerHTML={{__html: subtitle}}></p>\n </ModalBody>\n <ModalFooter>\n <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n <Button color=\"primary\" onClick={this.deleteDepart}>{gettext('Delete')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nDeleteDepartDialog.propTypes = propTypes;\n\nexport default DeleteDepartDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, InputGroupAddon, InputGroup } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\n\nconst propTypes = {\n toggle: PropTypes.func.isRequired,\n groupID: PropTypes.number.isRequired,\n onDepartChanged: PropTypes.func.isRequired,\n};\n\nclass SetGroupQuotaDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n quota: '',\n errMessage: '',\n };\n this.newInput = React.createRef();\n }\n\n componentDidMount() {\n this.newInput.focus();\n this.newInput.setSelectionRange(0, 0);\n }\n\n setGroupQuota = () => {\n const myReg = /^[1-9]\\d*$/im;\n let quota = this.state.quota;\n if ((quota.length && myReg.test(quota)) || quota == -2) {\n this.setState({ errMessage: '' });\n let newQuota = this.state.quota == -2 ? this.state.quota : this.state.quota * 1000000;\n seafileAPI.orgAdminSetGroupQuota(orgID, this.props.groupID, newQuota).then((res) => {\n this.props.toggle();\n this.props.onDepartChanged();\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n } else {\n const err = gettext('Quota is invalid.');\n this.setState({ errMessage: err });\n }\n }\n\n handleChange = (e) => {\n const quota = e.target.value.trim();\n this.setState({ quota: quota });\n }\n\n handleKeyPress = (e) => {\n if (e.key === 'Enter') {\n this.setGroupQuota();\n e.preventDefault();\n }\n }\n\n render() {\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Set Quota')}</ModalHeader>\n <ModalBody>\n <InputGroup>\n <Input\n onKeyPress={this.handleKeyPress}\n value={this.state.quota}\n onChange={this.handleChange}\n innerRef={input => {this.newInput = input;}}\n />\n <InputGroupAddon addonType=\"append\">{'MB'}</InputGroupAddon>\n </InputGroup>\n <p className=\"tip\">\n <br/><span>{gettext('An integer that is greater than 0 or equal to -2.')}</span><br/>\n <span>{gettext('Tip: -2 means no limit.')}</span>\n </p>\n { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.setGroupQuota}>{gettext('Submit')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nSetGroupQuotaDialog.propTypes = propTypes;\n\nexport default SetGroupQuotaDialog;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Link } from '@reach/router';\nimport { Utils } from '../../utils/utils.js';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport MainPanelTopbar from './main-panel-topbar';\nimport ModalPortal from '../../components/modal-portal';\nimport AddDepartDialog from '../../components/dialog/org-add-department-dialog';\nimport DeleteDepartDialog from '../../components/dialog/org-delete-department-dialog';\nimport SetGroupQuotaDialog from '../../components/dialog/org-set-group-quota-dialog';\nimport { siteRoot, gettext, orgID, lang } from '../../utils/constants';\nimport '../../css/org-department-item.css';\n\nmoment.locale(lang);\n\nclass OrgDepartmentsList extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n groups: null,\n groupID: '',\n groupName: '',\n showDeleteDepartDialog: false,\n showSetGroupQuotaDialog: false,\n isShowAddDepartDialog: false,\n };\n }\n\n componentDidMount() {\n this.listDepartGroups();\n }\n\n listDepartGroups = () => {\n seafileAPI.orgAdminListDepartGroups(orgID).then(res => {\n this.setState({ groups: res.data.data });\n });\n }\n\n showDeleteDepartDialog = (group) => {\n this.setState({ showDeleteDepartDialog: true, groupID: group.id, groupName: group.name });\n }\n\n showSetGroupQuotaDialog = (groupID) => {\n this.setState({ showSetGroupQuotaDialog: true, groupID: groupID });\n }\n\n toggleAddDepartDialog = () => {\n this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog});\n }\n\n toggleCancel = () => {\n this.setState({\n showDeleteDepartDialog: false,\n showSetGroupQuotaDialog: false,\n });\n }\n\n onDepartChanged = () => {\n this.listDepartGroups();\n }\n\n render() {\n const groups = this.state.groups;\n const topbarChildren = (\n <Fragment>\n <button className='btn btn-secondary operation-item' title={gettext('New Department')} onClick={this.toggleAddDepartDialog}>{gettext('New Department')}\n </button>\n {this.state.isShowAddDepartDialog && (\n <ModalPortal>\n <AddDepartDialog\n onDepartChanged={this.onDepartChanged}\n groupID={this.state.groupID}\n toggle={this.toggleAddDepartDialog}\n />\n </ModalPortal>\n )}\n </Fragment>\n );\n return (\n <Fragment>\n <MainPanelTopbar children={topbarChildren}/>\n <div className=\"main-panel-center flex-row h-100\">\n <div className=\"cur-view-container o-auto\">\n <div className=\"cur-view-path\">\n <div className=\"fleft\">\n <h3 className=\"sf-heading\">{gettext('Departments')}</h3>\n </div>\n </div>\n <div className=\"cur-view-content\">\n {groups && groups.length > 0 ?\n <table>\n <thead>\n <tr>\n <th width=\"40%\">{gettext('Name')}</th>\n <th width=\"25%\">{gettext('Created At')}</th>\n <th width=\"20%\">{gettext('Quota')}</th>\n <th width=\"15%\"></th>\n </tr>\n </thead>\n <tbody>\n {groups.map((group, index) => {\n return(\n <React.Fragment key={group.id}>\n <GroupItem\n group={group}\n showDeleteDepartDialog={this.showDeleteDepartDialog}\n showSetGroupQuotaDialog={this.showSetGroupQuotaDialog}\n />\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n :\n <p className=\"no-group\">{gettext('No departments')}</p>\n }\n </div>\n <React.Fragment>\n {this.state.showDeleteDepartDialog && (\n <ModalPortal>\n <DeleteDepartDialog\n toggle={this.toggleCancel}\n groupID={this.state.groupID}\n groupName={this.state.groupName}\n onDepartChanged={this.onDepartChanged}\n />\n </ModalPortal>\n )}\n {this.state.showSetGroupQuotaDialog && (\n <ModalPortal>\n <SetGroupQuotaDialog\n toggle={this.toggleCancel}\n groupID={this.state.groupID}\n onDepartChanged={this.onDepartChanged}\n />\n </ModalPortal>\n )}\n </React.Fragment>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nclass GroupItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n };\n }\n\n onMouseEnter = () => {\n this.setState({ highlight: true });\n }\n\n onMouseLeave = () => {\n this.setState({ highlight: false });\n }\n\n render() {\n const group = this.props.group;\n const highlight = this.state.highlight;\n const newHref = siteRoot+ 'org/departmentadmin/groups/' + group.id + '/';\n return (\n <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td><Link to={newHref}>{group.name}</Link></td>\n <td>{moment(group.created_at).fromNow()}</td>\n <td onClick={this.props.showSetGroupQuotaDialog.bind(this, group.id)}>\n {Utils.bytesToSize(group.quota)}{' '}\n <span title=\"Edit Quota\" className={`fa fa-pencil-alt attr-action-icon ${highlight ? '' : 'vh'}`}></span>\n </td>\n <td className=\"cursor-pointer text-center\" onClick={this.props.showDeleteDepartDialog.bind(this, group)}>\n <span className={`sf2-icon-delete action-icon ${highlight ? '' : 'vh'}`} title=\"Delete\"></span>\n </td>\n </tr>\n );\n }\n}\n\nconst GroupItemPropTypes = {\n group: PropTypes.object.isRequired,\n showSetGroupQuotaDialog: PropTypes.func.isRequired,\n showDeleteDepartDialog: PropTypes.func.isRequired,\n};\n\nGroupItem.propTypes = GroupItemPropTypes;\n\nexport default OrgDepartmentsList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\nimport UserSelect from '../user-select.js';\n\nconst propTypes = {\n toggle: PropTypes.func.isRequired,\n groupID: PropTypes.string.isRequired,\n onMemberChanged: PropTypes.func.isRequired\n};\n\nclass AddMemberDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n selectedOption: null,\n errMessage: '',\n };\n this.Options = [];\n }\n\n handleSelectChange = (option) => {\n this.setState({ selectedOption: option });\n this.Options = [];\n }\n\n handleSubmit = () => {\n if (!this.state.selectedOption) return;\n const email = this.state.selectedOption.email;\n this.refs.orgSelect.clearSelect();\n this.setState({ errMessage: [] });\n seafileAPI.orgAdminAddGroupMember(orgID, this.props.groupID, email).then((res) => {\n this.setState({ selectedOption: null });\n if (res.data.failed.length > 0) {\n this.setState({ errMessage: res.data.failed[0].error_msg });\n }\n if (res.data.success.length > 0) {\n this.props.onMemberChanged();\n this.props.toggle();\n }\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Add Member')}</ModalHeader>\n <ModalBody>\n <UserSelect\n placeholder={gettext('Search users...')}\n onSelectChange={this.handleSelectChange}\n ref=\"orgSelect\"\n isMulti={false}\n className='org-add-member-select'\n />\n { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nAddMemberDialog.propTypes = propTypes;\n\nexport default AddMemberDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\n\nconst propTypes = {\n member: PropTypes.object.isRequired,\n groupID: PropTypes.string.isRequired,\n toggle: PropTypes.func.isRequired,\n onMemberChanged: PropTypes.func.isRequired\n};\n\nclass DeleteMemberDialog extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n deleteMember = () => {\n const userEmail = this.props.member.email;\n seafileAPI.orgAdminDeleteGroupMember(orgID, this.props.groupID, userEmail).then((res) => {\n if (res.data.success) {\n this.props.onMemberChanged();\n this.props.toggle();\n }\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n let subtitle = gettext('Are you sure you want to delete {placeholder} ?');\n subtitle = subtitle.replace('{placeholder}', '<span class=\"op-target\">' + Utils.HTMLescape(this.props.member.name) + '</span>');\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Delete Member')}</ModalHeader>\n <ModalBody>\n <div dangerouslySetInnerHTML={{__html: subtitle}}></div>\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.deleteMember}>{gettext('Delete')}</Button>\n <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nDeleteMemberDialog.propTypes = propTypes;\n\nexport default DeleteMemberDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Form, FormGroup, Label } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n toggle: PropTypes.func.isRequired,\n groupID: PropTypes.string.isRequired,\n onRepoChanged: PropTypes.func.isRequired,\n};\n\nclass AddRepoDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n repoName: '',\n errMessage: '',\n };\n this.newInput = React.createRef();\n }\n\n componentDidMount() {\n this.newInput.focus();\n this.newInput.setSelectionRange(0, 0);\n }\n\n handleSubmit = () => {\n let isValid = this.validateName();\n if (isValid) {\n seafileAPI.orgAdminAddDepartmentRepo(orgID, this.props.groupID, this.state.repoName.trim()).then((res) => {\n this.props.toggle();\n this.props.onRepoChanged();\n }).catch(error => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({ errMessage: errorMsg });\n });\n }\n }\n\n validateName = () => {\n let errMessage = '';\n const name = this.state.repoName.trim();\n if (!name.length) {\n errMessage = gettext('Name is required');\n this.setState({ errMessage: errMessage });\n return false;\n }\n return true;\n }\n\n handleChange = (e) => {\n this.setState({\n repoName: e.target.value,\n });\n }\n\n handleKeyPress = (e) => {\n if (e.key === 'Enter') {\n this.handleSubmit();\n e.preventDefault();\n }\n }\n\n render() {\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('New Library')}</ModalHeader>\n <ModalBody>\n <Form>\n <FormGroup>\n <Label for=\"repoName\">{gettext('Name')}</Label>\n <Input\n id=\"repoName\"\n onKeyPress={this.handleKeyPress}\n value={this.state.repoName}\n onChange={this.handleChange}\n innerRef={input => {this.newInput = input;}}\n />\n </FormGroup>\n </Form>\n { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nAddRepoDialog.propTypes = propTypes;\n\nexport default AddRepoDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext, orgID } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\n\nclass DeleteRepoDialog extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n deleteRepo = () => {\n seafileAPI.orgAdminDeleteDepartmentRepo(orgID, this.props.groupID, this.props.repo.repo_id).then((res) => {\n if (res.data.success) {\n this.props.onRepoChanged();\n this.props.toggle();\n }\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n let subtitle = gettext('Are you sure you want to delete {placeholder} ?');\n subtitle = subtitle.replace('{placeholder}', '<span class=\"op-target\">' + Utils.HTMLescape(this.props.repo.name) + '</span>');\n return (\n <Modal isOpen={true} toggle={this.props.toggle}>\n <ModalHeader toggle={this.props.toggle}>{gettext('Delete Library')}</ModalHeader>\n <ModalBody>\n <div dangerouslySetInnerHTML={{__html: subtitle}}></div>\n </ModalBody>\n <ModalFooter>\n <Button color=\"primary\" onClick={this.deleteRepo}>{gettext('Delete')}</Button>\n <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n </ModalFooter>\n </Modal>\n );\n }\n}\n\nconst propTypes = {\n repo: PropTypes.object.isRequired,\n toggle: PropTypes.func.isRequired,\n groupID: PropTypes.string.isRequired,\n onRepoChanged: PropTypes.func.isRequired\n};\n\nDeleteRepoDialog.propTypes = propTypes;\n\nexport default DeleteRepoDialog;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Link } from '@reach/router';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils.js';\nimport toaster from '../../components/toast';\nimport MainPanelTopbar from './main-panel-topbar';\nimport ModalPortal from '../../components/modal-portal';\nimport RoleEditor from '../../components/select-editor/role-editor';\nimport AddDepartDialog from '../../components/dialog/org-add-department-dialog';\nimport AddMemberDialog from '../../components/dialog/org-add-member-dialog';\nimport DeleteMemberDialog from '../../components/dialog/org-delete-member-dialog';\nimport AddRepoDialog from '../../components/dialog/org-add-repo-dialog';\nimport DeleteRepoDialog from '../../components/dialog/org-delete-repo-dialog';\nimport DeleteDepartDialog from '../../components/dialog/org-delete-department-dialog';\nimport SetGroupQuotaDialog from '../../components/dialog/org-set-group-quota-dialog';\nimport { serviceURL, siteRoot, gettext, orgID, lang } from '../../utils/constants';\nimport '../../css/org-department-item.css';\n\nmoment.locale(lang);\n\nclass OrgDepartmentItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n groupName: '',\n isItemFreezed: false,\n ancestorGroups: [],\n members: [],\n deletedMember: {},\n isShowAddMemberDialog: false,\n showDeleteMemberDialog: false,\n repos: [],\n deletedRepo: {},\n isShowAddRepoDialog: false,\n showDeleteRepoDialog: false,\n groups: [],\n subGroupID: '',\n subGroupName: '',\n isShowAddDepartDialog: false,\n showDeleteDepartDialog: false,\n showSetGroupQuotaDialog: false,\n };\n }\n\n componentDidMount() {\n const groupID = this.props.groupID;\n this.listOrgGroupRepo(groupID);\n this.listOrgMembers(groupID);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.groupID !== nextProps.groupID) {\n this.listOrgGroupRepo(nextProps.groupID);\n this.listOrgMembers(nextProps.groupID);\n }\n }\n\n listOrgGroupRepo = (groupID) => {\n seafileAPI.orgAdminListGroupRepos(orgID, groupID).then(res => {\n this.setState({ repos: res.data.libraries });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n listOrgMembers = (groupID) => {\n seafileAPI.orgAdminListGroupInfo(orgID, groupID, true).then(res => {\n this.setState({\n members: res.data.members,\n groups: res.data.groups,\n ancestorGroups: res.data.ancestor_groups,\n groupName: res.data.name,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n listSubDepartGroups = (groupID) => {\n seafileAPI.orgAdminListGroupInfo(orgID, groupID, true).then(res => {\n this.setState({ groups: res.data.groups });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n toggleCancel = () => {\n this.setState({\n showDeleteMemberDialog: false,\n showDeleteRepoDialog: false,\n showDeleteDepartDialog: false,\n showSetGroupQuotaDialog: false,\n });\n }\n\n onSubDepartChanged = () => {\n this.listSubDepartGroups(this.props.groupID);\n }\n\n onRepoChanged = () => {\n this.listOrgGroupRepo(this.props.groupID);\n }\n\n onMemberChanged = () => {\n this.listOrgMembers(this.props.groupID);\n }\n\n toggleItemFreezed = (isFreezed) => {\n this.setState({ isItemFreezed: isFreezed });\n }\n\n showDeleteMemberDialog = (member) => {\n this.setState({ showDeleteMemberDialog: true, deletedMember: member });\n }\n\n showDeleteRepoDialog = (repo) => {\n this.setState({ showDeleteRepoDialog: true, deletedRepo: repo });\n }\n\n toggleAddRepoDialog = () => {\n this.setState({ isShowAddRepoDialog: !this.state.isShowAddRepoDialog });\n }\n\n toggleAddMemberDialog = () => {\n this.setState({ isShowAddMemberDialog: !this.state.isShowAddMemberDialog });\n }\n\n toggleAddDepartDialog = () => {\n this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog});\n }\n\n showDeleteDepartDialog = (subGroup) => {\n this.setState({\n showDeleteDepartDialog: true,\n subGroupID: subGroup.id,\n subGroupName: subGroup.name\n });\n }\n\n showSetGroupQuotaDialog = (subGroupID) => {\n this.setState({\n showSetGroupQuotaDialog: true,\n subGroupID: subGroupID\n });\n }\n\n render() {\n const { members, repos, groups } = this.state;\n const groupID = this.props.groupID;\n const topBtn = 'btn btn-secondary operation-item';\n const topbarChildren = (\n <Fragment>\n {groupID &&\n <button className={topBtn} title={gettext('New Sub-department')} onClick={this.toggleAddDepartDialog}>{gettext('New Sub-department')}</button>\n }\n {groupID &&\n <button className={topBtn} title={gettext('Add Member')} onClick={this.toggleAddMemberDialog}>{gettext('Add Member')}</button>\n }\n {groupID &&\n <button className={topBtn} onClick={this.toggleAddRepoDialog} title={gettext('New Library')}>{gettext('New Library')}</button>\n }\n {this.state.isShowAddMemberDialog && (\n <ModalPortal>\n <AddMemberDialog\n toggle={this.toggleAddMemberDialog}\n onMemberChanged={this.onMemberChanged}\n groupID={groupID}\n />\n </ModalPortal>\n )}\n {this.state.isShowAddRepoDialog && (\n <ModalPortal>\n <AddRepoDialog\n toggle={this.toggleAddRepoDialog}\n onRepoChanged={this.onRepoChanged}\n groupID={groupID}\n />\n </ModalPortal>\n )}\n {this.state.isShowAddDepartDialog && (\n <ModalPortal>\n <AddDepartDialog\n onDepartChanged={this.onSubDepartChanged}\n parentGroupID={groupID}\n toggle={this.toggleAddDepartDialog}\n />\n </ModalPortal>\n )}\n </Fragment>\n );\n\n return (\n <Fragment>\n <MainPanelTopbar children={topbarChildren} />\n <div className=\"main-panel-center flex-row h-100\">\n <div className=\"cur-view-container o-auto\">\n <div className=\"cur-view-path\">\n <div className=\"fleft\">\n <h3 className=\"sf-heading\">\n {groupID ?\n <Link to={siteRoot + 'org/departmentadmin/'}>{gettext('Departments')}</Link>\n : <span>{gettext('Departments')}</span>\n }\n {this.state.ancestorGroups.map(ancestor => {\n let newHref = siteRoot + 'org/departmentadmin/groups/' + ancestor.id + '/';\n return <span key={ancestor.id}>{' / '}<Link to={newHref}>{ancestor.name}</Link></span>;\n })}\n {groupID && <span>{' / '}{this.state.groupName}</span>}\n </h3>\n </div>\n </div>\n\n <div className=\"cur-view-subcontainer org-groups\">\n <div className=\"cur-view-path\">\n <div className=\"fleft\"><h3 className=\"sf-heading\">{gettext('Sub-departments')}</h3></div>\n </div>\n <div className=\"cur-view-content\">\n {groups && groups.length > 0 ?\n <table>\n <thead>\n <tr>\n <th width=\"40%\">{gettext('Name')}</th>\n <th width=\"25%\">{gettext('Created At')}</th>\n <th width=\"20%\">{gettext('Quota')}</th>\n <th width=\"15%\"></th>\n </tr>\n </thead>\n <tbody>\n {groups.map((group, index) => {\n return(\n <React.Fragment key={group.id}>\n <GroupItem\n group={group}\n showDeleteDepartDialog={this.showDeleteDepartDialog}\n showSetGroupQuotaDialog={this.showSetGroupQuotaDialog}\n />\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n : <p className=\"no-group\">{gettext('No sub-departments')}</p>\n }\n </div>\n </div>\n\n <div className=\"cur-view-subcontainer org-members\">\n <div className=\"cur-view-path\">\n <div className=\"fleft\"><h3 className=\"sf-heading\">{gettext('Members')}</h3></div>\n </div>\n <div className=\"cur-view-content\">\n {(!members || members.length === 0) ?\n <p className=\"no-member\">{gettext('No members')}</p> :\n <table>\n <thead>\n <tr>\n <th width=\"5%\"></th>\n <th width=\"50%\">{gettext('Name')}</th>\n <th width=\"15%\">{gettext('Role')}</th>\n <th width=\"30%\"></th>\n </tr>\n </thead>\n <tbody>\n {members.map((member, index) => {\n return (\n <React.Fragment key={index}>\n <MemberItem\n member={member}\n showDeleteMemberDialog={this.showDeleteMemberDialog}\n isItemFreezed={this.state.isItemFreezed}\n onMemberChanged={this.onMemberChanged}\n toggleItemFreezed={this.toggleItemFreezed}\n groupID={groupID}\n />\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n }\n </div>\n </div>\n\n <div className=\"cur-view-subcontainer org-libriries\">\n <div className=\"cur-view-path\">\n <div className=\"fleft\"><h3 className=\"sf-heading\">{gettext('Libraries')}</h3></div>\n </div>\n { repos.length > 0 ?\n <div className=\"cur-view-content\">\n <table>\n <thead>\n <tr>\n <th width=\"5%\"></th>\n <th width=\"50%\">{gettext('Name')}</th>\n <th width=\"30%\">{gettext('Size')}</th>\n <th width=\"15%\"></th>\n </tr>\n </thead>\n <tbody>\n {repos.map((repo, index) => {\n return(\n <React.Fragment key={index}>\n <RepoItem repo={repo} showDeleteRepoDialog={this.showDeleteRepoDialog}/>\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n </div>\n : <p className=\"no-libraty\">{gettext('No libraries')}</p>\n }\n </div>\n\n </div>\n <React.Fragment>\n {this.state.showDeleteMemberDialog && (\n <ModalPortal>\n <DeleteMemberDialog\n toggle={this.toggleCancel}\n onMemberChanged={this.onMemberChanged}\n member={this.state.deletedMember}\n groupID={groupID}\n />\n </ModalPortal>\n )}\n {this.state.showDeleteRepoDialog && (\n <ModalPortal>\n <DeleteRepoDialog\n toggle={this.toggleCancel}\n onRepoChanged={this.onRepoChanged}\n repo={this.state.deletedRepo}\n groupID={groupID}\n />\n </ModalPortal>\n )}\n {this.state.showDeleteDepartDialog && (\n <ModalPortal>\n <DeleteDepartDialog\n toggle={this.toggleCancel}\n groupID={this.state.subGroupID}\n groupName={this.state.subGroupName}\n onDepartChanged={this.onSubDepartChanged}\n />\n </ModalPortal>\n )}\n {this.state.showSetGroupQuotaDialog && (\n <ModalPortal>\n <SetGroupQuotaDialog\n toggle={this.toggleCancel}\n groupID={this.state.subGroupID}\n onDepartChanged={this.onSubDepartChanged}\n />\n </ModalPortal>\n )}\n </React.Fragment>\n </div>\n </Fragment>\n );\n }\n}\n\nclass MemberItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showRoleMenu: false,\n };\n this.roles = ['Admin', 'Member'];\n }\n\n onMouseEnter = () => {\n if (this.props.isItemFreezed) return;\n this.setState({ highlight: true });\n }\n\n onMouseLeave = () => {\n if (this.props.isItemFreezed) return;\n this.setState({ highlight: false });\n }\n\n toggleMemberRoleMenu = () => {\n this.setState({ showRoleMenu: !this.state.showRoleMenu });\n }\n\n onChangeUserRole = (role) => {\n let isAdmin = role === 'Admin' ? true : false;\n seafileAPI.orgAdminSetGroupMemberRole(orgID, this.props.groupID, this.props.member.email, isAdmin).then((res) => {\n this.props.onMemberChanged();\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n this.setState({\n highlight: false,\n });\n }\n\n render() {\n const member = this.props.member;\n const highlight = this.state.highlight;\n let memberLink = serviceURL + '/org/useradmin/info/' + member.email + '/';\n if (member.role === 'Owner') return null;\n return (\n <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td><img src={member.avatar_url} alt=\"member-header\" width=\"24\" className=\"avatar\"/></td>\n <td><a href={memberLink}>{member.name}</a></td>\n <td>\n <RoleEditor\n isTextMode={true}\n isEditIconShow={highlight}\n currentRole={member.role}\n roles={this.roles}\n onRoleChanged={this.onChangeUserRole}\n toggleItemFreezed={this.props.toggleItemFreezed}\n />\n </td>\n {!this.props.isItemFreezed ?\n <td className=\"cursor-pointer text-center\" onClick={this.props.showDeleteMemberDialog.bind(this, member)}>\n <span className={`sf2-icon-x3 action-icon ${highlight ? '' : 'vh'}`} title=\"Delete\"></span>\n </td> : <td></td>\n }\n </tr>\n );\n }\n}\n\nconst MemberItemPropTypes = {\n groupID: PropTypes.string.isRequired,\n member: PropTypes.object.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n onMemberChanged: PropTypes.func.isRequired,\n showDeleteMemberDialog: PropTypes.func.isRequired,\n toggleItemFreezed: PropTypes.func.isRequired,\n};\n\nMemberItem.propTypes = MemberItemPropTypes;\n\nclass RepoItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n };\n }\n\n onMouseEnter = () => {\n this.setState({ highlight: true });\n }\n\n onMouseLeave = () => {\n this.setState({ highlight: false });\n }\n\n render() {\n const repo = this.props.repo;\n const highlight = this.state.highlight;\n let iconUrl = Utils.getLibIconUrl(repo);\n return (\n <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td><img src={iconUrl} width=\"24\" alt={gettext('icon')}/></td>\n <td>{repo.name}</td>\n <td>{Utils.bytesToSize(repo.size)}{' '}</td>\n <td className=\"cursor-pointer text-center\" onClick={this.props.showDeleteRepoDialog.bind(this, repo)}>\n <span className={`sf2-icon-delete action-icon ${highlight ? '' : 'vh'}`} title=\"Delete\"></span>\n </td>\n </tr>\n );\n }\n}\n\nconst RepoItemPropTypes = {\n repo: PropTypes.object.isRequired,\n showDeleteRepoDialog: PropTypes.func.isRequired,\n};\n\nRepoItem.propTypes = RepoItemPropTypes;\n\nclass GroupItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n };\n }\n\n onMouseEnter = () => {\n this.setState({ highlight: true });\n }\n\n onMouseLeave = () => {\n this.setState({ highlight: false });\n }\n\n render() {\n const group = this.props.group;\n const highlight = this.state.highlight;\n const newHref = siteRoot+ 'org/departmentadmin/groups/' + group.id + '/';\n return (\n <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td><Link to={newHref}>{group.name}</Link></td>\n <td>{moment(group.created_at).fromNow()}</td>\n <td onClick={this.props.showSetGroupQuotaDialog.bind(this, group.id)}>\n {Utils.bytesToSize(group.quota)}{' '}\n <span title=\"Edit Quota\" className={`fa fa-pencil-alt attr-action-icon ${highlight ? '' : 'vh'}`}></span>\n </td>\n <td className=\"cursor-pointer text-center\" onClick={this.props.showDeleteDepartDialog.bind(this, group)}>\n <span className={`sf2-icon-delete action-icon ${highlight ? '' : 'vh'}`} title=\"Delete\"></span>\n </td>\n </tr>\n );\n }\n}\n\nconst GroupItemPropTypes = {\n group: PropTypes.object.isRequired,\n groupID: PropTypes.string,\n showSetGroupQuotaDialog: PropTypes.func.isRequired,\n showDeleteDepartDialog: PropTypes.func.isRequired,\n isSubdepartChanged: PropTypes.bool,\n};\n\nGroupItem.propTypes = GroupItemPropTypes;\n\n\nconst OrgDepartmentItemPropTypes = {\n groupID: PropTypes.string,\n};\n\nOrgDepartmentItem.propTypes = OrgDepartmentItemPropTypes;\n\nexport default OrgDepartmentItem;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../utils/constants';\nimport MainPanelTopbar from './main-panel-topbar';\n\nclass OrgLogs extends Component {\n\n constructor(props) {\n super(props);\n }\n\n tabItemClick = (param) => {\n this.props.tabItemClick(param);\n }\n\n render() {\n return (\n <Fragment>\n <MainPanelTopbar/>\n <div className=\"main-panel-center flex-row\">\n <div className=\"cur-view-container\">\n <div className=\"cur-view-path org-user-nav\">\n <ul className=\"nav\">\n <li className=\"nav-item\" onClick={() => this.tabItemClick('logadmin')}>\n <Link\n className={`nav-link ${this.props.currentTab === 'logadmin' ? 'active': ''}`}\n to={siteRoot + 'org/logadmin/'} title={gettext('File Access')}>{gettext('File Access')}\n </Link>\n </li>\n <li className=\"nav-item\" onClick={() => this.tabItemClick('file-update')}>\n <Link\n className={`nav-link ${this.props.currentTab === 'file-update' ? 'active': ''}`}\n to={siteRoot + 'org/logadmin/file-update/'} title={gettext('File Update')}>{gettext('File Update')}\n </Link>\n </li>\n <li className=\"nav-item\" onClick={() => this.tabItemClick('perm-audit')}>\n <Link\n className={`nav-link ${this.props.currentTab === 'perm-audit' ? 'active': ''}`}\n to={siteRoot + 'org/logadmin/perm-audit/'} title={gettext('Permission')}>{gettext('Permission')}\n </Link>\n </li>\n </ul>\n </div>\n {this.props.children}\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nconst propTypes = {\n currentTab: PropTypes.string.isRequired,\n tabItemClick: PropTypes.func.isRequired,\n};\n\nOrgLogs.propTypes = propTypes;\n\nexport default OrgLogs;\n","import { lang } from '../utils/constants';\nimport moment from 'moment';\n\nmoment.locale(lang);\n\nclass OrgLogsFileAuditEvent {\n constructor(object) {\n this.ip = object.ip;\n this.type = object.type;\n this.device = object.device;\n this.repo_id = object.repo_id;\n this.repo_name = object.repo_name;\n this.file_name = object.file_name;\n this.file_path = object.file_path;\n this.user_name = object.user_name;\n this.user_email = object.user_email;\n this.user_contact_email = object.user_contact_email;\n this.time = moment(object.time).format('YYYY-MM-DD HH:mm:ss');\n }\n}\n\nexport default OrgLogsFileAuditEvent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { siteRoot, gettext, lang } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport OrgLogsFileAuditEvent from '../../models/org-logs-file-audit';\nimport '../../css/org-logs.css';\n\nmoment.locale(lang);\n\nclass OrgLogsFileAudit extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n page: 1,\n pageNext: false,\n eventList: [],\n userSelected: '',\n repoSelected: '',\n isItemFreezed: false\n };\n }\n\n componentDidMount() {\n let page = this.state.page;\n let email = this.state.userSelected;\n let repoID = this.state.repoSelected;\n this.initData(email, repoID, page);\n }\n\n initData = (email, repoID, page) => {\n seafileAPI.orgAdminListFileAudit(email, repoID, page).then(res => {\n let eventList = res.data.log_list.map(item => {\n return new OrgLogsFileAuditEvent(item);\n });\n\n this.setState({\n eventList: eventList,\n pageNext: res.data.page_next,\n page: res.data.page,\n userSelected: res.data.user_selected,\n repoSelected: res.data.repo_selected\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n\n onChangePageNum = (e, num) => {\n e.preventDefault();\n let page = this.state.page;\n\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n let email = this.state.userSelected;\n let repoID = this.state.repoSelected;\n this.initData(email, repoID, page);\n }\n\n filterUser = (userSelected) => {\n this.setState({ userSelected: userSelected });\n }\n\n filterRepo = (repoSelected) => {\n this.setState({ repoSelected: repoSelected });\n }\n\n render() {\n let eventList = this.state.eventList;\n return (\n <div className=\"cur-view-content\">\n {\n (this.state.userSelected || this.state.repoSelected) &&\n <React.Fragment>\n {this.state.userSelected &&\n <span className=\"audit-unselect-item\" onClick={this.filterUser.bind(this, null)}>\n <span className=\"no-deco\">{this.state.userSelected}</span>{' ✖'}\n </span>\n }\n {this.state.repoSelected &&\n <span className=\"audit-unselect-item\" onClick={this.filterRepo.bind(this, null)}>\n <span className=\"no-deco\">{this.state.repoSelected}</span>{' ✖'}\n </span>\n }\n </React.Fragment>\n }\n <table>\n <thead>\n <tr>\n <th width=\"24%\">{gettext('User')}</th>\n <th width=\"10%\">{gettext('Type')}</th>\n <th width=\"13%\">{gettext('IP')}</th>\n <th width=\"17%\">{gettext('Date')}</th>\n <th width=\"18%\">{gettext('Library')}</th>\n <th width=\"18%\">{gettext('File')}</th>\n </tr>\n </thead>\n <tbody>\n {eventList.map((item, index) => {\n return (\n <FileAuditItem\n key={index}\n fileEvent={item}\n isItemFreezed={this.state.isItemFreezed}\n filterUser={this.filterUser}\n filterRepo={this.filterRepo}\n userSelected={this.state.userSelected}\n repoSelected={this.state.repoSelected}\n />\n );\n })}\n </tbody>\n </table>\n <div className=\"paginator\">\n {this.state.page != 1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(this.state.page != 1 && this.state.pageNext) && <span> | </span>}\n {this.state.pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n </div>\n );\n }\n}\n\nconst propTypes = {\n filterUser: PropTypes.func.isRequired,\n filterRepo: PropTypes.func.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n fileEvent: PropTypes.object.isRequired,\n userSelected: PropTypes.string,\n repoSelected: PropTypes.string,\n};\n\nclass FileAuditItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false,\n userDropdownOpen: false,\n repoDropdownOpen: false,\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n toggleUserDropdown = () => {\n this.setState({ userDropdownOpen: !this.state.userDropdownOpen });\n }\n\n renderUser = (fileEvent) => {\n if (!fileEvent.user_email) {\n return gettext('Anonymous User');\n }\n\n return (\n <span>\n <a href={siteRoot + 'org/useradmin/info/' + fileEvent.user_email + '/'}>{fileEvent.user_name}</a>{' '}\n <Dropdown size='sm' isOpen={this.state.userDropdownOpen} toggle={this.toggleUserDropdown}\n className={this.state.highlight ? '' : 'vh'} tag=\"span\">\n <DropdownToggle tag=\"i\" className=\"sf-dropdown-toggle sf2-icon-caret-down\"></DropdownToggle>\n <DropdownMenu>\n <DropdownItem onClick={this.props.filterUser.bind(this, fileEvent.user_email)}>\n {gettext('Only Show')}{' '}\n <span className=\"font-weight-bold\">{fileEvent.user_name}</span>\n </DropdownItem>\n </DropdownMenu>\n </Dropdown>\n </span>\n );\n\n }\n\n renderType = (type) => {\n if (type.indexOf('web') != -1) {\n type = 'web';\n }\n if (type.indexOf('api') != -1) {\n type = 'api';\n }\n if (type.indexOf('share-link') != -1) {\n type = 'share link';\n }\n return type;\n }\n\n toggleRepoDropdown = () => {\n this.setState({ repoDropdownOpen: !this.state.repoDropdownOpen });\n }\n\n renderRepo = (fileEvent) => {\n let repoName = 'Deleted';\n if (fileEvent.repo_name) {\n repoName = fileEvent.repo_name;\n }\n return (\n <span>\n <span>{repoName}</span>\n { fileEvent.repo_name &&\n <Dropdown size='sm' isOpen={this.state.repoDropdownOpen} toggle={this.toggleRepoDropdown}\n className={this.state.highlight ? '' : 'vh'} >\n <DropdownToggle tag=\"i\" className=\"sf-dropdown-toggle sf2-icon-caret-down\"></DropdownToggle>\n <DropdownMenu>\n <DropdownItem size='sm' onClick={this.props.filterRepo.bind(this, fileEvent.repo_name)}>\n {gettext('Only Show')}{' '}<span className=\"font-weight-bold\">{fileEvent.repo_name}</span></DropdownItem>\n </DropdownMenu>\n </Dropdown>\n }\n </span>\n );\n }\n\n render() {\n let { fileEvent } = this.props;\n if (this.props.userSelected && fileEvent.user_email !== this.props.userSelected ) {\n return null;\n } else if (this.props.repoSelected && fileEvent.repo_name !== this.props.repoSelected) {\n return null;\n } else {\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''}\n onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>{this.renderUser(fileEvent)}</td>\n <td>{this.renderType(fileEvent.type)}</td>\n <td>{fileEvent.ip}</td>\n <td>{moment(fileEvent.time).format('YYYY-MM-DD HH:mm:ss')}</td>\n <td>{this.renderRepo(fileEvent)}</td>\n <td><span title={fileEvent.file_path}>{fileEvent.file_name}</span></td>\n </tr>\n );\n }\n }\n}\n\nFileAuditItem.propTypes = propTypes;\n\nexport default OrgLogsFileAudit;\n","import { lang } from '../utils/constants';\nimport moment from 'moment';\n\nmoment.locale(lang);\n\nclass OrgLogsFileUpdateEvent {\n constructor(object) {\n this.repo_id = object.repo_id;\n this.description = object.description;\n this.repo_name = object.repo_name;\n this.user_name = object.user_name;\n this.user_email = object.user_email;\n this.repo_encrypted = object.repo_encrypted;\n this.repo_commit_id = object.repo_commit_id;\n this.user_contact_email = object.user_contact_email;\n this.time = moment(object.time).format('YYYY-MM-DD HH:mm:ss');\n }\n}\n\nexport default OrgLogsFileUpdateEvent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\n\nconst propTypes = {\n repoID: PropTypes.string.isRequired,\n commitID: PropTypes.string.isRequired,\n toggleCancel: PropTypes.func.isRequired,\n};\n\nclass FileUpdateDetailDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n time: '',\n renamed: [],\n deldir: [],\n modified: [],\n newdir: [],\n newfile: [],\n removed: [],\n };\n }\n\n componentDidMount() {\n seafileAPI.orgAdminGetFileUpdateDetail(this.props.repoID, this.props.commitID).then(res => {\n this.setState({\n time: res.data.date_time,\n renamed: this.state.renamed.concat(res.data.renamed),\n deldir: this.state.deldir.concat(res.data.deldir),\n modified: this.state.modified.concat(res.data.modified),\n newdir: this.state.newdir.concat(res.data.newdir),\n newfile: this.state.newfile.concat(res.data.new),\n removed: this.state.removed.concat(res.data.removed),\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n renderContentItem = (items) => {\n let con = '';\n con += '<ul class=\"list-group list-group-flush\">';\n for (var i = 0, len = items.length; i < len; i++) {\n con += '<li class=\"list-group-item\">' + items[i] + '</li>';\n }\n con += '</ul>';\n return {__html: con};\n }\n\n renderContent = () => {\n if (this.state.newfile.length > 0) {\n return (\n <div>\n <h4>{gettext('New files')}</h4>\n <p>{this.state.time}</p>\n <div dangerouslySetInnerHTML= {this.renderContentItem(this.state.newfile)} />\n </div>\n );\n }\n\n if (this.state.removed.length > 0) {\n return (\n <div>\n <h4>{gettext('Deleted files')}</h4>\n <p>{this.state.time}</p>\n <div dangerouslySetInnerHTML= {this.renderContentItem(this.state.removed)} />\n </div>\n );\n }\n\n if (this.state.renamed.length > 0) {\n return (\n <div>\n <h4>{gettext('Renamed or Moved files')}</h4>\n <p>{this.state.time}</p>\n <div dangerouslySetInnerHTML= {this.renderContentItem(this.state.renamed)} />\n </div>\n );\n }\n\n if (this.state.modified.length > 0) {\n return (\n <div>\n <h4>{gettext('Modified files')}</h4>\n <p>{this.state.time}</p>\n <div dangerouslySetInnerHTML= {this.renderContentItem(this.state.modified)} />\n </div>\n );\n }\n\n if (this.state.newdir.length > 0) {\n return (\n <div>\n <h4>{gettext('New directories')}</h4>\n <p>{this.state.time}</p>\n <div dangerouslySetInnerHTML= {this.renderContentItem(this.state.newdir)} />\n </div>\n );\n }\n\n if (this.state.deldir.length > 0) {\n return (\n <div>\n <h4>{gettext('Deleted directories')}</h4>\n <p>{this.state.time}</p>\n <div dangerouslySetInnerHTML= {this.renderContentItem(this.state.deldir)} />\n </div>\n );\n }\n }\n\n render() {\n return (\n <Modal isOpen={true} toggle={this.props.toggleCancel}>\n <ModalHeader toggle={this.props.toggleCancel}>\n {gettext('Modification Details')}\n </ModalHeader>\n <ModalBody>\n {this.renderContent()}\n </ModalBody>\n </Modal>\n );\n }\n}\n\nFileUpdateDetailDialog.propTypes = propTypes;\n\nexport default FileUpdateDetailDialog;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { siteRoot, gettext, lang } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport OrgLogsFileUpdateEvent from '../../models/org-logs-file-update';\nimport ModalPortal from '../../components/modal-portal';\nimport FileUpdateDetailDialog from '../../components/dialog/org-logs-file-update-detail';\nimport '../../css/org-logs.css';\n\nmoment.locale(lang);\n\nclass OrgLogsFileUpdate extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n page: 1,\n pageNext: false,\n eventList: [],\n userSelected: '',\n repoSelected: '',\n isItemFreezed: false,\n showDetails: false,\n repoID: '',\n commitID: ''\n };\n }\n\n componentDidMount() {\n let page = this.state.page;\n let email = this.state.userSelected;\n let repoID = this.state.repoSelected;\n this.initData(email, repoID, page);\n }\n\n initData = (email, repoID, page) => {\n seafileAPI.orgAdminListFileUpdate(email, repoID, page).then(res => {\n let eventList = res.data.log_list.map(item => {\n return new OrgLogsFileUpdateEvent(item);\n });\n this.setState({\n eventList: eventList,\n pageNext: res.data.page_next,\n page: res.data.page,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n onChangePageNum = (e, num) => {\n e.preventDefault();\n let page = this.state.page;\n\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n let email = this.state.userSelected;\n let repoID = this.state.repoSelected;\n this.initData(email, repoID, page);\n }\n\n toggleCancelDetail = () => {\n this.setState({\n showDetails: !this.state.showDetails\n });\n }\n\n onDetails = (e, fileEvent) => {\n e.preventDefault();\n this.setState({\n showDetails: !this.state.showDetails,\n repoID: fileEvent.repo_id,\n commitID: fileEvent.repo_commit_id\n });\n }\n\n filterUser = (userSelected) => {\n this.setState({ userSelected: userSelected });\n }\n\n filterRepo = (repoSelected) => {\n this.setState({ repoSelected: repoSelected });\n }\n\n render() {\n let eventList = this.state.eventList;\n return (\n <div className=\"cur-view-content\">\n {\n (this.state.userSelected || this.state.repoSelected) &&\n <React.Fragment>\n {this.state.userSelected &&\n <span className=\"audit-unselect-item\" onClick={this.filterUser.bind(this, null)}>\n <span className=\"no-deco\">{this.state.userSelected}</span>{' ✖'}\n </span>\n }\n {this.state.repoSelected &&\n <span className=\"audit-unselect-item\" onClick={this.filterRepo.bind(this, null)}>\n <span className=\"no-deco\">{this.state.repoSelected}</span>{' ✖'}\n </span>\n }\n </React.Fragment>\n }\n <table>\n <thead>\n <tr>\n <th width=\"25%\">{gettext('User')}</th>\n <th width=\"17%\">{gettext('Date')}</th>\n <th width=\"25%\">{gettext('Library')}</th>\n <th width=\"33%\">{gettext('Action')}</th>\n </tr>\n </thead>\n <tbody>\n {eventList.map((item, index) => {\n return (\n <FileUpdateItem\n key={index}\n fileEvent={item}\n isItemFreezed={this.state.isItemFreezed}\n onDetails={this.onDetails}\n filterUser={this.filterUser}\n filterRepo={this.filterRepo}\n userSelected={this.state.userSelected}\n repoSelected={this.state.repoSelected}\n />\n );\n })}\n </tbody>\n </table>\n <div className=\"paginator\">\n {this.state.page != 1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(this.state.page != 1 && this.state.pageNext) && <span> | </span>}\n {this.state.pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n {this.state.showDetails &&\n <ModalPortal>\n <FileUpdateDetailDialog\n repoID={this.state.repoID}\n commitID={this.state.commitID}\n toggleCancel={this.toggleCancelDetail}\n />\n </ModalPortal>\n }\n </div>\n );\n }\n}\n\nconst propTypes = {\n filterUser: PropTypes.func.isRequired,\n filterRepo: PropTypes.func.isRequired,\n onDetails: PropTypes.func.isRequired,\n userSelected: PropTypes.string.isRequired,\n repoSelected: PropTypes.string.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n};\n\n\nclass FileUpdateItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false,\n userDropdownOpen: false,\n repoDropdownOpen: false,\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n toggleUserDropdown = () => {\n this.setState({ userDropdownOpen: !this.state.userDropdownOpen });\n }\n\n renderUser = (fileEvent) => {\n if (!fileEvent.user_email) {\n return gettext('Anonymous User');\n }\n\n return (\n <span>\n <a href={siteRoot + 'org/useradmin/info/' + fileEvent.user_email + '/'}>{fileEvent.user_name}</a>{' '}\n <Dropdown size='sm' isOpen={this.state.userDropdownOpen} toggle={this.toggleUserDropdown}\n className={this.state.highlight ? '' : 'vh'} tag=\"span\">\n <DropdownToggle tag=\"i\" className=\"sf-dropdown-toggle sf2-icon-caret-down\"></DropdownToggle>\n <DropdownMenu>\n <DropdownItem onClick={this.props.filterUser.bind(this, fileEvent.user_email)}>\n {gettext('Only Show')}{' '}<span className=\"font-weight-bold\">{fileEvent.user_name}</span>\n </DropdownItem>\n </DropdownMenu>\n </Dropdown>\n </span>\n );\n }\n\n toggleRepoDropdown = () => {\n this.setState({ repoDropdownOpen: !this.state.repoDropdownOpen });\n }\n\n renderRepo = (fileEvent) => {\n let repoName = 'Deleted';\n if (fileEvent.repo_name) {\n repoName = fileEvent.repo_name;\n }\n return (\n <span>\n <span>{repoName}</span>\n { fileEvent.repo_name &&\n <Dropdown size='sm' isOpen={this.state.repoDropdownOpen} toggle={this.toggleRepoDropdown}\n className={this.state.highlight ? '' : 'vh'} >\n <DropdownToggle tag=\"i\" className=\"sf-dropdown-toggle sf2-icon-caret-down\"></DropdownToggle>\n <DropdownMenu>\n <DropdownItem size='sm' onClick={this.props.filterRepo.bind(this, fileEvent.repo_name)}>\n {gettext('Only Show')}{' '}\n <span className=\"font-weight-bold\">{fileEvent.repo_name}</span>\n </DropdownItem>\n </DropdownMenu>\n </Dropdown>\n }\n </span>\n );\n }\n\n renderAction = (fileEvent) => {\n if (fileEvent.repo_encrypted || !fileEvent.repo_id) {\n return <td>{fileEvent.description}</td>;\n }\n\n return (\n <td>{fileEvent.description}\n <a className=\"font-weight-normal text-muted ml-1\" href='#'\n onClick={(e) => this.props.onDetails(e, fileEvent)}>{gettext('Details')}</a>\n </td>\n );\n }\n\n render() {\n let { fileEvent } = this.props;\n if (this.props.userSelected && fileEvent.user_email !== this.props.userSelected ) {\n return null;\n } else if (this.props.repoSelected && fileEvent.repo_name !== this.props.repoSelected) {\n return null;\n } else {\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''}\n onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>{this.renderUser(fileEvent)}</td>\n <td>{moment(fileEvent.time).format('YYYY-MM-DD HH:mm:ss')}</td>\n <td>{this.renderRepo(fileEvent)}</td>\n {this.renderAction(fileEvent)}\n </tr>\n );\n }\n }\n}\n\nFileUpdateItem.propTypes = propTypes;\n\nexport default OrgLogsFileUpdate;\n","import { lang } from '../utils/constants';\nimport moment from 'moment';\n\nmoment.locale(lang);\n\nclass OrgLogsPermAuditEvent {\n constructor(object) {\n this.from_user_name = object.from_user_name;\n this.from_user_email = object.from_user_email;\n this.from_user_contact_email = object.from_user_contact_email;\n this.to_user_email = object.to_user_email;\n this.to_user_name = object.to_user_name;\n this.to_user_contact_email = object.to_user_contact_email;\n this.to_group_name = object.to_group_name;\n this.to_group_id = object.to_group_id;\n this.type = object.type;\n this.repo_id = object.repo_id;\n this.repo_name = object.repo_name;\n this.folder_name = object.folder_name;\n this.folder_path = object.folder_path;\n this.time = moment(object.time).format('YYYY-MM-DD HH:mm:ss');\n this.permission = object.permission;\n }\n}\n\nexport default OrgLogsPermAuditEvent;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { siteRoot, gettext, lang } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport OrgLogsFilePermEvent from '../../models/org-logs-perm-audit';\nimport '../../css/org-logs.css';\n\nmoment.locale(lang);\n\nclass OrgLogsFileUpdate extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n page: 1,\n pageNext: false,\n eventList: [],\n userSelected: '',\n repoSelected: '',\n isItemFreezed: false\n };\n }\n\n componentDidMount() {\n let page = this.state.page;\n let email = this.state.userSelected;\n let repoID = this.state.repoSelected;\n this.initData(email, repoID, page);\n }\n\n initData = (email, repoID, page) => {\n seafileAPI.orgAdminListPermAudit(email, repoID, page).then(res => {\n let eventList = res.data.log_list.map(item => {\n return new OrgLogsFilePermEvent(item);\n });\n\n this.setState({\n eventList: eventList,\n pageNext: res.data.page_next,\n page: res.data.page,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n onChangePageNum = (e, num) => {\n e.preventDefault();\n let page = this.state.page;\n\n if (num == 1) {\n page = page + 1;\n } else {\n page = page - 1;\n }\n this.initData(page);\n }\n\n filterUser = (userSelected) => {\n this.setState({ userSelected: userSelected });\n }\n\n render() {\n let eventList = this.state.eventList;\n return (\n <div className=\"cur-view-content\">\n {this.state.userSelected &&\n <span className=\"audit-unselect-item\" onClick={this.filterUser.bind(this, null)}>\n <span className=\"no-deco\">{this.state.userSelected}</span>{' ✖'}\n </span>\n }\n <table>\n <thead>\n <tr>\n <th width=\"18%\">{gettext('Share From')}</th>\n <th width=\"15%\">{gettext('Share To')}</th>\n <th width=\"8%\">{gettext('Actions')}</th>\n <th width=\"13%\">{gettext('Permission')}</th>\n <th width=\"15%\">{gettext('Library')}</th>\n <th width=\"15%\">{gettext('Folder')}</th>\n <th width=\"16%\">{gettext('Date')}</th>\n </tr>\n </thead>\n <tbody>\n {eventList.map((item, index) => {\n return (\n <PermAuditItem\n key={index}\n permEvent={item}\n isItemFreezed={this.state.isItemFreezed}\n filterUser={this.filterUser}\n userSelected={this.state.userSelected}\n />\n );\n })}\n </tbody>\n </table>\n <div className=\"paginator\">\n {this.state.page != 1 && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, -1)}>{gettext('Previous')}</a>}\n {(this.state.page != 1 && this.state.pageNext) && <span> | </span>}\n {this.state.pageNext && <a href=\"#\" onClick={(e) => this.onChangePageNum(e, 1)}>{gettext('Next')}</a>}\n </div>\n </div>\n );\n }\n}\n\n\nconst propTypes = {\n filterUser: PropTypes.func.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n userSelected: PropTypes.string.isRequired,\n permEvent: PropTypes.object.isRequired,\n};\n\nclass PermAuditItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n showMenu: false,\n isItemMenuShow: false,\n userDropdownOpen: false,\n };\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: true,\n highlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n showMenu: false,\n highlight: false\n });\n }\n }\n\n renderFromUser = (permEvent) => {\n if (!permEvent.from_user_email) {\n return gettext('Anonymous User');\n }\n return (\n <span>\n <a href={siteRoot + 'org/useradmin/info/' + permEvent.from_user_email + '/'}>{permEvent.from_user_name}</a>{' '}\n <Dropdown size='sm' isOpen={this.state.userDropdownOpen} toggle={this.toggleUserDropdown}\n className={this.state.highlight ? '' : 'vh'} tag=\"span\">\n <DropdownToggle tag=\"i\" className=\"sf-dropdown-toggle sf2-icon-caret-down\"></DropdownToggle>\n <DropdownMenu>\n <DropdownItem onClick={this.props.filterUser.bind(this, permEvent.from_user_email)}>\n {gettext('Only Show')}{' '}\n <span className=\"font-weight-bold\">{permEvent.from_user_name}</span>\n </DropdownItem>\n </DropdownMenu>\n </Dropdown>\n </span>\n );\n }\n\n toggleUserDropdown = () => {\n this.setState({ userDropdownOpen: !this.state.userDropdownOpen });\n }\n\n renderToUser = (permEvent) => {\n if (permEvent.type.indexOf('public') != -1) {\n return <a href={siteRoot + 'org/'}>{gettext('Organization')}</a>;\n }\n\n if (permEvent.type.indexOf('group') != -1) {\n if (permEvent.to_group_name) {\n return <a href={siteRoot + 'org/groupadmin/' + permEvent.to_group_id + '/'}>{permEvent.to_group_name}</a>;\n }\n return 'Deleted';\n }\n\n if (permEvent.type.indexOf('user') != -1) {\n return <a href={siteRoot + 'org/useradmin/info/' + permEvent.to_user_email + '/'}>{permEvent.to_user_name}</a>;\n }\n\n }\n\n renderType = (type) => {\n if (type.indexOf('add') != -1) {\n type = 'Add';\n }\n if (type.indexOf('modify') != -1) {\n type = 'Modify';\n }\n if (type.indexOf('delete') != -1) {\n type = 'Delete';\n }\n return type;\n }\n\n renderRepo = (permEvent) => {\n let repoName = 'Deleted';\n if (permEvent.repo_name) {\n repoName = permEvent.repo_name;\n }\n return repoName;\n }\n\n renderFolder = (name) => {\n let folderName = '/';\n if (name) {\n folderName = name;\n }\n return folderName;\n }\n\n render() {\n let { permEvent } = this.props;\n if (this.props.userSelected && permEvent.from_user_email !== this.props.userSelected ) {\n return null;\n } else {\n return (\n <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n <td>{this.renderFromUser(permEvent)}</td>\n <td>{this.renderToUser(permEvent)}</td>\n <td>{this.renderType(permEvent.type)}</td>\n <td>{Utils.sharePerms(permEvent.permission)}</td>\n <td>{this.renderRepo(permEvent)}</td>\n <td>{this.renderFolder(permEvent.folder_name)}</td>\n <td>{moment(permEvent.time).format('YYYY-MM-DD HH:mm:ss')}</td>\n </tr>\n );\n }\n }\n}\n\nPermAuditItem.propTypes = propTypes;\n\nexport default OrgLogsFileUpdate;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Router } from '@reach/router';\nimport { siteRoot } from '../../utils/constants';\nimport SidePanel from './side-panel';\nimport OrgUsers from './org-users-users';\nimport OrgUsersSearchUsers from './org-users-search-users';\nimport OrgAdmins from './org-users-admins';\nimport OrgUserProfile from './org-user-profile';\nimport OrgUserRepos from './org-user-repos';\nimport OrgUserSharedRepos from './org-user-shared-repos';\nimport OrgGroups from './org-groups';\nimport OrgGroupsSearchGroups from './org-groups-search-groups';\nimport OrgGroupInfo from './org-group-info';\nimport OrgGroupRepos from './org-group-repos';\nimport OrgGroupMembers from './org-group-members';\nimport OrgLibraries from './org-libraries';\nimport OrgInfo from './org-info';\nimport OrgLinks from './org-links';\nimport OrgDepartments from './org-departments';\nimport OrgDepartmentsList from './org-departments-list';\nimport OrgDepartmentItem from './org-department-item';\nimport OrgLogs from './org-logs';\nimport OrgLogsFileAudit from './org-logs-file-audit';\nimport OrgLogsFileUpdate from './org-logs-file-update';\nimport OrgLogsPermAudit from './org-logs-perm-audit';\n\nimport '../../css/layout.css';\nimport '../../css/toolbar.css';\n\nclass Org extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isSidePanelClosed: false,\n currentTab: 'users'\n };\n }\n\n componentDidMount() {\n let href = window.location.href.split('/');\n let currentTab = href[href.length - 2];\n\n if (location.href.indexOf(`${siteRoot}org/useradmin`) != -1) {\n currentTab = 'users';\n }\n if (location.href.indexOf(`${siteRoot}org/groupadmin`) != -1) {\n currentTab = 'groupadmin';\n }\n if (location.href.indexOf(`${siteRoot}org/departmentadmin`) != -1) {\n currentTab = 'departmentadmin';\n }\n this.setState({currentTab: currentTab});\n }\n\n onCloseSidePanel = () => {\n this.setState({isSidePanelClosed: !this.state.isSidePanelClosed});\n }\n\n tabItemClick = (param) => {\n this.setState({currentTab: param});\n }\n\n render() {\n let { isSidePanelClosed, currentTab } = this.state;\n return (\n <div id=\"main\">\n <SidePanel isSidePanelClosed={isSidePanelClosed} onCloseSidePanel={this.onCloseSidePanel} currentTab={currentTab} tabItemClick={this.tabItemClick}/>\n <div className=\"main-panel o-hidden\">\n <Router className=\"reach-router\">\n <OrgInfo path={siteRoot + 'org/orgmanage'}/>\n <OrgUsers path={siteRoot + 'org/useradmin'} />\n <OrgUsersSearchUsers path={siteRoot + 'org/useradmin/search-users'} />\n <OrgAdmins path={siteRoot + 'org/useradmin/admins/'} />\n <OrgUserProfile path={siteRoot + 'org/useradmin/info/:email/'} />\n <OrgUserRepos path={siteRoot + 'org/useradmin/info/:email/repos/'} />\n <OrgUserSharedRepos path={siteRoot + 'org/useradmin/info/:email/shared-repos/'} />\n <OrgGroups path={siteRoot + 'org/groupadmin'} />\n <OrgGroupsSearchGroups path={siteRoot + 'org/groupadmin/search-groups'} />\n <OrgGroupInfo path={siteRoot + 'org/groupadmin/:groupID/'} />\n <OrgGroupRepos path={siteRoot + 'org/groupadmin/:groupID/repos/'} />\n <OrgGroupMembers path={siteRoot + 'org/groupadmin/:groupID/members/'} />\n <OrgLibraries path={siteRoot + 'org/repoadmin'}/>\n <OrgLinks path={siteRoot + 'org/publinkadmin'}/>\n <OrgDepartments path={siteRoot + 'org/departmentadmin'}>\n <OrgDepartmentsList path='/'/>\n <OrgDepartmentItem path='groups/:groupID'/>\n </OrgDepartments>\n <OrgLogs path={siteRoot + 'org/logadmin'} currentTab={currentTab} tabItemClick={this.tabItemClick}>\n <OrgLogsFileAudit path='/' />\n <OrgLogsFileUpdate path='file-update' />\n <OrgLogsPermAudit path='perm-audit' />\n </OrgLogs>\n </Router>\n </div>\n </div>\n );\n }\n}\n\nReactDOM.render(\n <Org />,\n document.getElementById('wrapper')\n);\n"],"sourceRoot":""}