mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-24 01:07:50 +00:00
tsk-371 Create avatar providers in models (#2339)
Signed-off-by: Denis Bunakalya <denis.bunakalya@xored.com>
This commit is contained in:
parent
b600d736b8
commit
8287b4f465
@ -16,6 +16,7 @@
|
|||||||
import {
|
import {
|
||||||
AvatarProvider,
|
AvatarProvider,
|
||||||
AvatarType,
|
AvatarType,
|
||||||
|
GetAvatarUrl,
|
||||||
Channel,
|
Channel,
|
||||||
ChannelProvider,
|
ChannelProvider,
|
||||||
Contact,
|
Contact,
|
||||||
@ -49,9 +50,8 @@ import core, { TAccount, TAttachedDoc, TDoc, TSpace } from '@hcengineering/model
|
|||||||
import presentation from '@hcengineering/model-presentation'
|
import presentation from '@hcengineering/model-presentation'
|
||||||
import view, { actionTemplates, createAction, ViewAction } from '@hcengineering/model-view'
|
import view, { actionTemplates, createAction, ViewAction } from '@hcengineering/model-view'
|
||||||
import workbench from '@hcengineering/model-workbench'
|
import workbench from '@hcengineering/model-workbench'
|
||||||
import type { Asset, IntlString } from '@hcengineering/platform'
|
import type { Asset, IntlString, Resource } from '@hcengineering/platform'
|
||||||
import setting from '@hcengineering/setting'
|
import setting from '@hcengineering/setting'
|
||||||
import { IconSize } from '@hcengineering/ui'
|
|
||||||
import contact from './plugin'
|
import contact from './plugin'
|
||||||
|
|
||||||
export const DOMAIN_CONTACT = 'contact' as Domain
|
export const DOMAIN_CONTACT = 'contact' as Domain
|
||||||
@ -60,7 +60,7 @@ export const DOMAIN_CHANNEL = 'channel' as Domain
|
|||||||
@Model(contact.class.AvatarProvider, core.class.Doc, DOMAIN_MODEL)
|
@Model(contact.class.AvatarProvider, core.class.Doc, DOMAIN_MODEL)
|
||||||
export class TAvatarProvider extends TDoc implements AvatarProvider {
|
export class TAvatarProvider extends TDoc implements AvatarProvider {
|
||||||
type!: AvatarType
|
type!: AvatarType
|
||||||
getUrl!: (uri: string, size: IconSize) => string
|
getUrl!: Resource<GetAvatarUrl>
|
||||||
}
|
}
|
||||||
|
|
||||||
@Model(contact.class.ChannelProvider, core.class.Doc, DOMAIN_MODEL)
|
@Model(contact.class.ChannelProvider, core.class.Doc, DOMAIN_MODEL)
|
||||||
@ -370,6 +370,36 @@ export function createModel (builder: Builder): void {
|
|||||||
contact.channelProvider.Homepage
|
contact.channelProvider.Homepage
|
||||||
)
|
)
|
||||||
|
|
||||||
|
builder.createDoc(
|
||||||
|
contact.class.AvatarProvider,
|
||||||
|
core.space.Model,
|
||||||
|
{
|
||||||
|
type: AvatarType.COLOR,
|
||||||
|
getUrl: contact.function.GetColorUrl
|
||||||
|
},
|
||||||
|
contact.avatarProvider.Color
|
||||||
|
)
|
||||||
|
|
||||||
|
builder.createDoc(
|
||||||
|
contact.class.AvatarProvider,
|
||||||
|
core.space.Model,
|
||||||
|
{
|
||||||
|
type: AvatarType.IMAGE,
|
||||||
|
getUrl: contact.function.GetFileUrl
|
||||||
|
},
|
||||||
|
contact.avatarProvider.Image
|
||||||
|
)
|
||||||
|
|
||||||
|
builder.createDoc(
|
||||||
|
contact.class.AvatarProvider,
|
||||||
|
core.space.Model,
|
||||||
|
{
|
||||||
|
type: AvatarType.GRAVATAR,
|
||||||
|
getUrl: contact.function.GetGravatarUrl
|
||||||
|
},
|
||||||
|
contact.avatarProvider.Gravatar
|
||||||
|
)
|
||||||
|
|
||||||
builder.mixin(contact.class.Person, core.class.Class, view.mixin.AttributePresenter, {
|
builder.mixin(contact.class.Person, core.class.Class, view.mixin.AttributePresenter, {
|
||||||
presenter: contact.component.PersonPresenter
|
presenter: contact.component.PersonPresenter
|
||||||
})
|
})
|
||||||
|
@ -13,10 +13,10 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
-->
|
-->
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { AvatarType, AvatarProvider } from '@hcengineering/contact'
|
import contact, { AvatarType, AvatarProvider } from '@hcengineering/contact'
|
||||||
import { Asset, getResource } from '@hcengineering/platform'
|
import { Asset, getResource } from '@hcengineering/platform'
|
||||||
import { AnySvelteComponent, Icon, IconSize } from '@hcengineering/ui'
|
import { AnySvelteComponent, Icon, IconSize } from '@hcengineering/ui'
|
||||||
import { getBlobURL, getAvatarProviderId } from '../utils'
|
import { getBlobURL, getAvatarProviderId, getClient } from '../utils'
|
||||||
import AvatarIcon from './icons/Avatar.svelte'
|
import AvatarIcon from './icons/Avatar.svelte'
|
||||||
|
|
||||||
export let avatar: string | null | undefined = undefined
|
export let avatar: string | null | undefined = undefined
|
||||||
@ -35,15 +35,16 @@
|
|||||||
})
|
})
|
||||||
} else if (avatar) {
|
} else if (avatar) {
|
||||||
const avatarProviderId = getAvatarProviderId(avatar)
|
const avatarProviderId = getAvatarProviderId(avatar)
|
||||||
avatarProvider = avatarProviderId && (await getResource(avatarProviderId))
|
avatarProvider =
|
||||||
|
avatarProviderId && (await getClient().findOne(contact.class.AvatarProvider, { _id: avatarProviderId }))
|
||||||
|
|
||||||
if (!avatarProvider || avatarProvider.type === AvatarType.COLOR) {
|
if (!avatarProvider || avatarProvider.type === AvatarType.COLOR) {
|
||||||
url = undefined
|
url = undefined
|
||||||
} else if (avatarProvider.type === AvatarType.IMAGE) {
|
} else if (avatarProvider.type === AvatarType.IMAGE) {
|
||||||
url = avatarProvider.getUrl(avatar, size)
|
url = (await getResource(avatarProvider.getUrl))(avatar, size)
|
||||||
} else {
|
} else {
|
||||||
const uri = avatar.split('://')[1]
|
const uri = avatar.split('://')[1]
|
||||||
url = avatarProvider.getUrl(uri, size)
|
url = (await getResource(avatarProvider.getUrl))(uri, size)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
url = undefined
|
url = undefined
|
||||||
@ -53,14 +54,18 @@
|
|||||||
$: update(size, avatar, direct)
|
$: update(size, avatar, direct)
|
||||||
|
|
||||||
let style = ''
|
let style = ''
|
||||||
$: if (!avatar || avatarProvider?.type !== AvatarType.COLOR) {
|
|
||||||
|
async function updateStyle (avatar?: string | null, avatarProvider?: AvatarProvider) {
|
||||||
|
if (!avatar || avatarProvider?.type !== AvatarType.COLOR) {
|
||||||
style = ''
|
style = ''
|
||||||
} else {
|
} else {
|
||||||
const uri = avatar.split('://')[1]
|
const uri = avatar.split('://')[1]
|
||||||
|
|
||||||
const color = avatarProvider.getUrl(uri, size)
|
const color = (await getResource(avatarProvider.getUrl))(uri, size)
|
||||||
style = `background-color: ${color}`
|
style = `background-color: ${color}`
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
$: updateStyle(avatar, avatarProvider)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="ava-{size} flex-center avatar-container" class:no-img={!url} {style}>
|
<div class="ava-{size} flex-center avatar-container" class:no-img={!url} {style}>
|
||||||
|
@ -34,7 +34,7 @@ import core, {
|
|||||||
TxResult
|
TxResult
|
||||||
} from '@hcengineering/core'
|
} from '@hcengineering/core'
|
||||||
import login from '@hcengineering/login'
|
import login from '@hcengineering/login'
|
||||||
import { getMetadata, Resource } from '@hcengineering/platform'
|
import { getMetadata } from '@hcengineering/platform'
|
||||||
import { LiveQuery as LQ } from '@hcengineering/query'
|
import { LiveQuery as LQ } from '@hcengineering/query'
|
||||||
import { onDestroy } from 'svelte'
|
import { onDestroy } from 'svelte'
|
||||||
import { deepEqual } from 'fast-equals'
|
import { deepEqual } from 'fast-equals'
|
||||||
@ -281,7 +281,7 @@ export function getAvatarColorForId (id: string): string {
|
|||||||
return AVATAR_COLORS[hash % AVATAR_COLORS.length]
|
return AVATAR_COLORS[hash % AVATAR_COLORS.length]
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getAvatarProviderId (avatar?: string | null): Resource<AvatarProvider> | undefined {
|
export function getAvatarProviderId (avatar?: string | null): Ref<AvatarProvider> | undefined {
|
||||||
if (avatar === null || avatar === undefined || avatar === '') {
|
if (avatar === null || avatar === undefined || avatar === '') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
import { AvatarType, Channel, Contact, Employee, formatName } from '@hcengineering/contact'
|
import { Channel, Contact, Employee, formatName } from '@hcengineering/contact'
|
||||||
import { Class, Client, DocumentQuery, Ref, RelatedDocument, WithLookup } from '@hcengineering/core'
|
import { Class, Client, DocumentQuery, Ref, RelatedDocument, WithLookup } from '@hcengineering/core'
|
||||||
import { leaveWorkspace } from '@hcengineering/login-resources'
|
import { leaveWorkspace } from '@hcengineering/login-resources'
|
||||||
import { Resources } from '@hcengineering/platform'
|
import { Resources } from '@hcengineering/platform'
|
||||||
@ -168,9 +168,9 @@ export default async (): Promise<Resources> => ({
|
|||||||
filter?: { in?: RelatedDocument[], nin?: RelatedDocument[] }
|
filter?: { in?: RelatedDocument[], nin?: RelatedDocument[] }
|
||||||
) => await queryContact(contact.class.Organization, client, query, filter)
|
) => await queryContact(contact.class.Organization, client, query, filter)
|
||||||
},
|
},
|
||||||
avatarProvider: {
|
function: {
|
||||||
Image: { type: AvatarType.IMAGE, getUrl: getFileUrl },
|
GetFileUrl: getFileUrl,
|
||||||
Gravatar: { type: AvatarType.GRAVATAR, getUrl: getGravatarUrl },
|
GetGravatarUrl: getGravatarUrl,
|
||||||
Color: { type: AvatarType.COLOR, getUrl: (uri: string) => uri }
|
GetColorUrl: (uri: string) => uri
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -78,12 +78,17 @@ export enum AvatarType {
|
|||||||
GRAVATAR = 'gravatar'
|
GRAVATAR = 'gravatar'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
export type GetAvatarUrl = (uri: string, size: IconSize) => string
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
export interface AvatarProvider extends Doc {
|
export interface AvatarProvider extends Doc {
|
||||||
type: AvatarType
|
type: AvatarType
|
||||||
getUrl: (uri: string, size: IconSize) => string
|
getUrl: Resource<GetAvatarUrl>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -214,9 +219,14 @@ const contactPlugin = plugin(contactId, {
|
|||||||
Homepage: '' as Ref<ChannelProvider>
|
Homepage: '' as Ref<ChannelProvider>
|
||||||
},
|
},
|
||||||
avatarProvider: {
|
avatarProvider: {
|
||||||
Color: '' as Resource<AvatarProvider>,
|
Color: '' as Ref<AvatarProvider>,
|
||||||
Image: '' as Resource<AvatarProvider>,
|
Image: '' as Ref<AvatarProvider>,
|
||||||
Gravatar: '' as Resource<AvatarProvider>
|
Gravatar: '' as Ref<AvatarProvider>
|
||||||
|
},
|
||||||
|
function: {
|
||||||
|
GetColorUrl: '' as Resource<GetAvatarUrl>,
|
||||||
|
GetFileUrl: '' as Resource<GetAvatarUrl>,
|
||||||
|
GetGravatarUrl: '' as Resource<GetAvatarUrl>
|
||||||
},
|
},
|
||||||
icon: {
|
icon: {
|
||||||
ContactApplication: '' as Asset,
|
ContactApplication: '' as Asset,
|
||||||
|
Loading…
Reference in New Issue
Block a user