From e5187e7d4a84388925a8192e2e3def1ac97b7b38 Mon Sep 17 00:00:00 2001 From: Alexander Platov Date: Sun, 17 Apr 2022 07:05:10 +0300 Subject: [PATCH] Add TagsDropdownEditor. Fix layout. (#1422) Signed-off-by: Alexander Platov --- packages/theme/styles/_layouts.scss | 6 +- packages/theme/styles/dialogs.scss | 2 +- packages/ui/src/components/CheckBox.svelte | 6 - packages/ui/src/components/Link.svelte | 14 +-- .../src/components/Activity.svelte | 2 +- .../src/components/TxViewTx.svelte | 2 +- .../src/components/CreateCandidate.svelte | 92 ++++++++++----- .../src/components/icons/FileUpload.svelte | 2 +- .../src/components/TagItem.svelte | 2 +- .../tags-resources/src/components/Tags.svelte | 5 +- .../src/components/TagsDropdownEditor.svelte | 93 +++++++++++++++ .../src/components/TagsEditor.svelte | 110 +++++++++++++----- .../src/components/TagsPopup.svelte | 19 ++- plugins/tags-resources/src/index.ts | 2 + plugins/tags/src/index.ts | 1 + 15 files changed, 261 insertions(+), 97 deletions(-) create mode 100644 plugins/tags-resources/src/components/TagsDropdownEditor.svelte diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index 1482b17517..dcee918a73 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -88,6 +88,7 @@ table { --modal-padding: 1.5rem; } +p { user-select: text; } p:first-child { margin-block-start: 0; } // First and last padding p:last-child { margin-block-end: 0; } @@ -109,8 +110,8 @@ p:last-child { margin-block-end: 0; } .inline-flex { display: inline-flex; } .flex-grow { flex-grow: 1; } .flex-no-shrink { flex-shrink: 0; } -.flex-wrap { flex-wrap: wrap; } -.flex-nowrap { flex-wrap: nowrap; } +.flex-wrap { flex-wrap: wrap !important; } +.flex-nowrap { flex-wrap: nowrap !important; } .flex-baseline { display: inline-flex; align-items: baseline; @@ -446,6 +447,7 @@ a.no-line { .cursor-default { cursor: default; } .pointer-events-none { pointer-events: none; } +.select-text { user-select: text; } /* Text */ diff --git a/packages/theme/styles/dialogs.scss b/packages/theme/styles/dialogs.scss index 9d2bd1e61b..ff7d4264d8 100644 --- a/packages/theme/styles/dialogs.scss +++ b/packages/theme/styles/dialogs.scss @@ -188,7 +188,7 @@ align-items: center; padding: .75rem; height: auto; - border-top: 1px solid var(--button-bg-color); + border-top: 1px solid var(--divider-color); &.reverse { flex-direction: row-reverse; } &__error { diff --git a/packages/ui/src/components/CheckBox.svelte b/packages/ui/src/components/CheckBox.svelte index 2cf2878991..74ea87828e 100644 --- a/packages/ui/src/components/CheckBox.svelte +++ b/packages/ui/src/components/CheckBox.svelte @@ -80,12 +80,6 @@ overflow: hidden; &:checked + .checkSVG { - & .back { - fill: var(--theme-bg-check); - &.primary { - fill: var(--primary-bg-color); - } - } & .check { visibility: visible; fill: var(--theme-button-bg-enabled); diff --git a/packages/ui/src/components/Link.svelte b/packages/ui/src/components/Link.svelte index 3a82da9169..84675854fa 100644 --- a/packages/ui/src/components/Link.svelte +++ b/packages/ui/src/components/Link.svelte @@ -50,16 +50,16 @@ .icon { margin-right: .25rem; - color: var(--theme-content-color); + color: var(--content-color); } - &:hover .icon { color: var(--theme-caption-color); } - &:active .icon { color: var(--theme-content-accent-color); } + &:hover .icon { color: var(--accent-color); } + &:active .icon { color: var(--caption-color); } } .disabled { cursor: not-allowed; - color: var(--theme-content-trans-color); - .icon { color: var(--theme-content-trans-color); } - &:hover .icon { color: var(--theme-content-trans-color); } - &:active .icon { color: var(--theme-content-trans-color); } + color: var(--dark-color); + .icon { color: var(--dark-color); } + &:hover .icon { color: var(--dark-color); } + &:active .icon { color: var(--dark-color); } } diff --git a/plugins/activity-resources/src/components/Activity.svelte b/plugins/activity-resources/src/components/Activity.svelte index 7f4a49c4ec..d22d9ef409 100644 --- a/plugins/activity-resources/src/components/Activity.svelte +++ b/plugins/activity-resources/src/components/Activity.svelte @@ -66,7 +66,7 @@ {/if}
-
+
{#if txes} {#each txes as tx (tx.tx._id)} diff --git a/plugins/activity-resources/src/components/TxViewTx.svelte b/plugins/activity-resources/src/components/TxViewTx.svelte index 377b87fdd9..0041dbc514 100644 --- a/plugins/activity-resources/src/components/TxViewTx.svelte +++ b/plugins/activity-resources/src/components/TxViewTx.svelte @@ -47,7 +47,7 @@ diff --git a/plugins/recruit-resources/src/components/icons/FileUpload.svelte b/plugins/recruit-resources/src/components/icons/FileUpload.svelte index a8fa6c4b1b..a78abb021c 100644 --- a/plugins/recruit-resources/src/components/icons/FileUpload.svelte +++ b/plugins/recruit-resources/src/components/icons/FileUpload.svelte @@ -16,7 +16,7 @@ diff --git a/plugins/tags-resources/src/components/TagItem.svelte b/plugins/tags-resources/src/components/TagItem.svelte index 838701d918..5350e6eebb 100644 --- a/plugins/tags-resources/src/components/TagItem.svelte +++ b/plugins/tags-resources/src/components/TagItem.svelte @@ -41,7 +41,7 @@ > {name} {#if action} -
+
addRef(evt.detail)} on:delete={(evt) => removeTag(evt.detail)} - countLabel={key.attr.label} /> diff --git a/plugins/tags-resources/src/components/TagsDropdownEditor.svelte b/plugins/tags-resources/src/components/TagsDropdownEditor.svelte new file mode 100644 index 0000000000..4af77055b4 --- /dev/null +++ b/plugins/tags-resources/src/components/TagsDropdownEditor.svelte @@ -0,0 +1,93 @@ + + + + + + diff --git a/plugins/tags-resources/src/components/TagsEditor.svelte b/plugins/tags-resources/src/components/TagsEditor.svelte index f0e3a4d852..e9ea0d069f 100644 --- a/plugins/tags-resources/src/components/TagsEditor.svelte +++ b/plugins/tags-resources/src/components/TagsEditor.svelte @@ -18,23 +18,17 @@ import { KeyedAttribute } from '@anticrm/presentation' import { TagElement, TagReference } from '@anticrm/tags' import type { ButtonKind, ButtonSize, TooltipAlignment } from '@anticrm/ui' - import { Button, showPopup, Tooltip } from '@anticrm/ui' - import { createEventDispatcher } from 'svelte' + import { ShowMore, Label, CircleButton, Button, showPopup, Tooltip, IconAdd, IconClose } from '@anticrm/ui' + import { createEventDispatcher, afterUpdate } from 'svelte' import tags from '../plugin' import TagsPopup from './TagsPopup.svelte' + import TagItem from './TagItem.svelte' export let items: TagReference[] = [] export let targetClass: Ref> export let key: KeyedAttribute export let showTitle = true export let elements: Map, TagElement> - export let countLabel: IntlString - - export let kind: ButtonKind = 'no-border' - export let size: ButtonSize = 'small' - export let justify: 'left' | 'center' = 'center' - export let width: string | undefined = undefined - export let labelDirection: TooltipAlignment | undefined = undefined const dispatch = createEventDispatcher() @@ -54,12 +48,18 @@ TagsPopup, { targetClass, - addRef, - removeTag, selected: items.map((it) => it.tag), - keyLabel + keyLabel, + hideAdd: true }, - evt.target as HTMLElement + evt.target as HTMLElement, + () => { }, + (result) => { + if (result != undefined) { + if (result.action === 'add') addRef(result.tag) + else if (result.action === 'remove') removeTag(items.filter(it => it.tag === result.tag._id)[0]._id) + } + } ) } @@ -68,22 +68,68 @@ } - - - +
+ {#if showTitle} +
+
+
+
+ + + +
+
+ {/if} + +
+
+ {#if items.length === 0} + {#if keyLabel} +
+
+ {/if} + {/if} + {#each items as tag} + { + removeTag(tag._id) + }} + /> + {/each} +
+
+
+
+ + diff --git a/plugins/tags-resources/src/components/TagsPopup.svelte b/plugins/tags-resources/src/components/TagsPopup.svelte index c429ecbc63..48b5a1a3af 100644 --- a/plugins/tags-resources/src/components/TagsPopup.svelte +++ b/plugins/tags-resources/src/components/TagsPopup.svelte @@ -17,7 +17,7 @@ import type { IntlString } from '@anticrm/platform' import { translate } from '@anticrm/platform' import presentation, { createQuery, getClient } from '@anticrm/presentation' - import { TagCategory, TagElement } from '@anticrm/tags' + import { TagCategory, TagElement, TagReference } from '@anticrm/tags' import { CheckBox, Button, Icon, IconAdd, IconClose, Label, showPopup, getPlatformColor } from '@anticrm/ui' import { createEventDispatcher } from 'svelte' import tags from '../plugin' @@ -27,10 +27,9 @@ export let targetClass: Ref> export let placeholder: IntlString = presentation.string.Search - export let addRef: (tag: TagElement) => Promise - export let removeTag: (tag: TagElement) => Promise export let selected: Ref[] = [] export let keyLabel: string = '' + export let hideAdd: boolean = false let search: string = '' let searchElement: HTMLInputElement @@ -60,10 +59,6 @@ async function createTagElement (): Promise { showPopup(CreateTagElement, { targetClass }, 'top') } - async function addTag (element: TagElement): Promise { - await addRef(element) - selected = [...selected, element._id] - } const isSelected = (element: TagElement): boolean => { if (selected.filter(p => p === element._id).length > 0) return true @@ -72,14 +67,14 @@ const checkSelected = (element: TagElement): void => { if (isSelected(element)) { selected = selected.filter(p => p !== element._id) - removeTag(element) + dispatch('update', { action: 'remove', tag: element }) } else { - selected.push(element._id) - addTag(element) + selected = [...selected, element._id] + dispatch('update', { action: 'add', tag: element }) } objects = objects categories = categories - dispatch('update', selected) + dispatch('update', { action: 'selected', selected: selected}) } const toggleGroup = (ev: MouseEvent): void => { const el: HTMLElement = ev.currentTarget as HTMLElement @@ -106,7 +101,7 @@ {#if search !== ''}
{/if}
diff --git a/plugins/tags-resources/src/index.ts b/plugins/tags-resources/src/index.ts index 8209deb729..e160b4e291 100644 --- a/plugins/tags-resources/src/index.ts +++ b/plugins/tags-resources/src/index.ts @@ -21,6 +21,7 @@ import TagsPresenter from './components/TagsPresenter.svelte' import TagsItemPresenter from './components/TagsItemPresenter.svelte' import TagsView from './components/TagsView.svelte' import TagsEditor from './components/TagsEditor.svelte' +import TagsDropdownEditor from './components/TagsDropdownEditor.svelte' import CategoryPresenter from './components/CategoryPresenter.svelte' import tags from './plugin' import TagsCategoryBar from './components/CategoryBar.svelte' @@ -33,6 +34,7 @@ export default async (): Promise => ({ TagsPresenter, TagsView, TagsEditor, + TagsDropdownEditor, TagsItemPresenter, CategoryPresenter, TagsCategoryBar diff --git a/plugins/tags/src/index.ts b/plugins/tags/src/index.ts index b7d2688bd2..89bf390238 100644 --- a/plugins/tags/src/index.ts +++ b/plugins/tags/src/index.ts @@ -79,6 +79,7 @@ const tagsPlugin = plugin(tagsId, { component: { TagsView: '' as AnyComponent, TagsEditor: '' as AnyComponent, + TagsDropdownEditor: '' as AnyComponent, TagsCategoryBar: '' as AnyComponent }, category: {