remove extra spaces (#5930)

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
This commit is contained in:
Denis Bykhov 2024-06-28 08:55:32 +05:00 committed by GitHub
parent f9aabe98c3
commit 2fb4763f3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
77 changed files with 336 additions and 759 deletions

View File

@ -56,7 +56,7 @@ async function createDefaults (tx: TxOperations): Promise<void> {
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: tags.icon.Tags, icon: tags.icon.Tags,
label: 'Other', label: 'Other',

View File

@ -243,7 +243,7 @@ async function createTagCategories (tx: TxOperations): Promise<void> {
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: tags.icon.Tags, icon: tags.icon.Tags,
label: 'Labels', label: 'Labels',
@ -257,7 +257,7 @@ async function createTagCategories (tx: TxOperations): Promise<void> {
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: tags.icon.Tags, icon: tags.icon.Tags,
label: 'Labels', label: 'Labels',

View File

@ -13,29 +13,27 @@
// limitations under the License. // limitations under the License.
// //
import core, { type Ref, type Space } from '@hcengineering/core'
import { gmailId } from '@hcengineering/gmail' import { gmailId } from '@hcengineering/gmail'
import { import {
createDefaultSpace, migrateSpace,
tryUpgrade, tryMigrate,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
} from '@hcengineering/model' } from '@hcengineering/model'
import gmail from './plugin' import { DOMAIN_GMAIL } from '.'
export const gmailOperation: MigrateOperation = { export const gmailOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { await tryMigrate(client, gmailId, [
await tryUpgrade(state, client, gmailId, [
{ {
state: 'create-defaults-v2', state: 'removeDeprecatedSpace',
func: async (client) => { func: async (client: MigrationClient) => {
await createDefaultSpace(client, gmail.space.Gmail, { await migrateSpace(client, 'gmail:space:Gmail' as Ref<Space>, core.space.Workspace, [DOMAIN_GMAIL])
name: 'Gmail',
description: 'Space for all gmail messages'
})
} }
} }
]) ])
} },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
} }

View File

@ -12,7 +12,7 @@ import core, { TDoc } from '@hcengineering/model-core'
import { type Location } from '@hcengineering/ui' import { type Location } from '@hcengineering/ui'
import guest from './plugin' import guest from './plugin'
const GUEST_DOMAIN = 'guest' as Domain export const GUEST_DOMAIN = 'guest' as Domain
@Model(guest.class.PublicLink, core.class.Doc, GUEST_DOMAIN) @Model(guest.class.PublicLink, core.class.Doc, GUEST_DOMAIN)
export class TPublicLink extends TDoc implements PublicLink { export class TPublicLink extends TDoc implements PublicLink {

View File

@ -1,16 +1,23 @@
import { AccountRole, DOMAIN_TX, type Account, type TxCreateDoc, type TxUpdateDoc } from '@hcengineering/core' import {
AccountRole,
DOMAIN_TX,
type Ref,
type Space,
type Account,
type TxCreateDoc,
type TxUpdateDoc
} from '@hcengineering/core'
import { guestId } from '@hcengineering/guest' import { guestId } from '@hcengineering/guest'
import { import {
createDefaultSpace, migrateSpace,
tryMigrate, tryMigrate,
tryUpgrade,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient, type MigrationUpgradeClient,
type ModelLogger type ModelLogger
} from '@hcengineering/model' } from '@hcengineering/model'
import core from '@hcengineering/model-core' import core from '@hcengineering/model-core'
import guest from './plugin' import { GUEST_DOMAIN } from '.'
export const guestOperation: MigrateOperation = { export const guestOperation: MigrateOperation = {
async migrate (client: MigrationClient, logger: ModelLogger): Promise<void> { async migrate (client: MigrationClient, logger: ModelLogger): Promise<void> {
@ -58,20 +65,14 @@ export const guestOperation: MigrateOperation = {
) )
} }
} }
},
{
state: 'removeDeprecatedSpace',
func: async (client: MigrationClient) => {
await migrateSpace(client, 'guest:space:Links' as Ref<Space>, core.space.Workspace, [GUEST_DOMAIN])
}
} }
]) ])
}, },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
await tryUpgrade(state, client, guestId, [
{
state: 'create-defaults-v2',
func: async (client) => {
await createDefaultSpace(client, guest.space.Links, {
name: 'Links',
description: 'Space for all guest links'
})
}
}
])
}
} }

View File

@ -13,9 +13,10 @@
// limitations under the License. // limitations under the License.
// //
import { type Ref, TxOperations } from '@hcengineering/core' import { type Space, TxOperations, type Ref } from '@hcengineering/core'
import { type Department } from '@hcengineering/hr'
import { import {
createDefaultSpace, migrateSpace,
tryMigrate, tryMigrate,
tryUpgrade, tryUpgrade,
type MigrateOperation, type MigrateOperation,
@ -24,7 +25,6 @@ import {
} from '@hcengineering/model' } from '@hcengineering/model'
import core, { DOMAIN_SPACE } from '@hcengineering/model-core' import core, { DOMAIN_SPACE } from '@hcengineering/model-core'
import hr, { DOMAIN_HR, hrId } from './index' import hr, { DOMAIN_HR, hrId } from './index'
import { type Department } from '@hcengineering/hr'
async function createDepartment (tx: TxOperations): Promise<void> { async function createDepartment (tx: TxOperations): Promise<void> {
const current = await tx.findOne(hr.class.Department, { const current = await tx.findOne(hr.class.Department, {
@ -33,7 +33,7 @@ async function createDepartment (tx: TxOperations): Promise<void> {
if (current === undefined) { if (current === undefined) {
await tx.createDoc( await tx.createDoc(
hr.class.Department, hr.class.Department,
hr.space.HR, core.space.Workspace,
{ {
name: 'Organization', name: 'Organization',
description: '', description: '',
@ -49,21 +49,21 @@ async function createDepartment (tx: TxOperations): Promise<void> {
async function migrateDepartments (client: MigrationClient): Promise<void> { async function migrateDepartments (client: MigrationClient): Promise<void> {
await client.update( await client.update(
DOMAIN_HR, DOMAIN_HR,
{ _class: hr.class.PublicHoliday, space: { $ne: hr.space.HR } }, { _class: hr.class.PublicHoliday, space: { $ne: core.space.Workspace } },
{ space: hr.space.HR } { space: core.space.Workspace }
) )
const objects = await client.find(DOMAIN_HR, { space: { $ne: hr.space.HR }, _class: hr.class.Request }) const objects = await client.find(DOMAIN_HR, { space: { $ne: core.space.Workspace }, _class: hr.class.Request })
for (const obj of objects) { for (const obj of objects) {
await client.update(DOMAIN_HR, { _id: obj._id }, { space: hr.space.HR, department: obj.space }) await client.update(DOMAIN_HR, { _id: obj._id }, { space: core.space.Workspace, department: obj.space })
} }
await client.move(DOMAIN_SPACE, { _class: hr.class.Department }, DOMAIN_HR) await client.move(DOMAIN_SPACE, { _class: hr.class.Department }, DOMAIN_HR)
const departments = await client.find<Department>(DOMAIN_HR, { const departments = await client.find<Department>(DOMAIN_HR, {
_class: hr.class.Department, _class: hr.class.Department,
space: { $ne: hr.space.HR } space: { $ne: core.space.Workspace }
}) })
for (const department of departments) { for (const department of departments) {
const upd: Partial<Department> = { const upd: Partial<Department> = {
space: hr.space.HR space: core.space.Workspace
} }
if (department._id !== hr.ids.Head) { if (department._id !== hr.ids.Head) {
upd.parent = department.space as unknown as Ref<Department> upd.parent = department.space as unknown as Ref<Department>
@ -83,6 +83,12 @@ export const hrOperation: MigrateOperation = {
{ {
state: 'migrateDepartments', state: 'migrateDepartments',
func: migrateDepartments func: migrateDepartments
},
{
state: 'removeDeprecatedSpace',
func: async (client: MigrationClient) => {
await migrateSpace(client, 'hr:space:HR' as Ref<Space>, core.space.Workspace, [DOMAIN_HR])
}
} }
]) ])
}, },
@ -91,7 +97,6 @@ export const hrOperation: MigrateOperation = {
{ {
state: 'create-defaults-v2', state: 'create-defaults-v2',
func: async (client) => { func: async (client) => {
await createDefaultSpace(client, hr.space.HR, { name: 'HR', description: 'Human Resources' })
const tx = new TxOperations(client, core.account.System) const tx = new TxOperations(client, core.account.System)
await createDepartment(tx) await createDepartment(tx)
} }

View File

@ -13,33 +13,28 @@
// limitations under the License. // limitations under the License.
// //
import core, { type Ref, type Space } from '@hcengineering/core'
import { inventoryId } from '@hcengineering/inventory' import { inventoryId } from '@hcengineering/inventory'
import { import {
createDefaultSpace, migrateSpace,
tryUpgrade, tryMigrate,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
} from '@hcengineering/model' } from '@hcengineering/model'
import inventory from './plugin' import { DOMAIN_INVENTORY } from '.'
export const inventoryOperation: MigrateOperation = { export const inventoryOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { await tryMigrate(client, inventoryId, [
await tryUpgrade(state, client, inventoryId, [
{ {
state: 'create-defaults-v2', state: 'removeDeprecatedSpace',
func: async (client) => { func: async (client: MigrationClient) => {
await createDefaultSpace(client, inventory.space.Category, { await migrateSpace(client, 'inventory:space:Category' as Ref<Space>, core.space.Workspace, [DOMAIN_INVENTORY])
name: 'Categories', await migrateSpace(client, 'inventory:space:Products' as Ref<Space>, core.space.Workspace, [DOMAIN_INVENTORY])
description: 'Space for all inventory categories'
})
await createDefaultSpace(client, inventory.space.Products, {
name: 'Products',
description: 'Space for all inventory products'
})
} }
} }
]) ])
} },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
} }

View File

@ -14,11 +14,13 @@
// //
import contact from '@hcengineering/contact' import contact from '@hcengineering/contact'
import { TxOperations, type Ref } from '@hcengineering/core' import { type Space, TxOperations, type Ref } from '@hcengineering/core'
import drive from '@hcengineering/drive' import drive from '@hcengineering/drive'
import { RoomAccess, RoomType, createDefaultRooms, isOffice, loveId, type Floor } from '@hcengineering/love' import { RoomAccess, RoomType, createDefaultRooms, isOffice, loveId, type Floor } from '@hcengineering/love'
import { import {
createDefaultSpace, createDefaultSpace,
migrateSpace,
tryMigrate,
tryUpgrade, tryUpgrade,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
@ -26,6 +28,7 @@ import {
} from '@hcengineering/model' } from '@hcengineering/model'
import core from '@hcengineering/model-core' import core from '@hcengineering/model-core'
import love from './plugin' import love from './plugin'
import { DOMAIN_LOVE } from '.'
async function createDefaultFloor (tx: TxOperations): Promise<void> { async function createDefaultFloor (tx: TxOperations): Promise<void> {
const current = await tx.findOne(love.class.Floor, { const current = await tx.findOne(love.class.Floor, {
@ -34,7 +37,7 @@ async function createDefaultFloor (tx: TxOperations): Promise<void> {
if (current === undefined) { if (current === undefined) {
await tx.createDoc( await tx.createDoc(
love.class.Floor, love.class.Floor,
love.space.Rooms, core.space.Workspace,
{ {
name: 'Main' name: 'Main'
}, },
@ -53,7 +56,7 @@ async function createRooms (client: MigrationUpgradeClient): Promise<void> {
const data = createDefaultRooms(employees.map((p) => p._id)) const data = createDefaultRooms(employees.map((p) => p._id))
for (const room of data) { for (const room of data) {
const _class = isOffice(room) ? love.class.Office : love.class.Room const _class = isOffice(room) ? love.class.Office : love.class.Room
await tx.createDoc(_class, love.space.Rooms, room) await tx.createDoc(_class, core.space.Workspace, room)
} }
} }
@ -65,7 +68,7 @@ async function createReception (client: MigrationUpgradeClient): Promise<void> {
if (current !== undefined) return if (current !== undefined) return
await tx.createDoc( await tx.createDoc(
love.class.Room, love.class.Room,
love.space.Rooms, core.space.Workspace,
{ {
name: 'Reception', name: 'Reception',
type: RoomType.Reception, type: RoomType.Reception,
@ -81,15 +84,18 @@ async function createReception (client: MigrationUpgradeClient): Promise<void> {
} }
export const loveOperation: MigrateOperation = { export const loveOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
await tryMigrate(client, loveId, [
{
state: 'removeDeprecatedSpace',
func: async (client: MigrationClient) => {
await migrateSpace(client, 'love:space:Rooms' as Ref<Space>, core.space.Workspace, [DOMAIN_LOVE])
}
}
])
},
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {
await tryUpgrade(state, client, loveId, [ await tryUpgrade(state, client, loveId, [
{
state: 'create-defaults-v2',
func: async (client) => {
await createDefaultSpace(client, love.space.Rooms, { name: 'Rooms', description: 'Space for all rooms' })
}
},
{ {
state: 'initial-defaults', state: 'initial-defaults',
func: async (client) => { func: async (client) => {

View File

@ -13,11 +13,10 @@
// limitations under the License. // limitations under the License.
// //
import { type Doc, type Ref, type Class, type DocumentQuery, DOMAIN_TX } from '@hcengineering/core' import core, { DOMAIN_TX, type Class, type Doc, type DocumentQuery, type Ref, type Space } from '@hcengineering/core'
import { import {
createDefaultSpace, migrateSpace,
tryMigrate, tryMigrate,
tryUpgrade,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
@ -76,37 +75,29 @@ export const notificationOperation: MigrateOperation = {
func: async (client) => { func: async (client) => {
await removeNotifications(client, { hidden: true }) await removeNotifications(client, { hidden: true })
} }
} },
])
await tryMigrate(client, notificationId, [
{ {
state: 'delete-invalid-notifications', state: 'delete-invalid-notifications',
func: async (client) => { func: async (client) => {
await removeNotifications(client, { attachedToClass: 'chunter:class:Comment' as Ref<Class<Doc>> }) await removeNotifications(client, { attachedToClass: 'chunter:class:Comment' as Ref<Class<Doc>> })
} }
} },
])
await tryMigrate(client, notificationId, [
{ {
state: 'remove-old-classes', state: 'remove-old-classes',
func: async (client) => { func: async (client) => {
await client.deleteMany(DOMAIN_NOTIFICATION, { _class: 'notification:class:DocUpdates' as Ref<Class<Doc>> }) await client.deleteMany(DOMAIN_NOTIFICATION, { _class: 'notification:class:DocUpdates' as Ref<Class<Doc>> })
await client.deleteMany(DOMAIN_TX, { objectClass: 'notification:class:DocUpdates' as Ref<Class<Doc>> }) await client.deleteMany(DOMAIN_TX, { objectClass: 'notification:class:DocUpdates' as Ref<Class<Doc>> })
} }
},
{
state: 'removeDeprecatedSpace',
func: async (client: MigrationClient) => {
await migrateSpace(client, 'notification:space:Notifications' as Ref<Space>, core.space.Workspace, [
DOMAIN_NOTIFICATION
])
}
} }
]) ])
}, },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
await tryUpgrade(state, client, notificationId, [
{
state: 'create-defaults-v2',
func: async (client) => {
await createDefaultSpace(client, notification.space.Notifications, {
name: 'Notifications',
description: 'Space for all notifications'
})
}
}
])
}
} }

View File

@ -13,25 +13,28 @@
// limitations under the License. // limitations under the License.
// //
import core, { type Ref, type Space } from '@hcengineering/core'
import { import {
createDefaultSpace, migrateSpace,
tryUpgrade, tryMigrate,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
} from '@hcengineering/model' } from '@hcengineering/model'
import preference, { preferenceId } from '@hcengineering/preference' import { DOMAIN_PREFERENCE, preferenceId } from '@hcengineering/preference'
export const preferenceOperation: MigrateOperation = { export const preferenceOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { await tryMigrate(client, preferenceId, [
await tryUpgrade(state, client, preferenceId, [
{ {
state: 'create-defaults-v2', state: 'removeDeprecatedSpace',
func: async (client) => { func: async (client: MigrationClient) => {
await createDefaultSpace(client, preference.space.Preference, { name: 'Preference' }) await migrateSpace(client, 'preference:space:Preference' as Ref<Space>, core.space.Workspace, [
DOMAIN_PREFERENCE
])
} }
} }
]) ])
} },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
} }

View File

@ -14,10 +14,10 @@
// //
import { getCategories } from '@anticrm/skillset' import { getCategories } from '@anticrm/skillset'
import core, { DOMAIN_TX, TxOperations, type Ref, type Status } from '@hcengineering/core' import core, { DOMAIN_TX, TxOperations, type Ref, type Space, type Status } from '@hcengineering/core'
import { import {
createDefaultSpace,
createOrUpdate, createOrUpdate,
migrateSpace,
tryMigrate, tryMigrate,
tryUpgrade, tryUpgrade,
type MigrateOperation, type MigrateOperation,
@ -29,6 +29,7 @@ import tags, { type TagCategory } from '@hcengineering/model-tags'
import task, { DOMAIN_TASK, createSequence, migrateDefaultStatusesBase } from '@hcengineering/model-task' import task, { DOMAIN_TASK, createSequence, migrateDefaultStatusesBase } from '@hcengineering/model-task'
import { recruitId, type Applicant } from '@hcengineering/recruit' import { recruitId, type Applicant } from '@hcengineering/recruit'
import { DOMAIN_CALENDAR } from '@hcengineering/model-calendar'
import { DOMAIN_SPACE } from '@hcengineering/model-core' import { DOMAIN_SPACE } from '@hcengineering/model-core'
import recruit from './plugin' import recruit from './plugin'
import { defaultApplicantStatuses } from './spaceType' import { defaultApplicantStatuses } from './spaceType'
@ -53,6 +54,12 @@ export const recruitOperation: MigrateOperation = {
func: async (client) => { func: async (client) => {
await migrateDefaultTypeMixins(client) await migrateDefaultTypeMixins(client)
} }
},
{
state: 'removeDeprecatedSpace',
func: async (client: MigrationClient) => {
await migrateSpace(client, 'recruit:space:Reviews' as Ref<Space>, core.space.Workspace, [DOMAIN_CALENDAR])
}
} }
]) ])
}, },
@ -164,12 +171,10 @@ async function migrateDefaultTypeMixins (client: MigrationClient): Promise<void>
} }
async function createDefaults (client: MigrationUpgradeClient, tx: TxOperations): Promise<void> { async function createDefaults (client: MigrationUpgradeClient, tx: TxOperations): Promise<void> {
await createDefaultSpace(client, recruit.space.Reviews, { name: 'Reviews' })
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: recruit.icon.Skills, icon: recruit.icon.Skills,
label: 'Other', label: 'Other',
@ -184,7 +189,7 @@ async function createDefaults (client: MigrationUpgradeClient, tx: TxOperations)
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: recruit.icon.Skills, icon: recruit.icon.Skills,
label: c.label, label: c.label,

View File

@ -13,26 +13,27 @@
// limitations under the License. // limitations under the License.
// //
import core, { type Ref, type Space } from '@hcengineering/core'
import { import {
createDefaultSpace, migrateSpace,
tryUpgrade, tryMigrate,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
} from '@hcengineering/model' } from '@hcengineering/model'
import { settingId } from '@hcengineering/setting' import { settingId } from '@hcengineering/setting'
import setting from './plugin' import { DOMAIN_SETTING } from '.'
export const settingOperation: MigrateOperation = { export const settingOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { await tryMigrate(client, settingId, [
await tryUpgrade(state, client, settingId, [
{ {
state: 'create-defaults-v2', state: 'removeDeprecatedSpace',
func: async (client) => { func: async (client: MigrationClient) => {
await createDefaultSpace(client, setting.space.Setting, { name: 'Setting' }) await migrateSpace(client, 'setting:space:Setting' as Ref<Space>, core.space.Workspace, [DOMAIN_SETTING])
} }
} }
]) ])
} },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
} }

View File

@ -1,23 +1,24 @@
import core, { type Ref, type Space } from '@hcengineering/core'
import { import {
createDefaultSpace, migrateSpace,
tryUpgrade, tryMigrate,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
} from '@hcengineering/model' } from '@hcengineering/model'
import { tagsId } from '@hcengineering/tags' import { tagsId } from '@hcengineering/tags'
import tags from './plugin' import { DOMAIN_TAGS } from '.'
export const tagsOperation: MigrateOperation = { export const tagsOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { await tryMigrate(client, tagsId, [
await tryUpgrade(state, client, tagsId, [
{ {
state: 'create-defaults-v2', state: 'removeDeprecatedSpace',
func: async (client) => { func: async (client: MigrationClient) => {
await createDefaultSpace(client, tags.space.Tags, { name: 'Tags', description: 'Space for all tags' }) await migrateSpace(client, 'tags:space:Tags' as Ref<Space>, core.space.Workspace, [DOMAIN_TAGS])
} }
} }
]) ])
} },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
} }

View File

@ -30,8 +30,8 @@ import {
type TxUpdateDoc type TxUpdateDoc
} from '@hcengineering/core' } from '@hcengineering/core'
import { import {
createDefaultSpace,
createOrUpdate, createOrUpdate,
migrateSpace,
tryMigrate, tryMigrate,
tryUpgrade, tryUpgrade,
type MigrateOperation, type MigrateOperation,
@ -51,7 +51,7 @@ import {
type TaskType type TaskType
} from '@hcengineering/task' } from '@hcengineering/task'
import { DOMAIN_TASK } from '.' import { DOMAIN_KANBAN, DOMAIN_TASK } from '.'
import task from './plugin' import task from './plugin'
/** /**
@ -59,18 +59,13 @@ import task from './plugin'
*/ */
export async function createSequence (tx: TxOperations, _class: Ref<Class<Doc>>): Promise<void> { export async function createSequence (tx: TxOperations, _class: Ref<Class<Doc>>): Promise<void> {
if ((await tx.findOne(task.class.Sequence, { attachedTo: _class })) === undefined) { if ((await tx.findOne(task.class.Sequence, { attachedTo: _class })) === undefined) {
await tx.createDoc(task.class.Sequence, task.space.Sequence, { await tx.createDoc(task.class.Sequence, core.space.Workspace, {
attachedTo: _class, attachedTo: _class,
sequence: 0 sequence: 0
}) })
} }
} }
async function createDefaults (client: MigrationUpgradeClient): Promise<void> {
await createDefaultSpace(client, task.space.Sequence, { name: 'Sequences' })
await createDefaultSpace(client, task.space.Statuses, { name: 'Statuses' })
}
export async function migrateDefaultStatusesBase<T extends Task> ( export async function migrateDefaultStatusesBase<T extends Task> (
client: MigrationClient, client: MigrationClient,
logger: ModelLogger, logger: ModelLogger,
@ -583,15 +578,17 @@ export const taskOperation: MigrateOperation = {
) )
} }
} }
},
{
state: 'removeDeprecatedSpace',
func: async (client: MigrationClient) => {
await migrateSpace(client, task.space.Sequence, core.space.Workspace, [DOMAIN_KANBAN])
}
} }
]) ])
}, },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {
await tryUpgrade(state, client, taskId, [ await tryUpgrade(state, client, taskId, [
{
state: 'defaults-v2',
func: createDefaults
},
{ {
state: 'u-task-001', state: 'u-task-001',
func: async (client) => { func: async (client) => {
@ -600,7 +597,7 @@ export const taskOperation: MigrateOperation = {
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: tags.icon.Tags, icon: tags.icon.Tags,
label: 'Text Label', label: 'Text Label',

View File

@ -13,31 +13,27 @@
// limitations under the License. // limitations under the License.
// //
import core, { type Ref, type Space } from '@hcengineering/core'
import { import {
createDefaultSpace, migrateSpace,
tryUpgrade, tryMigrate,
type MigrateOperation, type MigrateOperation,
type MigrationClient, type MigrationClient,
type MigrationUpgradeClient type MigrationUpgradeClient
} from '@hcengineering/model' } from '@hcengineering/model'
import { telegramId } from '@hcengineering/telegram' import { telegramId } from '@hcengineering/telegram'
import telegram from './plugin' import { DOMAIN_TELEGRAM } from '.'
export async function createSpace (client: MigrationUpgradeClient): Promise<void> {
await createDefaultSpace(client, telegram.space.Telegram, {
name: 'Telegram',
description: 'Space for all telegram messages'
})
}
export const telegramOperation: MigrateOperation = { export const telegramOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {}, async migrate (client: MigrationClient): Promise<void> {
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> { await tryMigrate(client, telegramId, [
await tryUpgrade(state, client, telegramId, [
{ {
state: 'defaults-v2', state: 'removeDeprecatedSpace',
func: createSpace func: async (client: MigrationClient) => {
await migrateSpace(client, 'telegram:space:Telegram' as Ref<Space>, core.space.Workspace, [DOMAIN_TELEGRAM])
}
} }
]) ])
} },
async upgrade (state: Map<string, Set<string>>, client: () => Promise<MigrationUpgradeClient>): Promise<void> {}
} }

View File

@ -193,7 +193,6 @@ export function createModel (builder: Builder): void {
icon: calendarPlugin.icon.Calendar, icon: calendarPlugin.icon.Calendar,
alias: timeId, alias: timeId,
hidden: false, hidden: false,
position: 'top',
modern: true, modern: true,
component: time.component.Me component: time.component.Me
}, },

View File

@ -190,7 +190,7 @@ export const timeOperation: MigrateOperation = {
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: tags.icon.Tags, icon: tags.icon.Tags,
label: 'Other', label: 'Other',

View File

@ -126,7 +126,7 @@ async function createDefaults (tx: TxOperations): Promise<void> {
await createOrUpdate( await createOrUpdate(
tx, tx,
tags.class.TagCategory, tags.class.TagCategory,
tags.space.Tags, core.space.Workspace,
{ {
icon: tags.icon.Tags, icon: tags.icon.Tags,
label: 'Other', label: 'Other',

View File

@ -159,7 +159,8 @@ export default plugin(coreId, {
DerivedTx: '' as Ref<Space>, DerivedTx: '' as Ref<Space>,
Model: '' as Ref<Space>, Model: '' as Ref<Space>,
Space: '' as Ref<TypedSpace>, Space: '' as Ref<TypedSpace>,
Configuration: '' as Ref<Space> Configuration: '' as Ref<Space>,
Workspace: '' as Ref<Space>
}, },
account: { account: {
System: '' as Ref<Account>, System: '' as Ref<Account>,

View File

@ -2,6 +2,7 @@ import core, {
Class, Class,
Client, Client,
DOMAIN_MIGRATION, DOMAIN_MIGRATION,
DOMAIN_TX,
Data, Data,
Doc, Doc,
DocumentQuery, DocumentQuery,
@ -223,3 +224,18 @@ export async function createDefaultSpace<T extends Space> (
await tx.createDoc(_class, core.space.Space, data, _id) await tx.createDoc(_class, core.space.Space, data, _id)
} }
} }
/**
* @public
*/
export async function migrateSpace (
client: MigrationClient,
from: Ref<Space>,
to: Ref<Space>,
domains: Domain[]
): Promise<void> {
for (const domain of domains) {
await client.update(domain, { space: from }, { space: to })
}
await client.update(DOMAIN_TX, { objectSpace: from }, { objectSpace: to })
}

View File

@ -1,17 +1,16 @@
import { get } from 'svelte/store'
import type { ActivityMessage, Reaction } from '@hcengineering/activity' import type { ActivityMessage, Reaction } from '@hcengineering/activity'
import core, { type Doc, type Ref, type TxOperations, getCurrentAccount, isOtherHour } from '@hcengineering/core' import core, { getCurrentAccount, isOtherHour, type Doc, type Ref, type TxOperations } from '@hcengineering/core'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import { import {
type Location,
getEventPositionElement,
closePopup,
showPopup,
EmojiPopup, EmojiPopup,
getCurrentResolvedLocation closePopup,
getCurrentResolvedLocation,
getEventPositionElement,
showPopup,
type Location
} from '@hcengineering/ui' } from '@hcengineering/ui'
import { type AttributeModel } from '@hcengineering/view' import { type AttributeModel } from '@hcengineering/view'
import preference from '@hcengineering/preference' import { get } from 'svelte/store'
import { savedMessagesStore } from './activity' import { savedMessagesStore } from './activity'
import activity from './plugin' import activity from './plugin'
@ -77,7 +76,7 @@ export async function saveForLater (message?: ActivityMessage): Promise<void> {
closePopup() closePopup()
const client = getClient() const client = getClient()
await client.createDoc(activity.class.SavedMessage, preference.space.Preference, { await client.createDoc(activity.class.SavedMessage, core.space.Workspace, {
attachedTo: message._id attachedTo: message._id
}) })
} }

View File

@ -13,57 +13,56 @@
// limitations under the License. // limitations under the License.
// //
import attachment, { type Attachment } from '@hcengineering/attachment'
import { type ObjQueryType, SortingOrder, type SortingQuery, type Markup } from '@hcengineering/core'
import { type IntlString, type Resources } from '@hcengineering/platform'
import preference from '@hcengineering/preference'
import { PDFViewer, deleteFile, getClient, uploadFile } from '@hcengineering/presentation'
import activity, { type ActivityMessage, type DocUpdateMessage } from '@hcengineering/activity' import activity, { type ActivityMessage, type DocUpdateMessage } from '@hcengineering/activity'
import attachment, { type Attachment } from '@hcengineering/attachment'
import core, { SortingOrder, type Markup, type ObjQueryType, type SortingQuery } from '@hcengineering/core'
import { type IntlString, type Resources } from '@hcengineering/platform'
import { PDFViewer, deleteFile, getClient, uploadFile } from '@hcengineering/presentation'
import AccordionEditor from './components/AccordionEditor.svelte'
import AddAttachment from './components/AddAttachment.svelte' import AddAttachment from './components/AddAttachment.svelte'
import AttachmentDocList from './components/AttachmentDocList.svelte' import AttachmentDocList from './components/AttachmentDocList.svelte'
import AttachmentDroppable from './components/AttachmentDroppable.svelte' import AttachmentDroppable from './components/AttachmentDroppable.svelte'
import AttachmentGalleryPresenter from './components/AttachmentGalleryPresenter.svelte' import AttachmentGalleryPresenter from './components/AttachmentGalleryPresenter.svelte'
import AttachmentList from './components/AttachmentList.svelte' import AttachmentList from './components/AttachmentList.svelte'
import AttachmentPresenter from './components/AttachmentPresenter.svelte' import AttachmentPresenter from './components/AttachmentPresenter.svelte'
import AttachmentPreview from './components/AttachmentPreview.svelte'
import AttachmentRefInput from './components/AttachmentRefInput.svelte' import AttachmentRefInput from './components/AttachmentRefInput.svelte'
import AttachmentStyleBoxCollabEditor from './components/AttachmentStyleBoxCollabEditor.svelte'
import AttachmentStyleBoxEditor from './components/AttachmentStyleBoxEditor.svelte'
import AttachmentStyledBox from './components/AttachmentStyledBox.svelte'
import Attachments from './components/Attachments.svelte' import Attachments from './components/Attachments.svelte'
import AttachmentsPresenter from './components/AttachmentsPresenter.svelte' import AttachmentsPresenter from './components/AttachmentsPresenter.svelte'
import FileBrowser from './components/FileBrowser.svelte'
import FileDownload from './components/icons/FileDownload.svelte'
import Photos from './components/Photos.svelte'
import AttachmentStyledBox from './components/AttachmentStyledBox.svelte'
import AttachmentStyleBoxEditor from './components/AttachmentStyleBoxEditor.svelte'
import AttachmentStyleBoxCollabEditor from './components/AttachmentStyleBoxCollabEditor.svelte'
import AccordionEditor from './components/AccordionEditor.svelte'
import IconUploadDuo from './components/icons/UploadDuo.svelte'
import IconAttachment from './components/icons/Attachment.svelte'
import AttachmentPreview from './components/AttachmentPreview.svelte'
import AttachmentsUpdatedMessage from './components/activity/AttachmentsUpdatedMessage.svelte'
import AttachmentsTooltip from './components/AttachmentsTooltip.svelte' import AttachmentsTooltip from './components/AttachmentsTooltip.svelte'
import FileBrowser from './components/FileBrowser.svelte'
import Photos from './components/Photos.svelte'
import AttachmentsUpdatedMessage from './components/activity/AttachmentsUpdatedMessage.svelte'
import IconAttachment from './components/icons/Attachment.svelte'
import FileDownload from './components/icons/FileDownload.svelte'
import IconUploadDuo from './components/icons/UploadDuo.svelte'
export * from './types' export * from './types'
export { export {
AccordionEditor,
AddAttachment, AddAttachment,
AttachmentDocList,
AttachmentDroppable, AttachmentDroppable,
AttachmentGalleryPresenter,
AttachmentList,
AttachmentPresenter,
AttachmentPreview,
AttachmentRefInput,
AttachmentStyleBoxCollabEditor,
AttachmentStyleBoxEditor,
AttachmentStyledBox,
Attachments, Attachments,
AttachmentsPresenter, AttachmentsPresenter,
AttachmentPresenter, AttachmentsTooltip,
AttachmentGalleryPresenter,
AttachmentRefInput,
AttachmentList,
AttachmentDocList,
FileDownload,
FileBrowser, FileBrowser,
AttachmentStyledBox, FileDownload,
AttachmentStyleBoxEditor,
AttachmentStyleBoxCollabEditor,
AccordionEditor,
IconUploadDuo,
IconAttachment, IconAttachment,
AttachmentPreview, IconUploadDuo
AttachmentsTooltip
} }
export enum FileBrowserSortMode { export enum FileBrowserSortMode {
@ -211,7 +210,7 @@ export const fileTypeFileBrowserFilters: TypeFilter[] = [
export async function AddAttachmentToSaved (attach: Attachment): Promise<void> { export async function AddAttachmentToSaved (attach: Attachment): Promise<void> {
const client = getClient() const client = getClient()
await client.createDoc(attachment.class.SavedAttachments, preference.space.Preference, { await client.createDoc(attachment.class.SavedAttachments, core.space.Workspace, {
attachedTo: attach._id attachedTo: attach._id
}) })
} }

View File

@ -361,7 +361,7 @@ export async function convert (
description: '', description: '',
title: vv, title: vv,
targetClass: attr.attributeOf, targetClass: attr.attributeOf,
space: tags.space.Tags, space: core.space.Workspace,
modifiedBy: document.modifiedBy, modifiedBy: document.modifiedBy,
modifiedOn: document.modifiedOn modifiedOn: document.modifiedOn
} }
@ -379,7 +379,7 @@ export async function convert (
weight: o.weight, weight: o.weight,
modifiedBy: document.modifiedBy, modifiedBy: document.modifiedBy,
modifiedOn: document.modifiedOn, modifiedOn: document.modifiedOn,
space: tags.space.Tags, space: core.space.Workspace,
bitrixId: vv bitrixId: vv
} }
newExtraSyncDocs.push(ref) newExtraSyncDocs.push(ref)

View File

@ -1,6 +1,5 @@
import board, { type Board, type CommonBoardPreference } from '@hcengineering/board' import board, { type Board, type CommonBoardPreference } from '@hcengineering/board'
import core, { getCurrentAccount, type Ref, type TxOperations } from '@hcengineering/core' import core, { getCurrentAccount, type Ref, type TxOperations } from '@hcengineering/core'
import preference from '@hcengineering/preference'
import { createQuery, getClient } from '@hcengineering/presentation' import { createQuery, getClient } from '@hcengineering/presentation'
import type { ProjectType } from '@hcengineering/task' import type { ProjectType } from '@hcengineering/task'
import { import {
@ -55,7 +54,7 @@ export const commonBoardPreference = readable<CommonBoardPreference>(undefined,
set(result[0]) set(result[0])
return return
} }
void getClient().createDoc(board.class.CommonBoardPreference, preference.space.Preference, { void getClient().createDoc(board.class.CommonBoardPreference, core.space.Workspace, {
attachedTo: board.app.Board attachedTo: board.app.Board
}) })
}) })

View File

@ -30,7 +30,7 @@ import {
import type { Asset, Metadata, Plugin, Resource } from '@hcengineering/platform' import type { Asset, Metadata, Plugin, Resource } from '@hcengineering/platform'
import { IntlString, plugin } from '@hcengineering/platform' import { IntlString, plugin } from '@hcengineering/platform'
import { TemplateField, TemplateFieldCategory } from '@hcengineering/templates' import { TemplateField, TemplateFieldCategory } from '@hcengineering/templates'
import type { AnyComponent, ColorDefinition, ResolvedLocation } from '@hcengineering/ui' import type { AnyComponent, ColorDefinition, ResolvedLocation, Location } from '@hcengineering/ui'
import { Action, FilterMode, Viewlet } from '@hcengineering/view' import { Action, FilterMode, Viewlet } from '@hcengineering/view'
/** /**

View File

@ -10,7 +10,7 @@ import {
} from '@hcengineering/core' } from '@hcengineering/core'
import type { Asset, Plugin, Resource } from '@hcengineering/platform' import type { Asset, Plugin, Resource } from '@hcengineering/platform'
import { IntlString, plugin } from '@hcengineering/platform' import { IntlString, plugin } from '@hcengineering/platform'
import type { AnyComponent, ResolvedLocation } from '@hcengineering/ui' import type { AnyComponent, ResolvedLocation, Location } from '@hcengineering/ui'
import { Action } from '@hcengineering/view' import { Action } from '@hcengineering/view'
import type { import type {

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
// //
import { import core, {
generateId, generateId,
getCurrentAccount, getCurrentAccount,
type Class, type Class,
@ -25,7 +25,6 @@ import {
} from '@hcengineering/core' } from '@hcengineering/core'
import { type Document, type Teamspace } from '@hcengineering/document' import { type Document, type Teamspace } from '@hcengineering/document'
import { type Resources } from '@hcengineering/platform' import { type Resources } from '@hcengineering/platform'
import preference from '@hcengineering/preference'
import { getClient, type ObjectSearchResult } from '@hcengineering/presentation' import { getClient, type ObjectSearchResult } from '@hcengineering/presentation'
import { showPopup } from '@hcengineering/ui' import { showPopup } from '@hcengineering/ui'
import { openDoc } from '@hcengineering/view-resources' import { openDoc } from '@hcengineering/view-resources'
@ -117,7 +116,7 @@ async function editTeamspace (teamspace: Teamspace | undefined): Promise<void> {
export async function starDocument (doc: Document): Promise<void> { export async function starDocument (doc: Document): Promise<void> {
const client = getClient() const client = getClient()
await client.createDoc(document.class.SavedDocument, preference.space.Preference, { await client.createDoc(document.class.SavedDocument, core.space.Workspace, {
attachedTo: doc._id attachedTo: doc._id
}) })
} }

View File

@ -17,7 +17,7 @@
import attachmentP, { Attachment } from '@hcengineering/attachment' import attachmentP, { Attachment } from '@hcengineering/attachment'
import { AttachmentPresenter } from '@hcengineering/attachment-resources' import { AttachmentPresenter } from '@hcengineering/attachment-resources'
import contact, { Channel, Contact, getName } from '@hcengineering/contact' import contact, { Channel, Contact, getName } from '@hcengineering/contact'
import { Data, Markup, generateId } from '@hcengineering/core' import core, { Data, Markup, generateId } from '@hcengineering/core'
import { NewMessage, SharedMessage } from '@hcengineering/gmail' import { NewMessage, SharedMessage } from '@hcengineering/gmail'
import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources' import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources'
import { getResource, setPlatformStatus, unknownError } from '@hcengineering/platform' import { getResource, setPlatformStatus, unknownError } from '@hcengineering/platform'
@ -68,7 +68,7 @@
async function sendMsg (): Promise<void> { async function sendMsg (): Promise<void> {
await client.createDoc( await client.createDoc(
plugin.class.NewMessage, plugin.class.NewMessage,
plugin.space.Gmail, core.space.Workspace,
{ {
...obj, ...obj,
content: markupToHTML(content), content: markupToHTML(content),
@ -120,7 +120,7 @@
const uuid = await uploadFile(file) const uuid = await uploadFile(file)
await client.addCollection( await client.addCollection(
attachmentP.class.Attachment, attachmentP.class.Attachment,
plugin.space.Gmail, core.space.Workspace,
objectId, objectId,
plugin.class.NewMessage, plugin.class.NewMessage,
'attachments', 'attachments',

View File

@ -17,7 +17,7 @@
import attachmentP, { Attachment } from '@hcengineering/attachment' import attachmentP, { Attachment } from '@hcengineering/attachment'
import { AttachmentPresenter } from '@hcengineering/attachment-resources' import { AttachmentPresenter } from '@hcengineering/attachment-resources'
import contact, { Channel, Contact, getName as getContactName } from '@hcengineering/contact' import contact, { Channel, Contact, getName as getContactName } from '@hcengineering/contact'
import { generateId, getCurrentAccount, Markup, Ref, toIdMap } from '@hcengineering/core' import core, { generateId, getCurrentAccount, Markup, Ref, toIdMap } from '@hcengineering/core'
import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources' import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources'
import { getResource, setPlatformStatus, unknownError } from '@hcengineering/platform' import { getResource, setPlatformStatus, unknownError } from '@hcengineering/platform'
import { createQuery, getClient } from '@hcengineering/presentation' import { createQuery, getClient } from '@hcengineering/presentation'
@ -83,7 +83,7 @@
templateProvider.set(contact.class.Contact, target) templateProvider.set(contact.class.Contact, target)
const htmlContent = markupToHTML(content) const htmlContent = markupToHTML(content)
const message = await templateProvider.fillTemplate(htmlContent) const message = await templateProvider.fillTemplate(htmlContent)
const id = await client.createDoc(plugin.class.NewMessage, plugin.space.Gmail, { const id = await client.createDoc(plugin.class.NewMessage, core.space.Workspace, {
subject, subject,
content: message, content: message,
to: channel.value, to: channel.value,
@ -98,7 +98,7 @@
for (const attachment of attachments) { for (const attachment of attachments) {
await client.addCollection( await client.addCollection(
attachmentP.class.Attachment, attachmentP.class.Attachment,
plugin.space.Gmail, core.space.Workspace,
id, id,
plugin.class.NewMessage, plugin.class.NewMessage,
'attachments', 'attachments',
@ -145,7 +145,7 @@
const uuid = await uploadFile(file) const uuid = await uploadFile(file)
await client.addCollection( await client.addCollection(
attachmentP.class.Attachment, attachmentP.class.Attachment,
plugin.space.Gmail, core.space.Workspace,
attachmentParentId, attachmentParentId,
plugin.class.NewMessage, plugin.class.NewMessage,
'attachments', 'attachments',

View File

@ -14,10 +14,10 @@
// //
import { ChannelItem } from '@hcengineering/contact' import { ChannelItem } from '@hcengineering/contact'
import type { Account, AttachedDoc, Class, Doc, Ref, Space, Timestamp } from '@hcengineering/core' import type { Account, AttachedDoc, Class, Doc, Ref, Timestamp } from '@hcengineering/core'
import { NotificationType } from '@hcengineering/notification'
import type { IntlString, Plugin } from '@hcengineering/platform' import type { IntlString, Plugin } from '@hcengineering/platform'
import { Metadata, plugin } from '@hcengineering/platform' import { Metadata, plugin } from '@hcengineering/platform'
import { NotificationType } from '@hcengineering/notification'
import type { Handler, IntegrationType } from '@hcengineering/setting' import type { Handler, IntegrationType } from '@hcengineering/setting'
import type { AnyComponent } from '@hcengineering/ui' import type { AnyComponent } from '@hcengineering/ui'
@ -106,10 +106,6 @@ export default plugin(gmailId, {
ids: { ids: {
EmailNotification: '' as Ref<NotificationType> EmailNotification: '' as Ref<NotificationType>
}, },
space: {
// todo remove, should be in contact
Gmail: '' as Ref<Space>
},
metadata: { metadata: {
GmailURL: '' as Metadata<string> GmailURL: '' as Metadata<string>
} }

View File

@ -1,4 +1,4 @@
import { Class, Doc, Ref, Space } from '@hcengineering/core' import { Class, Doc, Ref } from '@hcengineering/core'
import type { Asset, Plugin } from '@hcengineering/platform' import type { Asset, Plugin } from '@hcengineering/platform'
import { plugin } from '@hcengineering/platform' import { plugin } from '@hcengineering/platform'
import { AnyComponent, Location } from '@hcengineering/ui' import { AnyComponent, Location } from '@hcengineering/ui'
@ -30,9 +30,6 @@ export default plugin(guestId, {
icon: { icon: {
Link: '' as Asset Link: '' as Asset
}, },
space: {
Links: '' as Ref<Space>
},
component: { component: {
GuestApp: '' as AnyComponent GuestApp: '' as AnyComponent
} }

View File

@ -2,7 +2,7 @@
// Copyright © 2024 Hardcore Engineering Inc. // Copyright © 2024 Hardcore Engineering Inc.
// //
import { Doc, TxOperations } from '@hcengineering/core' import core, { Doc, TxOperations } from '@hcengineering/core'
import { type Location } from '@hcengineering/ui' import { type Location } from '@hcengineering/ui'
import guest from './index' import guest from './index'
@ -13,7 +13,7 @@ export async function createPublicLink (
location: Location, location: Location,
revokable: boolean = true revokable: boolean = true
): Promise<void> { ): Promise<void> {
await client.createDoc(guest.class.PublicLink, guest.space.Links, { await client.createDoc(guest.class.PublicLink, core.space.Workspace, {
attachedTo: object._id, attachedTo: object._id,
location, location,
revokable, revokable,

View File

@ -15,7 +15,7 @@
<script lang="ts"> <script lang="ts">
import { Employee } from '@hcengineering/contact' import { Employee } from '@hcengineering/contact'
import { EmployeeBox } from '@hcengineering/contact-resources' import { EmployeeBox } from '@hcengineering/contact-resources'
import { Ref } from '@hcengineering/core' import core, { Ref } from '@hcengineering/core'
import { Card, getClient } from '@hcengineering/presentation' import { Card, getClient } from '@hcengineering/presentation'
import { Button, EditBox, FocusHandler, createFocusManager } from '@hcengineering/ui' import { Button, EditBox, FocusHandler, createFocusManager } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
@ -36,7 +36,7 @@
const client = getClient() const client = getClient()
async function createDepartment () { async function createDepartment () {
const id = await client.createDoc(hr.class.Department, hr.space.HR, { const id = await client.createDoc(hr.class.Department, core.space.Workspace, {
name, name,
description: '', description: '',
parent, parent,

View File

@ -75,7 +75,7 @@
if (date === undefined) return if (date === undefined) return
if (type === undefined) return if (type === undefined) return
if (employee === null) return if (employee === null) return
await client.addCollection(hr.class.Request, hr.space.HR, employee, staff._class, 'requests', { await client.addCollection(hr.class.Request, core.space.Workspace, employee, staff._class, 'requests', {
type: type._id, type: type._id,
tzDate: timeToTzDate(date), tzDate: timeToTzDate(date),
tzDueDate: timeToTzDate(dueDate), tzDueDate: timeToTzDate(dueDate),
@ -146,7 +146,7 @@
bind:this={descriptionBox} bind:this={descriptionBox}
{objectId} {objectId}
_class={hr.class.Request} _class={hr.class.Request}
space={hr.space.HR} space={core.space.Workspace}
alwaysEdit alwaysEdit
showButtons={false} showButtons={false}
maxHeight={'card'} maxHeight={'card'}

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { Data, Ref, Timestamp } from '@hcengineering/core' import core, { Data, Ref, Timestamp } from '@hcengineering/core'
import { Department, PublicHoliday, timeToTzDate } from '@hcengineering/hr' import { Department, PublicHoliday, timeToTzDate } from '@hcengineering/hr'
import presentation, { Card, getClient } from '@hcengineering/presentation' import presentation, { Card, getClient } from '@hcengineering/presentation'
import { Button, DateRangePresenter, EditBox, Label } from '@hcengineering/ui' import { Button, DateRangePresenter, EditBox, Label } from '@hcengineering/ui'
@ -40,7 +40,7 @@
async function saveHoliday () { async function saveHoliday () {
if (existingHoliday !== undefined) { if (existingHoliday !== undefined) {
await client.updateDoc(hr.class.PublicHoliday, hr.space.HR, existingHoliday._id, { await client.updateDoc(hr.class.PublicHoliday, core.space.Workspace, existingHoliday._id, {
title, title,
description description
}) })
@ -51,7 +51,7 @@
date: timeToTzDate(date), date: timeToTzDate(date),
department department
} }
await client.createDoc(hr.class.PublicHoliday, hr.space.HR, holiday) await client.createDoc(hr.class.PublicHoliday, core.space.Workspace, holiday)
} }
} }
findHoliday() findHoliday()

View File

@ -14,7 +14,7 @@
// //
import type { Contact, Employee, PersonAccount } from '@hcengineering/contact' import type { Contact, Employee, PersonAccount } from '@hcengineering/contact'
import type { Arr, AttachedDoc, Class, Doc, Markup, Mixin, Ref, Space, Type } from '@hcengineering/core' import type { Arr, AttachedDoc, Class, Doc, Markup, Mixin, Ref, Type } from '@hcengineering/core'
import { NotificationType } from '@hcengineering/notification' import { NotificationType } from '@hcengineering/notification'
import type { Asset, IntlString, Plugin } from '@hcengineering/platform' import type { Asset, IntlString, Plugin } from '@hcengineering/platform'
import { plugin } from '@hcengineering/platform' import { plugin } from '@hcengineering/platform'
@ -123,9 +123,6 @@ const hr = plugin(hrId, {
mixin: { mixin: {
Staff: '' as Ref<Mixin<Staff>> Staff: '' as Ref<Mixin<Staff>>
}, },
space: {
HR: '' as Ref<Space>
},
icon: { icon: {
HR: '' as Asset, HR: '' as Asset,
Department: '' as Asset, Department: '' as Asset,

View File

@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { DocumentQuery } from '@hcengineering/core' import core, { DocumentQuery } from '@hcengineering/core'
import { Button, Label, Scroller, SearchEdit, showPopup, IconAdd } from '@hcengineering/ui' import { Button, Label, Scroller, SearchEdit, showPopup, IconAdd } from '@hcengineering/ui'
import type { Category } from '@hcengineering/inventory' import type { Category } from '@hcengineering/inventory'
import inventory from '../plugin' import inventory from '../plugin'
@ -30,7 +30,7 @@
} }
function showCreateDialog () { function showCreateDialog () {
showPopup(CreateCategory, { space: inventory.space.Category }, 'top') showPopup(CreateCategory, { space: core.space.Workspace }, 'top')
} }
// $: twoRows = $deviceInfo.twoRows // $: twoRows = $deviceInfo.twoRows

View File

@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { AttachedData, AttachedDoc, Doc, Ref, generateId } from '@hcengineering/core' import core, { AttachedData, AttachedDoc, Doc, Ref, generateId } from '@hcengineering/core'
import { OK, Status } from '@hcengineering/platform' import { OK, Status } from '@hcengineering/platform'
import { Card, getClient } from '@hcengineering/presentation' import { Card, getClient } from '@hcengineering/presentation'
import type { Category } from '@hcengineering/inventory' import type { Category } from '@hcengineering/inventory'
@ -43,7 +43,7 @@
await client.addCollection( await client.addCollection(
inventory.class.Category, inventory.class.Category,
inventory.space.Category, core.space.Workspace,
attachedTo, attachedTo,
inventory.class.Category, inventory.class.Category,
'categories', 'categories',

View File

@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { Account, Doc, generateId, Ref } from '@hcengineering/core' import core, { Account, Doc, generateId, Ref } from '@hcengineering/core'
import { Category, Product } from '@hcengineering/inventory' import { Category, Product } from '@hcengineering/inventory'
import { Card, createQuery, getClient } from '@hcengineering/presentation' import { Card, createQuery, getClient } from '@hcengineering/presentation'
import { Button, DropdownLabels, DropdownTextItem, EditBox } from '@hcengineering/ui' import { Button, DropdownLabels, DropdownTextItem, EditBox } from '@hcengineering/ui'
@ -26,7 +26,7 @@
attachedTo: '' as Ref<Doc>, attachedTo: '' as Ref<Doc>,
attachedToClass: inventory.class.Category, attachedToClass: inventory.class.Category,
_class: inventory.class.Product, _class: inventory.class.Product,
space: inventory.space.Products, space: core.space.Workspace,
_id: generateId(), _id: generateId(),
collection: 'products', collection: 'products',
modifiedOn: Date.now(), modifiedOn: Date.now(),

View File

@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { Account, generateId, Ref } from '@hcengineering/core' import core, { Account, generateId, Ref } from '@hcengineering/core'
import { Card, getClient } from '@hcengineering/presentation' import { Card, getClient } from '@hcengineering/presentation'
import { EditBox, Grid } from '@hcengineering/ui' import { EditBox, Grid } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
@ -29,7 +29,7 @@
attachedTo: product, attachedTo: product,
attachedToClass: inventory.class.Product, attachedToClass: inventory.class.Product,
_class: inventory.class.Variant, _class: inventory.class.Variant,
space: inventory.space.Products, space: core.space.Workspace,
_id: generateId(), _id: generateId(),
collection: 'variants', collection: 'variants',
modifiedOn: Date.now(), modifiedOn: Date.now(),

View File

@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
// //
import { AttachedDoc, Class, Doc, Ref, Space } from '@hcengineering/core' import { AttachedDoc, Class, Doc, Ref } from '@hcengineering/core'
import type { Asset, Plugin } from '@hcengineering/platform' import type { Asset, Plugin } from '@hcengineering/platform'
import { plugin } from '@hcengineering/platform' import { plugin } from '@hcengineering/platform'
@ -67,10 +67,6 @@ const inventory = plugin(inventoryId, {
// Global category root, if not attached to some other object. // Global category root, if not attached to some other object.
Category: '' as Ref<Category> Category: '' as Ref<Category>
}, },
space: {
Category: '' as Ref<Space>,
Products: '' as Ref<Space>
},
app: { app: {
Inventory: '' as Ref<Doc> Inventory: '' as Ref<Doc>
} }

View File

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { Class, Data, Ref } from '@hcengineering/core' import core, { Class, Data, Ref } from '@hcengineering/core'
import { translate } from '@hcengineering/platform' import { translate } from '@hcengineering/platform'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import { Button, DropdownIntlItem } from '@hcengineering/ui' import { Button, DropdownIntlItem } from '@hcengineering/ui'
@ -64,7 +64,7 @@
if (val._class === love.class.Office) { if (val._class === love.class.Office) {
;(data as Data<Office>).person = null ;(data as Data<Office>).person = null
} }
await client.createDoc(val._class, love.space.Rooms, data) await client.createDoc(val._class, core.space.Workspace, data)
dispatch('close') dispatch('close')
} }
</script> </script>

View File

@ -3,7 +3,7 @@
import { EditBox } from '@hcengineering/ui' import { EditBox } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
import love from '../plugin' import love from '../plugin'
import { Ref } from '@hcengineering/core' import core, { Ref } from '@hcengineering/core'
import { Floor } from '@hcengineering/love' import { Floor } from '@hcengineering/love'
export let id: Ref<Floor> | undefined = undefined export let id: Ref<Floor> | undefined = undefined
@ -20,11 +20,11 @@
} }
async function createFloor (): Promise<void> { async function createFloor (): Promise<void> {
await client.createDoc(love.class.Floor, love.space.Rooms, { name }) await client.createDoc(love.class.Floor, core.space.Workspace, { name })
} }
async function updateFloor (): Promise<void> { async function updateFloor (): Promise<void> {
if (id === undefined) return if (id === undefined) return
await client.updateDoc(love.class.Floor, love.space.Rooms, id, { name }) await client.updateDoc(love.class.Floor, core.space.Workspace, id, { name })
} }
</script> </script>

View File

@ -1,6 +1,6 @@
import { Analytics } from '@hcengineering/analytics' import { Analytics } from '@hcengineering/analytics'
import contact, { getName, type Person, type PersonAccount } from '@hcengineering/contact' import contact, { getName, type Person, type PersonAccount } from '@hcengineering/contact'
import { concatLink, getCurrentAccount, type IdMap, type Ref, type Space } from '@hcengineering/core' import core, { concatLink, getCurrentAccount, type IdMap, type Ref, type Space } from '@hcengineering/core'
import { getEmbeddedLabel, getMetadata, type IntlString } from '@hcengineering/platform' import { getEmbeddedLabel, getMetadata, type IntlString } from '@hcengineering/platform'
import presentation, { createQuery, getClient } from '@hcengineering/presentation' import presentation, { createQuery, getClient } from '@hcengineering/presentation'
import { getCurrentLocation, navigate, type DropdownTextItem } from '@hcengineering/ui' import { getCurrentLocation, navigate, type DropdownTextItem } from '@hcengineering/ui'
@ -483,7 +483,7 @@ async function moveToRoom (
room: room._id room: room._id
}) })
} else { } else {
await client.createDoc(love.class.ParticipantInfo, love.space.Rooms, { await client.createDoc(love.class.ParticipantInfo, core.space.Workspace, {
x, x,
y, y,
room: room._id, room: room._id,
@ -606,7 +606,7 @@ export async function tryConnect (
await client.update(invite, { status: invite.room === room._id ? RequestStatus.Approved : RequestStatus.Rejected }) await client.update(invite, { status: invite.room === room._id ? RequestStatus.Approved : RequestStatus.Rejected })
} }
if (room.access === RoomAccess.Knock && (!isOffice(room) || room.person !== currentPerson._id)) { if (room.access === RoomAccess.Knock && (!isOffice(room) || room.person !== currentPerson._id)) {
const _id = await client.createDoc(love.class.JoinRequest, love.space.Rooms, { const _id = await client.createDoc(love.class.JoinRequest, core.space.Workspace, {
person: currentPerson._id, person: currentPerson._id,
room: room._id, room: room._id,
status: RequestStatus.Pending status: RequestStatus.Pending
@ -630,7 +630,7 @@ export async function invite (person: Ref<Person>, room: Ref<Room> | undefined):
if (room === undefined || room === love.ids.Reception) return if (room === undefined || room === love.ids.Reception) return
const client = getClient() const client = getClient()
const me = getCurrentAccount() const me = getCurrentAccount()
await client.createDoc(love.class.Invite, love.space.Rooms, { await client.createDoc(love.class.Invite, core.space.Workspace, {
target: person, target: person,
room, room,
status: RequestStatus.Pending, status: RequestStatus.Pending,

View File

@ -1,5 +1,5 @@
import { Person } from '@hcengineering/contact' import { Person } from '@hcengineering/contact'
import { Class, Doc, Ref, Space } from '@hcengineering/core' import { Class, Doc, Ref } from '@hcengineering/core'
import { Drive } from '@hcengineering/drive' import { Drive } from '@hcengineering/drive'
import { NotificationType } from '@hcengineering/notification' import { NotificationType } from '@hcengineering/notification'
import { Asset, IntlString, Metadata, Plugin, plugin } from '@hcengineering/platform' import { Asset, IntlString, Metadata, Plugin, plugin } from '@hcengineering/platform'
@ -145,7 +145,6 @@ const love = plugin(loveId, {
ServiceEnpdoint: '' as Metadata<string> ServiceEnpdoint: '' as Metadata<string>
}, },
space: { space: {
Rooms: '' as Ref<Space>,
Drive: '' as Ref<Drive> Drive: '' as Ref<Drive>
}, },
component: { component: {

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { IdMap, Ref, toIdMap } from '@hcengineering/core' import core, { IdMap, Ref, toIdMap } from '@hcengineering/core'
import type { import type {
BaseNotificationType, BaseNotificationType,
NotificationGroup, NotificationGroup,
@ -25,7 +25,6 @@
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import { Grid, Label, ToggleWithLabel } from '@hcengineering/ui' import { Grid, Label, ToggleWithLabel } from '@hcengineering/ui'
import notification from '../plugin' import notification from '../plugin'
import { validateHeaderName } from 'http'
export let group: Ref<NotificationGroup> export let group: Ref<NotificationGroup>
export let settings: Map<Ref<BaseNotificationType>, NotificationSetting[]> export let settings: Map<Ref<BaseNotificationType>, NotificationSetting[]>
@ -74,7 +73,7 @@
} }
const current = getSetting(settings, typeId, providerId) const current = getSetting(settings, typeId, providerId)
if (current === undefined) { if (current === undefined) {
await client.createDoc(notification.class.NotificationSetting, notification.space.Notifications, { await client.createDoc(notification.class.NotificationSetting, core.space.Workspace, {
attachedTo: providerId, attachedTo: providerId,
type: typeId, type: typeId,
enabled: value enabled: value

View File

@ -25,7 +25,7 @@ import {
isReactionMessage, isReactionMessage,
messageInFocus messageInFocus
} from '@hcengineering/activity-resources' } from '@hcengineering/activity-resources'
import { import core, {
SortingOrder, SortingOrder,
getCurrentAccount, getCurrentAccount,
type Class, type Class,
@ -713,7 +713,7 @@ export async function subscribePush (): Promise<boolean> {
userVisibleOnly: true, userVisibleOnly: true,
applicationServerKey: publicKey applicationServerKey: publicKey
}) })
await client.createDoc(notification.class.PushSubscription, notification.space.Notifications, { await client.createDoc(notification.class.PushSubscription, core.space.Workspace, {
user: getCurrentAccount()._id, user: getCurrentAccount()._id,
endpoint: subscription.endpoint, endpoint: subscription.endpoint,
keys: { keys: {
@ -727,7 +727,7 @@ export async function subscribePush (): Promise<boolean> {
endpoint: current.endpoint endpoint: current.endpoint
}) })
if (exists === undefined) { if (exists === undefined) {
await client.createDoc(notification.class.PushSubscription, notification.space.Notifications, { await client.createDoc(notification.class.PushSubscription, core.space.Workspace, {
user: getCurrentAccount()._id, user: getCurrentAccount()._id,
endpoint: current.endpoint, endpoint: current.endpoint,
keys: { keys: {

View File

@ -24,7 +24,6 @@ import {
Markup, Markup,
Mixin, Mixin,
Ref, Ref,
Space,
Timestamp, Timestamp,
Tx, Tx,
TxOperations TxOperations
@ -380,9 +379,6 @@ const notification = plugin(notificationId, {
Inbox: '' as Asset, Inbox: '' as Asset,
BellCrossed: '' as Asset BellCrossed: '' as Asset
}, },
space: {
Notifications: '' as Ref<Space>
},
string: { string: {
Notification: '' as IntlString, Notification: '' as IntlString,
Notifications: '' as IntlString, Notifications: '' as IntlString,

View File

@ -49,9 +49,6 @@ const preference = plugin(preferenceId, {
Preference: '' as Ref<Class<Preference>>, Preference: '' as Ref<Class<Preference>>,
SpacePreference: '' as Ref<Class<SpacePreference>> SpacePreference: '' as Ref<Class<SpacePreference>>
}, },
space: {
Preference: '' as Ref<Space>
},
icon: { icon: {
Star: '' as Asset Star: '' as Asset
}, },

View File

@ -24,7 +24,7 @@
Person Person
} from '@hcengineering/contact' } from '@hcengineering/contact'
import { ChannelsDropdown, EditableAvatar, PersonPresenter } from '@hcengineering/contact-resources' import { ChannelsDropdown, EditableAvatar, PersonPresenter } from '@hcengineering/contact-resources'
import { import core, {
Account, Account,
AttachedData, AttachedData,
Data, Data,
@ -418,7 +418,7 @@
const category = findTagCategory(s, categories) const category = findTagCategory(s, categories)
const cinstance = categoriesMap.get(category) const cinstance = categoriesMap.get(category)
e = TxProcessor.createDoc2Doc( e = TxProcessor.createDoc2Doc(
client.txFactory.createTxCreateDoc(tags.class.TagElement, tags.space.Tags, { client.txFactory.createTxCreateDoc(tags.class.TagElement, core.space.Workspace, {
title, title,
description: `Imported skill ${s} of ${cinstance?.label ?? ''}`, description: `Imported skill ${s} of ${cinstance?.label ?? ''}`,
color: getColorNumberByText(s), color: getColorNumberByText(s),
@ -433,7 +433,7 @@
if (e !== undefined) { if (e !== undefined) {
newSkills.push( newSkills.push(
TxProcessor.createDoc2Doc( TxProcessor.createDoc2Doc(
client.txFactory.createTxCreateDoc(tags.class.TagReference, tags.space.Tags, { client.txFactory.createTxCreateDoc(tags.class.TagReference, core.space.Workspace, {
title: e.title, title: e.title,
color: e.color, color: e.color,
tag: e._id, tag: e._id,
@ -507,7 +507,7 @@
attachedTo: '' as Ref<Doc>, attachedTo: '' as Ref<Doc>,
attachedToClass: recruit.mixin.Candidate, attachedToClass: recruit.mixin.Candidate,
collection: 'skills', collection: 'skills',
space: tags.space.Tags, space: core.space.Workspace,
modifiedOn: 0, modifiedOn: 0,
modifiedBy: '' as Ref<Account>, modifiedBy: '' as Ref<Account>,
title: tag.title, title: tag.title,

View File

@ -16,7 +16,7 @@
import calendar from '@hcengineering/calendar' import calendar from '@hcengineering/calendar'
import type { Contact, PersonAccount, Organization, Person } from '@hcengineering/contact' import type { Contact, PersonAccount, Organization, Person } from '@hcengineering/contact'
import contact from '@hcengineering/contact' import contact from '@hcengineering/contact'
import { import core, {
Account, Account,
Class, Class,
Client, Client,
@ -68,7 +68,7 @@
attachedTo: candidate, attachedTo: candidate,
attachedToClass: recruit.mixin.Candidate, attachedToClass: recruit.mixin.Candidate,
_class: recruit.class.Review, _class: recruit.class.Review,
space: recruit.space.Reviews, space: core.space.Workspace,
_id: generateId(), _id: generateId(),
collection: 'reviews', collection: 'reviews',
modifiedOn: Date.now(), modifiedOn: Date.now(),
@ -129,7 +129,8 @@
location, location,
access: 'reader', access: 'reader',
allDay: false, allDay: false,
eventId: '' eventId: '',
calendar: undefined
}) })
} }

View File

@ -13,11 +13,11 @@
// limitations under the License. // limitations under the License.
// //
import type { Attribute, Class, Doc, Mixin, Ref, Space, Status } from '@hcengineering/core' import type { Attribute, Class, Doc, Mixin, Ref, Status } from '@hcengineering/core'
import type { Asset, IntlString, Plugin, Resource } from '@hcengineering/platform' import type { Asset, IntlString, Plugin, Resource } from '@hcengineering/platform'
import { plugin } from '@hcengineering/platform' import { plugin } from '@hcengineering/platform'
import type { ProjectTypeDescriptor, TaskType } from '@hcengineering/task' import type { ProjectTypeDescriptor, TaskType } from '@hcengineering/task'
import { AnyComponent, ResolvedLocation } from '@hcengineering/ui' import { AnyComponent, Location, ResolvedLocation } from '@hcengineering/ui'
import type { Applicant, ApplicantMatch, Candidate, Opinion, Review, Vacancy, VacancyList } from './types' import type { Applicant, ApplicantMatch, Candidate, Opinion, Review, Vacancy, VacancyList } from './types'
export * from './types' export * from './types'
@ -84,9 +84,6 @@ const recruit = plugin(recruitId, {
resolver: { resolver: {
Location: '' as Resource<(loc: Location) => Promise<ResolvedLocation | undefined>> Location: '' as Resource<(loc: Location) => Promise<ResolvedLocation | undefined>>
}, },
space: {
Reviews: '' as Ref<Space>
},
taskTypes: { taskTypes: {
Applicant: '' as Ref<TaskType> Applicant: '' as Ref<TaskType>
} }

View File

@ -13,10 +13,11 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import core from '@hcengineering/core'
import login from '@hcengineering/login' import login from '@hcengineering/login'
import presentation, { createQuery, getClient } from '@hcengineering/presentation' import presentation, { createQuery, getClient } from '@hcengineering/presentation'
import setting, { InviteSettings } from '@hcengineering/setting' import setting, { InviteSettings } from '@hcengineering/setting'
import { Button, EditBox, MiniToggle, Header, Breadcrumb } from '@hcengineering/ui' import { Breadcrumb, Button, EditBox, Header, MiniToggle } from '@hcengineering/ui'
const client = getClient() const client = getClient()
let expTime: number = 48 let expTime: number = 48
@ -43,11 +44,11 @@
enabled: true enabled: true
} }
if (existingInviteSettings.length === 0) { if (existingInviteSettings.length === 0) {
await client.createDoc(setting.class.InviteSettings, setting.space.Setting, newSettings) await client.createDoc(setting.class.InviteSettings, core.space.Workspace, newSettings)
} else { } else {
await client.updateDoc( await client.updateDoc(
setting.class.InviteSettings, setting.class.InviteSettings,
setting.space.Setting, core.space.Workspace,
existingInviteSettings[0]._id, existingInviteSettings[0]._id,
newSettings newSettings
) )

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { getCurrentAccount } from '@hcengineering/core' import core, { getCurrentAccount } from '@hcengineering/core'
import { getResource, translate } from '@hcengineering/platform' import { getResource, translate } from '@hcengineering/platform'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import type { Integration, IntegrationType } from '@hcengineering/setting' import type { Integration, IntegrationType } from '@hcengineering/setting'
@ -62,7 +62,7 @@
return return
} }
if (integration === undefined) { if (integration === undefined) {
const id = await client.createDoc(setting.class.Integration, setting.space.Setting, { const id = await client.createDoc(setting.class.Integration, core.space.Workspace, {
type: integrationType._id, type: integrationType._id,
value: '', value: '',
disabled: false disabled: false

View File

@ -15,6 +15,7 @@
<script lang="ts"> <script lang="ts">
import { AvatarType } from '@hcengineering/contact' import { AvatarType } from '@hcengineering/contact'
import { EditableAvatar } from '@hcengineering/contact-resources' import { EditableAvatar } from '@hcengineering/contact-resources'
import core from '@hcengineering/core'
import { getEmbeddedLabel } from '@hcengineering/platform' import { getEmbeddedLabel } from '@hcengineering/platform'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import { WorkspaceSetting } from '@hcengineering/setting' import { WorkspaceSetting } from '@hcengineering/setting'
@ -35,7 +36,7 @@
const avatar = await avatarEditor.createAvatar() const avatar = await avatarEditor.createAvatar()
await client.createDoc( await client.createDoc(
setting.class.WorkspaceSetting, setting.class.WorkspaceSetting,
setting.space.Setting, core.space.Workspace,
{ icon: avatar.avatar }, { icon: avatar.avatar },
setting.ids.WorkspaceSetting setting.ids.WorkspaceSetting
) )

View File

@ -13,13 +13,13 @@
// limitations under the License. // limitations under the License.
// //
import type { Account, AccountRole, Blob, Class, Configuration, Doc, Mixin, Ref, Space } from '@hcengineering/core' import type { Account, AccountRole, Blob, Class, Configuration, Doc, Mixin, Ref } from '@hcengineering/core'
import type { Plugin } from '@hcengineering/platform' import type { Plugin } from '@hcengineering/platform'
import { Asset, IntlString, plugin, Resource } from '@hcengineering/platform' import { Asset, IntlString, Resource, plugin } from '@hcengineering/platform'
import { TemplateField, TemplateFieldCategory } from '@hcengineering/templates'
import { AnyComponent } from '@hcengineering/ui' import { AnyComponent } from '@hcengineering/ui'
import { TemplateFieldCategory, TemplateField } from '@hcengineering/templates'
import { SpaceTypeEditor, SpaceTypeCreator } from './spaceTypeEditor' import { SpaceTypeCreator, SpaceTypeEditor } from './spaceTypeEditor'
export * from './spaceTypeEditor' export * from './spaceTypeEditor'
export * from './utils' export * from './utils'
@ -137,9 +137,6 @@ export default plugin(settingId, {
SpaceTypeEditor: '' as Ref<Mixin<SpaceTypeEditor>>, SpaceTypeEditor: '' as Ref<Mixin<SpaceTypeEditor>>,
SpaceTypeCreator: '' as Ref<Mixin<SpaceTypeCreator>> SpaceTypeCreator: '' as Ref<Mixin<SpaceTypeCreator>>
}, },
space: {
Setting: '' as Ref<Space>
},
class: { class: {
SettingsCategory: '' as Ref<Class<SettingsCategory>>, SettingsCategory: '' as Ref<Class<SettingsCategory>>,
WorkspaceSettingCategory: '' as Ref<Class<SettingsCategory>>, WorkspaceSettingCategory: '' as Ref<Class<SettingsCategory>>,

View File

@ -1,6 +1,13 @@
// Copyright © 2022 Hardcore Engineering Inc. // Copyright © 2022 Hardcore Engineering Inc.
import { type Class, type Data, type Doc, type DocumentQuery, type FindResult, type Ref } from '@hcengineering/core' import core, {
type Class,
type Data,
type Doc,
type DocumentQuery,
type FindResult,
type Ref
} from '@hcengineering/core'
import { type Asset } from '@hcengineering/platform' import { type Asset } from '@hcengineering/platform'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
import { type InitialKnowledge, type TagCategory, type TagElement, type TagReference } from '@hcengineering/tags' import { type InitialKnowledge, type TagCategory, type TagElement, type TagReference } from '@hcengineering/tags'
@ -81,5 +88,5 @@ export async function createTagElement (
} }
const client = getClient() const client = getClient()
return await client.createDoc<TagElement>(tags.class.TagElement, tags.space.Tags, tagElement) return await client.createDoc<TagElement>(tags.class.TagElement, core.space.Workspace, tagElement)
} }

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
// //
import type { AttachedDoc, Class, Doc, Ref, Space } from '@hcengineering/core' import type { AttachedDoc, Class, Doc, Ref } from '@hcengineering/core'
import type { Asset, IntlString, Plugin } from '@hcengineering/platform' import type { Asset, IntlString, Plugin } from '@hcengineering/platform'
import { plugin } from '@hcengineering/platform' import { plugin } from '@hcengineering/platform'
import { AnyComponent } from '@hcengineering/ui' import { AnyComponent } from '@hcengineering/ui'
@ -89,9 +89,6 @@ const tagsPlugin = plugin(tagsId, {
TagReference: '' as Ref<Class<TagReference>>, TagReference: '' as Ref<Class<TagReference>>,
TagCategory: '' as Ref<Class<TagCategory>> TagCategory: '' as Ref<Class<TagCategory>>
}, },
space: {
Tags: '' as Ref<Space>
},
icon: { icon: {
Tags: '' as Asset, Tags: '' as Asset,
Level1: '' as Asset, Level1: '' as Asset,

View File

@ -18,7 +18,7 @@
import { AttachmentRefInput } from '@hcengineering/attachment-resources' import { AttachmentRefInput } from '@hcengineering/attachment-resources'
import contact, { Channel, Contact, Person, PersonAccount, getName as getContactName } from '@hcengineering/contact' import contact, { Channel, Contact, Person, PersonAccount, getName as getContactName } from '@hcengineering/contact'
import { Avatar, personAccountByIdStore, personByIdStore } from '@hcengineering/contact-resources' import { Avatar, personAccountByIdStore, personByIdStore } from '@hcengineering/contact-resources'
import { IdMap, Ref, SortingOrder, generateId, getCurrentAccount } from '@hcengineering/core' import core, { IdMap, Ref, SortingOrder, generateId, getCurrentAccount } from '@hcengineering/core'
import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources' import { InboxNotificationsClientImpl } from '@hcengineering/notification-resources'
import { getEmbeddedLabel, getResource } from '@hcengineering/platform' import { getEmbeddedLabel, getResource } from '@hcengineering/platform'
import { createQuery, getClient } from '@hcengineering/presentation' import { createQuery, getClient } from '@hcengineering/presentation'
@ -117,7 +117,7 @@
const { message, attachments } = event.detail const { message, attachments } = event.detail
await client.addCollection( await client.addCollection(
telegram.class.NewMessage, telegram.class.NewMessage,
telegram.space.Telegram, core.space.Workspace,
channel._id, channel._id,
channel._class, channel._class,
'newMessages', 'newMessages',
@ -173,7 +173,7 @@
async function onConnectClose (res: any): Promise<void> { async function onConnectClose (res: any): Promise<void> {
if (res?.value) { if (res?.value) {
await client.createDoc(setting.class.Integration, setting.space.Setting, { await client.createDoc(setting.class.Integration, core.space.Workspace, {
type: telegram.integrationType.Telegram, type: telegram.integrationType.Telegram,
value: res.value, value: res.value,
disabled: false disabled: false
@ -295,7 +295,7 @@
</div> </div>
{:else if integration !== undefined && !integration.disabled} {:else if integration !== undefined && !integration.disabled}
<AttachmentRefInput <AttachmentRefInput
space={telegram.space.Telegram} space={core.space.Workspace}
_class={telegram.class.NewMessage} _class={telegram.class.NewMessage}
{objectId} {objectId}
on:message={onMessage} on:message={onMessage}

View File

@ -14,7 +14,7 @@
// //
import { ChannelItem } from '@hcengineering/contact' import { ChannelItem } from '@hcengineering/contact'
import type { AttachedDoc, Class, Doc, Ref, Space, Timestamp } from '@hcengineering/core' import type { AttachedDoc, Class, Doc, Ref, Timestamp } from '@hcengineering/core'
import { NotificationType } from '@hcengineering/notification' import { NotificationType } from '@hcengineering/notification'
import type { Plugin } from '@hcengineering/platform' import type { Plugin } from '@hcengineering/platform'
import { Metadata, plugin } from '@hcengineering/platform' import { Metadata, plugin } from '@hcengineering/platform'
@ -86,10 +86,6 @@ export default plugin(telegramId, {
SharedMessage: '' as Ref<Class<SharedTelegramMessage>>, SharedMessage: '' as Ref<Class<SharedTelegramMessage>>,
SharedMessages: '' as Ref<Class<SharedTelegramMessages>> SharedMessages: '' as Ref<Class<SharedTelegramMessages>>
}, },
space: {
// todo should be removed
Telegram: '' as Ref<Space>
},
templateField: { templateField: {
CurrentEmployeeTelegram: '' as Ref<TemplateField>, CurrentEmployeeTelegram: '' as Ref<TemplateField>,
IntegrationOwnerTG: '' as Ref<TemplateField> IntegrationOwnerTG: '' as Ref<TemplateField>

View File

@ -267,7 +267,7 @@
attachedTo: '' as Ref<Doc>, attachedTo: '' as Ref<Doc>,
attachedToClass: tracker.class.Issue, attachedToClass: tracker.class.Issue,
collection: 'labels', collection: 'labels',
space: tags.space.Tags, space: core.space.Workspace,
modifiedOn: 0, modifiedOn: 0,
modifiedBy: '' as Ref<Account>, modifiedBy: '' as Ref<Account>,
title: tag.title, title: tag.title,

View File

@ -1,91 +0,0 @@
<!--
// Copyright © 2022 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.
-->
<script lang="ts">
import ui, { Label, Icon } from '@hcengineering/ui'
import { createEventDispatcher, onMount } from 'svelte'
import { FilterAction } from '../utils'
export let actions: FilterAction[] = []
const dispatch = createEventDispatcher()
const actionElements: HTMLButtonElement[] = []
const keyDown = (event: KeyboardEvent, index: number) => {
if (event.key === 'ArrowDown') {
actionElements[(index + 1) % actionElements.length].focus()
}
if (event.key === 'ArrowUp') {
actionElements[(actionElements.length + index - 1) % actionElements.length].focus()
}
}
onMount(() => {
actionElements[0]?.focus()
})
</script>
<div class="antiPopup">
<div class="ap-space" />
<div class="ap-scroll">
<div class="ap-box">
{#if actions.length === 0}
<div class="p-6 error-color">
<Label label={ui.string.NoActionsDefined} />
</div>
{/if}
{#each actions as action, i}
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<button
bind:this={actionElements[i]}
class="ap-menuItem flex-row-center withIcon"
on:keydown={(event) => {
keyDown(event, i)
}}
on:mouseover={(event) => {
event.currentTarget.focus()
}}
on:click={(event) => {
dispatch('close')
action.onSelect(event)
}}
>
{#if action.icon}
<div class="icon"><Icon icon={action.icon} size={'small'} /></div>
{/if}
{#if action.label}
<div class="ml-3 pr-1"><Label label={action.label} /></div>
{/if}
</button>
{/each}
</div>
</div>
<div class="ap-space" />
</div>
<style lang="scss">
.withIcon {
margin: 0;
.icon {
color: var(--content-color);
}
&:focus .icon {
color: var(--accent-color);
}
}
</style>

View File

@ -1,137 +0,0 @@
<!--
// Copyright © 2022 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.
-->
<script lang="ts">
import ui, { Label, Icon, CheckBox } from '@hcengineering/ui'
import { createEventDispatcher, onMount } from 'svelte'
import { FilterSectionElement } from '../utils'
export let actions: FilterSectionElement[] = []
export let onBack: (() => void) | undefined = undefined
const dispatch = createEventDispatcher()
const actionElements: HTMLButtonElement[] = []
$: selectedElementsMap = getSelectedElementsMap(actions)
const getSelectedElementsMap = (actions: FilterSectionElement[]) => {
const result: Record<number, boolean> = {}
for (let i = onBack ? 1 : 0; i < actions.length; ++i) {
result[i] = !!actions[i].isSelected
}
return result
}
const keyDown = (event: KeyboardEvent, index: number) => {
if (event.key === 'ArrowDown') {
actionElements[(index + 1) % actionElements.length].focus()
}
if (event.key === 'ArrowUp') {
actionElements[(actionElements.length + index - 1) % actionElements.length].focus()
}
if (event.key === 'ArrowLeft') {
dispatch('close')
onBack?.()
}
}
onMount(() => {
if (actionElements[0]) actionElements[0].focus()
})
</script>
<div class="antiPopup">
<div class="ap-space" />
<div class="ap-scroll">
<div class="ap-box">
{#if actions.length === 0}
<div class="p-6 error-color">
<Label label={ui.string.NoActionsDefined} />
</div>
{/if}
{#each actions as action, i}
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<button
bind:this={actionElements[i]}
class="ap-menuItem flex-row-center withIcon"
on:keydown={(event) => {
keyDown(event, i)
}}
on:mouseover={(event) => {
event.currentTarget.focus()
}}
on:click={(event) => {
if (i === 0 && onBack) {
dispatch('close')
}
action.onSelect(event)
if (i !== 0 || !onBack) {
selectedElementsMap[i] = !selectedElementsMap[i]
}
}}
>
<div class="buttonContent">
{#if i !== 0 || (i === 0 && !onBack)}
<div class="flex check pointer-events-none">
<CheckBox checked={selectedElementsMap[i]} kind={'primary'} />
</div>
{/if}
{#if action.icon}
<div class="icon" class:ml-3={i > 0 || (i === 0 && !onBack)}>
<Icon icon={action.icon} size={'small'} />
</div>
{/if}
{#if action.title}
<div class="ml-3 pr-1">{action.title}</div>
{/if}
{#if action.count !== undefined}
<div class="pr-1 countContent">{action.count}</div>
{/if}
</div>
</button>
{/each}
</div>
</div>
<div class="ap-space" />
</div>
<style lang="scss">
.buttonContent {
display: flex;
align-items: center;
}
.countContent {
color: var(--content-color);
}
.withIcon {
margin: 0;
.icon {
color: var(--content-color);
}
&:focus .icon {
color: var(--accent-color);
}
}
</style>

View File

@ -14,7 +14,7 @@
--> -->
<script lang="ts"> <script lang="ts">
import { AttachmentStyledBox } from '@hcengineering/attachment-resources' import { AttachmentStyledBox } from '@hcengineering/attachment-resources'
import { Account, Doc, generateId, Ref } from '@hcengineering/core' import core, { Account, Doc, generateId, Ref } from '@hcengineering/core'
import presentation, { DraftController, getClient, KeyedAttribute } from '@hcengineering/presentation' import presentation, { DraftController, getClient, KeyedAttribute } from '@hcengineering/presentation'
import tags, { TagElement, TagReference } from '@hcengineering/tags' import tags, { TagElement, TagReference } from '@hcengineering/tags'
import { TaskType } from '@hcengineering/task' import { TaskType } from '@hcengineering/task'
@ -135,7 +135,7 @@
attachedTo: '' as Ref<Doc>, attachedTo: '' as Ref<Doc>,
attachedToClass: tracker.class.Issue, attachedToClass: tracker.class.Issue,
collection: 'labels', collection: 'labels',
space: tags.space.Tags, space: core.space.Workspace,
modifiedOn: 0, modifiedOn: 0,
modifiedBy: '' as Ref<Account>, modifiedBy: '' as Ref<Account>,
title: tag.title, title: tag.title,

View File

@ -35,15 +35,12 @@ import core, {
type TxResult, type TxResult,
type TxUpdateDoc type TxUpdateDoc
} from '@hcengineering/core' } from '@hcengineering/core'
import { type Asset, type IntlString } from '@hcengineering/platform' import { type IntlString } from '@hcengineering/platform'
import { createQuery, getClient } from '@hcengineering/presentation' import { createQuery, getClient } from '@hcengineering/presentation'
import task, { getStatusIndex, makeRank, type ProjectType } from '@hcengineering/task' import task, { getStatusIndex, makeRank, type ProjectType } from '@hcengineering/task'
import { activeProjects as taskActiveProjects, taskTypeStore } from '@hcengineering/task-resources' import { activeProjects as taskActiveProjects, taskTypeStore } from '@hcengineering/task-resources'
import { import {
IssuePriority, IssuePriority,
IssuesDateModificationPeriod,
IssuesGrouping,
IssuesOrdering,
MilestoneStatus, MilestoneStatus,
TimeReportDayType, TimeReportDayType,
type Component, type Component,
@ -52,23 +49,9 @@ import {
type Milestone, type Milestone,
type Project type Project
} from '@hcengineering/tracker' } from '@hcengineering/tracker'
import { import { PaletteColorIndexes, areDatesEqual, isWeekend } from '@hcengineering/ui'
MILLISECONDS_IN_WEEK,
PaletteColorIndexes,
areDatesEqual,
getMillisecondsInMonth,
isWeekend,
type AnyComponent,
type AnySvelteComponent
} from '@hcengineering/ui'
import { type KeyFilter, type ViewletDescriptor } from '@hcengineering/view' import { type KeyFilter, type ViewletDescriptor } from '@hcengineering/view'
import { import { CategoryQuery, ListSelectionProvider, statusStore, type SelectDirection } from '@hcengineering/view-resources'
CategoryQuery,
ListSelectionProvider,
groupBy,
statusStore,
type SelectDirection
} from '@hcengineering/view-resources'
import { derived, get } from 'svelte/store' import { derived, get } from 'svelte/store'
import tracker from './plugin' import tracker from './plugin'
import { defaultMilestoneStatuses, defaultPriorities } from './types' import { defaultMilestoneStatuses, defaultPriorities } from './types'
@ -81,164 +64,6 @@ export const activeProjects = derived(taskActiveProjects, (projects) => {
}) })
export * from './types' export * from './types'
export const UNSET_COLOR = -1
export interface NavigationItem {
id: string
label: IntlString
icon: Asset
component: AnyComponent
componentProps?: Record<string, string>
top: boolean
}
export interface Selection {
currentProject?: Ref<Project>
currentSpecial?: string
}
export type IssuesGroupByKeys = keyof Pick<Issue, 'status' | 'priority' | 'assignee' | 'component' | 'milestone'>
export type IssuesOrderByKeys = keyof Pick<Issue, 'status' | 'priority' | 'modifiedOn' | 'dueDate' | 'rank'>
export const issuesGroupKeyMap: Record<IssuesGrouping, IssuesGroupByKeys | undefined> = {
[IssuesGrouping.Status]: 'status',
[IssuesGrouping.Priority]: 'priority',
[IssuesGrouping.Assignee]: 'assignee',
[IssuesGrouping.Component]: 'component',
[IssuesGrouping.Milestone]: 'milestone',
[IssuesGrouping.NoGrouping]: undefined
}
export const issuesOrderKeyMap: Record<IssuesOrdering, IssuesOrderByKeys> = {
[IssuesOrdering.Status]: 'status',
[IssuesOrdering.Priority]: 'priority',
[IssuesOrdering.LastUpdated]: 'modifiedOn',
[IssuesOrdering.DueDate]: 'dueDate',
[IssuesOrdering.Manual]: 'rank'
}
export const issuesGroupEditorMap: Record<'status' | 'priority' | 'component' | 'milestone', AnyComponent | undefined> =
{
status: tracker.component.StatusEditor,
priority: tracker.component.PriorityEditor,
component: tracker.component.ComponentEditor,
milestone: tracker.component.MilestoneEditor
}
export const getIssuesModificationDatePeriodTime = (period: IssuesDateModificationPeriod | null): number => {
const today = new Date(Date.now())
switch (period) {
case IssuesDateModificationPeriod.PastWeek: {
return today.getTime() - MILLISECONDS_IN_WEEK
}
case IssuesDateModificationPeriod.PastMonth: {
return today.getTime() - getMillisecondsInMonth(today)
}
default: {
return 0
}
}
}
export interface FilterAction {
icon?: Asset | AnySvelteComponent
label?: IntlString
onSelect: (event: MouseEvent | KeyboardEvent) => void
}
export interface FilterSectionElement extends Omit<FilterAction, 'label'> {
title?: string
count?: number
isSelected?: boolean
}
export interface IssueFilter {
mode: '$in' | '$nin'
query: DocumentQuery<Issue>
}
export const getGroupedIssues = (
key: IssuesGroupByKeys | undefined,
elements: Issue[],
orderedCategories?: any[]
): Record<string, Issue[]> => {
if (key === undefined) {
return { [undefined as any]: elements }
}
const unorderedIssues = groupBy(elements, key)
if (orderedCategories === undefined || orderedCategories.length === 0) {
return unorderedIssues
}
return Object.keys(unorderedIssues)
.sort((o1, o2) => {
const key1 = o1 === 'null' ? null : o1
const key2 = o2 === 'null' ? null : o2
const i1 = orderedCategories.findIndex((x) => x === key1)
const i2 = orderedCategories.findIndex((x) => x === key2)
return i1 - i2
})
.reduce((obj: Record<string, any[]>, objKey) => {
obj[objKey] = unorderedIssues[objKey]
return obj
}, {})
}
export const getIssueFilterAssetsByType = (type: string): { icon: Asset, label: IntlString } | undefined => {
switch (type) {
case 'status': {
return {
icon: tracker.icon.CategoryBacklog,
label: tracker.string.Status
}
}
case 'priority': {
return {
icon: tracker.icon.PriorityHigh,
label: tracker.string.Priority
}
}
case 'component': {
return {
icon: tracker.icon.Component,
label: tracker.string.Component
}
}
case 'milestone': {
return {
icon: tracker.icon.Milestone,
label: tracker.string.Milestone
}
}
default: {
return undefined
}
}
}
export const getArraysIntersection = (a: any[], b: any[]): any[] => {
const setB = new Set(b)
const intersection = new Set(a.filter((x) => setB.has(x)))
return Array.from(intersection)
}
export const getArraysUnion = (a: any[], b: any[]): any[] => {
const setB = new Set(b)
const union = new Set(a)
for (const element of setB) {
union.add(element)
}
return Array.from(union)
}
export type ComponentsFilterMode = 'all' | 'backlog' | 'active' | 'closed' export type ComponentsFilterMode = 'all' | 'backlog' | 'active' | 'closed'
export type MilestoneViewMode = 'all' | 'planned' | 'active' | 'closed' export type MilestoneViewMode = 'all' | 'planned' | 'active' | 'closed'

View File

@ -13,18 +13,17 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { createEventDispatcher } from 'svelte' import core, { AnyAttribute, Class, Doc, Ref, Type } from '@hcengineering/core'
import core, { AnyAttribute, ArrOf, Class, Doc, Ref, Type } from '@hcengineering/core'
import { Asset, IntlString } from '@hcengineering/platform' import { Asset, IntlString } from '@hcengineering/platform'
import preferencePlugin from '@hcengineering/preference'
import { createQuery, getAttributePresenterClass, getClient, hasResource } from '@hcengineering/presentation' import { createQuery, getAttributePresenterClass, getClient, hasResource } from '@hcengineering/presentation'
import { Loading, resizeObserver } from '@hcengineering/ui' import { Loading, resizeObserver } from '@hcengineering/ui'
import DropdownLabelsIntl from '@hcengineering/ui/src/components/DropdownLabelsIntl.svelte'
import { BuildModelKey, Viewlet, ViewletPreference } from '@hcengineering/view' import { BuildModelKey, Viewlet, ViewletPreference } from '@hcengineering/view'
import { deepEqual } from 'fast-equals' import { deepEqual } from 'fast-equals'
import { createEventDispatcher } from 'svelte'
import view from '../plugin' import view from '../plugin'
import { buildConfigLookup, getKeyLabel } from '../utils' import { buildConfigLookup, getKeyLabel } from '../utils'
import ViewletClassSettings from './ViewletClassSettings.svelte' import ViewletClassSettings from './ViewletClassSettings.svelte'
import DropdownLabelsIntl from '@hcengineering/ui/src/components/DropdownLabelsIntl.svelte'
export let viewlet: Viewlet export let viewlet: Viewlet
@ -273,7 +272,7 @@
config config
}) })
} else { } else {
await client.createDoc(view.class.ViewletPreference, preferencePlugin.space.Preference, { await client.createDoc(view.class.ViewletPreference, core.space.Workspace, {
attachedTo: viewletId, attachedTo: viewletId,
config config
}) })

View File

@ -1,6 +1,5 @@
<script lang="ts"> <script lang="ts">
import { Class, Doc, Ref, getCurrentAccount } from '@hcengineering/core' import core, { Class, Doc, Ref, getCurrentAccount } from '@hcengineering/core'
import preference from '@hcengineering/preference'
import { Card, getClient } from '@hcengineering/presentation' import { Card, getClient } from '@hcengineering/presentation'
import { Button, EditBox, ToggleWithLabel, getCurrentResolvedLocation } from '@hcengineering/ui' import { Button, EditBox, ToggleWithLabel, getCurrentResolvedLocation } from '@hcengineering/ui'
import { ViewOptions } from '@hcengineering/view' import { ViewOptions } from '@hcengineering/view'
@ -22,7 +21,7 @@
const loc = getCurrentResolvedLocation() const loc = getCurrentResolvedLocation()
loc.fragment = undefined loc.fragment = undefined
const filters = JSON.stringify($filterStore) const filters = JSON.stringify($filterStore)
await client.createDoc(view.class.FilteredView, preference.space.Preference, { await client.createDoc(view.class.FilteredView, core.space.Workspace, {
name: filterName, name: filterName,
location: loc, location: loc,
filterClass: _class, filterClass: _class,

View File

@ -13,13 +13,12 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { getCurrentAccount, type Ref } from '@hcengineering/core' import core, { getCurrentAccount, type Ref } from '@hcengineering/core'
import type { Application } from '@hcengineering/workbench' import type { Application } from '@hcengineering/workbench'
import { createQuery } from '@hcengineering/presentation' import { createQuery } from '@hcengineering/presentation'
import workbench from '@hcengineering/workbench' import workbench from '@hcengineering/workbench'
import { hideApplication, isAppAllowed, showApplication } from '../utils' import { hideApplication, isAppAllowed, showApplication } from '../utils'
import { Loading, IconCheck, Label, Icon } from '@hcengineering/ui' import { Loading, IconCheck, Label, Icon } from '@hcengineering/ui'
import preference from '@hcengineering/preference'
// import Drag from './icons/Drag.svelte' // import Drag from './icons/Drag.svelte'
export let apps: Application[] = [] export let apps: Application[] = []
@ -59,7 +58,7 @@
hiddenAppsIdsQuery.query( hiddenAppsIdsQuery.query(
workbench.class.HiddenApplication, workbench.class.HiddenApplication,
{ {
space: preference.space.Preference space: core.space.Workspace
}, },
(res) => { (res) => {
hiddenAppsIds = res.map((r) => r.attachedTo) hiddenAppsIds = res.map((r) => r.attachedTo)

View File

@ -13,14 +13,13 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import { getCurrentAccount, type Ref } from '@hcengineering/core' import core, { getCurrentAccount, type Ref } from '@hcengineering/core'
import { createQuery } from '@hcengineering/presentation' import { createQuery } from '@hcengineering/presentation'
import { Scroller } from '@hcengineering/ui' import { Scroller } from '@hcengineering/ui'
import { NavLink } from '@hcengineering/view-resources' import { NavLink } from '@hcengineering/view-resources'
import type { Application } from '@hcengineering/workbench' import type { Application } from '@hcengineering/workbench'
import workbench from '@hcengineering/workbench' import workbench from '@hcengineering/workbench'
import preference from '@hcengineering/preference'
import { isAppAllowed } from '../utils' import { isAppAllowed } from '../utils'
import AppItem from './AppItem.svelte' import AppItem from './AppItem.svelte'
@ -34,7 +33,7 @@
hiddenAppsIdsQuery.query( hiddenAppsIdsQuery.query(
workbench.class.HiddenApplication, workbench.class.HiddenApplication,
{ {
space: preference.space.Preference space: core.space.Workspace
}, },
(res) => { (res) => {
hiddenAppsIds = res.map((r) => r.attachedTo) hiddenAppsIds = res.map((r) => r.attachedTo)

View File

@ -14,8 +14,7 @@
// limitations under the License. // limitations under the License.
--> -->
<script lang="ts"> <script lang="ts">
import type { Doc, Ref, Space } from '@hcengineering/core' import core, { Doc, Ref, Space, AccountRole, getCurrentAccount, hasAccountRole } from '@hcengineering/core'
import { AccountRole, getCurrentAccount, hasAccountRole } from '@hcengineering/core'
import { IntlString, getResource } from '@hcengineering/platform' import { IntlString, getResource } from '@hcengineering/platform'
import preference from '@hcengineering/preference' import preference from '@hcengineering/preference'
import { getClient } from '@hcengineering/presentation' import { getClient } from '@hcengineering/presentation'
@ -75,7 +74,7 @@
label: preference.string.Star, label: preference.string.Star,
icon: preference.icon.Star, icon: preference.icon.Star,
action: async (_id: Ref<Space>): Promise<void> => { action: async (_id: Ref<Space>): Promise<void> => {
await client.createDoc(preference.class.SpacePreference, preference.space.Preference, { await client.createDoc(preference.class.SpacePreference, core.space.Workspace, {
attachedTo: _id attachedTo: _id
}) })
} }

View File

@ -19,7 +19,6 @@ import core, { hasAccountRole } from '@hcengineering/core'
import type { Workspace } from '@hcengineering/login' import type { Workspace } from '@hcengineering/login'
import login, { loginId } from '@hcengineering/login' import login, { loginId } from '@hcengineering/login'
import { getResource, setMetadata } from '@hcengineering/platform' import { getResource, setMetadata } from '@hcengineering/platform'
import preference from '@hcengineering/preference'
import { closeClient, getClient } from '@hcengineering/presentation' import { closeClient, getClient } from '@hcengineering/presentation'
import presentation from '@hcengineering/presentation/src/plugin' import presentation from '@hcengineering/presentation/src/plugin'
import { import {
@ -141,7 +140,7 @@ export function isAppAllowed (app: Application, acc: Account): boolean {
export async function hideApplication (app: Application): Promise<void> { export async function hideApplication (app: Application): Promise<void> {
const client = getClient() const client = getClient()
await client.createDoc(workbench.class.HiddenApplication, preference.space.Preference, { await client.createDoc(workbench.class.HiddenApplication, core.space.Workspace, {
attachedTo: app._id attachedTo: app._id
}) })
} }

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
// //
import { import core, {
Branding, Branding,
Doc, Doc,
Hierarchy, Hierarchy,
@ -85,7 +85,7 @@ export async function getPublicLink (
const fragment = getDocFragment(doc, client) const fragment = getDocFragment(doc, client)
await client.createDoc( await client.createDoc(
guest.class.PublicLink, guest.class.PublicLink,
guest.space.Links, core.space.Workspace,
{ {
attachedTo: doc._id, attachedTo: doc._id,
location: { location: {

View File

@ -100,13 +100,13 @@ function getTxes (
removed?: Ref<Department>[] removed?: Ref<Department>[]
): Tx[] { ): Tx[] {
const pushTxes = added.map((dep) => const pushTxes = added.map((dep) =>
factory.createTxUpdateDoc(hr.class.Department, hr.space.HR, dep, { factory.createTxUpdateDoc(hr.class.Department, core.space.Workspace, dep, {
$push: { members: account } $push: { members: account }
}) })
) )
if (removed === undefined) return pushTxes if (removed === undefined) return pushTxes
const pullTxes = removed.map((dep) => const pullTxes = removed.map((dep) =>
factory.createTxUpdateDoc(hr.class.Department, hr.space.HR, dep, { factory.createTxUpdateDoc(hr.class.Department, core.space.Workspace, dep, {
$pull: { members: account } $pull: { members: account }
}) })
) )

View File

@ -80,7 +80,7 @@ async function createUserInfo (acc: Ref<Account>, control: TriggerControl): Prom
const person = (await control.findAll(contact.class.Person, { _id: personId }))[0] const person = (await control.findAll(contact.class.Person, { _id: personId }))[0]
const room = (await control.findAll(love.class.Office, { person: personId }))[0] const room = (await control.findAll(love.class.Office, { person: personId }))[0]
const tx = control.txFactory.createTxCreateDoc(love.class.ParticipantInfo, love.space.Rooms, { const tx = control.txFactory.createTxCreateDoc(love.class.ParticipantInfo, core.space.Workspace, {
person: personId, person: personId,
name: person !== undefined ? getName(control.hierarchy, person, control.branding?.lastNameFirst) : account.email, name: person !== undefined ? getName(control.hierarchy, person, control.branding?.lastNameFirst) : account.email,
room: room?._id ?? love.ids.Reception, room: room?._id ?? love.ids.Reception,
@ -88,7 +88,7 @@ async function createUserInfo (acc: Ref<Account>, control: TriggerControl): Prom
y: 0 y: 0
}) })
const ptx = control.txFactory.createTxApplyIf( const ptx = control.txFactory.createTxApplyIf(
love.space.Rooms, core.space.Workspace,
personId, personId,
[], [],
[ [
@ -149,7 +149,7 @@ async function roomJoinHandler (info: ParticipantInfo, control: TriggerControl,
if (roomInfo !== undefined) { if (roomInfo !== undefined) {
roomInfo.persons.push(info.person) roomInfo.persons.push(info.person)
return [ return [
control.txFactory.createTxUpdateDoc(love.class.RoomInfo, love.space.Rooms, roomInfo._id, { control.txFactory.createTxUpdateDoc(love.class.RoomInfo, core.space.Workspace, roomInfo._id, {
persons: Array.from(new Set([...roomInfo.persons, info.person])) persons: Array.from(new Set([...roomInfo.persons, info.person]))
}) })
] ]
@ -157,7 +157,7 @@ async function roomJoinHandler (info: ParticipantInfo, control: TriggerControl,
const room = (await control.findAll(love.class.Room, { _id: info.room }))[0] const room = (await control.findAll(love.class.Room, { _id: info.room }))[0]
if (room === undefined) return [] if (room === undefined) return []
return [ return [
control.txFactory.createTxCreateDoc(love.class.RoomInfo, love.space.Rooms, { control.txFactory.createTxCreateDoc(love.class.RoomInfo, core.space.Workspace, {
persons: [info.person], persons: [info.person],
room: info.room, room: info.room,
isOffice: isOffice(room) isOffice: isOffice(room)
@ -182,7 +182,7 @@ async function rejectJoinRequests (
}) })
for (const request of requests) { for (const request of requests) {
res.push( res.push(
control.txFactory.createTxUpdateDoc(love.class.JoinRequest, love.space.Rooms, request._id, { control.txFactory.createTxUpdateDoc(love.class.JoinRequest, core.space.Workspace, request._id, {
status: RequestStatus.Rejected status: RequestStatus.Rejected
}) })
) )
@ -198,14 +198,14 @@ function setDefaultRoomAccess (info: ParticipantInfo, roomInfos: RoomInfo[], con
if (oldRoomInfo !== undefined) { if (oldRoomInfo !== undefined) {
oldRoomInfo.persons = oldRoomInfo.persons.filter((p) => p !== info.person) oldRoomInfo.persons = oldRoomInfo.persons.filter((p) => p !== info.person)
res.push( res.push(
control.txFactory.createTxUpdateDoc(love.class.RoomInfo, love.space.Rooms, oldRoomInfo._id, { control.txFactory.createTxUpdateDoc(love.class.RoomInfo, core.space.Workspace, oldRoomInfo._id, {
persons: oldRoomInfo.persons persons: oldRoomInfo.persons
}) })
) )
if (oldRoomInfo.persons.length === 0) { if (oldRoomInfo.persons.length === 0) {
const resetAccessTx = control.txFactory.createTxUpdateDoc( const resetAccessTx = control.txFactory.createTxUpdateDoc(
oldRoomInfo.isOffice ? love.class.Office : love.class.Room, oldRoomInfo.isOffice ? love.class.Office : love.class.Room,
love.space.Rooms, core.space.Workspace,
oldRoomInfo.room, oldRoomInfo.room,
{ {
access: oldRoomInfo.isOffice ? RoomAccess.Knock : RoomAccess.Open access: oldRoomInfo.isOffice ? RoomAccess.Knock : RoomAccess.Open

View File

@ -575,7 +575,7 @@ export async function createPushFromInbox (
const path = [workbenchId, control.workspace.workspaceUrl, notificationId, encodeObjectURI(id, attachedToClass)] const path = [workbenchId, control.workspace.workspaceUrl, notificationId, encodeObjectURI(id, attachedToClass)]
await createPushNotification(control, targetUser, title, body, _id, senderPerson, path) await createPushNotification(control, targetUser, title, body, _id, senderPerson, path)
return control.txFactory.createTxCreateDoc(notification.class.BrowserNotification, notification.space.Notifications, { return control.txFactory.createTxCreateDoc(notification.class.BrowserNotification, core.space.Workspace, {
user: targetUser, user: targetUser,
status: NotificationStatus.New, status: NotificationStatus.New,
title, title,

View File

@ -57,7 +57,7 @@ export async function onTagReference (tx: Tx, control: TriggerControl): Promise<
if (!control.hierarchy.isDerived((actualTx as TxCUD<Doc>).objectClass, tags.class.TagReference)) return [] if (!control.hierarchy.isDerived((actualTx as TxCUD<Doc>).objectClass, tags.class.TagReference)) return []
if (isCreate) { if (isCreate) {
const doc = TxProcessor.createDoc2Doc(actualTx as TxCreateDoc<TagReference>) const doc = TxProcessor.createDoc2Doc(actualTx as TxCreateDoc<TagReference>)
const res = control.txFactory.createTxUpdateDoc(tags.class.TagElement, tags.space.Tags, doc.tag, { const res = control.txFactory.createTxUpdateDoc(tags.class.TagElement, core.space.Workspace, doc.tag, {
$inc: { refCount: 1 } $inc: { refCount: 1 }
}) })
return [res] return [res]
@ -67,7 +67,7 @@ export async function onTagReference (tx: Tx, control: TriggerControl): Promise<
const doc = control.removedMap.get(ctx.objectId) as TagReference const doc = control.removedMap.get(ctx.objectId) as TagReference
if (doc !== undefined) { if (doc !== undefined) {
if (!control.removedMap.has(doc.tag)) { if (!control.removedMap.has(doc.tag)) {
const res = control.txFactory.createTxUpdateDoc(tags.class.TagElement, tags.space.Tags, doc.tag, { const res = control.txFactory.createTxUpdateDoc(tags.class.TagElement, core.space.Workspace, doc.tag, {
$inc: { refCount: -1 } $inc: { refCount: -1 }
}) })
return [res] return [res]

View File

@ -70,6 +70,7 @@ export class SpaceSecurityMiddleware extends BaseMiddleware implements Middlewar
core.space.DerivedTx, core.space.DerivedTx,
core.space.Model, core.space.Model,
core.space.Space, core.space.Space,
core.space.Workspace,
core.space.Tx core.space.Tx
] ]