From 68ae2f2e31276e2ca36f0108337f2a2016bae5ff Mon Sep 17 00:00:00 2001 From: Andrey Platov <87076238+aplatoff@users.noreply.github.com> Date: Fri, 26 Nov 2021 12:28:15 +0100 Subject: [PATCH] flush to develop (#380) Signed-off-by: Alexander Platov Co-authored-by: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com> Co-authored-by: Andrey Sobolev --- .../src/components/Channels.svelte | 153 ++---------------- .../src/components/ChannelsPopup.svelte | 65 ++++++++ .../src/components/icons/Copy.svelte | 2 +- .../src/components/message/Nodes.svelte | 8 + packages/theme/styles/_colors.scss | 2 + packages/theme/styles/_layouts.scss | 25 +++ .../ui/src/components/CircleButton.svelte | 31 +++- packages/ui/src/components/Tooltip.svelte | 5 +- .../ui/src/components/TooltipInstance.svelte | 73 +++++---- packages/ui/src/index.ts | 9 +- packages/ui/src/types.ts | 1 + .../src/components/Attachments.svelte | 105 ++++++------ .../src/components/CreateCandidate.svelte | 4 +- .../src/components/EditApplication.svelte | 80 --------- .../src/components/EditCandidate.svelte | 5 +- .../src/components/SocialEditor.svelte | 2 +- .../src/components/icons/Upload.svelte | 28 ++++ .../src/components/BooleanEditor.svelte | 30 ++-- .../src/components/KanbanPanel.svelte | 10 +- .../src/components/StringEditor.svelte | 2 +- .../src/components/Table.svelte | 1 + .../src/components/TableView.svelte | 1 + server/mongo/src/storage.ts | 17 +- 23 files changed, 312 insertions(+), 347 deletions(-) create mode 100644 packages/presentation/src/components/ChannelsPopup.svelte create mode 100644 plugins/recruit-resources/src/components/icons/Upload.svelte diff --git a/packages/presentation/src/components/Channels.svelte b/packages/presentation/src/components/Channels.svelte index a7c479d727..e01651772d 100644 --- a/packages/presentation/src/components/Channels.svelte +++ b/packages/presentation/src/components/Channels.svelte @@ -20,14 +20,14 @@ import type { Channel, ChannelProvider } from '@anticrm/contact' import { getClient } from '..' - import { AnyComponent, Icon } from '@anticrm/ui' - import IconCopy from './icons/Copy.svelte' + import { Tooltip, CircleButton } from '@anticrm/ui' + import ChannelsPopup from './ChannelsPopup.svelte' import contact from '@anticrm/contact' import { createEventDispatcher } from 'svelte' export let value: Channel[] | null - export let size: 'small' | 'medium' = 'medium' + export let size: 'small' | 'medium' | 'large' | 'x-large' = 'large' export let reverse: boolean = false interface Item { @@ -69,143 +69,20 @@ $: if (value) update(value) let displayItems: Item[] = [] + let divHTML: HTMLElement -
+
{}} +> {#each displayItems as item} -
{dispatch('click', item)}}> -
-
- -
-
-
-
-
-
-
-
{item.label}
-
{item.value}
-
-
{ alert('Copied: ' + item.value) }}> - -
-
-
+ + + {/each}
- - diff --git a/packages/presentation/src/components/ChannelsPopup.svelte b/packages/presentation/src/components/ChannelsPopup.svelte new file mode 100644 index 0000000000..ecff2913ed --- /dev/null +++ b/packages/presentation/src/components/ChannelsPopup.svelte @@ -0,0 +1,65 @@ + + + + +
+ +
+
{value.label}
+
{value.value}
+
+
+ +
+
+ + diff --git a/packages/presentation/src/components/icons/Copy.svelte b/packages/presentation/src/components/icons/Copy.svelte index 10398075dd..53dc155a56 100644 --- a/packages/presentation/src/components/icons/Copy.svelte +++ b/packages/presentation/src/components/icons/Copy.svelte @@ -1,6 +1,6 @@ diff --git a/packages/presentation/src/components/message/Nodes.svelte b/packages/presentation/src/components/message/Nodes.svelte index f77edd07d1..63594839e4 100644 --- a/packages/presentation/src/components/message/Nodes.svelte +++ b/packages/presentation/src/components/message/Nodes.svelte @@ -37,6 +37,14 @@ {:else if node.nodeName === 'BR'}
+ {:else if node.nodeName === 'H1'} +

+ {:else if node.nodeName === 'H2'} +

+ {:else if node.nodeName === 'UL'} +
+ {:else if node.nodeName === 'LI'} +
  • {:else if node.nodeName === 'SPAN'} {:else} diff --git a/packages/theme/styles/_colors.scss b/packages/theme/styles/_colors.scss index cc305c56fc..4485fc5f25 100644 --- a/packages/theme/styles/_colors.scss +++ b/packages/theme/styles/_colors.scss @@ -25,6 +25,8 @@ --primary-button-outline: rgba(87, 132, 255, .3); --primary-button-border: rgba(255, 255, 255, .09); + --duotone-color: rgba(126, 134, 158, .25); + --trans-primary-button-color: #fff; --trans-primary-button-bg: #4474F6; --trans-primary-button-border: transparent; diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index e61e0142cc..f30309b9e2 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -131,6 +131,9 @@ table { flex-direction: row-reverse; align-items: center; } +.flex-reverse { + flex-direction: row-reverse; +} .flex-col { display: flex; flex-direction: column; @@ -146,6 +149,25 @@ table { align-items: stretch; } +.safari-gap-1 { + & > * { margin-right: .25rem; } + & > *:last-child { margin-right: 0; } + &.reverse { + flex-direction: row-reverse; + & > :last-child { margin-right: .25rem; } + & > :first-child { margin-right: 0; } + } +} +.safari-gap-2 { + & > * { margin-right: .5rem; } + & > *:last-child { margin-right: 0; } + &.reverse { + flex-direction: row-reverse; + & > :last-child { margin-right: .5rem; } + & > :first-child { margin-right: 0; } + } +} + /* --------- */ .sm-tool-icon { display: flex; @@ -170,10 +192,13 @@ table { .step-lr75 + .step-lr75 { margin-left: .75rem; } .step-tb75 + .step-tb75 { margin-top: .75rem; } +.ml-1 { margin-left: .25rem; } .ml-2 { margin-left: .5rem; } +.ml-3 { margin-left: .75rem; } .mr-1 { margin-right: .25rem; } .mr-4 { margin-right: 1rem; } .mr-8 { margin-right: 2rem; } +.mt-2 { margin-top: .5rem; } .mt-5 { margin-top: 1.25rem; } .mb-1 { margin-bottom: .25rem; } diff --git a/packages/ui/src/components/CircleButton.svelte b/packages/ui/src/components/CircleButton.svelte index 66630c3035..83ce85d24d 100644 --- a/packages/ui/src/components/CircleButton.svelte +++ b/packages/ui/src/components/CircleButton.svelte @@ -19,15 +19,16 @@ import Icon from './Icon.svelte' export let icon: Asset | AnySvelteComponent - export let size: 'small' | 'medium' | 'large' = 'large' + export let size: 'small' | 'medium' | 'large' | 'x-large' = 'large' export let transparent: boolean = false export let selected: boolean = false + export let primary: boolean = false -
    +
    {#if typeof (icon) === 'string'} - + {:else} {/if} @@ -49,15 +50,27 @@ transform: scale(.75); pointer-events: none; } + &:hover { + color: var(--theme-caption-color); + border-color: var(--theme-bg-focused-border); + } + &:active { + color: var(--theme-content-accent-color); + background-color: var(--theme-bg-accent-color); + } &.selected { background-color: var(--theme-button-bg-hovered); } &.transparent { background-color: rgba(31, 31, 37, .3); } - &:hover { border-color: var(--theme-bg-focused-border); } - &:active { background-color: var(--theme-bg-accent-color); } + &.primary { + background-color: var(--primary-button-enabled); + border-color: var(--primary-button-border); + &:hover { background-color: var(--primary-button-hovered); } + &:active { background-color: var(--primary-button-pressed); } + } } .icon-small { width: 1.5rem; height: 1.5rem; - .content { transform: scale(.55); } + .content { transform: scale(.6); } } .icon-medium { width: 1.75rem; @@ -66,5 +79,11 @@ .icon-large { width: 2rem; height: 2rem; + .content { transform: scale(.9); } + } + .icon-x-large { + width: 2.25rem; + height: 2.25rem; + .content { transform: none; } } diff --git a/packages/ui/src/components/Tooltip.svelte b/packages/ui/src/components/Tooltip.svelte index cba9f01eb0..11dfe8ed36 100644 --- a/packages/ui/src/components/Tooltip.svelte +++ b/packages/ui/src/components/Tooltip.svelte @@ -19,9 +19,10 @@ import { tooltipstore as tooltip, showTooltip } from '..' export let label: IntlString | undefined - export let direction: TooltipAligment | undefined + export let direction: TooltipAligment | undefined = undefined export let component: AnySvelteComponent | AnyComponent | undefined = undefined export let props: any | undefined = undefined + export let anchor: HTMLElement | undefined = undefined let triggerHTML: HTMLElement let shown: boolean = false @@ -32,7 +33,7 @@ class="tooltip-trigger" bind:this={triggerHTML} on:mousemove={() => { - if (!shown) showTooltip(label, triggerHTML, direction, component, props) + if (!shown) showTooltip(label, triggerHTML, direction, component, props, anchor) }} > diff --git a/packages/ui/src/components/TooltipInstance.svelte b/packages/ui/src/components/TooltipInstance.svelte index 7734539bc9..5dc4493390 100644 --- a/packages/ui/src/components/TooltipInstance.svelte +++ b/packages/ui/src/components/TooltipInstance.svelte @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. --> + diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 29d6b17fb9..d503738cad 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -127,15 +127,16 @@ export const tooltipstore = writable({ element: undefined, direction: undefined, component: undefined, - props: undefined + props: undefined, + anchor: undefined }) -export function showTooltip (label: IntlString | undefined, element: HTMLElement, direction?: TooltipAligment, component?: AnySvelteComponent | AnyComponent, props?: any): void { - tooltipstore.set({ label: label, element: element, direction: direction, component: component, props: props }) +export function showTooltip (label: IntlString | undefined, element: HTMLElement, direction?: TooltipAligment, component?: AnySvelteComponent | AnyComponent, props?: any, anchor?: HTMLElement): void { + tooltipstore.set({ label: label, element: element, direction: direction, component: component, props: props, anchor: anchor }) } export function closeTooltip (): void { - tooltipstore.set({ label: undefined, element: undefined, direction: undefined, component: undefined, props: undefined }) + tooltipstore.set({ label: undefined, element: undefined, direction: undefined, component: undefined, props: undefined, anchor: undefined }) } export const ticker = readable(Date.now(), set => { diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index 1dbdf4a3f1..adf95e6e7d 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -64,6 +64,7 @@ export interface LabelAndProps { direction?: TooltipAligment component?: AnySvelteComponent | AnyComponent props?: any + anchor: HTMLElement | undefined } export interface ListItem { diff --git a/plugins/recruit-resources/src/components/Attachments.svelte b/plugins/recruit-resources/src/components/Attachments.svelte index 07cdbb5525..bd1eeb5543 100644 --- a/plugins/recruit-resources/src/components/Attachments.svelte +++ b/plugins/recruit-resources/src/components/Attachments.svelte @@ -14,7 +14,7 @@ -->
    @@ -76,14 +91,30 @@ {:else} { inputFile.click() } } /> {/if} - +
    - + + {#if attachments.length === 0 && !loading} +
    { dragover = true } } + on:dragleave={ () => { dragover = false } } + on:drop|preventDefault|stopPropagation={fileDrop} + on:click={ () => { inputFile.click() } } + > + +
    There are no attachments for this candidate.
    +
    + Upload or drop files here +
    +
    + {:else} +
    + {/if} \ No newline at end of file diff --git a/plugins/recruit-resources/src/components/CreateCandidate.svelte b/plugins/recruit-resources/src/components/CreateCandidate.svelte index cd145e6a75..831c5e34ec 100644 --- a/plugins/recruit-resources/src/components/CreateCandidate.svelte +++ b/plugins/recruit-resources/src/components/CreateCandidate.svelte @@ -151,7 +151,9 @@ {:else} - showPopup(SocialEditor, { values: object.channels ?? [] }, ev.target, (result) => { object.channels = result })} /> +
    + showPopup(SocialEditor, { values: object.channels ?? [] }, ev.target, (result) => { object.channels = result })} /> +
    {/if} diff --git a/plugins/recruit-resources/src/components/EditApplication.svelte b/plugins/recruit-resources/src/components/EditApplication.svelte index 5003d84f73..72f7f9811b 100644 --- a/plugins/recruit-resources/src/components/EditApplication.svelte +++ b/plugins/recruit-resources/src/components/EditApplication.svelte @@ -73,18 +73,6 @@ --> - -
    @@ -98,57 +86,6 @@ {/if} diff --git a/plugins/recruit-resources/src/components/EditCandidate.svelte b/plugins/recruit-resources/src/components/EditCandidate.svelte index bd5c32456c..7b135411dd 100644 --- a/plugins/recruit-resources/src/components/EditCandidate.svelte +++ b/plugins/recruit-resources/src/components/EditCandidate.svelte @@ -23,7 +23,6 @@ import { Panel } from '@anticrm/panel' import type { Candidate } from '@anticrm/recruit' import Contact from './icons/Contact.svelte' - import IconAvatar from './icons/Avatar.svelte' import Attachments from './Attachments.svelte' import Edit from './icons/Edit.svelte' import SocialEditor from './SocialEditor.svelte' @@ -91,7 +90,9 @@ rightSection = ev.detail.presenter } }} /> - showPopup(SocialEditor, { values: object.channels ?? [] }, ev.target, (result) => { saveChannels(result) })} /> +
    + showPopup(SocialEditor, { values: object.channels ?? [] }, ev.target, (result) => { saveChannels(result) })} /> +
    {/if}
    diff --git a/plugins/recruit-resources/src/components/SocialEditor.svelte b/plugins/recruit-resources/src/components/SocialEditor.svelte index e49c9df605..adc2cbbaed 100644 --- a/plugins/recruit-resources/src/components/SocialEditor.svelte +++ b/plugins/recruit-resources/src/components/SocialEditor.svelte @@ -106,6 +106,6 @@ align-items: center; margin-top: 1rem; .btn { flex-grow: 1; } - .btn + .btn { margin-left: .75rem; } + // .btn + .btn { margin-left: .75rem; } } diff --git a/plugins/recruit-resources/src/components/icons/Upload.svelte b/plugins/recruit-resources/src/components/icons/Upload.svelte new file mode 100644 index 0000000000..ee79d553c9 --- /dev/null +++ b/plugins/recruit-resources/src/components/icons/Upload.svelte @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/plugins/view-resources/src/components/BooleanEditor.svelte b/plugins/view-resources/src/components/BooleanEditor.svelte index bc23dedb62..c07be7be13 100644 --- a/plugins/view-resources/src/components/BooleanEditor.svelte +++ b/plugins/view-resources/src/components/BooleanEditor.svelte @@ -15,15 +15,11 @@ --> + -
    { - if (value === true) value = false - else if (value === false) value = undefined - else value = true - onChange(value) -}}> +
    { + if (value === true) value = false + else if (value === false) value = undefined + else value = true + onChange(value) + }} +> {#if value === true} diff --git a/plugins/view-resources/src/components/KanbanPanel.svelte b/plugins/view-resources/src/components/KanbanPanel.svelte index a59880b30f..f997f73a66 100644 --- a/plugins/view-resources/src/components/KanbanPanel.svelte +++ b/plugins/view-resources/src/components/KanbanPanel.svelte @@ -19,7 +19,7 @@ export let label: IntlString export let color: string - export let counter: number + // export let counter: number export let addAction: () => void | undefined @@ -71,10 +71,10 @@ height: 100%; font-weight: 500; color: var(--theme-caption-color); - span { - font-weight: 400; - color: var(--theme-content-dark-color); - } + // span { + // font-weight: 400; + // color: var(--theme-content-dark-color); + // } } .tool { opacity: .4; diff --git a/plugins/view-resources/src/components/StringEditor.svelte b/plugins/view-resources/src/components/StringEditor.svelte index 19ab0b8709..73613a5d5e 100644 --- a/plugins/view-resources/src/components/StringEditor.svelte +++ b/plugins/view-resources/src/components/StringEditor.svelte @@ -19,7 +19,7 @@ import type { IntlString } from '@anticrm/platform' import { EditBox } from '@anticrm/ui' -export let label: IntlString +// export let label: IntlString export let placeholder: IntlString export let value: any export let focus: boolean diff --git a/plugins/view-resources/src/components/Table.svelte b/plugins/view-resources/src/components/Table.svelte index 524b9bdddb..2335203651 100644 --- a/plugins/view-resources/src/components/Table.svelte +++ b/plugins/view-resources/src/components/Table.svelte @@ -158,6 +158,7 @@ color: var(--theme-caption-color); border-bottom: 1px solid var(--theme-button-border-hovered); &:hover .firstCell .menuRow { visibility: visible; } + &:last-child { border-bottom: none; } } .fixed .menuRow { visibility: visible; } diff --git a/plugins/view-resources/src/components/TableView.svelte b/plugins/view-resources/src/components/TableView.svelte index 688217c1de..dc903557a7 100644 --- a/plugins/view-resources/src/components/TableView.svelte +++ b/plugins/view-resources/src/components/TableView.svelte @@ -200,6 +200,7 @@ .checkCell { visibility: visible; } } &:hover .firstCell .menuRow { visibility: visible; } + &:last-child { border-bottom: none; } } .fixed { diff --git a/server/mongo/src/storage.ts b/server/mongo/src/storage.ts index 2706fb2d13..e3fbae62b1 100644 --- a/server/mongo/src/storage.ts +++ b/server/mongo/src/storage.ts @@ -151,6 +151,11 @@ class MongoAdapter extends MongoAdapterBase { protected override async txUpdateDoc (tx: TxUpdateDoc): Promise { const domain = this.hierarchy.getDomain(tx.objectClass) + const operations = { + ...tx.operations, + modifiedBy: tx.modifiedBy, + modifiedOn: tx.modifiedOn + } if (isOperator(tx.operations)) { const operator = Object.keys(tx.operations)[0] if (operator === '$move') { @@ -172,6 +177,10 @@ class MongoAdapter extends MongoAdapterBase { updateOne: { filter: { _id: tx.objectId }, update: { + $set: { + modifiedBy: tx.modifiedBy, + modifiedOn: tx.modifiedOn + }, $push: { [arr]: { $each: [desc.$value], @@ -186,18 +195,18 @@ class MongoAdapter extends MongoAdapterBase { return await this.db.collection(domain).bulkWrite(ops as any) } else { if (tx.retrieve === true) { - const result = await this.db.collection(domain).findOneAndUpdate({ _id: tx.objectId }, tx.operations, { returnDocument: 'after' }) + const result = await this.db.collection(domain).findOneAndUpdate({ _id: tx.objectId }, operations, { returnDocument: 'after' }) return { object: result.value } } else { - return await this.db.collection(domain).updateOne({ _id: tx.objectId }, tx.operations) + return await this.db.collection(domain).updateOne({ _id: tx.objectId }, operations) } } } else { if (tx.retrieve === true) { - const result = await this.db.collection(domain).findOneAndUpdate({ _id: tx.objectId }, { $set: tx.operations }, { returnDocument: 'after' }) + const result = await this.db.collection(domain).findOneAndUpdate({ _id: tx.objectId }, { $set: operations }, { returnDocument: 'after' }) return { object: result.value } } else { - return await this.db.collection(domain).updateOne({ _id: tx.objectId }, { $set: tx.operations }) + return await this.db.collection(domain).updateOne({ _id: tx.objectId }, { $set: operations }) } } }