diff --git a/plugins/view-resources/src/components/icons/Mixin.svelte b/packages/ui/src/components/icons/Mixin.svelte similarity index 100% rename from plugins/view-resources/src/components/icons/Mixin.svelte rename to packages/ui/src/components/icons/Mixin.svelte diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 8ba8e5561a..775e043632 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -145,6 +145,7 @@ export { default as IconCheckCircle } from './components/icons/CheckCircle.svelt export { default as IconColStar } from './components/icons/ColStar.svelte' export { default as IconMinWidth } from './components/icons/MinWidth.svelte' export { default as IconMaxWidth } from './components/icons/MaxWidth.svelte' +export { default as IconMixin } from './components/icons/Mixin.svelte' export { default as PanelInstance } from './components/PanelInstance.svelte' export { default as Panel } from './components/Panel.svelte' diff --git a/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte b/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte index ae670cbd99..02b65fd58f 100644 --- a/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte @@ -13,7 +13,7 @@ // limitations under the License. --> <script lang="ts"> - import { Doc, WithLookup } from '@hcengineering/core' + import { ClassifierKind, Doc, Mixin, Ref, WithLookup } from '@hcengineering/core' import { AttributeBarEditor, createQuery, getClient, KeyedAttribute } from '@hcengineering/presentation' import tags from '@hcengineering/tags' import type { Issue, IssueStatus } from '@hcengineering/tracker' @@ -31,6 +31,7 @@ export let issue: Issue export let issueStatuses: WithLookup<IssueStatus>[] + export let showAllMixins: boolean = false const query = createQuery() let showIsBlocking = false @@ -50,6 +51,27 @@ keys = filtredKeys.filter((key) => !isCollectionAttr(hierarchy, key)) } + let mixins: Mixin<Doc>[] = [] + + $: getMixins(issue, showAllMixins) + + function getMixins (object: Issue, showAllMixins: boolean): void { + const descendants = hierarchy.getDescendants(tracker.class.Issue).map((p) => hierarchy.getClass(p)) + + mixins = descendants.filter( + (m) => + m.kind === ClassifierKind.MIXIN && + (hierarchy.hasMixin(object, m._id) || + (showAllMixins && hierarchy.isDerived(tracker.class.Issue, hierarchy.getBaseClass(m._id)))) + ) + } + + function getMixinKeys (mixin: Ref<Mixin<Doc>>): KeyedAttribute[] { + const filtredKeys = getFiltredKeys(hierarchy, mixin, [], issue._class) + const res = filtredKeys.filter((key) => !isCollectionAttr(hierarchy, key)) + return res + } + $: updateKeys(['title', 'description', 'priority', 'status', 'number', 'assignee', 'project', 'dueDate', 'sprint']) </script> @@ -143,6 +165,13 @@ <AttributeBarEditor {key} _class={issue._class} object={issue} showHeader={true} /> {/each} {/if} + + {#each mixins as mixin} + <div class="divider" /> + {#each getMixinKeys(mixin._id) as key (typeof key === 'string' ? key : key.key)} + <AttributeBarEditor {key} _class={mixin._id} object={hierarchy.as(issue, mixin._id)} showHeader={true} /> + {/each} + {/each} </div> <style lang="scss"> diff --git a/plugins/tracker-resources/src/components/issues/edit/EditIssue.svelte b/plugins/tracker-resources/src/components/issues/edit/EditIssue.svelte index fe00cb37d1..fcc0165f5e 100644 --- a/plugins/tracker-resources/src/components/issues/edit/EditIssue.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/EditIssue.svelte @@ -26,6 +26,7 @@ EditBox, getCurrentLocation, IconEdit, + IconMixin, IconMoreH, Label, navigate, @@ -61,6 +62,7 @@ let innerWidth: number let isEditing = false let descriptionBox: AttachmentStyledBox + let showAllMixins: boolean const notificationClient = getResource(notification.function.GetNotificationClient).then((res) => res()) @@ -289,11 +291,23 @@ navigate(loc) }} /> + <Button + kind={'transparent'} + shape={'round'} + selected={showAllMixins} + on:click={() => { + showAllMixins = !showAllMixins + }} + > + <svelte:fragment slot="content"> + <IconMixin size={'small'} /> + </svelte:fragment> + </Button> </svelte:fragment> <svelte:fragment slot="custom-attributes"> {#if issue && currentTeam && issueStatuses} - <ControlPanel {issue} {issueStatuses} /> + <ControlPanel {issue} {issueStatuses} {showAllMixins} /> {/if} <div class="divider" /> diff --git a/plugins/view-resources/src/components/EditDoc.svelte b/plugins/view-resources/src/components/EditDoc.svelte index 469e6472fc..1d674d3ad4 100644 --- a/plugins/view-resources/src/components/EditDoc.svelte +++ b/plugins/view-resources/src/components/EditDoc.svelte @@ -28,14 +28,13 @@ getClient, KeyedAttribute } from '@hcengineering/presentation' - import { AnyComponent, Button, Component, IconMoreH, showPopup } from '@hcengineering/ui' + import { AnyComponent, Button, Component, IconMixin, IconMoreH, showPopup } from '@hcengineering/ui' import view from '@hcengineering/view' import { createEventDispatcher, onDestroy } from 'svelte' import { ContextMenu } from '..' import { categorizeFields, getCollectionCounter, getFiltredKeys } from '../utils' import ActionContext from './ActionContext.svelte' import DocAttributeBar from './DocAttributeBar.svelte' - import IconMixin from './icons/Mixin.svelte' import UpDownNavigator from './UpDownNavigator.svelte' export let _id: Ref<Doc>