diff --git a/changelog.md b/changelog.md index 3623c25c81..93beda3286 100644 --- a/changelog.md +++ b/changelog.md @@ -2,15 +2,23 @@ ## 0.6.29 (upcoming) +Platform: + +- Object selector actions + Tracker: -- Remember view options +- Remember view options - My issues - Roadmap +- Remember view options +- Context menus (Priority/Status/Assignee) Chunter: - Reactions on messages +- Priority filter +- Context menu selector for state/assignee HR: @@ -27,7 +35,6 @@ Tracker: - Issue state history. - Subissue issue popup. - Label support -- Priority filter Lead: diff --git a/models/attachment/src/index.ts b/models/attachment/src/index.ts index 997254e05c..c70d209c70 100644 --- a/models/attachment/src/index.ts +++ b/models/attachment/src/index.ts @@ -114,7 +114,8 @@ export function createModel (builder: Builder): void { category: attachment.category.Attachments, target: attachment.class.Attachment, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'edit' } }) @@ -133,7 +134,8 @@ export function createModel (builder: Builder): void { category: attachment.category.Attachments, target: attachment.class.Attachment, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'edit' } }) @@ -152,7 +154,8 @@ export function createModel (builder: Builder): void { category: attachment.category.Attachments, target: attachment.class.Attachment, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'edit' } }) } diff --git a/models/board/src/index.ts b/models/board/src/index.ts index 67dde4348b..454fa23658 100644 --- a/models/board/src/index.ts +++ b/models/board/src/index.ts @@ -283,7 +283,7 @@ export function createModel (builder: Builder): void { input: 'any', category: board.category.Card, target: board.class.Card, - context: { mode: 'context', application: board.app.Board, group: 'top' } + context: { mode: 'context', application: board.app.Board, group: 'create' } }, board.action.Open ) @@ -294,7 +294,9 @@ export function createModel (builder: Builder): void { actionProps: { component: tags.component.TagsEditorPopup, element: view.popup.PositionElementAlignment, - value: 'object' + fillProps: { + _object: 'value' + } }, label: board.string.Labels, icon: tags.icon.Tags, @@ -302,7 +304,7 @@ export function createModel (builder: Builder): void { inline: true, category: board.category.Card, target: board.class.Card, - context: { mode: 'context', application: board.app.Board, group: 'top' } + context: { mode: 'context', application: board.app.Board, group: 'create' } }, board.action.Labels ) @@ -320,7 +322,7 @@ export function createModel (builder: Builder): void { inline: true, category: board.category.Card, target: board.class.Card, - context: { mode: 'context', application: board.app.Board, group: 'top' } + context: { mode: 'context', application: board.app.Board, group: 'create' } }, board.action.Dates ) @@ -331,7 +333,9 @@ export function createModel (builder: Builder): void { actionProps: { component: board.component.CoverActionPopup, element: view.popup.PositionElementAlignment, - value: 'object' + fillProps: { + _object: 'value' + } }, label: board.string.Cover, icon: board.icon.Card, @@ -339,7 +343,7 @@ export function createModel (builder: Builder): void { inline: true, category: board.category.Card, target: board.class.Card, - context: { mode: 'context', application: board.app.Board, group: 'top' } + context: { mode: 'context', application: board.app.Board, group: 'create' } }, board.action.Cover ) diff --git a/models/calendar/src/index.ts b/models/calendar/src/index.ts index fbb5d2cb03..2ca4211cb3 100644 --- a/models/calendar/src/index.ts +++ b/models/calendar/src/index.ts @@ -176,7 +176,8 @@ export function createModel (builder: Builder): void { category: calendar.category.Calendar, target: calendar.class.Event, context: { - mode: 'context' + mode: 'context', + group: 'create' } }, calendar.action.SaveEventReminder diff --git a/models/chunter/src/index.ts b/models/chunter/src/index.ts index 2ffde6d52c..d2896704f5 100644 --- a/models/chunter/src/index.ts +++ b/models/chunter/src/index.ts @@ -238,7 +238,8 @@ export function createModel (builder: Builder): void { category: chunter.category.Chunter, target: chunter.class.Message, context: { - mode: 'context' + mode: 'context', + group: 'edit' } }, chunter.action.MarkUnread @@ -253,7 +254,8 @@ export function createModel (builder: Builder): void { category: chunter.category.Chunter, target: chunter.class.ThreadMessage, context: { - mode: 'context' + mode: 'context', + group: 'edit' } }, chunter.action.MarkCommentUnread @@ -272,7 +274,8 @@ export function createModel (builder: Builder): void { archived: false }, context: { - mode: 'context' + mode: 'context', + group: 'tools' } }, chunter.action.ArchiveChannel @@ -291,7 +294,8 @@ export function createModel (builder: Builder): void { archived: true }, context: { - mode: 'context' + mode: 'context', + group: 'tools' } }, chunter.action.UnarchiveChannel @@ -307,7 +311,8 @@ export function createModel (builder: Builder): void { category: chunter.category.Chunter, target: chunter.class.DirectMessage, context: { - mode: 'context' + mode: 'context', + group: 'edit' } }, chunter.action.ConvertToPrivate diff --git a/models/contact/src/index.ts b/models/contact/src/index.ts index 5705b8b917..7983acd031 100644 --- a/models/contact/src/index.ts +++ b/models/contact/src/index.ts @@ -388,7 +388,10 @@ export function createModel (builder: Builder): void { createAction(builder, { ...actionTemplates.open, target: contact.class.Contact, - context: { mode: ['browser', 'context'] } + context: { + mode: ['browser', 'context'], + group: 'create' + } }) } diff --git a/models/hr/src/index.ts b/models/hr/src/index.ts index 4163f97494..9b52fc33d7 100644 --- a/models/hr/src/index.ts +++ b/models/hr/src/index.ts @@ -270,7 +270,7 @@ export function createModel (builder: Builder): void { input: 'any', category: hr.category.HR, target: hr.class.Department, - context: { mode: 'context', application: hr.app.HR, group: 'top' } + context: { mode: 'context', application: hr.app.HR, group: 'create' } }, hr.action.EditDepartment ) @@ -289,7 +289,7 @@ export function createModel (builder: Builder): void { _id: { $nin: [hr.ids.Head] } }, target: hr.class.Department, - context: { mode: 'context', application: hr.app.HR, group: 'top' } + context: { mode: 'context', application: hr.app.HR, group: 'create' } }, hr.action.DeleteDepartment ) @@ -305,7 +305,7 @@ export function createModel (builder: Builder): void { input: 'any', category: hr.category.HR, target: hr.class.Request, - context: { mode: 'context', application: hr.app.HR, group: 'top' } + context: { mode: 'context', application: hr.app.HR, group: 'create' } }, hr.action.EditRequest ) diff --git a/models/inventory/src/index.ts b/models/inventory/src/index.ts index 47e27b0a43..bd32949503 100644 --- a/models/inventory/src/index.ts +++ b/models/inventory/src/index.ts @@ -160,7 +160,8 @@ export function createModel (builder: Builder): void { category: inventory.category.Inventory, target: inventory.class.Category, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'associate' } }) } diff --git a/models/lead/src/index.ts b/models/lead/src/index.ts index b1b0e6ac94..956bde8421 100644 --- a/models/lead/src/index.ts +++ b/models/lead/src/index.ts @@ -22,8 +22,8 @@ import attachment from '@anticrm/model-attachment' import chunter from '@anticrm/model-chunter' import contact, { TContact } from '@anticrm/model-contact' import core from '@anticrm/model-core' -import task, { TSpaceWithStates, TTask } from '@anticrm/model-task' -import view, { createAction } from '@anticrm/model-view' +import task, { actionTemplates, TSpaceWithStates, TTask } from '@anticrm/model-task' +import view, { createAction, actionTemplates as viewTemplates } from '@anticrm/model-view' import workbench, { Application } from '@anticrm/model-workbench' import setting from '@anticrm/setting' import lead from './plugin' @@ -67,6 +67,8 @@ export class TCustomer extends TContact implements Customer { } export function createModel (builder: Builder): void { + const archiveId = 'archive' + builder.createModel(TFunnel, TLead, TCustomer) builder.mixin(lead.class.Funnel, core.class.Class, workbench.mixin.SpaceView, { @@ -113,6 +115,15 @@ export function createModel (builder: Builder): void { label: lead.string.Customers }, position: 'top' + }, + { + id: archiveId, + component: workbench.component.Archive, + icon: view.icon.Archive, + label: workbench.string.Archive, + position: 'bottom', + visibleIf: workbench.function.HasArchiveSpaces, + spaceClass: lead.class.Funnel } ], spaces: [ @@ -129,6 +140,22 @@ export function createModel (builder: Builder): void { lead.app.Lead ) + createAction(builder, { ...actionTemplates.archiveSpace, target: lead.class.Funnel }) + createAction(builder, { ...actionTemplates.unarchiveSpace, target: lead.class.Funnel }) + + createAction(builder, { + ...viewTemplates.open, + target: lead.class.Funnel, + context: { + mode: ['browser', 'context'], + group: 'create' + }, + action: workbench.actionImpl.Navigate, + actionProps: { + mode: 'space' + } + }) + builder.createDoc( view.class.Viewlet, core.space.Model, @@ -248,6 +275,9 @@ export function createModel (builder: Builder): void { element: 'top', props: { preserveCustomer: true + }, + fillProps: { + _id: 'customer' } }, label: lead.string.CreateLead, @@ -255,7 +285,10 @@ export function createModel (builder: Builder): void { input: 'focus', category: lead.category.Lead, target: contact.class.Contact, - context: { mode: ['context', 'browser'] }, + context: { + mode: ['context', 'browser'], + group: 'associate' + }, override: [lead.action.CreateGlobalLead] }) @@ -275,7 +308,8 @@ export function createModel (builder: Builder): void { target: core.class.Doc, context: { mode: ['workbench', 'browser'], - application: lead.app.Lead + application: lead.app.Lead, + group: 'create' } }, lead.action.CreateGlobalLead diff --git a/models/recruit/src/index.ts b/models/recruit/src/index.ts index 3d0b554a0f..ed6c1ff935 100644 --- a/models/recruit/src/index.ts +++ b/models/recruit/src/index.ts @@ -394,10 +394,12 @@ export function createModel (builder: Builder): void { action: view.actionImpl.ShowPopup, actionProps: { component: recruit.component.CreateApplication, - _id: 'candidate', element: 'top', props: { preserveCandidate: true + }, + fillProps: { + _id: 'candidate' } }, label: recruit.string.CreateAnApplication, @@ -405,7 +407,10 @@ export function createModel (builder: Builder): void { input: 'focus', category: recruit.category.Recruit, target: contact.class.Person, - context: { mode: ['context', 'browser'] }, + context: { + mode: ['context', 'browser'], + group: 'associate' + }, override: [recruit.action.CreateGlobalApplication] }) createAction(builder, { @@ -422,7 +427,8 @@ export function createModel (builder: Builder): void { target: core.class.Doc, context: { mode: ['workbench', 'browser'], - application: recruit.app.Recruit + application: recruit.app.Recruit, + group: 'create' } }) @@ -440,7 +446,8 @@ export function createModel (builder: Builder): void { target: core.class.Doc, context: { mode: ['workbench', 'browser'], - application: recruit.app.Recruit + application: recruit.app.Recruit, + group: 'create' } }) @@ -460,7 +467,8 @@ export function createModel (builder: Builder): void { target: core.class.Doc, context: { mode: ['workbench', 'browser'], - application: recruit.app.Recruit + application: recruit.app.Recruit, + group: 'create' } }, recruit.action.CreateGlobalApplication @@ -504,7 +512,8 @@ export function createModel (builder: Builder): void { keyBinding: ['e'], target: recruit.class.Vacancy, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'create' } }) @@ -526,12 +535,13 @@ export function createModel (builder: Builder): void { createReviewModel(builder) - // createAction(builder, { ...viewTemplates.open, target: recruit.class.Vacancy, context: { mode: ['browser', 'context'] } }) - createAction(builder, { ...viewTemplates.open, target: recruit.class.Vacancy, - context: { mode: ['browser', 'context'] }, + context: { + mode: ['browser', 'context'], + group: 'create' + }, action: workbench.actionImpl.Navigate, actionProps: { mode: 'space' @@ -541,7 +551,10 @@ export function createModel (builder: Builder): void { createAction(builder, { ...viewTemplates.open, target: recruit.class.Applicant, - context: { mode: ['browser', 'context'] } + context: { + mode: ['browser', 'context'], + group: 'create' + } }) function createGotoSpecialAction (builder: Builder, id: string, key: KeyBinding, label: IntlString): void { @@ -574,6 +587,55 @@ export function createModel (builder: Builder): void { mode: ['workbench', 'browser', 'editor', 'panel', 'popup'] } }) + + createAction(builder, { + action: view.actionImpl.ValueSelector, + actionPopup: view.component.ValueSelector, + actionProps: { + attribute: 'assignee', + _class: contact.class.Employee, + query: {}, + placeholder: recruit.string.AssignRecruiter + }, + label: recruit.string.AssignRecruiter, + icon: contact.icon.Person, + keyBinding: [], + input: 'none', + category: recruit.category.Recruit, + target: recruit.class.Applicant, + context: { + mode: ['context'], + application: recruit.app.Recruit, + group: 'edit' + } + }) + + createAction(builder, { + action: view.actionImpl.ValueSelector, + actionPopup: view.component.ValueSelector, + actionProps: { + attribute: 'state', + _class: task.class.State, + query: {}, + searchField: 'title', + // should match space + fillQuery: { space: 'space' }, + // Only apply for same vacancy + docMatches: ['space'], + placeholder: task.string.TaskState + }, + label: task.string.TaskState, + icon: task.icon.TaskState, + keyBinding: [], + input: 'none', + category: recruit.category.Recruit, + target: recruit.class.Applicant, + context: { + mode: ['context'], + application: recruit.app.Recruit, + group: 'edit' + } + }) } export { recruitOperation } from './migration' diff --git a/models/recruit/src/review.ts b/models/recruit/src/review.ts index 165c6b7285..5f431d485b 100644 --- a/models/recruit/src/review.ts +++ b/models/recruit/src/review.ts @@ -49,7 +49,8 @@ export function createReviewModel (builder: Builder): void { category: recruit.category.Recruit, target: recruit.class.Review, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'create' } }, recruit.action.CreateOpinion @@ -75,11 +76,13 @@ export function createReviewModel (builder: Builder): void { action: view.actionImpl.ShowPopup, actionProps: { component: recruit.component.CreateReview, - _id: 'candidate', - _space: 'space', element: 'top', props: { preserveCandidate: true + }, + fillProps: { + space: '_space', + _id: 'candidate' } }, label: recruit.string.CreateReview, @@ -88,7 +91,8 @@ export function createReviewModel (builder: Builder): void { category: recruit.category.Recruit, target: recruit.mixin.Candidate, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'associate' } }) diff --git a/models/task/src/index.ts b/models/task/src/index.ts index 495a950a3e..5fcdd6dcca 100644 --- a/models/task/src/index.ts +++ b/models/task/src/index.ts @@ -281,7 +281,8 @@ export const actionTemplates = template({ archived: false }, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'tools' } }, unarchiveSpace: { @@ -301,7 +302,8 @@ export const actionTemplates = template({ archived: true }, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'tools' } } }) @@ -427,7 +429,8 @@ export function createModel (builder: Builder): void { archived: false }, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'edit' } }, task.action.EditStatuses @@ -487,7 +490,8 @@ export function createModel (builder: Builder): void { }, target: task.class.TodoItem, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'edit' } }) @@ -505,7 +509,8 @@ export function createModel (builder: Builder): void { done: true }, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'edit' }, target: task.class.TodoItem }) @@ -516,7 +521,8 @@ export function createModel (builder: Builder): void { ...viewTemplates.move, target: task.class.Task, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'tools' } }, task.action.Move @@ -542,7 +548,8 @@ export function createModel (builder: Builder): void { category: task.category.Task, target: task.class.State, context: { - mode: ['context', 'browser'] + mode: ['context', 'browser'], + group: 'tools' } }, task.action.ArchiveState diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index abe16af2e6..745261738e 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -15,7 +15,7 @@ import type { Employee } from '@anticrm/contact' import contact from '@anticrm/contact' -import { Domain, DOMAIN_MODEL, IndexKind, Markup, Ref, Timestamp, Type } from '@anticrm/core' +import { Domain, DOMAIN_MODEL, FindOptions, IndexKind, Markup, Ref, SortingOrder, Timestamp, Type } from '@anticrm/core' import { ArrOf, Builder, @@ -55,6 +55,7 @@ import tags from '@anticrm/tags' import tracker from './plugin' import presentation from '@anticrm/model-presentation' +import { defaultPriorities, issuePriorities } from '@anticrm/tracker-resources/src/types' export { trackerOperation } from './migration' export { default } from './plugin' @@ -565,22 +566,25 @@ export function createModel (builder: Builder): void { { action: view.actionImpl.ShowPopup, actionProps: { - component: tracker.component.SetDueDateActionPopup, - props: { mondayStart: true, withTime: false }, - element: 'top' + component: tracker.component.CreateIssue, + element: 'top', + fillProps: { + _object: 'parentIssue' + } }, - label: tracker.string.SetDueDate, - icon: tracker.icon.DueDate, + label: tracker.string.NewSubIssue, + icon: tracker.icon.Issue, keyBinding: [], - input: 'none', + input: 'focus', category: tracker.category.Tracker, target: tracker.class.Issue, context: { mode: ['context', 'browser'], - application: tracker.app.Tracker + application: tracker.app.Tracker, + group: 'associate' } }, - tracker.action.SetDueDate + tracker.action.SetParent ) createAction( @@ -598,13 +602,35 @@ export function createModel (builder: Builder): void { category: tracker.category.Tracker, target: tracker.class.Issue, context: { - mode: ['context', 'browser'], - application: tracker.app.Tracker + mode: ['context'], + application: tracker.app.Tracker, + group: 'associate' } }, tracker.action.SetParent ) + createAction(builder, { + action: view.actionImpl.ShowPopup, + actionPopup: tracker.component.SetParentIssueActionPopup, + actionProps: { + component: tracker.component.SetParentIssueActionPopup, + element: 'top' + }, + label: tracker.string.SetParent, + icon: tracker.icon.Parent, + keyBinding: [], + input: 'none', + category: tracker.category.Tracker, + target: tracker.class.Issue, + override: [tracker.action.SetParent], + context: { + mode: ['browser'], + application: tracker.app.Tracker, + group: 'associate' + } + }) + builder.mixin(tracker.class.Issue, core.class.Class, view.mixin.ClassFilters, { filters: ['status', 'priority', 'assignee', 'project', 'dueDate', 'modifiedOn'] }) @@ -619,4 +645,139 @@ export function createModel (builder: Builder): void { }, tracker.completion.IssueCategory ) + + const statusOptions: FindOptions = { + lookup: { + category: tracker.class.IssueStatusCategory + }, + sort: { rank: SortingOrder.Ascending } + } + + createAction( + builder, + { + action: view.actionImpl.ValueSelector, + actionPopup: view.component.ValueSelector, + actionProps: { + attribute: 'status', + _class: tracker.class.IssueStatus, + placeholder: tracker.string.SetStatus, + fillQuery: { + space: 'space' + }, + queryOptions: statusOptions + }, + label: tracker.string.Status, + icon: tracker.icon.CategoryBacklog, + keyBinding: [], + input: 'none', + category: tracker.category.Tracker, + target: tracker.class.Issue, + context: { + mode: ['context'], + application: tracker.app.Tracker, + group: 'edit' + } + }, + tracker.action.SetStatus + ) + createAction( + builder, + { + action: view.actionImpl.ValueSelector, + actionPopup: view.component.ValueSelector, + actionProps: { + attribute: 'priority', + values: defaultPriorities.map((p) => ({ id: p, ...issuePriorities[p] })), + placeholder: tracker.string.SetPriority + }, + label: tracker.string.Priority, + icon: tracker.icon.PriorityHigh, + keyBinding: [], + input: 'none', + category: tracker.category.Tracker, + target: tracker.class.Issue, + context: { + mode: ['context'], + application: tracker.app.Tracker, + group: 'edit' + } + }, + tracker.action.SetPriority + ) + createAction( + builder, + { + action: view.actionImpl.ValueSelector, + actionPopup: view.component.ValueSelector, + actionProps: { + attribute: 'assignee', + _class: contact.class.Employee, + query: {}, + placeholder: tracker.string.AssignTo + }, + label: tracker.string.Assignee, + icon: contact.icon.Person, + keyBinding: [], + input: 'none', + category: tracker.category.Tracker, + target: tracker.class.Issue, + context: { + mode: ['context'], + application: tracker.app.Tracker, + group: 'edit' + } + }, + tracker.action.SetAssignee + ) + + createAction( + builder, + { + action: view.actionImpl.ValueSelector, + actionPopup: view.component.ValueSelector, + actionProps: { + attribute: 'project', + _class: tracker.class.Project, + query: {}, + searchField: 'label', + placeholder: tracker.string.Project + }, + label: tracker.string.Project, + icon: tracker.icon.Project, + keyBinding: [], + input: 'none', + category: tracker.category.Tracker, + target: tracker.class.Issue, + context: { + mode: ['context'], + application: tracker.app.Tracker, + group: 'edit' + } + }, + tracker.action.SetProject + ) + createAction( + builder, + { + action: view.actionImpl.ShowPopup, + actionProps: { + component: tracker.component.SetDueDateActionPopup, + props: { mondayStart: true, withTime: false }, + element: 'top' + }, + label: tracker.string.SetDueDate, + icon: tracker.icon.DueDate, + keyBinding: [], + input: 'none', + category: tracker.category.Tracker, + target: tracker.class.Issue, + context: { + mode: ['context', 'browser'], + application: tracker.app.Tracker, + group: 'edit' + } + }, + tracker.action.SetDueDate + ) } diff --git a/models/tracker/src/plugin.ts b/models/tracker/src/plugin.ts index c91fc33763..9df8c9518e 100644 --- a/models/tracker/src/plugin.ts +++ b/models/tracker/src/plugin.ts @@ -19,7 +19,7 @@ import { ObjectSearchCategory, ObjectSearchFactory } from '@anticrm/model-presen import { IntlString, mergeIds, Resource } from '@anticrm/platform' import { trackerId } from '@anticrm/tracker' import tracker from '@anticrm/tracker-resources/src/plugin' -import type { AnyComponent } from '@anticrm/ui' +import type { AnyComponent } from '@anticrm/ui/src/types' import { ViewletDescriptor } from '@anticrm/view' import { Application } from '@anticrm/workbench' diff --git a/packages/kanban/src/components/Kanban.svelte b/packages/kanban/src/components/Kanban.svelte index 9ead4b9c7a..95f3b9e4ef 100644 --- a/packages/kanban/src/components/Kanban.svelte +++ b/packages/kanban/src/components/Kanban.svelte @@ -44,14 +44,13 @@ }, (result) => { objects = result + dispatch('content', objects) }, { ...options } ) - $: dispatch('content', objects) - function getStateObjects ( objects: Item[], state: TypeState, diff --git a/packages/presentation/src/components/ObjectPopup.svelte b/packages/presentation/src/components/ObjectPopup.svelte index e6ce81956e..18f1938ac9 100644 --- a/packages/presentation/src/components/ObjectPopup.svelte +++ b/packages/presentation/src/components/ObjectPopup.svelte @@ -22,7 +22,9 @@ createFocusManager, EditBox, FocusHandler, + Icon, IconAdd, + IconCheck, ListView, showPopup, Tooltip @@ -44,7 +46,8 @@ export let selectedObjects: Ref[] = [] export let ignoreObjects: Ref[] = [] export let shadows: boolean = true - export let width: 'medium' | 'large' = 'medium' + export let width: 'medium' | 'large' | 'full' = 'medium' + export let size: 'small' | 'medium' | 'large' = 'small' export let searchField: string = 'name' @@ -56,7 +59,7 @@ label: IntlString update: (doc: Doc) => string } - | undefined + | undefined = undefined let search: string = '' let objects: Doc[] = [] @@ -162,7 +165,13 @@ -
+
{#if create !== undefined} @@ -170,7 +179,7 @@ diff --git a/packages/theme/styles/popups.scss b/packages/theme/styles/popups.scss index a87d17e1a0..a1bf10a689 100644 --- a/packages/theme/styles/popups.scss +++ b/packages/theme/styles/popups.scss @@ -25,6 +25,15 @@ background: var(--popup-bg-color); border-radius: .5rem; box-shadow: var(--popup-shadow); + + &.full-width { + flex-grow: 1; + background: none; + border-radius: 0px; + box-shadow: none; + width: 100%; + max-width: 100%; + } &.maxHeight { height: 22rem; } &.autoHeight { @@ -242,11 +251,11 @@ margin: 0; .icon { color: var(--content-color); } - &:focus .icon { color: var(--accent-color); } + &.hover .icon { color: var(--accent-color); } } // &:hover { background-color: var(--popup-bg-hover); } - &:focus { + &.hover { background-color: var(--popup-bg-hover); outline: none; // box-shadow: inset 0 0 1px 1px var(--primary-edit-border-color); @@ -258,6 +267,12 @@ &:active { color: var(--highlight-red-press); } &:focus { color: var(--highlight-red-press); } } + + &.separator { + margin: 0.25rem 0; + height: 1px; + background-color: var(--theme-card-divider); + } } .ap-check { margin-left: 1rem; @@ -360,7 +375,9 @@ .selectPopup .menu-item.arrow, .antiPopup-submenu { position: relative; - + span { + padding-right: 1rem; + } &::after { content: '▶'; position: absolute; diff --git a/packages/ui/lang/en.json b/packages/ui/lang/en.json index aa3cbb6871..bcdcbf5666 100644 --- a/packages/ui/lang/en.json +++ b/packages/ui/lang/en.json @@ -38,6 +38,7 @@ "DaysAfter": "{days, plural, =1 {in a day} other {in # days}}", "NoActionsDefined": "No actions applicable", "Incoming": "Incoming", - "HoursLabel": "Hours" + "HoursLabel": "Hours", + "Back": "Back" } } diff --git a/packages/ui/lang/ru.json b/packages/ui/lang/ru.json index 9da1a6911e..064351c5b6 100644 --- a/packages/ui/lang/ru.json +++ b/packages/ui/lang/ru.json @@ -38,6 +38,7 @@ "DaysAfter": "{days, plural, =1 {через день} other {через # дней}}", "NoActionsDefined": "Нет доступных действий", "Incoming": "Входящие", - "HoursLabel": "Часы" + "HoursLabel": "Часы", + "Back": "Назад" } } diff --git a/packages/ui/src/components/Menu.svelte b/packages/ui/src/components/Menu.svelte index 7e1a47a30b..96f5fdf58e 100644 --- a/packages/ui/src/components/Menu.svelte +++ b/packages/ui/src/components/Menu.svelte @@ -13,76 +13,148 @@ // limitations under the License. --> -
+
+
-
+
{#if actions.length === 0}
{/if} {#each actions as action, i} + {#if i > 0 && actions[i - 1].group !== action.group} + + {/if} {#if action.link} + {:else if action.component !== undefined} + + {:else} {/if} {/each} diff --git a/packages/ui/src/components/MouseSpeedTracker.svelte b/packages/ui/src/components/MouseSpeedTracker.svelte new file mode 100644 index 0000000000..1497f9f615 --- /dev/null +++ b/packages/ui/src/components/MouseSpeedTracker.svelte @@ -0,0 +1,68 @@ + + + + + diff --git a/packages/ui/src/components/Popup.svelte b/packages/ui/src/components/Popup.svelte index a03143a385..6a5a8359d3 100644 --- a/packages/ui/src/components/Popup.svelte +++ b/packages/ui/src/components/Popup.svelte @@ -30,5 +30,6 @@ zIndex={(i + 1) * 500} top={$modal.length - 1 === i} close={popup.close} + overlay={popup.options.overlay} /> {/each} diff --git a/packages/ui/src/components/PopupInstance.svelte b/packages/ui/src/components/PopupInstance.svelte index 5881bf2519..13ffdbfc2c 100644 --- a/packages/ui/src/components/PopupInstance.svelte +++ b/packages/ui/src/components/PopupInstance.svelte @@ -23,6 +23,7 @@ export let element: PopupAlignment | undefined export let onClose: ((result: any) => void) | undefined export let onUpdate: ((result: any) => void) | undefined + export let overlay: boolean export let zIndex: number export let top: boolean export let close: () => void @@ -126,12 +127,16 @@ on:changeContent={fitPopup} />
-