diff --git a/packages/panel/src/components/Panel.svelte b/packages/panel/src/components/Panel.svelte index fb6c434e0a..0ab7be5271 100644 --- a/packages/panel/src/components/Panel.svelte +++ b/packages/panel/src/components/Panel.svelte @@ -52,9 +52,9 @@ export let isFullSize = false export let embedded = false export let contentClasses: string | undefined = undefined + export let content: HTMLElement | undefined = undefined let lastHref: string - let scroll: HTMLDivElement let timer: any let lastScrollHeight: number = -1 let count: number = 0 @@ -68,16 +68,16 @@ if (scroll == null) { return } - if (lastScrollHeight <= scroll.scrollHeight && count <= waitCount) { - count = lastScrollHeight < scroll.scrollHeight ? 0 : count + 1 - lastScrollHeight = scroll.scrollHeight + if (content !== undefined && lastScrollHeight <= content?.scrollHeight && count <= waitCount) { + count = lastScrollHeight < content.scrollHeight ? 0 : count + 1 + lastScrollHeight = content.scrollHeight startScrollHeightCheck() - } else { + } else if (content !== undefined) { lastScrollHeight = -1 count = 0 - scroll.scrollTop = $PanelScrollTop[window.location.href] + content.scrollTop = $PanelScrollTop[window.location.href] $PanelScrollTop[window.location.href] = 0 lastHref = window.location.href } @@ -195,7 +195,7 @@ {#if $deviceInfo.isMobile} -
+
{#if !withoutActivity} {#key object._id} @@ -208,7 +208,7 @@
{:else} { if (lastHref === window.location.href && event && event.detail !== $PanelScrollTop[lastHref]) { $PanelScrollTop[lastHref] = event.detail @@ -221,7 +221,13 @@ {#key object._id} {/key} {/if} diff --git a/packages/text-editor/src/components/CollaboratorEditor.svelte b/packages/text-editor/src/components/CollaboratorEditor.svelte index a7eeba5459..ed8bdb5078 100644 --- a/packages/text-editor/src/components/CollaboratorEditor.svelte +++ b/packages/text-editor/src/components/CollaboratorEditor.svelte @@ -61,6 +61,7 @@ export let textNodeActions: TextNodeAction[] = [] export let editorAttributes: { [name: string]: string } = {} export let onExtensions: () => AnyExtension[] = () => [] + export let boundary: HTMLElement | undefined = undefined let element: HTMLElement @@ -227,6 +228,21 @@ ...defaultExtensions, Placeholder.configure({ placeholder: placeHolderStr }), InlineStyleToolbarExtension.configure({ + tippyOptions: { + popperOptions: { + modifiers: [ + { + name: 'preventOverflow', + options: { + boundary, + padding: 8, + altAxis: true, + tether: false + } + } + ] + } + }, element: inlineToolbar, isSupported: () => !readonly, isSelectionOnly: () => false diff --git a/packages/text-editor/src/components/ReferenceInput.svelte b/packages/text-editor/src/components/ReferenceInput.svelte index 04c60da67e..42ccd1773d 100644 --- a/packages/text-editor/src/components/ReferenceInput.svelte +++ b/packages/text-editor/src/components/ReferenceInput.svelte @@ -51,6 +51,7 @@ export let extraActions: RefAction[] | undefined = undefined export let loading: boolean = false export let focusable: boolean = false + export let boundary: HTMLElement | undefined = undefined const client = getClient() const dispatch = createEventDispatcher() @@ -169,6 +170,7 @@ { if (!isEmpty || haveAttachment) { dispatch('message', ev.detail) diff --git a/packages/text-editor/src/components/StyledTextBox.svelte b/packages/text-editor/src/components/StyledTextBox.svelte index 5f1ab2ecfe..b256412050 100644 --- a/packages/text-editor/src/components/StyledTextBox.svelte +++ b/packages/text-editor/src/components/StyledTextBox.svelte @@ -45,6 +45,7 @@ export let enableBackReferences: boolean = false export let enableEmojiReplace: boolean = true export let isScrollable: boolean = true + export let boundary: HTMLElement | undefined = undefined export let attachFile: FileAttachFunction | undefined = undefined @@ -212,6 +213,7 @@ {autofocus} {isScrollable} {extensions} + {boundary} bind:content={rawValue} bind:this={textEditor} on:attach diff --git a/packages/text-editor/src/components/StyledTextEditor.svelte b/packages/text-editor/src/components/StyledTextEditor.svelte index 596835776f..17ee28ba72 100644 --- a/packages/text-editor/src/components/StyledTextEditor.svelte +++ b/packages/text-editor/src/components/StyledTextEditor.svelte @@ -49,6 +49,7 @@ export let full = false export let extensions: AnyExtension[] = [] export let editorAttributes: { [name: string]: string } = {} + export let boundary: HTMLElement | undefined = undefined export let textFormatCategories: TextFormatCategory[] = [ TextFormatCategory.Heading, TextFormatCategory.TextDecoration, @@ -249,6 +250,7 @@ on:blur on:focus supportSubmit={false} + {boundary} /> {/if}
diff --git a/packages/text-editor/src/components/TextEditor.svelte b/packages/text-editor/src/components/TextEditor.svelte index e8666b8110..c512a8baf9 100644 --- a/packages/text-editor/src/components/TextEditor.svelte +++ b/packages/text-editor/src/components/TextEditor.svelte @@ -37,6 +37,7 @@ export let textFormatCategories: TextFormatCategory[] = [] export let supportSubmit = true export let editorAttributes: { [name: string]: string } = {} + export let boundary: HTMLElement | undefined = undefined let element: HTMLElement let editor: Editor @@ -137,6 +138,21 @@ Placeholder.configure({ placeholder: placeHolderStr }), ...extensions, InlineStyleToolbarExtension.configure({ + tippyOptions: { + popperOptions: { + modifiers: [ + { + name: 'preventOverflow', + options: { + boundary, + padding: 8, + altAxis: true, + tether: false + } + } + ] + } + }, element: textEditorToolbar, isSupported: () => true, isSelectionOnly: () => false diff --git a/packages/ui/src/components/Separator.svelte b/packages/ui/src/components/Separator.svelte index df1b9bffdc..d2135d6f3e 100644 --- a/packages/ui/src/components/Separator.svelte +++ b/packages/ui/src/components/Separator.svelte @@ -20,7 +20,8 @@ deviceOptionsStore as deviceInfo, getSeparators, saveSeparator, - SeparatedElement + SeparatedElement, + separatorsStore } from '..' export let prevElementSize: SeparatedItem | undefined = undefined @@ -28,6 +29,7 @@ export let separatorSize: number = 1 export let color: string = 'var(--theme-divider-color)' export let name: string + export let disabledWhen: string[] = [] export let index: number // index = -1 ; for custom sizes without saving to a localStorage const direction: 'horizontal' | 'vertical' = 'horizontal' @@ -52,6 +54,7 @@ maxEnd: -1 } let parentSize: { start: number; end: number; size: number } | null = null + let disabled: boolean = false const fetchSeparators = (): void => { separators = getSeparators(name) @@ -384,9 +387,14 @@ mounted = true } document.addEventListener('resize', checkSizes) + if ($separatorsStore.filter((f) => f === name).length === 0) $separatorsStore = [...$separatorsStore, name] + disabled = $separatorsStore.filter((f) => disabledWhen.findIndex((d) => d === f) !== -1).length > 0 }) onDestroy(() => { document.removeEventListener('resize', checkSizes) + if ($separatorsStore.filter((f) => f === name).length > 0) { + $separatorsStore = $separatorsStore.filter((f) => f !== name) + } }) afterUpdate(() => { if (mounted) checkSibling() @@ -397,6 +405,7 @@ bind:this={separator} style:--separator-size={`${separatorSize}px`} style:background-color={color} + style:pointer-events={disabled ? 'none' : 'all'} class="antiSeparator {direction}" class:hovered={isSeparate} data-size={separatorSize} diff --git a/packages/ui/src/resize.ts b/packages/ui/src/resize.ts index 76ff5ca5c9..f00e5f75b9 100644 --- a/packages/ui/src/resize.ts +++ b/packages/ui/src/resize.ts @@ -10,6 +10,7 @@ // // See the License for the specific language governing permissions and +import { writable } from 'svelte/store' import { DelayedCaller } from './utils' import type { SeparatedItem, DefSeparators } from './types' @@ -123,3 +124,5 @@ export const timeSeparators: DefSeparators = [ { minSize: 25, size: 35, maxSize: 45 }, null ] + +export const separatorsStore = writable([]) diff --git a/plugins/activity-resources/src/components/Activity.svelte b/plugins/activity-resources/src/components/Activity.svelte index f91a06d112..0b9f361f65 100644 --- a/plugins/activity-resources/src/components/Activity.svelte +++ b/plugins/activity-resources/src/components/Activity.svelte @@ -30,6 +30,7 @@ export let transparent: boolean = false export let shouldScroll: boolean = false export let focusIndex: number = -1 + export let boundary: HTMLElement | undefined = undefined getResource(notification.function.GetNotificationClient).then((res) => { updatesStore = res().docUpdatesStore @@ -156,6 +157,7 @@ isNew={newTxIndexes.includes(i)} isNextNew={newTxIndexes.includes(i + 1)} shouldScroll={i === scrollIndex} + {boundary} /> {/each} @@ -164,7 +166,7 @@ {#if showCommenInput}
- +
{/if} diff --git a/plugins/activity-resources/src/components/TxView.svelte b/plugins/activity-resources/src/components/TxView.svelte index 43a533c426..8a85f397c7 100644 --- a/plugins/activity-resources/src/components/TxView.svelte +++ b/plugins/activity-resources/src/components/TxView.svelte @@ -49,6 +49,7 @@ export let isNextNew: boolean = false export let contentHidden: boolean = false export let shouldScroll: boolean = false + export let boundary: HTMLElement | undefined = undefined // export let showDocument = false let ptx: DisplayTx | undefined @@ -80,7 +81,7 @@ const employeeQuery = createQuery() function getProps (props: any, edit: boolean): any { - return { ...props, edit, attr: tx.collectionAttribute } + return { ...props, edit, attr: tx.collectionAttribute, boundary } } $: updateViewlet(client, viewlets, tx).then((result) => { @@ -501,7 +502,6 @@ } .activity-content { - overflow: hidden; visibility: visible; min-width: 0; max-height: max-content; diff --git a/plugins/attachment-resources/src/components/AttachmentRefInput.svelte b/plugins/attachment-resources/src/components/AttachmentRefInput.svelte index 242ebf2252..7366463f84 100644 --- a/plugins/attachment-resources/src/components/AttachmentRefInput.svelte +++ b/plugins/attachment-resources/src/components/AttachmentRefInput.svelte @@ -41,6 +41,7 @@ } export let placeholder: IntlString | undefined = undefined export let extraActions: RefAction[] | undefined = undefined + export let boundary: HTMLElement | undefined = undefined let refInput: ReferenceInput @@ -285,6 +286,7 @@ {showSend} showHeader={attachments.size > 0 || progress} {loading} + {boundary} on:focus on:blur on:message={onMessage} diff --git a/plugins/attachment-resources/src/components/AttachmentStyleBoxEditor.svelte b/plugins/attachment-resources/src/components/AttachmentStyleBoxEditor.svelte index cc7e956b91..fa88fa6e80 100644 --- a/plugins/attachment-resources/src/components/AttachmentStyleBoxEditor.svelte +++ b/plugins/attachment-resources/src/components/AttachmentStyleBoxEditor.svelte @@ -27,6 +27,7 @@ export let key: KeyedAttribute export let placeholder: IntlString export let focusIndex = -1 + export let boundary: HTMLElement | undefined = undefined const client = getClient() const queryClient = createQuery() @@ -125,6 +126,7 @@ focusable bind:content={description} {placeholder} + {boundary} on:open-document={async (event) => { save(object, description) const doc = await client.findOne(event.detail._class, { _id: event.detail._id }) diff --git a/plugins/attachment-resources/src/components/AttachmentStyledBox.svelte b/plugins/attachment-resources/src/components/AttachmentStyledBox.svelte index 7330e509b8..23c0e0ea3b 100644 --- a/plugins/attachment-resources/src/components/AttachmentStyledBox.svelte +++ b/plugins/attachment-resources/src/components/AttachmentStyledBox.svelte @@ -48,6 +48,7 @@ export let isScrollable = true export let useDirectAttachDelete = false + export let boundary: HTMLElement | undefined = undefined let progress = false @@ -384,6 +385,7 @@ {kind} {enableBackReferences} {isScrollable} + {boundary} on:changeSize on:changeContent on:blur diff --git a/plugins/chunter-resources/src/components/Channel.svelte b/plugins/chunter-resources/src/components/Channel.svelte index ef0703f180..074dbc3922 100644 --- a/plugins/chunter-resources/src/components/Channel.svelte +++ b/plugins/chunter-resources/src/components/Channel.svelte @@ -32,8 +32,8 @@ export let savedMessagesIds: Ref[] export let savedAttachmentsIds: Ref[] export let isScrollForced = false + export let content: HTMLElement | undefined = undefined - let div: HTMLDivElement | undefined let autoscroll: boolean = false const unsubscribe = locationStore.subscribe((newLocation) => { @@ -54,7 +54,7 @@ onDestroy(unsubscribe) beforeUpdate(() => { - autoscroll = div !== undefined && div.offsetHeight + div.scrollTop > div.scrollHeight - 20 + autoscroll = content !== undefined && content.offsetHeight + content.scrollTop > content.scrollHeight - 20 }) afterUpdate(() => { @@ -63,8 +63,8 @@ return } - if (div && (autoscroll || isScrollForced)) { - div.scrollTo(0, div.scrollHeight) + if (content && (autoscroll || isScrollForced)) { + content.scrollTo(0, content.scrollHeight) isScrollForced = false } }) @@ -135,7 +135,7 @@ return } - const dateSelectors = div?.getElementsByClassName('dateSelector') + const dateSelectors = content?.getElementsByClassName('dateSelector') if (!dateSelectors) return let closestDate: Timestamp | undefined = parseInt(dateSelectors[dateSelectors.length - 1].id) @@ -161,7 +161,7 @@ if (offset) { offset = offset - headerHeight - dateSelectorHeight / 2 if (pinnedIds.length > 0) offset = offset - pinnedHeight - div?.scrollTo({ left: 0, top: offset }) + content?.scrollTo({ left: 0, top: offset }) } } @@ -176,10 +176,10 @@ const dateSelectorHeight = 30 function getFirstVisible (): Element | undefined { - if (!div) return + if (!content) return - const clientRect = div.getBoundingClientRect() - const dateSelectors = div.getElementsByClassName('dateSelector') + const clientRect = content.getBoundingClientRect() + const dateSelectors = content.getElementsByClassName('dateSelector') const firstVisible = Array.from(dateSelectors) .reverse() .find((child) => { @@ -198,7 +198,7 @@ } -
+
{#if showFixed}
diff --git a/plugins/chunter-resources/src/components/ChannelView.svelte b/plugins/chunter-resources/src/components/ChannelView.svelte index 5c727d2313..9a78fe9437 100644 --- a/plugins/chunter-resources/src/components/ChannelView.svelte +++ b/plugins/chunter-resources/src/components/ChannelView.svelte @@ -83,11 +83,13 @@ savedAttachmentsIds = res.map((r) => r.attachedTo) }) let loading = false + let content: HTMLElement { openThread(e.detail) @@ -97,7 +99,7 @@ {savedAttachmentsIds} />
- +