diff --git a/models/card/src/index.ts b/models/card/src/index.ts index e76215ae885..e1b115675bf 100644 --- a/models/card/src/index.ts +++ b/models/card/src/index.ts @@ -23,6 +23,7 @@ import { type CreateCardExtension, DOMAIN_CARD, type FavoriteCard, + type FavoriteType, type MasterTag, type ParentInfo, type Role, @@ -171,6 +172,11 @@ export class TFavoriteCard extends TPreference implements FavoriteCard { application!: string } +@Model(card.class.FavoriteType, preference.class.Preference) +export class TFavoriteType extends TPreference implements FavoriteType { + declare attachedTo: Ref +} + @Mixin(card.mixin.CreateCardExtension, card.class.MasterTag) export class TCreateCardExtension extends TMasterTag implements CreateCardExtension { component?: AnyComponent @@ -347,6 +353,7 @@ export function createModel (builder: Builder): void { TCardSection, TCardViewDefaults, TFavoriteCard, + TFavoriteType, TCreateCardExtension ) diff --git a/plugins/card-assets/lang/cs.json b/plugins/card-assets/lang/cs.json index b9116966b03..23d1d178d08 100644 --- a/plugins/card-assets/lang/cs.json +++ b/plugins/card-assets/lang/cs.json @@ -48,6 +48,7 @@ "ShowLess": "Skrýt detaily", "CardContent": "Co chcete sdílet?", "Feed": "Kanál", - "AllCards": "Všechny karty" + "AllCards": "Všechny karty", + "Favorites": "Oblíbené" } } diff --git a/plugins/card-assets/lang/de.json b/plugins/card-assets/lang/de.json index 96b58f418ea..ce5b843b3a8 100644 --- a/plugins/card-assets/lang/de.json +++ b/plugins/card-assets/lang/de.json @@ -48,6 +48,7 @@ "ShowLess": "Weniger anzeigen", "CardContent": "Was möchten Sie teilen?", "Feed": "Feed", - "AllCards": "Alle Karten" + "AllCards": "Alle Karten", + "Favorites": "Favoriten" } } diff --git a/plugins/card-assets/lang/en.json b/plugins/card-assets/lang/en.json index 3dffccf0f33..4d613c27d89 100644 --- a/plugins/card-assets/lang/en.json +++ b/plugins/card-assets/lang/en.json @@ -48,6 +48,7 @@ "ShowLess": "Show less", "CardContent": "What do you want to share?", "Feed": "Feed", - "AllCards": "All Cards" + "AllCards": "All Cards", + "Favorites": "Favorites" } } diff --git a/plugins/card-assets/lang/es.json b/plugins/card-assets/lang/es.json index 86e5bda524c..517f107a6e0 100644 --- a/plugins/card-assets/lang/es.json +++ b/plugins/card-assets/lang/es.json @@ -48,6 +48,7 @@ "ShowLess": "Mostrar menos", "CardContent": "¿Qué quieres compartir?", "Feed": "Feed", - "AllCards": "Todas las Tarjetas" + "AllCards": "Todas las Tarjetas", + "Favorites": "Favoritos" } } diff --git a/plugins/card-assets/lang/fr.json b/plugins/card-assets/lang/fr.json index 23c11563a39..8865ac2cb5f 100644 --- a/plugins/card-assets/lang/fr.json +++ b/plugins/card-assets/lang/fr.json @@ -48,6 +48,7 @@ "ShowLess": "Afficher moins", "CardContent": "Que voulez-vous partager ?", "Feed": "Flux", - "AllCards": "Toutes les Cartes" + "AllCards": "Toutes les Cartes", + "Favorites": "Favoris" } } diff --git a/plugins/card-assets/lang/it.json b/plugins/card-assets/lang/it.json index 5bf49d4b947..4ad34b9e501 100644 --- a/plugins/card-assets/lang/it.json +++ b/plugins/card-assets/lang/it.json @@ -48,6 +48,7 @@ "ShowLess": "Mostra meno", "CardContent": "Cosa vuoi condividere?", "Feed": "Feed", - "AllCards": "Tutte le Carte" + "AllCards": "Tutte le Carte", + "Favorites": "Preferiti" } } diff --git a/plugins/card-assets/lang/ja.json b/plugins/card-assets/lang/ja.json index 51015b051ac..b598173505c 100644 --- a/plugins/card-assets/lang/ja.json +++ b/plugins/card-assets/lang/ja.json @@ -48,6 +48,7 @@ "ShowLess": "詳細を隠す", "CardContent": "何を共有しますか?", "Feed": "フィード", - "AllCards": "すべてのカード" + "AllCards": "すべてのカード", + "Favorites": "お気に入り" } } diff --git a/plugins/card-assets/lang/pt.json b/plugins/card-assets/lang/pt.json index 34a0a588261..c0f41ac66c2 100644 --- a/plugins/card-assets/lang/pt.json +++ b/plugins/card-assets/lang/pt.json @@ -48,6 +48,7 @@ "ShowLess": "Mostrar menos", "CardContent": "O que você quer compartilhar?", "Feed": "Feed", - "AllCards": "Todos os Cartões" + "AllCards": "Todos os Cartões", + "Favorites": "Favoritos" } } diff --git a/plugins/card-assets/lang/ru.json b/plugins/card-assets/lang/ru.json index 4f0e8e7dd26..4726c90cf76 100644 --- a/plugins/card-assets/lang/ru.json +++ b/plugins/card-assets/lang/ru.json @@ -48,6 +48,7 @@ "ShowLess": "Скрыть детали", "CardContent": "Чем вы хотите поделиться?", "Feed": "Лента", - "AllCards": "Все карты" + "AllCards": "Все карты", + "Favorites": "Избранное" } } diff --git a/plugins/card-assets/lang/tr.json b/plugins/card-assets/lang/tr.json index 834f2cec7ed..b614bea83c3 100644 --- a/plugins/card-assets/lang/tr.json +++ b/plugins/card-assets/lang/tr.json @@ -48,6 +48,7 @@ "ShowLess": "Daha az göster", "CardContent": "Ne paylaşmak istiyorsunuz?", "Feed": "Akış", - "AllCards": "Tüm Kartlar" + "AllCards": "Tüm Kartlar", + "Favorites": "Favoriler" } } diff --git a/plugins/card-assets/lang/zh.json b/plugins/card-assets/lang/zh.json index 391473fdfbd..37c38d7ad74 100644 --- a/plugins/card-assets/lang/zh.json +++ b/plugins/card-assets/lang/zh.json @@ -48,6 +48,7 @@ "ShowLess": "收起详情", "CardContent": "你想分享什么?", "Feed": "动态", - "AllCards": "所有卡片" + "AllCards": "所有卡片", + "Favorites": "收藏夹" } } diff --git a/plugins/card-resources/src/components/navigator/TagHierarchy.svelte b/plugins/card-resources/src/components/navigator/TagHierarchy.svelte index 905ab7792d9..39237d2e418 100644 --- a/plugins/card-resources/src/components/navigator/TagHierarchy.svelte +++ b/plugins/card-resources/src/components/navigator/TagHierarchy.svelte @@ -17,7 +17,7 @@ import { MasterTag } from '@hcengineering/card' import { Class, Doc, Ref, Space } from '@hcengineering/core' import { IconWithEmoji, getClient } from '@hcengineering/presentation' - import { NavItem, getCurrentLocation, navigate } from '@hcengineering/ui' + import { Action, ButtonIcon, NavItem, getCurrentLocation, navigate } from '@hcengineering/ui' import view from '@hcengineering/view' import card from '../../plugin' @@ -27,6 +27,8 @@ export let _class: Ref> | undefined export let level: number = 0 export let currentSpace: Ref | undefined + export let getItemActions: ((typeId: Ref) => Action[]) | undefined = undefined + export let excludedClasses: Ref[] = [] const client = getClient() const dispatch = createEventDispatcher() @@ -38,21 +40,26 @@ const desc = hierarchy.getDescendants(_class) for (const clazz of desc) { const cls = hierarchy.getClass(clazz) as MasterTag - if (cls.extends === _class && cls._class === card.class.MasterTag && cls.removed !== true) { + if ( + cls.extends === _class && + cls._class === card.class.MasterTag && + cls.removed !== true && + !excludedClasses.includes(cls._id) + ) { result.push(cls) } } return result.sort((a, b) => a.label.localeCompare(b.label)) } - function fillDescendants (classes: MasterTag[]): void { + function fillDescendants (classes: MasterTag[], _excludedClasses: Ref[]): void { for (const cl of classes) { descendants.set(cl._id, getDescendants(cl._id)) } descendants = descendants } - $: fillDescendants(allClasses) + $: fillDescendants(allClasses, excludedClasses) function select (clazz: Ref>, space: Ref): void { const loc = getCurrentLocation() @@ -81,6 +88,23 @@ } }} > + + {#if getItemActions !== undefined} + {#each getItemActions(clazz._id) as action} + { + e.stopPropagation() + e.preventDefault() + void action.action(action.props, e) + }} + /> + {/each} + {/if} + {#if (descendants.get(clazz._id)?.length ?? 0) > 0} diff --git a/plugins/card-resources/src/components/navigator/TypesNavigator.svelte b/plugins/card-resources/src/components/navigator/TypesNavigator.svelte index 10a88cb3b2b..9e340651201 100644 --- a/plugins/card-resources/src/components/navigator/TypesNavigator.svelte +++ b/plugins/card-resources/src/components/navigator/TypesNavigator.svelte @@ -13,12 +13,14 @@ // limitations under the License. -->
- - { - selectType(e.detail) - }} - /> - + {#if favoriteRootClasses.length > 0} + + { + selectType(e.detail) + }} + /> + + {/if} + + {#if nonFavoriteRootClasses.length > 0} + + { + selectType(e.detail) + }} + /> + + {/if}
diff --git a/plugins/card/src/index.ts b/plugins/card/src/index.ts index 7ff1e9a1edd..f9ff3e7d98c 100644 --- a/plugins/card/src/index.ts +++ b/plugins/card/src/index.ts @@ -99,6 +99,10 @@ export interface FavoriteCard extends Preference { application: string } +export interface FavoriteType extends Preference { + attachedTo: Ref +} + export interface CreateCardExtension extends MasterTag { component?: AnyComponent canCreate?: CanCreateCardResource @@ -128,7 +132,8 @@ const cardPlugin = plugin(cardId, { CardSpace: '' as Ref>, Role: '' as Ref>, CardSection: '' as Ref>, - FavoriteCard: '' as Ref> + FavoriteCard: '' as Ref>, + FavoriteType: '' as Ref> }, mixin: { CardViewDefaults: '' as Ref>, @@ -172,7 +177,8 @@ const cardPlugin = plugin(cardId, { GetIndividualPublicLink: '' as IntlString, AddTag: '' as IntlString, Feed: '' as IntlString, - AllCards: '' as IntlString + AllCards: '' as IntlString, + Favorites: '' as IntlString }, section: { Attachments: '' as Ref,