// // 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' export function classIcon (client: Client, _class: Ref>): Asset | undefined { return client.getHierarchy().getClass(_class).icon } export function getSpecialSpaceClass (model: NavigatorModel): Array>> { 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>>) } export async function getSpaceName (client: Client, space: Space): Promise { const hierarchy = client.getHierarchy() const clazz = hierarchy.getClass(space._class) const nameMixin = hierarchy.as(clazz, view.mixin.SpaceName) 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 // If no space is selected, select first space from list spaceClass?: Ref> } ): Promise { evt?.preventDefault() closePanel() const loc = getCurrentLocation() const client = getClient() switch (props.mode) { case 'app': loc.path[1] = props.application ?? '' if (props.special !== undefined) { loc.path[2] = props.special loc.path.length = 3 } else { loc.path.length = 2 } navigate(loc) break case 'special': if (props.application !== undefined && loc.path[1] !== props.application) { loc.path[1] = props.application } loc.path[2] = props.special ?? '' loc.path.length = 3 navigate(loc) break case 'space': { if (props.space !== undefined) { loc.path[2] = props.space } else { if (doc !== undefined && !Array.isArray(doc) && client.getHierarchy().isDerived(doc._class, core.class.Space)) { loc.path[2] = doc._id } } if (props.spaceSpecial !== undefined) { loc.path[3] = props.spaceSpecial } if (props.spaceClass !== undefined) { const ex = await client.findOne(props.spaceClass, { _id: loc.path[2] as Ref }) if (ex === undefined) { const r = await client.findOne(props.spaceClass, {}) if (r !== undefined) { loc.path[2] = r._id } } } loc.path.length = 4 navigate(loc) break } } }