mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-14 04:08:19 +00:00
UBERF-8180 Text file preview (#6633)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
This commit is contained in:
parent
892bbbe8b8
commit
e248aec920
@ -647,7 +647,7 @@ export function createModel (builder: Builder): void {
|
|||||||
presentation.class.FilePreviewExtension,
|
presentation.class.FilePreviewExtension,
|
||||||
core.space.Model,
|
core.space.Model,
|
||||||
{
|
{
|
||||||
contentType: ['application/pdf', 'application/json', 'text/*'],
|
contentType: ['application/pdf'],
|
||||||
alignment: 'float',
|
alignment: 'float',
|
||||||
component: view.component.PDFViewer,
|
component: view.component.PDFViewer,
|
||||||
extension: presentation.extension.FilePreviewExtension
|
extension: presentation.extension.FilePreviewExtension
|
||||||
@ -655,6 +655,18 @@ export function createModel (builder: Builder): void {
|
|||||||
view.extension.PDF
|
view.extension.PDF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
builder.createDoc(
|
||||||
|
presentation.class.FilePreviewExtension,
|
||||||
|
core.space.Model,
|
||||||
|
{
|
||||||
|
contentType: ['application/json', 'text/*'],
|
||||||
|
alignment: 'float',
|
||||||
|
component: view.component.TextViewer,
|
||||||
|
extension: presentation.extension.FilePreviewExtension
|
||||||
|
},
|
||||||
|
view.extension.Text
|
||||||
|
)
|
||||||
|
|
||||||
createAction(
|
createAction(
|
||||||
builder,
|
builder,
|
||||||
{
|
{
|
||||||
|
@ -88,7 +88,8 @@ export default mergeIds(viewId, view, {
|
|||||||
AudioViewer: '' as AnyComponent,
|
AudioViewer: '' as AnyComponent,
|
||||||
ImageViewer: '' as AnyComponent,
|
ImageViewer: '' as AnyComponent,
|
||||||
VideoViewer: '' as AnyComponent,
|
VideoViewer: '' as AnyComponent,
|
||||||
PDFViewer: '' as AnyComponent
|
PDFViewer: '' as AnyComponent,
|
||||||
|
TextViewer: '' as AnyComponent
|
||||||
},
|
},
|
||||||
string: {
|
string: {
|
||||||
Table: '' as IntlString,
|
Table: '' as IntlString,
|
||||||
@ -150,6 +151,7 @@ export default mergeIds(viewId, view, {
|
|||||||
Audio: '' as Ref<FilePreviewExtension>,
|
Audio: '' as Ref<FilePreviewExtension>,
|
||||||
Image: '' as Ref<FilePreviewExtension>,
|
Image: '' as Ref<FilePreviewExtension>,
|
||||||
Video: '' as Ref<FilePreviewExtension>,
|
Video: '' as Ref<FilePreviewExtension>,
|
||||||
PDF: '' as Ref<FilePreviewExtension>
|
PDF: '' as Ref<FilePreviewExtension>,
|
||||||
|
Text: '' as Ref<FilePreviewExtension>
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -14,7 +14,14 @@
|
|||||||
-->
|
-->
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { type Blob, type Ref } from '@hcengineering/core'
|
import { type Blob, type Ref } from '@hcengineering/core'
|
||||||
import { Button, Component, Label, resizeObserver, deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
import {
|
||||||
|
Button,
|
||||||
|
Component,
|
||||||
|
Label,
|
||||||
|
resizeObserver,
|
||||||
|
deviceOptionsStore as deviceInfo,
|
||||||
|
Loading
|
||||||
|
} from '@hcengineering/ui'
|
||||||
|
|
||||||
import presentation from '../plugin'
|
import presentation from '../plugin'
|
||||||
|
|
||||||
@ -34,9 +41,11 @@
|
|||||||
let minHeight: number | undefined
|
let minHeight: number | undefined
|
||||||
$: parentHeight = ($deviceInfo.docHeight * 80) / 100
|
$: parentHeight = ($deviceInfo.docHeight * 80) / 100
|
||||||
|
|
||||||
|
let loading = true
|
||||||
let previewType: FilePreviewExtension | undefined = undefined
|
let previewType: FilePreviewExtension | undefined = undefined
|
||||||
$: void getPreviewType(contentType, $previewTypes).then((res) => {
|
$: void getPreviewType(contentType, $previewTypes).then((res) => {
|
||||||
previewType = res
|
previewType = res
|
||||||
|
loading = false
|
||||||
})
|
})
|
||||||
|
|
||||||
const updateHeight = (
|
const updateHeight = (
|
||||||
@ -91,6 +100,8 @@
|
|||||||
</div>
|
</div>
|
||||||
{:else if previewType !== undefined}
|
{:else if previewType !== undefined}
|
||||||
<Component is={previewType.component} props={{ value: file, name, contentType, metadata, ...props, fit }} />
|
<Component is={previewType.component} props={{ value: file, name, contentType, metadata, ...props, fit }} />
|
||||||
|
{:else if loading}
|
||||||
|
<Loading />
|
||||||
{:else}
|
{:else}
|
||||||
<div class="flex-col items-center flex-gap-3">
|
<div class="flex-col items-center flex-gap-3">
|
||||||
<Label label={presentation.string.ContentTypeNotSupported} />
|
<Label label={presentation.string.ContentTypeNotSupported} />
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
<!--
|
||||||
|
// Copyright © 2024 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
-->
|
||||||
|
<script lang="ts">
|
||||||
|
import { type Blob, type Ref } from '@hcengineering/core'
|
||||||
|
import { getFileUrl } from '@hcengineering/presentation'
|
||||||
|
import { Loading, Scroller } from '@hcengineering/ui'
|
||||||
|
|
||||||
|
export let value: Ref<Blob>
|
||||||
|
export let name: string
|
||||||
|
export let fit: boolean = false
|
||||||
|
|
||||||
|
$: void fetchFile(value, name)
|
||||||
|
|
||||||
|
let loading = true
|
||||||
|
let text: string | undefined = undefined
|
||||||
|
|
||||||
|
async function fetchFile (value: Ref<Blob>, name: string): Promise<void> {
|
||||||
|
loading = true
|
||||||
|
|
||||||
|
const src = getFileUrl(value, name)
|
||||||
|
const res = await fetch(src)
|
||||||
|
text = await res.text()
|
||||||
|
|
||||||
|
loading = false
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if loading}
|
||||||
|
<div class="flex-center w-full h-full clear-mins">
|
||||||
|
<Loading />
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<div class="container h-full w-full" class:fit>
|
||||||
|
<Scroller horizontal padding="0 1rem">
|
||||||
|
<pre class="select-text">{text}</pre>
|
||||||
|
</Scroller>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.container {
|
||||||
|
max-height: 80vh;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid var(--theme-button-border);
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
|
||||||
|
&.fit {
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
&:not(.fit) {
|
||||||
|
height: 80vh;
|
||||||
|
min-height: 20rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
font-family: var(--mono-font);
|
||||||
|
}
|
||||||
|
</style>
|
@ -99,6 +99,7 @@ import AudioViewer from './components/viewer/AudioViewer.svelte'
|
|||||||
import ImageViewer from './components/viewer/ImageViewer.svelte'
|
import ImageViewer from './components/viewer/ImageViewer.svelte'
|
||||||
import VideoViewer from './components/viewer/VideoViewer.svelte'
|
import VideoViewer from './components/viewer/VideoViewer.svelte'
|
||||||
import PDFViewer from './components/viewer/PDFViewer.svelte'
|
import PDFViewer from './components/viewer/PDFViewer.svelte'
|
||||||
|
import TextViewer from './components/viewer/TextViewer.svelte'
|
||||||
|
|
||||||
import { blobImageMetadata, blobVideoMetadata } from './blob'
|
import { blobImageMetadata, blobVideoMetadata } from './blob'
|
||||||
|
|
||||||
@ -295,7 +296,8 @@ export default async (): Promise<Resources> => ({
|
|||||||
AudioViewer,
|
AudioViewer,
|
||||||
ImageViewer,
|
ImageViewer,
|
||||||
VideoViewer,
|
VideoViewer,
|
||||||
PDFViewer
|
PDFViewer,
|
||||||
|
TextViewer
|
||||||
},
|
},
|
||||||
popup: {
|
popup: {
|
||||||
PositionElementAlignment
|
PositionElementAlignment
|
||||||
|
Loading…
Reference in New Issue
Block a user