Fixed filters, popups, tags, activity. (#3260)

Signed-off-by: Alexander Platov <sas_lord@mail.ru>
This commit is contained in:
Alexander Platov 2023-05-26 06:04:17 +03:00 committed by GitHub
parent ea6612cdb7
commit b7463a3a16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 130 additions and 104 deletions

View File

@ -282,6 +282,7 @@ input.search {
&:not(.small-gap, .large-gap) { margin-right: .375rem; }
&.small-gap { margin-right: .25rem; }
&.large-gap { margin-right: .5rem; }
&.flow:last-child { margin-right: 0; }
}
.label {
min-width: 0;
@ -338,6 +339,7 @@ input.search {
.icon.circle { transform: translateY(.375rem); }
.avatar-container:not(.no-img) { transform: translateY(.375rem); }
.avatar-container.no-img { transform: translateY(.15rem); }
.emoji { transform: none; }
}
.buttons-group {

View File

@ -11,6 +11,47 @@
transition-property: border, background-color, color, box-shadow;
transition-duration: 0.15s;
&.inline {
height: 1.375rem;
font-size: 0.75rem;
line-height: 0.75rem;
&.only-icon {
width: 1.375rem;
}
}
&.x-small {
height: 1.5rem;
font-size: 0.75rem;
&.only-icon {
width: 1.5rem;
}
}
&.small {
height: 1.75rem;
font-size: 0.8125rem;
&.only-icon {
width: 1.75rem;
}
}
&.medium {
height: 2rem;
&.only-icon {
width: 2rem;
}
}
&.large {
height: 2.25rem;
&.only-icon {
width: 2.25rem;
}
}
&.x-large {
height: 2.75rem;
&.only-icon {
width: 2.75rem;
}
}
&.iconL:not(.iconR) {
padding: 0 1rem 0 0.75rem;
}
@ -89,7 +130,7 @@
color: var(--theme-caption-color);
}
}
&:focus {
&:not(.no-focus):focus {
&:not(.sh-filter) {
box-shadow: 0 0 0 2px var(--primary-button-focused-border);
}
@ -239,7 +280,7 @@
background-color: var(--theme-button-hovered);
border-color: var(--theme-button-border);
}
&:focus {
&:not(.no-focus):focus {
box-shadow: none;
}
}
@ -287,7 +328,7 @@
&:hover {
background-color: var(--dangerous-bg-hover);
}
&:focus {
&:not(.no-focus):focus {
box-shadow: var(--dangerous-shadow);
}
}

View File

@ -19,7 +19,7 @@
display: flex;
flex-direction: column;
width: fit-content;
min-width: 10rem;
min-width: 12.5rem;
max-width: 17rem;
max-height: 22rem;
background: var(--theme-popup-color);

View File

@ -51,6 +51,7 @@
export let iconRightSize: IconSize = 'x-small'
export let short: boolean = false
export let accent: boolean = false
export let noFocus: boolean = false
// $: iconSize = size === 'inline' ? 'inline' : 'small'
let iconOnly: boolean = false
@ -100,6 +101,7 @@
bind:this={input}
class="antiButton {kind} {size} jf-{justify} sh-{shape ?? 'no-shape'} bs-{borderStyle}"
class:only-icon={iconOnly}
class:no-focus={noFocus}
class:accent
class:highlight
class:selected
@ -143,46 +145,3 @@
{#if $$slots.content}<slot name="content" />{/if}
{#if $$slots.iconRight}<slot name="iconRight" />{/if}
</button>
<style lang="scss">
.inline {
height: 1.375rem;
font-size: 0.75rem;
line-height: 0.75rem;
&.only-icon {
width: 1.375rem;
}
}
.x-small {
height: 1.5rem;
font-size: 0.75rem;
&.only-icon {
width: 1.5rem;
}
}
.small {
height: 1.75rem;
font-size: 0.8125rem;
&.only-icon {
width: 1.75rem;
}
}
.medium {
height: 2rem;
&.only-icon {
width: 2rem;
}
}
.large {
height: 2.25rem;
&.only-icon {
width: 2.25rem;
}
}
.x-large {
height: 2.75rem;
&.only-icon {
width: 2.75rem;
}
}
</style>

View File

@ -19,6 +19,7 @@
import plugin from '../plugin'
import type { AnySvelteComponent } from '../types'
import Icon from './Icon.svelte'
import Button from './Button.svelte'
import IconClose from './icons/Close.svelte'
export let icon: Asset | AnySvelteComponent | ComponentType
@ -46,25 +47,29 @@
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div class="flex-between editbox {size}" style={width ? 'width: ' + width : ''} on:click={() => textHTML.focus()}>
<div class="mr-2 icon"><Icon {icon} size={'small'} /></div>
<div class="mr-2 content-dark-color"><Icon {icon} size={'small'} /></div>
<input bind:this={textHTML} type="text" bind:value placeholder={phTraslate} on:change on:input on:keydown />
<slot name="extra" />
{#if value}
<div
class="ml-2 btn"
on:click={() => {
value = ''
dispatch('change', '')
}}
>
<Icon icon={IconClose} size={'x-small'} />
<div class="ml-2">
<Button
icon={IconClose}
kind={'transparent'}
size={'small'}
noFocus
on:click={() => {
value = ''
dispatch('change', '')
textHTML.focus()
}}
/>
</div>
{/if}
</div>
<style lang="scss">
.editbox {
padding: 0 0.5rem 0 0.5rem;
padding: 0 0.25rem 0 0.5rem;
min-width: 10rem;
color: var(--theme-caption-color);
border-radius: 0.25rem;
@ -93,16 +98,5 @@
color: var(--theme-dark-color);
}
}
.btn {
color: var(--theme-dark-color);
cursor: pointer;
&:hover {
color: var(--theme-caption-color);
}
}
.icon {
color: var(--theme-dark-color);
}
}
</style>

View File

@ -91,6 +91,7 @@
user-select: none;
.list-item {
margin: 0 0.5rem;
min-width: 0;
border-radius: 0.25rem;
}

View File

@ -148,10 +148,10 @@ export function fitPopupPositionedElement (
} else {
// Vertical
if (rect.bottom + rectPopup.height + 28 <= docHeight) {
newProps.top = `${rect.bottom + 1}px`
newProps.top = `${rect.bottom + 16}px`
direction = 'bottom'
} else if (rectPopup.height + 28 < rect.top) {
newProps.bottom = `${docHeight - rect.top + 1}px`
newProps.bottom = `${docHeight - rect.top + 16}px`
direction = 'top'
} else {
newProps.top = newProps.bottom = '16px'

View File

@ -399,7 +399,7 @@
flex-grow: 1;
margin-right: 1rem;
min-width: 0;
color: var(--content-color);
color: var(--theme-dark-color);
.msgactivity-content__header {
display: flex;
@ -520,13 +520,13 @@
}
.show-diff {
color: var(--accent-color);
color: var(--theme-content-color);
cursor: pointer;
&:hover {
color: var(--caption-color);
color: var(--theme-caption-color);
}
&:active {
color: var(--accent-color);
color: var(--theme-content-color);
}
}
</style>

View File

@ -25,7 +25,7 @@
{@const valueColor = getPlatformColorDef(value.color ?? 0, $themeStore.dark)}
{#if i < limit}
<div class="item" class:last={i === limit - 1} class:first={i === 0}>
<div class="color" style:background-color={valueColor.background} />
<div class="color" style:background-color={valueColor.color} />
{#if i === limit - 1 && values.length <= limit}
<span class="label overflow-label ml-1-5 max-w-40" style:color={valueColor.title}>
{value.title}

View File

@ -20,7 +20,7 @@
</script>
<div class="container">
<div class="color" style:background-color={getPlatformColorDef(value.color ?? 0, $themeStore.dark).background} />
<div class="color" style:background-color={getPlatformColorDef(value.color ?? 0, $themeStore.dark).color} />
<span class="label overflow-label ml-1-5 max-w-40">
{value.title}
</span>

View File

@ -43,7 +43,7 @@
realWidth = element.clientWidth
}}
>
<div class="color" style:background-color={color.background} />
<div class="color" style:background-color={color.color} />
<span class="label overflow-label ml-1 text-sm caption-color max-w-40" style:color={color.title}
>{value.title}</span
>
@ -56,7 +56,7 @@
realWidth = element.clientWidth
}}
>
<div class="color" style:background-color={color.background} />
<div class="color" style:background-color={color.color} />
<span class="label overflow-label ml-1-5 max-w-40" style:color={color.title}>
{value.title}
</span>

View File

@ -168,7 +168,7 @@
checkSelected(selected, element)
}}
>
<div class="tag" style:background-color={color.background} />
<div class="tag" style:background-color={color.color} />
<span class="lines-limit-2 flex-grow" style:color={color.title}>{element.title}</span>
<span class="ml-2 text-xs">
({element.refCount ?? 0})

View File

@ -31,13 +31,13 @@
{#if value}
<DocNavLink object={value} {onClick} {disabled} {noUnderline} {inline} component={view.component.EditDoc}>
<span class="flex-presenter" class:inline class:list={kind === 'list'}>
<span class="flex-presenter" class:inline-presenter={inline} class:list={kind === 'list'}>
{#if !inline && shouldShowAvatar}
<div class="icon" use:tooltip={{ label: tracker.string.Component }}>
<Icon icon={tracker.icon.Component} size={'small'} />
</div>
{/if}
<span title={value.label} class="label nowrap">
<span title={value.label} class="label nowrap" class:no-underline={disabled || noUnderline}>
{value.label}
</span>
</span>

View File

@ -37,7 +37,7 @@
<div class="flex-presenter">
{#each icons as icon}
<div class="icon">
<div class="icon small-gap flow">
<Icon {icon} size={'small'} />
</div>
{/each}

View File

@ -18,10 +18,11 @@
import tracker from '../../plugin'
export let value: Project
export let inline = false
</script>
<div class="flex-presenter cursor-default">
<div class="icon">
<div class="flex-presenter cursor-default" class:inline-presenter={inline}>
<div class="icon" class:emoji={value.icon === tracker.component.IconWithEmojii}>
<Icon
icon={value.icon === tracker.component.IconWithEmojii ? IconWithEmojii : value.icon ?? tracker.icon.Home}
iconProps={value.icon === tracker.component.IconWithEmojii

View File

@ -158,6 +158,7 @@
_class={item._class}
value={item}
inline={false}
noUnderline
props={{ disabled: true, inline: false, size, avatarSize: 'smaller' }}
/>
</div>

View File

@ -15,19 +15,12 @@
<script lang="ts">
import { Class, Doc, Ref, Space } from '@hcengineering/core'
import { getClient } from '@hcengineering/presentation'
import {
Button,
IconClose,
IconFilter,
eventToHTMLElement,
resolvedLocationStore,
showPopup
} from '@hcengineering/ui'
import { Button, IconFilter, eventToHTMLElement, resolvedLocationStore, showPopup } from '@hcengineering/ui'
import { Filter } from '@hcengineering/view'
import { filterStore, getFilterKey, setFilters } from '../../filter'
import view from '../../plugin'
import FilterTypePopup from './FilterTypePopup.svelte'
import IconArrowDown from '../icons/ArrowDown.svelte'
import IconClose from '../icons/Close.svelte'
export let _class: Ref<Class<Doc>> | undefined
export let space: Ref<Space> | undefined = undefined
@ -84,9 +77,9 @@
{#if visible}
<Button
icon={IconFilter}
icon={$filterStore.length === 0 ? IconFilter : IconClose}
iconProps={{ fill: $filterStore.length === 0 ? 'var(--theme-content-color)' : 'var(--theme-halfcontent-color)' }}
label={$filterStore.length === 0 ? view.string.Filter : view.string.ClearFilters}
iconRight={$filterStore.length === 0 ? IconArrowDown : IconClose}
on:click={(ev) => {
if ($filterStore.length === 0) add(ev)
else setFilters([])

View File

@ -165,7 +165,7 @@
{/await}
<div class="divider" />
<button
class="filter-button hoverable"
class="filter-button square hoverable"
on:click={() => {
dispatch('remove')
}}
@ -199,9 +199,8 @@
align-items: center;
flex-shrink: 0;
padding: 0 0.375rem;
font-size: 0.75rem;
height: 1.5rem;
min-width: 1.5rem;
height: 1.75rem;
min-width: 1.75rem;
white-space: nowrap;
color: var(--theme-content-color);
border: 1px solid transparent;
@ -209,10 +208,21 @@
transition-property: border, background-color, color, box-shadow;
transition-duration: 0.15s;
.left-round {
padding-left: 0.5rem;
}
.btn-icon {
color: var(--theme-dark-color);
color: var(--theme-halfcontent-color);
transition: color 0.15s;
pointer-events: none;
&.square {
display: flex;
justify-content: center;
align-items: center;
padding: 0;
width: 1.75rem;
}
}
span {
white-space: nowrap;
@ -228,12 +238,9 @@
color: var(--theme-caption-color);
}
}
&:last-child {
margin-right: 0;
}
}
.divider {
flex-shrink: 0;
width: 1px;
height: 1.5rem;
background-color: var(--theme-refinput-divider);

View File

@ -0,0 +1,27 @@
<!--
//
// Copyright © 2023 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">
export let size: 'small' | 'medium' | 'large'
export let descending: boolean = false
export let fill: string = 'currentColor'
</script>
<svg class="svg-{size}" {fill} viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path
d="M8.7,8l4.6-4.6c0.2-0.2,0.2-0.5,0-0.7s-0.5-0.2-0.7,0L8,7.3L3.4,2.6c-0.2-0.2-0.5-0.2-0.7,0s-0.2,0.5,0,0.7L7.3,8l-4.6,4.6c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1L8,8.7l4.6,4.6c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1c0.2-0.2,0.2-0.5,0-0.7L8.7,8z"
/>
</svg>