platform/models/recruit/src/review.ts
Kristina e4192b27fc
UBERF-7513: Improve notifications model to allow external notifications channels (#6037)
Signed-off-by: Kristina Fefelova <kristin.fefelova@gmail.com>
2024-07-12 19:07:11 +07:00

165 lines
4.7 KiB
TypeScript

import { type FindOptions } from '@hcengineering/core'
import { type Builder } from '@hcengineering/model'
import calendar from '@hcengineering/model-calendar'
import contact from '@hcengineering/model-contact'
import core from '@hcengineering/model-core'
import view, { createAction } from '@hcengineering/model-view'
import { type Review } from '@hcengineering/recruit'
import { type BuildModelKey } from '@hcengineering/view'
import recruit from './plugin'
import notification from '@hcengineering/notification'
import { generateClassNotificationTypes } from '@hcengineering/model-notification'
export const reviewTableOptions: FindOptions<Review> = {
lookup: {
attachedTo: recruit.mixin.Candidate,
participants: contact.mixin.Employee,
company: contact.class.Organization
}
}
export const reviewTableConfig: (BuildModelKey | string)[] = [
'',
'title',
'$lookup.attachedTo',
// 'verdict',
{ key: '', presenter: recruit.component.OpinionsPresenter, label: recruit.string.Opinions, sortingKey: 'opinions' },
{
key: '$lookup.participants',
presenter: calendar.component.PersonsPresenter,
label: calendar.string.Participants,
sortingKey: '$lookup.participants'
},
'$lookup.company',
{ key: '', presenter: calendar.component.DateTimePresenter, label: calendar.string.Date, sortingKey: 'date' },
'modifiedOn'
]
export function createReviewModel (builder: Builder): void {
builder.mixin(recruit.class.Review, core.class.Class, view.mixin.CollectionEditor, {
editor: recruit.component.Reviews
})
createTableViewlet(builder)
createAction(
builder,
{
label: recruit.string.CreateOpinion,
icon: recruit.icon.Create,
action: recruit.actionImpl.CreateOpinion,
input: 'focus',
category: recruit.category.Recruit,
target: recruit.class.Review,
context: {
mode: ['context', 'browser'],
group: 'create'
}
},
recruit.action.CreateOpinion
)
builder.mixin(recruit.class.Review, core.class.Class, view.mixin.ObjectEditor, {
editor: recruit.component.EditReview
})
builder.mixin(recruit.class.Review, core.class.Class, view.mixin.ObjectPresenter, {
presenter: recruit.component.ReviewPresenter
})
builder.mixin(recruit.class.Opinion, core.class.Class, view.mixin.ObjectPresenter, {
presenter: recruit.component.OpinionPresenter
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: recruit.component.CreateReview,
element: 'top',
props: {
preserveCandidate: true
},
fillProps: {
space: '_space',
_id: 'candidate'
}
},
label: recruit.string.CreateReview,
icon: recruit.icon.Schedule,
input: 'focus',
category: recruit.category.Recruit,
target: recruit.mixin.Candidate,
context: {
mode: ['context', 'browser'],
group: 'associate'
}
})
builder.createDoc(
view.class.Viewlet,
core.space.Model,
{
attachTo: recruit.class.Review,
descriptor: calendar.viewlet.Calendar,
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
config: [
'',
'title',
'$lookup.attachedTo',
'$lookup.company',
{ key: '', presenter: calendar.component.DateTimePresenter, label: calendar.string.Date, sortingKey: 'date' }
]
},
recruit.viewlet.CalendarReview
)
builder.createDoc(
notification.class.NotificationGroup,
core.space.Model,
{
label: recruit.string.Review,
icon: recruit.icon.Reviews,
objectClass: recruit.class.Review
},
recruit.ids.ReviewNotificationGroup
)
generateClassNotificationTypes(builder, recruit.class.Review, recruit.ids.ReviewNotificationGroup, [], ['comments'])
builder.createDoc(
notification.class.NotificationType,
core.space.Model,
{
hidden: false,
generated: false,
label: recruit.string.NewReview,
group: recruit.ids.ReviewNotificationGroup,
txClasses: [core.class.TxCreateDoc],
objectClass: recruit.class.Review,
defaultEnabled: true,
templates: {
textTemplate: '{body}',
htmlTemplate: '<p>{body}</p>',
subjectTemplate: '{title}'
}
},
recruit.ids.ReviewCreateNotification
)
}
function createTableViewlet (builder: Builder): void {
builder.createDoc(
view.class.Viewlet,
core.space.Model,
{
attachTo: recruit.class.Review,
descriptor: view.viewlet.Table,
config: reviewTableConfig
},
recruit.viewlet.TableReview
)
builder.mixin(recruit.class.Opinion, core.class.Class, view.mixin.CollectionEditor, {
editor: recruit.component.Opinions
})
}