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":""}