From d2f2a1837638f035865a9ff260255c43af4be9b6 Mon Sep 17 00:00:00 2001 From: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com> Date: Thu, 28 Apr 2022 16:05:28 +0600 Subject: [PATCH] Link presenters init (#1579) Signed-off-by: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com> --- models/view/src/index.ts | 21 +++- models/view/src/plugin.ts | 4 +- .../src/components/message/Nodes.svelte | 12 +++ packages/theme/styles/_layouts.scss | 2 + .../src/components/Message.svelte | 26 ++++- plugins/view-assets/lang/en.json | 4 +- plugins/view-assets/lang/ru.json | 4 +- .../src/components/LinkPresenter.svelte | 40 +++++++ .../src/components/icons/Play.svelte | 26 +++++ .../linkPresenters/GithubPresenter.svelte | 102 ++++++++++++++++++ .../linkPresenters/YoutubePresenter.svelte | 99 +++++++++++++++++ plugins/view-resources/src/index.ts | 7 +- plugins/view-resources/src/plugin.ts | 4 +- plugins/view/src/index.ts | 11 +- 14 files changed, 354 insertions(+), 8 deletions(-) create mode 100644 plugins/view-resources/src/components/LinkPresenter.svelte create mode 100644 plugins/view-resources/src/components/icons/Play.svelte create mode 100644 plugins/view-resources/src/components/linkPresenters/GithubPresenter.svelte create mode 100644 plugins/view-resources/src/components/linkPresenters/YoutubePresenter.svelte diff --git a/models/view/src/index.ts b/models/view/src/index.ts index 89c1238621..65b3f50cbb 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -27,6 +27,7 @@ import type { HTMLPresenter, IgnoreActions, KeyBinding, + LinkPresenter, ObjectEditor, ObjectEditorHeader, ObjectFactory, @@ -199,6 +200,13 @@ export class TPreviewPresenter extends TClass implements PreviewPresenter { presenter!: AnyComponent } +@Model(view.class.LinkPresenter, core.class.Doc, DOMAIN_MODEL) +export class TLinkPresenter extends TDoc implements LinkPresenter { + pattern!: string + + component!: AnyComponent +} + export function createModel (builder: Builder): void { builder.createModel( TAttributeEditor, @@ -216,7 +224,8 @@ export function createModel (builder: Builder): void { TSpaceName, TTextPresenter, TIgnoreActions, - TPreviewPresenter + TPreviewPresenter, + TLinkPresenter ) classPresenter(builder, core.class.TypeString, view.component.StringPresenter, view.component.StringEditor) @@ -308,6 +317,16 @@ export function createModel (builder: Builder): void { singleInput: true }) + builder.createDoc(view.class.LinkPresenter, core.space.Model, { + pattern: '(www.)?youtube.(com|ru)', + component: view.component.YoutubePresenter + }) + + builder.createDoc(view.class.LinkPresenter, core.space.Model, { + pattern: '(www.)?github.com/', + component: view.component.GithubPresenter + }) + // Should be contributed via individual plugins. // actionTarget(builder, view.action.Open, core.class.Doc, { mode: ['browser', 'context'] }) } diff --git a/models/view/src/plugin.ts b/models/view/src/plugin.ts index d8260d150f..70c8325cb9 100644 --- a/models/view/src/plugin.ts +++ b/models/view/src/plugin.ts @@ -71,7 +71,9 @@ export default mergeIds(viewId, view, { DateEditor: '' as AnyComponent, DatePresenter: '' as AnyComponent, TableView: '' as AnyComponent, - RolePresenter: '' as AnyComponent + RolePresenter: '' as AnyComponent, + YoutubePresenter: '' as AnyComponent, + GithubPresenter: '' as AnyComponent }, string: { Table: '' as IntlString, diff --git a/packages/presentation/src/components/message/Nodes.svelte b/packages/presentation/src/components/message/Nodes.svelte index 9084b5d5d3..66a16747ba 100644 --- a/packages/presentation/src/components/message/Nodes.svelte +++ b/packages/presentation/src/components/message/Nodes.svelte @@ -42,6 +42,8 @@ export let nodes: NodeListOf
{:else if node.nodeName === 'HR'}
+ {:else if node.nodeName === 'IMG'} +
{@html node.outerHTML}
{:else if node.nodeName === 'H1'}

{:else if node.nodeName === 'H2'} @@ -70,3 +72,13 @@ export let nodes: NodeListOf {/if} {/each} {/if} + + \ No newline at end of file diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index cf8c89fcd8..495005d9a2 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -437,6 +437,8 @@ p:last-child { margin-block-end: 0; } .min-w-min { min-width: min-content; } .min-h-0 { min-height: 0; } .max-h-125 { max-height: 31.25rem; } +.max-h-60 { max-height: 15rem; } +.max-w-60 { max-width: 15rem; } .clear-mins { min-width: 0; min-height: 0; diff --git a/plugins/chunter-resources/src/components/Message.svelte b/plugins/chunter-resources/src/components/Message.svelte index 88d5160144..e332c2bdad 100644 --- a/plugins/chunter-resources/src/components/Message.svelte +++ b/plugins/chunter-resources/src/components/Message.svelte @@ -23,7 +23,7 @@ import { Avatar, getClient, MessageViewer } from '@anticrm/presentation' import ui, { ActionIcon, IconMoreH, Menu, showPopup, Label, Tooltip, Button } from '@anticrm/ui' import { Action } from '@anticrm/view' - import { getActions } from '@anticrm/view-resources' + import { getActions, LinkPresenter } from '@anticrm/view-resources' import { createEventDispatcher } from 'svelte' import { AddMessageToSaved, DeleteMessageFromSaved, UnpinMessage } from '../index' import chunter from '../plugin' @@ -152,6 +152,27 @@ $: parentMessage = message as Message $: hasReplies = (parentMessage?.replies?.length ?? 0) > 0 + + $: links = getLinks(message.content) + + function getLinks (content: string): HTMLLinkElement[] { + const parser = new DOMParser() + const parent = parser.parseFromString(content, 'text/html').firstChild?.childNodes[1] as HTMLElement + return parseLinks(parent.childNodes) + } + + function parseLinks (nodes: NodeListOf): HTMLLinkElement[] { + const res: HTMLLinkElement[] = [] + nodes.forEach((p) => { + if (p.nodeType !== Node.TEXT_NODE) { + if (p.nodeName === 'A') { + res.push(p as HTMLLinkElement) + } + res.push(...parseLinks(p.childNodes)) + } + }) + return res + }
@@ -189,6 +210,9 @@
{/if} + {#each links as link} + + {/each} {/if} {#if reactions || (!thread && hasReplies)}