diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index e71bb67660..0c2da87ce8 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -24660,6 +24660,9 @@ importers: ../../plugins/process-resources: dependencies: + '@hcengineering/account-client': + specifier: workspace:^0.7.21 + version: link:../../foundations/core/packages/account-client '@hcengineering/analytics': specifier: workspace:^0.7.17 version: link:../../foundations/core/packages/analytics @@ -24681,6 +24684,9 @@ importers: '@hcengineering/core': specifier: workspace:^0.7.24 version: link:../../foundations/core/packages/core + '@hcengineering/login': + specifier: workspace:^0.7.0 + version: link:../login '@hcengineering/platform': specifier: workspace:^0.7.19 version: link:../../foundations/core/packages/platform diff --git a/desktop/src/ui/platform.ts b/desktop/src/ui/platform.ts index d46c8f5b12..b4a2bbd8e8 100644 --- a/desktop/src/ui/platform.ts +++ b/desktop/src/ui/platform.ts @@ -412,7 +412,7 @@ export async function configurePlatform (onWorkbenchConnect?: () => Promise l.trim()) - : ['en', 'ru', 'es', 'pt', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr'] + : ['en', 'ru', 'es', 'pt', 'pt-br', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr'] setMetadata(uiPlugin.metadata.Languages, languages) diff --git a/dev/prod/public/branding.json b/dev/prod/public/branding.json index e182e67d37..389cfb8db9 100644 --- a/dev/prod/public/branding.json +++ b/dev/prod/public/branding.json @@ -1,7 +1,7 @@ { "huly.local:8080": { "title": "Huly", - "languages": "en,ru,pt,es,zh,fr,de,ja,tr", + "languages": "en,ru,pt,pt-br,es,zh,fr,de,ja,tr", "defaultLanguage": "en", "defaultApplication": "tracker", "defaultSpace": "tracker:project:DefaultProject", @@ -30,7 +30,7 @@ }, "huly.local:8087": { "title": "Huly", - "languages": "en,ru,pt,es,zh,fr,de,ja,tr", + "languages": "en,ru,pt,pt-br,es,zh,fr,de,ja,tr", "defaultLanguage": "en", "defaultApplication": "tracker", "defaultSpace": "tracker:project:DefaultProject", diff --git a/dev/prod/src/platform.ts b/dev/prod/src/platform.ts index 7446fc8c3b..59d7f0adff 100644 --- a/dev/prod/src/platform.ts +++ b/dev/prod/src/platform.ts @@ -543,7 +543,7 @@ export async function configurePlatform() { const languages = myBranding.languages ? myBranding.languages.split(',').map((l) => l.trim()) - : ['en', 'ru', 'es', 'pt', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr'] + : ['en', 'ru', 'es', 'pt', 'pt-br', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr'] setMetadata(uiPlugin.metadata.Languages, languages) diff --git a/foundations/core/packages/core/lang/pt-br.json b/foundations/core/packages/core/lang/pt-br.json new file mode 100644 index 0000000000..9ae51b2c3e --- /dev/null +++ b/foundations/core/packages/core/lang/pt-br.json @@ -0,0 +1,68 @@ +{ + "string": { + "Id": "Id", + "Space": "Espaço", + "Spaces": "Espaços", + "SpacesDescription": "Gestão do tipo de espaço para todas as espaços", + "Modified": "Modificado", + "ModifiedDate": "Data de modificação", + "ModifiedBy": "Modificado por", + "Class": "Classe", + "AttachedTo": "Anexado a", + "AttachedToClass": "Classe anexada", + "Name": "Nome", + "Description": "Descrição", + "Private": "Privado", + "Archived": "Arquivado", + "ClassLabel": "Tipo", + "ClassPropertyLabel": "Rótulo", + "String": "Texto", + "Markup": "Marcação", + "Number": "Número", + "Boolean": "Caixa de seleção", + "Timestamp": "Marca de data/hora", + "Date": "Data", + "IntlString": "Cadeia de texto internacionalizada", + "Ref": "Referência", + "Collection": "Coleção", + "Array": "Seleção múltipla", + "Enum": "Seleção", + "Members": "Membros", + "Hyperlink": "URL", + "MarkupBlobRef": "Colaborativo", + "Object": "Objeto", + "System": "Sistema", + "CreatedBy": "Criado por", + "CreatedDate": "Data de criação", + "Status": "Estado", + "StatusCategory": "Categoria de estado", + "Account": "Conta", + "Rank": "Ranking", + "Owners": "Proprietários", + "Permission": "Permissão", + "CreateObject": "Criar objeto", + "UpdateObject": "Atualizar objeto", + "DeleteObject": "Apagar objeto", + "ForbidDeleteObject": "Proibir apagar objeto", + "UpdateSpace": "Atualizar espaço", + "ArchiveSpace": "Arquivar espaço", + "CreateObjectDescription": "Concede aos usuários a capacidade de criar objetos no espaço", + "UpdateObjectDescription": "Concede aos usuários a capacidade de atualizar objetos no espaço", + "DeleteObjectDescription": "Concede aos usuários a capacidade de apagar objetos no espaço", + "ForbidDeleteObjectDescription": "Proíbe aos usuários a capacidade de apagar objetos no espaço", + "UpdateSpaceDescription": "Concede aos usuários a capacidade de atualizar o espaço", + "ArchiveSpaceDescription": "Concede aos usuários a capacidade de arquivar o espaço", + "AutoJoin": "Auto adesão", + "AutoJoinDescr": "Adesão automática de novos funcionários a este espaço", + "RBAC": "Controle de acesso baseado em funções", + "RBACDescr": "Exigir acesso baseado em funções para executar ações neste espaço", + "BlobSize": "Tamanho", + "BlobContentType": "Tipo de conteúdo", + "Relation": "Relação", + "Relations": "Relações", + "AddRelation": "Adicionar relação", + "PersonId": "ID de pessoa", + "AccountId": "Conta", + "Version": "Versão" + } +} diff --git a/foundations/core/packages/platform/lang/pt-br.json b/foundations/core/packages/platform/lang/pt-br.json new file mode 100644 index 0000000000..a66bf1fcc7 --- /dev/null +++ b/foundations/core/packages/platform/lang/pt-br.json @@ -0,0 +1,31 @@ +{ + "status": { + "LoadingPlugin": "Carregando plugin {plugin}...", + "UnknownError": "Erro desconhecido: {message}", + "InvalidId": "Id inválido: {id}", + "BadRequest": "Pedido inválido", + "Forbidden": "Proibido", + "Conflict": "Conflito", + "ExpiredLink": "Este link de convite expirou", + "Unauthorized": "Não autorizado", + "UnknownMethod": "Método desconhecido: {method}", + "InternalServerError": "Erro interno do servidor", + "MaintenanceWarning": "Manutenção programada dentro de", + "MaintenanceWarningTime": "{time, plural, =1 {menos de um minuto} other {# minutos}}", + "AccountNotFound": "Conta não encontrada", + "AccountNotConfirmed": "Conta não confirmada", + "WorkspaceNotFound": "Espaço de trabalho não encontrado", + "InvalidPassword": "Senha inválida", + "AccountAlreadyExists": "Conta já existe", + "WorkspaceRateLimit": "O servidor está ocupado. Por favor, espere um pouco e tente novamente", + "AccountAlreadyConfirmed": "Conta já confirmada", + "WorkspaceAlreadyExists": "Espaço de trabalho já existe", + "InvalidOtp": "Código inválido", + "PasswordLoginLocked": "O login com senha está bloqueado devido a muitas tentativas falhadas. Use um método de login OTP para desbloquear sua conta.", + "InviteNotFound": "Convite com e-mail:{email} não encontrado.", + "WorkspaceLimitReached": "Você atingiu o limite de espaço de trabalho. Entre em contato conosco...", + "ReadOnlyAccount": "Demonstração anônima de convidado", + "SystemAccount": "Conta do sistema", + "SocialIdAlreadyExists": "ID social já existe" + } +} diff --git a/models/drive/src/index.ts b/models/drive/src/index.ts index 68171798fd..5614644a89 100644 --- a/models/drive/src/index.ts +++ b/models/drive/src/index.ts @@ -234,6 +234,12 @@ function defineDrive (builder: Builder): void { icon: drive.icon.Drive, baseClass: drive.class.Drive, availablePermissions: [ + drive.permission.CreateFolder, + drive.permission.UpdateFolder, + drive.permission.RemoveFolder, + drive.permission.CreateFile, + drive.permission.UpdateFile, + drive.permission.RemoveFile, core.permission.UpdateSpace, core.permission.ArchiveSpace, core.permission.ForbidDeleteObject @@ -326,7 +332,8 @@ function defineDrive (builder: Builder): void { mode: ['context', 'browser'], application: drive.app.Drive, group: 'create' - } + }, + visibilityTester: drive.function.CanCreateFolder }, drive.action.CreateRootFolder ) @@ -475,6 +482,7 @@ function defineFolder (builder: Builder): void { actions: [ view.action.Open, view.action.OpenInNewTab, + view.action.Delete, print.action.Print, tracker.action.EditRelatedTargets, tracker.action.NewRelatedIssue @@ -494,7 +502,8 @@ function defineFolder (builder: Builder): void { mode: ['context', 'browser'], application: drive.app.Drive, group: 'create' - } + }, + visibilityTester: drive.function.CanCreateFolder }, drive.action.CreateChildFolder ) @@ -518,6 +527,25 @@ function defineFolder (builder: Builder): void { drive.action.RenameFolder ) + createAction( + builder, + { + action: view.actionImpl.Delete, + label: view.string.Delete, + icon: view.icon.Delete, + category: drive.category.Drive, + input: 'none', + target: drive.class.Folder, + context: { + mode: ['context', 'browser'], + application: drive.app.Drive, + group: 'edit' + }, + visibilityTester: drive.function.CanDeleteFolder + }, + drive.action.DeleteFolder + ) + createAction(builder, { ...actionTemplates.move, action: view.actionImpl.ShowPopup, @@ -529,6 +557,7 @@ function defineFolder (builder: Builder): void { } }, target: drive.class.Folder, + visibilityTester: drive.function.CanUpdateFolder, context: { mode: ['browser', 'context'], group: 'tools' @@ -569,7 +598,8 @@ function defineFileVersion (builder: Builder): void { mode: ['context', 'browser'], application: drive.app.Drive, group: 'edit' - } + }, + visibilityTester: drive.function.CanUpdateFileVersion }, drive.action.RestoreFileVersion ) @@ -649,6 +679,7 @@ function defineFile (builder: Builder): void { actions: [ view.action.Open, view.action.OpenInNewTab, + view.action.Delete, print.action.Print, tracker.action.EditRelatedTargets, tracker.action.NewRelatedIssue @@ -692,6 +723,25 @@ function defineFile (builder: Builder): void { drive.action.RenameFile ) + createAction( + builder, + { + action: view.actionImpl.Delete, + label: view.string.Delete, + icon: view.icon.Delete, + category: drive.category.Drive, + input: 'none', + target: drive.class.File, + context: { + mode: ['context', 'browser'], + application: drive.app.Drive, + group: 'edit' + }, + visibilityTester: drive.function.CanDeleteFile + }, + drive.action.DeleteFile + ) + // createAction( // builder, // { @@ -721,6 +771,7 @@ function defineFile (builder: Builder): void { } }, target: drive.class.File, + visibilityTester: drive.function.CanUpdateFile, context: { mode: ['browser', 'context'], group: 'tools' diff --git a/models/drive/src/migration.ts b/models/drive/src/migration.ts index 317028c417..1e628420ec 100644 --- a/models/drive/src/migration.ts +++ b/models/drive/src/migration.ts @@ -14,7 +14,7 @@ // import core, { type Blob, type Ref, DOMAIN_BLOB, generateId, toIdMap } from '@hcengineering/core' -import type { Drive, File, FileVersion, Resource } from '@hcengineering/drive' +import type { File, FileVersion, Resource } from '@hcengineering/drive' import { type MigrateOperation, type MigrationClient, @@ -56,7 +56,7 @@ async function migrateFileVersions (client: MigrationClient): Promise { collection: 'versions', modifiedOn: file.modifiedOn, modifiedBy: file.modifiedBy, - space: file.space as Ref, + space: file.space, title: exfile.title, file: blob._id, size: blob.size, diff --git a/models/drive/src/permissions.ts b/models/drive/src/permissions.ts index 89b28e7f09..15da59471c 100644 --- a/models/drive/src/permissions.ts +++ b/models/drive/src/permissions.ts @@ -3,6 +3,84 @@ import core from '@hcengineering/core' import drive from '@hcengineering/drive' export function definePermissions (builder: Builder): void { + builder.createDoc( + core.class.Permission, + core.space.Model, + { + scope: 'space', + label: drive.string.CreateFilePermission, + description: drive.string.CreateFilePermissionDescription, + txClass: core.class.TxCreateDoc, + objectClass: drive.class.File + }, + drive.permission.CreateFile + ) + + builder.createDoc( + core.class.Permission, + core.space.Model, + { + scope: 'space', + label: drive.string.UpdateFilePermission, + description: drive.string.UpdateFilePermissionDescription, + txClass: core.class.TxUpdateDoc, + objectClass: drive.class.File + }, + drive.permission.UpdateFile + ) + + builder.createDoc( + core.class.Permission, + core.space.Model, + { + scope: 'space', + label: drive.string.RemoveFilePermission, + description: drive.string.RemoveFilePermissionDescription, + txClass: core.class.TxRemoveDoc, + objectClass: drive.class.File + }, + drive.permission.RemoveFile + ) + + builder.createDoc( + core.class.Permission, + core.space.Model, + { + scope: 'space', + label: drive.string.CreateFolderPermission, + description: drive.string.CreateFolderPermissionDescription, + txClass: core.class.TxCreateDoc, + objectClass: drive.class.Folder + }, + drive.permission.CreateFolder + ) + + builder.createDoc( + core.class.Permission, + core.space.Model, + { + scope: 'space', + label: drive.string.UpdateFolderPermission, + description: drive.string.UpdateFolderPermissionDescription, + txClass: core.class.TxUpdateDoc, + objectClass: drive.class.Folder + }, + drive.permission.UpdateFolder + ) + + builder.createDoc( + core.class.Permission, + core.space.Model, + { + scope: 'space', + label: drive.string.RemoveFolderPermission, + description: drive.string.RemoveFolderPermissionDescription, + txClass: core.class.TxRemoveDoc, + objectClass: drive.class.Folder + }, + drive.permission.RemoveFolder + ) + builder.createDoc( core.class.Permission, core.space.Model, diff --git a/models/drive/src/plugin.ts b/models/drive/src/plugin.ts index ddfe0386f1..d2738d1f23 100644 --- a/models/drive/src/plugin.ts +++ b/models/drive/src/plugin.ts @@ -53,8 +53,14 @@ export default mergeIds(driveId, drive, { DriveLinkProvider: '' as Resource<(doc: Doc, props: Record) => Promise>, FolderLinkProvider: '' as Resource<(doc: Doc, props: Record) => Promise>, FileLinkProvider: '' as Resource<(doc: Doc, props: Record) => Promise>, + CanCreateFolder: '' as Resource, + CanUpdateFile: '' as Resource, + CanUpdateFolder: '' as Resource, + CanDeleteFile: '' as Resource, + CanDeleteFolder: '' as Resource, CanRenameFile: '' as Resource, CanRenameFolder: '' as Resource, + CanUpdateFileVersion: '' as Resource, CanDeleteFileVersion: '' as Resource, FileTitleProvider: '' as Resource<(client: Client, ref: Ref, doc?: Doc) => Promise>, FolderTitleProvider: '' as Resource<(client: Client, ref: Ref, doc?: Doc) => Promise> @@ -79,6 +85,8 @@ export default mergeIds(driveId, drive, { CreateRootFolder: '' as Ref, EditDrive: '' as Ref, DownloadFile: '' as Ref, + DeleteFile: '' as Ref, + DeleteFolder: '' as Ref, RenameFile: '' as Ref, RenameFolder: '' as Ref, DeleteFileVersion: '' as Ref, diff --git a/models/process/src/actions.ts b/models/process/src/actions.ts index edf1d91533..86d2e427a3 100644 --- a/models/process/src/actions.ts +++ b/models/process/src/actions.ts @@ -31,6 +31,23 @@ export function defineMethods (builder: Builder): void { process.method.RunSubProcess ) + builder.createDoc( + process.class.Method, + core.space.Model, + { + label: process.string.RequestApproval, + objectClass: process.class.ApproveRequest, + editor: process.component.ApproveRequestEditor, + presenter: process.component.ApproveRequestPresenter, + createdContext: { + _class: process.class.ApproveRequest, + nameField: 'title' + }, + requiredParams: ['user'] + }, + process.method.RequestApproval + ) + builder.createDoc( process.class.Method, core.space.Model, @@ -103,4 +120,30 @@ export function defineMethods (builder: Builder): void { }, process.method.AddTag ) + + builder.createDoc( + process.class.Method, + core.space.Model, + { + label: process.string.LockCard, + objectClass: card.class.Card, + requiredParams: [], + createdContext: null + }, + process.method.LockCard + ) + + builder.createDoc( + process.class.Method, + core.space.Model, + { + label: process.string.LockSection, + objectClass: card.class.Card, + editor: process.component.LockSectionEditor, + presenter: process.component.LockSectionPresenter, + requiredParams: ['_id'], + createdContext: null + }, + process.method.LockSection + ) } diff --git a/models/process/src/index.ts b/models/process/src/index.ts index f265763b71..89b2d7f550 100644 --- a/models/process/src/index.ts +++ b/models/process/src/index.ts @@ -46,6 +46,7 @@ import workbench from '@hcengineering/model-workbench' import notification from '@hcengineering/notification' import { type Asset, type IntlString, type Resource } from '@hcengineering/platform' import { + type ApproveRequest, type CheckFunc, type ContextId, type CreatedContext, @@ -204,6 +205,19 @@ export class TProcessToDo extends TToDo implements ProcessToDo { withRollback!: boolean } +@Model(process.class.ApproveRequest, process.class.ProcessToDo) +export class TApproveRequest extends TProcessToDo implements ApproveRequest { + @Prop(TypeBoolean(), process.string.IsApproved) + approved?: boolean + + @Prop(TypeString(), process.string.RejectionReason) + reason?: string + + group!: string + + card!: Ref +} + @Model(process.class.Method, core.class.Doc, DOMAIN_MODEL) export class TMethod extends TDoc implements Method { label!: IntlString @@ -290,6 +304,7 @@ export function createModel (builder: Builder): void { TProcess, TExecution, TProcessToDo, + TApproveRequest, TMethod, TState, TProcessFunction, @@ -323,6 +338,28 @@ export function createModel (builder: Builder): void { process.ids.ProcessToDoCreated ) + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: false, + generated: false, + allowedForAuthor: true, + label: process.string.ApproveRequest, + group: time.ids.TimeNotificationGroup, + txClasses: [core.class.TxCreateDoc], + objectClass: process.class.ApproveRequest, + onlyOwn: true, + defaultEnabled: true, + templates: { + textTemplate: '{body}', + htmlTemplate: '

{body}

', + subjectTemplate: '{title}' + } + }, + process.ids.ApproveRequestCreated + ) + createAction(builder, { action: view.actionImpl.Delete, label: view.string.Delete, @@ -413,6 +450,42 @@ export function createModel (builder: Builder): void { presenter: process.component.StatePresenter }) + builder.createDoc( + view.class.Viewlet, + core.space.Model, + { + variant: 'cardRequests', + attachTo: process.class.ApproveRequest, + descriptor: view.viewlet.List, + props: { + baseMenuClass: process.class.ApproveRequest + }, + viewOptions: { + groupBy: ['user', 'approved'], + orderBy: [ + ['approved', SortingOrder.Descending], + ['modifiedOn', SortingOrder.Descending], + ['createdOn', SortingOrder.Descending] + ], + other: [] + }, + configOptions: { + strict: true + }, + config: [ + { + key: '', + label: process.string.ApproveRequest, + presenter: process.component.ApproveRequestPresenter + }, + 'user', + 'approved', + 'reason' + ] + }, + process.viewlet.CardRequests + ) + builder.createDoc( view.class.Viewlet, core.space.Model, @@ -600,6 +673,12 @@ export function createModel (builder: Builder): void { props: {} }) + builder.createDoc(presentation.class.ComponentPointExtension, core.space.Model, { + extension: card.extensions.EditCardExtension, + component: process.component.RequestsExtension, + props: {} + }) + builder.createDoc(presentation.class.ComponentPointExtension, core.space.Model, { extension: card.extensions.EditCardHeaderExtension, component: process.component.ProcessesHeaderExtension, @@ -623,6 +702,19 @@ export function createModel (builder: Builder): void { process.section.CardProcesses ) + builder.createDoc( + card.class.CardSection, + core.space.Model, + { + label: process.string.ApproveRequest, + component: process.component.RequestsCardSection, + checkVisibility: process.function.CheckRequestsSectionVisibility, + order: 360, + navigation: [] + }, + process.section.CardApproveRequest + ) + builder.createDoc(card.class.MasterTagEditorSection, core.space.Model, { id: 'processes', label: process.string.Processes, diff --git a/models/process/src/plugin.ts b/models/process/src/plugin.ts index d788ab848f..728b3b1ef6 100644 --- a/models/process/src/plugin.ts +++ b/models/process/src/plugin.ts @@ -24,14 +24,16 @@ export default mergeIds(processId, process, { Process: '' as Ref }, section: { - CardProcesses: '' as Ref + CardProcesses: '' as Ref, + CardApproveRequest: '' as Ref }, pipeline: { ProcessMiddleware: '' as Ref }, ids: { ProcessSettings: '' as Ref, - ProcessToDoCreated: '' as Ref + ProcessToDoCreated: '' as Ref, + ApproveRequestCreated: '' as Ref }, actionImpl: { ContinueExecution: '' as ViewAction diff --git a/models/process/src/triggers.ts b/models/process/src/triggers.ts index 600dd2b84b..a96bc53aab 100644 --- a/models/process/src/triggers.ts +++ b/models/process/src/triggers.ts @@ -16,6 +16,38 @@ import { type Builder } from '@hcengineering/model' import process from './plugin' export function defineTriggers (builder: Builder): void { + builder.createDoc( + process.class.Trigger, + core.space.Model, + { + label: process.string.OnApproveRequestApproved, + icon: process.icon.ToDo, + editor: process.component.ApproveRequestTriggerEditor, + presenter: process.component.ApproveRequestTriggerPresenter, + requiredParams: ['_id'], + checkFunction: process.triggerCheck.ApproveRequestApproved, + init: false, + auto: true + }, + process.trigger.OnApproveRequestApproved + ) + + builder.createDoc( + process.class.Trigger, + core.space.Model, + { + label: process.string.OnApproveRequestRejected, + icon: process.icon.ToDoRemove, + editor: process.component.ApproveRequestTriggerEditor, + presenter: process.component.ApproveRequestTriggerPresenter, + requiredParams: ['_id'], + checkFunction: process.triggerCheck.ApproveRequestRejected, + init: false, + auto: true + }, + process.trigger.OnApproveRequestRejected + ) + builder.createDoc( process.class.Trigger, core.space.Model, diff --git a/models/server-process/src/index.ts b/models/server-process/src/index.ts index 0de963d6db..a740951236 100644 --- a/models/server-process/src/index.ts +++ b/models/server-process/src/index.ts @@ -70,6 +70,16 @@ export function createModel (builder: Builder): void { serverCheckFunc: serverProcess.func.FieldChangedCheck }) + builder.mixin(process.trigger.OnApproveRequestApproved, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + preventRollback: true, + serverCheckFunc: serverProcess.func.ApproveRequestApproved + }) + + builder.mixin(process.trigger.OnApproveRequestRejected, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + preventRollback: true, + serverCheckFunc: serverProcess.func.ApproveRequestRejected + }) + builder.mixin(process.trigger.OnExecutionStart, process.class.Trigger, serverProcess.mixin.TriggerImpl, { preventRollback: true }) @@ -117,6 +127,18 @@ export function createModel (builder: Builder): void { func: serverProcess.func.AddTag }) + builder.mixin(process.method.RequestApproval, process.class.Method, serverProcess.mixin.MethodImpl, { + func: serverProcess.func.RequestApproval + }) + + builder.mixin(process.method.LockCard, process.class.Method, serverProcess.mixin.MethodImpl, { + func: serverProcess.func.LockCard + }) + + builder.mixin(process.method.LockSection, process.class.Method, serverProcess.mixin.MethodImpl, { + func: serverProcess.func.LockSection + }) + builder.mixin(process.function.FirstValue, process.class.ProcessFunction, serverProcess.mixin.FuncImpl, { func: serverProcess.transform.FirstValue }) diff --git a/packages/presentation/lang/pt-br.json b/packages/presentation/lang/pt-br.json new file mode 100644 index 0000000000..3fbb5c8d63 --- /dev/null +++ b/packages/presentation/lang/pt-br.json @@ -0,0 +1,64 @@ +{ + "string": { + "Create": "Criar", + "Cancel": "Cancelar", + "Ok": "Ok", + "Save": "Guardar", + "Saved": "Guardado...", + "Download": "Transferir", + "DownloadOriginal": "Transferir original", + "Delete": "Eliminar", + "Close": "Fechar", + "NotSelected": "Não selecionado", + "Deselect": "Desmarcar", + "Archived": "(arquivado)", + "AddSocialLinks": "Adicionar links sociais", + "EditSocialLinks": "Editar links sociais", + "Change": "Alterar", + "Remove": "Remover", + "Search": "Pesquisar...", + "Spaces": "Espaços", + "NumberSpaces": "{count, plural, =0 {Em} =1 {Em 1 local} other {Em # locais}}", + "InThis": "Neste {space}", + "NoMatchesInThis": "Sem correspondências neste {space}", + "NoMatchesFound": "Sem correspondências encontradas", + "NotInThis": "Não está neste {space}", + "Match": "Correspondência", + "Add": "Adicionar", + "Edit": "Editar", + "DocumentPreview": "Visualizar", + "MakePrivate": "Tornar privado", + "MakePrivateDescription": "Apenas os membros podem ver", + "Created": "Criado", + "Selected": "Selecionado", + "NoResults": "Sem resultados para mostrar", + "Next": "Seguinte", + "FailedToPreview": "Falha ao pré-visualizar", + "ContentType": "Tipo de conteúdo", + "ContentTypeNotSupported": "A visualização não está disponível para este tipo de conteúdo", + "StartDrawing": "Scarabocchiare sopra", + "DrawingHistory": "História de rabiscos", + "ColorAdd": "Adicionar predefinição de cor", + "ColorRemove": "Remover predefinição de cor", + "ColorReset": "Repor predefinições de cores", + "Copy": "Copiar", + "DocumentUrlCopied": "Copiado!", + "CopyLink": "Copiar link", + "AccessDenied": "O objeto não existe ou você não tem permissão para acessá-lo.", + "UnableToFollowMention": "Não foi possível abrir o objeto mencionado", + "Undo": "Desfazer", + "Redo": "Refazer", + "ClearCanvas": "Limpar tela", + "PenTool": "Caneta", + "EraserTool": "Borracha", + "PanTool": "Mover", + "TextTool": "Texto", + "LineTool": "Linha", + "RectangleTool": "Retângulo", + "EllipseTool": "Elipse", + "PaletteManagementMenu": "Gerenciar predefinições de cor" + }, + "status": { + "FileTooLarge": "Ficheiro demasiado grande" + } +} diff --git a/packages/theme/styles/prose.scss b/packages/theme/styles/prose.scss index 1797af3e72..235628047c 100644 --- a/packages/theme/styles/prose.scss +++ b/packages/theme/styles/prose.scss @@ -584,9 +584,11 @@ pre.proseCodeBlock>pre.proseCode { .mermaidPreview { width: 100%; + display: flex; + justify-content: center; svg { - width: 100%; + width: auto; max-width: 100%; height: auto; display: block; diff --git a/packages/ui/lang/cs.json b/packages/ui/lang/cs.json index 7698769d63..5bb6ebb6aa 100644 --- a/packages/ui/lang/cs.json +++ b/packages/ui/lang/cs.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/de.json b/packages/ui/lang/de.json index 638f70c222..90faf66346 100644 --- a/packages/ui/lang/de.json +++ b/packages/ui/lang/de.json @@ -50,6 +50,7 @@ "English": "Englisch", "Russian": "Russisch", "Portuguese": "Portugiesisch", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Spanisch", "Chinese": "Chinesisch", "French": "Französisch", diff --git a/packages/ui/lang/en.json b/packages/ui/lang/en.json index 7c325e107f..4e77c59088 100644 --- a/packages/ui/lang/en.json +++ b/packages/ui/lang/en.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/es.json b/packages/ui/lang/es.json index 81e01a8627..a4cdd82b0d 100644 --- a/packages/ui/lang/es.json +++ b/packages/ui/lang/es.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/fr.json b/packages/ui/lang/fr.json index 2de9794825..353bf2e553 100644 --- a/packages/ui/lang/fr.json +++ b/packages/ui/lang/fr.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/it.json b/packages/ui/lang/it.json index 0854a3f1f4..5012a88957 100644 --- a/packages/ui/lang/it.json +++ b/packages/ui/lang/it.json @@ -50,6 +50,7 @@ "English": "Inglese", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/ja.json b/packages/ui/lang/ja.json index 902609e4a9..7206f2e501 100644 --- a/packages/ui/lang/ja.json +++ b/packages/ui/lang/ja.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/pt-br.json b/packages/ui/lang/pt-br.json new file mode 100644 index 0000000000..d9485bd0b1 --- /dev/null +++ b/packages/ui/lang/pt-br.json @@ -0,0 +1,114 @@ +{ + "string": { + "EditBoxPlaceholder": "Digite o texto...", + "Ok": "Ok", + "Cancel": "Cancelar", + "Save": "Salvar", + "Publish": "Publicar", + "SaveDraft": "Salvar rascunho", + "MinutesAgo": "{minutes, plural, =0 {há menos de um minuto} =1 {há um minuto} other {há # minutos}}", + "HoursAgo": "{hours, plural, =0 {há menos de uma hora} =1 {há uma hora} other {há # horas}}", + "DaysAgo": "{days, plural, =0 {hoje} =1 {ontem} other {há # dias}}", + "MonthsAgo": "{months, plural, =0 {este mês} =1 {há um mês} other {há # meses}}", + "YearsAgo": "{years, plural, =0 {este ano} =1 {há um ano} other {há # anos}}", + "Minutes": "{minutes, plural, =0 {menos de um minuto} =1 {um minuto} other {# minutos}}", + "Hours": "{hours, plural, =0 {menos de uma hora} =1 {uma hora} other {# horas}}", + "Days": "{days, plural, =0 {hoje} =1 {1 dia} other {# dias}}", + "Weeks": "{weeks, plural, =0 {esta semana} =1 {1 semana} other {# semanas}}", + "Months": "{months, plural, =0 {este mês} =1 {1 mês} other {# meses}}", + "Years": "{years, plural, =0 {este ano} =1 {um ano} other {# anos}}", + "Before": "Antes", + "After": "Depois", + "MinutesShort": "{value}m", + "HoursShort": "{value}h", + "DaysShort": "{value}d", + "ShowMore": "Mostrar mais", + "ShowLess": "Mostrar menos", + "Search": "Pesquisar", + "SearchDots": "Pesquisar...", + "SearchResults": "Resultados da pesquisa", + "Suggested": "Sugerido", + "TimeTooltip": "{value}", + "SelectDate": "Selecionar data", + "None": "Nenhum", + "NotSelected": "Não selecionado", + "Today": "Hoje", + "NoDate": "Sem data", + "StartDate": "Data de início", + "TargetDate": "Data alvo", + "Overdue": "Atrasado", + "DueDate": "Data de vencimento", + "AddDueDate": "Adicionar data de vencimento", + "SetDueDate": "Definir data de vencimento", + "EditDueDate": "Editar data de vencimento", + "SaveDueDate": "Salvar data de vencimento", + "NeedsToBeCompletedByThisDate": "Precisa ser concluído até esta data", + "DueDatePopupTitle": "Vence em {value}", + "DueDatePopupOverdueTitle": "Venceu em {value}", + "DueDatePopupDescription": "{value, plural, =0 {Hoje} =1 {Amanhã} other {# dias restantes}}", + "DueDatePopupOverdueDescription": "{value, plural, =1 {1 dia em atraso} other {# dias em atraso}}", + "English": "English", + "Russian": "Русский", + "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", + "Spanish": "Español", + "Chinese": "中文", + "French": "Français", + "Italian": "Italiano", + "Czech": "Čeština", + "German": "Deutsch", + "Japanese": "日本語", + "Turkish": "Türkçe", + "MinutesBefore": "{minutes, plural, =1 {um minuto antes} other {# minutos antes}}", + "HoursBefore": "{hours, plural, =1 {uma hora antes} other {# horas antes}}", + "DaysBefore": "{days, plural, =1 {um dia antes} other {# dias antes}}", + "WeeksBefore": "{weeks, plural, =1 {uma semana antes} other {# semanas antes}}", + "MonthsBefore": "{months, plural, =1 {um mês antes} other {# meses antes}}", + "MinutesAfter": "{minutes, plural, =1 {em um minuto} other {em # minutos}}", + "HoursAfter": "{hours, plural, =1 {em uma hora} other {em # horas}}", + "DaysAfter": "{days, plural, =1 {em um dia} other {em # dias}}", + "WeeksAfter": "{weeks, plural, =1 {daqui a um dia} other {daqui a # semanas}}", + "MonthsAfter": "{months, plural, =1 {daqui a um mês} other {daqui a # meses}}", + "NoActionsDefined": "Nenhuma ação aplicável", + "Incoming": "Entrada", + "HoursLabel": "Horas", + "Back": "Voltar", + "Next": "Próximo", + "DropdownDefaultLabel": "Selecionar item", + "DD": "DD", + "MM": "MM", + "YYYY": "AAAA", + "HH": "HH", + "Remove": "Remover", + "NoResults": "Sem resultados", + "MoreCount": "{count} mais", + "Spacious": "Espaçoso", + "Compact": "Compacto", + "ThemeLight": "Claro", + "ThemeDark": "Escuro", + "ThemeSystem": "Sistema", + "NoTimeZonesFound": "Nenhum fuso horário encontrado", + "Selected": "Selecionado:", + "Submit": "Enviar", + "NextStep": "Próximo passo", + "TypeHere": "Digite aqui...", + "NormalSize": "Tamanho normal", + "FullSize": "Tamanho completo", + "UseMaxWidth": "Largura máxima", + "Sidebar": "Barra lateral", + "FontSize": "Tamanho da fonte", + "Language": "Idioma", + "DaysWOValue": "{days, plural, =1 {dia} other {dias}}", + "WeeksWOValue": "{weeks, plural, =1 {semana} other {semanas}}", + "MonthsWOValue": "{months, plural, =1 {mês} other {meses}}", + "Filter": "Filtrar", + "Clear": "Limpar", + "Yesterday": "Ontem", + "ThisWeek": "Esta semana", + "ThisMonth": "Este mês", + "ThisYear": "Este ano", + "EmojiStyle": "Estilo de emoji", + "EmojiSystem": "Padrão do sistema", + "EmojiNoto": "Noto Color" + } +} diff --git a/packages/ui/lang/pt.json b/packages/ui/lang/pt.json index 116b30fbb7..d7bb2b944b 100644 --- a/packages/ui/lang/pt.json +++ b/packages/ui/lang/pt.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/ru.json b/packages/ui/lang/ru.json index 28145e035b..6bac241ab9 100644 --- a/packages/ui/lang/ru.json +++ b/packages/ui/lang/ru.json @@ -51,6 +51,7 @@ "Russian": "Русский", "Spanish": "Español", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Chinese": "中文", "French": "Français", "Italian": "Italiano", diff --git a/packages/ui/lang/tr.json b/packages/ui/lang/tr.json index b6b406f3e9..f7f5a89c2f 100644 --- a/packages/ui/lang/tr.json +++ b/packages/ui/lang/tr.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/lang/zh.json b/packages/ui/lang/zh.json index 2627632a58..125f774112 100644 --- a/packages/ui/lang/zh.json +++ b/packages/ui/lang/zh.json @@ -50,6 +50,7 @@ "English": "English", "Russian": "Русский", "Portuguese": "Português", + "PortugueseBrazil": "Português (Brasil)", "Spanish": "Español", "Chinese": "中文", "French": "Français", diff --git a/packages/ui/src/components/EmbeddedPDF.svelte b/packages/ui/src/components/EmbeddedPDF.svelte index 0c063bf172..db4c12cb6c 100644 --- a/packages/ui/src/components/EmbeddedPDF.svelte +++ b/packages/ui/src/components/EmbeddedPDF.svelte @@ -14,29 +14,11 @@ --> -{#if iframeSrc} -