Context menu Copy section (#2154)

Signed-off-by: Dvinyanin Alexandr <dvinyanin.alexandr@gmail.com>
This commit is contained in:
Alex 2022-06-27 22:56:24 +07:00 committed by GitHub
parent 5eb343f103
commit 4d836d38a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 107 additions and 4 deletions

View File

@ -783,4 +783,67 @@ export function createModel (builder: Builder): void {
}, },
tracker.action.SetDueDate tracker.action.SetDueDate
) )
createAction(
builder,
{
action: tracker.actionImpl.CopyToClipboard,
actionProps: {
type: 'id'
},
label: tracker.string.CopyIssueId,
icon: tracker.icon.CopyID,
keyBinding: [],
input: 'none',
category: tracker.category.Tracker,
target: tracker.class.Issue,
context: {
mode: ['context', 'browser'],
application: tracker.app.Tracker,
group: 'copy'
}
},
tracker.action.CopyIssueId
)
createAction(
builder,
{
action: tracker.actionImpl.CopyToClipboard,
actionProps: {
type: 'title'
},
label: tracker.string.CopyIssueTitle,
icon: tracker.icon.CopyBranch,
keyBinding: [],
input: 'none',
category: tracker.category.Tracker,
target: tracker.class.Issue,
context: {
mode: ['context', 'browser'],
application: tracker.app.Tracker,
group: 'copy'
}
},
tracker.action.CopyIssueTitle
)
createAction(
builder,
{
action: tracker.actionImpl.CopyToClipboard,
actionProps: {
type: 'link'
},
label: tracker.string.CopyIssueUrl,
icon: tracker.icon.CopyURL,
keyBinding: [],
input: 'none',
category: tracker.category.Tracker,
target: tracker.class.Issue,
context: {
mode: ['context', 'browser'],
application: tracker.app.Tracker,
group: 'copy'
}
},
tracker.action.CopyIssueLink
)
} }

View File

@ -20,7 +20,7 @@ import { IntlString, mergeIds, Resource } from '@anticrm/platform'
import { trackerId } from '@anticrm/tracker' import { trackerId } from '@anticrm/tracker'
import tracker from '@anticrm/tracker-resources/src/plugin' import tracker from '@anticrm/tracker-resources/src/plugin'
import type { AnyComponent } from '@anticrm/ui/src/types' import type { AnyComponent } from '@anticrm/ui/src/types'
import { ViewletDescriptor } from '@anticrm/view' import { ViewAction, ViewletDescriptor } from '@anticrm/view'
import { Application } from '@anticrm/workbench' import { Application } from '@anticrm/workbench'
export default mergeIds(trackerId, tracker, { export default mergeIds(trackerId, tracker, {
@ -49,5 +49,8 @@ export default mergeIds(trackerId, tracker, {
completion: { completion: {
IssueQuery: '' as Resource<ObjectSearchFactory>, IssueQuery: '' as Resource<ObjectSearchFactory>,
IssueCategory: '' as Ref<ObjectSearchCategory> IssueCategory: '' as Ref<ObjectSearchCategory>
},
actionImpl: {
CopyToClipboard: '' as ViewAction
} }
}) })

View File

@ -112,6 +112,7 @@
"CopyIssueUrl": "Copy Issue URL to clipboard", "CopyIssueUrl": "Copy Issue URL to clipboard",
"CopyIssueId": "Copy Issue ID to clipboard", "CopyIssueId": "Copy Issue ID to clipboard",
"CopyIssueBranch": "Copy Git branch name to clipboard", "CopyIssueBranch": "Copy Git branch name to clipboard",
"CopyIssueTitle": "Copy Issue title to clipboard",
"AssetLabel": "Asset", "AssetLabel": "Asset",
"AddToProject": "Add to project\u2026", "AddToProject": "Add to project\u2026",
"MoveToProject": "Move to project\u2026", "MoveToProject": "Move to project\u2026",

View File

@ -112,6 +112,7 @@
"CopyIssueUrl": "Копировать URL-адрес задачи в буфер обмена", "CopyIssueUrl": "Копировать URL-адрес задачи в буфер обмена",
"CopyIssueId": "Копировать ID задачи в буфер обмена", "CopyIssueId": "Копировать ID задачи в буфер обмена",
"CopyIssueBranch": "Копировать имя ветки Git в буфер обмена", "CopyIssueBranch": "Копировать имя ветки Git в буфер обмена",
"CopyIssueTitle": "Копировать имя задачи в буфер обмена",
"AssetLabel": "Asset", "AssetLabel": "Asset",
"AddToProject": "Добавить в проект\u2026", "AddToProject": "Добавить в проект\u2026",
"MoveToProject": "Переместить в проект\u2026", "MoveToProject": "Переместить в проект\u2026",

View File

@ -56,7 +56,7 @@ import SetParentIssueActionPopup from './components/SetParentIssueActionPopup.sv
import Views from './components/views/Views.svelte' import Views from './components/views/Views.svelte'
import KanbanView from './components/issues/KanbanView.svelte' import KanbanView from './components/issues/KanbanView.svelte'
import tracker from './plugin' import tracker from './plugin'
import { getIssueId, getIssueTitle } from './utils' import { copyToClipboard, getIssueId, getIssueTitle } from './utils'
import CreateIssue from './components/CreateIssue.svelte' import CreateIssue from './components/CreateIssue.svelte'
export async function queryIssue<D extends Issue> ( export async function queryIssue<D extends Issue> (
@ -107,6 +107,7 @@ export async function queryIssue<D extends Issue> (
component: IssueItem component: IssueItem
})) }))
} }
export default async (): Promise<Resources> => ({ export default async (): Promise<Resources> => ({
component: { component: {
NopeComponent, NopeComponent,
@ -153,5 +154,8 @@ export default async (): Promise<Resources> => ({
}, },
function: { function: {
IssueTitleProvider: getIssueTitle IssueTitleProvider: getIssueTitle
},
actionImpl: {
CopyToClipboard: copyToClipboard
} }
}) })

View File

@ -148,6 +148,7 @@ export default mergeIds(trackerId, tracker, {
CopyIssueUrl: '' as IntlString, CopyIssueUrl: '' as IntlString,
CopyIssueId: '' as IntlString, CopyIssueId: '' as IntlString,
CopyIssueBranch: '' as IntlString, CopyIssueBranch: '' as IntlString,
CopyIssueTitle: '' as IntlString,
FilterIs: '' as IntlString, FilterIs: '' as IntlString,
FilterIsNot: '' as IntlString, FilterIsNot: '' as IntlString,

View File

@ -17,6 +17,7 @@ import contact, { Employee, formatName } from '@anticrm/contact'
import { Doc, DocumentQuery, Ref, SortingOrder, TxOperations } from '@anticrm/core' import { Doc, DocumentQuery, Ref, SortingOrder, TxOperations } from '@anticrm/core'
import { TypeState } from '@anticrm/kanban' import { TypeState } from '@anticrm/kanban'
import { Asset, IntlString, translate } from '@anticrm/platform' import { Asset, IntlString, translate } from '@anticrm/platform'
import { getClient } from '@anticrm/presentation'
import { import {
Issue, Issue,
IssuesDateModificationPeriod, IssuesDateModificationPeriod,
@ -26,7 +27,13 @@ import {
ProjectStatus, ProjectStatus,
Team Team
} from '@anticrm/tracker' } from '@anticrm/tracker'
import { AnyComponent, AnySvelteComponent, getMillisecondsInMonth, MILLISECONDS_IN_WEEK } from '@anticrm/ui' import {
AnyComponent,
AnySvelteComponent,
getMillisecondsInMonth,
getPanelURI,
MILLISECONDS_IN_WEEK
} from '@anticrm/ui'
import tracker from './plugin' import tracker from './plugin'
import { defaultPriorities, defaultProjectStatuses, issuePriorities } from './types' import { defaultPriorities, defaultProjectStatuses, issuePriorities } from './types'
@ -461,3 +468,23 @@ export async function getIssueTitle (client: TxOperations, ref: Ref<Doc>): Promi
if (object?.$lookup?.space === undefined) throw new Error(`Issue Team not found, _id: ${ref}`) if (object?.$lookup?.space === undefined) throw new Error(`Issue Team not found, _id: ${ref}`)
return getIssueId(object.$lookup.space, object) return getIssueId(object.$lookup.space, object)
} }
export async function copyToClipboard (object: Issue, ev: Event, { type }: { type: string }): Promise<void> {
const client = getClient()
let text: string
switch (type) {
case 'id':
text = await getIssueTitle(client, object._id)
break
case 'title':
text = object.title
break
case 'link':
// TODO: fix when short link is available
text = `${window.location.href}#${getPanelURI(tracker.component.EditIssue, object._id, object._class, 'content')}`
break
default:
return
}
await navigator.clipboard.writeText(text)
}

View File

@ -280,7 +280,10 @@ export default plugin(trackerId, {
SetStatus: '' as Ref<Action>, SetStatus: '' as Ref<Action>,
SetPriority: '' as Ref<Action>, SetPriority: '' as Ref<Action>,
SetAssignee: '' as Ref<Action>, SetAssignee: '' as Ref<Action>,
SetProject: '' as Ref<Action> SetProject: '' as Ref<Action>,
CopyIssueId: '' as Ref<Action>,
CopyIssueTitle: '' as Ref<Action>,
CopyIssueLink: '' as Ref<Action>
}, },
team: { team: {
DefaultTeam: '' as Ref<Team> DefaultTeam: '' as Ref<Team>