From 3ac0e6e25907847ffa17a79d9d5b17698b88c612 Mon Sep 17 00:00:00 2001 From: Alexander Platov Date: Fri, 12 Jan 2024 09:57:34 +0300 Subject: [PATCH] Updated layout of Project Types (#4345) Signed-off-by: Alexander Platov --- models/board/src/index.ts | 2 +- models/lead/src/index.ts | 2 +- models/recruit/src/index.ts | 2 +- models/task/src/index.ts | 2 +- models/tracker/src/index.ts | 2 +- packages/theme/styles/_layouts.scss | 1 + packages/theme/styles/_lumia-colors.scss | 18 +- packages/theme/styles/components.scss | 41 +- packages/theme/styles/global.scss | 1 + packages/theme/styles/tables.scss | 240 +++++++++++ packages/ui/lang/en.json | 2 + packages/ui/lang/ru.json | 2 + packages/ui/src/components/Breadcrumbs.svelte | 7 +- packages/ui/src/components/ButtonBase.svelte | 31 +- .../ui/src/components/ModernButton.svelte | 37 ++ .../ui/src/components/ModernEditbox.svelte | 30 +- packages/ui/src/components/NavItem.svelte | 1 + packages/ui/src/components/Scroller.svelte | 6 + packages/ui/src/components/TextArea.svelte | 3 +- packages/ui/src/components/icons/Edit.svelte | 2 +- packages/ui/src/components/icons/Send.svelte | 10 + .../src/components/icons/SquareExpand.svelte | 13 + packages/ui/src/index.ts | 3 + packages/ui/src/plugin.ts | 2 + packages/ui/src/resize.ts | 2 + .../components/NotificationSettings.svelte | 8 +- plugins/setting-assets/lang/en.json | 7 +- plugins/setting-assets/lang/ru.json | 7 +- .../src/components/ClassAttributeRow.svelte | 81 ++++ .../src/components/ClassAttributes.svelte | 406 +++++------------- .../src/components/ClassAttributesList.svelte | 179 ++------ .../src/components/ClassSetting.svelte | 16 +- .../src/components/Configure.svelte | 62 +-- .../src/components/EnumSetting.svelte | 15 +- .../src/components/Owners.svelte | 56 +-- plugins/setting-resources/src/plugin.ts | 3 +- plugins/setting-resources/src/store.ts | 7 +- plugins/setting/src/index.ts | 6 +- plugins/task-assets/lang/en.json | 6 +- plugins/task-assets/lang/ru.json | 6 +- .../src/components/icons/Layers.svelte | 30 ++ .../components/projectTypes/Categories.svelte | 10 +- .../projectTypes/ProjectEditor.svelte | 256 ++++++----- .../projectTypes/ProjectTypePresenter.svelte | 4 +- .../src/components/projectTypes/Types.svelte | 4 +- .../taskTypes/TaskTypeEditor.svelte | 169 ++++---- .../taskTypes/TypeClassEditor.svelte | 82 ---- plugins/task-resources/src/plugin.ts | 6 +- plugins/task/src/index.ts | 2 +- .../src/components/Templates.svelte | 139 +++--- 50 files changed, 1066 insertions(+), 963 deletions(-) create mode 100644 packages/theme/styles/tables.scss create mode 100644 packages/ui/src/components/ModernButton.svelte create mode 100644 packages/ui/src/components/icons/Send.svelte create mode 100644 packages/ui/src/components/icons/SquareExpand.svelte create mode 100644 plugins/setting-resources/src/components/ClassAttributeRow.svelte create mode 100644 plugins/task-resources/src/components/icons/Layers.svelte delete mode 100644 plugins/task-resources/src/components/taskTypes/TypeClassEditor.svelte diff --git a/models/board/src/index.ts b/models/board/src/index.ts index 5853e75734..ba96534648 100644 --- a/models/board/src/index.ts +++ b/models/board/src/index.ts @@ -521,7 +521,7 @@ export function createModel (builder: Builder): void { { name: board.string.BoardApplication, description: board.string.ManageBoardStatuses, - icon: board.component.TemplatesIcon, + icon: board.icon.Board, baseClass: board.class.Board }, board.descriptors.BoardType diff --git a/models/lead/src/index.ts b/models/lead/src/index.ts index b6f4b46dc7..62432d50a7 100644 --- a/models/lead/src/index.ts +++ b/models/lead/src/index.ts @@ -703,7 +703,7 @@ export function createModel (builder: Builder): void { { name: lead.string.LeadApplication, description: lead.string.ManageFunnelStatuses, - icon: lead.component.TemplatesIcon, + icon: lead.icon.LeadApplication, baseClass: lead.class.Funnel }, lead.descriptors.FunnelType diff --git a/models/recruit/src/index.ts b/models/recruit/src/index.ts index 3718dae45a..671943046f 100644 --- a/models/recruit/src/index.ts +++ b/models/recruit/src/index.ts @@ -1774,7 +1774,7 @@ export function createModel (builder: Builder): void { { name: recruit.string.RecruitApplication, description: recruit.string.ManageVacancyStatuses, - icon: recruit.component.TemplatesIcon, + icon: recruit.icon.RecruitApplication, editor: recruit.component.VacancyTemplateEditor, baseClass: recruit.class.Vacancy }, diff --git a/models/task/src/index.ts b/models/task/src/index.ts index 846b1b6341..81b9d5bf24 100644 --- a/models/task/src/index.ts +++ b/models/task/src/index.ts @@ -248,7 +248,7 @@ export class TTaskType extends TDoc implements TaskType { export class TProjectTypeDescriptor extends TDoc implements ProjectTypeDescriptor { name!: IntlString description!: IntlString - icon!: AnyComponent + icon!: Asset editor?: AnyComponent baseClass!: Ref> } diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index 59dbabd771..28e120ff0e 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -672,7 +672,7 @@ export function createModel (builder: Builder): void { { name: tracker.string.TrackerApplication, description: tracker.string.ManageWorkflowStatuses, - icon: task.component.TemplatesIcon, + icon: task.icon.Task, baseClass: tracker.class.Project }, tracker.descriptors.ProjectType diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index 1c3eab2419..8ef9e3f44c 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -267,6 +267,7 @@ input.search { .justify-stretch { justify-content: stretch; } .items-baseline { align-items: baseline; } .items-start { align-items: flex-start; } +.items-end { align-items: flex-end; } .items-center { align-items: center; } .items-stretch { align-items: stretch; } .self-start { align-self: flex-start; } diff --git a/packages/theme/styles/_lumia-colors.scss b/packages/theme/styles/_lumia-colors.scss index 5d9efc6393..d7487962cb 100644 --- a/packages/theme/styles/_lumia-colors.scss +++ b/packages/theme/styles/_lumia-colors.scss @@ -1,16 +1,6 @@ // -// Copyright © 2021 Anticrm Platform Contributors. -// -// 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. +// © 2023 Hardcore Engineering, Inc. All Rights Reserved. +// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0). // /* Common Colors */ @@ -37,6 +27,7 @@ /* Dark Theme */ .theme-dark { --global-ui-BackgroundColor: #A5BDFF0D; + --global-ui-BorderColor: #A5BDFF1A; --global-ui-hover-BackgroundColor: #A5BDFF1A; --global-ui-highlight-BackgroundColor: #A5BDFF0D; --global-ui-hover-highlight-BackgroundColor: #A5BDFF26; @@ -53,6 +44,7 @@ --global-primary-TextColor: #FFFFFF; --global-secondary-TextColor: #C1C9D6; --global-tertiary-TextColor: #8E99AF; + --global-disabled-TextColor: #5A667E; --global-accent-TextColor: #4D7FF5; --global-focus-BorderColor: #2A59D6; @@ -88,6 +80,7 @@ /* Light Theme */ .theme-light { --global-ui-BackgroundColor: #1530720D; + --global-ui-BorderColor: #1530721A; --global-ui-hover-BackgroundColor: #1530721A; --global-ui-highlight-BackgroundColor: #A5BDFF26; --global-ui-hover-highlight-BackgroundColor: #A5BDFF40; @@ -104,6 +97,7 @@ --global-primary-TextColor: #0F121A; --global-secondary-TextColor: #5A667E; --global-tertiary-TextColor: #7B879E; + --global-disabled-TextColor: #A1ABBF; --global-accent-TextColor: #3566E2; --global-focus-BorderColor: #204DC8; diff --git a/packages/theme/styles/components.scss b/packages/theme/styles/components.scss index 455e466101..672ca039c2 100644 --- a/packages/theme/styles/components.scss +++ b/packages/theme/styles/components.scss @@ -28,7 +28,8 @@ .hulyComponent-content, .hulyComponent-content__container, .hulyComponent-content__column, -.hulyComponent-content__column.content, +.hulyComponent-content__column-group, +.hulyComponent-content__header, .hulyComponent-content__navHeader { display: flex; width: 100%; @@ -39,6 +40,9 @@ flex-shrink: 0; max-width: 64rem; + &.gap { + gap: var(--spacing-4); + } &__container { height: 100%; } @@ -54,18 +58,21 @@ margin: 0 0.75rem; } &.content { - overflow-y: auto; + align-items: stretch; + } + &-group { flex-direction: column; - align-items: center; - padding: var(--spacing-3); + flex-shrink: 0; + height: fit-content; } } &__navHeader { flex-direction: column; flex-shrink: 0; - padding-bottom: var(--spacing-3); - border-bottom: 1px solid var(--theme-navpanel-divider); - + + &.divide { + border-bottom: 1px solid var(--theme-navpanel-divider); + } &-menu { display: flex; justify-content: center; @@ -76,9 +83,18 @@ height: var(--global-extra-large-Size); } &-hint { - margin: var(--spacing-0_25) var(--spacing-3) 0 var(--spacing-2); + margin: var(--spacing-0_25) var(--spacing-3) var(--spacing-3) var(--spacing-2); } } + &__header { + justify-content: space-between; + align-self: stretch; + padding: 0 0 var(--spacing-1) var(--spacing-1_5); + } + textarea { + font-weight: 400 !important; + color: var(--global-tertiary-TextColor) !important; + } } /* Header */ @@ -123,8 +139,17 @@ gap: var(--spacing-0_5); } .hulyHeader-buttonsGroup { + flex-shrink: 0; gap: var(--spacing-1); margin-left: var(--spacing-2); + + &__label { + display: flex; + flex-direction: column; + align-items: flex-end; + flex-shrink: 0; + color: var(--global-secondary-TextColor); + } } .hulyHotKey-item { margin-right: .625rem; diff --git a/packages/theme/styles/global.scss b/packages/theme/styles/global.scss index 5fd08f5111..6a92bf7f74 100644 --- a/packages/theme/styles/global.scss +++ b/packages/theme/styles/global.scss @@ -26,6 +26,7 @@ @import "./mixins.scss"; @import "./panel.scss"; @import "./prose.scss"; +@import "./tables.scss"; @import "./_text-editor.scss"; @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400;1,500&display=swap'); diff --git a/packages/theme/styles/tables.scss b/packages/theme/styles/tables.scss new file mode 100644 index 0000000000..0fad9a9919 --- /dev/null +++ b/packages/theme/styles/tables.scss @@ -0,0 +1,240 @@ +// +// © 2024 Hardcore Engineering, Inc. All Rights Reserved. +// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0). +// + +/* Huly Attribute Table */ +.hulyTableAttr-container { + display: flex; + flex-direction: column; + align-items: flex-start; + align-self: stretch; + background-color: var(--theme-table-row-color); + border: 1px solid var(--theme-divider-color); + border-radius: var(--large-BorderRadius); + + .hulyTableAttr-header { + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; + flex-shrink: 0; + text-transform: uppercase; + color: var(--global-secondary-TextColor); + + &.withButton { + padding: var(--spacing-2); + } + &:not(.withButton) { + padding: var(--spacing-2) var(--spacing-2) var(--spacing-2) var(--spacing-2_5); + } + span { + flex-grow: 1; + margin-left: var(--spacing-1_5); + } + } + .hulyTableAttr-content { + display: flex; + align-items: flex-start; + align-self: stretch; + flex-shrink: 0; + min-width: 0; + min-height: 0; + border-top: 1px solid var(--theme-divider-color); + + &:not(.withTitle) { + flex-direction: column; + } + &.withTitle { + gap: var(--spacing-1); + + .hulyTableAttr-content__title { + display: flex; + align-items: flex-start; + align-self: stretch; + gap: 8px; + padding: var(--spacing-1_5); + min-width: 8.75rem; + max-width: 8.75rem; + text-transform: uppercase; + font-size: .75rem; + font-weight: 500; + line-height: 1rem; + color: var(--global-secondary-TextColor); + } + .hulyTableAttr-content__wrapper { + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + height: fit-content; + min-width: 0; + min-height: 0; + } + } + &__row { + display: flex; + align-items: center; + align-self: stretch; + flex-grow: 1; + margin: 0; + min-width: 0; + border-radius: var(--small-BorderRadius); + border: none; + outline: none; + + &-dragMenu, + &-icon-wrapper { + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + } + &-dragMenu { + margin: 0; + padding: 0; + width: var(--global-extra-small-Size); + height: var(--global-extra-small-Size); + color: var(--button-disabled-IconColor); + border-radius: var(--extra-small-BorderRadius); + border: none; + outline: none; + } + &-icon { + width: var(--global-min-Size); + height: var(--global-min-Size); + color: var(--global-primary-TextColor); + } + &-icon-wrapper { + width: var(--global-medium-Size); + height: var(--global-medium-Size); + color: var(--global-secondary-TextColor); + background-color: var(--theme-panel-color); // var(--global-surface-02-BackgroundColor); + border-radius: var(--small-BorderRadius); + + &.pointer { + cursor: pointer; + } + } + &-labels-group { + display: flex; + flex-direction: column; + flex-grow: 1; + gap: var(--spacing-0_25); + min-width: 0; + min-height: 0; + } + &-label { + overflow: hidden; + white-space: nowrap; + word-break: break-all; + text-overflow: ellipsis; + text-align: left; + flex-shrink: 1; + min-width: 0; + color: var(--global-primary-TextColor); + + &.grow { + flex-grow: 1; + } + &.accent { + font-weight: 500; + } + &.dark { + color: var(--global-secondary-TextColor); + } + p { + color: inherit; + } + } + &-type { + white-space: nowrap; + text-transform: uppercase; + color: var(--global-secondary-TextColor); + } + &-arrow { + display: none; + flex-shrink: 0; + width: var(--global-min-Size); + height: var(--global-min-Size); + color: var(--global-primary-LinkColor); + } + } + &.class .hulyTableAttr-content__row, + &.task .hulyTableAttr-content__row { + &.hovered, + &:hover { + background-color: var(--theme-table-header-color); // var(--global-surface-03-hover-BackgroundColor); + } + &.selected { + background-color: var(--theme-table-header-color); // var(--global-surface-03-hover-BackgroundColor); + + .hulyTableAttr-content__row-icon, + .hulyTableAttr-content__row-arrow, + .hulyTableAttr-content__row-label { + color: var(--global-primary-LinkColor); + } + .hulyTableAttr-content__row-type { + color: var(--global-primary-TextColor); + } + .hulyTableAttr-content__row-label { + font-weight: 700; + } + } + } + &.class { + padding: var(--spacing-1); + + .hulyTableAttr-content__row { + gap: var(--spacing-1); + padding: var(--spacing-1) var(--spacing-2) var(--spacing-1) var(--spacing-1); + + &.hovered .hulyTableAttr-content__row-arrow, + &:hover .hulyTableAttr-content__row-arrow, + &.selected .hulyTableAttr-content__row-arrow { + display: block; + } + } + } + &.task { + .hulyTableAttr-content__row { + gap: var(--spacing-1); + padding: var(--spacing-1_5); + border-radius: 0; + + &:last-child { + border-radius: 0 0 var(--large-BorderRadius) var(--large-BorderRadius); + } + .hulyTableAttr-content__row-icon-wrapper { + margin-right: var(--spacing-0_5); + } + } + .hulyTableAttr-content__row + .hulyTableAttr-content__row { + border-top: 1px solid var(--theme-divider-color); + } + } + &.automation { + .hulyTableAttr-content__row { + gap: var(--spacing-2); + padding: var(--spacing-1_5) var(--spacing-1_5) var(--spacing-1_5) var(--spacing-2_5); + border-radius: 0; + cursor: default; + + &:last-child { + border-radius: 0 0 var(--large-BorderRadius) var(--large-BorderRadius); + } + .hulyTableAttr-content__row-icon-group { + display: flex; + flex-direction: row; + align-items: center; + flex-shrink: 0; + flex-wrap: nowrap; + gap: var(--spacing-1); + } + } + .hulyTableAttr-content__row + .hulyTableAttr-content__row { + border-top: 1px solid var(--theme-divider-color); + } + } + } +} diff --git a/packages/ui/lang/en.json b/packages/ui/lang/en.json index 568714ea05..f295bd9982 100644 --- a/packages/ui/lang/en.json +++ b/packages/ui/lang/en.json @@ -4,6 +4,8 @@ "Ok": "Ok", "Cancel": "Cancel", "Save": "Save", + "Publish": "Publish", + "SaveDraft": "Save draft", "Minutes": "{minutes, plural, =0 {less than a minute ago} =1 {a minute ago} other {# minutes ago}}", "Hours": "{hours, plural, =0 {less than an hour ago} =1 {an hour ago} other {# hours ago}}", "Days": "{days, plural, =0 {today} =1 {yesterday} other {# days ago}}", diff --git a/packages/ui/lang/ru.json b/packages/ui/lang/ru.json index 288f236f71..293dcfbbec 100644 --- a/packages/ui/lang/ru.json +++ b/packages/ui/lang/ru.json @@ -4,6 +4,8 @@ "Ok": "Ок", "Cancel": "Отменить", "Save": "Сохранить", + "Publish": "Опубликовать", + "SaveDraft": "Сохранить черновик", "Minutes": "{minutes, plural, =0 {меньше минуты назад} =1 {минуту назад} one {# минуту назад} few {# минуты назад} other {# минут назад}}", "Hours": "{hours, plural, =0 {меньше часа назад} =1 {час назад} one {# час назад} few {# часа назад} other {# часов назад}}", "Days": "{days, plural, =0 {сегодня} =1 {вчера} one {# день назад} few {# дня назад} other {# дней назад}}", diff --git a/packages/ui/src/components/Breadcrumbs.svelte b/packages/ui/src/components/Breadcrumbs.svelte index d20de672b6..40f3dd56c8 100644 --- a/packages/ui/src/components/Breadcrumbs.svelte +++ b/packages/ui/src/components/Breadcrumbs.svelte @@ -46,9 +46,10 @@ }} /> {/each} - {#if afterLabel} - -