From fa2e1b32292dd57eb7c17922bf862c3a210a7003 Mon Sep 17 00:00:00 2001 From: Anna No Date: Tue, 12 Apr 2022 14:59:36 +0700 Subject: [PATCH] Board: Add card details (members, labels, date) (#1376) Signed-off-by: Anna No --- models/board/src/plugin.ts | 48 +------ packages/theme/styles/_layouts.scss | 8 +- packages/ui/src/components/Button.svelte | 4 +- .../ui/src/components/CircleButton.svelte | 9 +- packages/ui/src/components/Panel.svelte | 42 +++--- .../components/calendar/DatePresenter.svelte | 9 +- .../src/components/CardPresenter.svelte | 1 - .../src/components/EditCard.svelte | 126 ++++++++++-------- .../src/components/KanbanCard.svelte | 4 +- .../src/components/editor/CardDetails.svelte | 105 +++++++++++++++ .../src/components/editor/CardFields.svelte | 24 ---- .../presenters/DatePresenter.svelte | 27 ++++ .../presenters/LabelPresenter.svelte | 18 +++ .../presenters/MemberPresenter.svelte | 25 ++++ .../src/utils/CardActionUtils.ts | 6 +- .../board-resources/src/utils/CardUtils.ts | 4 + plugins/board/src/index.ts | 58 ++++++-- 17 files changed, 357 insertions(+), 161 deletions(-) create mode 100644 plugins/board-resources/src/components/editor/CardDetails.svelte delete mode 100644 plugins/board-resources/src/components/editor/CardFields.svelte create mode 100644 plugins/board-resources/src/components/presenters/DatePresenter.svelte create mode 100644 plugins/board-resources/src/components/presenters/LabelPresenter.svelte create mode 100644 plugins/board-resources/src/components/presenters/MemberPresenter.svelte diff --git a/models/board/src/plugin.ts b/models/board/src/plugin.ts index ce8f1b505a..09d4385169 100644 --- a/models/board/src/plugin.ts +++ b/models/board/src/plugin.ts @@ -14,10 +14,10 @@ // limitations under the License. // -import { boardId, Card, CardAction } from '@anticrm/board' +import { boardId } from '@anticrm/board' import board from '@anticrm/board-resources/src/plugin' -import type { TxOperations as Client, Ref, Space } from '@anticrm/core' -import { mergeIds, Resource } from '@anticrm/platform' +import type { Ref, Space } from '@anticrm/core' +import { mergeIds } from '@anticrm/platform' import { KanbanTemplate, Sequence } from '@anticrm/task' import type { AnyComponent } from '@anticrm/ui' import { ViewletDescriptor } from '@anticrm/view' @@ -32,48 +32,6 @@ export default mergeIds(boardId, board, { Cards: '' as AnyComponent, KanbanView: '' as AnyComponent }, - cardAction: { - Cover: '' as Ref, - Join: '' as Ref, - Members: '' as Ref, - Labels: '' as Ref, - Checklist: '' as Ref, - Dates: '' as Ref, - Attachments: '' as Ref, - CustomFields: '' as Ref, - AddButton: '' as Ref, - Move: '' as Ref, - Copy: '' as Ref, - MakeTemplate: '' as Ref, - Watch: '' as Ref, - Archive: '' as Ref, - SendToBoard: '' as Ref, - Delete: '' as Ref - }, - cardActionHandler: { - Cover: '' as Resource<(card: Card, client: Client) => void>, - Join: '' as Resource<(card: Card, client: Client) => void>, - Members: '' as Resource<(card: Card, client: Client) => void>, - Labels: '' as Resource<(card: Card, client: Client) => void>, - Checklist: '' as Resource<(card: Card, client: Client) => void>, - Dates: '' as Resource<(card: Card, client: Client) => void>, - Attachments: '' as Resource<(card: Card, client: Client) => void>, - CustomFields: '' as Resource<(card: Card, client: Client) => void>, - AddButton: '' as Resource<(card: Card, client: Client) => void>, - Move: '' as Resource<(card: Card, client: Client) => void>, - Copy: '' as Resource<(card: Card, client: Client) => void>, - MakeTemplate: '' as Resource<(card: Card, client: Client) => void>, - Watch: '' as Resource<(card: Card, client: Client) => void>, - Archive: '' as Resource<(card: Card, client: Client) => void>, - SendToBoard: '' as Resource<(card: Card, client: Client) => void>, - Delete: '' as Resource<(card: Card, client: Client) => void> - }, - cardActionSupportedHandler: { - Join: '' as Resource<(card: Card, client: Client) => boolean>, - Archive: '' as Resource<(card: Card, client: Client) => boolean>, - SendToBoard: '' as Resource<(card: Card, client: Client) => boolean>, - Delete: '' as Resource<(card: Card, client: Client) => boolean> - }, space: { DefaultBoard: '' as Ref }, diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index b6880d7f3b..e13120e4d2 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -374,6 +374,8 @@ p:last-child { margin-block-end: 0; } .w-85 {width: 21.25rem; } .w-165 {width: 41.25rem; } .min-w-0 { min-width: 0; } +.min-w-4 { min-width: 1rem; } +.min-w-9 { min-width: 2.25rem; } .min-h-0 { min-height: 0; } .clear-mins { min-width: 0; @@ -530,6 +532,7 @@ a.no-line { /* Backgrounds & Colors */ .background-theme-bg-color { background-color: var(--theme-bg-color); } .background-highlight-red { background-color: var(--highlight-red); } +.background-button-bg-color { background-color: var(--button-bg-color); } .background-button-bg-enabled { background-color: var(--theme-button-bg-enabled); } .background-menu-divider { background-color: var(--theme-menu-divider); } .background-card-divider { background-color: var(--theme-card-divider); } @@ -545,7 +548,10 @@ a.no-line { .red-color { color: var(--highlight-red); } -.border-radius-3 {border-radius: 0.75rem;} +.border-radius-4 { border-radius: 1rem; } +.border-radius-3 { border-radius: 0.75rem; } +.border-radius-2 { border-radius: 0.5rem; } +.border-radius-1 { border-radius: 0.25rem; } .border-bg-accent {border: 1px solid var(--theme-bg-accent-color);} .border-primary-button { border-color: var(--primary-button-border); } .border-button-enabled { border: 1px solid var(--theme-button-border-enabled); } diff --git a/packages/ui/src/components/Button.svelte b/packages/ui/src/components/Button.svelte index 0fa2b75b7e..361b74c0b2 100644 --- a/packages/ui/src/components/Button.svelte +++ b/packages/ui/src/components/Button.svelte @@ -30,6 +30,7 @@ export let width: string | undefined = undefined export let resetIconSize: boolean = false export let focus: boolean = false + export let isCircle: boolean = false export let input: HTMLButtonElement | undefined = undefined @@ -47,6 +48,8 @@ bind:this={input} class="button {kind} {size} jf-{justify}" class:only-icon={iconOnly} + class:border-radius-1={!isCircle} + class:border-radius-4={isCircle} disabled={disabled || loading} style={width ? 'width: ' + width : ''} on:click @@ -101,7 +104,6 @@ color: var(--accent-color); background-color: transparent; border: 1px solid transparent; - border-radius: .25rem; transition-property: border, background-color, color, box-shadow; transition-duration: .15s; diff --git a/packages/ui/src/components/CircleButton.svelte b/packages/ui/src/components/CircleButton.svelte index d186de9976..360cf93237 100644 --- a/packages/ui/src/components/CircleButton.svelte +++ b/packages/ui/src/components/CircleButton.svelte @@ -18,7 +18,7 @@ import type { AnySvelteComponent } from '../types' import Icon from './Icon.svelte' - export let icon: Asset | AnySvelteComponent + export let icon: Asset | AnySvelteComponent | undefined export let size: 'small' | 'medium' | 'large' | 'x-large' = 'large' export let transparent: boolean = false export let selected: boolean = false @@ -27,7 +27,12 @@
- + {#if $$slots.content} + + {:else if icon} + + {/if} +
diff --git a/packages/ui/src/components/Panel.svelte b/packages/ui/src/components/Panel.svelte index afffa5546d..c33bf9d51b 100644 --- a/packages/ui/src/components/Panel.svelte +++ b/packages/ui/src/components/Panel.svelte @@ -25,28 +25,34 @@ export let icon: Asset | AnySvelteComponent | undefined = undefined export let rightSection: boolean = false export let reverseCommands = false + export let showHeader = true const dispatch = createEventDispatcher() +
-
-
- {#if icon}
{/if} -
- {#if title} - {title} + {#if showHeader} +
+
+ {#if icon} +
+ +
{/if} - {#if subtitle}{subtitle}{/if} +
+ {#if title}{title}{/if} + {#if subtitle}{subtitle}{/if} +
+ {#if rightSection} +
+ +
+ {/if}
- {#if rightSection} -
- -
- {/if} -
+ {/if} {#if $$slots.subtitle}
@@ -54,13 +60,13 @@
{/if} -
+
{#if rightSection} - + {/if}
@@ -69,15 +75,14 @@
{/if} - +
{ dispatch('close') - }} - /> + }} />
@@ -89,4 +94,5 @@ flex-direction: column; align-content: stretch; } + diff --git a/packages/ui/src/components/calendar/DatePresenter.svelte b/packages/ui/src/components/calendar/DatePresenter.svelte index 65c5cf28d7..fa781e1d02 100644 --- a/packages/ui/src/components/calendar/DatePresenter.svelte +++ b/packages/ui/src/components/calendar/DatePresenter.svelte @@ -28,6 +28,7 @@ export let icon: 'normal' | 'warning' | 'overdue' = 'normal' export let labelOver: IntlString | undefined = undefined // label instead of date export let labelNull: IntlString = ui.string.NoDate + export let showIcon = true const dispatch = createEventDispatcher() @@ -64,9 +65,11 @@ } }} > -
- -
+ {#if showIcon} +
+ +
+ {/if} {#if value !== null && value !== undefined} {#if labelOver !== undefined}