From 315f39092032b265b9aa089a4fe67865330825f8 Mon Sep 17 00:00:00 2001 From: Artyom Savchenko Date: Fri, 13 Feb 2026 17:30:43 +0700 Subject: [PATCH] Add ability to copy all data from cards/docs tables (#10505) Signed-off-by: Artem Savchenko --- common/config/rush/pnpm-lock.yaml | 32 +++++++++- models/card/src/index.ts | 54 ++++++++++++++++ models/card/src/plugin.ts | 8 ++- models/controlled-documents/src/index.ts | 34 +++++++--- models/controlled-documents/src/plugin.ts | 13 ++-- models/recruit/src/index.ts | 9 ++- models/recruit/src/plugin.ts | 6 +- models/tracker/src/index.ts | 11 ++++ models/tracker/src/plugin.ts | 5 +- models/view/src/index.ts | 37 +++++++++-- models/workbench/src/index.ts | 28 ++------- plugins/converter-resources/.eslintrc.js | 7 +-- plugins/converter-resources/.prettierrc | 22 +++++++ plugins/converter-resources/package.json | 27 ++++---- plugins/converter-resources/postcss.config.js | 5 ++ .../src/__tests__/copyAsMarkdownTable.test.ts | 3 +- .../components/CopyAsMarkdownButton.svelte | 46 ++++++++++++++ .../src/data/relationshipBuilder.ts | 8 +-- plugins/converter-resources/src/index.ts | 4 ++ .../src/markdown/tableBuilder.ts | 10 ++- plugins/converter-resources/svelte.config.js | 10 +++ plugins/converter-resources/tsconfig.json | 5 +- plugins/converter/package.json | 4 +- plugins/converter/src/plugin.ts | 9 +++ .../src/components/issues/IssuesView.svelte | 1 + plugins/view-assets/lang/cs.json | 1 + plugins/view-assets/lang/de.json | 1 + plugins/view-assets/lang/en.json | 1 + plugins/view-assets/lang/es.json | 1 + plugins/view-assets/lang/fr.json | 1 + plugins/view-assets/lang/it.json | 1 + plugins/view-assets/lang/ja.json | 1 + plugins/view-assets/lang/pt-br.json | 1 + plugins/view-assets/lang/pt.json | 1 + plugins/view-assets/lang/ru.json | 1 + plugins/view-assets/lang/tr.json | 1 + plugins/view-assets/lang/zh.json | 1 + .../src/components/RelationshipTable.svelte | 56 ++++++++++------- .../src/components/SpaceHeader.svelte | 17 ++++- .../src/components/ViewletPanelHeader.svelte | 16 ++++- plugins/view-resources/src/index.ts | 1 + .../view-resources/src/viewletContextStore.ts | 2 + plugins/view-resources/src/viewletUtils.ts | 63 +++++++++++++++++++ plugins/view/src/index.ts | 6 +- plugins/view/src/types.ts | 19 ++++++ .../src/components/SpecialView.svelte | 14 ++--- plugins/workbench/src/index.ts | 1 - plugins/workbench/src/plugin.ts | 5 +- plugins/workbench/src/types.ts | 27 +------- 49 files changed, 491 insertions(+), 146 deletions(-) create mode 100644 plugins/converter-resources/.prettierrc create mode 100644 plugins/converter-resources/postcss.config.js create mode 100644 plugins/converter-resources/src/components/CopyAsMarkdownButton.svelte create mode 100644 plugins/converter-resources/svelte.config.js create mode 100644 plugins/view-resources/src/viewletUtils.ts diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 7da6d5f66e..92d7848f7b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -19017,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 @@ -19090,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 @@ -19118,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 diff --git a/models/card/src/index.ts b/models/card/src/index.ts index b3a3a59426..25f0c60e2d 100644 --- a/models/card/src/index.ts +++ b/models/card/src/index.ts @@ -728,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 1db60f2a06..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,7 +21,6 @@ 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' @@ -44,6 +44,12 @@ 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, 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/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/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/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} + +