Skip to content

Add room and convert to room and various other things #2690

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/_nav.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ const _nav = [
component: CNavGroup,
name: 'Administration',
section: 'Email & Exchange',
to: '/email/exchange',
to: '/email/Administration',
icon: <FontAwesomeIcon icon={faWrench} className="nav-icon" />,
items: [
{
Expand Down Expand Up @@ -688,7 +688,7 @@ const _nav = [
component: CNavGroup,
name: 'Transport',
section: 'Email & Exchange',
to: '/tenant/administration',
to: '/email/Transport',
icon: <FontAwesomeIcon icon={faBus} className="nav-icon" />,
items: [
{
Expand Down Expand Up @@ -727,7 +727,7 @@ const _nav = [
component: CNavGroup,
name: 'Spamfilter',
section: 'Email & Exchange',
to: '/tenant/administration',
to: '/email/spamfilter',
icon: <FontAwesomeIcon icon={faEnvelope} className="nav-icon" />,
items: [
{
Expand All @@ -749,20 +749,20 @@ const _nav = [
},
{
component: CNavGroup,
name: ' Room Management',
name: 'Resource Management',
section: 'Email & Exchange',
to: '/rooms/management',
to: '/resources/management',
icon: <FontAwesomeIcon icon={faToolbox} className="nav-icon" />,
items: [
{
component: CNavItem,
name: 'Rooms',
to: '/rooms/management/list-rooms',
to: '/resources/management/list-rooms',
},
{
component: CNavItem,
name: 'Room Lists',
to: '/rooms/management/room-lists',
to: '/resources/management/room-lists',
},
],
},
Expand Down
7 changes: 4 additions & 3 deletions src/importsMap.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,9 @@ import React from 'react'
"/email/spamfilter/list-spamfilter": React.lazy(() => import('./views/email-exchange/spamfilter/Spamfilter')),
"/email/spamfilter/deploy": React.lazy(() => import('./views/email-exchange/spamfilter/DeploySpamfilter')),
"/email/spamfilter/list-templates": React.lazy(() => import('./views/email-exchange/spamfilter/ListSpamfilterTemplates')),
"/rooms/management/list-rooms": React.lazy(() => import('./views/email-exchange/rooms/ListRooms')),
"/rooms/management/room-lists": React.lazy(() => import('./views/email-exchange/rooms/ListRoomLists')),
"/resources/management/list-rooms": React.lazy(() => import('./views/email-exchange/rooms/ListRooms')),
"/resources/management/room-lists": React.lazy(() => import('./views/email-exchange/rooms/ListRoomLists')),
"/resources/management/add-room": React.lazy(() => import('./views/email-exchange/rooms/AddRoomMailbox')),
"/email/tools/mailbox-restore-wizard": React.lazy(() => import('./views/email-exchange/tools/MailboxRestoreWizard')),
"/email/tools/mailbox-restores": React.lazy(() => import('./views/email-exchange/tools/MailboxRestores')),
"/email/tools/mail-test": React.lazy(() => import('./views/email-exchange/tools/MailTest')),
Expand All @@ -118,7 +119,7 @@ import React from 'react'
"/email/administration/add-contact": React.lazy(() => import('./views/email-exchange/administration/AddContact')),
"/email/administration/edit-calendar-permissions": React.lazy(() => import('./views/email-exchange/administration/EditCalendarPermissions')),
"/email/administration/view-mobile-devices": React.lazy(() => import('./views/email-exchange/administration/ViewMobileDevices')),
"/email/administration/edit-contact": React.lazy(() => import('./views/email-exchange/administration/EditContact.jsx')),
"/email/administration/edit-contact": React.lazy(() => import('./views/email-exchange/administration/EditContact')),
"/email/administration/mailboxes": React.lazy(() => import('./views/email-exchange/administration/MailboxesList')),
"/email/administration/deleted-mailboxes": React.lazy(() => import('./views/email-exchange/administration/DeletedMailboxes')),
"/email/administration/mailbox-rules": React.lazy(() => import('./views/email-exchange/administration/MailboxRuleList')),
Expand Down
10 changes: 8 additions & 2 deletions src/routes.json
Original file line number Diff line number Diff line change
Expand Up @@ -729,17 +729,23 @@
"allowedRoles": ["admin", "editor", "readonly"]
},
{
"path": "/rooms/management/list-rooms",
"path": "/resources/management/list-rooms",
"name": "Rooms",
"component": "views/email-exchange/rooms/ListRooms",
"allowedRoles": ["admin", "editor", "readonly"]
},
{
"path": "/rooms/management/room-lists",
"path": "/resources/management/room-lists",
"name": "Room Lists",
"component": "views/email-exchange/rooms/ListRoomLists",
"allowedRoles": ["admin", "editor", "readonly"]
},
{
"path": "/resources/management/add-room",
"name": "Add Room",
"component": "views/email-exchange/rooms/AddRoomMailbox",
"allowedRoles": ["admin", "editor", "readonly"]
},
{
"path": "/email/tools/mailbox-restore-wizard",
"name": "Mailbox Restore Wizard",
Expand Down
39 changes: 30 additions & 9 deletions src/views/email-exchange/administration/MailboxesList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,21 @@ const MailboxList = () => {
color: 'info',
modal: true,
modalUrl: `/api/ExecConvertToSharedMailbox?TenantFilter=${tenant.defaultDomainName}&ID=${row.UPN}`,
modalMessage: 'Are you sure you want to convert this user to a shared mailbox?',
modalMessage: 'Are you sure you want to convert this mailbox to a shared mailbox?',
},
{
label: 'Convert to User Mailbox',
color: 'info',
modal: true,
modalUrl: `/api/ExecConvertToSharedMailbox?TenantFilter=${tenant.defaultDomainName}&ID=${row.UPN}&ConvertToUser=true`,
modalMessage:
'Are you sure you want to convert this shared mailbox to a user mailbox?',
modalMessage: 'Are you sure you want to convert this mailbox to a user mailbox?',
},
{
label: 'Convert to Room Mailbox',
color: 'info',
modal: true,
modalUrl: `/api/ExecConvertToRoomMailbox?TenantFilter=${tenant.defaultDomainName}&ID=${row.UPN}`,
modalMessage: 'Are you sure you want to convert this mailbox to a Room mailbox?',
},
{
label: 'Copy Sent Items to Shared Mailbox',
Expand Down Expand Up @@ -231,14 +237,22 @@ const MailboxList = () => {
maxWidth: '150px',
},
]
const titleButton = (
<TitleButton href="/email/administration/add-shared-mailbox" title="Add Shared Mailbox" />

const titleButtons = (
<div style={{ display: 'flex', alignItems: 'right' }}>
<div style={{ marginLeft: '10px' }}>
<TitleButton href="/email/administration/add-shared-mailbox" title="Add Shared Mailbox" />
</div>
<div style={{ marginLeft: '10px' }}>
<TitleButton href="/resources/management/add-room" title="Add Room" />
</div>
</div>
)

return (
<CippPageList
capabilities={{ allTenants: false, helpContext: 'https://google.com' }}
titleButton={titleButton}
titleButton={titleButtons}
title="Mailboxes"
datatable={{
keyField: 'id',
Expand All @@ -253,15 +267,21 @@ const MailboxList = () => {
color: 'info',
modal: true,
modalUrl: `/api/ExecConvertToSharedMailbox?TenantFilter=${tenant.defaultDomainName}&ID=!UPN`,
modalMessage: 'Are you sure you want to convert this user to a shared mailbox?',
modalMessage: 'Are you sure you want to convert these mailboxes to shared mailboxes?',
},
{
label: 'Convert to User Mailbox',
color: 'info',
modal: true,
modalUrl: `/api/ExecConvertToSharedMailbox?TenantFilter=${tenant.defaultDomainName}&ID=!UPN&ConvertToUser=true`,
modalMessage:
'Are you sure you want to convert this shared mailbox to a user mailbox?',
modalMessage: 'Are you sure you want to convert these mailboxes to user mailboxes?',
},
{
label: 'Convert to Room Mailbox',
color: 'info',
modal: true,
modalUrl: `/api/ExecConvertToRoomMailbox?TenantFilter=${tenant.defaultDomainName}&ID=!UPN`,
modalMessage: 'Are you sure you want to convert these mailboxes to Room mailboxes?',
},
{
label: 'Hide from Global Address List',
Expand Down Expand Up @@ -334,6 +354,7 @@ const MailboxList = () => {
filter: '"SharedMailboxWithLicense":true',
},
{ filterName: 'Shared Mailboxes', filter: '"recipientTypeDetails":"SharedMailbox"' },
{ filterName: 'Room mailboxes', filter: '"recipientTypeDetails":"RoomMailbox"' },
{ filterName: 'Has an alias', filter: '"AdditionalEmailAddresses":"' },
],
}}
Expand Down
118 changes: 118 additions & 0 deletions src/views/email-exchange/rooms/AddRoomMailbox.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import React from 'react'
import {
CCallout,
CButton,
CCol,
CForm,
CRow,
CSpinner,
CCard,
CCardHeader,
CCardTitle,
CCardBody,
} from '@coreui/react'
import { Form } from 'react-final-form'
import { RFFCFormInput, RFFCFormSelect, RFFCFormTextarea } from 'src/components/forms'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCircleNotch } from '@fortawesome/free-solid-svg-icons'
import { CippPage } from 'src/components/layout/CippPage'
import { useLazyGenericPostRequestQuery } from 'src/store/api/app'
import { useListDomainsQuery } from 'src/store/api/domains'
import { useSelector } from 'react-redux'

const AddRoomMailbox = () => {
const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName)
const {
data: domains = [],
isFetching: domainsIsFetching,
error: domainsError,
} = useListDomainsQuery({ tenantDomain })

const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery()
const onSubmit = (values) => {
const shippedValues = {
tenantID: tenantDomain,
domain: values.domain,
displayName: values.displayName.trim(),
username: values.username.trim(),
userPrincipalName: values.username.trim() + '@' + values.domain.trim(),
resourceCapacity: values.resourceCapacity ? values.resourceCapacity.trim() : undefined,
}
// window.alert(JSON.stringify(shippedValues))
genericPostRequest({ path: '/api/AddRoomMailbox', values: shippedValues })
}

// TODO: Add functionality to set location, office, floor and other things here
return (
<CippPage title="Add Room">
<CCard className="content-card">
<CCardHeader className="d-flex justify-content-between align-items-center">
<CCardTitle>Add Room</CCardTitle>
</CCardHeader>
<CCardBody>
<Form
onSubmit={onSubmit}
render={({ handleSubmit, submitting, values }) => {
return (
<CForm onSubmit={handleSubmit}>
<CRow>
<CCol md={8}>
<RFFCFormInput type="text" name="displayName" label="Display Name" />
</CCol>
</CRow>
<CRow>
<CCol md={4}>
<RFFCFormInput type="text" name="username" label="Username" />
</CCol>
<CCol md={4}>
{domainsIsFetching && <CSpinner />}
{!domainsIsFetching && (
<RFFCFormSelect
// label="Domain"
name="domain"
label="Primary Domain name"
placeholder={!domainsIsFetching ? 'Select domain' : 'Loading...'}
values={domains?.map((domain) => ({
value: domain.id,
label: domain.id,
}))}
/>
)}
{domainsError && <span>Failed to load list of domains</span>}
</CCol>
<CCol xs={12}>
<RFFCFormInput
type="text"
name="resourceCapacity"
label="Resource Capacity (Optional)"
/>
</CCol>
</CRow>
<CRow className="mb-3">
<CCol md={6}>
<CButton type="submit" disabled={submitting}>
Add Room Mailbox
{postResults.isFetching && (
<FontAwesomeIcon icon={faCircleNotch} spin className="ms-2" size="1x" />
)}
</CButton>
</CCol>
</CRow>
{postResults.isSuccess && (
<CCallout color="success">
{postResults.data.Results.map((message, idx) => {
return <li key={idx}>{message}</li>
})}
</CCallout>
)}
</CForm>
)
}}
/>
</CCardBody>
</CCard>
</CippPage>
)
}

export default AddRoomMailbox
2 changes: 1 addition & 1 deletion src/views/email-exchange/rooms/ListRoomLists.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const RoomLists = () => {
/* const Actions = (row, rowIndex, formatExtraData) => (
<>
<Link
to={`/rooms/management/list-rooms?tenantDomain=${tenant.defaultDomainName}`}
to={`/resources/management/list-rooms?tenantDomain=${tenant.defaultDomainName}`}
>
<CButton size="sm" variant="ghost" color="success">
<FontAwesomeIcon icon={faEye} />
Expand Down
6 changes: 4 additions & 2 deletions src/views/email-exchange/rooms/ListRooms.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { CButton } from '@coreui/react'
import { faEye, faEdit } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { Link } from 'react-router-dom'
import { TitleButton } from 'src/components/buttons'
import { CippPageList } from 'src/components/layout'
import { CellTip } from 'src/components/tables'

Expand All @@ -12,15 +13,15 @@ const Rooms = () => {
/* const Actions = (row, rowIndex, formatExtraData) => (
<>
<Link
to={`/rooms/management/list-rooms?tenantDomain=${tenant.defaultDomainName}`}
to={`/resources/management/list-rooms?tenantDomain=${tenant.defaultDomainName}`}
>
<CButton size="sm" variant="ghost" color="success">
<FontAwesomeIcon icon={faEye} />
</CButton>
</Link>
</>
)*/

const titleButton = <TitleButton href="/resources/management/add-room" title="Add Room" />
const columns = [
{
name: 'Name',
Expand Down Expand Up @@ -78,6 +79,7 @@ const Rooms = () => {
return (
<CippPageList
title="Rooms"
titleButton={titleButton}
datatable={{
columns,
path: '/api/ListRooms',
Expand Down
Loading