Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
This commit is contained in:
Denis Bykhov 2023-02-01 17:27:15 +06:00 committed by GitHub
parent 6b05833c8b
commit 2a2705f6fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 69 additions and 21 deletions

View File

@ -185,3 +185,17 @@ export interface IdMap<T extends Doc> extends Map<Ref<T>, T> {}
export function toIdMap<T extends Doc> (arr: T[]): IdMap<T> {
return new Map(arr.map((p) => [p._id, p]))
}
/**
* @public
*/
export function concatLink (host: string, path: string): string {
if (!host.endsWith('/') && !path.startsWith('/')) {
return `${host}/${path}`
} else if (host.endsWith('/') && path.startsWith('/')) {
const newPath = path.slice(1)
return `${host}${newPath}`
} else {
return `${host}${path}`
}
}

View File

@ -19,6 +19,7 @@
import { createEventDispatcher } from 'svelte'
import login from '@hcengineering/login'
import gmail from '../plugin'
import { concatLink } from '@hcengineering/core'
const dispatch = createEventDispatcher()
@ -27,7 +28,8 @@
async function sendRequest (): Promise<void> {
connecting = true
const url = new URL(gmailUrl + '/signin')
const link = concatLink(gmailUrl, '/signin')
const url = new URL(link)
url.search = new URLSearchParams({
redirectURL: window.location.href
}).toString()

View File

@ -19,6 +19,7 @@
import login from '@hcengineering/login'
import PinPad from './PinPad.svelte'
import telegram from '../plugin'
import { concatLink } from '@hcengineering/core'
const dispatch = createEventDispatcher()
@ -60,7 +61,7 @@
async function sendRequest (path: string, data: any): Promise<any> {
connecting = true
const response = await fetch(url + path, {
const response = await fetch(concatLink(url, path), {
method: 'POST',
headers: {
Authorization: 'Bearer ' + getMetadata(login.metadata.LoginToken),

View File

@ -21,7 +21,7 @@
import telegram from '../plugin'
import { getClient } from '@hcengineering/presentation'
import setting from '@hcengineering/setting'
import { getCurrentAccount, Ref, Space } from '@hcengineering/core'
import { concatLink, getCurrentAccount, Ref, Space } from '@hcengineering/core'
const dispatch = createEventDispatcher()
@ -63,7 +63,7 @@
async function sendRequest (path: string, data: any): Promise<any> {
connecting = true
const response = await fetch(url + path, {
const response = await fetch(concatLink(url, path), {
method: 'POST',
headers: {
Authorization: 'Bearer ' + getMetadata(login.metadata.LoginToken),

View File

@ -21,6 +21,7 @@ import Connect from './components/Connect.svelte'
import Reconnect from './components/Reconnect.svelte'
import IconTelegram from './components/icons/TelegramColor.svelte'
import TxSharedCreate from './components/activity/TxSharedCreate.svelte'
import { concatLink } from '@hcengineering/core'
export default async (): Promise<Resources> => ({
component: {
@ -35,7 +36,7 @@ export default async (): Promise<Resources> => ({
handler: {
DisconnectHandler: async () => {
const url = getMetadata(login.metadata.TelegramUrl) ?? ''
await fetch(url + '/signout', {
await fetch(concatLink(url, '/signout'), {
method: 'POST',
headers: {
Authorization: 'Bearer ' + (getMetadata(login.metadata.LoginToken) ?? ''),

View File

@ -28,7 +28,8 @@ import core, {
TxProcessor,
TxUpdateDoc,
TxRemoveDoc,
TxCollectionCUD
TxCollectionCUD,
concatLink
} from '@hcengineering/core'
import login from '@hcengineering/login'
import { getMetadata } from '@hcengineering/platform'
@ -41,7 +42,9 @@ import { workbenchId } from '@hcengineering/workbench'
export async function channelHTMLPresenter (doc: Doc, control: TriggerControl): Promise<string> {
const channel = doc as ChunterSpace
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${chunterId}/${channel._id}">${channel.name}</a>`
const path = `${workbenchId}/${control.workspace.name}/${chunterId}/${channel._id}`
const link = concatLink(front, path)
return `<a href="${link}">${channel.name}</a>`
}
/**

View File

@ -15,7 +15,7 @@
//
import contact, { Contact, contactId, formatName, Organization, Person } from '@hcengineering/contact'
import core, { Doc, Tx, TxCreateDoc, TxRemoveDoc, TxUpdateDoc } from '@hcengineering/core'
import core, { concatLink, Doc, Tx, TxCreateDoc, TxRemoveDoc, TxUpdateDoc } from '@hcengineering/core'
import login from '@hcengineering/login'
import { getMetadata } from '@hcengineering/platform'
import type { TriggerControl } from '@hcengineering/server-core'
@ -75,9 +75,9 @@ export async function OnContactDelete (tx: Tx, { findAll, hierarchy, storageFx }
export function personHTMLPresenter (doc: Doc, control: TriggerControl): string {
const person = doc as Person
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${contactId}#${view.component.EditDoc}|${
person._id
}|${person._class}|content">${formatName(person.name)}</a>`
const path = `${workbenchId}/${control.workspace.name}/${contactId}#${view.component.EditDoc}|${person._id}|${person._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">${formatName(person.name)}</a>`
}
/**
@ -94,7 +94,9 @@ export function personTextPresenter (doc: Doc): string {
export function organizationHTMLPresenter (doc: Doc, control: TriggerControl): string {
const organization = doc as Organization
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${contactId}#${view.component.EditDoc}|${organization._id}|${organization._class}|content">${organization.name}</a>`
const path = `${workbenchId}/${control.workspace.name}/${contactId}#${view.component.EditDoc}|${organization._id}|${organization._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">${organization.name}</a>`
}
/**

View File

@ -13,7 +13,7 @@
// limitations under the License.
//
import { Doc } from '@hcengineering/core'
import { concatLink, Doc } from '@hcengineering/core'
import { inventoryId, Product } from '@hcengineering/inventory'
import login from '@hcengineering/login'
import { getMetadata } from '@hcengineering/platform'
@ -27,7 +27,9 @@ import { workbenchId } from '@hcengineering/workbench'
export async function productHTMLPresenter (doc: Doc, control: TriggerControl): Promise<string> {
const product = doc as Product
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${inventoryId}/Products/#${view.component.EditDoc}|${product._id}|${product._class}|content">${product.name}</a>`
const path = `${workbenchId}/${control.workspace.name}/${inventoryId}/Products/#${view.component.EditDoc}|${product._id}|${product._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">${product.name}</a>`
}
/**

View File

@ -15,6 +15,7 @@
import core, {
AttachedDoc,
concatLink,
Doc,
Tx,
TxCollectionCUD,
@ -37,7 +38,9 @@ import { addAssigneeNotification } from '@hcengineering/server-task-resources'
export async function leadHTMLPresenter (doc: Doc, control: TriggerControl): Promise<string> {
const lead = doc as Lead
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${leadId}/${lead.space}/#${view.component.EditDoc}|${lead._id}|${lead._class}|content">${lead.title}</a>`
const path = `${workbenchId}/${control.workspace.name}/${leadId}/${lead.space}/#${view.component.EditDoc}|${lead._id}|${lead._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">${lead.title}</a>`
}
/**

View File

@ -16,6 +16,7 @@
import contact from '@hcengineering/contact'
import core, {
AttachedDoc,
concatLink,
Doc,
Tx,
TxCollectionCUD,
@ -39,7 +40,9 @@ import { workbenchId } from '@hcengineering/workbench'
export async function vacancyHTMLPresenter (doc: Doc, control: TriggerControl): Promise<string> {
const vacancy = doc as Vacancy
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${recruitId}/${vacancy._id}/#${recruit.component.EditVacancy}|${vacancy._id}|${vacancy._class}|content">${vacancy.name}</a>`
const path = `${workbenchId}/${control.workspace.name}/${recruitId}/${vacancy._id}/#${recruit.component.EditVacancy}|${vacancy._id}|${vacancy._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">${vacancy.name}</a>`
}
/**
@ -56,7 +59,9 @@ export async function vacancyTextPresenter (doc: Doc): Promise<string> {
export async function applicationHTMLPresenter (doc: Doc, control: TriggerControl): Promise<string> {
const applicant = doc as Applicant
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${recruitId}/${applicant.space}/#${view.component.EditDoc}|${applicant._id}|${applicant._class}|content">APP-${applicant.number}</a>`
const path = `${workbenchId}/${control.workspace.name}/${recruitId}/${applicant.space}/#${view.component.EditDoc}|${applicant._id}|${applicant._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">APP-${applicant.number}</a>`
}
/**

View File

@ -14,7 +14,16 @@
//
import { Employee } from '@hcengineering/contact'
import core, { AttachedDoc, Doc, Ref, Tx, TxCollectionCUD, TxProcessor, TxUpdateDoc } from '@hcengineering/core'
import core, {
AttachedDoc,
concatLink,
Doc,
Ref,
Tx,
TxCollectionCUD,
TxProcessor,
TxUpdateDoc
} from '@hcengineering/core'
import login from '@hcengineering/login'
import { NotificationAction } from '@hcengineering/notification'
import { getMetadata, Resource } from '@hcengineering/platform'
@ -31,7 +40,9 @@ import { workbenchId } from '@hcengineering/workbench'
export async function issueHTMLPresenter (doc: Doc, control: TriggerControl): Promise<string> {
const issue = doc as Issue
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${taskId}/${issue.space}/#${view.component.EditDoc}|${issue._id}|${issue._class}|content">Task-${issue.number}</a>`
const path = `${workbenchId}/${control.workspace.name}/${taskId}/${issue.space}/#${view.component.EditDoc}|${issue._id}|${issue._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">Task-${issue.number}</a>`
}
/**

View File

@ -16,6 +16,7 @@
import { Employee } from '@hcengineering/contact'
import core, {
AttachedDoc,
concatLink,
Doc,
DocumentUpdate,
Ref,
@ -59,7 +60,9 @@ export async function issueHTMLPresenter (doc: Doc, control: TriggerControl): Pr
const issueName = `${team?.identifier ?? '?'}-${issue.number}`
const front = getMetadata(login.metadata.FrontUrl) ?? ''
return `<a href="${front}/${workbenchId}/${control.workspace.name}/${trackerId}/${issue.space}/#${tracker.component.EditIssue}|${issue._id}|${issue._class}|content">${issueName}</a>`
const path = `${workbenchId}/${control.workspace.name}/${trackerId}/${issue.space}/#${tracker.component.EditIssue}|${issue._id}|${issue._class}|content`
const link = concatLink(front, path)
return `<a href="${link}">${issueName}</a>`
}
/**

View File

@ -23,6 +23,7 @@ import contact, {
} from '@hcengineering/contact'
import core, {
AccountRole,
concatLink,
Data,
getWorkspaceId,
Ref,
@ -674,7 +675,7 @@ export async function requestPassword (db: Db, productId: string, email: string)
restore: email
})
const link = `${front}/login/recovery?id=${token}`
const link = concatLink(front, `/login/recovery?id=${token}`)
const text = `We received a request to reset the password for your account. To reset your password, please paste the following link in your web browser's address bar: ${link}. If you have not ordered a password recovery just ignore this letter.`
const html = `<p>We received a request to reset the password for your account. To reset your password, please click the link below: <a href=${link}>Reset password</a></p><p>