Skip to content

Commit 1e9fea3

Browse files
UBERF-7239: Support short/custom links in inbox/chat/planner (#5815)
Signed-off-by: Kristina Fefelova <[email protected]>
1 parent 61a0833 commit 1e9fea3

File tree

55 files changed

+630
-244
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+630
-244
lines changed

Diff for: models/document/src/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,11 @@ function defineDocument (builder: Builder): void {
301301
encode: document.function.GetObjectLinkFragment
302302
})
303303

304+
builder.mixin(document.class.Document, core.class.Class, view.mixin.LinkIdProvider, {
305+
encode: document.function.GetDocumentLinkId,
306+
decode: document.function.ParseDocumentId
307+
})
308+
304309
builder.mixin(document.class.Document, core.class.Class, view.mixin.ObjectIcon, {
305310
component: document.component.DocumentIcon
306311
})

Diff for: models/recruit/src/index.ts

+20
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,26 @@ export function createModel (builder: Builder): void {
932932
encode: recruit.function.GetIdObjectLinkFragment
933933
})
934934

935+
builder.mixin(recruit.class.Applicant, core.class.Class, view.mixin.LinkIdProvider, {
936+
encode: recruit.function.IdProvider,
937+
decode: recruit.function.ParseLinkId
938+
})
939+
940+
builder.mixin(recruit.class.Opinion, core.class.Class, view.mixin.LinkIdProvider, {
941+
encode: recruit.function.IdProvider,
942+
decode: recruit.function.ParseLinkId
943+
})
944+
945+
builder.mixin(recruit.class.Review, core.class.Class, view.mixin.LinkIdProvider, {
946+
encode: recruit.function.IdProvider,
947+
decode: recruit.function.ParseLinkId
948+
})
949+
950+
builder.mixin(recruit.class.Vacancy, core.class.Class, view.mixin.LinkIdProvider, {
951+
encode: recruit.function.IdProvider,
952+
decode: recruit.function.ParseLinkId
953+
})
954+
935955
builder.createDoc(
936956
view.class.ActionCategory,
937957
core.space.Model,

Diff for: models/recruit/src/plugin.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export default mergeIds(recruitId, recruit, {
5858
GetTalentId: '' as Resource<(doc: Doc, props: Record<string, any>) => Promise<string>>,
5959
HideDoneState: '' as ViewQueryAction,
6060
HideArchivedVacancies: '' as ViewQueryAction,
61-
ApplicantHasEmail: '' as Resource<ViewActionAvailabilityFunction>
61+
ApplicantHasEmail: '' as Resource<ViewActionAvailabilityFunction>,
62+
ParseLinkId: '' as Resource<(id: string) => Promise<Ref<Doc> | undefined>>
6263
},
6364
string: {
6465
ApplicationsShort: '' as IntlString,

Diff for: models/server-document/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"@hcengineering/server-notification": "^0.6.1",
3636
"@hcengineering/model-core": "^0.6.0",
3737
"@hcengineering/document": "^0.6.0",
38-
"@hcengineering/server-document": "^0.6.0"
38+
"@hcengineering/server-document": "^0.6.0",
39+
"@hcengineering/server-view": "^0.6.0"
3940
}
4041
}

Diff for: models/server-document/src/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import document from '@hcengineering/document'
1010
import serverCore from '@hcengineering/server-core'
1111
import serverDocument from '@hcengineering/server-document'
1212
import serverNotification from '@hcengineering/server-notification'
13+
import serverView from '@hcengineering/server-view'
1314

1415
export { serverDocumentId } from '@hcengineering/server-document'
1516

@@ -22,6 +23,10 @@ export function createModel (builder: Builder): void {
2223
presenter: serverDocument.function.DocumentTextPresenter
2324
})
2425

26+
builder.mixin(document.class.Document, core.class.Class, serverView.mixin.ServerLinkIdProvider, {
27+
encode: serverDocument.function.DocumentLinkIdProvider
28+
})
29+
2530
builder.mixin(document.class.Document, core.class.Class, serverCore.mixin.SearchPresenter, {
2631
searchConfig: {
2732
iconConfig: {

Diff for: models/server-recruit/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"@hcengineering/server-core": "^0.6.1",
3838
"@hcengineering/model-recruit": "^0.6.0",
3939
"@hcengineering/notification": "^0.6.23",
40-
"@hcengineering/server-notification": "^0.6.1"
40+
"@hcengineering/server-notification": "^0.6.1",
41+
"@hcengineering/server-view": "^0.6.0"
4142
}
4243
}

Diff for: models/server-recruit/src/index.ts

+17
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import serverNotification from '@hcengineering/server-notification'
2323
import serverRecruit from '@hcengineering/server-recruit'
2424
import serverContact from '@hcengineering/server-contact'
2525
import contact from '@hcengineering/contact'
26+
import serverView from '@hcengineering/server-view'
2627

2728
export { serverRecruitId } from '@hcengineering/server-recruit'
2829

@@ -43,6 +44,22 @@ export function createModel (builder: Builder): void {
4344
presenter: serverRecruit.function.VacancyTextPresenter
4445
})
4546

47+
builder.mixin(recruit.class.Applicant, core.class.Class, serverView.mixin.ServerLinkIdProvider, {
48+
encode: serverRecruit.function.LinkIdProvider
49+
})
50+
51+
builder.mixin(recruit.class.Opinion, core.class.Class, serverView.mixin.ServerLinkIdProvider, {
52+
encode: serverRecruit.function.LinkIdProvider
53+
})
54+
55+
builder.mixin(recruit.class.Review, core.class.Class, serverView.mixin.ServerLinkIdProvider, {
56+
encode: serverRecruit.function.LinkIdProvider
57+
})
58+
59+
builder.mixin(recruit.class.Vacancy, core.class.Class, serverView.mixin.ServerLinkIdProvider, {
60+
encode: serverRecruit.function.LinkIdProvider
61+
})
62+
4663
builder.createDoc(serverCore.class.Trigger, core.space.Model, {
4764
trigger: serverRecruit.trigger.OnRecruitUpdate
4865
})

Diff for: models/server-tracker/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
"@hcengineering/server-notification": "^0.6.1",
3737
"@hcengineering/model-tracker": "^0.6.0",
3838
"@hcengineering/server-tracker": "^0.6.0",
39-
"@hcengineering/contact": "^0.6.24"
39+
"@hcengineering/contact": "^0.6.24",
40+
"@hcengineering/model-core": "^0.6.0",
41+
"@hcengineering/server-view": "^0.6.0"
4042
}
4143
}

Diff for: models/server-tracker/src/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import serverCore from '@hcengineering/server-core'
2121
import serverNotification from '@hcengineering/server-notification'
2222
import serverTracker from '@hcengineering/server-tracker'
2323
import contact from '@hcengineering/contact'
24+
import serverView from '@hcengineering/server-view'
2425

2526
export { serverTrackerId } from '@hcengineering/server-tracker'
2627

@@ -37,6 +38,10 @@ export function createModel (builder: Builder): void {
3738
presenter: serverTracker.function.IssueNotificationContentProvider
3839
})
3940

41+
builder.mixin(tracker.class.Issue, core.class.Class, serverView.mixin.ServerLinkIdProvider, {
42+
encode: serverTracker.function.IssueLinkIdProvider
43+
})
44+
4045
builder.mixin(tracker.class.Issue, core.class.Class, serverCore.mixin.SearchPresenter, {
4146
searchConfig: {
4247
iconConfig: {

Diff for: models/server-view/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@
3030
"dependencies": {
3131
"@hcengineering/core": "^0.6.32",
3232
"@hcengineering/model": "^0.6.11",
33+
"@hcengineering/model-core": "^0.6.0",
3334
"@hcengineering/platform": "^0.6.11",
34-
"@hcengineering/server-view": "^0.6.0",
35-
"@hcengineering/server-core": "^0.6.1"
35+
"@hcengineering/server-core": "^0.6.1",
36+
"@hcengineering/server-view": "^0.6.0"
3637
}
3738
}

Diff for: models/server-view/src/index.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,23 @@
1313
// limitations under the License.
1414
//
1515

16-
import core from '@hcengineering/core'
17-
import { type Builder } from '@hcengineering/model'
18-
import serverCore from '@hcengineering/server-core'
19-
import serverView from '@hcengineering/server-view'
16+
import core, { type Doc } from '@hcengineering/core'
17+
import { type Builder, Mixin } from '@hcengineering/model'
18+
import serverCore, { type TriggerControl } from '@hcengineering/server-core'
19+
import serverView, { type ServerLinkIdProvider } from '@hcengineering/server-view'
20+
import { TClass } from '@hcengineering/model-core'
21+
import { type Resource } from '@hcengineering/platform'
2022

2123
export { serverViewId } from '@hcengineering/server-view'
2224

25+
@Mixin(serverView.mixin.ServerLinkIdProvider, core.class.Class)
26+
export class TServerLinkIdProvider extends TClass implements ServerLinkIdProvider {
27+
encode!: Resource<(doc: Doc, control: TriggerControl) => Promise<string>>
28+
}
29+
2330
export function createModel (builder: Builder): void {
31+
builder.createModel(TServerLinkIdProvider)
32+
2433
builder.createDoc(serverCore.class.Trigger, core.space.Model, {
2534
trigger: serverView.trigger.OnCustomAttributeRemove
2635
})

Diff for: models/tracker/src/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,11 @@ export function createModel (builder: Builder): void {
438438
builder.mixin(tracker.class.Component, core.class.Class, activity.mixin.ActivityDoc, {})
439439
builder.mixin(tracker.class.IssueTemplate, core.class.Class, activity.mixin.ActivityDoc, {})
440440

441+
builder.mixin(tracker.class.Issue, core.class.Class, view.mixin.LinkIdProvider, {
442+
encode: tracker.function.GetIssueId,
443+
decode: tracker.function.GetIssueIdByIdentifier
444+
})
445+
441446
builder.createDoc(activity.class.ActivityMessageControl, core.space.Model, {
442447
objectClass: tracker.class.Issue,
443448
skip: [

Diff for: models/view/src/index.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ import {
9090
type ObjectIcon,
9191
type ObjectTooltip,
9292
type AttrPresenter,
93-
type AttributeCategory
93+
type AttributeCategory,
94+
type LinkIdProvider
9495
} from '@hcengineering/view'
9596

9697
import view from './plugin'
@@ -352,6 +353,12 @@ export class TLinkProvider extends TClass implements LinkProvider {
352353
encode!: Resource<(doc: Doc, props: Record<string, any>) => Promise<Location>>
353354
}
354355

356+
@Mixin(view.mixin.LinkIdProvider, core.class.Class)
357+
export class TLinkIdProvider extends TClass implements LinkIdProvider {
358+
encode!: Resource<(doc: Doc) => Promise<string>>
359+
decode!: Resource<(id: string) => Promise<Ref<Doc> | undefined>>
360+
}
361+
355362
@Mixin(view.mixin.ObjectPanel, core.class.Class)
356363
export class TObjectPanel extends TClass implements ObjectPanel {
357364
component!: AnyComponent
@@ -450,7 +457,8 @@ export function createModel (builder: Builder): void {
450457
TObjectIdentifier,
451458
TObjectTooltip,
452459
TObjectIcon,
453-
TAttrPresenter
460+
TAttrPresenter,
461+
TLinkIdProvider
454462
)
455463

456464
classPresenter(

Diff for: packages/ui/src/panelup.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ export function openPanel (
5353
})
5454
}
5555

56-
export function closePanel (shoulRedirect: boolean = true): void {
56+
export function closePanel (shouldRedirect: boolean = true): void {
5757
currentLocation = undefined
5858
panelstore.update(() => {
5959
return { panel: undefined }
6060
})
61-
if (shoulRedirect) {
61+
if (shouldRedirect) {
6262
const loc = getLocation()
6363
loc.fragment = undefined
6464
navigate(loc)

Diff for: plugins/chunter-resources/src/components/chat/Chat.svelte

+31-16
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
-->
1515
<script lang="ts">
1616
import { Doc, Ref, Class } from '@hcengineering/core'
17-
import { createQuery } from '@hcengineering/presentation'
17+
import { createQuery, getClient } from '@hcengineering/presentation'
1818
import {
1919
Component,
2020
defineSeparators,
@@ -26,29 +26,32 @@
2626
restoreLocation,
2727
deviceOptionsStore as deviceInfo
2828
} from '@hcengineering/ui'
29-
3029
import { NavigatorModel, SpecialNavModel } from '@hcengineering/workbench'
3130
import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources'
3231
import { onMount } from 'svelte'
3332
import { chunterId } from '@hcengineering/chunter'
34-
import { ActivityMessage } from '@hcengineering/activity'
33+
import view, { decodeObjectURI } from '@hcengineering/view'
34+
import { parseLinkId, getObjectLinkId } from '@hcengineering/view-resources'
3535
3636
import ChatNavigator from './navigator/ChatNavigator.svelte'
3737
import ChannelView from '../ChannelView.svelte'
3838
import { chatSpecials, loadSavedAttachments } from './utils'
3939
import { SelectChannelEvent } from './types'
40-
import { decodeChannelURI, openChannel } from '../../navigation'
40+
import { openChannel } from '../../navigation'
4141
4242
const notificationsClient = InboxNotificationsClientImpl.getClient()
4343
const contextByDocStore = notificationsClient.contextByDoc
4444
const objectQuery = createQuery()
45+
const client = getClient()
4546
4647
const navigatorModel: NavigatorModel = {
4748
spaces: [],
4849
specials: chatSpecials
4950
}
5051
51-
let selectedData: { _id: Ref<Doc>, _class: Ref<Class<Doc>> } | undefined = undefined
52+
const linkProviders = client.getModel().findAllSync(view.mixin.LinkIdProvider, {})
53+
54+
let selectedData: { id: string, _class: Ref<Class<Doc>> } | undefined = undefined
5255
5356
let currentSpecial: SpecialNavModel | undefined
5457
@@ -58,10 +61,18 @@
5861
syncLocation(loc)
5962
})
6063
61-
$: void loadObject(selectedData?._id, selectedData?._class)
64+
$: void loadObject(selectedData?.id, selectedData?._class)
6265
63-
async function loadObject (_id?: Ref<Doc>, _class?: Ref<Class<Doc>>): Promise<void> {
64-
if (_id == null || _class == null || _class === '') {
66+
async function loadObject (id?: string, _class?: Ref<Class<Doc>>): Promise<void> {
67+
if (id == null || _class == null || _class === '') {
68+
object = undefined
69+
objectQuery.unsubscribe()
70+
return
71+
}
72+
73+
const _id: Ref<Doc> | undefined = await parseLinkId(linkProviders, id, _class)
74+
75+
if (_id === undefined) {
6576
object = undefined
6677
objectQuery.unsubscribe()
6778
return
@@ -84,7 +95,7 @@
8495
8596
const id = loc.path[3]
8697
87-
if (!id) {
98+
if (id == null || id === '') {
8899
currentSpecial = undefined
89100
selectedData = undefined
90101
object = undefined
@@ -98,26 +109,30 @@
98109
selectedData = undefined
99110
object = undefined
100111
} else {
101-
const [_id, _class] = decodeChannelURI(loc.path[3])
102-
selectedData = { _id, _class }
112+
const [id, _class] = decodeObjectURI(loc.path[3])
113+
selectedData = { id, _class }
103114
}
104115
}
105116
106-
function handleChannelSelected (event: CustomEvent): void {
117+
async function handleChannelSelected (event: CustomEvent): Promise<void> {
107118
if (event.detail === null) {
108119
selectedData = undefined
109120
return
110121
}
111122
112123
const detail = (event.detail ?? {}) as SelectChannelEvent
124+
const _class = detail.object._class
125+
const _id = detail.object._id
126+
127+
const id = await getObjectLinkId(linkProviders, _id, _class, detail.object)
113128
114-
selectedData = { _id: detail.object._id, _class: detail.object._class }
129+
selectedData = { id, _class }
115130
116-
if (selectedData._id !== object?._id) {
131+
if (_id !== object?._id) {
117132
object = detail.object
118133
}
119134
120-
openChannel(selectedData._id, selectedData._class)
135+
openChannel(selectedData.id, selectedData._class)
121136
}
122137
123138
defineSeparators('chat', [
@@ -134,7 +149,7 @@
134149
{#if $deviceInfo.navigator.visible}
135150
<div class="antiPanel-navigator {$deviceInfo.navigator.direction === 'horizontal' ? 'portrait' : 'landscape'}">
136151
<div class="antiPanel-wrap__content hulyNavPanel-container">
137-
<ChatNavigator objectId={selectedData?._id} {object} {currentSpecial} on:select={handleChannelSelected} />
152+
<ChatNavigator {object} {currentSpecial} on:select={handleChannelSelected} />
138153
</div>
139154
<Separator name="chat" float={$deviceInfo.navigator.float ? 'navigator' : true} index={0} />
140155
</div>

Diff for: plugins/chunter-resources/src/components/chat/navigator/ChatNavGroup.svelte

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import ChatNavSection from './ChatNavSection.svelte'
2626
import chunter from '../../../plugin'
2727
28-
export let objectId: Ref<Doc> | undefined
2928
export let object: Doc | undefined
3029
export let model: ChatNavGroupModel
3130
@@ -191,7 +190,7 @@
191190
id={section.id}
192191
objects={section.objects}
193192
{contexts}
194-
{objectId}
193+
objectId={object?._id}
195194
header={section.label}
196195
actions={getSectionActions(section, contexts)}
197196
sortFn={model.sortFn}

0 commit comments

Comments
 (0)