@nextcloud/vue
Version:
Nextcloud vue components
1 lines • 19.8 kB
Source Map (JSON)
{"version":3,"file":"NcReferenceWidget.mjs","sources":["../../src/components/NcRichText/NcReferenceWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { ReferenceWidgetObject } from './../../functions/reference/widgets.ts'\n\nimport { useElementSize, useIntersectionObserver } from '@vueuse/core'\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useTemplateRef, watch } from 'vue'\nimport { routerKey, RouterLink } from 'vue-router'\nimport NcButton from '../../components/NcButton/NcButton.vue'\nimport { t } from '../../l10n.ts'\nimport { createElementId } from '../../utils/createElementId.ts'\nimport { destroyWidget, hasFullWidth, hasInteractiveView, isResizable, isWidgetRegistered, renderWidget } from './../../functions/reference/widgets.ts'\nimport { getRoute } from './autolink.ts'\n\nconst props = withDefaults(defineProps<{\n\t/**\n\t * A reference object as returned by the ReferenceProvider\n\t */\n\treference: ReferenceWidgetObject\n\t/**\n\t * Whether to render the widget in interactive mode (if available)\n\t */\n\tinteractive?: boolean\n\t/**\n\t * Whether to show user an option to enable to interactive mode (if available)\n\t */\n\tinteractiveOptIn?: boolean\n}>(), {\n\tinteractive: true,\n\tinteractiveOptIn: false,\n})\n\n/* 3 minutes outside of viewport before widget is removed from the DOM */\nconst IDLE_TIMEOUT = 3 * 60 * 1000\nconst RESIZE_KEYBOARD_STEP = 10\n\nconst router = inject(routerKey, null)\n\nconst widgetId = `nc-reference-widget-${createElementId()}`\n\nconst isVisible = ref(false)\nconst customWidget = useTemplateRef('customWidget')\nconst customWidgetContent = useTemplateRef('customWidgetContent')\nconst widgetRoot = useTemplateRef('widgetRoot')\nconst { width } = useElementSize(widgetRoot)\nconst { height: customWidgetHeight } = useElementSize(customWidget)\n\nuseIntersectionObserver(widgetRoot, ([entry]) => {\n\tnextTick(() => {\n\t\tisVisible.value = entry!.isIntersecting\n\t})\n})\n\nconst showInteractive = ref(false)\nconst rendered = ref(false)\nlet idleTimeout: NodeJS.Timeout | null = null\nconst isResizing = ref(false)\nconst resizedHeight: Ref<number | null> = ref(null)\nconst resizeStartY = ref(0)\nconst resizeStartHeight = ref(0)\nconst resizeMinHeight = ref(100)\nconst resizeMaxHeight = ref(window.innerHeight - 120)\n\nconst isInteractive = computed(() => {\n\treturn (!props.interactiveOptIn && props.interactive) || showInteractive.value\n})\n\nconst referenceHasFullWidth = computed(() => {\n\treturn hasFullWidth(props.reference.richObjectType)\n})\n\nconst isWidgetResizable = computed(() => {\n\treturn isResizable(props.reference.richObjectType)\n})\n\nconst hasCustomWidget = computed(() => {\n\treturn isWidgetRegistered(props.reference.richObjectType)\n})\n\nconst customWidgetStyle = computed(() => {\n\tif (!resizedHeight.value) {\n\t\treturn null\n\t}\n\treturn { height: `${resizedHeight.value}px !important` }\n})\n\nconst ariaValueNow = computed(() => {\n\treturn Math.round(resizedHeight.value ?? customWidgetHeight.value)\n})\n\nconst referenceHasInteractiveView = computed(() => {\n\treturn hasCustomWidget.value && hasInteractiveView(props.reference.richObjectType)\n})\n\nconst noAccess = computed(() => {\n\treturn !props.reference.accessible\n})\n\nconst numberOfLines = computed(() => {\n\t// no description for width < 450, one line until 550 and so on\n\tconst lineCountOffsets = [450, 550, 650, Infinity]\n\treturn lineCountOffsets.findIndex((max) => width.value < max)\n})\n\nconst descriptionStyle = computed(() => {\n\tif (numberOfLines.value === 0) {\n\t\treturn {\n\t\t\tdisplay: 'none',\n\t\t}\n\t}\n\tconst lineClamp = numberOfLines.value\n\treturn {\n\t\tlineClamp,\n\t\twebkitLineClamp: lineClamp,\n\t}\n})\n\nconst compactLink = computed(() => {\n\tconst link = props.reference.openGraphObject.link\n\tif (!link) {\n\t\treturn ''\n\t}\n\n\tif (link.startsWith('https://')) {\n\t\treturn link.substring(8)\n\t}\n\tif (link.startsWith('http://')) {\n\t\treturn link.substring(7)\n\t}\n\treturn link\n})\n\nconst route = computed(() => {\n\treturn getRoute(router, props.reference.openGraphObject.link)\n})\n\nconst referenceWidgetLinkComponent = computed(() => {\n\treturn route.value ? RouterLink : 'a'\n})\n\nconst referenceWidgetLinkProps = computed(() => {\n\treturn route.value\n\t\t? { to: route.value }\n\t\t: { href: props.reference.openGraphObject.link, target: '_blank' }\n})\n\nwatch(isVisible, (val) => {\n\tif (!val) {\n\t\tidleTimeout = setTimeout(() => {\n\t\t\t// If the widget is still outside of viewport after timeout, destroy it\n\t\t\tif (!isVisible.value) {\n\t\t\t\tdestroyReferenceWidget()\n\t\t\t}\n\t\t}, IDLE_TIMEOUT)\n\t\treturn\n\t}\n\n\tif (idleTimeout) {\n\t\tclearTimeout(idleTimeout)\n\t\tidleTimeout = null\n\t}\n\n\tif (!rendered.value) {\n\t\trenderReferenceWidget()\n\t}\n}, { immediate: true })\n\nonBeforeUnmount(() => {\n\tif (idleTimeout) {\n\t\tclearTimeout(idleTimeout)\n\t\tidleTimeout = null\n\t}\n\tstopResize()\n\tdestroyReferenceWidget()\n})\n\n/**\n * Enable interactive view of the widget, if available\n */\nfunction enableInteractive() {\n\tshowInteractive.value = true\n\trenderReferenceWidget()\n}\n\n/**\n * Render the reference widget\n */\nfunction renderReferenceWidget() {\n\tif (!customWidgetContent.value) {\n\t\treturn\n\t}\n\n\tif (props.reference.richObjectType === 'open-graph') {\n\t\treturn\n\t}\n\n\tcustomWidgetContent.value.innerHTML = ''\n\n\t// create a separate element so we can rerender on the ref again\n\tconst widget = document.createElement('div')\n\twidget.style.width = '100%'\n\tcustomWidgetContent.value.appendChild(widget)\n\tnextTick(() => {\n\t\t// Waiting for the ref to become available\n\t\trenderWidget(widget, {\n\t\t\t...props.reference,\n\t\t\tinteractive: isInteractive.value,\n\t\t})\n\t\trendered.value = true\n\t})\n}\n\n/**\n * Destroy the reference widget\n */\nfunction destroyReferenceWidget() {\n\tif (rendered.value && widgetRoot.value) {\n\t\tdestroyWidget(props.reference.richObjectType, widgetRoot.value)\n\t\trendered.value = false\n\t}\n}\n\n/**\n * Initialize resize limits\n */\nfunction initResizeLimits() {\n\t// Use min/max height from rendered widget element if set\n\tconst widgetEl = customWidgetContent.value?.firstElementChild\n\tif (widgetEl) {\n\t\tconst computedStyle = window.getComputedStyle(widgetEl)\n\t\tconst parsedMin = parseFloat(computedStyle.minHeight)\n\t\tconst parsedMax = parseFloat(computedStyle.maxHeight)\n\t\tresizeMinHeight.value = parsedMin > 0 ? parsedMin : 100\n\t\tresizeMaxHeight.value = Number.isFinite(parsedMax) && parsedMax > 0 ? parsedMax : (window.innerHeight - 120)\n\t} else {\n\t\tresizeMinHeight.value = 100\n\t\tresizeMaxHeight.value = window.innerHeight - 120\n\t}\n}\n\n/**\n * Start resize via dragging\n *\n * @param event - the pointer event\n */\nfunction startResize(event: PointerEvent) {\n\tif (!isWidgetResizable.value || !customWidget.value) {\n\t\treturn\n\t}\n\n\tinitResizeLimits()\n\tisResizing.value = true\n\tresizeStartY.value = event.clientY\n\tresizeStartHeight.value = customWidget.value.getBoundingClientRect().height\n\n\twindow.addEventListener('pointermove', onResize)\n\twindow.addEventListener('pointerup', stopResize)\n}\n\n/**\n * Resize via keydown\n *\n * @param delta - the resize delta\n */\nfunction onResizeKeydown(delta: number) {\n\tif (!isWidgetResizable.value || !customWidget.value) {\n\t\treturn\n\t}\n\n\t// Establish limits once per interaction\n\tinitResizeLimits()\n\n\tconst currentHeight = resizedHeight.value ?? resizeStartHeight.value\n\tconst next = currentHeight + delta\n\tresizedHeight.value = Math.min(resizeMaxHeight.value, Math.max(resizeMinHeight.value, next))\n}\n\n/**\n * Resize via dragging\n *\n * @param event - the pointer event\n */\nfunction onResize(event: PointerEvent) {\n\tif (!isResizing.value || !customWidget.value) {\n\t\treturn\n\t}\n\n\tconst deltaY = event.clientY - resizeStartY.value\n\tresizedHeight.value = Math.min(resizeMaxHeight.value, Math.max(resizeMinHeight.value, resizeStartHeight.value + deltaY))\n}\n\n/**\n * Stop resize via dragging\n */\nfunction stopResize() {\n\tif (!isResizing.value) {\n\t\treturn\n\t}\n\n\tisResizing.value = false\n\twindow.removeEventListener('pointermove', onResize)\n\twindow.removeEventListener('pointerup', stopResize)\n}\n</script>\n\n<template>\n\t<div ref=\"widgetRoot\" :class=\"{ 'toggle-interactive': referenceHasInteractiveView && !isInteractive }\">\n\t\t<div\n\t\t\tv-if=\"reference && hasCustomWidget\"\n\t\t\t:id=\"widgetId\"\n\t\t\tref=\"customWidget\"\n\t\t\tclass=\"widget-custom\"\n\t\t\t:class=\"{ 'full-width': referenceHasFullWidth }\"\n\t\t\t:style=\"customWidgetStyle\">\n\t\t\t<div ref=\"customWidgetContent\" class=\"widget-custom__content\" />\n\t\t\t<div\n\t\t\t\tv-if=\"isWidgetResizable\"\n\t\t\t\tclass=\"widget-custom__resize-handle\"\n\t\t\t\trole=\"slider\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t:aria-label=\"t('Widget height')\"\n\t\t\t\t:aria-valuenow=\"ariaValueNow\"\n\t\t\t\t:aria-valuemin=\"resizeMinHeight\"\n\t\t\t\t:aria-valuemax=\"resizeMaxHeight\"\n\t\t\t\t:aria-controls=\"widgetId\"\n\t\t\t\t@pointerdown.stop.prevent=\"startResize\"\n\t\t\t\t@keydown.up.stop.prevent=\"onResizeKeydown(-RESIZE_KEYBOARD_STEP)\"\n\t\t\t\t@keydown.down.stop.prevent=\"onResizeKeydown(RESIZE_KEYBOARD_STEP)\" />\n\t\t</div>\n\n\t\t<component\n\t\t\t:is=\"referenceWidgetLinkComponent\"\n\t\t\tv-else-if=\"!noAccess && reference && reference.openGraphObject && !hasCustomWidget\"\n\t\t\tv-bind=\"referenceWidgetLinkProps\"\n\t\t\trel=\"noopener noreferrer\"\n\t\t\tclass=\"widget-default\">\n\t\t\t<img v-if=\"reference.openGraphObject.thumb\" class=\"widget-default--image\" :src=\"reference.openGraphObject.thumb\">\n\t\t\t<div class=\"widget-default--details\">\n\t\t\t\t<p class=\"widget-default--name\">\n\t\t\t\t\t{{ reference.openGraphObject.name }}\n\t\t\t\t</p>\n\t\t\t\t<p class=\"widget-default--description\" :style=\"descriptionStyle\">\n\t\t\t\t\t{{ reference.openGraphObject.description }}\n\t\t\t\t</p>\n\t\t\t\t<p class=\"widget-default--link\">\n\t\t\t\t\t{{ compactLink }}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</component>\n\t\t<NcButton v-if=\"interactiveOptIn && referenceHasInteractiveView && !isInteractive\" class=\"toggle-interactive--button\" @click=\"enableInteractive\">\n\t\t\t{{ t('Enable interactive view') }}\n\t\t</NcButton>\n\t</div>\n</template>\n\n<style lang=\"scss\" scoped>\n\n@mixin widget {\n\twidth: 100%;\n\tmargin: auto;\n\tmargin-bottom: calc(var(--default-grid-baseline, 4px) * 3);\n\tmargin-top: calc(var(--default-grid-baseline, 4px) * 3);\n\toverflow: hidden;\n\tborder: 2px solid var(--color-border);\n\tborder-radius: var(--border-radius-container);\n\tbackground-color: transparent;\n\tdisplay: flex;\n}\n\n.widget-custom {\n\t@include widget;\n\tposition: relative;\n\n\t&.full-width {\n\t\twidth: var(--widget-full-width, 100%) !important;\n\t\tinset-inline-start: calc( (var(--widget-full-width, 100%) - 100%) / 2 * -1);\n\t\tposition: relative;\n\t}\n\n\t&__content {\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t&__resize-handle {\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\tinset-inline-start: 0;\n\t\twidth: 100%;\n\t\theight: calc(var(--default-grid-baseline) * 2);\n\t\tborder-top: 1px solid var(--color-border);\n\t\tmargin-top: -1px;\n\t\tcursor: row-resize;\n\t\ttouch-action: none;\n\n\t\t&::before, &::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tbackground-color: var(--color-border);\n\t\t\tmargin-top: 1px;\n\t\t\ttransform: translateX(-50%);\n\t\t\twidth: 30px;\n\t\t\theight: 1px;\n\t\t}\n\n\t\t&::before {\n\t\t\tmargin-top: -2px;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary-element);\n\t\t\toutline-offset: -4px;\n\t\t}\n\t}\n}\n\n.widget-access {\n\t@include widget;\n\tpadding: calc(var(--default-grid-baseline, 4px) * 3);\n}\n\n.widget-default {\n\t@include widget;\n\n\t&--compact {\n\t\tflex-direction: column;\n\n\t\t.widget-default--image {\n\t\t\twidth: 100%;\n\t\t\theight: 150px;\n\t\t}\n\n\t\t.widget-default--details {\n\t\t\twidth: 100%;\n\t\t\tpadding-top: calc(var(--default-grid-baseline, 4px) * 2);\n\t\t\tpadding-bottom: calc(var(--default-grid-baseline, 4px) * 2);\n\t\t}\n\n\t\t.widget-default--description {\n\t\t\tdisplay: none;\n\t\t}\n\n\t}\n\n\t&--image {\n\t\twidth: 40%;\n\t\tbackground-position: center;\n\t\tbackground-size: cover;\n\t\tbackground-repeat: no-repeat;\n\t}\n\n\t&--name {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-weight: var(--font-weight-heading, bold);\n\t}\n\n\t&--details {\n\t\tpadding: calc(var(--default-grid-baseline, 4px) * 3);\n\t\twidth: 60%;\n\n\t\tp {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t}\n\t}\n\n\t&--description {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tdisplay: -webkit-box;\n\t\t-webkit-line-clamp: 3;\n\t\tline-clamp: 3; /* stylelint-disable-line property-no-unknown */\n\t\t-webkit-box-orient: vertical;\n\t}\n\n\t&--link {\n\t\tcolor: var(--color-text-maxcontrast);\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n}\n\n.toggle-interactive {\n\tposition: relative;\n\t.toggle-interactive--button {\n\t\tposition: absolute;\n\t\tbottom: var(--default-grid-baseline);\n\t\tinset-inline-end: var(--default-grid-baseline);\n\t\tz-index: 10000;\n\t}\n}\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_unref","_withKeys","_withModifiers","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_toDisplayString"],"mappings":"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"}