diff --git a/dev/base-image/build.sh b/dev/base-image/build.sh index af42996695..6d032cb5f6 100755 --- a/dev/base-image/build.sh +++ b/dev/base-image/build.sh @@ -4,6 +4,7 @@ VERSION=${VERSION:-"latest"} docker build -t hardcoreeng/base:${VERSION} -f base.Dockerfile ${DOCKER_EXTRA} . +docker build -t hardcoreeng/base-slim:${VERSION} -f slim.Dockerfile ${DOCKER_EXTRA} . docker build -t hardcoreeng/rekoni-base:${VERSION} -f rekoni.Dockerfile ${DOCKER_EXTRA} . docker build -t hardcoreeng/print-base:${VERSION} -f print.Dockerfile ${DOCKER_EXTRA} . docker build -t hardcoreeng/front-base:${VERSION} -f front.Dockerfile ${DOCKER_EXTRA} . diff --git a/dev/base-image/push.sh b/dev/base-image/push.sh index e1eb55d902..1669048454 100755 --- a/dev/base-image/push.sh +++ b/dev/base-image/push.sh @@ -4,6 +4,7 @@ VERSION=${VERSION:-"latest"} docker push hardcoreeng/base:${VERSION} +docker push hardcoreeng/base-slim:${VERSION} docker push hardcoreeng/rekoni-base:${VERSION} docker push hardcoreeng/print-base:${VERSION} docker push hardcoreeng/front-base:${VERSION} diff --git a/dev/base-image/slim.Dockerfile b/dev/base-image/slim.Dockerfile new file mode 100644 index 0000000000..03669c3aac --- /dev/null +++ b/dev/base-image/slim.Dockerfile @@ -0,0 +1,11 @@ +FROM node:22-slim + +RUN apt-get update +RUN apt-get install libjemalloc2 dumb-init +RUN apt-get clean + +ENV LD_PRELOAD=libjemalloc.so.2 +ENV MALLOC_CONF=dirty_decay_ms:1000,narenas:2,background_thread:true + +WORKDIR /usr/src/app +ENV NODE_ENV=production diff --git a/dev/import-tool/Dockerfile b/dev/import-tool/Dockerfile index c685273701..1ef74dadee 100644 --- a/dev/import-tool/Dockerfile +++ b/dev/import-tool/Dockerfile @@ -1,4 +1,4 @@ -FROM hardcoreeng/base:v20250310 +FROM hardcoreeng/base:v20250902 WORKDIR /usr/src/app COPY bundle/bundle.js ./ diff --git a/models/process/package.json b/models/process/package.json index 5631328f05..d2fde4d349 100644 --- a/models/process/package.json +++ b/models/process/package.json @@ -44,6 +44,7 @@ "@hcengineering/time": "^0.6.0", "@hcengineering/setting": "^0.6.17", "@hcengineering/model-time": "^0.6.0", + "@hcengineering/rank": "^0.6.4", "@hcengineering/process": "^0.6.0", "@hcengineering/process-resources": "^0.6.0", "@hcengineering/model-presentation": "^0.6.0", diff --git a/models/process/src/index.ts b/models/process/src/index.ts index 81e61e4178..9ca9b488d4 100644 --- a/models/process/src/index.ts +++ b/models/process/src/index.ts @@ -19,6 +19,7 @@ import core, { DOMAIN_MODEL, type Doc, type Domain, + type Rank, type Ref, SortingOrder, type Space, @@ -26,11 +27,13 @@ import core, { } from '@hcengineering/core' import { type Builder, + Hidden, Model, Prop, ReadOnly, TypeAny, TypeBoolean, + TypeRank, TypeRef, TypeString, UX @@ -134,6 +137,10 @@ export class TTransition extends TDoc implements Transition { triggerParams!: Record result?: TriggerResult | null + + @Prop(TypeRank(), core.string.Rank) + @Hidden() + rank!: Rank } @Model(process.class.ExecutionLog, core.class.Doc, DOMAIN_PROCESS_LOG) @@ -213,8 +220,16 @@ export class TMethod extends TDoc implements Method { @Model(process.class.State, core.class.Doc, DOMAIN_MODEL) export class TState extends TDoc implements State { - process!: Ref - title!: string + @Prop(TypeRef(process.class.Process), process.string.Process) + @ReadOnly() + process!: Ref + + @Prop(TypeString(), core.string.Name) + title!: string + + @Prop(TypeRank(), core.string.Rank) + @Hidden() + rank!: Rank } @Model(process.class.ProcessFunction, core.class.Doc, DOMAIN_MODEL) @@ -1086,7 +1101,8 @@ export function createModel (builder: Builder): void { presenter: process.component.ToDoSettingPresenter, requiredParams: ['_id'], checkFunction: process.triggerCheck.ToDo, - init: false + init: false, + auto: true }, process.trigger.OnToDoClose ) @@ -1101,7 +1117,8 @@ export function createModel (builder: Builder): void { presenter: process.component.ToDoSettingPresenter, requiredParams: ['_id'], checkFunction: process.triggerCheck.ToDo, - init: false + init: false, + auto: true }, process.trigger.OnToDoRemove ) diff --git a/models/process/src/migration.ts b/models/process/src/migration.ts index a93f5fcc2d..492f9a8ce5 100644 --- a/models/process/src/migration.ts +++ b/models/process/src/migration.ts @@ -13,7 +13,7 @@ // limitations under the License. // -import core, { type Client, type Doc, TxOperations } from '@hcengineering/core' +import core, { type Client, type Doc, type Rank, TxOperations } from '@hcengineering/core' import { type MigrateOperation, type MigrationClient, @@ -21,6 +21,7 @@ import { tryUpgrade } from '@hcengineering/model' import process, { type State, type Step } from '@hcengineering/process' +import { makeRank } from '@hcengineering/rank' import { processId } from '.' export const processOperation: MigrateOperation = { @@ -31,6 +32,11 @@ export const processOperation: MigrateOperation = { state: 'migrateActionsFromStates', mode: 'upgrade', func: migrateActionsFromStates + }, + { + state: 'fillStatesRanks', + mode: 'upgrade', + func: fillStatesRanks } ]) } @@ -40,6 +46,23 @@ interface OldState extends State { actions: Step[] } +async function fillStatesRanks (client: Client): Promise { + const txOp = new TxOperations(client, core.account.System) + const states = await client.findAll(process.class.State, { rank: { $exists: false } }) + let prevRank: Rank | undefined + for (const state of states) { + prevRank = makeRank(prevRank, undefined) + await txOp.update(state, { rank: prevRank }) + } + + const transitions = await client.findAll(process.class.Transition, { rank: { $exists: false } }) + prevRank = undefined + for (const transition of transitions) { + prevRank = makeRank(prevRank, undefined) + await txOp.update(transition, { rank: prevRank }) + } +} + async function migrateActionsFromStates (client: Client): Promise { const txOp = new TxOperations(client, core.account.System) const rollbackTransitions = await client.findAll(process.class.Transition, { to: null as any }) @@ -54,10 +77,12 @@ async function migrateActionsFromStates (client: Client): Promise { arr.push(transition) transitionsMap.set(transition.to, arr) } + let prevRank: Rank | undefined for (const state of states) { if (state.actions?.length > 0) { const transitions = transitionsMap.get(state._id) ?? [] if (transitions.length === 0) { + prevRank = makeRank(prevRank, undefined) await txOp.createDoc( process.class.Transition, core.space.Model, @@ -65,6 +90,7 @@ async function migrateActionsFromStates (client: Client): Promise { from: null, to: state._id, actions: state.actions, + rank: prevRank, trigger: process.trigger.OnExecutionStart, triggerParams: {}, process: state.process diff --git a/models/server-process/src/index.ts b/models/server-process/src/index.ts index 7a0d7238e8..3e74c4a094 100644 --- a/models/server-process/src/index.ts +++ b/models/server-process/src/index.ts @@ -51,12 +51,12 @@ export function createModel (builder: Builder): void { builder.createModel(TMethodImpl, TFuncImpl, TTriggerImpl) builder.mixin(process.trigger.OnToDoClose, process.class.Trigger, serverProcess.mixin.TriggerImpl, { - serverCheckFunc: serverProcess.func.CheckToDo, + serverCheckFunc: serverProcess.func.CheckToDoDone, rollbackFunc: serverProcess.rollbacks.ToDoCloseRollback }) builder.mixin(process.trigger.OnToDoRemove, process.class.Trigger, serverProcess.mixin.TriggerImpl, { - serverCheckFunc: serverProcess.func.CheckToDo, + serverCheckFunc: serverProcess.func.CheckToDoCancelled, rollbackFunc: serverProcess.rollbacks.ToDoCancellRollback }) diff --git a/packages/hulypulse-client/src/client.ts b/packages/hulypulse-client/src/client.ts index 1209bc4276..78787f9088 100644 --- a/packages/hulypulse-client/src/client.ts +++ b/packages/hulypulse-client/src/client.ts @@ -261,6 +261,10 @@ export class HulypulseClient implements Disposable { return } + if (event.data === 'pong') { + return + } + const msg: PulseIncomingMessage = JSON.parse(event.data.toString()) // Handle incoming messages (Set, Expired, Del) diff --git a/plugins/document-resources/src/components/CreateDocument.svelte b/plugins/document-resources/src/components/CreateDocument.svelte index 213ac052a1..f6138fd018 100644 --- a/plugins/document-resources/src/components/CreateDocument.svelte +++ b/plugins/document-resources/src/components/CreateDocument.svelte @@ -114,7 +114,7 @@ kind={'regular'} size={'small'} label={document.string.NoParentDocument} - searchField={'name'} + searchField={'title'} allowDeselect={true} showNavigate={false} docProps={{ disabled: true, noUnderline: true }} diff --git a/plugins/document-resources/src/components/Move.svelte b/plugins/document-resources/src/components/Move.svelte index 27e8ca75d8..0b2b605b80 100644 --- a/plugins/document-resources/src/components/Move.svelte +++ b/plugins/document-resources/src/components/Move.svelte @@ -116,7 +116,7 @@ docQuery={{ space }} kind={'regular'} size={'small'} - searchField={'name'} + searchField={'title'} allowDeselect={true} showNavigate={false} docProps={{ disabled: true, noUnderline: true }} diff --git a/plugins/drive-resources/src/components/CreateFolder.svelte b/plugins/drive-resources/src/components/CreateFolder.svelte index 6af93b78c9..f00fb4275c 100644 --- a/plugins/drive-resources/src/components/CreateFolder.svelte +++ b/plugins/drive-resources/src/components/CreateFolder.svelte @@ -95,7 +95,7 @@ kind={'regular'} size={'small'} label={drive.string.Root} - searchField={'name'} + searchField={'title'} allowDeselect showNavigate={false} docProps={{ disabled: true, noUnderline: true }} diff --git a/plugins/drive-resources/src/components/MoveResource.svelte b/plugins/drive-resources/src/components/MoveResource.svelte index 66240ae433..e621dfdfe5 100644 --- a/plugins/drive-resources/src/components/MoveResource.svelte +++ b/plugins/drive-resources/src/components/MoveResource.svelte @@ -95,7 +95,7 @@ docQuery={{ space }} kind={'regular'} size={'small'} - searchField={'name'} + searchField={'title'} allowDeselect={true} showNavigate={false} docProps={{ disabled: true, noUnderline: true }} diff --git a/plugins/love-resources/src/utils.ts b/plugins/love-resources/src/utils.ts index 9423067439..6244ff0110 100644 --- a/plugins/love-resources/src/utils.ts +++ b/plugins/love-resources/src/utils.ts @@ -717,10 +717,12 @@ async function checkRecordAvailable (): Promise { setTimeout(() => { void checkRecordAvailable() }, 500) - } else { + } else if (endpoint !== '') { const res = await fetch(concatLink(endpoint, '/checkRecordAvailable')) const result = await res.json() isRecordingAvailable.set(result) + } else { + console.info('office recording is not configured') } } catch (err: any) { Analytics.handleError(err) diff --git a/plugins/process-resources/src/components/ProcessesSection.svelte b/plugins/process-resources/src/components/ProcessesSection.svelte index 0483cf4198..dbd593f796 100644 --- a/plugins/process-resources/src/components/ProcessesSection.svelte +++ b/plugins/process-resources/src/components/ProcessesSection.svelte @@ -20,6 +20,7 @@ import { Process, State } from '@hcengineering/process' import { ButtonIcon, getCurrentLocation, Icon, IconAdd, Label, navigate } from '@hcengineering/ui' import process from '../plugin' + import { makeRank } from '@hcengineering/rank' export let masterTag: MasterTag @@ -38,6 +39,7 @@ core.space.Model, { process: id, + rank: makeRank(undefined, undefined), title: await translate(process.string.NewState, {}) }, initState @@ -47,6 +49,7 @@ from: null, to: initState, trigger: process.trigger.OnExecutionStart, + rank: makeRank(undefined, undefined), actions: [], triggerParams: {} }) diff --git a/plugins/process-resources/src/components/settings/AddTransitionPopup.svelte b/plugins/process-resources/src/components/settings/AddTransitionPopup.svelte index 3da14b0bd0..8586a91682 100644 --- a/plugins/process-resources/src/components/settings/AddTransitionPopup.svelte +++ b/plugins/process-resources/src/components/settings/AddTransitionPopup.svelte @@ -13,12 +13,13 @@ // limitations under the License. --> @@ -41,9 +49,11 @@
- {#each states as state (state._id)} - - {/each} + + + + + {#if !readonly} - {/each} + + + {@const transition = toTransition(value)} + + + {#if !readonly}