platform/plugins/workbench-resources/src/utils.ts

119 lines
3.7 KiB
TypeScript
Raw Normal View History

//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// 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.
//
import type { Class, Client, Doc, Obj, Ref, Space } from '@anticrm/core'
import core from '@anticrm/core'
import type { Asset } from '@anticrm/platform'
import { getResource } from '@anticrm/platform'
import { NavigatorModel } from '@anticrm/workbench'
import view from '@anticrm/view'
import { closePanel, getCurrentLocation, navigate } from '@anticrm/ui'
import { getClient } from '@anticrm/presentation'
2022-04-29 05:27:17 +00:00
export function classIcon (client: Client, _class: Ref<Class<Obj>>): Asset | undefined {
return client.getHierarchy().getClass(_class).icon
}
2022-04-29 05:27:17 +00:00
export function getSpecialSpaceClass (model: NavigatorModel): Array<Ref<Class<Space>>> {
const spaceResult = model.spaces.map((x) => x.spaceClass)
const result = (model.specials ?? [])
.map((it) => it.spaceClass)
.filter((it) => it !== undefined && !spaceResult.includes(it))
return spaceResult.concat(result as Array<Ref<Class<Space>>>)
}
2022-04-29 05:27:17 +00:00
export async function getSpaceName (client: Client, space: Space): Promise<string> {
const hierarchy = client.getHierarchy()
const clazz = hierarchy.getClass(space._class)
const nameMixin = hierarchy.as(clazz, view.mixin.SpaceName)
2022-04-29 05:27:17 +00:00
if (nameMixin?.getName !== undefined) {
const getSpaceName = await getResource(nameMixin.getName)
const name = await getSpaceName(client, space)
return name
}
return space.name
}
/**
* @public
*/
export async function doNavigate (
doc: Doc | Doc[],
evt: Event | undefined,
props: {
mode: 'app' | 'special' | 'space'
application?: string
special?: string
spaceSpecial?: string
space?: Ref<Space>
// If no space is selected, select first space from list
spaceClass?: Ref<Class<Space>>
}
): Promise<void> {
evt?.preventDefault()
closePanel()
const loc = getCurrentLocation()
const client = getClient()
switch (props.mode) {
case 'app':
loc.path[2] = props.application ?? ''
if (props.special !== undefined) {
loc.path[3] = props.special
loc.path.length = 4
} else {
loc.path.length = 3
}
navigate(loc)
break
case 'special':
if (props.application !== undefined && loc.path[2] !== props.application) {
loc.path[2] = props.application
}
loc.path[3] = props.special ?? ''
loc.path.length = 4
navigate(loc)
break
case 'space': {
if (props.space !== undefined) {
loc.path[3] = props.space
} else {
if (doc !== undefined && !Array.isArray(doc) && client.getHierarchy().isDerived(doc._class, core.class.Space)) {
loc.path[3] = doc._id
}
}
if (props.spaceSpecial !== undefined) {
loc.path[4] = props.spaceSpecial
}
if (props.spaceClass !== undefined) {
const ex = await client.findOne(props.spaceClass, { _id: loc.path[3] as Ref<Space> })
if (ex === undefined) {
const r = await client.findOne(props.spaceClass, {})
if (r !== undefined) {
loc.path[3] = r._id
}
}
}
loc.path.length = 5
navigate(loc)
break
}
}
}