Merge remote-tracking branch 'origin/develop' into staging-new

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
This commit is contained in:
Alexander Onnikov
2025-09-30 21:07:02 +07:00
202 changed files with 5404 additions and 690 deletions
+1 -1
View File
@@ -339,7 +339,7 @@ export async function configurePlatform (onWorkbenchConnect?: () => Promise<void
setMetadata(billingPlugin.metadata.BillingURL, config.BILLING_URL ?? '')
const languages = myBranding.languages !== undefined && myBranding.languages !== '' ? myBranding.languages.split(',').map((l) => l.trim()) : ['en', 'ru', 'es', 'pt', 'zh', 'fr', 'cs', 'it', 'de', 'ja']
const languages = myBranding.languages !== undefined && myBranding.languages !== '' ? myBranding.languages.split(',').map((l) => l.trim()) : ['en', 'ru', 'es', 'pt', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr']
setMetadata(uiPlugin.metadata.Languages, languages)
+1 -1
View File
@@ -496,7 +496,7 @@ export async function configurePlatform() {
const languages = myBranding.languages
? (myBranding.languages as string).split(',').map((l) => l.trim())
: ['en', 'ru', 'es', 'pt', 'zh', 'fr', 'cs', 'it', 'de', 'ja']
: ['en', 'ru', 'es', 'pt', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr']
setMetadata(uiPlugin.metadata.Languages, languages)
+218
View File
@@ -0,0 +1,218 @@
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
import { type Builder } from '@hcengineering/model'
import presentation from '@hcengineering/model-presentation'
import setting from '@hcengineering/model-setting'
import view, { createAction } from '@hcengineering/model-view'
import workbench from '@hcengineering/model-workbench'
import card from './plugin'
export function createActions (builder: Builder): void {
createAction(builder, {
action: card.actionImpl.EditSpace,
label: presentation.string.Edit,
icon: view.icon.Edit,
input: 'focus',
category: view.category.General,
target: card.class.CardSpace,
visibilityTester: view.function.CanEditSpace,
query: {},
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(builder, {
action: view.actionImpl.CopyTextToClipboard,
actionProps: {
textProvider: card.function.GetSpaceAccessPublicLink
},
label: card.string.GetIndividualPublicLink,
icon: view.icon.CopyLink,
input: 'any',
category: view.category.General,
target: card.class.CardSpace,
query: {},
visibilityTester: card.function.CanGetSpaceAccessPublicLink,
context: {
mode: ['context', 'browser']
}
})
createAction(
builder,
{
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.SetParentActionPopup,
element: 'top',
fillProps: {
_objects: 'value'
}
},
label: card.string.SetParent,
icon: card.icon.MasterTag,
input: 'none',
category: card.category.Card,
target: card.class.Card,
context: {
mode: ['context'],
application: card.app.Card,
group: 'associate'
}
},
card.action.SetParent
)
createAction(
builder,
{
action: view.actionImpl.UpdateDocument,
actionProps: {
key: 'parent',
value: null
},
query: {
parent: { $ne: null, $exists: true }
},
label: card.string.UnsetParent,
icon: card.icon.MasterTag,
input: 'none',
category: card.category.Card,
target: card.class.Card,
context: {
mode: ['context'],
application: card.app.Card,
group: 'associate'
}
},
card.action.UnsetParent
)
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.CreateTag,
props: {
_class: card.class.Tag
},
fillProps: {
_object: 'parent'
}
},
label: card.string.CreateTag,
input: 'focus',
icon: view.icon.Add,
category: setting.category.Settings,
target: card.class.MasterTag,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.CreateTag,
props: {
_class: card.class.Tag
},
fillProps: {
_object: 'parent'
}
},
label: card.string.CreateTag,
input: 'focus',
icon: view.icon.Add,
category: setting.category.Settings,
target: card.class.Tag,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(
builder,
{
action: card.actionImpl.DeleteMasterTag,
label: workbench.string.Delete,
icon: view.icon.Delete,
input: 'any',
category: view.category.General,
target: card.class.MasterTag,
context: {
mode: ['context', 'browser'],
group: 'remove'
}
},
card.action.DeleteMasterTag
)
createAction(builder, {
action: card.actionImpl.DeleteMasterTag,
label: workbench.string.Delete,
icon: view.icon.Delete,
input: 'any',
category: view.category.General,
target: card.class.Tag,
context: {
mode: ['context', 'browser'],
group: 'remove'
}
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.ChangeType,
fillProps: {
_object: 'value'
}
},
label: card.string.ChangeType,
input: 'focus',
icon: card.icon.MasterTag,
category: setting.category.Settings,
target: card.class.Card,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.CreateTag,
props: {
_class: card.class.MasterTag
},
fillProps: {
_object: 'parent'
}
},
label: card.string.CreateMasterTag,
input: 'focus',
icon: card.icon.MasterTag,
category: setting.category.Settings,
target: card.class.MasterTag,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
}
+6 -200
View File
@@ -13,6 +13,7 @@
import activity from '@hcengineering/activity'
import {
type CanCreateCardResource,
type Card,
cardId,
type CardNavigation,
@@ -20,7 +21,6 @@ import {
type CardSpace,
type CardViewDefaults,
type CreateCardExtension,
type CanCreateCardResource,
DOMAIN_CARD,
type FavoriteCard,
type MasterTag,
@@ -60,17 +60,18 @@ import {
import attachment from '@hcengineering/model-attachment'
import { TAttachedDoc, TClass, TDoc, TMixin, TSpace } from '@hcengineering/model-core'
import { createPublicLinkAction } from '@hcengineering/model-guest'
import preference, { TPreference } from '@hcengineering/model-preference'
import presentation from '@hcengineering/model-presentation'
import setting from '@hcengineering/model-setting'
import view, { createAction, type Viewlet } from '@hcengineering/model-view'
import view, { type Viewlet } from '@hcengineering/model-view'
import workbench, { WidgetType } from '@hcengineering/model-workbench'
import { type Asset, getEmbeddedLabel, type IntlString, type Resource } from '@hcengineering/platform'
import time, { type ToDo } from '@hcengineering/time'
import { PaletteColorIndexes } from '@hcengineering/ui/src/colors'
import { type AnyComponent } from '@hcengineering/ui/src/types'
import { type BuildModelKey } from '@hcengineering/view'
import preference, { TPreference } from '@hcengineering/model-preference'
import card from './plugin'
import { PaletteColorIndexes } from '@hcengineering/ui/src/colors'
import { createActions } from './actions'
export { cardId } from '@hcengineering/card'
@@ -399,37 +400,7 @@ export function createModel (builder: Builder): void {
}
})
createAction(builder, {
action: card.actionImpl.EditSpace,
label: presentation.string.Edit,
icon: view.icon.Edit,
input: 'focus',
category: view.category.General,
target: card.class.CardSpace,
visibilityTester: view.function.CanEditSpace,
query: {},
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(builder, {
action: view.actionImpl.CopyTextToClipboard,
actionProps: {
textProvider: card.function.GetSpaceAccessPublicLink
},
label: card.string.GetIndividualPublicLink,
icon: view.icon.CopyLink,
input: 'any',
category: view.category.General,
target: card.class.CardSpace,
query: {},
visibilityTester: card.function.CanGetSpaceAccessPublicLink,
context: {
mode: ['context', 'browser']
}
})
createActions(builder)
builder.mixin(card.class.CardSpace, core.class.Class, workbench.mixin.SpaceView, {
view: {
@@ -497,31 +468,6 @@ export function createModel (builder: Builder): void {
presenter: card.component.SpacePresenter
})
createAction(
builder,
{
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.SetParentActionPopup,
element: 'top',
fillProps: {
_objects: 'value'
}
},
label: card.string.SetParent,
icon: card.icon.MasterTag,
input: 'none',
category: card.category.Card,
target: card.class.Card,
context: {
mode: ['context'],
application: card.app.Card,
group: 'associate'
}
},
card.action.SetParent
)
builder.mixin(card.class.Card, core.class.Class, view.mixin.AttributeEditor, {
inlineEditor: card.component.CardEditor
})
@@ -530,31 +476,6 @@ export function createModel (builder: Builder): void {
inlineEditor: card.component.CardArrayEditor
})
createAction(
builder,
{
action: view.actionImpl.UpdateDocument,
actionProps: {
key: 'parent',
value: null
},
query: {
parent: { $ne: null, $exists: true }
},
label: card.string.UnsetParent,
icon: card.icon.MasterTag,
input: 'none',
category: card.category.Card,
target: card.class.Card,
context: {
mode: ['context'],
application: card.app.Card,
group: 'associate'
}
},
card.action.UnsetParent
)
builder.createDoc(
view.class.Viewlet,
core.space.Model,
@@ -693,50 +614,6 @@ export function createModel (builder: Builder): void {
encode: card.function.GetCardLink
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.CreateTag,
props: {
_class: card.class.Tag
},
fillProps: {
_object: 'parent'
}
},
label: card.string.CreateTag,
input: 'focus',
icon: view.icon.Add,
category: setting.category.Settings,
target: card.class.MasterTag,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.CreateTag,
props: {
_class: card.class.Tag
},
fillProps: {
_object: 'parent'
}
},
label: card.string.CreateTag,
input: 'focus',
icon: view.icon.Add,
category: setting.category.Settings,
target: card.class.Tag,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
builder.mixin(card.class.MasterTag, core.class.Class, view.mixin.IgnoreActions, {
actions: [setting.action.CreateMixin, view.action.OpenInNewTab, view.action.Delete, setting.action.DeleteMixin]
})
@@ -745,77 +622,6 @@ export function createModel (builder: Builder): void {
actions: [setting.action.CreateMixin, view.action.OpenInNewTab, view.action.Delete, setting.action.DeleteMixin]
})
createAction(
builder,
{
action: card.actionImpl.DeleteMasterTag,
label: workbench.string.Delete,
icon: view.icon.Delete,
input: 'any',
category: view.category.General,
target: card.class.MasterTag,
context: {
mode: ['context', 'browser'],
group: 'remove'
}
},
card.action.DeleteMasterTag
)
createAction(builder, {
action: card.actionImpl.DeleteMasterTag,
label: workbench.string.Delete,
icon: view.icon.Delete,
input: 'any',
category: view.category.General,
target: card.class.Tag,
context: {
mode: ['context', 'browser'],
group: 'remove'
}
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.ChangeType,
fillProps: {
_object: 'value'
}
},
label: card.string.ChangeType,
input: 'focus',
icon: card.icon.MasterTag,
category: setting.category.Settings,
target: card.class.Card,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: card.component.CreateTag,
props: {
_class: card.class.MasterTag
},
fillProps: {
_object: 'parent'
}
},
label: card.string.CreateMasterTag,
input: 'focus',
icon: card.icon.MasterTag,
category: setting.category.Settings,
target: card.class.MasterTag,
context: {
mode: ['context', 'browser'],
group: 'edit'
}
})
builder.createDoc(
setting.class.WorkspaceSettingCategory,
core.space.Model,
@@ -12,6 +12,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.ReviewDocumentPermission,
scope: 'space',
description: documents.string.ReviewDocumentDescription
},
documents.permission.ReviewDocument
@@ -22,6 +23,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.ApproveDocumentPermission,
scope: 'space',
description: documents.string.ApproveDocumentDescription
},
documents.permission.ApproveDocument
@@ -32,6 +34,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.ArchiveDocumentPermission,
scope: 'space',
description: documents.string.ArchiveDocumentDescription
},
documents.permission.ArchiveDocument
@@ -42,6 +45,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.CoAuthorDocumentPermission,
scope: 'space',
description: documents.string.CoAuthorDocumentDescription
},
documents.permission.CoAuthorDocument
@@ -52,6 +56,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.CreateDocumentPermission,
scope: 'space',
description: documents.string.CreateDocumentDescription
},
documents.permission.CreateDocument
@@ -62,6 +67,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.UpdateDocumentOwnerPermission,
scope: 'space',
description: documents.string.UpdateDocumentOwnerDescription
},
documents.permission.UpdateDocumentOwner
@@ -72,6 +78,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.CreateDocumentCategoryPermission,
scope: 'space',
description: documents.string.CreateDocumentCategoryDescription
},
documents.permission.CreateDocumentCategory
@@ -82,6 +89,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.UpdateDocumentCategoryPermission,
scope: 'space',
description: documents.string.UpdateDocumentCategoryDescription
},
documents.permission.UpdateDocumentCategory
@@ -92,6 +100,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: documents.string.DeleteDocumentCategoryPermission,
scope: 'space',
description: documents.string.DeleteDocumentCategoryDescription
},
documents.permission.DeleteDocumentCategory
+8 -20
View File
@@ -23,6 +23,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: core.string.CreateObject,
scope: 'space',
description: core.string.CreateObjectDescription
},
core.permission.CreateObject
@@ -33,6 +34,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: core.string.UpdateObject,
scope: 'space',
description: core.string.UpdateObjectDescription
},
core.permission.UpdateObject
@@ -43,6 +45,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: core.string.DeleteObject,
scope: 'space',
description: core.string.DeleteObjectDescription
},
core.permission.DeleteObject
@@ -53,36 +56,20 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: core.string.ForbidDeleteObject,
txClass: core.class.TxRemoveDoc,
forbid: true,
scope: 'space',
description: core.string.ForbidDeleteObjectDescription
},
core.permission.ForbidDeleteObject
)
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: core.string.UpdateObject,
description: core.string.UpdateObjectDescription
},
core.permission.UpdateObject
)
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: core.string.DeleteObject,
description: core.string.DeleteObjectDescription
},
core.permission.DeleteObject
)
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: core.string.UpdateSpace,
scope: 'space',
description: core.string.UpdateSpaceDescription
},
core.permission.UpdateSpace
@@ -93,6 +80,7 @@ export function definePermissions (builder: Builder): void {
core.space.Model,
{
label: core.string.ArchiveSpace,
scope: 'space',
description: core.string.ArchiveSpaceDescription
},
core.permission.ArchiveSpace
+7 -1
View File
@@ -29,7 +29,9 @@ import {
type SpaceTypeDescriptor,
type TypedSpace,
type AccountUuid,
type TxAccessLevel
type TxAccessLevel,
type Tx,
type Doc
} from '@hcengineering/core'
import {
ArrOf,
@@ -155,6 +157,10 @@ export class TRole extends TAttachedDoc implements Role {
@UX(core.string.Permission)
export class TPermission extends TDoc implements Permission {
label!: IntlString
txClass?: Ref<Class<Tx>>
forbid?: boolean
objectClass?: Ref<Class<Doc<Space>>>
scope?: 'space' | 'workspace'
description?: IntlString
icon?: Asset
}
+2
View File
@@ -63,6 +63,7 @@ import { type Asset, getEmbeddedLabel } from '@hcengineering/platform'
import tags from '@hcengineering/tags'
import time, { type ToDo, type Todoable } from '@hcengineering/time'
import document from './plugin'
import { definePermissions } from './permissions'
export { documentId } from '@hcengineering/document'
@@ -550,6 +551,7 @@ export function createModel (builder: Builder): void {
defineDocument(builder)
defineApplication(builder)
definePermissions(builder)
builder.createDoc(core.class.DomainIndexConfiguration, core.space.Model, {
domain: DOMAIN_DOCUMENT,
+19
View File
@@ -0,0 +1,19 @@
import type { Builder } from '@hcengineering/model'
import core from '@hcengineering/core'
import document from '@hcengineering/document'
export function definePermissions (builder: Builder): void {
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: document.string.ForbidCreateTeamspacePermission,
scope: 'workspace',
txClass: core.class.TxCreateDoc,
objectClass: document.class.Teamspace,
forbid: true,
description: document.string.ForbidCreateTeamspacePermissionDescription
},
document.permission.ForbidCreateTeamspace
)
}
+2
View File
@@ -63,6 +63,7 @@ import workbench from '@hcengineering/model-workbench'
import { getEmbeddedLabel } from '@hcengineering/platform'
import drive from './plugin'
import { definePermissions } from './permissions'
export { driveId } from '@hcengineering/drive'
export { driveOperation } from './migration'
@@ -790,4 +791,5 @@ export function createModel (builder: Builder): void {
defineFile(builder)
defineFileVersion(builder)
defineApplication(builder)
definePermissions(builder)
}
+19
View File
@@ -0,0 +1,19 @@
import type { Builder } from '@hcengineering/model'
import core from '@hcengineering/core'
import drive from '@hcengineering/drive'
export function definePermissions (builder: Builder): void {
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: drive.string.ForbidCreateDrivePermission,
scope: 'workspace',
txClass: core.class.TxCreateDoc,
objectClass: drive.class.Drive,
forbid: true,
description: drive.string.ForbidCreateDrivePermissionDescription
},
drive.permission.ForbidCreateDrive
)
}
+2
View File
@@ -32,6 +32,7 @@ import { type ViewOptionsModel } from '@hcengineering/view'
import lead from './plugin'
import { defineSpaceType } from './spaceType'
import { definePermissions } from './permissions'
import { TCustomer, TFunnel, TLead } from './types'
export { leadId } from '@hcengineering/lead'
@@ -660,4 +661,5 @@ export function createModel (builder: Builder): void {
})
defineSpaceType(builder)
definePermissions(builder)
}
+19
View File
@@ -0,0 +1,19 @@
import type { Builder } from '@hcengineering/model'
import core from '@hcengineering/core'
import lead from '@hcengineering/lead'
export function definePermissions (builder: Builder): void {
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: lead.string.ForbidCreateFunnelPermission,
scope: 'workspace',
txClass: core.class.TxCreateDoc,
objectClass: lead.class.Funnel,
forbid: true,
description: lead.string.ForbidCreateFunnelPermissionDescription
},
lead.permission.ForbidCreateFunnel
)
}
+48
View File
@@ -434,6 +434,54 @@ export function defineFunctions (builder: Builder): void {
process.function.RoleContext
)
builder.createDoc(
process.class.ProcessFunction,
core.space.Model,
{
of: core.class.ArrOf,
category: 'array',
label: process.string.EmptyArray,
type: 'context'
},
process.function.EmptyArray
)
builder.createDoc(
process.class.ProcessFunction,
core.space.Model,
{
of: contact.mixin.Employee,
category: 'attribute',
label: process.string.ExecutionInitiator,
type: 'context'
},
process.function.ExecutionEmployeeInitiator
)
builder.createDoc(
process.class.ProcessFunction,
core.space.Model,
{
of: contact.class.Person,
category: 'attribute',
label: process.string.ExecutionInitiator,
type: 'context'
},
process.function.ExecutionInitiator
)
builder.createDoc(
process.class.ProcessFunction,
core.space.Model,
{
of: core.class.TypeDate,
category: 'attribute',
label: process.string.ExecutionStarted,
type: 'context'
},
process.function.ExecutionStarted
)
builder.createDoc(
process.class.ProcessFunction,
core.space.Model,
+23 -17
View File
@@ -37,6 +37,7 @@ import { type KeyBinding, type ViewOptionModel, type ViewOptionsModel } from '@h
import recruit from './plugin'
import { createReviewModel, reviewTableConfig, reviewTableOptions } from './review'
import { defineSpaceType } from './spaceType'
import { definePermissions } from './permissions'
import { TApplicant, TApplicantMatch, TCandidate, TOpinion, TReview, TVacancy, TVacancyList } from './types'
export { recruitId } from '@hcengineering/recruit'
@@ -1019,24 +1020,28 @@ export function createModel (builder: Builder): void {
},
override: [recruit.action.CreateGlobalApplication]
})
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: recruit.component.CreateCandidate,
element: 'top'
createAction(
builder,
{
action: view.actionImpl.ShowPopup,
actionProps: {
component: recruit.component.CreateCandidate,
element: 'top'
},
label: recruit.string.CreateTalent,
icon: recruit.icon.Create,
keyBinding: ['keyC'],
input: 'none',
category: recruit.category.Recruit,
target: core.class.Doc,
context: {
mode: ['workbench', 'browser'],
application: recruit.app.Recruit,
group: 'create'
}
},
label: recruit.string.CreateTalent,
icon: recruit.icon.Create,
keyBinding: ['keyC'],
input: 'none',
category: recruit.category.Recruit,
target: core.class.Doc,
context: {
mode: ['workbench', 'browser'],
application: recruit.app.Recruit,
group: 'create'
}
})
recruit.action.CreateTalent
)
createAction(builder, {
action: view.actionImpl.ShowPopup,
@@ -1596,4 +1601,5 @@ export function createModel (builder: Builder): void {
)
defineSpaceType(builder)
definePermissions(builder)
}
+19
View File
@@ -0,0 +1,19 @@
import type { Builder } from '@hcengineering/model'
import core from '@hcengineering/core'
import recruit from '@hcengineering/recruit'
export function definePermissions (builder: Builder): void {
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: recruit.string.ForbidCreateVacancyPermission,
scope: 'workspace',
txClass: core.class.TxCreateDoc,
objectClass: recruit.class.Vacancy,
forbid: true,
description: recruit.string.ForbidCreateVacancyPermissionDescription
},
recruit.permission.ForbidCreateVacancy
)
}
+21
View File
@@ -237,6 +237,27 @@ export function createModel (builder: Builder): void {
func: serverProcess.transform.RemoveLast
})
builder.mixin(process.function.EmptyArray, process.class.ProcessFunction, serverProcess.mixin.FuncImpl, {
func: serverProcess.transform.EmptyArray
})
builder.mixin(
process.function.ExecutionEmployeeInitiator,
process.class.ProcessFunction,
serverProcess.mixin.FuncImpl,
{
func: serverProcess.transform.ExecutionInitiator
}
)
builder.mixin(process.function.ExecutionInitiator, process.class.ProcessFunction, serverProcess.mixin.FuncImpl, {
func: serverProcess.transform.ExecutionInitiator
})
builder.mixin(process.function.ExecutionStarted, process.class.ProcessFunction, serverProcess.mixin.FuncImpl, {
func: serverProcess.transform.ExecutionStarted
})
builder.createDoc(serverCore.class.Trigger, core.space.Model, {
trigger: serverProcess.trigger.OnExecutionContinue,
txMatch: {
+2
View File
@@ -32,6 +32,7 @@ import { PaletteColorIndexes } from '@hcengineering/ui/src/colors'
import { createActions as defineActions } from './actions'
import tracker from './plugin'
import { definePresenters } from './presenters'
import { definePermissions } from './permissions'
import {
DOMAIN_TRACKER,
TClassicProjectTypeData,
@@ -709,6 +710,7 @@ export function createModel (builder: Builder): void {
]
})
definePermissions(builder)
defineSpaceType(builder)
}
+19
View File
@@ -0,0 +1,19 @@
import type { Builder } from '@hcengineering/model'
import core from '@hcengineering/core'
import tracker from '@hcengineering/tracker'
export function definePermissions (builder: Builder): void {
builder.createDoc(
core.class.Permission,
core.space.Model,
{
label: tracker.string.ForbidCreateProjectPermission,
txClass: core.class.TxCreateDoc,
objectClass: tracker.class.Project,
forbid: true,
scope: 'workspace',
description: tracker.string.ForbidCreateProjectPermissionDescription
},
tracker.permission.ForbidCreateProject
)
}
+8
View File
@@ -354,18 +354,22 @@ function defineTraining (builder: Builder): void {
definePermission(builder, training.permission.ChangeSomeoneElsesTrainingOwner, {
label: training.string.Permission_ChangeSomeoneElsesTrainingOwner,
scope: 'space',
description: training.string.Permission_ChangeSomeoneElsesTrainingOwner_Description
})
definePermission(builder, training.permission.CreateTraining, {
label: training.string.Permission_CreateTraining,
scope: 'space',
description: training.string.Permission_CreateTraining_Description
})
definePermission(builder, training.permission.ViewSomeoneElsesTrainingOverview, {
label: training.string.Permission_ViewSomeoneElsesTrainingOverview,
scope: 'space',
description: training.string.Permission_ViewSomeoneElsesTrainingOverview_Description
})
definePermission(builder, training.permission.ViewSomeoneElsesTrainingQuestions, {
label: training.string.Permission_ViewSomeoneElsesTrainingQuestions,
scope: 'space',
description: training.string.Permission_ViewSomeoneElsesTrainingQuestions_Description
})
}
@@ -491,14 +495,17 @@ function defineTrainingRequest (builder: Builder): void {
definePermission(builder, training.permission.ChangeSomeoneElsesSentRequestOwner, {
label: training.string.Permission_ChangeSomeoneElsesSentRequestOwner,
scope: 'space',
description: training.string.Permission_ChangeSomeoneElsesSentRequestOwner_Description
})
definePermission(builder, training.permission.CreateRequestOnSomeoneElsesTraining, {
label: training.string.Permission_CreateRequestOnSomeoneElsesTraining,
scope: 'space',
description: training.string.Permission_CreateRequestOnSomeoneElsesTraining_Description
})
definePermission(builder, training.permission.ViewSomeoneElsesSentRequest, {
label: training.string.Permission_ViewSomeoneElsesSentRequest,
scope: 'space',
description: training.string.Permission_ViewSomeoneElsesSentRequest_Description
})
})()
@@ -753,6 +760,7 @@ function defineTrainingAttempt (builder: Builder): void {
definePermission(builder, training.permission.ViewSomeoneElsesTraineesResults, {
label: training.string.Permission_ViewSomeoneElsesTraineesResults,
scope: 'space',
description: training.string.Permission_ViewSomeoneElsesTraineesResults_Description
})
}
+19
View File
@@ -835,6 +835,25 @@ export function createModel (builder: Builder): void {
view.action.Join
)
createAction(builder, {
action: view.actionImpl.ShowPopup,
actionProps: {
component: view.component.AddRelationPopup,
fillProps: {
_objects: 'value'
}
},
label: core.string.AddRelation,
input: 'any',
icon: view.icon.CopyLink,
category: view.category.Editor,
target: core.class.Doc,
context: {
mode: ['context', 'browser'],
group: 'associate'
}
})
createAction(
builder,
{
+2 -1
View File
@@ -96,7 +96,8 @@ export default mergeIds(viewId, view, {
BaseDocPresenter: '' as AnyComponent,
MasterDetailView: '' as AnyComponent,
AssociationPresenter: '' as AnyComponent,
TreeView: '' as AnyComponent
TreeView: '' as AnyComponent,
AddRelationPopup: '' as AnyComponent
},
string: {
Table: '' as IntlString,
+1 -1
View File
@@ -69,4 +69,4 @@
"PersonId": "Osoba",
"AccountId": "Účet"
}
}
}
+1 -1
View File
@@ -69,4 +69,4 @@
"PersonId": "Id de personne",
"AccountId": "Compte"
}
}
}
+72
View File
@@ -0,0 +1,72 @@
{
"string": {
"Id": "Id",
"Space": "Alan",
"Spaces": "Alanlar",
"SpacesDescription": "Tüm alanların alan tipini yönet",
"TypedSpace": "Tipli alan",
"SpaceType": "Alan tipi",
"Modified": "Değiştirildi",
"ModifiedDate": "Değiştirilme tarihi",
"ModifiedBy": "Değiştiren",
"Class": "Sınıf",
"AttachedTo": "Eklenen",
"AttachedToClass": "Eklenen sınıf",
"Name": "İsim",
"Description": "Açıklama",
"ShortDescription": "Kısa açıklama",
"Descriptor": "Tanımlayıcı",
"TargetClass": "Hedef sınıf",
"Role": "Rol",
"Roles": "Roller",
"Private": "Özel",
"Archived": "Arşivlendi",
"ClassLabel": "Tip",
"ClassPropertyLabel": "Etiket",
"String": "Metin",
"Markup": "İşaretleme",
"Number": "Sayı",
"Boolean": "Onay kutusu",
"Timestamp": "Zaman damgası",
"Date": "Tarih",
"IntlString": "IntlString",
"Ref": "Referans",
"Collection": "Koleksiyon",
"Array": "Çoklu Seçim",
"Enum": "Seçim",
"Members": "Üyeler",
"Hyperlink": "URL",
"MarkupBlobRef": "İşbirlikçi",
"Object": "Nesne",
"System": "Sistem",
"CreatedBy": "Oluşturan",
"CreatedDate": "Oluşturulma tarihi",
"Status": "Durum",
"StatusCategory": "Durum kategorisi",
"Account": "Hesap",
"Rank": "Sıra",
"Owners": "Sahipler",
"Permission": "İzin",
"CreateObject": "Nesne oluştur",
"UpdateObject": "Nesneyi güncelle",
"DeleteObject": "Nesneyi sil",
"ForbidDeleteObject": "Nesne silmeyi yasakla",
"UpdateSpace": "Alanı güncelle",
"ArchiveSpace": "Alanı arşivle",
"CreateObjectDescription": "Kullanıcılara alanda nesne oluşturma yetkisi verir",
"UpdateObjectDescription": "Kullanıcılara alandaki nesneleri güncelleme yetkisi verir",
"DeleteObjectDescription": "Kullanıcılara alandaki nesneleri silme yetkisi verir",
"ForbidDeleteObjectDescription": "Kullanıcıların alandaki nesneleri silmesini yasaklar",
"UpdateSpaceDescription": "Kullanıcılara alanı güncelleme yetkisi verir",
"ArchiveSpaceDescription": "Kullanıcılara alanı arşivleme yetkisi verir",
"AutoJoin": "Otomatik katıl",
"AutoJoinDescr": "Yeni çalışanları bu alana otomatik olarak ekle",
"BlobSize": "Boyut",
"BlobContentType": "İçerik türü",
"Relation": "İlişki",
"Relations": "İlişkiler",
"AddRelation": "İlişki ekle",
"PersonId": "Kişi",
"AccountId": "Hesap"
}
}
+5
View File
@@ -17,6 +17,7 @@
import type { Asset, IntlString, Plugin } from '@hcengineering/platform'
import type { DocumentQuery } from './storage'
import { type WorkspaceDataId, type WorkspaceUuid } from './utils'
import { Tx } from '.'
/**
* @public
@@ -529,6 +530,10 @@ export type RolesAssignment = Record<Ref<Role>, AccountUuid[] | undefined>
*/
export interface Permission extends Doc {
label: IntlString
txClass?: Ref<Class<Tx>>
forbid?: boolean
objectClass?: Ref<Class<Doc>>
scope?: 'space' | 'workspace'
description?: IntlString
icon?: Asset
}
+29
View File
@@ -0,0 +1,29 @@
{
"status": {
"LoadingPlugin": "{plugin} eklentisi yükleniyor...",
"UnknownError": "Bilinmeyen hata: {message}",
"InvalidId": "Geçersiz Id: {id}",
"BadRequest": "Hatalı istek",
"Forbidden": "Yasak",
"Conflict": "Çakışma",
"ExpiredLink": "Bu davet bağlantısının süresi dolmuş",
"Unauthorized": "Yetkisiz",
"UnknownMethod": "Bilinmeyen metod: {method}",
"InternalServerError": "Dahili sunucu hatası",
"MaintenanceWarning": "Bakım Planlandı:",
"MaintenanceWarningTime": "{time, plural, =1 {bir dakikadan az} other {# dakika}}",
"AccountNotFound": "Hesap bulunamadı veya girilen kimlik bilgileri yanlış",
"AccountNotConfirmed": "Hesap doğrulanmadı",
"WorkspaceNotFound": "Çalışma alanı bulunamadı",
"AccountAlreadyExists": "Hesap zaten mevcut",
"WorkspaceRateLimit": "Sunucu meşgul, Lütfen biraz bekleyin ve tekrar deneyin",
"AccountAlreadyConfirmed": "Hesap zaten doğrulandı",
"WorkspaceAlreadyExists": "Çalışma alanı zaten mevcut",
"InvalidOtp": "Geçersiz kod",
"InviteNotFound": "E-posta ile davet bulunamadı: {email}",
"WorkspaceLimitReached": "Çalışma alanı limitine ulaştınız. Lütfen bizimle iletişime geçin...",
"ReadOnlyAccount": "Anonim Misafir Demo",
"SystemAccount": "Sistem hesabı",
"SocialIdAlreadyExists": "Sosyal ID zaten mevcut"
}
}
+61
View File
@@ -0,0 +1,61 @@
{
"string": {
"Create": "Oluştur",
"Cancel": "İptal",
"Ok": "Tamam",
"Save": "Kaydet",
"Saved": "Kaydedildi...",
"Download": "İndir",
"DownloadOriginal": "Orijinali indir",
"Delete": "Sil",
"Close": "Kapat",
"NotSelected": "Seçilmedi",
"Deselect": "Seçimi kaldır",
"Archived": "(arşivlendi)",
"AddSocialLinks": "Sosyal bağlantılar ekle",
"EditSocialLinks": "Sosyal bağlantıları düzenle",
"Change": "Değiştir",
"Remove": "Kaldır",
"Search": "Ara...",
"Spaces": "Alanlar",
"NumberSpaces": "{count, plural, =0 {İçinde} =1 {1 yerde} other {# yerde}}",
"InThis": "Bu {space} içinde",
"NoMatchesInThis": "Bu {space} içinde eşleşme yok",
"NoMatchesFound": "Eşleşme bulunamadı",
"NotInThis": "Bu {space} içinde değil",
"Match": "Eşleşme",
"Add": "Ekle",
"Edit": "Düzenle",
"DocumentPreview": "Önizleme",
"MakePrivate": "Özel yap",
"MakePrivateDescription": "Sadece üyeler görebilir",
"Created": "Oluşturuldu",
"Selected": "Seçildi",
"NoResults": "Gösterilecek sonuç yok",
"Next": "İleri",
"FailedToPreview": "Önizleme başarısız",
"ContentType": "İçerik türü",
"ContentTypeNotSupported": "Bu içerik türü için önizleme mevcut değil",
"StartDrawing": "Üzerine çiz",
"DrawingHistory": "Çizim geçmişi",
"ColorAdd": "Renk önayarı ekle",
"ColorRemove": "Renk önayarını kaldır",
"ColorReset": "Renk önayarlarını sıfırla",
"Copy": "Kopyala",
"DocumentUrlCopied": "Kopyalandı!",
"CopyLink": "Bağlantıyı kopyala",
"AccessDenied": "Nesne mevcut değil veya erişim izniniz yok.",
"UnableToFollowMention": "Bahsedilen nesne açılamıyor",
"Undo": "Geri al",
"Redo": "Yinele",
"ClearCanvas": "Tuvali temizle",
"PenTool": "Kalem aracı",
"EraserTool": "Silgi aracı",
"PanTool": "Kaydırma aracı",
"TextTool": "Metin aracı",
"PaletteManagementMenu": "Renk önayarlarını yönet"
},
"status": {
"FileTooLarge": "Dosya çok büyük"
}
}
-1
View File
@@ -642,7 +642,6 @@
border: 1px solid var(--theme-popup-divider); // var(--global-surface-02-BorderColor);
border-radius: var(--large-BorderRadius);
box-shadow: var(--global-modal-ShadowX) var(--global-modal-ShadowY) var(--global-modal-ShadowBlur) var(--global-modal-ShadowSpread) var(--global-popover-ShadowColor);
max-width: 90vw;
&.large {
min-width: unset;
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {1 minuta před} other {# minut před}}",
"HoursBefore": "{hours, plural, =1 {1 hodina před} other {# hodin před}}",
"DaysBefore": "{days, plural, =1 {1 den před} other {# dní před}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Tschechisch",
"German": "Deutsch",
"Japanese": "Japanisch",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {eine Minute vorher} other {# Minuten vorher}}",
"HoursBefore": "{hours, plural, =1 {eine Stunde vorher} other {# Stunden vorher}}",
"DaysBefore": "{days, plural, =1 {einen Tag vorher} other {# Tage vorher}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {a minute before} other {# minutes before}}",
"HoursBefore": "{hours, plural, =1 {an hour before} other {# hours before}}",
"DaysBefore": "{days, plural, =1 {a day before} other {# days before}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {un minuto antes} other {# minutos antes}}",
"HoursBefore": "{hours, plural, =1 {una hora antes} other {# horas antes}}",
"DaysBefore": "{days, plural, =1 {un día antes} other {# días antes}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {une minute avant} other {# minutes avant}}",
"HoursBefore": "{hours, plural, =1 {une heure avant} other {# heures avant}}",
"DaysBefore": "{days, plural, =1 {un jour avant} other {# jours avant}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {un minuto prima} other {# minuti prima}}",
"HoursBefore": "{hours, plural, =1 {un'ora prima} other {# ore prima}}",
"DaysBefore": "{days, plural, =1 {un giorno prima} other {# giorni prima}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {1分前} other {#分前}}",
"HoursBefore": "{hours, plural, =1 {1時間前} other {#時間前}}",
"DaysBefore": "{days, plural, =1 {1日前} other {#日前}}",
+1
View File
@@ -57,6 +57,7 @@
"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}}",
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {за минуту} one {за # минуту} few {за # минуты} other {за # минут}}",
"HoursBefore": "{hours, plural, =1 {за час} one {за # час} few {за # часа} other {за # часов}}",
"DaysBefore": "{days, plural, =1 {за день} one {за # день} few {за # дня} other {за # дней}}",
+113
View File
@@ -0,0 +1,113 @@
{
"string": {
"EditBoxPlaceholder": "Metin yazın...",
"Ok": "Tamam",
"Cancel": "İptal",
"Save": "Kaydet",
"Publish": "Yayınla",
"SaveDraft": "Taslak kaydet",
"MinutesAgo": "{minutes, plural, =0 {bir dakikadan az önce} =1 {bir dakika önce} other {# dakika önce}}",
"HoursAgo": "{hours, plural, =0 {bir saatten az önce} =1 {bir saat önce} other {# saat önce}}",
"DaysAgo": "{days, plural, =0 {bugün} =1 {dün} other {# gün önce}}",
"MonthsAgo": "{months, plural, =0 {bu ay} =1 {bir ay önce} other {# ay önce}}",
"YearsAgo": "{years, plural, =0 {bu yıl} =1 {bir yıl önce} other {# yıl önce}}",
"Minutes": "{minutes, plural, =0 {bir dakikadan az} =1 {bir dakika} other {# dakika}}",
"Hours": "{hours, plural, =0 {bir saatten az} =1 {bir saat} other {# saat}}",
"Days": "{days, plural, =0 {bugün} =1 {1 gün} other {# gün}}",
"Weeks": "{weeks, plural, =0 {bu hafta} =1 {1 hafta} other {# hafta}}",
"Months": "{months, plural, =0 {bu ay} =1 {1 ay} other {# ay}}",
"Years": "{years, plural, =0 {bu yıl} =1 {bir yıl} other {# yıl}}",
"Before": "Önce",
"After": "Sonra",
"MinutesShort": "{value}dk",
"HoursShort": "{value}sa",
"DaysShort": "{value}g",
"ShowMore": "Daha fazla göster",
"ShowLess": "Daha az göster",
"Search": "Ara",
"SearchDots": "Ara...",
"SearchResults": "Arama Sonuçları",
"Suggested": "Önerilen",
"TimeTooltip": "{value}",
"SelectDate": "Tarih seç",
"None": "Hiçbiri",
"NotSelected": "Seçilmedi",
"Today": "Bugün",
"NoDate": "Tarih yok",
"StartDate": "Başlangıç tarihi",
"TargetDate": "Hedef tarih",
"Overdue": "Gecikmiş",
"DueDate": "Bitiş tarihi",
"AddDueDate": "Bitiş tarihi ekle",
"SetDueDate": "Bitiş tarihi belirle",
"EditDueDate": "Bitiş tarihini düzenle",
"SaveDueDate": "Bitiş tarihini kaydet",
"NeedsToBeCompletedByThisDate": "Bu tarihe kadar tamamlanmalı",
"DueDatePopupTitle": "Bitiş: {value}",
"DueDatePopupOverdueTitle": "Bitiş tarihiydi: {value}",
"DueDatePopupDescription": "{value, plural, =0 {Bugün} =1 {Yarın} other {# gün kaldı}}",
"DueDatePopupOverdueDescription": "{value, plural, =1 {1 gün gecikti} other {# gün gecikti}}",
"English": "English",
"Russian": "Русский",
"Portuguese": "Português",
"Spanish": "Español",
"Chinese": "中文",
"French": "Français",
"Italian": "Italiano",
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {bir dakika önce} other {# dakika önce}}",
"HoursBefore": "{hours, plural, =1 {bir saat önce} other {# saat önce}}",
"DaysBefore": "{days, plural, =1 {bir gün önce} other {# gün önce}}",
"WeeksBefore": "{weeks, plural, =1 {bir hafta önce} other {# hafta önce}}",
"MonthsBefore": "{months, plural, =1 {bir ay önce} other {# ay önce}}",
"MinutesAfter": "{minutes, plural, =1 {bir dakika sonra} other {# dakika sonra}}",
"HoursAfter": "{hours, plural, =1 {bir saat sonra} other {# saat sonra}}",
"DaysAfter": "{days, plural, =1 {bir gün sonra} other {# gün sonra}}",
"WeeksAfter": "{weeks, plural, =1 {bir hafta sonra} other {# hafta sonra}}",
"MonthsAfter": "{months, plural, =1 {bir ay sonra} other {# ay sonra}}",
"NoActionsDefined": "Uygulanabilir işlem yok",
"Incoming": "Gelen",
"HoursLabel": "Saat",
"Back": "Geri",
"Next": "İleri",
"DropdownDefaultLabel": "Öğe Seç",
"DD": "GG",
"MM": "AA",
"YYYY": "YYYY",
"HH": "SS",
"Remove": "Kaldır",
"NoResults": "Sonuç Yok",
"MoreCount": "{count} daha",
"Spacious": "Geniş",
"Compact": "Kompakt",
"ThemeLight": "Açık",
"ThemeDark": "Koyu",
"ThemeSystem": "Sistem",
"NoTimeZonesFound": "Zaman dilimi bulunamadı",
"Selected": "Seçildi:",
"Submit": "Gönder",
"NextStep": "Sonraki adım",
"TypeHere": "Buraya yazın...",
"NormalSize": "Normal boyut",
"FullSize": "Tam boyut",
"UseMaxWidth": "Maksimum genişlik",
"Sidebar": "Kenar çubuğu",
"FontSize": "Yazı boyutu",
"Language": "Dil",
"DaysWOValue": "{days, plural, =1 {gün} other {gün}}",
"WeeksWOValue": "{weeks, plural, =1 {hafta} other {hafta}}",
"MonthsWOValue": "{months, plural, =1 {ay} other {ay}}",
"Filter": "Filtre",
"Clear": "Temizle",
"Yesterday": "Dün",
"ThisWeek": "Bu hafta",
"ThisMonth": "Bu ay",
"ThisYear": "Bu yıl",
"EmojiStyle": "Emoji Stili",
"EmojiSystem": "Sistem Varsayılanı",
"EmojiNoto": "Noto Color"
}
}
+1
View File
@@ -57,6 +57,7 @@
"Czech": "Čeština",
"German": "Deutsch",
"Japanese": "日本語",
"Turkish": "Türkçe",
"MinutesBefore": "{minutes, plural, =1 {一分钟前} other {# 分钟前}}",
"HoursBefore": "{hours, plural, =1 {一小时前} other {# 小时前}}",
"DaysBefore": "{days, plural, =1 {一天前} other {# 天前}}",
@@ -0,0 +1,130 @@
<!--
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { HeaderButtonAction, SelectPopupValueType } from '../types'
import { checkPermission, Client, getCurrentAccount, hasAccountRole, TxOperations } from '@hcengineering/core'
import { ButtonWithDropdown, Button, Loading, IconAdd, IconDropdown } from '../index'
export let mainActionId: number | string | null = null
export let loading = false
export let client: TxOperations & Client
export let actions: HeaderButtonAction[] = []
export let visibleActions: (string | number | null)[] = []
let allowedActions: HeaderButtonAction[] = []
let items: HeaderButtonAction[] = []
let mainAction: HeaderButtonAction | undefined = undefined
$: filterVisibleActions(allowedActions, visibleActions)
$: filterAllowedActions(actions).catch(() => {})
function filterVisibleActions (allowed: HeaderButtonAction[], visible: (string | number | null)[]): void {
items = allowed.filter((action) => visible.includes(action.id))
mainAction = items.find((a) => a.id === mainActionId)
if (mainAction === undefined && items.length > 0) {
mainAction = items[0]
}
}
async function filterAllowedActions (actions: HeaderButtonAction[]): Promise<SelectPopupValueType[]> {
const result: HeaderButtonAction[] = []
for (const action of actions) {
if (await isActionAllowed(action)) {
result.push(action)
}
action.keyBinding = await action.keyBindingPromise
}
allowedActions = result
return result
}
async function isActionAllowed (action: HeaderButtonAction): Promise<boolean> {
if (action.accountRole === undefined && action.permissions === undefined) return true
if (action.accountRole !== undefined && hasAccountRole(getCurrentAccount(), action.accountRole)) return true
if (action.permissions !== undefined) {
for (const permission of action.permissions) {
if (await checkPermission(client, permission.id, permission.space)) return true
}
}
return false
}
</script>
{#if mainAction !== undefined}
{#if loading}
<Loading shrink />
{:else}
<div class="antiNav-subheader">
{#if items.length === 1}
<Button
icon={IconAdd}
justify="left"
kind="primary"
label={mainAction.label}
width="100%"
on:click={mainAction.callback}
showTooltip={{
direction: 'bottom',
label: mainAction.label,
keys: mainAction.keyBinding
}}
>
<div slot="content" class="draft-circle-container">
{#if mainAction.draft === true}
<div class="draft-circle" />
{/if}
</div>
</Button>
{:else}
<ButtonWithDropdown
icon={IconAdd}
justify={'left'}
kind={'primary'}
label={mainAction.label}
dropdownItems={items}
dropdownIcon={IconDropdown}
on:dropdown-selected={(ev) => {
items.find((a) => a.id === ev.detail)?.callback()
}}
on:click={mainAction.callback}
mainButtonId={mainAction.id !== null ? String(mainAction.id).replaceAll(':', '-') : undefined}
showTooltipMain={{
direction: 'bottom',
label: mainAction.label,
keys: mainAction.keyBinding
}}
>
<div slot="content" class="draft-circle-container">
{#if mainAction.draft === true}
<div class="draft-circle" />
{/if}
</div>
</ButtonWithDropdown>
{/if}
</div>
{/if}
{/if}
<style lang="scss">
.draft-circle-container {
margin-left: auto;
padding-right: 12px;
}
.draft-circle {
height: 6px;
width: 6px;
background-color: var(--primary-bg-color);
border-radius: 50%;
}
</style>
+7 -1
View File
@@ -23,6 +23,7 @@
export let type: 'type-aside' | 'type-popup' | 'type-component'
export let width: 'large' | 'medium' | 'small' | 'x-small' | 'menu' | undefined = undefined
export let maxWidth: string | undefined = undefined
export let label: IntlString | undefined = undefined
export let labelProps: any | undefined = undefined
export let okAction: () => Promise<void> | void = () => {}
@@ -69,7 +70,12 @@
<svelte:window on:keydown={onKeyDown} />
<div class="hulyModal-container {type} {width ?? ''}" class:hidden class:noTopIndent>
<div
class="hulyModal-container {type} {width ?? ''}"
class:hidden
class:noTopIndent
style={maxWidth ? `max-width: ${maxWidth};` : ''}
>
<Header
{type}
{adaptive}
+1
View File
@@ -56,6 +56,7 @@ export { getCurrentLocation, locationToUrl, navigate, location, setLocationStora
export { default as EditBox } from './components/EditBox.svelte'
export { default as Label } from './components/Label.svelte'
export { default as Button } from './components/Button.svelte'
export { default as HeaderButton } from './components/HeaderButton.svelte'
export { default as ButtonWithDropdown } from './components/ButtonWithDropdown.svelte'
export { default as ButtonGroup } from './components/ButtonGroup.svelte'
export { default as FilterButton } from './components/FilterButton.svelte'
+16 -1
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
import type { Blob, Ref, Timestamp } from '@hcengineering/core'
import type { AccountRole, Blob, Permission, Ref, Timestamp, TypedSpace } from '@hcengineering/core'
import type {
Asset,
IntlString,
@@ -519,6 +519,21 @@ export interface SelectPopupValueType {
}
}
/**
* @public
*/
export interface HeaderButtonAction extends SelectPopupValueType {
callback: () => void
keyBindingPromise?: Promise<string[] | undefined>
keyBinding?: string[] | undefined
draft?: boolean
accountRole?: AccountRole
permissions?: Array<{
id: Ref<Permission>
space: Ref<TypedSpace>
}>
}
/**
* @public
*/
+8
View File
@@ -0,0 +1,8 @@
{
"string": {
"Achievements": "Başarılar",
"EarliestAdopter": "İlk Kullanıcı",
"Epic": "Destansı",
"Legendary": "Efsanevi"
}
}
+61
View File
@@ -0,0 +1,61 @@
{
"string": {
"Activity": "Aktivite",
"Added": "eklendi",
"All": "Tümü",
"AllActivity": "Tüm aktiviteler",
"Attributes": "Öznitelikler",
"Changed": "Değiştirildi",
"CollectionUpdated": "{collection} güncellendi",
"Created": "Oluşturuldu",
"DocAdded": "{_class} eklendi",
"DocCreated": "{_class} oluşturuldu",
"DocDeleted": "{_class} silindi",
"Edit": "Düzenle",
"Edited": "Düzenlendi",
"Emoji": "Emoji",
"For": "İçin",
"From": "kaynak",
"In": "İçinde",
"At": "de",
"LastReply": "Son yanıt",
"New": "Yeni",
"NewestFirst": "Önce en yeniler",
"Pinned": "Sabitlendi",
"Reacted": "Tepki verildi",
"Reactions": "Tepkiler",
"Reaction": "Tepki",
"Removed": "kaldırıldı",
"Replies": "Yanıtlar",
"RepliesCount": "{replies, plural, =1 {# yanıt} other {# yanıt}}",
"Set": "ayarlandı",
"To": "hedef",
"Unset": "Kaldırıldı",
"Update": "Güncelle",
"Updated": "Güncellendi",
"UpdatedCollection": "Güncellendi",
"Message": "Mesaj",
"Mentioned": "Bahsedildi",
"You": "Sen",
"Mentions": "Bahsetmeler",
"MentionedYouIn": "{title} içinde senden bahsetti",
"Messages": "Mesajlar",
"Thread": "Başlık",
"AddReaction": "Tepki ekle",
"SaveForLater": "Sonraya kaydet",
"RemoveFromLater": "Kayıtlılardan kaldır",
"ReactionNotificationTitle": "{title} üzerine tepki",
"ReactionNotificationBody": "{senderName}: {reaction}",
"NewObject": "Yeni {object}",
"RemovedObject": "Kaldırılan {object}",
"ChangedObject": "Değişen {object}",
"UnsetObject": "Kaldırılan {object}",
"UpdatedObject": "Güncellenen {object}",
"NewObjectType": "Yeni {type}: {title}",
"RemovedObjectType": "Kaldırılan {type}: {title}",
"AddedTag": "Etiket eklendi: {title}",
"RemovedTag": "Etiket kaldırıldı: {title}",
"AttributeSetTo": "{name}, {value} olarak ayarlandı",
"ValueTooLarge": "Değer görüntülenemeyecek kadar büyük"
}
}
+13
View File
@@ -0,0 +1,13 @@
{
"string": {
"IntegrationLabel": "AI Asistan",
"IntegrationDescription": "Platformdaki günlük iş akışınızı düzenlemeye, otomatikleştirmeye ve kolaylaştırmaya yardımcı olan yapay zeka destekli kişisel asistanınız",
"ConfigLabel": "AI Asistan",
"ConfigDescription": "Yapay zeka destekli kişisel asistan",
"Connect": "Bağlan",
"Cancel": "İptal",
"Status": "Durum",
"FailedToConnect": "AI Asistan servisi kullanılamıyor",
"Configure": "AI Asistanı Yapılandır"
}
}
@@ -0,0 +1,22 @@
{
"string": {
"OnboardingChannelDescription": "Kullanıcı: {user}; Çalışma alanı: {workspace}",
"Error": "Hata: ",
"InProject": " projede ",
"NavigateToSpecial": "{app}: {special} aç",
"OpenSpecial": "{special} aç ",
"Set": "Ayarla ",
"To": " değerine ",
"Open": "aç ",
"Workbench": "Çalışma Masası: ",
"OnboardingChannel": "Karşılama Kanalı",
"OnboardingChannels": "Karşılama Kanalları",
"WorkspaceId": "Çalışma alanı id",
"WorkspaceName": "Çalışma alanı adı",
"WorkspaceUrl": "Çalışma alanı url",
"Account": "Hesap",
"UserName": "Kullanıcı adı",
"DisableAIReplies": "AI yanıtlarını devre dışı bırak",
"ShowAIReplies": "AI yanıtlarını göster"
}
}
+59
View File
@@ -0,0 +1,59 @@
{
"string": {
"UploadDropFilesHere": "Dosyaları yükleyin veya buraya sürükleyin",
"NoAttachments": "Buna ait ek yok",
"NoParticipants": "Katılımcı eklenmedi",
"AddAttachment": "ek yüklendi",
"Attachments": "Ekler",
"Photos": "Fotoğraflar",
"File": "Dosya",
"Files": "Dosyalar",
"NoFiles": "Dosya yok",
"ShowMoreAttachments": "Daha fazla göster",
"Type": "Tip",
"Size": "Boyut",
"Photo": "Fotoğraf",
"Date": "Tarih",
"LastModified": "Son Değiştirilme",
"Name": "İsim",
"FileBrowser": "Dosya tarayıcı",
"FileBrowserFileCounter": "{results, plural, =1 {# sonuç} other {# sonuç}}",
"FileBrowserListView": "Liste",
"FileBrowserGridView": "Izgara",
"FileBrowserFilterFrom": "Kimden",
"FileBrowserFilterIn": "İçinde",
"FileBrowserFilterDate": "Tarih",
"FileBrowserFilterFileType": "Dosya tipi",
"FileBrowserSort": "Sırala",
"FileBrowserSortNewest": "En yeni dosya",
"FileBrowserSortOldest": "En eski dosya",
"FileBrowserSortAZ": "A'dan Z'ye",
"FileBrowserSortZA": "Z'den A'ya",
"FileBrowserSortSmallest": "En küçük dosya",
"FileBrowserSortBiggest": "En büyük dosya",
"FileBrowserDateFilterAny": "Herhangi bir zaman",
"FileBrowserDateFilterToday": "Bugün",
"FileBrowserDateFilterYesterday": "Dün",
"FileBrowserDateFilter7Days": "Son 7 gün",
"FileBrowserDateFilter30Days": "Son 30 gün",
"FileBrowserDateFilter3Months": "Son 3 ay",
"FileBrowserDateFilter12Months": "Son 12 ay",
"FileBrowserTypeFilterAny": "Herhangi bir dosya tipi",
"FileBrowserTypeFilterImages": "Görseller",
"FileBrowserTypeFilterAudio": "Ses",
"FileBrowserTypeFilterVideos": "Videolar",
"FileBrowserTypeFilterPDFs": "PDF'ler",
"AddAttachmentToSaved": "Eki kayıtlılara ekle",
"RemoveAttachmentFromSaved": "Eki kayıtlılardan kaldır",
"DeleteFile": "Dosyayı sil",
"Description": "Açıklama",
"Pinned": "Önemli",
"PinAttachment": "Önemli olarak işaretle",
"UnPinAttachment": "Daha az önemli olarak işaretle",
"FilterAttachments": "Ekler",
"RemovedAttachment": "Ek kaldırıldı",
"ContentType": "İçerik türü",
"OpenInWindow": "Pencerede aç",
"Embeddings": "Gömülü içerikler"
}
}
+10
View File
@@ -0,0 +1,10 @@
{
"string": {
"Billing": "Faturalama",
"DriveSize": "Dosya boyutu",
"DriveCount": "Dosya sayısı",
"OfficeSessionsDuration": "Toplantı süresi",
"OfficeSessionsBandwidth": "Toplantı bant genişliği",
"OfficeEgressDuration": "Kayıt süresi"
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"string": {
"BitrixTokenUrl": "Bitrix24 Token Url",
"Bitrix": "",
"BitrixDesc": "Bitrix 24 entegrasyonu",
"Settings": "Yapılandır",
"NotAllowed": "Yönetici hakları olmadan izin verilmiyor",
"BitrixEntityType": "Varlık eşleştirmesi",
"FieldMapping": "Alan eşleştirmesi",
"AddField": "Eşleştirme ekle",
"Attribute": "Öznitelik",
"MapField": "Eşleştir...",
"BitrixImport": "Bitrix ile senkronize et",
"AddMapping": "Varlık eşleştirmesi ekle",
"ConfigLabel": "Bitrix24",
"ConfigDescription": "Bitrix 24 entegrasyonu için uzantı"
}
}
+107
View File
@@ -0,0 +1,107 @@
{
"string": {
"Completed": "Tamamlandı",
"Name": "İsim",
"CreateBoard": "Pano oluştur",
"OpenCard": "Kartı Aç",
"CreateCard": "Kart oluştur",
"CardName": "Kart adı",
"Cards": "Kartlar",
"SelectBoard": "Pano seç",
"More": "Daha fazla...",
"Title": "Başlık",
"ManageBoardStatuses": "Pano durumlarını yönet",
"BoardName": "Pano",
"CardCreateLabel": "Kart",
"CardPlaceholder": "Kart yer tutucusu",
"Board": "Pano",
"Boards": "Panolar",
"MyBoards": "Panolarım",
"BoardApplication": "Panolar",
"Card": "Kart",
"Assignee": "Atanan",
"Description": "Açıklama",
"DescriptionPlaceholder": "Daha detaylı bir açıklama ekleyin...",
"Location": "Konum",
"Members": "Üyeler",
"IsArchived": "Arşivlendi",
"BoardCreateLabel": "Pano",
"Settings": "Ayarlar",
"Suggested": "Önerilen",
"Labels": "Etiketler",
"CreateLabel": "Yeni etiket oluştur",
"SearchLabels": "Etiket ara...",
"SelectColor": "Renk seç",
"NoColor": "Renk yok.",
"NoColorInfo": "Bu, kartların önünde görünmeyecek.",
"Checklists": "Kontrol listeleri",
"ChecklistDropdownNone": "(hiçbiri)",
"ShowDoneChecklistItems": "İşaretli öğeleri göster ({done})",
"HideDoneChecklistItems": "İşaretli öğeleri gizle",
"CopyChecklistFrom": "Öğeleri kopyala...",
"Dates": "Tarihler",
"Attachments": "Ekler",
"AddAttachment": "Ek ekle",
"DropFileToUpload": "Yüklemek için dosyaları bırakın.",
"AttachFrom": "Buradan ekle...",
"AttachmentTip": "İpucu: Dosyaları yüklemek için kartların üzerine sürükleyip bırakabilirsiniz.",
"Computer": "Bilgisayar",
"CustomFields": "Özel Alanlar",
"AddButton": "Düğme Ekle",
"Actions": "İşlemler",
"Cover": "Kapak",
"Join": "Katıl",
"Move": "Taşı",
"Copy": "Kopyala",
"MakeTemplate": "Şablon Yap",
"Archive": "Arşivle",
"SendToBoard": "Panoya gönder",
"Delete": "Sil",
"HideDetails": "Detayları Gizle",
"ShowDetails": "Detayları Göster",
"NewList": "Başka liste ekle",
"AddList": "Liste ekle",
"NewListPlaceholder": "Liste başlığı girin...",
"AddACard": "Kart ekle",
"AddCard": "Kart ekle",
"CardTitlePlaceholder": "Bu kart için başlık girin...",
"MoveCard": "Kartı taşı",
"SelectDestination": "Hedef seç",
"Create": "Oluştur",
"CreateDescription": "İsterseniz, her yeni satır ({number}) için bir kart oluşturabiliriz. Ayrıca uzun başlıklı tek bir kart oluşturabilirsiniz.",
"CreateSingle": "Sadece bir kart",
"CreateMultiple": "{number} kart oluştur",
"Cancel": "İptal",
"List": "Liste",
"Position": "Pozisyon",
"Current": "{label} (mevcut)",
"Save": "Kaydet",
"Remove": "Kaldır",
"NullDate": "G/A/YYYY",
"ViewProfile": "Profili görüntüle",
"RemoveFromCard": "Karttan kaldır",
"LinkName": "Bağlantı adı",
"Edit": "Düzenle",
"Update": "Güncelle",
"DeleteAttachment": "Ek silme kalıcıdır. Geri alma yoktur.",
"DeleteCard": "Tüm işlemler aktivite akışından kaldırılacak ve kartı yeniden açamazsınız. Geri alma yoktur.",
"SearchMembers": "Üye ara",
"Menu": "Menü",
"ShowMenu": "Menüyü göster",
"ToArchive": "Arşivle",
"CopyCard": "Kartı kopyala",
"AlsoCopy": "Koru...",
"CopyTo": "Kopyala...",
"NoResults": "Sonuç yok",
"SwitchToLists": "Listelere geç",
"SwitchToCards": "Kartlara geç",
"SearchArchive": "Arşivi ara...",
"Size": "Boyut",
"RemoveCover": "Kapağı kaldır",
"DeleteChecklist": "Kontrol listesini sil",
"DeleteChecklistConfirm": "Kontrol listesini silme kalıcıdır ve geri almanın yolu yoktur.",
"ConvertToCard": "Karta dönüştür",
"ConfigLabel": "Pano",
"ConfigDescription": "Kanban panolarını yönetmek için uzantı."
}
}
+129
View File
@@ -0,0 +1,129 @@
{
"string": {
"ApplicationLabelCalendar": "Takvim",
"Calendars": "Takvimler",
"Participants": "Katılımcılar",
"NoParticipants": "Katılımcı eklenmedi",
"PersonsLabel": "{name}",
"AddDescription": "Açıklama ekle",
"Date": "Tarih",
"DueTo": "Bitiş tarihi",
"Description": "Açıklama",
"Title": "Başlık",
"Location": "Konum",
"Company": "Şirket",
"CreateCalendar": "Takvim Oluştur",
"Calendar": "Takvim",
"Events": "Etkinlikler",
"Event": "Etkinlik",
"ModeDay": "Gün",
"ModeWeek": "Hafta",
"ModeMonth": "Ay",
"ModeYear": "Yıl",
"Today": "Bugün",
"TableView": "Tablo",
"DueMinutes": "{minutes, plural, =0 {bir dakikadan az} =1 {bir dakika} other {# dakika}}",
"DueHours": "{hours, plural, =0 {bir saatten az} =1 {1 saat} other {# saat}}",
"DueDays": "{days, plural, =0 {bugün} =1 {1 gün} other {# gün}}",
"Reminder": "Hatırlatıcı",
"ReminderTime": "Hatırlatıcı zamanı",
"RemindMeAt": "Bana hatırlat:",
"CreateReminder": "Hatırlatıcı oluştur",
"CreatedReminder": "Hatırlatıcı oluşturuldu",
"Reminders": "Hatırlatıcılar",
"Shift": "Vardiya",
"State": "Durum",
"NoReminders": "Hatırlatıcı yok",
"AllDay": "Tüm gün",
"AndMore": "Ve {count} daha",
"CreateEvent": "Etkinlik oluştur",
"EventFor": "Etkinlik:",
"ConfigLabel": "Takvim",
"ConfigDescription": "Etkinliklerle takvim görmek için uzantı",
"HideDetails": "Detayları gizle",
"ReccuringEvent": "Tekrarlanan etkinlik",
"ExternalParticipants": "Harici katılımcılar",
"IntegrationDescr": "Etkinlikleri ve görevleri Google Takvim ile senkronize edin",
"Connect": "Bağlan",
"RedirectGoogle": "Google kimlik doğrulama sayfasına yönlendirileceksiniz. Lütfen tüm izinleri seçtiğinizden emin olun.",
"ConnectCalendar": "Google Takvim hesabını bağla",
"EditRecEvent": "Tekrarlanan etkinliği düzenle",
"RemoveRecEvent": "Tekrarlanan etkinliği kaldır",
"ThisEvent": "Bu etkinlik",
"ThisAndNext": "Bu ve sonraki etkinlikler",
"AllEvents": "Tüm etkinlikler",
"EventTitlePlaceholder": "Etkinlik başlığı",
"TimeZone": "Saat dilimi",
"Repeat": "Tekrarla",
"On": "Açık",
"Every": "Her",
"After": "Sonra",
"Ends": "Biter",
"Never": "Asla",
"Day": "Gün",
"Week": "Hafta",
"Month": "Ay",
"Year": "Yıl",
"MondayShort": "Pt",
"TuesdayShort": "Sa",
"WednesdayShort": "Ça",
"ThursdayShort": "Pe",
"FridayShort": "Cu",
"SaturdayShort": "Ct",
"SundayShort": "Pa",
"OnUntil": "Açık",
"Times": "{count, plural, one {kez} other {kez}}",
"AddParticipants": "Katılımcı ekle",
"Sync": "Senkronizasyon",
"Busy": "Meşgul",
"AddReminder": "Hatırlatıcı ekle",
"SeeAllNumberParticipants": "{value, plural, other {Tüm # katılımcıyı gör}}",
"SeeAllNumberReminders": "{value, plural, other {Tüm # hatırlatıcıyı gör}}",
"Visibility": "Görünürlük",
"Private": "Sadece size görünür",
"Public": "Herkese görünür",
"FreeBusy": "Uygunluk Durumu",
"DefaultVisibility": "Varsayılan görünürlük",
"NotAllPermissions": "Tüm izinler verilmedi",
"GooglePrivacy": "Huly'nin Google API'lerinden aldığı bilgilerin kullanımı ve diğer uygulamalara aktarımı, Sınırlı Kullanım gereksinimleri dahil olmak üzere <a href=\"https://developers.google.com/terms/api-services-user-data-policy#additional_requirements_for_specific_api_scopes\" target=\"_blank\">Google API Hizmetleri Kullanıcı Verileri Politikası</a>'na uyacaktır.",
"Value": "{value}",
"Schedule": "Genel program",
"ScheduleNew": "Program ekle",
"ScheduleDeleteConfirm": "Program silinecek. Onaylıyor musunuz?",
"ScheduleShareLink": "Bağlantıyı paylaş",
"ScheduleSharedLinkMessage": "<p>Başkalarının sizinle toplantı ayarlamasına izin vermek için bu bağlantıyı paylaşın:</p><p><a href=\"{link}\" target=\"_blank\">{link}</a></p>",
"ScheduleAvailability": "Uygunluk",
"ScheduleUnavailable": "Uygun değil",
"ScheduleTitlePlaceholder": "Program başlığı",
"ScheduleAddPeriod": "Dönem ekle",
"ScheduleRemovePeriod": "Dönem kaldır",
"MeetingDuration": "Toplantı süresi",
"MeetingInterval": "Toplantılar arası mola",
"CalDavAccess": "CalDAV erişimi",
"CalDavAccessPrompt": "CalDAV protokolü, kişisel Huly takviminizi harici takvim uygulamalarıyla senkronize etmenizi sağlar. Bir takvim istemci uygulamasında Huly CalDAV sunucusunu kaydetmek için bu hesabı ve önerilen şifreyi kullanın.",
"CalDavAccessEnable": "{ws} çalışma alanındaki kişisel takvime CalDAV erişimini etkinleştir",
"CalDavAccessServer": "CalDAV sunucusu",
"CalDavAccessAccount": "Huly hesabı",
"CalDavAccessPassword": "Şifre",
"CalDavAccessPasswordWarning": "Bu şifreyi bir daha göremeyeceksiniz. Lütfen güvenli bir yere kaydedin.",
"MeetingScheduledNotification": "Toplantı planlandı",
"MeetingRescheduledNotification": "Toplantı zamanı değişti",
"MeetingCanceledNotification": "Toplantı iptal edildi: {title}",
"PrimaryCalendar": "Birincil takvim",
"Hidden": "Gizli",
"Each": "Her",
"OnThe": "Şu tarihte:",
"First": "İlk",
"Second": "İkinci",
"Third": "Üçüncü",
"Fourth": "Dördüncü",
"Fifth": "Beşinci",
"NextToLast": "Sondan bir önceki",
"Last": "Son",
"Weekday": "Hafta içi günü",
"WeekendDay": "Hafta sonu günü",
"SynchronizedCalendars": "Senkronize takvimler",
"Account": "Hesap",
"NoCalendars": "Senkronizasyon için takvim seçilmedi"
}
}
+53
View File
@@ -0,0 +1,53 @@
{
"string": {
"Card": "Kart",
"CardApplication": "Kartlar (beta)",
"Cards": "Kartlar",
"Content": "İçerik",
"CreateCard": "Kart Oluştur",
"CreateMasterTag": "Tip Oluştur",
"CreateTag": "Etiket Oluştur",
"MasterTag": "Tip",
"MasterTags": "Tipler",
"Parent": "Üst",
"Tags": "Etiketler",
"Tag": "Etiket",
"AddTag": "Etiket Ekle",
"CardLibrary": "Kart Kütüphanesi",
"MinimizeAll": "Tümünü Küçült",
"ExpandAll": "Tümünü Genişlet",
"DeleteTag": "Etiketi Sil",
"TagRelations": "Etiket İlişkileri",
"DeleteTagConfirm": "Bu etiketi silmek istediğinizden emin misiniz? İlgili tüm özellikler silinecektir",
"DeleteMasterTag": "Tipi Sil",
"DeleteMasterTagConfirm": "Bu tipi silmek istediğinizden emin misiniz? Bu tiple ilgili tüm nesneler silinecektir",
"UnsetParent": "Üst öğeyi kaldır",
"SetParent": "Üst öğe belirle",
"CreateChild": "Alt öğe oluştur",
"Children": "Alt öğeler",
"Views": "Görünümler",
"CreateView": "Görünüm Oluştur",
"EditView": "Görünümü Düzenle",
"SelectViewType": "Görünüm Tipi Seç",
"Document": "Doküman",
"Documents": "Dokümanlar",
"ChangeType": "Tip değiştir",
"ChangeTypeWarning": "Uyarı: Bir Kartın Tipini değiştirmek, hedef Tipte bulunmayan öznitelikler için tüm verileri kaldıracaktır. Önceki öznitelik verileri, Kartı önceki Tipe geri değiştirerek geri yüklenebilir. Kart içeriği etkilenmeyecektir.",
"MasterDetailViews": "Ana Detay Görünümleri",
"SelectType": "Tip Seç",
"CreateSpace": "Alan oluştur",
"NumberTypes": "{count, plural, one {# tip} other {# tip}}",
"Labels": "Etiketler",
"Properties": "Özellikler",
"NoChildren": "Alt öğe yok",
"ConfigDescription": "Veritabanı tarzı bilgi yönetimi için uzantı.",
"AddCollaborators": "İşbirlikçi ekle",
"CardTitle": "Başlık",
"Post": "Gönderi",
"GetIndividualPublicLink": "Kişiselleştirilmiş genel bağlantı al",
"ShowLess": "Daha az göster",
"CardContent": "Ne paylaşmak istiyorsunuz?",
"Feed": "Akış",
"AllCards": "Tüm Kartlar"
}
}
@@ -151,6 +151,7 @@
okLoading={creating}
canSave={data.title != null && data.title.trim().length > 0 && _space != null}
onCancel={handleCancel}
maxWidth="90vw"
on:close
>
<div class="hulyModal-content__titleGroup" style="padding: 0">
+19
View File
@@ -0,0 +1,19 @@
{
"string": {
"Channel": "Kanal",
"Channels": "Kanallar",
"Chat": "Sohbet",
"Description": "Açıklama",
"Loading": "Yükleniyor...",
"MessageIn": "#{title} içinde mesaj",
"Thread": "Başlık",
"Threads": "Başlıklar",
"Title": "Başlık",
"All": "Tüm güncellemeler",
"Inbox": "Gelen Kutusu",
"ReactedToYourMessage": "mesajınıza tepki verdi",
"ClearAll": "Tümünü temizle",
"InboxIsClear": "Gelen kutusu temiz",
"YouDontHaveAnyNewMessages": "Yeni mesajınız yok"
}
}
+138
View File
@@ -0,0 +1,138 @@
{
"string": {
"ApplicationLabelChunter": "Sohbet",
"LeftComment": "yorum bıraktı",
"Channels": "Kanallar",
"DirectMessages": "Direkt mesajlar",
"CreateChannel": "Yeni Kanal",
"NewDirectMessage": "Yeni Direkt Mesaj",
"ChannelName": "İsim",
"ChannelNamePlaceholder": "Kanal",
"ChannelDescription": "Açıklama",
"Channel": "Kanal",
"DirectMessage": "Direkt mesaj",
"EditUpdate": "Kaydet...",
"EditCancel": "İptal",
"Comments": "Yorumlar",
"About": "Hakkında",
"Members": "Üyeler",
"NoMembers": "Üye yok",
"MentionedIn": "Senden bahsetti: ",
"Mentioned": "Bahsedildi",
"ContactInfo": "İletişim Bilgisi",
"Content": "İçerik",
"Comment": "Yorum",
"Message": "Mesaj",
"MessageOn": "Mesaj tarihi",
"On": "tarihinde",
"Reference": "Referans",
"Chat": "Sohbet",
"In": "İçinde",
"MentionNotification": "Bahsedildi",
"Topic": "Konu",
"Thread": "Başlık",
"Threads": "Başlıklar",
"New": "Yeni",
"MarkUnread": "Okunmadı olarak işaretle",
"GetNewReplies": "Yeni yanıtlardan haberdar ol",
"TurnOffReplies": "Yanıt bildirimlerini kapat",
"PinMessage": "Mesajı sabitle",
"UnpinMessage": "Sabitleneni kaldır",
"Pinned": "Sabitlendi",
"EditMessage": "Mesajı düzenle",
"Edited": "düzenlendi",
"DeleteMessage": "Mesajı sil",
"AndYou": "{participants, plural, =0 {Sadece sen} other {ve sen}}",
"ShowMoreReplies": "{count} yanıt daha göster",
"Settings": "Ayarlar",
"ArchiveChannel": "Kanalı arşivle",
"UnarchiveChannel": "Arşivden çıkar",
"ArchiveConfirm": "Bir kanalı arşivlediğinizde, herkes için arşivlenir.<br/><br/>Kimse mesaj gönderemez, ancak kanalın geçmişine erişim devam eder.<br/><br/>Kanalın içeriğini arama yoluyla bulabilirsiniz.<br/>Ve gerekirse gelecekte kanalı arşivden çıkarabilirsiniz.\n",
"UnarchiveConfirm": "Kanalı arşivden çıkarmak istiyor musunuz?",
"AddToSaved": "Kayıtlılara ekle",
"RemoveFromSaved": "Kayıtlılardan kaldır",
"EmptySavedHeader": "Daha sonra dönmek için mesajlar ekleyin",
"EmptySavedText": "Yapılacaklarınızı işaretleyin veya bir şeyi başka bir zamana kaydedin. Kayıtlı öğelerinizi sadece siz görebilirsiniz, bu yüzden istediğiniz gibi kullanın.",
"SharedBy": "{name} tarafından {time} paylaşıldı",
"LeaveChannel": "Kanaldan ayrıl",
"ChannelBrowser": "Kanal tarayıcı",
"Saved": "Kayıtlı",
"ConvertToPrivate": "Özel kanala dönüştür",
"MessagesBrowser": "Mesaj tarayıcı",
"CreateBy": "Oluşturan",
"ThreadMessage": "Başlık mesajı",
"ChunterBrowser": "Tarayıcı",
"Messages": "Mesajlar",
"NoResults": "Sonuç yok",
"CopyLink": "Bağlantıyı kopyala",
"FilterBacklinks": "Geri bağlantılar",
"DM": "Direkt mesaj",
"DMNotification": "Size mesaj gönderdi",
"ConfigLabel": "Sohbet",
"ConfigDescription": "Metin iletişimi gerçekleştirmek için uzantı",
"LastMessage": "Son mesaj",
"You": "Sen",
"YouHaveJoinedTheConversation": "Sohbete katıldınız",
"NoMessages": "Henüz mesaj yok",
"DirectNotificationTitle": "{senderName}",
"DirectNotificationBody": "{message}",
"MessageNotificationBody": "{senderName}: {message}",
"AddCommentPlaceholder": "Yorum ekle...",
"Reacted": "Tepki verildi",
"Docs": "Dokümanlar",
"NewestFirst": "Önce en yeniler",
"ReplyToThread": "Başlığa yanıt ver",
"SentMessage": "Mesaj gönderildi",
"Direct": "Direkt",
"RepliedToThread": "Başlığa yanıt verildi",
"RepliedTo": "yanıtlandı: {message}",
"AllChannels": "Tüm kanallar",
"AllContacts": "Tüm kişiler",
"NewChannel": "Yeni kanal",
"TopicOptional": "Konu (opsiyonel)",
"Visibility": "Görünürlük",
"Public": "Genel",
"Private": "Özel",
"NewDirectChat": "Yeni direkt sohbet",
"AddMembers": "Üye ekle",
"PinnedCount": "{count} sabitlendi",
"LoadingHistory": "Geçmiş yükleniyor...",
"UnpinChannels": "Tüm kanalların sabitlemesini kaldır",
"ArchiveActivityConfirmationTitle": "Tüm aktivite kanallarını arşivle?",
"ArchiveActivityConfirmationMessage": "Tüm aktivite kanallarını arşivlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
"CloseConversation": "Sohbeti kapat",
"Starred": "Yıldızlı",
"DeleteStarred": "Yıldızlıyı sil",
"StarChannel": "Kanalı yıldızla",
"StarConversation": "Sohbeti yıldızla",
"UnstarChannel": "Kanal yıldızını kaldır",
"UnstarConversation": "Sohbet yıldızını kaldır",
"JoinChannelHeader": "Başlamak için \"Katıl\"a tıklayın.",
"JoinChannelText": "Katıldıktan sonra tüm mesajları okuyabilir ve tartışmaya katkıda bulunabilirsiniz.",
"NoMessagesInChannel": "Şu anda mesaj yok",
"SendMessagesInChannel": "Sohbeti başlatmak için ilk mesajı gönderin",
"LatestMessages": "↓ Son mesajlar",
"Joined": "Katıldı",
"Left": "Ayrıldı",
"Added": "Eklendi",
"Removed": "Kaldırıldı",
"CreatedChannelOn": "Bu kanal {date} tarihinde oluşturuldu",
"ChannelMessages": "Kanal mesajları",
"JoinChannel": "Kanala katıl",
"YouJoinedChannel": "Kanala katıldınız",
"AndMore": "ve {count} daha",
"IsTyping": "{count, plural, =1 {yazıyor} other {yazıyorlar}}...",
"ThreadIn": "{name} içinde başlık",
"TranslateMessage": "Mesajı çevir",
"Translate": "Çevir",
"ShowOriginal": "Orijinali göster",
"Translating": "Çevriliyor...",
"StartConversation": "Sohbet başlat",
"ViewingThreadFromArchivedChannel": "Arşivlenmiş bir kanaldan başlık görüntülüyorsunuz",
"ViewingArchivedChannel": "Arşivlenmiş bir kanal görüntülüyorsunuz",
"OpenChatInSidebar": "Sohbeti kenar çubuğunda aç",
"ResolveThread": "Çöz",
"NoThreadsYet": "Henüz başlık yok.",
"SummarizeMessages": "Tartışmayı özetle"
}
}
+93
View File
@@ -0,0 +1,93 @@
{
"string": {
"Messages": "Mesajlar",
"FirstMessages": "İlk mesajlar",
"LatestMessages": "Son mesajlar",
"Subscribe": "Abone ol",
"Unsubscribe": "Abonelikten çık",
"File": "Dosya",
"Files": "Dosyalar",
"Added": "Eklendi",
"All": "Tümü ({count})",
"Attach": "Ekle",
"Cancel": "İptal",
"Edit": "Düzenle",
"Edited": "Düzenlendi",
"Emoji": "Emoji",
"HoursAgo": "{hours, plural, =0 {bir saatten az önce} =1 {bir saat önce} other {# saat önce}}",
"JustNow": "Şimdi",
"LastReply": "Son yanıt",
"Mention": "Bahset",
"MinutesAgo": "{minutes, plural, =0 {bir dakikadan az önce} =1 {bir dakika önce} other {# dakika önce}}",
"MonthAt": "{month} - {time}",
"New": "Yeni",
"Removed": "Kaldırıldı",
"RepliesCount": "{count, plural, =0 {yanıt yok} =1 {1 yanıt} other {# yanıt}}",
"Reply": "Yanıtla",
"Send": "Gönder",
"Set": "Ayarla",
"ShowFormatting": "Biçimlendirmeyi göster",
"To": "Kime",
"Today": "Bugün",
"Unset": "Kaldır",
"WeekdayAt": "{weekday} - {time}",
"YearAt": "{year} - {time}",
"Yesterday": "Dün",
"YesterdayAt": "Dün - {time}",
"AndMore": "ve {count} daha",
"IsTyping": "{count, plural, =1 {yazıyor} other {yazıyorlar}}...",
"Loading": "Yükleniyor...",
"MessageIn": "#{title} içinde mesaj",
"ThreadWasRemoved": "Bu başlık kaldırıldı.",
"MessageWasRemoved": "Bu mesaj kaldırıldı.",
"JoinedThe": "Katıldı:",
"LeftThe": "Ayrıldı:",
"Translating": "Çevriliyor...",
"ShowOriginal": "Orijinal gösteriliyor",
"AddReaction": "Tepki ekle",
"ReplyInThread": "Başlıkta yanıtla",
"TranslateMessage": "Mesajı çevir",
"ShowOriginalMessage": "Orijinal mesajı göster",
"EditMessage": "Mesajı düzenle",
"RemoveMessage": "Mesajı kaldır",
"CreateCard": "Kart oluştur",
"MessageAlreadyHasCardAttached": "Bu mesaja zaten bir kart eklenmiş!",
"CreatePoll": "Anket oluştur",
"Poll": "Anket",
"QuestionIsRequired": "Soru gereklidir.",
"AnswerIsRequired": "Cevap gereklidir.",
"OptionIsRequired": "Seçenek gereklidir.",
"StartDateMustBeInTheFuture": "Başlangıç tarihi gelecekte olmalıdır.",
"EndDateMustBeInTheFuture": "Bitiş tarihi gelecekte olmalıdır.",
"Question": "Soru",
"AskQuestion": "Soru sor",
"PollOptions": "Anket seçenekleri",
"Option": "Seçenek",
"AnonymousVoting": "Anonim oylama",
"MultipleChoice": "Çoktan seçmeli",
"QuizMode": "Quiz modu",
"StartTime": "Başlangıç zamanı",
"EndTime": "Bitiş zamanı",
"OpenPoll": "Anketi aç",
"RetractVote": "Oyu geri çek",
"Quiz": "Quiz",
"VotesCount": "{count, plural, =0 {oy yok} =1 {1 oy} other {# oy}}",
"Vote": "Oy ver",
"ShowResults": "Sonuçları göster",
"Ended": "Bitti",
"StartsAt": "Başlangıç: {date}",
"EndsAt": "Bitiş: {date}",
"StartsTomorrow": "Yarın başlıyor: {date}",
"EndsTomorrow": "Yarın bitiyor: {date}",
"PollResults": "Anket sonuçları",
"Polls": "Anketler",
"TotalVotes": "Toplam oy",
"Voted": "Oy verildi",
"VotedFor": "Oy verilen",
"RevokedVote": "Oy geri çekildi",
"AnonymousQuiz": "Anonim quiz",
"Direct": "Direkt",
"Directs": "Direktler",
"Members": "Üyeler"
}
}
+129
View File
@@ -0,0 +1,129 @@
{
"string": {
"Apply": "Uygula",
"Contacts": "Kişiler",
"Persons": "Kişiler",
"Organizations": "Şirketler",
"CreatePerson": "Kişi",
"CreateOrganization": "Şirket",
"OrganizationNamePlaceholder": "Şirket adı",
"OrganizationsNamePlaceholder": "Şirketler",
"PersonFirstNamePlaceholder": "Ad",
"PersonLastNamePlaceholder": "Soyad",
"PersonLocationPlaceholder": "Konum",
"PersonsNamePlaceholder": "Klasör",
"Name": "İsim",
"SelectFolder": "Klasör seç",
"OrganizationsFolder": "Şirketler klasörü",
"PersonsFolder": "Kişiler klasörü",
"ContactCreateLabel": "Kişi oluştur",
"SearchEmployee": "Çalışan ara...",
"SearchPerson": "Kişi ara...",
"SearchOrganization": "Şirket ara...",
"ContactInfo": "İletişim Bilgisi",
"Contact": "Kişi",
"Location": "Konum",
"Channel": "Kişi kaydı",
"ChannelProvider": "Kanal sağlayıcı",
"Person": "Kişi",
"Organization": "Şirket",
"Employee": "Çalışan",
"DeleteEmployee": "Çalışanı sil",
"DeleteEmployeeDescr": "Çalışanı çalışma alanından silmek istediğinizden emin misiniz?",
"Value": "Değer",
"FullDescription": "Tam açıklama",
"Phone": "Telefon",
"LinkedIn": "LinkedIn",
"GitHub": "GitHub",
"Twitter": "Twitter",
"Google": "Google",
"Telegram": "Telegram",
"PhonePlaceholder": "+90 555 333 7777",
"LinkedInPlaceholder": "https://linkedin.com/in/adisoyad",
"AtPlaceHolder": "@kullaniciadi",
"FacebookPlaceholder": "https://fb.com/adisoyad",
"Facebook": "Facebook",
"HomepagePlaceholder": "https://adisoyad.com",
"Homepage": "Ana sayfa",
"SocialLinks": "Sosyal bağlantılar",
"ViewActivity": "Aktiviteyi görüntüle",
"PersonAlreadyExists": "Kişi zaten mevcut...",
"Status": "Durum",
"SetStatus": "Durum belirle",
"ClearStatus": "Durumu temizle",
"SaveStatus": "Kaydet",
"Cancel": "İptal",
"StatusDueDate": "Bitiş tarihi",
"NoExpire": "Süresiz",
"TypeLabel": "Tip",
"StatusDueDateTooltip": "{date} tarihine kadar",
"CopyToClipboard": "Kopyala",
"ViewFullProfile": "Tam profili görüntüle",
"Member": "Üye",
"Members": "Üyeler",
"NoMembers": "Üye eklenmedi",
"AddMember": "Üye ekle",
"KickEmployee": "Çalışanı çıkar",
"KickEmployeeDescr": "Çalışanı çalışma alanından çıkarmak istediğinizden emin misiniz? Bu işlem geri alınamaz",
"ResendInvite": "Daveti Yeniden Gönder",
"ResendInviteDescr": "Bu kullanıcıya çalışma alanı için daveti yeniden göndermek istediğinizden emin misiniz?",
"Email": "E-posta",
"CreateEmployee": "Çalışan",
"Inactive": "Pasif",
"Active": "Aktif",
"Role": "Rol",
"Birthday": "Doğum günü",
"UseImage": "Ekli fotoğraf",
"UseGravatar": "Gravatar",
"UseColor": "Renk",
"NotSpecified": "Belirtilmedi",
"Whatsapp": "Whatsapp",
"WhatsappPlaceholder": "Whatsapp",
"Skype": "Skype",
"SkypePlaceholder": "Skype",
"Profile": "Profil",
"ProfilePlaceholder": "Profil...",
"CurrentEmployee": "Mevcut çalışan",
"MergePersons": "Kişileri birleştir",
"MergePersonsFrom": "Kaynak kişi",
"MergePersonsTo": "Hedef kişi",
"SelectAvatar": "Avatar seç",
"Avatar": "Avatar",
"AvatarProvider": "Avatar sağlayıcı",
"GravatarsManaged": "Gravatar'lar yönetilir",
"Through": "üzerinden",
"AddMembersHeader": "{value}'e üye ekle:",
"Assigned": "Atanmış",
"Unassigned": "Atanmamış",
"CategoryCurrentUser": "Mevcut kullanıcı",
"CategoryOther": "Diğer",
"NumberMembers": "{count, plural, =0 {üye yok} =1 {1 üye} other {# üye}}",
"Position": "Pozisyon",
"ConfigLabel": "Kişiler",
"ConfigDescription": "Tüm Çalışanlar ve diğer Kişi/Organizasyon kişileri hakkında bilgi tutmak için uzantı.",
"HasMessagesIn": "mesajları var:",
"HasNewMessagesIn": "yeni mesajları var:",
"Employees": "Çalışanlar",
"People": "Kişiler",
"For": "İçin",
"SelectUsers": "Kullanıcıları seç",
"AddGuest": "Misafir ekle",
"ViewProfile": "Profili görüntüle",
"Viber": "Viber",
"ViberPlaceholder": "Viber",
"SocialId": "Sosyal ID",
"SocialIds": "Sosyal ID'ler",
"Type": "Tip",
"Confirmed": "Doğrulandı",
"UserProfile": "Kullanıcı profili",
"DeactivatedAccount": "Devre dışı hesap",
"LocalTime": "yerel saat",
"Everyone": "Herkes",
"Here": "Burada",
"EveryoneDescription": "Bu {title} içindeki herkesi bilgilendir",
"HereDescription": "Bu {title} içindeki çevrimiçi üyeleri bilgilendir",
"Guest": "Misafir",
"Deleted": "Silindi",
"CannotMerge": "Hata: Global kişiler birleştirilemez"
}
}
@@ -31,6 +31,7 @@
export let placeholder: IntlString = presentation.string.Search
export let selected: Ref<Employee>[] = []
export let skipCurrentAccount = false
export let skipAccounts: Ref<Employee>[] = []
export let disableDeselectFor: Ref<Employee>[] = []
export let showStatus = true
export let skipInactive = false
@@ -91,6 +92,7 @@
{showStatus}
{disableDeselectFor}
{skipCurrentAccount}
{skipAccounts}
{skipInactive}
on:select={handleSelectionChanged}
/>
@@ -28,6 +28,7 @@
export let search: string = ''
export let selected: Ref<Employee>[] = []
export let skipCurrentAccount = false
export let skipAccounts: Ref<Employee>[] = []
export let disableDeselectFor: Ref<Employee>[] = []
export let showStatus = true
export let skipInactive = false
@@ -52,7 +53,7 @@
? { $search: search }
: { [searchField]: { $like: '%' + search + '%' } }
: {}),
...(skipCurrentAccount ? { _id: { $ne: me } } : {}),
...{ _id: { $nin: skipCurrentAccount ? [...skipAccounts, me] : [...skipAccounts] } },
...(skipInactive ? { active: true } : {}),
...(skipOnlyLocal ? { personUuid: { $exists: true } } : {})
},
@@ -0,0 +1,284 @@
{
"string": {
"ID": "ID",
"Code": "Kod",
"Number": "Numara",
"Category": "Kategori",
"CollaborativeDocument": "İşbirlikli doküman",
"ControlledDocument": "Kontrollü doküman",
"Requests": "Talepler",
"EffectiveDate": "Yürürlük tarihi",
"PlannedEffectiveDate": "Planlanan yürürlük tarihi",
"Rank": "Sıra",
"DocumentRequest": "Talep",
"DocumentReviewRequest": "Doküman inceleme talebi",
"DocumentApprovalRequest": "Doküman onay talebi",
"ControlledStatus": "Kontrol durumu",
"Categories": "Kategoriler",
"Guidance": "Rehber",
"Required": "Gerekli",
"Description": "Açıklama",
"Major": "Majör",
"Minor": "Minör",
"Patch": "Yama",
"ValidationWorkflow": "Doğrulama iş akışı",
"Creator": "Oluşturan",
"ChangeOwner": "Doküman yazarını değiştir",
"ChangeOwnerHintBeginning": "Yazarlığı",
"ChangeOwnerHintEnd": "başka bir kişiye aktar.",
"ChangeOwnerWarning": "Bu işlemden sonra bu dokümanı düzenleyemeyeceksiniz.",
"SelectOwner": "Yeni yazar seç",
"CreateDocument": "Yeni doküman oluştur",
"CreateTemplate": "Yeni şablon oluştur",
"Documents": "Dokümanlar",
"Document": "Doküman",
"NewDocumentDialogClose": "Bu diyalogu kapatmak istiyor musunuz?",
"NewDocumentCloseNote": "Tüm değişiklikler kaybolacak",
"Cancel": "İptal",
"EditorPlaceholder": "düzenlemeye başlamak için yazın...",
"Version": "Sürüm",
"TemplateVersion": "Şablon sürümü",
"VersionValue": "v{major}.{minor}",
"SearchDocument": "Doküman ara...",
"CreateEnVersion": "İnceleme için sürüm oluştur",
"Approvers": "Onaylayanlar",
"CoAuthors": "Ortak Yazarlar",
"Status": "Durum",
"TemplateName": "Şablon adı",
"DocumentApplication": "Kontrollü Dokümanlar",
"MyDocuments": "Dokümanlarım",
"Library": "Kütüphane",
"Labels": "Etiketler",
"Author": "Yazar",
"Review": "İnceleme",
"Approval": "Onay",
"Reviewer": "İnceleyici",
"Approver": "Onaylayan",
"DeleteCategory": "Kategori silinsin mi?",
"DeleteCategoryHint": "Bu işlem geri alınamaz",
"DeleteCategoryWarning": "Kategori kullanımda olduğu için silinemez",
"Latest": "Güncel",
"Draft": "Taslak",
"Reviewers": "İnceleyiciler",
"ViewMode": "Görüntüleme",
"EditMode": "Düzenleme",
"ComparisonMode": "Karşılaştırma",
"Compare": "Karşılaştır:",
"Against": "İle:",
"ComparisonModeNotSupported": "Karşılaştırma modu desteklenmiyor.",
"CreateDraft": "Taslak Oluştur",
"SendForApproval": "Onaya gönder",
"SendForReview": "İncelemeye gönder",
"CompleteReview": "İncelemeyi tamamla",
"Approve": "Onayla",
"Reject": "Reddet",
"ConfirmApproval": "Onayı onayla",
"ConfirmRejection": "Reddi onayla",
"ProvideRejectionReason": "Red nedenini yazın...",
"RejectionReason": "Red nedeni",
"ConfirmReviewCompletion": "İnceleme tamamlamayı onayla",
"ConfirmApprovalSubmission": "Onay gönderimini onayla",
"ConfirmReviewSubmission": "İnceleme gönderimini onayla",
"AddApprovalTitle": "Dokümanınızı onaylayanlar gönder",
"AddApprovalDescription1": "Dokümanınızı onaya hazırlamak için birkaç gereksinimi karşılaması gerekir:",
"AddApprovalDescription2": "'Taslak' veya 'İncelendi' durumunda olmalı",
"AddApprovalDescription3": "çözülmemiş yorumu olmamalı",
"AddApprovalDescription4": "eğitim planlanmışsa, eğitimin durumu 'Yayınlandı' olmalı",
"NoApprovalsDescription": "Bu doküman sürümü için onay yok",
"CurrentVersion": "Mevcut sürüm",
"DocumentTemplate": "Şablon",
"DocumentTemplates": "Şablonlar",
"DocumentCode": "Doküman kodu",
"TemplateCode": "Şablon kodu",
"DocumentCodePlaceholder": "DOC-1",
"DocumentPrefixPlaceholder": "DOC",
"DocumentPrefix": "Doküman öneki",
"DocumentTemplateCreateLabel": "Şablon",
"DocumentCategoryCreateLabel": "Kategori",
"CreateDocumentCategory": "Kategori oluştur",
"DocumentCategoryAlreadyExists": "\"{title}\" kategorisi zaten mevcut. ",
"DocumentCategoryCodeAlreadyExists": "\"{code}\" kodu zaten kullanılıyor. ",
"AttachmentsMax": "İzin verilen maksimum ek",
"Resolve": "Çöz",
"Unresolve": "Çözülmemiş yap",
"Pending": "Beklemede",
"Resolved": "Çözüldü",
"ShowResolved": "Çözülen yorumları göster",
"Ordering": "Sıralama",
"Title": "Başlık",
"Effective": "Yürürlükte",
"Archived": "Arşivlendi",
"Deleted": "Silindi",
"MetaAbstract": "Özet",
"Obsolete": "Geçersiz",
"MakeDocumentObsolete": "Geçersiz olarak işaretle",
"MakeDocumentObsoleteDialog": "{count, plural, =0 {dokümanı} other {dokümanları}} geçersiz olarak işaretle",
"MakeDocumentObsoleteConfirm": "Şu dokümanları gerçekten geçersiz olarak işaretlemek istiyor musunuz: {titles}?",
"ContentTab": "İçerik",
"TeamTab": "Takım",
"MetaTab": "Meta veriler",
"ChangeControlTab": "Değişiklik kontrolü",
"ReleaseTab": "Yayın",
"HistoryTab": "Geçmiş",
"ModificationDate": "Değiştirilme tarihi",
"Modified": "Değiştirildi",
"Owner": "Sahip",
"AssignedTo": "Atanan",
"Unassigned": "Atanmamış",
"Untitled": "Başlıksız",
"Copy": "kopyala",
"AccessWorkarea": "Çalışma Alanına Erişim",
"EffectiveLibrary": "Yürürlükteki kütüphane",
"WorkingLibrary": "Çalışma kütüphanesi",
"CreateDraftQmsDocuments": "Taslak QMS dokümanları oluştur",
"OwnDocumentAskReviewGetApproval": "QMS dokümanına sahip ol, inceleme iste, onay al",
"ApproveDocuments": "Dokümanları onayla",
"ReassignOwnershipToAnotherUser": "Sahipliği başka bir kullanıcıya devret",
"MakeDocumentEffective": "Dokümanı yürürlüğe koy",
"CreateDraftQmsTemplates": "Taslak QMS şablonları oluştur",
"ChangeControl": "Değişiklik Kontrolü",
"ReviewInterval": "İnceleme aralığı",
"SelectReviewers": "İnceleyicileri seç",
"SelectApprovers": "Onaylayanları seç",
"RequestsToReviewTheDoc": "dokümanı incelemenizi talep ediyor",
"RequestsToApproveTheDoc": "dokümanı onaylamanızı talep ediyor",
"Parent": "Üst",
"Template": "Şablon",
"GeneralInfo": "Genel Bilgi",
"InProgress": "Devam ediyor",
"EditDescription": "Açıklamayı düzenle",
"EditGuidance": "Rehberi düzenle",
"NewDocument": "Yeni doküman",
"NewDocumentCategory": "Yeni kategori",
"NewDocumentTemplate": "Yeni şablon",
"LocationStepTitle": "Konum",
"TemplateStepTitle": "Şablon",
"InfoStepTitle": "Bilgi",
"TeamStepTitle": "Takım",
"TitleAndDescr": "Başlık ve açıklama",
"Reason": "Neden",
"AbstractPlaceholder": "Bu doküman ne hakkında? Kime ve ne zaman gerekecek? ...",
"NewDocCreation": "Yeni doküman oluşturma",
"NewTemplateCreation": "Yeni şablon oluşturma",
"NewTemplatePlaceholder": "Bu şablon ne hakkında? Nasıl düzgün kullanılacağını açıklayın...",
"CustomReason": "Özel",
"ReasonPlaceholder": "Nedeni belirtin...",
"EditDocument": "Dokümanı düzenle",
"Key": "Anahtar",
"CommentsSequence": "Yorum sırası",
"Email": "E-posta",
"Password": "Şifre",
"FieldIsEmpty": "{field} boş",
"ValidatingCredentials": "Kimlik bilgileri doğrulanıyor...",
"GeneralDocumentation": "Genel dokümantasyon",
"TechnicalDocumentation": "Teknik dokümantasyon",
"UnsortedTemplates": "Sıralanmamış şablonlar",
"Project": "Proje",
"Projects": "Projeler",
"ExternalSpace": "Proje alanı",
"DocumentSpaceType": "Doküman alan tipi",
"EffectiveImmediately": "Onay üzerine hemen",
"EffectiveOn": "Yürürlüğe alma tarihi",
"PeriodicReviewToBeCompleted": "Periyodik inceleme tamamlanmalı:",
"MonthsAfterEffectiveDate": "ay yürürlük tarihinden sonra",
"ToBePassedWithin": "İçinde geçilmeli",
"AttemptsAnd": "deneme ve",
"DaysAfterEffectiveDate": "gün yürürlük tarihinden sonra",
"Index": "İndeks",
"Path": "Yol",
"CreateChildDocument": "Alt doküman oluştur",
"CreateChildTemplate": "Alt şablon oluştur",
"All": "Tümü",
"Space": "Alan",
"SelectParent": "Dokümanınız için üst nesne seçin",
"PrefixInUse": "Bu önek zaten kullanılıyor:",
"CodeInUse": "Bu kod zaten kullanılıyor:",
"ChangeCode": "Kodu Değiştir",
"ChangePrefix": "Öneki Değiştir",
"MarkDocAsDeleted": "Dokümanı silinmiş olarak işaretle",
"MarkDocsAsDeleted": "Birden fazla dokümanı silinmiş olarak işaretle",
"MarkDocAsDeletedConfirm": "Şu dokümanları gerçekten silinmiş olarak işaretlemek istiyor musunuz: {titles}?",
"ArchiveDocs": "{count, plural, =0 {dokümanı} other {dokümanları}} arşivle",
"ArchiveDocsConfirm": "Şu dokümanları gerçekten arşivlemek istiyor musunuz: {titles}?",
"DocumentInHierarchy": "Hiyerarşide doküman",
"FirstDraftVersion": "Bu, dokümanın ilk taslak sürümü. Henüz geçmiş yok.",
"EffectiveDocumentLifecycle": "Yürürlükteki doküman yaşam döngüsü",
"ReasonAndImpact": "Neden ve Etki",
"ImpactAnalysis": "Etki analizi",
"ImpactedDocuments": "Etkilenen dokümanlar",
"CreateDocumentFailed": "Doküman oluşturulamadı",
"CreateDocumentTemplateFailed": "Şablon oluşturulamadı",
"TryAgain": "Lütfen tekrar deneyin",
"DescribeChanges": "Nelerin değiştiğini açıklayın...",
"DescribeReason": "Neden değiştiğini açıklayın...",
"DescribeImpact": "Etkisi var:",
"AddDocument": "Doküman ekle",
"NoDocuments": "Doküman yok",
"SysTemplate": "Sistem şablonu",
"DocumentTrainingDueDays": "Son tarih günleri",
"DocumentTrainingEnabled": "Etkin",
"Own": "Sahip",
"Snapshot": "Anlık görüntü",
"Snapshots": "Anlık görüntüler",
"ControlledSnapshot": "Kontrollü anlık görüntü",
"Name": "İsim",
"DraftRevision": "Taslak revizyonu",
"CreateNewDraft": "Yeni sürüm taslağı",
"RestoreDraft": "Taslağı geri yükle",
"ChangeSeverity": "Değişiklik şiddeti",
"Reference": "Referans",
"History": "Geçmiş",
"Signatories": "İmzalayanlar",
"Page": "Sayfa ",
"Of": " / ",
"CreatedFromTemplate": "Şablondan oluşturuldu: ",
"ViewAll": "Tümünü görüntüle",
"Readonly": "Salt okunur",
"NewDocumentSpace": "Yeni doküman alanı",
"EditDocumentSpace": "Doküman alanını düzenle",
"DocSpaceDescriptionPlaceholder": "Alanınızı açıklayın...",
"Members": "Üyeler",
"RoleLabel": "Rol: {role}",
"CreateOrgSpace": "Organizasyon alanı oluştur",
"ReviewDocumentPermission": "Dokümanı incele",
"ReviewDocumentDescription": "Kullanıcılara doküman inceleme yetkisi verir",
"ApproveDocumentPermission": "Dokümanı onayla",
"ApproveDocumentDescription": "Kullanıcılara doküman onaylama yetkisi verir",
"ArchiveDocumentPermission": "Dokümanı arşivle",
"ArchiveDocumentDescription": "Kullanıcılara doküman arşivleme yetkisi verir",
"CoAuthorDocumentPermission": "Doküman ortak yazarı",
"CoAuthorDocumentDescription": "Kullanıcılara doküman ortak yazarlığı yetkisi verir",
"CreateDocumentPermission": "Doküman oluştur",
"CreateDocumentDescription": "Kullanıcılara doküman oluşturma yetkisi verir",
"UpdateDocumentOwnerPermission": "Doküman sahibini güncelle",
"UpdateDocumentOwnerDescription": "Kullanıcılara doküman sahibini güncelleme yetkisi verir",
"CreateDocumentCategoryPermission": "Doküman kategorisi oluştur",
"CreateDocumentCategoryDescription": "Kullanıcılara doküman kategorisi oluşturma yetkisi verir",
"UpdateDocumentCategoryPermission": "Doküman kategorisini güncelle",
"UpdateDocumentCategoryDescription": "Kullanıcılara doküman kategorisini güncelleme yetkisi verir",
"DeleteDocumentCategoryPermission": "Doküman kategorisini sil",
"DeleteDocumentCategoryDescription": "Kullanıcılara doküman kategorisini silme yetkisi verir",
"ConfigLabel": "Kontrollü Dokümanlar",
"ConfigDescription": "Kontrollü dokümanları yönetmek için uzantı",
"Transfer": "Aktar",
"TransferWarning": "Bu işlemden sonra bazı takım üyeleri bu dokümanı görüntüleme veya düzenleme yeteneğini kaybedebilir.",
"TransferDocuments": "Kontrollü dokümanları aktar",
"TransferDocumentsHint": "Seçilen alana aktarılacak dokümanlar:",
"CreateFolder": "Yeni klasör oluştur",
"RenameFolder": "Klasörü yeniden adlandır",
"CreateChildFolder": "Alt klasör oluştur",
"LatestVersionHint": "en güncel",
"CannotDeleteFolder": "Klasör silinemez",
"CannotDeleteFolderHint": "Klasörü silmeden önce lütfen tüm alt dokümanları başka bir konuma taşıyın.",
"AllDocumentSpaces": "Tüm doküman alanları"
},
"controlledDocStates": {
"Empty": "",
"Approved": "Onaylandı",
"InApproval": "Onayda",
"InReview": "İncelemede",
"Reviewed": "İncelendi",
"Rejected": "Reddedildi",
"ToReview": "İncelemeye"
}
}
@@ -4,10 +4,12 @@
import chunter, { type ChatMessage } from '@hcengineering/chunter'
import { Ref, generateId } from '@hcengineering/core'
import { ReferenceInput } from '@hcengineering/text-editor-resources'
import { popupstore as popups } from '@hcengineering/ui'
import { addDocumentCommentFx } from '../../../stores/editors/document'
export let nodeId: string | undefined
export let popupId: string | undefined
const dispatch = createEventDispatcher()
@@ -22,7 +24,8 @@
function handleClick (event: MouseEvent): void {
if (event.target instanceof Node) {
if (popup !== undefined && !popup.contains(event.target)) {
const top = $popups.length > 0 && $popups[$popups.length - 1].id === popupId
if (top && popup !== undefined && !popup.contains(event.target)) {
event.preventDefault()
event.stopPropagation()
dispatch('close', undefined)
@@ -44,6 +44,9 @@ export default mergeIds(documentsId, documents, {
CreateDocumentsSpace: '' as AnyComponent,
CreateDocumentSpaceType: '' as AnyComponent
},
ids: {
AddCommentPopup: '' as Resource<string>
},
string: {
ID: '' as IntlString,
ValidationWorkflow: '' as IntlString,
@@ -16,7 +16,7 @@ import { type Attachment } from '@hcengineering/attachment'
import { type Ref, generateId } from '@hcengineering/core'
import { getClient } from '@hcengineering/presentation'
import { type CompAndProps, type PopupAlignment, popupstore, showPopup } from '@hcengineering/ui'
import documents, { type Document, type DocumentComment } from '@hcengineering/controlled-documents'
import { type Document, type DocumentComment } from '@hcengineering/controlled-documents'
import { isDocumentCommentAttachedTo } from '../../../utils'
import {
type DocumentCommentsFilter,
@@ -36,6 +36,8 @@ import {
controlledDocumentOpened
} from './actions'
import documents from '../../../plugin'
export const $areDocumentCommentPopupsOpened = createStore(false).on(
documentCommentPopupsOpened,
(_, isOpened) => isOpened
@@ -118,7 +120,10 @@ export const showDocumentCommentsPopupFx = createEffect(
export const showAddCommentPopupFx = createEffect((payload: { element?: PopupAlignment, nodeId?: string | null }) => {
showPopup(
documents.component.AddCommentPopup,
payload,
{
...payload,
popupId: documents.ids.AddCommentPopup
},
payload.element,
(result) => {
if (result === null || result === undefined) {
@@ -129,7 +134,11 @@ export const showAddCommentPopupFx = createEffect((payload: { element?: PopupAli
}
},
undefined,
{ category: DocumentCommentPopupCategory, overlay: true }
{
id: documents.ids.AddCommentPopup,
category: DocumentCommentPopupCategory,
overlay: true
}
)
})
@@ -0,0 +1,10 @@
{
"string": {
"Downloads": "İndirilenler",
"Completed": "Tamamlandı",
"Cancelled": "İptal Edildi",
"Interrupted": "Kesintiye Uğradı",
"Paused": "Duraklatıldı",
"Progressing": "Devam Ediyor"
}
}
@@ -0,0 +1,11 @@
{
"string": {
"ShowNotifications": "Bildirimleri göster",
"PlaySound": "Ses çal",
"BounceAppIcon": "Uygulama simgesini zıplat (sadece mac)",
"ShowBadge": "Uygulama simgesinde rozet göster",
"SoundAndAppearance": "Ses ve görünüm",
"HaveGotANotification": "Bir bildiriminiz var",
"TotalNotificationsCount": "Toplam {count, plural, =1 {# bildiriminiz} other {# bildiriminiz}} var"
}
}
+14
View File
@@ -0,0 +1,14 @@
{
"string": {
"ViewMode": "Görüntüleme modu",
"Unified": "Birleşik",
"Split": "Bölünmüş",
"Viewed": "Görüntülendi",
"ShowDiff": "Farkı göster",
"NoChanges": "Dosya farkında değişiklik yok",
"LargeDiffsAreHidden": "Büyük farklar varsayılan olarak gösterilmez.",
"FileIsTooLarge": "Dosya görüntülenemeyecek kadar büyük.",
"FileWasRenamed": "Dosya değişiklik olmadan yeniden adlandırıldı.",
"FileWasDeleted": "Dosya silindi."
}
}
+4 -2
View File
@@ -58,6 +58,8 @@
"Icon": "Ikona",
"Color": "Barva",
"RoleLabel": "Role: {role}"
"RoleLabel": "Role: {role}",
"ForbidCreateTeamspacePermission": "Zakázat vytvoření týmového prostoru",
"ForbidCreateTeamspacePermissionDescription": "Zakazuje uživatelům vytvářet nové týmové prostory"
}
}
}
+4 -2
View File
@@ -51,6 +51,8 @@
"ConfigDescription": "Erweiterung für kollaborative Dokumentbearbeitung",
"Icon": "Symbol",
"Color": "Farbe",
"RoleLabel": "Rolle: {role}"
"RoleLabel": "Rolle: {role}",
"ForbidCreateTeamspacePermission": "Arbeitsbereichserstellung verbieten",
"ForbidCreateTeamspacePermissionDescription": "Verbietet Benutzern das Erstellen neuer Arbeitsbereiche"
}
}
}
+4 -2
View File
@@ -58,6 +58,8 @@
"Icon": "Icon",
"Color": "Color",
"RoleLabel": "Role: {role}"
"RoleLabel": "Role: {role}",
"ForbidCreateTeamspacePermission": "Forbid create teamspace",
"ForbidCreateTeamspacePermissionDescription": "Forbid users creating new teamspaces"
}
}
}
+4 -2
View File
@@ -51,6 +51,8 @@
"ConfigDescription": "Extensión para edición colaborativo de documentos",
"Icon": "Icono",
"Color": "Color",
"RoleLabel": "Role: {role}"
"RoleLabel": "Role: {role}",
"ForbidCreateTeamspacePermission": "Prohibir crear espacio de trabajo",
"ForbidCreateTeamspacePermissionDescription": "Prohíbe a los usuarios crear nuevos espacios de trabajo"
}
}
}
+4 -2
View File
@@ -51,6 +51,8 @@
"ConfigDescription": "Extension pour l'édition collaborative de documents",
"Icon": "Icône",
"Color": "Couleur",
"RoleLabel": "Rôle : {role}"
"RoleLabel": "Rôle : {role}",
"ForbidCreateTeamspacePermission": "Interdire la création d'espace d'équipe",
"ForbidCreateTeamspacePermissionDescription": "Interdit aux utilisateurs de créer de nouveaux espaces d'équipe"
}
}
}
+3 -1
View File
@@ -51,6 +51,8 @@
"ConfigDescription": "Estensione per la modifica collaborativa dei documenti",
"Icon": "Icona",
"Color": "Colore",
"RoleLabel": "Ruolo: {role}"
"RoleLabel": "Ruolo: {role}",
"ForbidCreateTeamspacePermission": "Vieta creazione teamspace",
"ForbidCreateTeamspacePermissionDescription": "Vieta agli utenti di creare nuovi teamspaces"
}
}
+3 -1
View File
@@ -51,6 +51,8 @@
"ConfigDescription": "共同ドキュメント編集のための拡張機能",
"Icon": "アイコン",
"Color": "色",
"RoleLabel": "ロール: {role}"
"RoleLabel": "ロール: {role}",
"ForbidCreateTeamspacePermission": "チームスペースの作成禁止",
"ForbidCreateTeamspacePermissionDescription": "ユーザーが新しいチームスペースを作成することを禁止します"
}
}
+4 -2
View File
@@ -51,6 +51,8 @@
"ConfigDescription": "Extensão para edição colaborativa de documentos",
"Icon": "Ícone",
"Color": "Cor",
"RoleLabel": "Papel: {role}"
"RoleLabel": "Papel: {role}",
"ForbidCreateTeamspacePermission": "Proibir criação de espaço de trabalho",
"ForbidCreateTeamspacePermissionDescription": "Proíbe os utilizadores de criar novos espaços de trabalho"
}
}
}
+4 -2
View File
@@ -58,6 +58,8 @@
"Icon": "Иконка",
"Color": "Цвет",
"RoleLabel": "Роль: {role}"
"RoleLabel": "Роль: {role}",
"ForbidCreateTeamspacePermission": "Запретить создание пространства",
"ForbidCreateTeamspacePermissionDescription": "Запрещает пользователям создавать новые пространства"
}
}
}
+56
View File
@@ -0,0 +1,56 @@
{
"string": {
"Document": "Doküman",
"ParentDocument": "Üst doküman",
"ChildDocument": "Alt doküman",
"CreateDocument": "Doküman oluştur",
"Documents": "Dokümanlar",
"CreateAnVersion": "Yeni sürüm oluştur",
"DocumentNamePlaceholder": "Başlıksız",
"Name": "İsim",
"Cancel": "İptal",
"Version": "Sürüm",
"SearchDocument": "Doküman ara...",
"Snapshot": "Anlık görüntü",
"NoVersions": "Sürüm tanımlanmamış",
"DocumentApplication": "Dokümanlar",
"MyDocuments": "Dokümanlarım",
"Teamspace": "Takım alanı",
"Teamspaces": "Takım alanları",
"Labels": "Etiketler",
"AddLabel": "Etiket ekle",
"Authors": "Yazarlar",
"Backlinks": "Geri bağlantılar",
"History": "Geçmiş",
"DescriptionPlaceholder": "detaylar için yazın...",
"CreateTeamspace": "Takım alanı oluştur",
"EditTeamspace": "Takım alanını düzenle",
"NewTeamspace": "Yeni takım alanı",
"TeamspaceTitle": "Takım alanı başlığı",
"TeamspaceTitlePlaceholder": "Yeni takım alanı",
"TeamspaceDescriptionPlaceholder": "Açıklama ekle ...",
"ChooseIcon": "İkon seç",
"TeamspaceMembers": "Üyeler",
"NoParentDocument": "Üst doküman yok",
"NoBacklinks": "Geri bağlantı yok",
"NoHistory": "Önceki geçmiş yok",
"Untitled": "Başlıksız",
"Description": "Açıklama",
"CopyDocumentUrl": "Doküman URL'sini panoya kopyala",
"DocumentUrlCopied": "Kopyalandı!",
"ViewMode": "Görüntüle",
"EditMode": "Düzenle",
"SuggestMode": "Öner",
"CompareTo": "Karşılaştır...",
"Star": "Yıldızla",
"Unstar": "Yıldızı kaldır",
"Lock": "Kilitle",
"Unlock": "Kilidi aç",
"Locked": "Kilitli",
"ConfigLabel": "Dokümanlar",
"ConfigDescription": "İşbirlikli doküman düzenleme için uzantı",
"Icon": "İkon",
"Color": "Renk",
"RoleLabel": "Rol: {role}"
}
}
+3 -1
View File
@@ -62,6 +62,8 @@
"ReassignToDoConfirm": "您要更改待办事项被指派人吗?待办事项将从当前被指派人的计划中移除。",
"Icon": "图标",
"Color": "颜色",
"RoleLabel": "角色:{role}"
"RoleLabel": "角色:{role}",
"ForbidCreateTeamspacePermission": "禁止创建团队空间",
"ForbidCreateTeamspacePermissionDescription": "禁止用户创建新团队空间"
}
}
@@ -13,17 +13,9 @@
// limitations under the License.
-->
<script lang="ts">
import { AccountRole, Ref, Space, getCurrentAccount, hasAccountRole } from '@hcengineering/core'
import core, { AccountRole, Ref, Space, getCurrentAccount } from '@hcengineering/core'
import { createQuery, getClient } from '@hcengineering/presentation'
import {
Button,
ButtonWithDropdown,
IconAdd,
IconDropdown,
Loading,
SelectPopupValueType,
showPopup
} from '@hcengineering/ui'
import { HeaderButton, showPopup } from '@hcengineering/ui'
import { openDoc } from '@hcengineering/view-resources'
import { Analytics } from '@hcengineering/analytics'
import { DocumentEvents } from '@hcengineering/document'
@@ -70,51 +62,37 @@
showPopup(CreateTeamspace, {}, 'top')
}
async function dropdownItemSelected (res?: SelectPopupValueType['id']): Promise<void> {
if (res === document.string.CreateDocument) {
await newDocument()
} else if (res === document.string.CreateTeamspace) {
await newTeamspace()
let mainActionId: string | undefined = undefined
let visibleActions: string[] = []
function updateActions (teamspace: boolean): void {
mainActionId = document.string.CreateDocument
if (teamspace) {
visibleActions = [document.string.CreateTeamspace, document.string.CreateDocument]
} else {
visibleActions = [document.string.CreateTeamspace]
}
}
const dropdownItems = hasAccountRole(myAcc, AccountRole.User)
? [
{ id: document.string.CreateDocument, label: document.string.CreateDocument },
{ id: document.string.CreateTeamspace, label: document.string.CreateTeamspace }
]
: [{ id: document.string.CreateDocument, label: document.string.CreateDocument }]
$: updateActions(hasTeamspace)
</script>
{#if loading}
<Loading shrink />
{:else}
<div class="antiNav-subheader">
{#if hasTeamspace}
<ButtonWithDropdown
icon={IconAdd}
justify={'left'}
kind={'primary'}
label={document.string.CreateDocument}
on:click={newDocument}
mainButtonId={'new-document'}
dropdownIcon={IconDropdown}
{dropdownItems}
on:dropdown-selected={(ev) => {
void dropdownItemSelected(ev.detail)
}}
/>
{:else}
<Button
id={'new-teamspace'}
icon={IconAdd}
label={document.string.CreateTeamspace}
justify={'left'}
width={'100%'}
kind={'primary'}
gap={'large'}
on:click={newTeamspace}
/>
{/if}
</div>
{/if}
<HeaderButton
{loading}
{client}
{mainActionId}
{visibleActions}
actions={[
{
id: document.string.CreateTeamspace,
label: document.string.CreateTeamspace,
accountRole: AccountRole.User,
callback: newTeamspace
},
{
id: document.string.CreateDocument,
label: document.string.CreateDocument,
accountRole: AccountRole.User,
callback: newDocument
}
]}
/>
+7 -2
View File
@@ -13,7 +13,7 @@
// limitations under the License.
//
import type { Class, Doc, Mixin, Ref, SpaceType, SpaceTypeDescriptor } from '@hcengineering/core'
import type { Class, Doc, Mixin, Ref, SpaceType, SpaceTypeDescriptor, Permission } from '@hcengineering/core'
import { NotificationGroup, NotificationType } from '@hcengineering/notification'
import type { Asset, Plugin, Resource } from '@hcengineering/platform'
import { IntlString, plugin } from '@hcengineering/platform'
@@ -69,7 +69,9 @@ export const documentPlugin = plugin(documentId, {
string: {
ConfigLabel: '' as IntlString,
CreateDocument: '' as IntlString,
Documents: '' as IntlString
Documents: '' as IntlString,
ForbidCreateTeamspacePermission: '' as IntlString,
ForbidCreateTeamspacePermissionDescription: '' as IntlString
},
ids: {
NoParent: '' as Ref<Document>,
@@ -81,6 +83,9 @@ export const documentPlugin = plugin(documentId, {
},
spaceType: {
DefaultTeamspaceType: '' as Ref<SpaceType>
},
permission: {
ForbidCreateTeamspace: '' as Ref<Permission>
}
})
+4 -2
View File
@@ -27,6 +27,8 @@
"Rename": "Přejmenovat",
"Restore": "Obnovit",
"RoleLabel": "Role",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Zakázat vytvoření disku",
"ForbidCreateDrivePermissionDescription": "Zakazuje uživatelům vytvářet nové disky"
}
}
}
+3 -1
View File
@@ -27,6 +27,8 @@
"Rename": "Umbenennen",
"Restore": "Wiederherstellen",
"RoleLabel": "Rolle",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Laufwerkserstellung verbieten",
"ForbidCreateDrivePermissionDescription": "Verbietet Benutzern die Erstellung neuer Laufwerke"
}
}
+3 -1
View File
@@ -27,6 +27,8 @@
"Rename": "Rename",
"Restore": "Restore",
"RoleLabel": "Role",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Forbid create drive",
"ForbidCreateDrivePermissionDescription": "Forbid users creating new drives"
}
}
+4 -2
View File
@@ -27,6 +27,8 @@
"Rename": "Renombrar",
"Restore": "Restaurar",
"RoleLabel": "Rol",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Prohibir crear unidad",
"ForbidCreateDrivePermissionDescription": "Prohíbe a los usuarios crear nuevas unidades"
}
}
}
+4 -2
View File
@@ -27,6 +27,8 @@
"Rename": "Renommer",
"Restore": "Restaurer",
"RoleLabel": "Rôle",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Interdire la création de disque",
"ForbidCreateDrivePermissionDescription": "Interdit aux utilisateurs de créer de nouveaux disques"
}
}
}
+3 -1
View File
@@ -27,6 +27,8 @@
"Rename": "Rinomina",
"Restore": "Ripristina",
"RoleLabel": "Ruolo",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Vieta creazione drive",
"ForbidCreateDrivePermissionDescription": "Vieta agli utenti di creare nuovi drive"
}
}
+3 -1
View File
@@ -27,6 +27,8 @@
"Rename": "名前を変更",
"Restore": "復元",
"RoleLabel": "ロール",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "ドライブの作成禁止",
"ForbidCreateDrivePermissionDescription": "ユーザーが新しいドライブを作成することを禁止します"
}
}
+4 -2
View File
@@ -27,6 +27,8 @@
"Rename": "Renomear",
"Restore": "Restaurar",
"RoleLabel": "Papel",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Proibir criação de unidade",
"ForbidCreateDrivePermissionDescription": "Proíbe os utilizadores de criar novas unidades"
}
}
}
+3 -1
View File
@@ -27,6 +27,8 @@
"Rename": "Переименовать",
"Restore": "Восстановить",
"RoleLabel": "Роль",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "Запретить создание диска",
"ForbidCreateDrivePermissionDescription": "Запрещает пользователям создавать новые диски"
}
}
+32
View File
@@ -0,0 +1,32 @@
{
"string": {
"Drive": "Sürücü",
"Drives": "Sürücüler",
"Grid": "Izgara",
"File": "Dosya",
"Files": "Dosyalar",
"FileVersion": "Dosya sürümü",
"FileVersions": "Dosya sürümleri",
"Folder": "Klasör",
"Folders": "Klasörler",
"Resource": "Kaynak",
"Name": "İsim",
"Description": "Açıklama",
"Parent": "Üst",
"Path": "Yol",
"Version": "Sürüm",
"Size": "Boyut",
"ContentType": "İçerik türü",
"LastModified": "Son Değiştirilme",
"Download": "İndir",
"Upload": "Yükle",
"CreateDrive": "Sürücü Oluştur",
"CreateFolder": "Klasör Oluştur",
"UploadFile": "Dosya Yükle",
"EditDrive": "Sürücüyü Düzenle",
"Rename": "Yeniden adlandır",
"Restore": "Geri yükle",
"RoleLabel": "Rol",
"Root": "/"
}
}
+3 -1
View File
@@ -27,6 +27,8 @@
"Rename": "重命名",
"Restore": "恢复",
"RoleLabel": "角色",
"Root": "/"
"Root": "/",
"ForbidCreateDrivePermission": "禁止创建磁盘",
"ForbidCreateDrivePermissionDescription": "禁止用户创建新磁盘"
}
}
@@ -13,44 +13,66 @@
// limitations under the License.
-->
<script lang="ts">
import { AccountRole, Ref, getCurrentAccount, hasAccountRole } from '@hcengineering/core'
import { AccountRole, Ref, getCurrentAccount } from '@hcengineering/core'
import { type Drive } from '@hcengineering/drive'
import { getResource } from '@hcengineering/platform'
import { createQuery, getClient } from '@hcengineering/presentation'
import { Button, ButtonWithDropdown, IconAdd, IconDropdown, Loading, SelectPopupValueType } from '@hcengineering/ui'
import { FileUploadOptions, getUploadHandlers, UploadHandler } from '@hcengineering/uploader'
import { HeaderButton, HeaderButtonAction } from '@hcengineering/ui'
import { getUploadHandlers } from '@hcengineering/uploader'
import drive from '../plugin'
import { getFolderIdFromFragment } from '../navigation'
import {
showCreateDrivePopup,
showCreateFolderPopup,
uploadFilesToDrivePopup,
getUploadOptionsByFragment
} from '../utils'
import { showCreateDrivePopup, showCreateFolderPopup, getUploadOptionsByFragment } from '../utils'
import { onMount } from 'svelte'
export let currentSpace: Ref<Drive> | undefined
export let currentFragment: string | undefined
const basicActions: HeaderButtonAction[] = [
{
id: drive.string.CreateDrive,
label: drive.string.CreateDrive,
icon: drive.icon.Drive,
accountRole: AccountRole.User,
callback: handleCreateDrive
},
{
id: drive.string.CreateFolder,
label: drive.string.CreateFolder,
icon: drive.icon.Folder,
callback: handleCreateFolder
}
]
let uploadActions: HeaderButtonAction[] = []
let allActions: HeaderButtonAction[] = []
const myAcc = getCurrentAccount()
const client = getClient()
const query = createQuery()
const actionWithExtensionMap = new Map<string, UploadHandler>()
onMount(() => {
const handlers = getUploadHandlers(client)
const newUploadActions: HeaderButtonAction[] = []
for (const handler of handlers) {
dropdownItems.push({ id: handler._id, label: handler.label, icon: handler.icon })
const uploadHandler = async (opts: FileUploadOptions): Promise<void> => {
const uploadHandler = async (): Promise<void> => {
if (currentSpace === undefined) return
const fn = await getResource(handler.handler)
const opts = await getUploadOptionsByFragment(currentSpace, currentFragment ?? '')
await fn(opts)
}
actionWithExtensionMap.set(handler._id, uploadHandler)
newUploadActions.push({
id: handler.label,
label: handler.label,
icon: handler.icon,
callback: () => {
void uploadHandler()
}
})
}
uploadActions = newUploadActions
})
let loading = true
let hasDrive = false
query.query(
drive.class.Drive,
@@ -63,74 +85,25 @@
$: parent = getFolderIdFromFragment(currentFragment ?? '') ?? drive.ids.Root
async function handleDropdownItemSelected (res?: SelectPopupValueType['id']): Promise<void> {
if (res === drive.string.CreateDrive) {
await handleCreateDrive()
} else if (res === drive.string.CreateFolder) {
await handleCreateFolder()
} else if (typeof res === 'string' && currentSpace !== undefined) {
const opts = await getUploadOptionsByFragment(currentSpace, currentFragment ?? '')
const uploadFn = actionWithExtensionMap.get(res)
if (uploadFn === undefined) {
return
}
await uploadFn(opts)
function handleCreateDrive (): void {
void showCreateDrivePopup()
}
function handleCreateFolder (): void {
void showCreateFolderPopup(currentSpace, parent, true)
}
let visibleActions: (string | number | null)[] = []
function updateActions (hasSpace: boolean, uploadActions: HeaderButtonAction[]): void {
allActions = [...basicActions, ...uploadActions]
if (hasSpace) {
visibleActions = allActions.map((a) => a.id)
} else {
visibleActions = [drive.string.CreateDrive]
}
}
async function handleCreateDrive (): Promise<void> {
await showCreateDrivePopup()
}
async function handleCreateFolder (): Promise<void> {
await showCreateFolderPopup(currentSpace, parent, true)
}
async function handleUploadFile (): Promise<void> {
if (currentSpace !== undefined) {
await uploadFilesToDrivePopup(currentSpace, parent)
}
}
const dropdownItems: SelectPopupValueType[] = hasAccountRole(myAcc, AccountRole.User)
? [
{ id: drive.string.CreateDrive, label: drive.string.CreateDrive, icon: drive.icon.Drive },
{ id: drive.string.CreateFolder, label: drive.string.CreateFolder, icon: drive.icon.Folder }
]
: [{ id: drive.string.CreateFolder, label: drive.string.CreateFolder, icon: drive.icon.Folder }]
loading = false
$: updateActions(hasDrive, uploadActions)
</script>
{#if loading}
<Loading shrink />
{:else}
<div class="antiNav-subheader">
{#if hasDrive}
<ButtonWithDropdown
icon={IconAdd}
justify={'left'}
kind={'primary'}
label={drive.string.UploadFile}
mainButtonId={'new-document'}
dropdownIcon={IconDropdown}
{dropdownItems}
disabled={currentSpace === undefined}
on:click={handleUploadFile}
on:dropdown-selected={(ev) => {
void handleDropdownItemSelected(ev.detail)
}}
/>
{:else}
<Button
icon={IconAdd}
label={drive.string.CreateDrive}
justify={'left'}
width={'100%'}
kind={'primary'}
gap={'large'}
on:click={handleCreateDrive}
/>
{/if}
</div>
{/if}
<HeaderButton loading={false} {client} mainActionId={uploadActions[0]?.id} {visibleActions} actions={allActions} />
+7 -2
View File
@@ -13,7 +13,7 @@
// limitations under the License.
//
import type { Class, Doc, Mixin, Ref, SpaceType, SpaceTypeDescriptor, Type } from '@hcengineering/core'
import type { Class, Doc, Mixin, Ref, SpaceType, SpaceTypeDescriptor, Type, Permission } from '@hcengineering/core'
import type { Asset, IntlString, Plugin, Resource as PlatformResource } from '@hcengineering/platform'
import { plugin } from '@hcengineering/platform'
import type { Location, ResolvedLocation } from '@hcengineering/ui/src/types'
@@ -64,13 +64,18 @@ export const drivePlugin = plugin(driveId, {
File: '' as IntlString,
FileVersion: '' as IntlString,
Folder: '' as IntlString,
Resource: '' as IntlString
Resource: '' as IntlString,
ForbidCreateDrivePermission: '' as IntlString,
ForbidCreateDrivePermissionDescription: '' as IntlString
},
descriptor: {
DriveType: '' as Ref<SpaceTypeDescriptor>
},
spaceType: {
DefaultDrive: '' as Ref<SpaceType>
},
permission: {
ForbidCreateDrive: '' as Ref<Permission>
}
})
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Gül & İnsanlar",
"Components": "Bileşenler",
"AnimalsAndNature": "Hayvanlar & Doğa",
"FoodAndDrink": "Yemek & İçecek",
"TravelAndPlaces": "Seyahat & Yerler",
"Activities": "Aktiviteler",
"Objects": "Nesneler",
"Symbols": "Semboller",
"Flags": "Bayraklar",
"FrequentlyUsed": "Sık kullanılanlar",
"GettingWorkDone": "İşleri halledelim",
"DefaultSkinTone": "Varsayılan ten rengi",
"NoTone": "Ton yok",
"Light": "Açık",
"MediumLight": "Orta-açık",
"Medium": "Orta",
"MediumDark": "Orta-koyu",
"Dark": "Koyu",
"Remove": "Kaldır",
"SearchDots": "Ara...",
"SearchResults": "Arama Sonuçları",
"CustomEmojis": "Özel Emojiler",
"Shortcode": "İsim",
"ShortcodeDescription": "Harf, sayı ve '-', '+', '_' sembollerini içerebilir.",
"Image": "Görsel",
"ImageDescription": "Emojiniz için .gif, .png veya .jpg dosyası belirtin.",
"UploadImage": "Yükle",
"Preview": "Önizleme",
"PreviewTextBegin": "Bu, içinde ",
"PreviewTextEnd": " olan bir cümle.",
"CreateTitle": "Özel Emoji oluştur",
"Create": "Oluştur",
"ImageAspectError": "Görsel 1:1 en-boy oranına sahip olmalıdır.",
"ShortcodeMatchError": "Harf, sayı ve '-', '+', '_' sembollerini içerebilir.",
"ShortcodeExistsError": "Bu isim zaten kullanılıyor. Lütfen başka bir isim seçin.",
"NewCustomEmojiDialogClose": "Bu diyalogu kapatmak istiyor musunuz?",
"NewCustomEmojiDialogCloseNote": "Tüm değişiklikler kaybolacak"
}
}
+26
View File
@@ -0,0 +1,26 @@
{
"string": {
"WorkspaceNamePattern": "İsim 40 karakter veya daha kısa, boş olmamalı ve özel karakterler (<, >, /) içermemelidir",
"Export": "Dışa Aktar",
"DataToExport": "Dışa aktarılacak veri",
"ExportDocuments": "Dokümanlar",
"ExportMilestones": "Kilometre Taşı",
"ExportIssues": "Sorunlar",
"ExportTestCases": "Test Senaryoları",
"ExportTestRuns": "Test Çalıştırmaları",
"ExportTestPlans": "Test Planları",
"ExportFormat": "Dışa aktarma formatı",
"ExportJSON": "JSON",
"ExportCSV": "CSV",
"ExportUnifiedFormat": "Huly Birleşik Format",
"ExportIncludeContent": "İçerik dahil et",
"ExportEverything": "Her şey",
"ExportAttributesOnly": "Sadece öznitelikler",
"ExportRequestSuccess": "Dışa aktarma başladı.",
"ExportRequestSuccessMessage": "Dışa aktarma başladı. Tamamlandığında Gelen Kutunuzda bir bildirim alacaksınız.",
"ExportRequestFailed": "Dışa aktarma gönderilemedi.",
"ExportRequestFailedMessage": "Dışa aktarma gönderirken hata oluştu. Lütfen daha sonra tekrar deneyin.",
"ExportCompleted": "Dışa aktarma tamamlandı. Dosyalarınız hazır. Bunları sürücüden indirebilirsiniz.",
"ExportFailed": "Veri dışa aktarılamadı. Lütfen daha sonra tekrar deneyin."
}
}
+50
View File
@@ -0,0 +1,50 @@
{
"string": {
"MessageID": "MesajID",
"IntegrationLabel": "Gmail",
"IntegrationDescription": "E-posta göndermek, almak ve yönetmek için Gmail hesabınızı bağlayın",
"SharedMessages": "paylaşılan e-postalar",
"To": "Kime:",
"From": "Kimden:",
"Copy": "Kopya",
"MessagesSelected": "mesaj seçildi",
"PublishSelected": "Seçilenleri yayınla",
"CreateMessage": "Mesaj oluştur",
"ShareMessages": "Mesajları paylaş",
"Connect": "Bağlan",
"RedirectGoogle": "Google kimlik doğrulama sayfasına yönlendirileceksiniz. Lütfen tüm izinleri seçtiğinizden emin olun.",
"ConnectGmail": "Gmail hesabını bağla",
"Reply": "Yanıtla",
"Subject": "Konu",
"Send": "Gönder",
"Resend": "Yeniden gönder",
"NewMessage": "Yeni mesaj",
"NewMessageTo": "Yeni mesaj:",
"Cancel": "İptal",
"SubjectPlaceholder": "Mesaj konusu",
"CopyPlaceholder": "Kopya:",
"ReplyTo": "Yanıtla:",
"Message": "Mesaj",
"Messages": "Mesajlar",
"Incoming": "Gelen",
"Email": "E-posta",
"Status": "Durum",
"EmailPlaceholder": "ahmet.yilmaz@ornek.com",
"WriteEmail": "E-posta Yaz",
"Shared": "Paylaşıldı",
"AvailableTo": "Uygun:",
"HaveWrittenEmail": "bir e-posta yazdı",
"NewIncomingMessage": "Size yeni bir e-posta gönderdi",
"ConfigLabel": "E-posta",
"ConfigDescription": "Gmail e-posta entegrasyonu için uzantı",
"GooglePrivacy": "Huly'nin Google API'lerinden aldığı bilgilerin kullanımı ve diğer uygulamalara aktarımı, Sınırlı Kullanım gereksinimleri dahil olmak üzere <a href=\"https://developers.google.com/terms/api-services-user-data-policy#additional_requirements_for_specific_api_scopes\" target=\"_blank\">Google API Hizmetleri Kullanıcı Verileri Politikası</a>'na uyacaktır.",
"EmailNotificationsDescription": "E-posta üzerinden kişisel bildirimler alın.",
"FailedToConnect": "Gmail servisi kullanılamıyor",
"TotalMessages": "Toplam mesaj:",
"Configure": "Gmail entegrasyonunu yapılandır",
"GmailSpace": "Mesaj kanalı için alan",
"PersonSpaceInfo": "E-posta size açık olacak",
"SharedSpaceInfo": "E-posta tüm alan katılımcılarına açık olacak",
"ConfigurationRequired": "Kullanmaya başlamak için lütfen Gmail entegrasyonunuzu yapılandırın"
}
}
+10
View File
@@ -0,0 +1,10 @@
{
"string": {
"CreatePublicLink": "Genel bağlantı oluştur",
"PublicLink": "Genel bağlantı",
"Revoke": "İptal et",
"RevokeConfirmation": "Bu, önceden paylaşılan bağlantının çalışmayı durdurmasına neden olur. Bu genel bağlantıyı iptal etmek istediğinizden emin misiniz?",
"LinkWasRevoked": "Genel bağlantı iptal edildi",
"Copy": "Kopyala"
}
}
+69
View File
@@ -0,0 +1,69 @@
{
"string": {
"Department": "Departman",
"ParentDepartmentLabel": "Üst departman",
"Structure": "Yapı",
"CreateDepartment": "Departman oluştur",
"CreateDepartmentLabel": "Departman",
"DepartmentPlaceholder": "Departman",
"TeamLead": "Takım lideri",
"UnAssignLead": "Takım liderini kaldır",
"MemberCount": "{count, plural, =0 {çalışan yok} =1 {1 çalışan} other {# çalışan}}",
"AssignLead": "Takım lideri ata",
"TeamLeadTooltip": "{value}",
"HRApplication": "İnsan kaynakları (beta)",
"MoveStaff": "Çalışan transferi",
"MoveStaffDescr": "Çalışanı {current}'ten {department}'e transfer etmek istiyor musunuz?",
"Departments": "Departmanlar",
"Positions": "Pozisyonlar",
"ShowEmployees": "Çalışanları göster",
"AddEmployee": "Çalışan ekle",
"SelectEmployee": "Çalışan seç",
"Schedule": "Program",
"RequestType": "Tip",
"CreateRequest": "{type} oluştur",
"Today": "Bugün",
"Summary": "Toplam",
"NoEmployeesInDepartment": "Seçilen departmanda çalışan yok",
"Vacation": "Tatil",
"Sick": "Hastalık",
"PTO": "İzin",
"PTOs": "İzinler",
"Remote": "Uzaktan",
"Overtime": "Fazla mesai",
"PTO2": "İzin/2",
"Overtime2": "Fazla mesai/2",
"EditRequest": "{type} düzenle",
"EditRequestType": "Tip düzenle",
"ChooseNewType": "Yeni tip seç:",
"UnchangeableType": "Bu tip değiştirilemez",
"Request": "Talep",
"ExistingRequests": "Belirlenen tarihler için zaten mevcut talepler var",
"Staff": "Çalışan",
"Member": "Üye",
"Members": "Üyeler",
"NoMembers": "Üye eklenmedi",
"AddMember": "Üye ekle",
"Subscribers": "Aboneler",
"PublicHoliday": "Resmi tatil",
"Title": "Başlık",
"Description": "Açıklama",
"PublicHolidays": "Resmi tatiller",
"MarkAsPublicHoliday": "Resmi tatil olarak işaretle",
"EditPublicHoliday": "Resmi tatili düzenle",
"Managers": "Yöneticiler",
"Export": "Dışa aktar",
"Separator": "Ayırıcı",
"ChooseSeparator": "Ayırıcı seç",
"RequestCreated": "Talep oluşturuldu",
"RequestUpdated": "Talep güncellendi",
"RequestRemoved": "Talep kaldırıldı",
"ConfigLabel": "İnsan kaynakları",
"ConfigDescription": "Organizasyon yapısını ve çalışan iş takvimini yönetmek için uzantı",
"WorkingDays": "Çalışma günleri",
"ReportedDays": "Raporlanan günler",
"Tasks": "Görevler",
"TPD": "TPD",
"EXTRa": "EXTRa"
}
}
+20
View File
@@ -0,0 +1,20 @@
{
"string": {
"IntegrationLabel": "Huly Mail",
"IntegrationDescription": "E-posta göndermek, almak ve yönetmek için Huly posta kutunuzu bağlayın",
"Connect": "Bağlan",
"ConnectHulyMail": "Huly posta kutusunu bağla",
"Cancel": "İptal",
"Email": "E-posta",
"Status": "Durum",
"FailedToConnect": "Huly mail servisi kullanılamıyor",
"TotalMessages": "Toplam mesaj:",
"Configure": "Huly mail'i yapılandır",
"ChannelSpace": "Mesaj kanalı için alan",
"PersonSpaceInfo": "E-posta size açık olacak",
"SharedSpaceInfo": "E-posta tüm alan katılımcılarına açık olacak",
"Mailbox": "Posta kutusu",
"MailboxesNotConfigured": "Posta kutusu bulunamadı",
"ConfigureMailBoxes": "Başlamak için lütfen `Posta Kutuları` bölümünden bir posta kutusu ekleyin"
}
}

Some files were not shown because too many files have changed in this diff Show More