diff --git a/models/activity/src/index.ts b/models/activity/src/index.ts index d9a0149cbd..4d967097f8 100644 --- a/models/activity/src/index.ts +++ b/models/activity/src/index.ts @@ -201,11 +201,8 @@ export class TDocUpdateMessageViewlet extends TDoc implements DocUpdateMessageVi @Model(activity.class.ActivityExtension, core.class.Doc, DOMAIN_MODEL) export class TActivityExtension extends TDoc implements ActivityExtension { - @Prop(TypeRef(core.class.Class), core.string.Class) - @Index(IndexKind.Indexed) - ofClass!: Ref> - - components!: Record + ofClass!: Ref> + components!: Record }> } @Model(activity.class.ActivityMessagesFilter, core.class.Doc, DOMAIN_MODEL) diff --git a/models/analytics-collector/src/index.ts b/models/analytics-collector/src/index.ts index aab49c3d8a..e8e0dc38cd 100644 --- a/models/analytics-collector/src/index.ts +++ b/models/analytics-collector/src/index.ts @@ -85,7 +85,7 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: analyticsCollector.class.OnboardingChannel, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc>( diff --git a/models/chunter/src/index.ts b/models/chunter/src/index.ts index d714ebcee3..2f3c441015 100644 --- a/models/chunter/src/index.ts +++ b/models/chunter/src/index.ts @@ -273,27 +273,27 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: chunter.class.Channel, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: chunter.class.DirectMessage, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: activity.class.DocUpdateMessage, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: chunter.class.ChatMessage, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: activity.class.ActivityReference, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) // Indexing diff --git a/models/contact/src/index.ts b/models/contact/src/index.ts index 08e06f05d8..e7a597a31a 100644 --- a/models/contact/src/index.ts +++ b/models/contact/src/index.ts @@ -263,22 +263,22 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: contact.class.Contact, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: contact.class.Person, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: contact.class.Organization, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: contact.class.Member, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(contact.mixin.Employee, core.class.Class, view.mixin.ObjectFactory, { diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index 9e14cf94f9..20231c6ce5 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -514,7 +514,7 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: documents.class.DocumentCategory, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(documents.class.DocumentCategory, core.class.Class, view.mixin.ObjectPresenter, { @@ -768,7 +768,7 @@ export function defineNotifications (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: documents.class.DocumentComment, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(documents.class.ControlledDocument, core.class.Class, notification.mixin.ClassCollaborators, { diff --git a/models/document/src/index.ts b/models/document/src/index.ts index e06e6dbbc3..cacdf4c235 100644 --- a/models/document/src/index.ts +++ b/models/document/src/index.ts @@ -492,7 +492,7 @@ function defineDocument (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: document.class.Document, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) // Search diff --git a/models/drive/src/index.ts b/models/drive/src/index.ts index c262ce8005..6b4b762f38 100644 --- a/models/drive/src/index.ts +++ b/models/drive/src/index.ts @@ -595,7 +595,7 @@ function defineFile (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: drive.class.File, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) // Search diff --git a/models/inventory/src/index.ts b/models/inventory/src/index.ts index a34655fe03..f5440ad734 100644 --- a/models/inventory/src/index.ts +++ b/models/inventory/src/index.ts @@ -85,17 +85,17 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: inventory.class.Product, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: inventory.class.Category, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: inventory.class.Variant, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(inventory.class.Category, core.class.Class, view.mixin.ObjectPresenter, { diff --git a/models/lead/src/index.ts b/models/lead/src/index.ts index 2bb5bad1a0..cc8e668fa2 100644 --- a/models/lead/src/index.ts +++ b/models/lead/src/index.ts @@ -51,12 +51,12 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: lead.class.Lead, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: lead.class.Funnel, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(lead.class.Funnel, core.class.Class, workbench.mixin.SpaceView, { diff --git a/models/love/package.json b/models/love/package.json index de93ddff59..04ee30199e 100644 --- a/models/love/package.json +++ b/models/love/package.json @@ -28,8 +28,8 @@ "typescript": "^5.3.3" }, "dependencies": { - "@hcengineering/attachment": "^0.6.14", "@hcengineering/activity": "^0.6.0", + "@hcengineering/attachment": "^0.6.14", "@hcengineering/chunter": "^0.6.20", "@hcengineering/contact": "^0.6.24", "@hcengineering/core": "^0.6.32", @@ -46,6 +46,7 @@ "@hcengineering/notification": "^0.6.23", "@hcengineering/platform": "^0.6.11", "@hcengineering/setting": "^0.6.17", + "@hcengineering/time": "^0.6.0", "@hcengineering/ui": "^0.6.15", "@hcengineering/view": "^0.6.13", "@hcengineering/workbench": "^0.6.16" diff --git a/models/love/src/index.ts b/models/love/src/index.ts index c468e07fc8..8a8295404b 100644 --- a/models/love/src/index.ts +++ b/models/love/src/index.ts @@ -20,7 +20,10 @@ import { DOMAIN_TRANSIENT, IndexKind, type Ref, - type CollaborativeDoc + type CollaborativeDoc, + type Doc, + type Timestamp, + type CollectionSize } from '@hcengineering/core' import { type DevicesPreference, @@ -37,7 +40,8 @@ import { type RoomInfo, type RoomType, type RoomLanguage, - type MeetingMinutes + type MeetingMinutes, + type MeetingStatus } from '@hcengineering/love' import { type Builder, @@ -52,7 +56,9 @@ import { TypeCollaborativeDoc, TypeRef, TypeString, - UX + TypeTimestamp, + UX, + TypeAny } from '@hcengineering/model' import calendar, { TEvent } from '@hcengineering/model-calendar' import core, { TAttachedDoc, TDoc } from '@hcengineering/model-core' @@ -66,6 +72,7 @@ import workbench, { WidgetType } from '@hcengineering/workbench' import activity from '@hcengineering/activity' import chunter from '@hcengineering/chunter' import attachment from '@hcengineering/attachment' +import time, { type ToDo, type Todoable } from '@hcengineering/time' import love from './plugin' @@ -107,6 +114,9 @@ export class TRoom extends TDoc implements Room { @Prop(PropCollection(love.class.MeetingMinutes), love.string.MeetingMinutes) meetings?: number + + @Prop(PropCollection(chunter.class.ChatMessage), activity.string.Messages) + messages?: number } @Model(love.class.Office, love.class.Room) @@ -184,8 +194,13 @@ export class TMeeting extends TEvent implements Meeting { } @Model(love.class.MeetingMinutes, core.class.Doc, DOMAIN_MEETING_MINUTES) -@UX(love.string.MeetingMinutes, love.icon.Cam) -export class TMeetingMinutes extends TAttachedDoc implements MeetingMinutes { +@UX(love.string.MeetingMinutes, love.icon.Cam, undefined, 'createdOn', undefined, love.string.MeetingsMinutes) +export class TMeetingMinutes extends TAttachedDoc implements MeetingMinutes, Todoable { + @Prop(TypeRef(core.class.Doc), love.string.Room, { editor: love.component.MeetingMinutesDocEditor }) + @Index(IndexKind.Indexed) + @ReadOnly() + declare attachedTo: Ref + @Hidden() sid!: string @@ -197,6 +212,12 @@ export class TMeetingMinutes extends TAttachedDoc implements MeetingMinutes { @Index(IndexKind.FullText) description!: CollaborativeDoc + @Prop(TypeAny(love.component.MeetingMinutesStatusPresenter, love.string.Status), love.string.Status, { + editor: love.component.MeetingMinutesStatusPresenter + }) + @ReadOnly() + status!: MeetingStatus + @Prop(Collection(attachment.class.Attachment), attachment.string.Attachments, { shortLabel: attachment.string.Files }) attachments?: number @@ -205,6 +226,18 @@ export class TMeetingMinutes extends TAttachedDoc implements MeetingMinutes { @Prop(PropCollection(chunter.class.ChatMessage), activity.string.Messages) messages?: number + + @Prop(TypeTimestamp(), love.string.MeetingStart, { editor: view.component.TimestampPresenter }) + @ReadOnly() + @Index(IndexKind.IndexedDsc) + declare createdOn: Timestamp + + @Prop(TypeTimestamp(), love.string.MeetingEnd) + @ReadOnly() + meetingEnd?: Timestamp + + @Prop(Collection(time.class.ToDo), getEmbeddedLabel('Action Items')) + todos?: CollectionSize } export default love @@ -418,17 +451,17 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: love.class.Room, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput, props: { collection: 'messages' } } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: love.class.Office, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput, props: { collection: 'messages' } } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: love.class.MeetingMinutes, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput, props: { collection: 'messages' } } } }) builder.mixin(love.class.MeetingMinutes, core.class.Class, activity.mixin.ActivityDoc, {}) @@ -439,6 +472,10 @@ export function createModel (builder: Builder): void { presenter: love.component.MeetingMinutesPresenter }) + builder.mixin(love.class.Room, core.class.Class, view.mixin.ObjectPresenter, { + presenter: love.component.RoomPresenter + }) + builder.mixin(love.class.MeetingMinutes, core.class.Class, view.mixin.CollectionEditor, { editor: love.component.MeetingMinutesSection }) @@ -467,10 +504,11 @@ export function createModel (builder: Builder): void { descriptor: view.viewlet.Table, config: [ '', + { key: 'status', presenter: love.component.MeetingMinutesStatusPresenter, label: love.string.Status }, + 'createdOn', + 'meetingEnd', { key: 'messages', displayProps: { key: 'messages', suffix: true } }, - { key: 'transcription', displayProps: { key: 'transcription', suffix: true } }, - 'modifiedOn', - 'modifiedBy' + { key: 'transcription', displayProps: { key: 'transcription', suffix: true } } ], configOptions: { hiddenKeys: ['description'], @@ -481,6 +519,26 @@ export function createModel (builder: Builder): void { love.viewlet.TableMeetingMinutes ) + builder.createDoc( + view.class.Viewlet, + core.space.Model, + { + attachTo: love.class.MeetingMinutes, + descriptor: view.viewlet.Table, + config: [ + '', + { key: 'status', presenter: love.component.MeetingMinutesStatusPresenter, label: love.string.Status }, + 'createdOn', + 'meetingEnd' + ], + configOptions: { + sortable: true + }, + variant: 'embedded' + }, + love.viewlet.TableMeetingMinutesEmbedded + ) + builder.createDoc( view.class.ViewletDescriptor, core.space.Model, @@ -574,4 +632,8 @@ export function createModel (builder: Builder): void { indexes: [], searchDisabled: true }) + + builder.mixin(love.class.MeetingMinutes, core.class.Class, view.mixin.ObjectPanelFooter, { + editor: love.component.PanelControlBar + }) } diff --git a/models/love/src/migration.ts b/models/love/src/migration.ts index 779aa01052..916c9b96dc 100644 --- a/models/love/src/migration.ts +++ b/models/love/src/migration.ts @@ -16,7 +16,16 @@ import contact from '@hcengineering/contact' import { type Space, TxOperations, type Ref, makeCollaborativeDoc } from '@hcengineering/core' import drive from '@hcengineering/drive' -import { RoomAccess, RoomType, createDefaultRooms, isOffice, loveId, type Floor, type Room } from '@hcengineering/love' +import { + MeetingStatus, + RoomAccess, + RoomType, + createDefaultRooms, + isOffice, + loveId, + type Floor, + type Room +} from '@hcengineering/love' import { createDefaultSpace, migrateSpace, @@ -142,6 +151,16 @@ export const loveOperation: MigrateOperation = { } } } + }, + { + state: 'default-meeting-minutes-status', + func: async (client) => { + await client.update( + DOMAIN_MEETING_MINUTES, + { status: { $exists: false } }, + { status: MeetingStatus.Finished } + ) + } } ]) }, diff --git a/models/products/src/index.ts b/models/products/src/index.ts index 92946b8c6f..941c871b0e 100644 --- a/models/products/src/index.ts +++ b/models/products/src/index.ts @@ -159,7 +159,7 @@ function defineProduct (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: products.class.Product, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(products.class.Product, core.class.Class, view.mixin.ObjectEditor, { @@ -299,7 +299,7 @@ function defineProductVersion (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: products.class.ProductVersion, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(products.class.ProductVersion, core.class.Class, view.mixin.ObjectEditor, { diff --git a/models/recruit/src/index.ts b/models/recruit/src/index.ts index fe4b43e16b..6b8e3f5dfd 100644 --- a/models/recruit/src/index.ts +++ b/models/recruit/src/index.ts @@ -56,17 +56,17 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: recruit.class.Vacancy, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: recruit.class.Applicant, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: recruit.class.Review, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(recruit.class.Vacancy, core.class.Class, workbench.mixin.SpaceView, { diff --git a/models/survey/src/index.ts b/models/survey/src/index.ts index 0a8d5650fb..66dec5a80d 100644 --- a/models/survey/src/index.ts +++ b/models/survey/src/index.ts @@ -99,7 +99,7 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: survey.class.Survey, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc( @@ -137,7 +137,7 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: survey.class.Poll, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(survey.class.Poll, core.class.Class, view.mixin.CollectionEditor, { diff --git a/models/test-management/src/index.ts b/models/test-management/src/index.ts index 57cabf7eab..43b9e4d93e 100644 --- a/models/test-management/src/index.ts +++ b/models/test-management/src/index.ts @@ -143,7 +143,7 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: testManagement.class.TestProject, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) defineTestSuite(builder) @@ -218,7 +218,7 @@ function defineTestSuite (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: testManagement.class.TestSuite, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(testManagement.class.TestSuite, core.class.Class, view.mixin.ObjectEditor, { @@ -283,7 +283,7 @@ function defineTestCase (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: testManagement.class.TestCase, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(testManagement.class.TestCase, core.class.Class, view.mixin.ObjectEditor, { @@ -388,7 +388,7 @@ function defineTestRun (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: testManagement.class.TestRun, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.mixin(testManagement.class.TestRun, core.class.Class, view.mixin.ObjectEditor, { diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index ed2b36de4f..df061fcb3e 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -461,22 +461,22 @@ export function createModel (builder: Builder): void { builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: tracker.class.Issue, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: tracker.class.Milestone, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: tracker.class.Component, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) builder.createDoc(activity.class.ActivityExtension, core.space.Model, { ofClass: tracker.class.IssueTemplate, - components: { input: chunter.component.ChatMessageInput } + components: { input: { component: chunter.component.ChatMessageInput } } }) defineViewlets(builder) diff --git a/models/view/src/index.ts b/models/view/src/index.ts index e3f974c4a2..7d21f3db1c 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -67,6 +67,7 @@ import { type ListItemPresenter, type ObjectEditor, type ObjectEditorFooter, + type ObjectPanelFooter, type ObjectEditorHeader, type ObjectFactory, type ObjectPanel, @@ -216,6 +217,11 @@ export class TObjectEditorFooter extends TClass implements ObjectEditorFooter { editor!: AnyComponent } +@Mixin(view.mixin.ObjectPanelFooter, core.class.Class) +export class TObjectPanelFooter extends TClass implements ObjectPanelFooter { + editor!: AnyComponent +} + @Mixin(view.mixin.SpaceHeader, core.class.Class) export class TSpaceHeader extends TClass implements SpaceHeader { header!: AnyComponent @@ -445,6 +451,7 @@ export function createModel (builder: Builder): void { TObjectTitle, TObjectEditorHeader, TObjectEditorFooter, + TObjectPanelFooter, TSpaceHeader, TSpaceName, TSpacePresenter, diff --git a/packages/panel/src/components/Panel.svelte b/packages/panel/src/components/Panel.svelte index 95faa055ff..3a4dfee969 100644 --- a/packages/panel/src/components/Panel.svelte +++ b/packages/panel/src/components/Panel.svelte @@ -158,6 +158,11 @@ + + + + + {#if isUtils && $$slots.utils} diff --git a/packages/presentation/src/utils.ts b/packages/presentation/src/utils.ts index eb86633c8e..b94076d6d3 100644 --- a/packages/presentation/src/utils.ts +++ b/packages/presentation/src/utils.ts @@ -626,7 +626,7 @@ export async function getAttributeEditor ( function filterKeys (hierarchy: Hierarchy, keys: KeyedAttribute[], ignoreKeys: string[]): KeyedAttribute[] { const docKeys: Set = new Set(hierarchy.getAllAttributes(core.class.AttachedDoc).keys()) - keys = keys.filter((k) => !docKeys.has(k.key)) + keys = keys.filter((k) => !docKeys.has(k.key) || k.attr.editor !== undefined) keys = keys.filter((k) => !ignoreKeys.includes(k.key)) return keys } diff --git a/packages/ui/src/components/Panel.svelte b/packages/ui/src/components/Panel.svelte index 066d2bcd97..a282ce1d8c 100644 --- a/packages/ui/src/components/Panel.svelte +++ b/packages/ui/src/components/Panel.svelte @@ -309,6 +309,11 @@ {/if} + {#if $$slots['panel-footer']} + + {/if} diff --git a/packages/ui/src/popups.ts b/packages/ui/src/popups.ts index 8d475609fc..d5447490e5 100644 --- a/packages/ui/src/popups.ts +++ b/packages/ui/src/popups.ts @@ -372,7 +372,8 @@ export function fitPopupElement ( newProps.right = '1px' show = true } else if (element === 'full-centered') { - newProps.top = '20px' + const rect = contentPanel !== undefined ? contentPanel.getBoundingClientRect() : { top: 0 } + newProps.top = `${Math.max(20, rect.top + 1)}px` newProps.bottom = '20px' newProps.left = '20px' newProps.right = '20px' diff --git a/plugins/activity-resources/src/components/ActivityExtension.svelte b/plugins/activity-resources/src/components/ActivityExtension.svelte index d79034a5ef..908bd5a16d 100644 --- a/plugins/activity-resources/src/components/ActivityExtension.svelte +++ b/plugins/activity-resources/src/components/ActivityExtension.svelte @@ -24,5 +24,11 @@ {#if extension} - + {/if} diff --git a/plugins/activity-resources/src/components/doc-update-message/attributes/SetAttributesPresenter.svelte b/plugins/activity-resources/src/components/doc-update-message/attributes/SetAttributesPresenter.svelte index e50a586b7a..222ec50551 100644 --- a/plugins/activity-resources/src/components/doc-update-message/attributes/SetAttributesPresenter.svelte +++ b/plugins/activity-resources/src/components/doc-update-message/attributes/SetAttributesPresenter.svelte @@ -30,7 +30,7 @@ $: attrViewletConfig = viewlet?.config?.[attributeModel.key] $: attributeIcon = attrViewletConfig?.icon ?? attributeModel.icon ?? IconEdit - $: isUnset = values.length > 0 && !values.some((value) => value !== null && value !== '') + $: isUnset = values.length > 0 && !values.some((value) => value != null && value !== '') $: isTextType = getIsTextType(attributeModel) @@ -42,7 +42,7 @@ {#if isUnset} -
+