diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 0c2da87ce8..31464f8849 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -6857,6 +6857,9 @@ importers: '@hcengineering/model-guest': specifier: workspace:^0.7.0 version: link:../guest + '@hcengineering/model-notification': + specifier: workspace:^0.7.0 + version: link:../notification '@hcengineering/model-preference': specifier: workspace:^0.7.0 version: link:../preference @@ -6872,6 +6875,9 @@ importers: '@hcengineering/model-workbench': specifier: workspace:^0.7.0 version: link:../workbench + '@hcengineering/notification': + specifier: workspace:^0.7.0 + version: link:../../plugins/notification '@hcengineering/platform': specifier: workspace:^0.7.19 version: link:../../foundations/core/packages/platform @@ -10425,6 +10431,9 @@ importers: '@hcengineering/server-core': specifier: workspace:^0.7.18 version: link:../../foundations/server/packages/core + '@hcengineering/server-notification': + specifier: workspace:^0.7.0 + version: link:../../server-plugins/notification devDependencies: '@hcengineering/platform-rig': specifier: workspace:^0.7.19 @@ -19008,6 +19017,12 @@ importers: '@hcengineering/platform': specifier: workspace:^0.7.19 version: link:../../foundations/core/packages/platform + '@hcengineering/presentation': + specifier: workspace:^0.7.0 + version: link:../../packages/presentation + '@hcengineering/ui': + specifier: workspace:^0.7.0 + version: link:../../packages/ui '@hcengineering/view': specifier: workspace:^0.7.0 version: link:../view @@ -19081,6 +19096,9 @@ importers: '@hcengineering/view-resources': specifier: workspace:^0.7.0 version: link:../view-resources + svelte: + specifier: ^4.2.20 + version: 4.2.20 devDependencies: '@hcengineering/platform-rig': specifier: workspace:^0.7.19 @@ -19109,15 +19127,36 @@ importers: eslint-plugin-promise: specifier: ^6.1.1 version: 6.6.0(eslint@8.57.1) + eslint-plugin-svelte: + specifier: ^2.35.1 + version: 2.46.1(eslint@8.57.1)(svelte@4.2.20)(ts-node@10.9.2(@swc/core@1.15.1)(@types/node@22.19.0)(typescript@5.9.3)) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@swc/core@1.15.1)(@types/node@22.19.0)(typescript@5.9.3)) prettier: specifier: ^3.6.2 version: 3.6.2 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.4.0(prettier@3.6.2)(svelte@4.2.20) + sass: + specifier: ^1.80.0 + version: 1.93.3 + svelte-check: + specifier: ^3.6.9 + version: 3.8.6(@babel/core@7.28.5)(postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.1)(@types/node@22.19.0)(typescript@5.9.3)))(postcss@8.5.6)(sass@1.93.3)(svelte@4.2.20) + svelte-eslint-parser: + specifier: ^0.33.1 + version: 0.33.1(svelte@4.2.20) + svelte-loader: + specifier: ^3.2.0 + version: 3.2.4(svelte@4.2.20) + svelte-preprocess: + specifier: ^5.1.4 + version: 5.1.4(@babel/core@7.28.5)(postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.1)(@types/node@22.19.0)(typescript@5.9.3)))(postcss@8.5.6)(sass@1.93.3)(svelte@4.2.20)(typescript@5.9.3) ts-jest: specifier: ^29.1.1 - version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@30.2.0)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@29.7.0)(typescript@5.9.3) + version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@30.2.0)(babel-jest@29.7.0(@babel/core@7.28.5))(esbuild@0.25.12)(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@swc/core@1.15.1)(@types/node@22.19.0)(typescript@5.9.3)))(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -32222,6 +32261,9 @@ importers: '@hcengineering/server-core': specifier: workspace:^0.7.18 version: link:../../foundations/server/packages/core + '@hcengineering/server-notification': + specifier: workspace:^0.7.0 + version: link:../notification devDependencies: '@hcengineering/platform-rig': specifier: workspace:^0.7.19 @@ -36536,6 +36578,12 @@ importers: '@hcengineering/drive-assets': specifier: workspace:^0.7.0 version: link:../../plugins/drive-assets + '@hcengineering/export': + specifier: workspace:^0.7.0 + version: link:../../plugins/export + '@hcengineering/export-assets': + specifier: workspace:^0.7.0 + version: link:../../plugins/export-assets '@hcengineering/github': specifier: workspace:^0.7.0 version: link:../../services/github/github diff --git a/models/card/package.json b/models/card/package.json index 833ff66d01..72ce95c6fb 100644 --- a/models/card/package.json +++ b/models/card/package.json @@ -40,6 +40,8 @@ "@hcengineering/converter": "workspace:^0.7.0", "@hcengineering/core": "workspace:^0.7.24", "@hcengineering/model": "workspace:^0.7.17", + "@hcengineering/notification": "workspace:^0.7.0", + "@hcengineering/model-notification": "workspace:^0.7.0", "@hcengineering/chunter": "workspace:^0.7.0", "@hcengineering/model-setting": "workspace:^0.7.0", "@hcengineering/model-view": "workspace:^0.7.0", diff --git a/models/card/src/index.ts b/models/card/src/index.ts index e156dbeb84..25f0c60e2d 100644 --- a/models/card/src/index.ts +++ b/models/card/src/index.ts @@ -84,6 +84,7 @@ import { type BuildModelKey } from '@hcengineering/view' import { createActions } from './actions' import { definePermissions } from './permissions' import card from './plugin' +import notification from '@hcengineering/notification' export { cardId } from '@hcengineering/card' @@ -149,6 +150,9 @@ export class TCard extends TDoc implements Card { @Hidden() @ReadOnly() peerId?: string + + @Prop(Collection(chunter.class.ChatMessage), chunter.string.Comments) + comments?: number } @Model(card.class.CardSpace, core.class.TypedSpace, DOMAIN_SPACE) @@ -445,6 +449,47 @@ export function createModel (builder: Builder): void { PaletteColorIndexes.Arctic ) + builder.createDoc( + notification.class.NotificationGroup, + core.space.Model, + { + label: card.string.Card, + icon: card.icon.Card + }, + card.ids.CardNotificationGroup + ) + + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: false, + generated: false, + label: card.string.CardUpdated, + group: card.ids.CardNotificationGroup, + txClasses: [core.class.TxUpdateDoc, core.class.TxMixin], + objectClass: card.class.Card, + defaultEnabled: false + }, + card.ids.CardNotification + ) + + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: false, + generated: false, + label: chunter.string.Comments, + group: card.ids.CardNotificationGroup, + txClasses: [core.class.TxCreateDoc], + objectClass: chunter.class.ChatMessage, + attachedToClass: card.class.Card, + defaultEnabled: true + }, + card.ids.CardMessageNotification + ) + builder.createDoc(view.class.Viewlet, core.space.Model, { attachTo: card.class.CardSpace, descriptor: view.viewlet.Table, @@ -683,6 +728,60 @@ export function createModel (builder: Builder): void { card.viewlet.CardRelationshipTable ) + builder.createDoc( + presentation.class.ComponentPointExtension, + core.space.Model, + { + extension: converter.extensions.CopyAsMarkdownAction, + component: converter.component.CopyAsMarkdownButton + }, + converter.extensions.CopyAsMarkdownButton + ) + + builder.createDoc( + view.class.ViewletViewAction, + core.space.Model, + { + descriptor: view.viewlet.RelationshipTable, + extension: converter.extensions.CopyAsMarkdownAction, + applicableToClass: card.class.Card + }, + card.specialViewAction.CardRelationshipTable + ) + + builder.createDoc( + view.class.ViewletViewAction, + core.space.Model, + { + descriptor: view.viewlet.Table, + extension: converter.extensions.CopyAsMarkdownAction, + applicableToClass: card.class.Card + }, + card.specialViewAction.CardTable + ) + + builder.createDoc( + view.class.ViewletViewAction, + core.space.Model, + { + descriptor: view.viewlet.Table, + extension: converter.extensions.CopyAsMarkdownAction, + applicableToClass: card.class.Card + }, + card.specialViewAction.CopyAsMarkdownTable + ) + + builder.createDoc( + view.class.ViewletViewAction, + core.space.Model, + { + descriptor: view.viewlet.RelationshipTable, + extension: converter.extensions.CopyAsMarkdownAction, + applicableToClass: card.class.Card + }, + card.specialViewAction.CopyAsMarkdownRelationshipTable + ) + builder.mixin(card.class.Card, core.class.Class, view.mixin.ObjectPresenter, { presenter: card.component.CardPresenter }) diff --git a/models/card/src/plugin.ts b/models/card/src/plugin.ts index b17913c44c..09c392a755 100644 --- a/models/card/src/plugin.ts +++ b/models/card/src/plugin.ts @@ -13,6 +13,7 @@ // limitations under the License. // +import type { ViewletViewAction, Action, ActionCategory, ViewAction } from '@hcengineering/view' import { type Card, cardId } from '@hcengineering/card' import card from '@hcengineering/card-resources/src/plugin' import type { Client, Doc, Ref } from '@hcengineering/core' @@ -20,8 +21,8 @@ import {} from '@hcengineering/core' import { mergeIds, type Resource } from '@hcengineering/platform' import { type TagCategory } from '@hcengineering/tags' import { type Location, type ResolvedLocation } from '@hcengineering/ui/src/types' -import { type Action, type ActionCategory, type ViewAction } from '@hcengineering/view' import { type LocationData } from '@hcengineering/workbench' +import { type NotificationGroup, type NotificationType } from '@hcengineering/notification' export default mergeIds(cardId, card, { app: { @@ -43,10 +44,19 @@ export default mergeIds(cardId, card, { Card: '' as Ref, Labels: '' as Ref }, + specialViewAction: { + CardRelationshipTable: '' as Ref, + CardTable: '' as Ref, + CopyAsMarkdownTable: '' as Ref, + CopyAsMarkdownRelationshipTable: '' as Ref + }, ids: { MasterTags: '' as Ref, ManageMasterTags: '' as Ref, - TagRelations: '' as Ref + TagRelations: '' as Ref, + CardNotificationGroup: '' as Ref, + CardNotification: '' as Ref, + CardMessageNotification: '' as Ref }, resolver: { Location: '' as Resource<(loc: Location) => Promise>, diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index d5954e059c..1268bf8c0c 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -21,6 +21,7 @@ import documentsPlugin, { DocumentState, type Document, type DocumentSpace, + type DocumentTemplate, type ProjectDocument, type ChangeControl, type DocumentRequest @@ -43,7 +44,7 @@ import setting from '@hcengineering/setting' import tags from '@hcengineering/tags' import textEditor from '@hcengineering/text-editor' -import { AccountRole, type ClassCollaborators, type Class, type Doc, type Ref } from '@hcengineering/core' +import { AccountRole, type ClassCollaborators, type Class, type Doc, type Lookup, type Ref } from '@hcengineering/core' import { type Action } from '@hcengineering/view' import { definePermissions } from './permissions' import documents from './plugin' @@ -255,6 +256,11 @@ export function createModel (builder: Builder): void { ) // Workflow + const documentTableLookup: Lookup = { + owner: contact.mixin.Employee, + category: documents.class.DocumentCategory, + template: documents.mixin.DocumentTemplate + } builder.createDoc( view.class.Viewlet, core.space.Model, @@ -308,16 +314,27 @@ export function createModel (builder: Builder): void { 'modifiedOn' ], options: { - lookup: { - owner: contact.mixin.Employee, - category: documents.class.DocumentCategory, - template: documents.mixin.DocumentTemplate - } + lookup: documentTableLookup } }, documents.viewlet.TableDocument ) + builder.createDoc( + view.class.ViewletViewAction, + core.space.Model, + { + descriptor: view.viewlet.Table, + extension: converter.extensions.CopyAsMarkdownAction, + applicableToClass: documents.class.Document + }, + documents.specialViewAction.TableDocument + ) + + const documentTemplateTableLookup: Lookup = { + owner: contact.mixin.Employee, + category: documents.class.DocumentCategory + } builder.createDoc( view.class.Viewlet, core.space.Model, @@ -367,10 +384,7 @@ export function createModel (builder: Builder): void { hiddenKeys: ['attachedTo'] }, options: { - lookup: { - owner: contact.mixin.Employee, - category: documents.class.DocumentCategory - } + lookup: documentTemplateTableLookup } }, documents.viewlet.TableDocumentTemplate diff --git a/models/controlled-documents/src/plugin.ts b/models/controlled-documents/src/plugin.ts index e0b5eca013..b82f64e56a 100644 --- a/models/controlled-documents/src/plugin.ts +++ b/models/controlled-documents/src/plugin.ts @@ -20,7 +20,7 @@ import { type ObjectSearchCategory, type ObjectSearchFactory } from '@hcengineer import { mergeIds, type Resource } from '@hcengineering/platform' import { type TagCategory } from '@hcengineering/tags' import { type AnyComponent } from '@hcengineering/ui/src/types' -import { type ActionCategory, type ViewAction } from '@hcengineering/view' +import type { ActionCategory, ViewAction, Viewlet, ViewletViewAction } from '@hcengineering/view' import { type NotificationType, type NotificationGroup } from '@hcengineering/notification' import { type TextActionVisibleFunction, type TextActionFunction } from '@hcengineering/text-editor' @@ -78,11 +78,14 @@ export default mergeIds(documentsId, documents, { TransferDocument: '' as ViewAction, EditDocSpace: '' as ViewAction }, + specialViewAction: { + TableDocument: '' as Ref + }, viewlet: { - TableDocument: '' as Ref, - ListDocument: '' as Ref, - TableDocumentTemplate: '' as Ref, - TableDocumentDomain: '' as Ref + TableDocument: '' as Ref, + ListDocument: '' as Ref, + TableDocumentTemplate: '' as Ref, + TableDocumentDomain: '' as Ref }, notification: { DocumentsNotificationGroup: '' as Ref, diff --git a/models/export/src/index.ts b/models/export/src/index.ts index 05cb3384b1..14fc130562 100644 --- a/models/export/src/index.ts +++ b/models/export/src/index.ts @@ -89,7 +89,12 @@ export function createModel (builder: Builder): void { group: exportPlugin.ids.ImportNotificationGroup, txClasses: [], objectClass: exportPlugin.class.ExportResultRecord, - defaultEnabled: true + defaultEnabled: true, + templates: { + textTemplate: '{body}', + htmlTemplate: '

{body}

{link}

', + subjectTemplate: '{title}' + } }, exportPlugin.ids.ImportedDocumentsNotification ) diff --git a/models/recruit/src/index.ts b/models/recruit/src/index.ts index 1764fd6050..c210f996b7 100644 --- a/models/recruit/src/index.ts +++ b/models/recruit/src/index.ts @@ -323,14 +323,13 @@ export function createModel (builder: Builder): void { } } builder.createDoc( - workbench.class.ViewletSpecialViewAction, + view.class.ViewletViewAction, core.space.Model, { - attachedTo: recruit.viewlet.TableCandidate, - attachedToClass: view.class.Viewlet, - collection: 'specialViewActions', + descriptor: view.viewlet.Table, extension: workbench.extensions.SpecialViewAction, - config: tableCandidateExportConfig + config: tableCandidateExportConfig, + applicableToClass: recruit.mixin.Candidate }, recruit.specialViewAction.TableCandidate ) diff --git a/models/recruit/src/plugin.ts b/models/recruit/src/plugin.ts index 729bfc5be2..1d5e2c9547 100644 --- a/models/recruit/src/plugin.ts +++ b/models/recruit/src/plugin.ts @@ -23,14 +23,14 @@ import { recruitId } from '@hcengineering/recruit' import recruit from '@hcengineering/recruit-resources/src/plugin' import { type ProjectType, type TaskTypeDescriptor } from '@hcengineering/task' import type { AnyComponent, Location } from '@hcengineering/ui/src/types' -import type { ViewletSpecialViewAction } from '@hcengineering/workbench' import type { Action, ActionCategory, ViewAction, ViewActionAvailabilityFunction, ViewQueryAction, - Viewlet + Viewlet, + ViewletViewAction } from '@hcengineering/view' export default mergeIds(recruitId, recruit, { @@ -134,7 +134,7 @@ export default mergeIds(recruitId, recruit, { DefaultVacancy: '' as Ref }, specialViewAction: { - TableCandidate: '' as Ref + TableCandidate: '' as Ref }, viewlet: { TableCandidate: '' as Ref, diff --git a/models/server-card/package.json b/models/server-card/package.json index c36b9bf3cd..909cfadf07 100644 --- a/models/server-card/package.json +++ b/models/server-card/package.json @@ -39,6 +39,7 @@ "@hcengineering/platform": "workspace:^0.7.19", "@hcengineering/card": "workspace:^0.7.0", "@hcengineering/communication": "workspace:^0.7.0", + "@hcengineering/server-notification": "workspace:^0.7.0", "@hcengineering/server-card": "workspace:^0.7.0", "@hcengineering/server-core": "workspace:^0.7.18" } diff --git a/models/server-card/src/index.ts b/models/server-card/src/index.ts index 9008fbee70..e5c66f5417 100644 --- a/models/server-card/src/index.ts +++ b/models/server-card/src/index.ts @@ -20,6 +20,7 @@ import serverCore from '@hcengineering/server-core' import serverCard from '@hcengineering/server-card' import card from '@hcengineering/card' import communication from '@hcengineering/communication' +import serverNotification from '@hcengineering/server-notification' export { serverCardId } from '@hcengineering/server-card' @@ -129,4 +130,8 @@ export function createModel (builder: Builder): void { }, title: [['title']] }) + + builder.mixin(card.class.Card, core.class.Class, serverNotification.mixin.TextPresenter, { + presenter: serverCard.function.CardTextPresenter + }) } diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index 26558b5c57..1f45a0e400 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -487,6 +487,17 @@ export function createModel (builder: Builder): void { defineViewlets(builder) + builder.createDoc( + view.class.ViewletViewAction, + core.space.Model, + { + descriptor: view.viewlet.List, + extension: converter.extensions.CopyAsMarkdownAction, + applicableToClass: tracker.class.Issue + }, + tracker.specialViewAction.IssueList + ) + const issuesId = 'issues' const componentsId = 'components' const milestonesId = 'milestones' diff --git a/models/tracker/src/plugin.ts b/models/tracker/src/plugin.ts index 9c84de8eac..4c27d0a153 100644 --- a/models/tracker/src/plugin.ts +++ b/models/tracker/src/plugin.ts @@ -22,7 +22,7 @@ import { type ProjectType } from '@hcengineering/task' import { trackerId } from '@hcengineering/tracker' import tracker from '@hcengineering/tracker-resources/src/plugin' import type { AnyComponent } from '@hcengineering/ui/src/types' -import { type Action, type ViewAction, type Viewlet } from '@hcengineering/view' +import { type Action, type ViewAction, type Viewlet, type ViewletViewAction } from '@hcengineering/view' import { type Application } from '@hcengineering/workbench' export default mergeIds(trackerId, tracker, { @@ -63,6 +63,9 @@ export default mergeIds(trackerId, tracker, { app: { Tracker: '' as Ref }, + specialViewAction: { + IssueList: '' as Ref + }, viewlet: { IssueList: '' as Ref, IssueTemplateList: '' as Ref, diff --git a/models/view/src/index.ts b/models/view/src/index.ts index e92af38b33..d0afec43fc 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -29,12 +29,17 @@ import { type Ref, type Space } from '@hcengineering/core' -import { type Builder, Mixin, Model, UX } from '@hcengineering/model' +import { type Builder, Mixin, Model, Prop, TypeRecord, TypeRef, TypeString, UX } from '@hcengineering/model' import core, { TClass, TDoc } from '@hcengineering/model-core' import preference, { TPreference } from '@hcengineering/model-preference' import presentation from '@hcengineering/model-presentation' -import { type Asset, type IntlString, type Resource, type Status } from '@hcengineering/platform' -import { type AnyComponent, type LabelAndProps, type Location } from '@hcengineering/ui/src/types' +import { type Asset, getEmbeddedLabel, type IntlString, type Resource, type Status } from '@hcengineering/platform' +import { + type AnyComponent, + type ComponentExtensionId, + type LabelAndProps, + type Location +} from '@hcengineering/ui/src/types' import { type TypeEditor, type Action, @@ -99,7 +104,8 @@ import { type ViewOptionsModel, type Viewlet, type ViewletDescriptor, - type ViewletPreference + type ViewletPreference, + type ViewletViewAction } from '@hcengineering/view' import view from './plugin' @@ -318,6 +324,28 @@ export class TViewletDescriptor extends TDoc implements ViewletDescriptor { label!: IntlString } +@Model(view.class.ViewletViewAction, core.class.Doc, DOMAIN_MODEL) +@UX(view.string.ViewletViewAction) +export class TViewletViewAction extends TDoc implements ViewletViewAction { + @Prop(TypeRef(view.class.Viewlet), getEmbeddedLabel('Viewlet')) + declare viewlet?: Ref + + @Prop(TypeRef(view.class.ViewletDescriptor), getEmbeddedLabel('Descriptor')) + declare descriptor?: Ref + + @Prop(TypeString(), getEmbeddedLabel('Extension')) + declare extension: ComponentExtensionId + + @Prop(TypeRecord(), getEmbeddedLabel('Config')) + declare config?: Record + + @Prop(TypeRef(core.class.Class), getEmbeddedLabel('ApplicableToClass')) + declare applicableToClass?: Ref> + + @Prop(TypeRef(core.class.Class), getEmbeddedLabel('DisabledForClass')) + declare disabledForClass?: Ref> +} + @Model(view.class.Viewlet, core.class.Doc, DOMAIN_MODEL) export class TViewlet extends TDoc implements Viewlet { attachTo!: Ref> @@ -472,6 +500,7 @@ export function createModel (builder: Builder): void { TViewletPreference, TViewletDescriptor, TViewlet, + TViewletViewAction, TAction, TActionCategory, TObjectValidator, diff --git a/models/workbench/src/index.ts b/models/workbench/src/index.ts index b2c2fa7c1f..a23d9ba355 100644 --- a/models/workbench/src/index.ts +++ b/models/workbench/src/index.ts @@ -14,26 +14,25 @@ // import { AccountRole, type AccountUuid, type Class, DOMAIN_MODEL, type Ref, type Space } from '@hcengineering/core' -import { type Builder, Mixin, Model, Prop, TypeRecord, TypeRef, TypeString, UX } from '@hcengineering/model' +import { type Builder, Mixin, Model, Prop, TypeRef, UX } from '@hcengineering/model' import preference, { TPreference } from '@hcengineering/model-preference' import { createAction } from '@hcengineering/model-view' -import core, { TAttachedDoc, TClass, TDoc } from '@hcengineering/model-core' +import core, { TClass, TDoc } from '@hcengineering/model-core' import { type Asset, getEmbeddedLabel, type IntlString, type Resource } from '@hcengineering/platform' -import view, { type KeyBinding, type Viewlet } from '@hcengineering/view' +import view, { type KeyBinding } from '@hcengineering/view' import type { Application, ApplicationNavModel, HiddenApplication, SpaceView, ViewConfiguration, - ViewletSpecialViewAction, Widget, WidgetPreference, WidgetTab, WidgetType, WorkbenchTab } from '@hcengineering/workbench' -import { type AnyComponent, type ComponentExtensionId } from '@hcengineering/ui/src/types' +import { type AnyComponent } from '@hcengineering/ui/src/types' import presentation from '@hcengineering/model-presentation' import workbench from './plugin' @@ -106,29 +105,10 @@ export class TWorkbenchTab extends TPreference implements WorkbenchTab { isPinned!: boolean } -@Model(workbench.class.ViewletSpecialViewAction, core.class.AttachedDoc, DOMAIN_MODEL) -@UX(workbench.string.ViewletSpecialViewAction) -export class TViewletSpecialViewAction extends TAttachedDoc implements ViewletSpecialViewAction { - @Prop(TypeRef(view.class.Viewlet), core.string.AttachedTo) - declare attachedTo: Ref - - @Prop(TypeRef(view.class.Viewlet), core.string.AttachedToClass) - declare attachedToClass: Ref> - - override collection: 'specialViewActions' = 'specialViewActions' - - @Prop(TypeString(), getEmbeddedLabel('Extension')) - declare extension: ComponentExtensionId - - @Prop(TypeRecord(), getEmbeddedLabel('Config')) - declare config?: Record -} - export function createModel (builder: Builder): void { builder.createModel( TApplication, TSpaceView, - TViewletSpecialViewAction, THiddenApplication, TApplicationNavModel, TWidget, diff --git a/plugins/card-assets/lang/cs.json b/plugins/card-assets/lang/cs.json index df3b9dec1d..c66e477bd6 100644 --- a/plugins/card-assets/lang/cs.json +++ b/plugins/card-assets/lang/cs.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Chcete vytvořit novou verzi?", "RelationCopyDescr": "Které vztahy chcete zkopírovat?", "Import": "Importovat", - "Export": "Exportovat" + "Export": "Exportovat", + "CardUpdated": "Karta aktualizována" } } diff --git a/plugins/card-assets/lang/de.json b/plugins/card-assets/lang/de.json index 374ffea2c1..1524d538ea 100644 --- a/plugins/card-assets/lang/de.json +++ b/plugins/card-assets/lang/de.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Möchten Sie eine neue Version erstellen?", "RelationCopyDescr": "Welche Beziehungen möchten Sie kopieren?", "Import": "Importieren", - "Export": "Exportieren" + "Export": "Exportieren", + "CardUpdated": "Karte aktualisiert" } } diff --git a/plugins/card-assets/lang/en.json b/plugins/card-assets/lang/en.json index fc1defaaf4..b3eb41e468 100644 --- a/plugins/card-assets/lang/en.json +++ b/plugins/card-assets/lang/en.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Do you want to create a new version?", "RelationCopyDescr": "Which relations do you want to copy?", "Import": "Import", - "Export": "Export" + "Export": "Export", + "CardUpdated": "Card updated" } } diff --git a/plugins/card-assets/lang/es.json b/plugins/card-assets/lang/es.json index 773fe047c1..ac1f754c3b 100644 --- a/plugins/card-assets/lang/es.json +++ b/plugins/card-assets/lang/es.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "¿Desea crear una nueva versión?", "RelationCopyDescr": "¿Qué relaciones quieres copiar?", "Import": "Importar", - "Export": "Exportar" + "Export": "Exportar", + "CardUpdated": "Tarjeta actualizada" } } diff --git a/plugins/card-assets/lang/fr.json b/plugins/card-assets/lang/fr.json index 04d85431f1..0a4867c3af 100644 --- a/plugins/card-assets/lang/fr.json +++ b/plugins/card-assets/lang/fr.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Voulez-vous créer une nouvelle version ?", "RelationCopyDescr": "Quelles relations souhaitez-vous copier ?", "Import": "Importer", - "Export": "Exporter" + "Export": "Exporter", + "CardUpdated": "Carte mise à jour" } } diff --git a/plugins/card-assets/lang/it.json b/plugins/card-assets/lang/it.json index d06a1e04b7..98976f5e50 100644 --- a/plugins/card-assets/lang/it.json +++ b/plugins/card-assets/lang/it.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Vuoi creare una nuova versione?", "RelationCopyDescr": "Quali relazioni vuoi copiare?", "Import": "Importa", - "Export": "Esporta" + "Export": "Esporta", + "CardUpdated": "Scheda aggiornata" } } diff --git a/plugins/card-assets/lang/ja.json b/plugins/card-assets/lang/ja.json index 2fbe52c9f7..5b18951fe0 100644 --- a/plugins/card-assets/lang/ja.json +++ b/plugins/card-assets/lang/ja.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "新しいバージョンを作成しますか?", "RelationCopyDescr": "どの関連をコピーしますか?", "Import": "インポート", - "Export": "エクスポート" + "Export": "エクスポート", + "CardUpdated": "カードが更新されました" } } diff --git a/plugins/card-assets/lang/pt-br.json b/plugins/card-assets/lang/pt-br.json index 4347f3427f..c2148a4c4b 100644 --- a/plugins/card-assets/lang/pt-br.json +++ b/plugins/card-assets/lang/pt-br.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Deseja criar uma nova versão?", "RelationCopyDescr": "Quais relações você deseja copiar?", "Import": "Importar", - "Export": "Exportar" + "Export": "Exportar", + "CardUpdated": "Cartão atualizado" } } diff --git a/plugins/card-assets/lang/pt.json b/plugins/card-assets/lang/pt.json index 4347f3427f..c2148a4c4b 100644 --- a/plugins/card-assets/lang/pt.json +++ b/plugins/card-assets/lang/pt.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Deseja criar uma nova versão?", "RelationCopyDescr": "Quais relações você deseja copiar?", "Import": "Importar", - "Export": "Exportar" + "Export": "Exportar", + "CardUpdated": "Cartão atualizado" } } diff --git a/plugins/card-assets/lang/ru.json b/plugins/card-assets/lang/ru.json index c5e0a3bf59..98ef2647ba 100644 --- a/plugins/card-assets/lang/ru.json +++ b/plugins/card-assets/lang/ru.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Вы хотите создать новую версию?", "RelationCopyDescr": "Какие связи вы хотите скопировать?", "Import": "Импортировать", - "Export": "Экспортировать" + "Export": "Экспортировать", + "CardUpdated": "Карточка обновлена" } } diff --git a/plugins/card-assets/lang/tr.json b/plugins/card-assets/lang/tr.json index 89c08295b2..f0522bfaae 100644 --- a/plugins/card-assets/lang/tr.json +++ b/plugins/card-assets/lang/tr.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "Yeni bir sürüm oluşturmak istiyor musunuz?", "RelationCopyDescr": "Hangi ilişkileri kopyalamak istiyorsunuz?", "Import": "İçe aktar", - "Export": "Dışa aktar" + "Export": "Dışa aktar", + "CardUpdated": "Kart güncellendi" } } diff --git a/plugins/card-assets/lang/zh.json b/plugins/card-assets/lang/zh.json index c83eace50e..371a92de03 100644 --- a/plugins/card-assets/lang/zh.json +++ b/plugins/card-assets/lang/zh.json @@ -70,6 +70,7 @@ "NewVersionConfirmation": "您想创建一个新版本吗?", "RelationCopyDescr": "您想复制哪些关系?", "Import": "导入", - "Export": "导出" + "Export": "导出", + "CardUpdated": "卡片已更新" } } diff --git a/plugins/card-resources/src/plugin.ts b/plugins/card-resources/src/plugin.ts index bcc7d4c606..0ea733cab9 100644 --- a/plugins/card-resources/src/plugin.ts +++ b/plugins/card-resources/src/plugin.ts @@ -159,6 +159,7 @@ export default mergeIds(cardId, card, { ForbidUpdateCard: '' as IntlString, ForbidCreateCardPermission: '' as IntlString, ForbidAddTagPermission: '' as IntlString, - ForbidRemoveTag: '' as IntlString + ForbidRemoveTag: '' as IntlString, + CardUpdated: '' as IntlString } }) diff --git a/plugins/converter-resources/.eslintrc.js b/plugins/converter-resources/.eslintrc.js index 72235dc283..bb8fd7450d 100644 --- a/plugins/converter-resources/.eslintrc.js +++ b/plugins/converter-resources/.eslintrc.js @@ -1,7 +1,4 @@ module.exports = { - extends: ['./node_modules/@hcengineering/platform-rig/profiles/default/eslint.config.json'], - parserOptions: { - tsconfigRootDir: __dirname, - project: './tsconfig.json' - } + extends: ['./node_modules/@hcengineering/platform-rig/profiles/ui/eslint.config.json'], + parserOptions: { tsconfigRootDir: __dirname } } diff --git a/plugins/converter-resources/.prettierrc b/plugins/converter-resources/.prettierrc new file mode 100644 index 0000000000..792942803a --- /dev/null +++ b/plugins/converter-resources/.prettierrc @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "trailingComma": "none", + "tabWidth": 2, + "semi": false, + "singleQuote": true, + "printWidth": 120, + "useTabs": false, + "bracketSpacing": true, + "proseWrap": "preserve", + "plugins": [ + "prettier-plugin-svelte" + ], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} \ No newline at end of file diff --git a/plugins/converter-resources/package.json b/plugins/converter-resources/package.json index 73b221692f..733d874c75 100644 --- a/plugins/converter-resources/package.json +++ b/plugins/converter-resources/package.json @@ -1,21 +1,18 @@ { "name": "@hcengineering/converter-resources", "version": "0.7.0", - "main": "lib/index.js", + "main": "src/index.ts", "svelte": "src/index.ts", "types": "types/index.d.ts", - "files": [ - "lib/**/*", - "types/**/*", - "tsconfig.json" - ], "author": "Copyright © Hardcore Engineering Inc.", "license": "EPL-2.0", "scripts": { - "build": "compile", + "build": "compile ui", "format": "format src", - "build:watch": "compile", - "_phase:build": "compile transpile src", + "svelte-check": "do-svelte-check", + "_phase:svelte-check": "do-svelte-check", + "build:watch": "compile ui", + "_phase:build": "compile ui", "_phase:format": "format src", "_phase:validate": "compile validate", "_phase:test": "jest --passWithNoTests --silent", @@ -33,8 +30,15 @@ "typescript": "^5.9.3", "eslint": "^8.54.0", "jest": "^29.7.0", + "svelte-check": "^3.6.9", + "svelte-eslint-parser": "^0.33.1", + "svelte-loader": "^3.2.0", + "svelte-preprocess": "^5.1.4", "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5" + "@types/jest": "^29.5.5", + "sass": "^1.80.0", + "eslint-plugin-svelte": "^2.35.1", + "prettier-plugin-svelte": "^3.4.0" }, "dependencies": { "@hcengineering/platform": "workspace:^0.7.19", @@ -45,6 +49,7 @@ "@hcengineering/ui": "workspace:^0.7.0", "@hcengineering/theme": "workspace:^0.7.0", "@hcengineering/contact": "workspace:^0.7.0", - "@hcengineering/view-resources": "workspace:^0.7.0" + "@hcengineering/view-resources": "workspace:^0.7.0", + "svelte": "^4.2.20" } } diff --git a/plugins/converter-resources/postcss.config.js b/plugins/converter-resources/postcss.config.js new file mode 100644 index 0000000000..88752c6cb0 --- /dev/null +++ b/plugins/converter-resources/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: [ + require('autoprefixer') + ] +} diff --git a/plugins/converter-resources/src/__tests__/copyAsMarkdownTable.test.ts b/plugins/converter-resources/src/__tests__/copyAsMarkdownTable.test.ts index d962978a5d..a54f2b415d 100644 --- a/plugins/converter-resources/src/__tests__/copyAsMarkdownTable.test.ts +++ b/plugins/converter-resources/src/__tests__/copyAsMarkdownTable.test.ts @@ -13,7 +13,8 @@ // limitations under the License. // -import { buildMarkdownTableFromDocs, copyAsMarkdownTable, isIntlString } from '../index' +import { buildMarkdownTableFromDocs, copyAsMarkdownTable } from '../markdown' +import { isIntlString } from '../formatter' import type { Doc, Class, Ref } from '@hcengineering/core' import type { CopyAsMarkdownTableProps } from '../types' import { getClient } from '@hcengineering/presentation' diff --git a/plugins/converter-resources/src/components/CopyAsMarkdownButton.svelte b/plugins/converter-resources/src/components/CopyAsMarkdownButton.svelte new file mode 100644 index 0000000000..ff75df291c --- /dev/null +++ b/plugins/converter-resources/src/components/CopyAsMarkdownButton.svelte @@ -0,0 +1,46 @@ + + + +{#if hasData} + +