From 0019dbb68a5fd238d212de39d21fb2b3a0e18b87 Mon Sep 17 00:00:00 2001 From: Alexander Onnikov Date: Wed, 28 Aug 2024 00:02:28 +0700 Subject: [PATCH 1/4] fix: wrap lines in codeblock (#6406) Signed-off-by: Alexander Onnikov --- packages/theme/styles/prose.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/theme/styles/prose.scss b/packages/theme/styles/prose.scss index 6f286f8a62..77e29a60ba 100644 --- a/packages/theme/styles/prose.scss +++ b/packages/theme/styles/prose.scss @@ -360,8 +360,10 @@ table.proseTable { padding: .5rem; user-select: text; cursor: auto; +} - pre { white-space: pre-wrap; } +pre.proseCodeBlock { + white-space: pre-wrap; } // Fixes for MessageViewer From c2d0aad760e6810ddb375779dc9f369fc9a19fbe Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 28 Aug 2024 00:12:42 +0700 Subject: [PATCH 2/4] Fix markdown migration tool (#6407) Signed-off-by: Andrey Sobolev --- dev/tool/package.json | 1 + dev/tool/src/index.ts | 8 +++---- dev/tool/src/markup.ts | 52 +++++++++++++++++----------------------- server/tool/src/index.ts | 2 +- 4 files changed, 28 insertions(+), 35 deletions(-) diff --git a/dev/tool/package.json b/dev/tool/package.json index 6d0e67c600..79dd4519fa 100644 --- a/dev/tool/package.json +++ b/dev/tool/package.json @@ -16,6 +16,7 @@ "_phase:docker-staging": "rushx docker:staging", "bundle": "mkdir -p bundle && esbuild src/__start.ts --bundle --minify --platform=node --define:process.env.MODEL_VERSION=$(node ../../common/scripts/show_version.js) --define:process.env.GIT_REVISION=$(../../common/scripts/git_version.sh) > bundle/bundle.js", "docker:build": "../../common/scripts/docker_build.sh hardcoreeng/tool", + "docker:tbuild": "docker build -t hardcoreeng/tool . --platform=linux/amd64 && ../../common/scripts/docker_tag_push.sh hardcoreeng/tool", "docker:staging": "../../common/scripts/docker_tag.sh hardcoreeng/tool staging", "docker:push": "../../common/scripts/docker_tag.sh hardcoreeng/tool", "run-local": "rush bundle --to @hcengineering/tool >/dev/null && cross-env SERVER_SECRET=secret ACCOUNTS_URL=http://localhost:3000 TRANSACTOR_URL=ws://localhost:3333 MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin MINIO_ENDPOINT=localhost MONGO_URL=mongodb://localhost:27017 TELEGRAM_DATABASE=telegram-service ELASTIC_URL=http://localhost:9200 REKONI_URL=http://localhost:4004 MODEL_VERSION=$(node ../../common/scripts/show_version.js) GIT_REVISION=$(git describe --all --long) node --max-old-space-size=18000 ./bundle/bundle.js", diff --git a/dev/tool/src/index.ts b/dev/tool/src/index.ts index 56671c74f9..3a13e78bb2 100644 --- a/dev/tool/src/index.ts +++ b/dev/tool/src/index.ts @@ -1300,19 +1300,19 @@ export function devTool ( await withDatabase(mongodbUri, async (db, client) => { await withStorage(mongodbUri, async (adapter) => { const workspaces = await listWorkspacesPure(db) + let index = 0 for (const workspace of workspaces) { if (cmd.workspace !== '' && workspace.workspace !== cmd.workspace) { continue } const wsId = getWorkspaceId(workspace.workspace) - const endpoint = await getTransactorEndpoint(generateToken(systemAccountEmail, wsId), 'external') + console.log('processing workspace', workspace.workspace, index, workspaces.length) - console.log('processing workspace', workspace.workspace) - - await migrateMarkup(toolCtx, adapter, wsId, client, endpoint, parseInt(cmd.concurrency)) + await migrateMarkup(toolCtx, adapter, wsId, client, mongodbUri, parseInt(cmd.concurrency)) console.log('...done', workspace.workspace) + index++ } }) }) diff --git a/dev/tool/src/markup.ts b/dev/tool/src/markup.ts index 8b889614d9..67afdd44db 100644 --- a/dev/tool/src/markup.ts +++ b/dev/tool/src/markup.ts @@ -15,7 +15,7 @@ import core, { } from '@hcengineering/core' import { getMongoClient, getWorkspaceDB } from '@hcengineering/mongo' import { type StorageAdapter } from '@hcengineering/server-core' -import { connect } from '@hcengineering/server-tool' +import { connect, fetchModelFromMongo } from '@hcengineering/server-tool' import { jsonToText, markupToYDoc } from '@hcengineering/text' import { type Db, type FindCursor, type MongoClient } from 'mongodb' @@ -120,47 +120,39 @@ export async function migrateMarkup ( storageAdapter: StorageAdapter, workspaceId: WorkspaceId, client: MongoClient, - transactorUrl: string, + mongodbUri: string, concurrency: number ): Promise { - const connection = (await connect(transactorUrl, workspaceId, undefined, { - mode: 'backup' - })) as unknown as CoreClient - - const hierarchy = connection.getHierarchy() + const { hierarchy } = await fetchModelFromMongo(ctx, mongodbUri, workspaceId) const workspaceDb = client.db(workspaceId.name) - try { - const classes = hierarchy.getDescendants(core.class.Doc) - for (const _class of classes) { - const domain = hierarchy.findDomain(_class) - if (domain === undefined) continue + const classes = hierarchy.getDescendants(core.class.Doc) + for (const _class of classes) { + const domain = hierarchy.findDomain(_class) + if (domain === undefined) continue - const allAttributes = hierarchy.getAllAttributes(_class) - const attributes = Array.from(allAttributes.values()).filter((attribute) => { - return hierarchy.isDerived(attribute.type._class, 'core:class:TypeCollaborativeMarkup' as Ref>) - }) + const allAttributes = hierarchy.getAllAttributes(_class) + const attributes = Array.from(allAttributes.values()).filter((attribute) => { + return hierarchy.isDerived(attribute.type._class, 'core:class:TypeCollaborativeMarkup' as Ref>) + }) - if (attributes.length === 0) continue - if (hierarchy.isMixin(_class) && attributes.every((p) => p.attributeOf !== _class)) continue + if (attributes.length === 0) continue + if (hierarchy.isMixin(_class) && attributes.every((p) => p.attributeOf !== _class)) continue - const collection = workspaceDb.collection(domain) + const collection = workspaceDb.collection(domain) - const filter = hierarchy.isMixin(_class) ? { [_class]: { $exists: true } } : { _class } + const filter = hierarchy.isMixin(_class) ? { [_class]: { $exists: true } } : { _class } - const count = await collection.countDocuments(filter) - const iterator = collection.find(filter) + const count = await collection.countDocuments(filter) + const iterator = collection.find(filter) - try { - console.log('processing', _class, '->', count) - await processMigrateMarkupFor(ctx, hierarchy, storageAdapter, workspaceId, attributes, iterator, concurrency) - } finally { - await iterator.close() - } + try { + console.log('processing', _class, '->', count) + await processMigrateMarkupFor(ctx, hierarchy, storageAdapter, workspaceId, attributes, iterator, concurrency) + } finally { + await iterator.close() } - } finally { - await connection.close() } } diff --git a/server/tool/src/index.ts b/server/tool/src/index.ts index f29c8f38e5..4a358558cc 100644 --- a/server/tool/src/index.ts +++ b/server/tool/src/index.ts @@ -469,7 +469,7 @@ async function prepareMigrationClient ( return { migrateClient, migrateState } } -async function fetchModelFromMongo ( +export async function fetchModelFromMongo ( ctx: MeasureContext, mongodbUri: string, workspaceId: WorkspaceId, From 4cce0033646e2a79f2073fbf883d993a8f9e1196 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 28 Aug 2024 13:51:20 +0700 Subject: [PATCH 3/4] UBERF-7959: Fix async issues (#6409) Signed-off-by: Andrey Sobolev --- .../src/components/chat/utils.ts | 42 ++- plugins/chunter-resources/src/index.ts | 128 +++++---- plugins/contact-resources/src/index.ts | 25 +- .../src/components/CreatePublicLink.svelte | 10 +- plugins/hr-resources/src/utils.ts | 17 +- plugins/notification-resources/src/utils.ts | 24 +- .../src/actions/questionMoveDownAction.ts | 5 +- .../src/actions/questionMoveUpAction.ts | 5 +- .../src/components/CreateCandidate.svelte | 32 +-- .../src/components/MoveApplication.svelte | 2 +- .../src/components/ClassAttributesList.svelte | 10 +- .../src/components/Profile.svelte | 20 +- .../components/spaceTypes/RoleEditor.svelte | 12 +- plugins/setting-resources/src/index.ts | 67 +++-- .../node-view/ToDoItemNodeView.svelte | 20 +- .../DeleteComponentPresenter.svelte | 12 +- plugins/tracker-resources/src/index.ts | 242 ++++++++---------- plugins/view-resources/src/actionImpl.ts | 18 +- plugins/view-resources/src/utils.ts | 3 +- .../src/components/GithubRepositories.svelte | 52 ++-- .../github/pod-github/src/sync/comments.ts | 2 +- .../github/pod-github/src/sync/issueBase.ts | 2 +- .../pod-github/src/sync/pullrequests.ts | 2 +- .../pod-github/src/sync/reviewComments.ts | 2 +- .../pod-github/src/sync/reviewThreads.ts | 4 +- .../github/pod-github/src/sync/reviews.ts | 2 +- services/github/pod-github/src/sync/utils.ts | 2 +- 27 files changed, 338 insertions(+), 424 deletions(-) diff --git a/plugins/chunter-resources/src/components/chat/utils.ts b/plugins/chunter-resources/src/components/chat/utils.ts index 16a850609a..5f4802d3f7 100644 --- a/plugins/chunter-resources/src/components/chat/utils.ts +++ b/plugins/chunter-resources/src/components/chat/utils.ts @@ -12,31 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. // -import notification, { type DocNotifyContext } from '@hcengineering/notification' +import attachment, { type SavedAttachments } from '@hcengineering/attachment' +import { type DirectMessage } from '@hcengineering/chunter' +import contact, { type PersonAccount } from '@hcengineering/contact' import core, { + type Account, + AccountRole, generateId, + getCurrentAccount, + hasAccountRole, + type IdMap, type Ref, SortingOrder, - type WithLookup, - hasAccountRole, - getCurrentAccount, - AccountRole, - type IdMap, - type Account, - type UserStatus + type UserStatus, + type WithLookup } from '@hcengineering/core' +import notification, { type DocNotifyContext } from '@hcengineering/notification' +import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources' import { createQuery, getClient, MessageBox } from '@hcengineering/presentation' -import { get, writable } from 'svelte/store' +import { type Action, showPopup } from '@hcengineering/ui' import view from '@hcengineering/view' import workbench, { type SpecialNavModel } from '@hcengineering/workbench' -import attachment, { type SavedAttachments } from '@hcengineering/attachment' -import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources' -import { type Action, showPopup } from '@hcengineering/ui' -import contact, { type PersonAccount } from '@hcengineering/contact' -import { type DirectMessage } from '@hcengineering/chunter' +import { get, writable } from 'svelte/store' -import { type ChatNavGroupModel, type ChatNavItemModel, type SortFnOptions } from './types' import chunter from '../../plugin' +import { type ChatNavGroupModel, type ChatNavItemModel, type SortFnOptions } from './types' const navigatorStateStorageKey = 'chunter.navigatorState' @@ -356,14 +356,12 @@ function archiveActivityChannels (contexts: DocNotifyContext[]): void { MessageBox, { label: chunter.string.ArchiveActivityConfirmationTitle, - message: chunter.string.ArchiveActivityConfirmationMessage - }, - 'top', - (result?: boolean) => { - if (result === true) { - void removeActivityChannels(contexts) + message: chunter.string.ArchiveActivityConfirmationMessage, + action: async () => { + await removeActivityChannels(contexts) } - } + }, + 'top' ) } diff --git a/plugins/chunter-resources/src/index.ts b/plugins/chunter-resources/src/index.ts index c053acb199..d5e32d8425 100644 --- a/plugins/chunter-resources/src/index.ts +++ b/plugins/chunter-resources/src/index.ts @@ -13,115 +13,101 @@ // limitations under the License. // -import { writable } from 'svelte/store' +import { type ActivityMessage } from '@hcengineering/activity' import chunter, { type Channel, type ChatMessage, type DirectMessage } from '@hcengineering/chunter' import { type Resources } from '@hcengineering/platform' import { MessageBox, getClient } from '@hcengineering/presentation' import { getLocation, navigate, showPopup } from '@hcengineering/ui' -import { type ActivityMessage } from '@hcengineering/activity' +import { writable } from 'svelte/store' -import ChannelPresenter from './components/ChannelPresenter.svelte' +import ChannelCreatedMessage from './components/activity/ChannelCreatedMessage.svelte' +import MembersChangedMessage from './components/activity/MembersChangedMessage.svelte' +import ChannelHeader from './components/ChannelHeader.svelte' +import ChannelIcon from './components/ChannelIcon.svelte' import ChannelPanel from './components/ChannelPanel.svelte' -import ChunterBrowser from './components/chat/specials/ChunterBrowser.svelte' -import ConvertDmToPrivateChannelModal from './components/ConvertDmToPrivateChannel.svelte' +import ChannelPresenter from './components/ChannelPresenter.svelte' +import ChannelPreview from './components/ChannelPreview.svelte' +import ChatMessageInput from './components/chat-message/ChatMessageInput.svelte' +import ChatMessagePresenter from './components/chat-message/ChatMessagePresenter.svelte' +import ChatMessagePreview from './components/chat-message/ChatMessagePreview.svelte' +import ChatMessagesPresenter from './components/chat-message/ChatMessagesPresenter.svelte' +import Chat from './components/chat/Chat.svelte' +import ChatAside from './components/chat/ChatAside.svelte' import CreateChannel from './components/chat/create/CreateChannel.svelte' import CreateDirectChat from './components/chat/create/CreateDirectChat.svelte' +import ChunterBrowser from './components/chat/specials/ChunterBrowser.svelte' +import SavedMessages from './components/chat/specials/SavedMessages.svelte' +import ConvertDmToPrivateChannelModal from './components/ConvertDmToPrivateChannel.svelte' +import DirectIcon from './components/DirectIcon.svelte' import DmHeader from './components/DmHeader.svelte' import DmPresenter from './components/DmPresenter.svelte' import EditChannel from './components/EditChannel.svelte' -import ChannelPreview from './components/ChannelPreview.svelte' +import ChatMessageNotificationLabel from './components/notification/ChatMessageNotificationLabel.svelte' +import JoinChannelNotificationPresenter from './components/notification/JoinChannelNotificationPresenter.svelte' +import ThreadNotificationPresenter from './components/notification/ThreadNotificationPresenter.svelte' +import ThreadMessagePresenter from './components/threads/ThreadMessagePresenter.svelte' +import ThreadMessagePreview from './components/threads/ThreadMessagePreview.svelte' +import ThreadParentPresenter from './components/threads/ThreadParentPresenter.svelte' +import Threads from './components/threads/Threads.svelte' import ThreadView from './components/threads/ThreadView.svelte' import ThreadViewPanel from './components/threads/ThreadViewPanel.svelte' -import ChatMessagePresenter from './components/chat-message/ChatMessagePresenter.svelte' -import ChatMessageInput from './components/chat-message/ChatMessageInput.svelte' -import ChatMessagesPresenter from './components/chat-message/ChatMessagesPresenter.svelte' -import Chat from './components/chat/Chat.svelte' -import ThreadMessagePresenter from './components/threads/ThreadMessagePresenter.svelte' -import ThreadParentPresenter from './components/threads/ThreadParentPresenter.svelte' -import ChannelHeader from './components/ChannelHeader.svelte' -import SavedMessages from './components/chat/specials/SavedMessages.svelte' -import Threads from './components/threads/Threads.svelte' -import DirectIcon from './components/DirectIcon.svelte' -import ChannelIcon from './components/ChannelIcon.svelte' -import ThreadNotificationPresenter from './components/notification/ThreadNotificationPresenter.svelte' -import ChatMessageNotificationLabel from './components/notification/ChatMessageNotificationLabel.svelte' -import ChatAside from './components/chat/ChatAside.svelte' -import ThreadMessagePreview from './components/threads/ThreadMessagePreview.svelte' -import ChatMessagePreview from './components/chat-message/ChatMessagePreview.svelte' -import ChannelCreatedMessage from './components/activity/ChannelCreatedMessage.svelte' -import MembersChangedMessage from './components/activity/MembersChangedMessage.svelte' -import JoinChannelNotificationPresenter from './components/notification/JoinChannelNotificationPresenter.svelte' +import { + chunterSpaceLinkFragmentProvider, + getMessageLink, + getMessageLocation, + getThreadLink, + replyToThread +} from './navigation' import { ChannelTitleProvider, DirectTitleProvider, + canCopyMessageLink, canDeleteMessage, + canReplyToThread, dmIdentifierProvider, getDmName, getTitle, getUnreadThreadsCount, - canCopyMessageLink, leaveChannelAction, - removeChannelAction, - canReplyToThread + removeChannelAction } from './utils' -import { - chunterSpaceLinkFragmentProvider, - getThreadLink, - getMessageLink, - replyToThread, - getMessageLocation -} from './navigation' -export { default as ChatMessagesPresenter } from './components/chat-message/ChatMessagesPresenter.svelte' -export { default as ChatMessagePopup } from './components/chat-message/ChatMessagePopup.svelte' export { default as ChatMessageInput } from './components/chat-message/ChatMessageInput.svelte' +export { default as ChatMessagePopup } from './components/chat-message/ChatMessagePopup.svelte' +export { default as ChatMessagesPresenter } from './components/chat-message/ChatMessagesPresenter.svelte' export { default as Header } from './components/Header.svelte' export { default as ThreadView } from './components/threads/ThreadView.svelte' export async function ArchiveChannel (channel: Channel, evt: any, afterArchive?: () => void): Promise { - showPopup( - MessageBox, - { - label: chunter.string.ArchiveChannel, - message: chunter.string.ArchiveConfirm - }, - undefined, - (result: boolean) => { - if (result) { - const client = getClient() + showPopup(MessageBox, { + label: chunter.string.ArchiveChannel, + message: chunter.string.ArchiveConfirm, + action: async () => { + const client = getClient() - // eslint-disable-next-line @typescript-eslint/no-floating-promises - client.update(channel, { archived: true }) - if (afterArchive != null) afterArchive() + // eslint-disable-next-line @typescript-eslint/no-floating-promises + await client.update(channel, { archived: true }) + if (afterArchive != null) afterArchive() - const loc = getLocation() - if (loc.path[3] === channel._id) { - loc.path.length = 3 - navigate(loc) - } + const loc = getLocation() + if (loc.path[3] === channel._id) { + loc.path.length = 3 + navigate(loc) } } - ) + }) } async function UnarchiveChannel (channel: Channel): Promise { - showPopup( - MessageBox, - { - label: chunter.string.UnarchiveChannel, - message: chunter.string.UnarchiveConfirm - }, - undefined, - (result: boolean) => { - if (result) { - const client = getClient() - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - client.update(channel, { archived: false }) - } + showPopup(MessageBox, { + label: chunter.string.UnarchiveChannel, + message: chunter.string.UnarchiveConfirm, + action: async () => { + const client = getClient() + await client.update(channel, { archived: false }) } - ) + }) } async function ConvertDmToPrivateChannel (dm: DirectMessage): Promise { diff --git a/plugins/contact-resources/src/index.ts b/plugins/contact-resources/src/index.ts index 5589c90807..638b8b272b 100644 --- a/plugins/contact-resources/src/index.ts +++ b/plugins/contact-resources/src/index.ts @@ -272,25 +272,16 @@ async function kickEmployee (doc: Person): Promise { if (accounts.length === 0) { await client.update(employee, { active: false }) } else { - showPopup( - MessageBox, - { - label: contact.string.KickEmployee, - message: contact.string.KickEmployeeDescr - }, - undefined, - (res?: boolean) => { - if (res === true) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - const p = getResource(login.function.LeaveWorkspace) - for (const i of accounts) { - void p.then(async (f) => { - await f(i.email) - }) - } + showPopup(MessageBox, { + label: contact.string.KickEmployee, + message: contact.string.KickEmployeeDescr, + action: async () => { + const leaveWorkspace = await getResource(login.function.LeaveWorkspace) + for (const i of accounts) { + await leaveWorkspace(i.email) } } - ) + }) } } async function openChannelURL (doc: Channel): Promise { diff --git a/plugins/guest-resources/src/components/CreatePublicLink.svelte b/plugins/guest-resources/src/components/CreatePublicLink.svelte index 1107b1cf26..f56a770cd7 100644 --- a/plugins/guest-resources/src/components/CreatePublicLink.svelte +++ b/plugins/guest-resources/src/components/CreatePublicLink.svelte @@ -77,13 +77,15 @@ MessageBox, { label: guest.string.Revoke, - message: guest.string.RevokeConfirmation + message: guest.string.RevokeConfirmation, + action: async () => { + if (link !== undefined) { + await client.remove(link) + } + } }, 'top', (res) => { - if (res === true && link !== undefined) { - client.remove(link) - } dispatch('close') } ) diff --git a/plugins/hr-resources/src/utils.ts b/plugins/hr-resources/src/utils.ts index 1296c71318..2c27f723aa 100644 --- a/plugins/hr-resources/src/utils.ts +++ b/plugins/hr-resources/src/utils.ts @@ -35,21 +35,16 @@ export async function addMember (client: TxOperations, employee?: Employee, valu params: { current: current.name, department: value.name + }, + action: async () => { + await client.updateMixin(employee._id, employee._class, employee.space, hr.mixin.Staff, { + department: value._id + }) } }, undefined, (res?: boolean) => { - if (res === true && value !== undefined) { - void client - .updateMixin(employee._id, employee._class, employee.space, hr.mixin.Staff, { - department: value._id - }) - .then(() => { - resolve(null) - }) - } else { - resolve(null) - } + resolve(null) } ) }) diff --git a/plugins/notification-resources/src/utils.ts b/plugins/notification-resources/src/utils.ts index 90d4fb7319..143383e8eb 100644 --- a/plugins/notification-resources/src/utils.ts +++ b/plugins/notification-resources/src/utils.ts @@ -25,6 +25,8 @@ import { isReactionMessage, messageInFocus } from '@hcengineering/activity-resources' +import { Analytics } from '@hcengineering/analytics' +import chunter, { type ThreadMessage } from '@hcengineering/chunter' import core, { SortingOrder, getCurrentAccount, @@ -39,17 +41,18 @@ import notification, { NotificationStatus, notificationId, type ActivityInboxNotification, + type BaseNotificationType, type Collaborators, type DisplayInboxNotification, type DocNotifyContext, type InboxNotification, type MentionInboxNotification, - type BaseNotificationType, type NotificationProvider, type NotificationProviderSetting, type NotificationTypeSetting } from '@hcengineering/notification' -import { MessageBox, getClient, createQuery } from '@hcengineering/presentation' +import { getMetadata } from '@hcengineering/platform' +import { MessageBox, createQuery, getClient } from '@hcengineering/presentation' import { getCurrentLocation, getLocation, @@ -60,12 +63,9 @@ import { type Location, type ResolvedLocation } from '@hcengineering/ui' -import { get, writable } from 'svelte/store' -import chunter, { type ThreadMessage } from '@hcengineering/chunter' -import { getMetadata } from '@hcengineering/platform' import { decodeObjectURI, encodeObjectURI, type LinkIdProvider } from '@hcengineering/view' import { getObjectLinkId } from '@hcengineering/view-resources' -import { Analytics } from '@hcengineering/analytics' +import { get, writable } from 'svelte/store' import { InboxNotificationsClientImpl } from './inboxNotificationsClient' import { type InboxData, type InboxNotificationsFilter } from './types' @@ -311,14 +311,12 @@ export async function archiveAll (): Promise { MessageBox, { label: notification.string.ArchiveAllConfirmationTitle, - message: notification.string.ArchiveAllConfirmationMessage - }, - 'top', - (result?: boolean) => { - if (result === true) { - void client.archiveAllNotifications() + message: notification.string.ArchiveAllConfirmationMessage, + action: async () => { + await client.archiveAllNotifications() } - } + }, + 'top' ) } diff --git a/plugins/questions-resources/src/actions/questionMoveDownAction.ts b/plugins/questions-resources/src/actions/questionMoveDownAction.ts index 8f84393963..d1bce8659f 100644 --- a/plugins/questions-resources/src/actions/questionMoveDownAction.ts +++ b/plugins/questions-resources/src/actions/questionMoveDownAction.ts @@ -2,8 +2,9 @@ // Copyright @ 2024 Hardcore Engineering Inc. // -import type { Question } from '@hcengineering/questions' +import { generateId } from '@hcengineering/core' import { getClient } from '@hcengineering/presentation' +import type { Question } from '@hcengineering/questions' import { canUpdateQuestion, findNextQuestion, updateQuestion } from '../utils' import { focusActionWithAvailability } from './ActionWithAvailability' @@ -20,7 +21,7 @@ export const questionMoveDownAction = focusActionWithAvailability { if (shouldSaveDraft) { draftController.save(object, empty) } } - async function showConfirmationDialog () { + async function showConfirmationDialog (): Promise { draftController.save(object, empty) const isFormEmpty = draft === undefined @@ -559,15 +559,17 @@ MessageBox, { label: recruit.string.CreateTalentDialogClose, - message: recruit.string.CreateTalentDialogCloseNote + message: recruit.string.CreateTalentDialogCloseNote, + action: async () => { + await deleteResume() + resetObject() + draftController.remove() + } }, 'top', (result?: boolean) => { if (result === true) { dispatch('close') - deleteResume() - resetObject() - draftController.remove() } } ) diff --git a/plugins/recruit-resources/src/components/MoveApplication.svelte b/plugins/recruit-resources/src/components/MoveApplication.svelte index 82d0f05e5c..6d174dd08d 100644 --- a/plugins/recruit-resources/src/components/MoveApplication.svelte +++ b/plugins/recruit-resources/src/components/MoveApplication.svelte @@ -65,7 +65,7 @@ throw new Error(`create application: state not found space:${_space}`) } - const op = client.apply('application.states') + const op = client.apply(_space + 'application.states') for (const a of selected) { await moveToSpace(op, a, _space, { status: selectedState._id }) diff --git a/plugins/setting-resources/src/components/ClassAttributesList.svelte b/plugins/setting-resources/src/components/ClassAttributesList.svelte index 2545d0b071..c871cab179 100644 --- a/plugins/setting-resources/src/components/ClassAttributesList.svelte +++ b/plugins/setting-resources/src/components/ClassAttributesList.svelte @@ -86,15 +86,13 @@ MessageBox, { label: settings.string.DeleteAttribute, - message: exist ? settings.string.DeleteAttributeExistConfirm : settings.string.DeleteAttributeConfirm - }, - 'top', - async (result) => { - if (result != null) { + message: exist ? settings.string.DeleteAttributeExistConfirm : settings.string.DeleteAttributeConfirm, + action: async () => { await client.remove(attribute) update() } - } + }, + 'top' ) } diff --git a/plugins/setting-resources/src/components/Profile.svelte b/plugins/setting-resources/src/components/Profile.svelte index 758d71c594..2ddf94ceec 100644 --- a/plugins/setting-resources/src/components/Profile.svelte +++ b/plugins/setting-resources/src/components/Profile.svelte @@ -55,20 +55,14 @@ const manager = createFocusManager() async function leave (): Promise { - showPopup( - MessageBox, - { - label: setting.string.Leave, - message: setting.string.LeaveDescr - }, - undefined, - async (res?: boolean) => { - if (res === true) { - const leaveWorkspace = await getResource(login.function.LeaveWorkspace) - await leaveWorkspace(getCurrentAccount().email) - } + showPopup(MessageBox, { + label: setting.string.Leave, + message: setting.string.LeaveDescr, + action: async () => { + const leaveWorkspace = await getResource(login.function.LeaveWorkspace) + await leaveWorkspace(getCurrentAccount().email) } - ) + }) } async function nameChange (): Promise { diff --git a/plugins/setting-resources/src/components/spaceTypes/RoleEditor.svelte b/plugins/setting-resources/src/components/spaceTypes/RoleEditor.svelte index 063228ff70..e313a5d2b9 100644 --- a/plugins/setting-resources/src/components/spaceTypes/RoleEditor.svelte +++ b/plugins/setting-resources/src/components/spaceTypes/RoleEditor.svelte @@ -98,14 +98,12 @@ MessageBox, { label: settingRes.string.DeleteRole, - message: settingRes.string.DeleteRoleConfirmation - }, - 'top', - (result?: boolean) => { - if (result === true) { - void performDeleteRole() + message: settingRes.string.DeleteRoleConfirmation, + action: async () => { + await performDeleteRole() } - } + }, + 'top' ) } diff --git a/plugins/setting-resources/src/index.ts b/plugins/setting-resources/src/index.ts index 74fb2a3e01..7ed4cc263f 100644 --- a/plugins/setting-resources/src/index.ts +++ b/plugins/setting-resources/src/index.ts @@ -29,62 +29,59 @@ import Privacy from './components/Privacy.svelte' import Profile from './components/Profile.svelte' import Settings from './components/Settings.svelte' +import { Analytics } from '@hcengineering/analytics' +import ClassAttributes from './components/ClassAttributes.svelte' +import ClassAttributesList from './components/ClassAttributesList.svelte' +import Configure from './components/Configure.svelte' +import IntegrationPanel from './components/IntegrationPanel.svelte' +import InviteSetting from './components/InviteSetting.svelte' +import PermissionPresenter from './components/presenters/PermissionPresenter.svelte' +import SpaceTypeDescriptorPresenter from './components/presenters/SpaceTypeDescriptorPresenter.svelte' +import Spaces from './components/Spaces.svelte' +import SpaceTypeGeneralSectionEditor from './components/spaceTypes/editor/SpaceTypeGeneralSectionEditor.svelte' +import SpaceTypePropertiesSectionEditor from './components/spaceTypes/editor/SpaceTypePropertiesSectionEditor.svelte' +import SpaceTypeRolesSectionEditor from './components/spaceTypes/editor/SpaceTypeRolesSectionEditor.svelte' +import ManageSpaceTypeContent from './components/spaceTypes/ManageSpaceTypeContent.svelte' +import ManageSpaceTypes from './components/spaceTypes/ManageSpaceTypes.svelte' +import ManageSpaceTypesTools from './components/spaceTypes/ManageSpaceTypesTools.svelte' +import RoleEditor from './components/spaceTypes/RoleEditor.svelte' import Support from './components/Support.svelte' import Terms from './components/Terms.svelte' +import ArrayEditor from './components/typeEditors/ArrayEditor.svelte' import BooleanTypeEditor from './components/typeEditors/BooleanTypeEditor.svelte' import DateTypeEditor from './components/typeEditors/DateTypeEditor.svelte' import EnumTypeEditor from './components/typeEditors/EnumTypeEditor.svelte' import HyperlinkTypeEditor from './components/typeEditors/HyperlinkTypeEditor.svelte' import NumberTypeEditor from './components/typeEditors/NumberTypeEditor.svelte' -import ArrayEditor from './components/typeEditors/ArrayEditor.svelte' import RefEditor from './components/typeEditors/RefEditor.svelte' +import RoleAssignmentEditor from './components/typeEditors/RoleAssignmentEditor.svelte' import StringTypeEditor from './components/typeEditors/StringTypeEditor.svelte' import WorkspaceSetting from './components/WorkspaceSetting.svelte' import WorkspaceSettings from './components/WorkspaceSettings.svelte' -import InviteSetting from './components/InviteSetting.svelte' -import Configure from './components/Configure.svelte' -import Spaces from './components/Spaces.svelte' import setting from './plugin' -import IntegrationPanel from './components/IntegrationPanel.svelte' -import { getOwnerFirstName, getOwnerLastName, getOwnerPosition, getValue, filterDescendants } from './utils' -import ClassAttributes from './components/ClassAttributes.svelte' -import ClassAttributesList from './components/ClassAttributesList.svelte' -import ManageSpaceTypes from './components/spaceTypes/ManageSpaceTypes.svelte' -import ManageSpaceTypesTools from './components/spaceTypes/ManageSpaceTypesTools.svelte' -import ManageSpaceTypeContent from './components/spaceTypes/ManageSpaceTypeContent.svelte' -import PermissionPresenter from './components/presenters/PermissionPresenter.svelte' -import SpaceTypeDescriptorPresenter from './components/presenters/SpaceTypeDescriptorPresenter.svelte' -import SpaceTypeGeneralSectionEditor from './components/spaceTypes/editor/SpaceTypeGeneralSectionEditor.svelte' -import SpaceTypePropertiesSectionEditor from './components/spaceTypes/editor/SpaceTypePropertiesSectionEditor.svelte' -import SpaceTypeRolesSectionEditor from './components/spaceTypes/editor/SpaceTypeRolesSectionEditor.svelte' -import RoleEditor from './components/spaceTypes/RoleEditor.svelte' -import RoleAssignmentEditor from './components/typeEditors/RoleAssignmentEditor.svelte' +import { filterDescendants, getOwnerFirstName, getOwnerLastName, getOwnerPosition, getValue } from './utils' -export { ClassSetting, filterDescendants, ClassAttributes, ClassAttributesList, SpaceTypeGeneralSectionEditor } export * from './store' +export { ClassAttributes, ClassAttributesList, ClassSetting, filterDescendants, SpaceTypeGeneralSectionEditor } async function DeleteMixin (object: Mixin>): Promise { const docs = await getClient().findAll(object._id, {}, { limit: 1 }) - showPopup( - MessageBox, - { - label: setting.string.DeleteMixin, - message: docs.length > 0 ? setting.string.DeleteMixinExistConfirm : setting.string.DeleteMixinConfirm, - params: { count: docs.length } - }, - undefined, - (result?: boolean) => { - if (result === true) { - const objs = Array.isArray(object) ? object : [object] - for (const o of objs) { - deleteObject(getClient(), o).catch((err) => { - console.error(err) - }) + showPopup(MessageBox, { + label: setting.string.DeleteMixin, + message: docs.length > 0 ? setting.string.DeleteMixinExistConfirm : setting.string.DeleteMixinConfirm, + params: { count: docs.length }, + action: async () => { + const objs = Array.isArray(object) ? object : [object] + for (const o of objs) { + try { + await deleteObject(getClient(), o) + } catch (err: any) { + Analytics.handleError(err) } } } - ) + }) } export default async (): Promise => ({ diff --git a/plugins/time-resources/src/components/text-editor/node-view/ToDoItemNodeView.svelte b/plugins/time-resources/src/components/text-editor/node-view/ToDoItemNodeView.svelte index ef567fb19d..4e4e0dbc8c 100644 --- a/plugins/time-resources/src/components/text-editor/node-view/ToDoItemNodeView.svelte +++ b/plugins/time-resources/src/components/text-editor/node-view/ToDoItemNodeView.svelte @@ -128,14 +128,12 @@ MessageBox, { label: timeRes.string.ReassignToDo, - message: timeRes.string.ReassignToDoConfirm - }, - 'top', - async (result?: boolean) => { - if (result === true) { + message: timeRes.string.ReassignToDoConfirm, + action: async () => { await assignTodo(user) } - } + }, + 'top' ) } @@ -144,14 +142,12 @@ MessageBox, { label: timeRes.string.UnassignToDo, - message: timeRes.string.UnassignToDoConfirm - }, - 'top', - async (result?: boolean) => { - if (result === true) { + message: timeRes.string.UnassignToDoConfirm, + action: async () => { await unassignTodo() } - } + }, + 'top' ) } diff --git a/plugins/tracker-resources/src/components/components/DeleteComponentPresenter.svelte b/plugins/tracker-resources/src/components/components/DeleteComponentPresenter.svelte index f2ba439772..e46ccf490e 100644 --- a/plugins/tracker-resources/src/components/components/DeleteComponentPresenter.svelte +++ b/plugins/tracker-resources/src/components/components/DeleteComponentPresenter.svelte @@ -30,24 +30,26 @@ const client = getClient() const dispatch = createEventDispatcher() - async function showConfirmationDialog () { + async function showConfirmationDialog (): Promise { showPopup( MessageBox, { label: tracker.string.RemoveComponentDialogClose, - message: tracker.string.RemoveComponentDialogCloseNote + message: tracker.string.RemoveComponentDialogCloseNote, + action: async () => { + await removeComponent() + } }, 'top', - (result?: boolean) => { + (result) => { if (result === true) { dispatch('close') - removeComponent() } } ) } - async function removeComponent () { + async function removeComponent (): Promise { await client.remove(value) } diff --git a/plugins/tracker-resources/src/index.ts b/plugins/tracker-resources/src/index.ts index 8accaf1e84..6675385244 100644 --- a/plugins/tracker-resources/src/index.ts +++ b/plugins/tracker-resources/src/index.ts @@ -14,27 +14,27 @@ // import { Analytics } from '@hcengineering/analytics' +import chunter, { type ChatMessage } from '@hcengineering/chunter' import core, { + AccountRole, + type AttachedDoc, type Attribute, + type Class, ClassifierKind, + type Client, + type Doc, + type DocManager, + type DocumentQuery, DOMAIN_CONFIGURATION, DOMAIN_MODEL, getCurrentAccount, - type Space, - toIdMap, - type AttachedDoc, - type Class, - type Client, - type Doc, - type DocumentQuery, type Ref, type RelatedDocument, - type TxOperations, - type DocManager, - AccountRole + type Space, + toIdMap, + type TxOperations } from '@hcengineering/core' -import chunter, { type ChatMessage } from '@hcengineering/chunter' -import { type Status, translate, type Resources } from '@hcengineering/platform' +import { type Resources, type Status, translate } from '@hcengineering/platform' import { getClient, MessageBox, type ObjectSearchResult } from '@hcengineering/presentation' import { type Component, type Issue, type Milestone, type Project } from '@hcengineering/tracker' import { closePanel, getCurrentLocation, navigate, showPopup, themeStore } from '@hcengineering/ui' @@ -55,11 +55,13 @@ import Inbox from './components/inbox/Inbox.svelte' import AssigneeEditor from './components/issues/AssigneeEditor.svelte' import DueDatePresenter from './components/issues/DueDatePresenter.svelte' import EditIssue from './components/issues/edit/EditIssue.svelte' +import IssueExtra from './components/issues/IssueExtra.svelte' import IssueItem from './components/issues/IssueItem.svelte' import IssuePresenter from './components/issues/IssuePresenter.svelte' import IssuePreview from './components/issues/IssuePreview.svelte' import Issues from './components/issues/Issues.svelte' import IssueSearchIcon from './components/issues/IssueSearchIcon.svelte' +import IssueStatusPresenter from './components/issues/IssueStatusPresenter.svelte' import IssuesView from './components/issues/IssuesView.svelte' import KanbanView from './components/issues/KanbanView.svelte' import ModificationDatePresenter from './components/issues/ModificationDatePresenter.svelte' @@ -87,8 +89,6 @@ import SetDueDateActionPopup from './components/SetDueDateActionPopup.svelte' import SetParentIssueActionPopup from './components/SetParentIssueActionPopup.svelte' import SettingsRelatedTargets from './components/SettingsRelatedTargets.svelte' import CreateIssueTemplate from './components/templates/CreateIssueTemplate.svelte' -import IssueExtra from './components/issues/IssueExtra.svelte' -import IssueStatusPresenter from './components/issues/IssueStatusPresenter.svelte' import { getIssueIdByIdentifier, getIssueTitle, @@ -123,7 +123,7 @@ import ComponentSelector from './components/components/ComponentSelector.svelte' import IssueTemplatePresenter from './components/templates/IssueTemplatePresenter.svelte' import IssueTemplates from './components/templates/IssueTemplates.svelte' -import { deleteObject, deleteObjects, AggregationManager } from '@hcengineering/view-resources' +import { AggregationManager, deleteObject, deleteObjects } from '@hcengineering/view-resources' import MoveAndDeleteMilestonePopup from './components/milestones/MoveAndDeleteMilestonePopup.svelte' import EditIssueTemplate from './components/templates/EditIssueTemplate.svelte' import TemplateEstimationEditor from './components/templates/EstimationEditor.svelte' @@ -162,14 +162,14 @@ import ProjectSpacePresenter from './components/projects/ProjectSpacePresenter.s import { get } from 'svelte/store' +import contact, { AvatarType } from '@hcengineering/contact' +import { personAccountByIdStore, personAccountPersonByIdStore, personByIdStore } from '@hcengineering/contact-resources' +import notification, { type Collaborators } from '@hcengineering/notification' import { settingId } from '@hcengineering/setting' +import task, { type TaskType } from '@hcengineering/task' import { getAllStates } from '@hcengineering/task-resources' import EstimationValueEditor from './components/issues/timereport/EstimationValueEditor.svelte' import TimePresenter from './components/issues/timereport/TimePresenter.svelte' -import { personAccountByIdStore, personAccountPersonByIdStore, personByIdStore } from '@hcengineering/contact-resources' -import contact, { AvatarType } from '@hcengineering/contact' -import task, { type TaskType } from '@hcengineering/task' -import notification, { type Collaborators } from '@hcengineering/notification' export { default as AssigneeEditor } from './components/issues/AssigneeEditor.svelte' export { default as SubIssueList } from './components/issues/edit/SubIssueList.svelte' @@ -250,28 +250,24 @@ async function deleteIssue (issue: Issue | Issue[]): Promise { } else { subissues = issue.subIssues } - showPopup( - MessageBox, - { - label: tracker.string.DeleteIssue, - labelProps: { issueCount }, - message: tracker.string.DeleteIssueConfirm, - params: { - issueCount, - subIssueCount: subissues - } + showPopup(MessageBox, { + label: tracker.string.DeleteIssue, + labelProps: { issueCount }, + message: tracker.string.DeleteIssueConfirm, + params: { + issueCount, + subIssueCount: subissues }, - undefined, - async (result?: boolean) => { - if (result === true) { - const objs = Array.isArray(issue) ? issue : [issue] - await deleteObjects(getClient(), objs as unknown as Doc[]).catch((err) => { - console.error(err) - }) - closePanel() + action: async () => { + const objs = Array.isArray(issue) ? issue : [issue] + try { + await deleteObjects(getClient(), objs as unknown as Doc[]) + } catch (err: any) { + Analytics.handleError(err) } + closePanel() } - ) + }) } async function deleteProject (project: Project | undefined): Promise { @@ -280,98 +276,80 @@ async function deleteProject (project: Project | undefined): Promise { if (project.archived) { // Clean project and all issues - showPopup( - MessageBox, - { - label: tracker.string.DeleteProject, - labelProps: { name: project.name }, - message: tracker.string.ArchiveProjectConfirm - }, - undefined, - async (result?: boolean) => { - if (result === true) { - // void client.update(project, { archived: true }) - const client = getClient() - const classes = await client.findAll(core.class.Class, {}) - const h = client.getHierarchy() - for (const c of classes) { - if (c.kind !== ClassifierKind.CLASS) { - continue - } - const d = h.findDomain(c._id) - if (d !== undefined && d !== DOMAIN_MODEL && d !== DOMAIN_CONFIGURATION) { - try { - while (true) { - const docs = await client.findAll(c._id, { space: project._id }, { limit: 50 }) - if (docs.length === 0) { - break - } - const ops = client.apply('delete') - for (const object of docs) { - if (client.getHierarchy().isDerived(object._class, core.class.AttachedDoc)) { - const adoc = object as AttachedDoc - await ops - .removeCollection( - object._class, - object.space, - adoc._id, - adoc.attachedTo, - adoc.attachedToClass, - adoc.collection - ) - .catch((err) => { - console.error(err) - }) - } else { - await ops.removeDoc(object._class, object.space, object._id).catch((err) => { + showPopup(MessageBox, { + label: tracker.string.DeleteProject, + labelProps: { name: project.name }, + message: tracker.string.ArchiveProjectConfirm, + action: async () => { + // void client.update(project, { archived: true }) + const client = getClient() + const classes = await client.findAll(core.class.Class, {}) + const h = client.getHierarchy() + for (const c of classes) { + if (c.kind !== ClassifierKind.CLASS) { + continue + } + const d = h.findDomain(c._id) + if (d !== undefined && d !== DOMAIN_MODEL && d !== DOMAIN_CONFIGURATION) { + try { + while (true) { + const docs = await client.findAll(c._id, { space: project._id }, { limit: 50 }) + if (docs.length === 0) { + break + } + const ops = client.apply('delete' + project._id) + for (const object of docs) { + if (client.getHierarchy().isDerived(object._class, core.class.AttachedDoc)) { + const adoc = object as AttachedDoc + await ops + .removeCollection( + object._class, + object.space, + adoc._id, + adoc.attachedTo, + adoc.attachedToClass, + adoc.collection + ) + .catch((err) => { console.error(err) }) - } + } else { + await ops.removeDoc(object._class, object.space, object._id).catch((err) => { + console.error(err) + }) } - await ops.commit() } - } catch (err: any) { - console.error(err) - Analytics.handleError(err) + await ops.commit() } + } catch (err: any) { + console.error(err) + Analytics.handleError(err) } } - await client.remove(project) } + await client.remove(project) } - ) + }) } else { const anyIssue = await client.findOne(tracker.class.Issue, { space: project._id }) if (anyIssue !== undefined) { - showPopup( - MessageBox, - { - label: tracker.string.ArchiveProjectName, - labelProps: { name: project.name }, - message: tracker.string.ProjectHasIssues - }, - undefined, - (result?: boolean) => { - if (result === true) { - void client.update(project, { archived: true }) - } + showPopup(MessageBox, { + label: tracker.string.ArchiveProjectName, + labelProps: { name: project.name }, + message: tracker.string.ProjectHasIssues, + action: async () => { + await client.update(project, { archived: true }) } - ) + }) } else { - showPopup( - MessageBox, - { - label: tracker.string.ArchiveProjectName, - labelProps: { name: project.name }, - message: tracker.string.ArchiveProjectConfirm - }, - undefined, - (result?: boolean) => { - if (result === true) { - void client.update(project, { archived: true }) - } + showPopup(MessageBox, { + label: tracker.string.ArchiveProjectName, + labelProps: { name: project.name }, + message: tracker.string.ArchiveProjectConfirm, + action: async () => { + await client.update(project, { archived: true }) } - ) + }) } } } @@ -384,29 +362,23 @@ async function moveAndDeleteMilestones ( ): Promise { const noMilestoneLabel = await translate(tracker.string.NoMilestone, {}, get(themeStore).language) - showPopup( - MessageBox, - { - label: tracker.string.MoveAndDeleteMilestone, - message: tracker.string.MoveAndDeleteMilestoneConfirm, - labelProps: { - newMilestone: newMilestone?.label ?? noMilestoneLabel, - deleteMilestone: oldMilestones.map((p) => p.label) - } + showPopup(MessageBox, { + label: tracker.string.MoveAndDeleteMilestone, + message: tracker.string.MoveAndDeleteMilestoneConfirm, + labelProps: { + newMilestone: newMilestone?.label ?? noMilestoneLabel, + deleteMilestone: oldMilestones.map((p) => p.label) }, - undefined, - (result?: boolean) => { - if (result === true) { - for (const oldMilestone of oldMilestones) { - void moveIssuesToAnotherMilestone(client, oldMilestone, newMilestone).then((success) => { - if (success) { - void deleteObject(client, oldMilestone) - } - }) - } + action: async () => { + for (const oldMilestone of oldMilestones) { + void moveIssuesToAnotherMilestone(client, oldMilestone, newMilestone).then((success) => { + if (success) { + void deleteObject(client, oldMilestone) + } + }) } } - ) + }) } async function deleteMilestone (milestones: Milestone | Milestone[]): Promise { diff --git a/plugins/view-resources/src/actionImpl.ts b/plugins/view-resources/src/actionImpl.ts index 779646a28c..ed3197a437 100644 --- a/plugins/view-resources/src/actionImpl.ts +++ b/plugins/view-resources/src/actionImpl.ts @@ -454,19 +454,13 @@ function UpdateDocument (doc: Doc | Doc[], evt: Event, props: Record { - if (result) { - void update() - } + showPopup(MessageBox, { + label: props.label ?? view.string.LabelYes, + message: props.message ?? view.string.LabelYes, + action: async () => { + await update() } - ) + }) } else { void update() } diff --git a/plugins/view-resources/src/utils.ts b/plugins/view-resources/src/utils.ts index 7ae6c17a39..b505353209 100644 --- a/plugins/view-resources/src/utils.ts +++ b/plugins/view-resources/src/utils.ts @@ -22,6 +22,7 @@ import core, { Hierarchy, SortingOrder, TxProcessor, + generateId, getCurrentAccount, getObjectValue, type Account, @@ -582,7 +583,7 @@ export async function deleteObjects (client: TxOperations, objects: Doc[], skipC } else { realObjects = objects } - const ops = client.apply('delete') + const ops = client.apply('delete' + generateId()) for (const object of realObjects) { if (client.getHierarchy().isDerived(object._class, core.class.AttachedDoc)) { const adoc = object as AttachedDoc diff --git a/services/github/github-resources/src/components/GithubRepositories.svelte b/services/github/github-resources/src/components/GithubRepositories.svelte index 1804c4e507..15912fb2b0 100644 --- a/services/github/github-resources/src/components/GithubRepositories.svelte +++ b/services/github/github-resources/src/components/GithubRepositories.svelte @@ -1,5 +1,6 @@