From b471284c538b66f447bf34bd4834fc26ba7ffcc2 Mon Sep 17 00:00:00 2001 From: budaeva <47611627+budaeva@users.noreply.github.com> Date: Fri, 10 Jun 2022 23:10:15 +0700 Subject: [PATCH] Chunter browser: common, channels, contact (#2011) Signed-off-by: budaeva --- models/chunter/src/index.ts | 15 +- models/chunter/src/plugin.ts | 4 +- packages/theme/styles/_layouts.scss | 3 + .../src/components/FileBrowser.svelte | 18 ++- plugins/attachment-resources/src/index.ts | 3 +- plugins/chunter-assets/lang/en.json | 5 +- plugins/chunter-assets/lang/ru.json | 5 +- plugins/chunter-resources/package.json | 3 +- .../src/components/ChunterBrowser.svelte | 134 ++++++++++++++++++ .../src/components/DmHeader.svelte | 8 +- .../src/components/Header.svelte | 24 ++-- .../src/components/MessagesBrowser.svelte | 80 ++++++----- plugins/chunter-resources/src/index.ts | 10 +- plugins/chunter-resources/src/plugin.ts | 5 +- plugins/chunter-resources/src/utils.ts | 13 ++ .../src/components/EmployeeBrowser.svelte | 56 ++++++++ .../src/components/EmployeePresenter.svelte | 2 + plugins/contact-resources/src/index.ts | 2 + .../src/components/filter/FilterBar.svelte | 17 +-- .../src/components/filter/FilterButton.svelte | 11 +- .../src/components/filter/ValueFilter.svelte | 2 +- .../src/components/SpaceBrowser.svelte | 76 +++++++--- plugins/workbench-resources/src/index.ts | 2 +- 23 files changed, 392 insertions(+), 106 deletions(-) create mode 100644 plugins/chunter-resources/src/components/ChunterBrowser.svelte create mode 100644 plugins/contact-resources/src/components/EmployeeBrowser.svelte diff --git a/models/chunter/src/index.ts b/models/chunter/src/index.ts index 67fcfb919e..d0470aa9ea 100644 --- a/models/chunter/src/index.ts +++ b/models/chunter/src/index.ts @@ -308,7 +308,7 @@ export function createModel (builder: Builder): void { { id: 'spaceBrowser', component: workbench.component.SpaceBrowser, - icon: workbench.icon.Search, + icon: chunter.icon.Hashtag, label: chunter.string.ChannelBrowser, position: 'top', spaceClass: chunter.class.Channel, @@ -351,10 +351,11 @@ export function createModel (builder: Builder): void { } }, { - id: 'messagesBrowser', - label: chunter.string.MessagesBrowser, - component: chunter.component.MessagesBrowser, - visibleIf: chunter.function.MessageBrowserVisible + id: 'chunterBrowser', + label: chunter.string.ChunterBrowser, + icon: workbench.icon.Search, + component: chunter.component.ChunterBrowser, + visibleIf: chunter.function.ChunterBrowserVisible } ], spaces: [ @@ -449,6 +450,10 @@ export function createModel (builder: Builder): void { builder.mixin(chunter.class.ChunterMessage, core.class.Class, view.mixin.ClassFilters, { filters: ['space', 'modifiedOn', 'createBy', '_class'] }) + + builder.mixin(chunter.class.Channel, core.class.Class, view.mixin.ClassFilters, { + filters: ['private', 'archived'] + }) } export { chunterOperation } from './migration' diff --git a/models/chunter/src/plugin.ts b/models/chunter/src/plugin.ts index 1ec84e2a10..6641776a23 100644 --- a/models/chunter/src/plugin.ts +++ b/models/chunter/src/plugin.ts @@ -30,7 +30,7 @@ export default mergeIds(chunterId, chunter, { Threads: '' as AnyComponent, ThreadView: '' as AnyComponent, SavedMessages: '' as AnyComponent, - MessagesBrowser: '' as AnyComponent + ChunterBrowser: '' as AnyComponent }, action: { MarkCommentUnread: '' as Ref, @@ -86,6 +86,6 @@ export default mergeIds(chunterId, chunter, { Random: '' as Ref }, function: { - MessageBrowserVisible: '' as Resource<(spaces: Space[]) => boolean> + ChunterBrowserVisible: '' as Resource<(spaces: Space[]) => boolean> } }) diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index 4318bddec9..23b9587291 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -354,6 +354,7 @@ input.search { .mr-6 { margin-right: 1.5rem; } .mr-8 { margin-right: 2rem; } .mr-10 { margin-right: 2.5rem; } +.mr-32 { margin-right: 8rem } .mt-0-5 { margin-top: .125rem; } .mt-1 { margin-top: .25rem; } .mt-2 { margin-top: .5rem; } @@ -396,6 +397,7 @@ input.search { .pb-3 { padding-bottom: .75rem; } .pb-4 { padding-bottom: 1rem; } .pb-6 { padding-bottom: 1.5rem; } +.pb-16 { padding-bottom: 4rem; } .px-2 { padding: 0 .5rem; } .px-3 { padding: 0 .75rem; } .px-4 { padding: 0 1rem; } @@ -464,6 +466,7 @@ input.search { .w-16 { width: 4rem; } .w-22 { width: 5.5rem; } .w-24 { width: 6rem; } +.w-32 { width: 8rem; } .w-60 { width: 15rem; } .w-85 { width: 21.25rem; } .w-165 { width: 41.25rem; } diff --git a/plugins/attachment-resources/src/components/FileBrowser.svelte b/plugins/attachment-resources/src/components/FileBrowser.svelte index dc4ed8760f..6fd987508a 100644 --- a/plugins/attachment-resources/src/components/FileBrowser.svelte +++ b/plugins/attachment-resources/src/components/FileBrowser.svelte @@ -35,6 +35,8 @@ import FileBrowserFilters from './FileBrowserFilters.svelte' import FileBrowserSortMenu from './FileBrowserSortMenu.svelte' + export let withHeader: boolean = true + const client = getClient() const loc = getCurrentLocation() const spaceId: Ref | undefined = loc.query?.spaceId as Ref | undefined @@ -48,7 +50,7 @@ const currentUser = getCurrentAccount() as EmployeeAccount let selectedParticipants: Ref[] = [currentUser.employee] let selectedSpaces: Ref[] = [] - let searchQuery: string = '' + export let search: string = '' let isLoading = false let attachments: Attachment[] = [] @@ -58,7 +60,7 @@ let selectedFileTypeId = 'typeAny' let isListDisplayMode = true - $: fetch(searchQuery, selectedSort, selectedFileTypeId, selectedDateId, selectedParticipants, selectedSpaces) + $: fetch(search, selectedSort, selectedFileTypeId, selectedDateId, selectedParticipants, selectedSpaces) async function fetch ( searchQuery_: string, @@ -108,12 +110,14 @@ } -
-
- +{#if withHeader} +
+
+ +
+
- -
+{/if}
+ import attachment from '@anticrm/attachment' + import { FileBrowser } from '@anticrm/attachment-resources' + import { Button } from '@anticrm/ui' + import workbench from '@anticrm/workbench' + import { SpaceBrowser } from '@anticrm/workbench-resources' + import Header from './Header.svelte' + import contact from '@anticrm/contact-resources/src/plugin' + import { EmployeeBrowser } from '@anticrm/contact-resources' + import { userSearch } from '../index' + import plugin from '../plugin' + import { SearchType } from '../utils' + import MessagesBrowser from './MessagesBrowser.svelte' + import { FilterButton } from '@anticrm/view-resources' + import { Filter } from '@anticrm/view' + + let userSearch_: string = '' + userSearch.subscribe((v) => (userSearch_ = v)) + + let searchType: SearchType = SearchType.Messages + + const components = [ + { searchType: SearchType.Messages, component: MessagesBrowser, filterClass: plugin.class.ChunterMessage }, + { + searchType: SearchType.Channels, + component: SpaceBrowser, + filterClass: plugin.class.Channel, + props: { + _class: plugin.class.Channel, + label: plugin.string.ChannelBrowser, + withFilterButton: false + } + }, + { + searchType: SearchType.Files, + component: FileBrowser, + props: { + requestedSpaceClasses: [plugin.class.Channel, plugin.class.DirectMessage] + } + }, + { searchType: SearchType.Contacts, component: EmployeeBrowser, filterClass: contact.class.Employee } + ] + + let filters: Filter[] = [] + + +
+
+
+
+
+
+
+ {#if components[searchType].component} + + {/if} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/plugins/chunter-resources/src/components/DmHeader.svelte b/plugins/chunter-resources/src/components/DmHeader.svelte index 5ebec0d0e0..c8dd801de0 100644 --- a/plugins/chunter-resources/src/components/DmHeader.svelte +++ b/plugins/chunter-resources/src/components/DmHeader.svelte @@ -18,9 +18,9 @@ import { getCurrentAccount } from '@anticrm/core' import { createQuery, getClient, CombineAvatars } from '@anticrm/presentation' import contact, { EmployeeAccount } from '@anticrm/contact' - import { getCurrentLocation, navigate, SearchEdit, showPanel } from '@anticrm/ui' + import { SearchEdit, showPanel } from '@anticrm/ui' import chunter from '../plugin' - import { getDmName } from '../utils' + import { getDmName, navigateToSpecial } from '../utils' import { userSearch } from '../index' export let spaceId: Ref | undefined @@ -72,9 +72,7 @@ userSearch.set(ev.detail) if (ev.detail !== '') { - const loc = getCurrentLocation() - loc.path[2] = 'messagesBrowser' - navigate(loc) + navigateToSpecial('chunterBrowser') } }} /> diff --git a/plugins/chunter-resources/src/components/Header.svelte b/plugins/chunter-resources/src/components/Header.svelte index b708fe9654..ae0711ac34 100644 --- a/plugins/chunter-resources/src/components/Header.svelte +++ b/plugins/chunter-resources/src/components/Header.svelte @@ -13,13 +13,15 @@ // limitations under the License. --> -
-
- -
-
- { - userSearch.set(ev.detail) - updateSearchQuery(userSearch_) - updateMessages(resultQuery) - }} - /> -
- (resultQuery = e.detail)} /> - - {#each messages as message} -
openMessageFromSpecial(message)}> - +{#if withHeader} +
+
+
- {/each} - + { + updateSearchQuery(search) + updateMessages(resultQuery) + }} + /> +
+{/if} + (resultQuery = e.detail)} /> +{#if messages.length > 0} + + {#each messages as message} +
openMessageFromSpecial(message)}> + +
+ {/each} +
+{:else} +
+
+{/if} diff --git a/plugins/chunter-resources/src/index.ts b/plugins/chunter-resources/src/index.ts index 10f3917db7..f38e6963a7 100644 --- a/plugins/chunter-resources/src/index.ts +++ b/plugins/chunter-resources/src/index.ts @@ -34,7 +34,7 @@ import CommentsPresenter from './components/CommentsPresenter.svelte' import CreateChannel from './components/CreateChannel.svelte' import CreateDirectMessage from './components/CreateDirectMessage.svelte' import EditChannel from './components/EditChannel.svelte' -import MessagesBrowser from './components/MessagesBrowser.svelte' +import ChunterBrowser from './components/ChunterBrowser.svelte' import ThreadView from './components/ThreadView.svelte' import Threads from './components/Threads.svelte' import SavedMessages from './components/SavedMessages.svelte' @@ -176,7 +176,7 @@ export async function DeleteMessageFromSaved (message: ChunterMessage): Promise< export const userSearch = writable('') -export function messageBrowserVisible (spaces: Space[]): boolean { +export function chunterBrowserVisible (spaces: Space[]): boolean { return false } @@ -186,21 +186,21 @@ export default async (): Promise => ({ CreateChannel, CreateDirectMessage, ChannelHeader, - DmHeader, ChannelView, CommentPresenter, CommentsPresenter, ChannelPresenter, + ChunterBrowser, + DmHeader, DmPresenter, EditChannel, - MessagesBrowser, Threads, ThreadView, SavedMessages }, function: { GetDmName: getDmName, - MessageBrowserVisible: messageBrowserVisible + ChunterBrowserVisible: chunterBrowserVisible }, activity: { TxCommentCreate, diff --git a/plugins/chunter-resources/src/plugin.ts b/plugins/chunter-resources/src/plugin.ts index c08b390f4c..8fefe6ed23 100644 --- a/plugins/chunter-resources/src/plugin.ts +++ b/plugins/chunter-resources/src/plugin.ts @@ -82,6 +82,9 @@ export default mergeIds(chunterId, chunter, { ChannelBrowser: '' as IntlString, SavedItems: '' as IntlString, AddMembersHeader: '' as IntlString, - MessagesBrowser: '' as IntlString + MessagesBrowser: '' as IntlString, + ChunterBrowser: '' as IntlString, + Messages: '' as IntlString, + NoResults: '' as IntlString } }) diff --git a/plugins/chunter-resources/src/utils.ts b/plugins/chunter-resources/src/utils.ts index 41e306d3ff..e752305c99 100644 --- a/plugins/chunter-resources/src/utils.ts +++ b/plugins/chunter-resources/src/utils.ts @@ -84,3 +84,16 @@ export function openMessageFromSpecial (message: ChunterMessage): void { } navigate(loc) } + +export function navigateToSpecial (specialId: string): void { + const loc = getCurrentLocation() + loc.path[2] = specialId + navigate(loc) +} + +export enum SearchType { + Messages, + Channels, + Files, + Contacts +} diff --git a/plugins/contact-resources/src/components/EmployeeBrowser.svelte b/plugins/contact-resources/src/components/EmployeeBrowser.svelte new file mode 100644 index 0000000000..8f34c3e32e --- /dev/null +++ b/plugins/contact-resources/src/components/EmployeeBrowser.svelte @@ -0,0 +1,56 @@ + + +
+ +
+ {#each employees as employee} +
+ +
+ {/each} +
+
+
+ + diff --git a/plugins/contact-resources/src/components/EmployeePresenter.svelte b/plugins/contact-resources/src/components/EmployeePresenter.svelte index 6d307078f1..c3be78e4ca 100644 --- a/plugins/contact-resources/src/components/EmployeePresenter.svelte +++ b/plugins/contact-resources/src/components/EmployeePresenter.svelte @@ -13,6 +13,7 @@ export let shouldShowName: boolean = true export let shouldShowPlaceholder = false export let onEmployeeEdit: ((event: MouseEvent) => void) | undefined = undefined + export let avatarSize: 'inline' | 'tiny' | 'x-small' | 'small' | 'medium' | 'large' | 'x-large' = 'x-small' let container: HTMLElement @@ -39,6 +40,7 @@ onEdit={handlePersonEdit} {shouldShowAvatar} {shouldShowName} + {avatarSize} {shouldShowPlaceholder} />
diff --git a/plugins/contact-resources/src/index.ts b/plugins/contact-resources/src/index.ts index 27f8a61147..3e1ed64dea 100644 --- a/plugins/contact-resources/src/index.ts +++ b/plugins/contact-resources/src/index.ts @@ -36,6 +36,7 @@ import PersonPresenter from './components/PersonPresenter.svelte' import SocialEditor from './components/SocialEditor.svelte' import contact from './plugin' import EmployeePresenter from './components/EmployeePresenter.svelte' +import EmployeeBrowser from './components/EmployeeBrowser.svelte' import EmployeeAccountPresenter from './components/EmployeeAccountPresenter.svelte' import OrganizationEditor from './components/OrganizationEditor.svelte' import PersonEditor from './components/PersonEditor.svelte' @@ -53,6 +54,7 @@ export { OrganizationSelector, ChannelsDropdown, EmployeePresenter, + EmployeeBrowser, MemberPresenter } diff --git a/plugins/view-resources/src/components/filter/FilterBar.svelte b/plugins/view-resources/src/components/filter/FilterBar.svelte index b369076665..afc67fa254 100644 --- a/plugins/view-resources/src/components/filter/FilterBar.svelte +++ b/plugins/view-resources/src/components/filter/FilterBar.svelte @@ -71,10 +71,7 @@ $: saveFilters(filters) function saveFilters (filters: Filter[]) { - const loc = getCurrentLocation() - loc.fragment = undefined - loc.query = undefined - const key = 'filter' + locationToUrl(loc) + const key = makeKey(_class) if (filters.length > 0) { localStorage.setItem(key, JSON.stringify(filters)) } else { @@ -87,10 +84,7 @@ function load (_class: Ref>) { loading = true const oldFilters = filters - const loc = getCurrentLocation() - loc.fragment = undefined - loc.query = undefined - const key = 'filter' + locationToUrl(loc) + const key = makeKey(_class) const saved = localStorage.getItem(key) if (saved !== null) { filters = JSON.parse(saved) @@ -101,6 +95,13 @@ oldFilters.forEach((p) => p.onRemove?.()) } + function makeKey (_class: Ref>): string { + const loc = getCurrentLocation() + loc.fragment = undefined + loc.query = undefined + return 'filter' + locationToUrl(loc) + _class + } + async function makeQuery (query: DocumentQuery, filters: Filter[]): Promise { const newQuery = hierarchy.clone(query) for (let i = 0; i < filters.length; i++) { diff --git a/plugins/view-resources/src/components/filter/FilterButton.svelte b/plugins/view-resources/src/components/filter/FilterButton.svelte index a745eb11ac..d68d8f7fb8 100644 --- a/plugins/view-resources/src/components/filter/FilterButton.svelte +++ b/plugins/view-resources/src/components/filter/FilterButton.svelte @@ -20,7 +20,7 @@ import view from '../../plugin' import FilterTypePopup from './FilterTypePopup.svelte' - export let _class: Ref> + export let _class: Ref> | undefined export let filters: Filter[] const client = getClient() @@ -44,8 +44,13 @@ ) } - $: clazz = hierarchy.getClass(_class) - $: visible = hierarchy.hasMixin(clazz, view.mixin.ClassFilters) + let visible: boolean + $: { + if (_class) { + const clazz = hierarchy.getClass(_class) + visible = hierarchy.hasMixin(clazz, view.mixin.ClassFilters) + } else visible = false + } {#if visible} diff --git a/plugins/view-resources/src/components/filter/ValueFilter.svelte b/plugins/view-resources/src/components/filter/ValueFilter.svelte index 7bdc5e994d..84d271dd3d 100644 --- a/plugins/view-resources/src/components/filter/ValueFilter.svelte +++ b/plugins/view-resources/src/components/filter/ValueFilter.svelte @@ -143,7 +143,7 @@
- {#if value} + {#if value !== undefined} -
-
- +{#if withHeader} +
+
+ +
+ {#if createItemDialog} +
- {#if createItemDialog} -
-
+
+ { + updateSearchQuery(search) + update(sort, resultQuery) + }} + /> +
+{/if} +{#if withFilterButton} +
+ +
+{/if} + (resultQuery = e.detail)} />
{#each spaces as space (space._id)} @@ -137,9 +175,11 @@
{/each} -
-
+ {#if createItemDialog} +
+
+ {/if}
diff --git a/plugins/workbench-resources/src/index.ts b/plugins/workbench-resources/src/index.ts index 32fc04fd68..2c80b762a6 100644 --- a/plugins/workbench-resources/src/index.ts +++ b/plugins/workbench-resources/src/index.ts @@ -26,7 +26,7 @@ import { doNavigate } from './utils' function hasArchiveSpaces (spaces: Space[]): boolean { return spaces.find((sp) => sp.archived) !== undefined } - +export { default as SpaceBrowser } from './components/SpaceBrowser.svelte' export default async (): Promise => ({ component: { WorkbenchApp,