From 5696f216cab9770b7ff42b72d1c8c96050f09b7c Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Sun, 5 Mar 2023 23:36:12 +0600 Subject: [PATCH] HR requests notifications (#2710) Signed-off-by: Denis Bykhov --- models/calendar/src/index.ts | 1 + models/contact/src/index.ts | 4 + models/contact/src/plugin.ts | 1 + models/hr/package.json | 1 + models/hr/src/index.ts | 45 +++- models/hr/src/plugin.ts | 3 +- models/notification/src/index.ts | 5 +- models/notification/src/plugin.ts | 1 + models/server-hr/package.json | 2 + models/server-hr/src/index.ts | 22 ++ models/task/src/index.ts | 1 + .../src/components/CombineAvatars.svelte | 8 +- packages/presentation/src/utils.ts | 10 +- .../src/components/ContactArrayEditor.svelte | 31 +++ .../src/components/ContactList.svelte | 99 ++++++++ plugins/contact-resources/src/index.ts | 2 + plugins/hr-assets/lang/en.json | 3 +- plugins/hr-assets/lang/ru.json | 3 +- .../src/components/CreateRequest.svelte | 3 +- .../src/components/RequestPresenter.svelte | 3 +- .../src/components/ScheduleView.svelte | 7 +- .../src/components/TzDateEditor.svelte | 3 +- plugins/hr-resources/src/utils.ts | 28 +-- plugins/hr/package.json | 3 +- plugins/hr/src/index.ts | 11 +- plugins/hr/src/utils.ts | 41 +++ plugins/notification-assets/lang/en.json | 3 +- plugins/notification-assets/lang/ru.json | 1 + .../components/NotificationSettings.svelte | 2 +- plugins/notification/src/index.ts | 1 + server-plugins/hr-resources/package.json | 3 + server-plugins/hr-resources/src/index.ts | 237 ++++++++++++++++-- server-plugins/hr/package.json | 3 +- server-plugins/hr/src/index.ts | 10 +- .../notification-resources/src/index.ts | 7 +- .../notification-resources/src/types.ts | 3 + 36 files changed, 533 insertions(+), 78 deletions(-) create mode 100644 plugins/contact-resources/src/components/ContactArrayEditor.svelte create mode 100644 plugins/contact-resources/src/components/ContactList.svelte create mode 100644 plugins/hr/src/utils.ts diff --git a/models/calendar/src/index.ts b/models/calendar/src/index.ts index 9b10f8d31f..f7f985935a 100644 --- a/models/calendar/src/index.ts +++ b/models/calendar/src/index.ts @@ -127,6 +127,7 @@ export function createModel (builder: Builder): void { notification.class.NotificationType, core.space.Model, { + hidden: false, label: calendar.string.Reminder, textTemplate: 'Reminder: {doc}', htmlTemplate: 'Reminder: {doc}', diff --git a/models/contact/src/index.ts b/models/contact/src/index.ts index 71ebf62cf5..aeb79ad528 100644 --- a/models/contact/src/index.ts +++ b/models/contact/src/index.ts @@ -305,6 +305,10 @@ export function createModel (builder: Builder): void { inlineEditor: contact.component.EmployeeArrayEditor }) + builder.mixin(contact.class.Contact, core.class.Class, view.mixin.ArrayEditor, { + inlineEditor: contact.component.ContactArrayEditor + }) + builder.mixin(contact.class.Member, core.class.Class, view.mixin.ObjectPresenter, { presenter: contact.component.MemberPresenter }) diff --git a/models/contact/src/plugin.ts b/models/contact/src/plugin.ts index 2082a6e6cc..df9348f777 100644 --- a/models/contact/src/plugin.ts +++ b/models/contact/src/plugin.ts @@ -43,6 +43,7 @@ export default mergeIds(contactId, contact, { MemberPresenter: '' as AnyComponent, EditMember: '' as AnyComponent, EmployeeArrayEditor: '' as AnyComponent, + ContactArrayEditor: '' as AnyComponent, EmployeeEditor: '' as AnyComponent, CreateEmployee: '' as AnyComponent, AccountArrayEditor: '' as AnyComponent, diff --git a/models/hr/package.json b/models/hr/package.json index 1e062773fb..4c8b6bf10a 100644 --- a/models/hr/package.json +++ b/models/hr/package.json @@ -31,6 +31,7 @@ "@hcengineering/contact": "^0.6.11", "@hcengineering/platform": "^0.6.8", "@hcengineering/model-core": "^0.6.0", + "@hcengineering/notification": "^0.6.5", "@hcengineering/model-view": "^0.6.0", "@hcengineering/model-workbench": "^0.6.1", "@hcengineering/model-contact": "^0.6.1", diff --git a/models/hr/src/index.ts b/models/hr/src/index.ts index 457a749984..1c7cf36f2c 100644 --- a/models/hr/src/index.ts +++ b/models/hr/src/index.ts @@ -13,7 +13,7 @@ // limitations under the License. // -import { Employee } from '@hcengineering/contact' +import { Contact, Employee } from '@hcengineering/contact' import { Arr, Class, Domain, DOMAIN_MODEL, IndexKind, Markup, Ref, Type } from '@hcengineering/core' import { Department, DepartmentMember, hrId, Request, RequestType, Staff, TzDate } from '@hcengineering/hr' import { @@ -40,6 +40,7 @@ import view, { classPresenter, createAction } from '@hcengineering/model-view' import workbench from '@hcengineering/model-workbench' import { Asset, IntlString } from '@hcengineering/platform' import hr from './plugin' +import notification from '@hcengineering/notification' export const DOMAIN_HR = 'hr' as Domain @@ -70,6 +71,9 @@ export class TDepartment extends TSpace implements Department { @Prop(ArrOf(TypeRef(hr.class.DepartmentMember)), contact.string.Members) declare members: Arr> + + @Prop(ArrOf(TypeRef(contact.class.Contact)), hr.string.Subscribers) + subscribers?: Arr> } @Model(hr.class.DepartmentMember, contact.class.EmployeeAccount) @@ -405,6 +409,45 @@ export function createModel (builder: Builder): void { builder.mixin(hr.class.Request, core.class.Class, view.mixin.ObjectPresenter, { presenter: hr.component.RequestPresenter }) + + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: true, + label: hr.string.Request, + textTemplate: 'New request: {doc}', + htmlTemplate: 'New request: {doc}', + subjectTemplate: 'New request' + }, + hr.ids.CreateRequestNotifcation + ) + + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: true, + label: hr.string.Request, + textTemplate: 'Request updated: {doc}', + htmlTemplate: 'Request updated: {doc}', + subjectTemplate: 'Request updated' + }, + hr.ids.UpdateRequestNotifcation + ) + + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: true, + label: hr.string.Request, + textTemplate: 'Request removed: {doc}', + htmlTemplate: 'Request removed: {doc}', + subjectTemplate: 'Request removed' + }, + hr.ids.RemoveRequestNotifcation + ) } export { hrOperation } from './migration' diff --git a/models/hr/src/plugin.ts b/models/hr/src/plugin.ts index a73d86b7c7..9c5888af73 100644 --- a/models/hr/src/plugin.ts +++ b/models/hr/src/plugin.ts @@ -31,7 +31,8 @@ export default mergeIds(hrId, hr, { PTO2: '' as IntlString, Remote: '' as IntlString, Overtime: '' as IntlString, - Overtime2: '' as IntlString + Overtime2: '' as IntlString, + Subscribers: '' as IntlString }, component: { Structure: '' as AnyComponent, diff --git a/models/notification/src/index.ts b/models/notification/src/index.ts index 65f84655d2..2891b61bf8 100644 --- a/models/notification/src/index.ts +++ b/models/notification/src/index.ts @@ -84,6 +84,7 @@ export class TNotificationType extends TDoc implements NotificationType { textTemplate!: string htmlTemplate!: string subjectTemplate!: string + hidden!: boolean } @Model(notification.class.NotificationProvider, core.class.Doc, DOMAIN_MODEL) @@ -130,6 +131,7 @@ export function createModel (builder: Builder): void { core.space.Model, { label: notification.string.MentionNotification, + hidden: false, textTemplate: '{sender} mentioned you in {doc} {data}', htmlTemplate: '

{sender} mentioned you in {doc}

{data}', subjectTemplate: 'You was mentioned in {doc}' @@ -141,7 +143,8 @@ export function createModel (builder: Builder): void { notification.class.NotificationType, core.space.Model, { - label: notification.string.DMNotification, + label: notification.string.DM, + hidden: false, textTemplate: '{sender} has send you a message: {doc} {data}', htmlTemplate: '

{sender} has send you a message {doc}

{data}', subjectTemplate: 'You have new DM message in {doc}' diff --git a/models/notification/src/plugin.ts b/models/notification/src/plugin.ts index 6c9eb1ec7e..6351df4170 100644 --- a/models/notification/src/plugin.ts +++ b/models/notification/src/plugin.ts @@ -21,6 +21,7 @@ import { AnyComponent } from '@hcengineering/ui' export default mergeIds(notificationId, notification, { string: { LastView: '' as IntlString, + DM: '' as IntlString, DMNotification: '' as IntlString, MentionNotification: '' as IntlString, PlatformNotification: '' as IntlString, diff --git a/models/server-hr/package.json b/models/server-hr/package.json index c03b97add3..28669a7146 100644 --- a/models/server-hr/package.json +++ b/models/server-hr/package.json @@ -28,6 +28,8 @@ "@hcengineering/core": "^0.6.21", "@hcengineering/model": "^0.6.0", "@hcengineering/platform": "^0.6.8", + "@hcengineering/hr": "^0.6.0", + "@hcengineering/server-notification": "^0.6.0", "@hcengineering/server-hr": "^0.6.0", "@hcengineering/server-core": "^0.6.1" } diff --git a/models/server-hr/src/index.ts b/models/server-hr/src/index.ts index 5be255ba4f..bffff190d6 100644 --- a/models/server-hr/src/index.ts +++ b/models/server-hr/src/index.ts @@ -18,9 +18,31 @@ import { Builder } from '@hcengineering/model' import serverCore from '@hcengineering/server-core' import core from '@hcengineering/core' import serverHr from '@hcengineering/server-hr' +import serverNotification from '@hcengineering/server-notification' +import hr from '@hcengineering/hr' export function createModel (builder: Builder): void { builder.createDoc(serverCore.class.Trigger, core.space.Model, { trigger: serverHr.trigger.OnDepartmentStaff }) + + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverHr.trigger.OnRequestCreate + }) + + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverHr.trigger.OnRequestUpdate + }) + + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverHr.trigger.OnRequestRemove + }) + + builder.mixin(hr.class.Request, core.class.Class, serverNotification.mixin.HTMLPresenter, { + presenter: serverHr.function.RequestHTMLPresenter + }) + + builder.mixin(hr.class.Request, core.class.Class, serverNotification.mixin.TextPresenter, { + presenter: serverHr.function.RequestTextPresenter + }) } diff --git a/models/task/src/index.ts b/models/task/src/index.ts index 4930a0eb8c..ece159d044 100644 --- a/models/task/src/index.ts +++ b/models/task/src/index.ts @@ -572,6 +572,7 @@ export function createModel (builder: Builder): void { core.space.Model, { label: task.string.Assigned, + hidden: false, textTemplate: '{doc} was assigned to you by {sender}', htmlTemplate: '

{doc} was assigned to you by {sender}

', subjectTemplate: '{doc} was assigned to you' diff --git a/packages/presentation/src/components/CombineAvatars.svelte b/packages/presentation/src/components/CombineAvatars.svelte index 9190369418..3ac1b7ae15 100644 --- a/packages/presentation/src/components/CombineAvatars.svelte +++ b/packages/presentation/src/components/CombineAvatars.svelte @@ -15,18 +15,18 @@ + + diff --git a/plugins/contact-resources/src/components/ContactList.svelte b/plugins/contact-resources/src/components/ContactList.svelte new file mode 100644 index 0000000000..8acc110859 --- /dev/null +++ b/plugins/contact-resources/src/components/ContactList.svelte @@ -0,0 +1,99 @@ + + + + diff --git a/plugins/contact-resources/src/index.ts b/plugins/contact-resources/src/index.ts index 71c598530b..0fe7769178 100644 --- a/plugins/contact-resources/src/index.ts +++ b/plugins/contact-resources/src/index.ts @@ -55,6 +55,7 @@ import EmployeeRefPresenter from './components/EmployeeRefPresenter.svelte' import ChannelFilter from './components/ChannelFilter.svelte' import AccountBox from './components/AccountBox.svelte' import MergeEmployee from './components/MergeEmployee.svelte' +import ContactArrayEditor from './components/ContactArrayEditor.svelte' import contact from './plugin' import { employeeSort, @@ -154,6 +155,7 @@ export default async (): Promise => ({ OpenChannel: openChannelURL }, component: { + ContactArrayEditor, PersonEditor, OrganizationEditor, ContactPresenter, diff --git a/plugins/hr-assets/lang/en.json b/plugins/hr-assets/lang/en.json index 67ddbb4a3f..fe2bcea72c 100644 --- a/plugins/hr-assets/lang/en.json +++ b/plugins/hr-assets/lang/en.json @@ -40,6 +40,7 @@ "Member": "Member", "Members": "Members", "NoMembers": "No members added", - "AddMember": "Add member" + "AddMember": "Add member", + "Subscribers": "Subscribers" } } diff --git a/plugins/hr-assets/lang/ru.json b/plugins/hr-assets/lang/ru.json index 357c8e22f7..e7a676e4c6 100644 --- a/plugins/hr-assets/lang/ru.json +++ b/plugins/hr-assets/lang/ru.json @@ -40,6 +40,7 @@ "Member": "Сотрудник", "Members": "Сотрудники", "NoMembers": "Нет добавленных сотрудников", - "AddMember": "Добавить сотрудника" + "AddMember": "Добавить сотрудника", + "Subscribers": "Подписчики" } } diff --git a/plugins/hr-resources/src/components/CreateRequest.svelte b/plugins/hr-resources/src/components/CreateRequest.svelte index 5323828b8f..9559543cb9 100644 --- a/plugins/hr-resources/src/components/CreateRequest.svelte +++ b/plugins/hr-resources/src/components/CreateRequest.svelte @@ -17,13 +17,12 @@ import calendar from '@hcengineering/calendar' import { Employee } from '@hcengineering/contact' import core, { DocumentQuery, generateId, Ref } from '@hcengineering/core' - import { Request, RequestType, Staff } from '@hcengineering/hr' + import { Request, RequestType, Staff, toTzDate } from '@hcengineering/hr' import { translate } from '@hcengineering/platform' import { Card, createQuery, EmployeeBox, getClient } from '@hcengineering/presentation' import ui, { Button, DateRangePresenter, DropdownLabelsIntl, IconAttachment } from '@hcengineering/ui' import { createEventDispatcher } from 'svelte' import hr from '../plugin' - import { toTzDate } from '../utils' export let staff: Staff export let date: Date diff --git a/plugins/hr-resources/src/components/RequestPresenter.svelte b/plugins/hr-resources/src/components/RequestPresenter.svelte index 28096b7fb4..e9fa62fb28 100644 --- a/plugins/hr-resources/src/components/RequestPresenter.svelte +++ b/plugins/hr-resources/src/components/RequestPresenter.svelte @@ -14,10 +14,9 @@ // limitations under the License. -->