mirror of
https://github.com/hcengineering/platform.git
synced 2024-11-25 09:13:07 +03:00
Chunter: attachments table in channel description (#1402)
Signed-off-by: Ruslan Izhitsky <ruslan.izhitskiy@xored.com>
This commit is contained in:
parent
b204009eab
commit
a8cc01bd0a
@ -7,6 +7,8 @@
|
|||||||
"Photos": "Photos",
|
"Photos": "Photos",
|
||||||
"File": "File",
|
"File": "File",
|
||||||
"Files": "Files",
|
"Files": "Files",
|
||||||
|
"NoFiles": "There are no files",
|
||||||
|
"ShowMoreAttachments": "Show more",
|
||||||
"Type": "Type",
|
"Type": "Type",
|
||||||
"Size": "Size",
|
"Size": "Size",
|
||||||
"Photo": "Photo",
|
"Photo": "Photo",
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
"Photos": "Фотографии",
|
"Photos": "Фотографии",
|
||||||
"File": "Файл",
|
"File": "Файл",
|
||||||
"Files": "Файлы",
|
"Files": "Файлы",
|
||||||
|
"NoFiles": "Файлы отсутствуют",
|
||||||
|
"ShowMoreAttachments": "Показать больше файлов",
|
||||||
"Type": "Тип",
|
"Type": "Тип",
|
||||||
"Size": "Размер",
|
"Size": "Размер",
|
||||||
"Photo": "Фотография",
|
"Photo": "Фотография",
|
||||||
|
@ -58,6 +58,8 @@ export default plugin(attachmentId, {
|
|||||||
DeleteFile: '' as Resource<(id: string) => Promise<void>>
|
DeleteFile: '' as Resource<(id: string) => Promise<void>>
|
||||||
},
|
},
|
||||||
string: {
|
string: {
|
||||||
Files: '' as IntlString
|
Files: '' as IntlString,
|
||||||
|
NoFiles: '' as IntlString,
|
||||||
|
ShowMoreAttachments: '' as IntlString
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -0,0 +1,154 @@
|
|||||||
|
<!--
|
||||||
|
//
|
||||||
|
// Copyright © 2022 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 attachment, { Attachment } from '@anticrm/attachment'
|
||||||
|
import { AttachmentPresenter } from '@anticrm/attachment-resources'
|
||||||
|
import { Channel } from '@anticrm/chunter'
|
||||||
|
import type { Doc } from '@anticrm/core'
|
||||||
|
import { createQuery } from '@anticrm/presentation'
|
||||||
|
import { Menu } from '@anticrm/view-resources'
|
||||||
|
import { showPopup, IconMoreV, Label } from '@anticrm/ui'
|
||||||
|
|
||||||
|
export let channel: Channel | undefined
|
||||||
|
|
||||||
|
const query = createQuery()
|
||||||
|
let attachments: Attachment[] | undefined
|
||||||
|
let selectedRowNumber: number | undefined
|
||||||
|
let attachmentsLimit: number | undefined = 5
|
||||||
|
|
||||||
|
const showMenu = async (ev: MouseEvent, object: Doc, rowNumber: number): Promise<void> => {
|
||||||
|
selectedRowNumber = rowNumber
|
||||||
|
showPopup(Menu, { object }, ev.target as HTMLElement, () => {
|
||||||
|
selectedRowNumber = undefined
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$: channel &&
|
||||||
|
query.query(
|
||||||
|
attachment.class.Attachment,
|
||||||
|
{
|
||||||
|
space: channel._id
|
||||||
|
},
|
||||||
|
(res) => {
|
||||||
|
attachments = res
|
||||||
|
},
|
||||||
|
attachmentsLimit ? { limit: attachmentsLimit } : undefined
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="group">
|
||||||
|
<div class="eGroupTitle"><Label label={attachment.string.Files} /></div>
|
||||||
|
{#if attachments?.length}
|
||||||
|
<div class="flex-col">
|
||||||
|
{#each attachments as attachment, i}
|
||||||
|
<div class="flex-between attachmentRow" class:fixed={i === selectedRowNumber}>
|
||||||
|
<div class="item flex">
|
||||||
|
<AttachmentPresenter value={attachment} />
|
||||||
|
</div>
|
||||||
|
<div class="eAttachmentRowActions" class:fixed={i === selectedRowNumber}>
|
||||||
|
<div id="context-menu" class="eAttachmentRowMenu" on:click={(event) => showMenu(event, attachment, i)}>
|
||||||
|
<IconMoreV size={'small'} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
|
{#if attachmentsLimit && attachments.length === attachmentsLimit}
|
||||||
|
<div
|
||||||
|
class="showMoreAttachmentsButton"
|
||||||
|
on:click={() => {
|
||||||
|
// TODO: replace this with an external attachments page
|
||||||
|
attachmentsLimit = undefined
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Label label={attachment.string.ShowMoreAttachments} />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<div class="flex-between attachmentRow">
|
||||||
|
<Label label={attachment.string.NoFiles} />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.group {
|
||||||
|
border: 1px solid var(--theme-bg-focused-border);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eGroupTitle {
|
||||||
|
margin: 0 20px 8px 20px;
|
||||||
|
display: flex;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 1rem;
|
||||||
|
color: var(--theme-caption-color);
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.showMoreAttachmentsButton {
|
||||||
|
margin-left: 20px;
|
||||||
|
margin-top: 8px;
|
||||||
|
color: var(--theme-caption-color);
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.attachmentRow {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding-right: 1rem;
|
||||||
|
margin: 0 20px;
|
||||||
|
padding: 5px 0;
|
||||||
|
|
||||||
|
.eAttachmentRowActions {
|
||||||
|
visibility: hidden;
|
||||||
|
border: 1px solid var(--theme-bg-focused-border);
|
||||||
|
padding: 0.2rem;
|
||||||
|
border-radius: 0.375em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eAttachmentRowMenu {
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.eAttachmentRowActions {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
.eAttachmentRowMenu {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.fixed {
|
||||||
|
.eAttachmentRowActions {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
.eAttachmentRowMenu {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -20,11 +20,12 @@
|
|||||||
import { EditBox } from '@anticrm/ui'
|
import { EditBox } from '@anticrm/ui'
|
||||||
|
|
||||||
import chunter from '../plugin'
|
import chunter from '../plugin'
|
||||||
|
import EditChannelDescriptionAttachments from './EditChannelDescriptionAttachments.svelte'
|
||||||
|
|
||||||
export let _id: Ref<Channel>
|
export let _id: Ref<Channel>
|
||||||
export let _class: Ref<Class<Channel>>
|
export let _class: Ref<Class<Channel>>
|
||||||
|
|
||||||
export let channel: Channel
|
export let channel: Channel | undefined
|
||||||
|
|
||||||
const client = getClient()
|
const client = getClient()
|
||||||
const clazz = client.getHierarchy().getClass(_class)
|
const clazz = client.getHierarchy().getClass(_class)
|
||||||
@ -34,7 +35,7 @@
|
|||||||
function onNameChange (ev: Event) {
|
function onNameChange (ev: Event) {
|
||||||
const value = (ev.target as HTMLInputElement).value
|
const value = (ev.target as HTMLInputElement).value
|
||||||
if (value.trim().length > 0) {
|
if (value.trim().length > 0) {
|
||||||
client.updateDoc(_class, channel.space, channel._id, { name: value })
|
client.updateDoc(_class, channel!.space, channel!._id, { name: value })
|
||||||
} else {
|
} else {
|
||||||
// Just refresh value
|
// Just refresh value
|
||||||
query.query(chunter.class.Channel, { _id }, (result) => {
|
query.query(chunter.class.Channel, { _id }, (result) => {
|
||||||
@ -45,12 +46,12 @@
|
|||||||
|
|
||||||
function onTopicChange (ev: Event) {
|
function onTopicChange (ev: Event) {
|
||||||
const newTopic = (ev.target as HTMLInputElement).value
|
const newTopic = (ev.target as HTMLInputElement).value
|
||||||
client.update(channel, { topic: newTopic })
|
client.update(channel!, { topic: newTopic })
|
||||||
}
|
}
|
||||||
|
|
||||||
function onDescriptionChange (ev: Event) {
|
function onDescriptionChange (ev: Event) {
|
||||||
const newDescription = (ev.target as HTMLInputElement).value
|
const newDescription = (ev.target as HTMLInputElement).value
|
||||||
client.update(channel, { description: newDescription })
|
client.update(channel!, { description: newDescription })
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -81,6 +82,6 @@
|
|||||||
focus
|
focus
|
||||||
on:change={onDescriptionChange}
|
on:change={onDescriptionChange}
|
||||||
/>
|
/>
|
||||||
<!-- TODO: implement Attachments here -->
|
<EditChannelDescriptionAttachments channel={channel} />
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
Loading…
Reference in New Issue
Block a user