Files
huly-platform/plugins/tracker-assets/lang/cs.json
T
63e28dc964 feat(tracker): Gantt chart for the issue tracker (#10992)
* feat(tracker): Gantt chart for the issue tracker

Builds on the merged search/filter rework (#10998). Introduces @hcengineering/gantt, a dependency-free scheduling/zoom/drag/viewport engine package (with a neutral GanttDependency contract), and wires the tracker-specific adapter, Svelte UI, model schema, dependency-shift notifications and sanity coverage in tracker-resources.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

* fix(tracker): source Gantt holidays from HR and scope confirm-gate per view

Follow-up to review feedback on #10992:

- Confirm-gate: the module-global flag is replaced by a createConfirmGate()
  factory - one instance per mounted GanttView, so two Gantt views mounted at
  once in the same JS context no longer block each other's pointer input. A
  two-instance independence test guards the regression.

- Sidebar sorting: the stale deadline cast is dropped and issue.deadline is
  read directly (the field was added to the Issue model in this PR).

- HR holidays: the per-project WorkingDaysConfig.holidays field duplicated the
  workspace-wide hr.class.PublicHoliday concept and could drift from the real
  HR calendar. It is removed. WorkingDaysConfig now carries only the weekday
  mask and an optional holidayDepartment. The tracker adapter resolves holidays
  for the selected department plus all ancestors up to hr.ids.Head, matching
  HR's existing inheritance semantics (hr-resources ScheduleView). A missing or
  invalid reference falls back to company-wide (root) holidays; unrelated
  departments are never included. The ancestor walk is cycle/missing-parent
  safe.

  A small WorkingDaysEditor in the existing project create/edit dialog lets
  users with the existing project permission enable the mode, choose weekdays,
  and select an HR department (default: Company-wide). It persists through the
  existing project create/update transaction paths (createDoc on create,
  client.update on edit) and uses $unset when the mode is disabled. At least
  one working day must stay active.

  Calendar loading is explicit via a CalendarStateMachine: project-scoped drag,
  resize, cascade, keyboard-shift and auto-schedule mutations stay disabled
  until both the project config and the holiday data have loaded. A monotonic
  generation ticket (bumped synchronously on project switch) is re-checked
  immediately before every calendar-dependent date commit, so work started in
  one project can never persist after a switch to another. The all-projects
  view has no single project calendar, so calendar-dependent edits are
  read-only there; display, selection, the context menu and the manual
  date-picker (which does no calendar arithmetic and takes no mutation ticket)
  stay available.

  This depends on the lightweight @hcengineering/hr model package, but not on
  hr-resources; the tracker adapter uses hr.class.* and hr.ids.Head at runtime,
  and actual HR model presence is checked through the hierarchy - without the
  HR model, holidays resolve to an empty set. The @hcengineering/gantt engine
  package stays domain-neutral (no @hcengineering imports, no runtime deps).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

* fix(gantt): measure FS gap-preservation floor in working days

The finish-to-start gap-preservation floor in the cascade scheduler mixed
two time measures: the FS snap anchor is working-calendar aware, but the
floor added a raw calendar-millisecond start-side delta. With an active
working calendar the two diverge, so dragging a predecessor over a weekend
over-shifted the successor across non-working days (a Fri->Mon body drag is
3 calendar days but only 1 working day, and could even land a successor on
a Saturday).

Measure the floor on the DUE side in working days instead: translate the
predecessor's shift via the new workingDayDelta helper and advance the
floor base with addWorkingDays over the calendar. A day-granular resize
gate (utcMidnight comparison, not a raw === 0 test) arms the floor only on
a start-DAY move, so a pure due-resize stays a pure snap even when the
stored issue carries a time-of-day on the cascade-commit path. The floor
base is normalized via utcMidnight(targetAnchor). The legacy path
(cfg === undefined) stays byte-identical to today's raw-ms floor. A
left-resize in working-days mode now correctly no-ops the floor (the due,
and thus the FS gap, did not move) instead of shifting on the raw start
delta.

Engine: add workingDayDelta (signed, half-open from-exclusive/to-inclusive
working-day step count) and export the previously-private utcMidnight from
packages/gantt/src/working-days.ts. The engine stays domain-neutral (no
@hcengineering imports, empty dependencies).

Adds engine and adapter test coverage: workingDayDelta cases and the full
FS floor matrix (right-resize no-push, weekend-spanner body drag, floor
wins over snap, holiday in the floor path, floor-dominant multi-hop chain,
negative delta, legacy no-cfg, SS pure-snap, raw time-of-day right-resize,
direct left-resize).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

---------

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Co-authored-by: Michael Uray <michaeluray@users.noreply.github.com>
2026-08-27 20:24:38 +07:00

320 lines
13 KiB
JSON

{
"string": {
"TrackerApplication": "Přehled",
"Projects": "Vaše projekty",
"More": "Více",
"Default": "Výchozí",
"MakeDefault": "Nastavit jako výchozí",
"Delete": "Smazat",
"Open": "Otevřít",
"Members": "Členové",
"Inbox": "Doručená pošta",
"MyIssues": "Mé úkoly",
"ViewIssue": "Zobrazit úkol",
"IssueCreated": "Úkol vytvořen",
"Issues": "Úkoly",
"Views": "Zobrazení",
"Active": "Aktivní",
"AllIssues": "Všechny úkoly",
"ActiveIssues": "Aktivní úkoly",
"BacklogIssues": "Návrhy",
"Backlog": "Návrhy",
"Board": "Tabule",
"Components": "Komponenty",
"AllComponents": "Vše",
"BacklogComponents": "Návrhy",
"ActiveComponents": "Aktivní",
"ClosedComponents": "Uzavřené",
"NewComponent": "Nová komponenta",
"CreateComponent": "Vytvořit komponentu",
"ComponentNamePlaceholder": "Název komponenty",
"ComponentDescriptionPlaceholder": "Popis (volitelné)",
"ComponentLead": "Vedoucí",
"ComponentMembers": "Členové",
"StartDate": "Datum zahájení",
"TargetDate": "Cílové datum",
"Planned": "Plánováno",
"InProgress": "Probíhá",
"Paused": "Pozastaveno",
"Completed": "Dokončeno",
"Canceled": "Zrušeno",
"CreateProject": "Vytvořit projekt",
"NewProject": "Nový projekt",
"ProjectTitle": "Název projektu",
"ProjectTitlePlaceholder": "Nový projekt",
"UsedInIssueIDs": "Použito v ID úkolů",
"Identifier": "Identifikátor",
"Import": "Importovat",
"ProjectIdentifier": "Identifikátor projektu",
"IdentifierExists": "Identifikátor projektu již existuje",
"ProjectIdentifierPlaceholder": "PROJ",
"ChooseIcon": "Vybrat ikonu",
"AddIssue": "Přidat úkol",
"NewIssue": "Nový úkol",
"NewIssuePlaceholder": "Nový",
"ResumeDraft": "Pokračovat v konceptu",
"SaveIssue": "Vytvořit úkol",
"SetPriority": "Nastavit prioritu…",
"SetStatus": "Nastavit stav…",
"SelectIssue": "Vybrat úkol",
"Priority": "Priorita",
"NoPriority": "Bez priority",
"Urgent": "Naléhavé",
"High": "Vysoká",
"Medium": "Střední",
"Low": "Nízká",
"Unassigned": "Nepřiřazeno",
"Back": "Zpět",
"List": "Seznam",
"NumberLabels": "{count, plural, =0 {žádné štítky} =1 {1 štítek} other {# štítků}}",
"CategoryBacklog": "Návrhy",
"CategoryUnstarted": "Nezahájeno",
"CategoryStarted": "Zahájeno",
"CategoryCompleted": "Dokončeno",
"CategoryCanceled": "Zrušeno",
"Title": "Název",
"Name": "Jméno",
"Description": "Popis",
"Status": "Stav",
"Number": "Číslo",
"Assignee": "Přiřazený",
"AssignTo": "Přiřadit…",
"AssignedTo": "Přiřazeno k {value}",
"Parent": "Nadřazený úkol",
"SetParent": "Nastavit nadřazený úkol…",
"ChangeParent": "Změnit nadřazený úkol…",
"RemoveParent": "Odebrat nadřazený úkol",
"OpenParent": "Otevřít nadřazený úkol",
"SubIssues": "Podúkoly",
"SubIssuesList": "Podúkoly ({subIssues})",
"OpenSubIssues": "Otevřít podúkoly",
"AddSubIssues": "Přidat podúkol",
"BlockedBy": "Blokováno",
"RelatedTo": "Související s",
"Comments": "Komentáře",
"Attachments": "Přílohy",
"Labels": "Štítky",
"Component": "Komponenta",
"SetDueDate": "Nastavit datum splnění…",
"ChangeDueDate": "Změnit datum splnění…",
"ModificationDate": "Aktualizováno {value}",
"Project": "Projekt",
"Issue": "Úkol",
"SubIssue": "Podúkol",
"Rank": "Hodnost",
"TypeIssuePriority": "Priorita úkolu",
"IssueTitlePlaceholder": "Název úkolu",
"SubIssueTitlePlaceholder": "Název podúkolu",
"IssueDescriptionPlaceholder": "Přidat popis…",
"SubIssueDescriptionPlaceholder": "Přidat popis podúkolu",
"AddIssueTooltip": "Přidat úkol…",
"Grouping": "Seskupení",
"Ordering": "Řazení",
"CompletedIssues": "Dokončené úkoly",
"NoGrouping": "Bez seskupení",
"NoAssignee": "Bez přiřazení",
"LastUpdated": "Poslední aktualizace",
"DueDate": "Datum splnění",
"IssueStartDate": "Datum zahájení",
"GanttDependency": "Dependency",
"GanttLag": "Lag",
"Manual": "Manuální",
"All": "Vše",
"PastWeek": "Minulý týden",
"PastMonth": "Minulý měsíc",
"CopyIssueUrl": "Zkopírovat URL úkolu do schránky",
"CopyIssueId": "Zkopírovat ID úkolu do schránky",
"CopyIssueBranch": "Zkopírovat název větve Git do schránky",
"CopyIssueTitle": "Zkopírovat název úkolu do schránky",
"AssetLabel": "Mějte přehled",
"AddToComponent": "Přidat do komponenty…",
"MoveToComponent": "Přesunout do komponenty…",
"NoComponent": "Bez komponenty",
"ComponentLeadTitle": "Vedoucí komponenty",
"ComponentMembersTitle": "Členové komponenty",
"ComponentLeadSearchPlaceholder": "Nastavit vedoucího komponenty…",
"ComponentMembersSearchPlaceholder": "Změnit členy komponenty…",
"MoveToProject": "Přesunout do projektu",
"Duplicate": "Duplikovat",
"GotoIssues": "Přejít na úkoly",
"GotoActive": "Přejít na aktivní úkoly",
"GotoBacklog": "Přejít na návrhy",
"GotoComponents": "Přejít na komponenty",
"GotoMyIssues": "Přejít na mé úkoly",
"GotoTrackerApplication": "Přepnout na aplikaci Přehled",
"CreatedOne": "Vytvořeno",
"MoveIssues": "Přesunout úkoly",
"MoveIssuesDescription": "Vyberte projekt, do kterého chcete úkoly přesunout",
"ManageAttributes": "Spravovat atributy",
"KeepOriginalAttributes": "Zachovat původní atributy",
"KeepOriginalAttributesTooltip": "Původní stavy a komponenty úkolů budou zachovány v novém projektu",
"SelectReplacement": "Následující položky nejsou dostupné v novém projektu. Vyberte náhradu.",
"MissingItem": "CHYBĚJÍCÍ POLOŽKA",
"Replacement": "NÁHRADA",
"Original": "PŮVODNÍ",
"OriginalDescription": "Položky z této sekce budou vytvořeny v novém projektu",
"Relations": "Vztahy",
"RemoveRelation": "Odebrat vztah...",
"AddBlockedBy": "Označit jako blokováno...",
"AddIsBlocking": "Označit jako blokující...",
"AddRelatedIssue": "Odkázat na jiný úkol...",
"RelatedIssue": "Související úkol {id} - {title}",
"BlockedIssue": "Blokovaný úkol {id} - {title}",
"BlockingIssue": "Blokující úkol {id} - {title}",
"BlockedBySearchPlaceholder": "Vyhledat úkol pro označení jako blokováno...",
"IsBlockingSearchPlaceholder": "Vyhledat úkol pro označení jako blokující...",
"RelatedIssueSearchPlaceholder": "Vyhledat úkol pro odkazování...",
"Blocks": "Blokuje",
"Related": "Související",
"RelatedIssues": "Související úkoly",
"EditIssue": "Upravit {title}",
"EditWorkflowStatuses": "Upravit stavy úkolů",
"EditProject": "Upravit projekt",
"DeleteProject": "Smazat projekt",
"ArchiveProjectName": "Archivovat projekt {name}?",
"ArchiveProjectConfirm": "Chcete tento projekt archivovat?",
"DeleteProjectConfirm": "Chcete tento projekt a všechny jeho úkoly smazat?",
"ProjectHasIssues": "Tento projekt obsahuje úkoly. Opravdu jej chcete archivovat?",
"ManageWorkflowStatuses": "Spravovat typy projektů",
"AddWorkflowStatus": "Přidat stav úkolu",
"EditWorkflowStatus": "Upravit stav úkolu",
"DeleteWorkflowStatus": "Smazat stav úkolu",
"DeleteWorkflowStatusConfirm": "Chcete smazat stav \"{status}\"?",
"DeleteWorkflowStatusErrorDescription": "Stav \"{status}\" má přiřazeno {count, plural, =1 {1 úkol} other {# úkolů}}. Vyberte stav pro přesun",
"Save": "Uložit",
"IncludeItemsThatMatch": "Zahrnout položky, které odpovídají",
"AnyFilter": "jakémukoli filtru",
"AllFilters": "všem filtrům",
"NoDescription": "Žádný popis",
"SearchIssue": "Hledat úkol...",
"StatusHistory": "Historie stavů",
"NewSubIssue": "Přidat podúkol...",
"AddLabel": "Přidat štítek",
"DeleteIssue": "Smazat {issueCount, plural, =1 {úkol} other {# úkolů}}",
"DeleteIssueConfirm": "Chcete smazat {issueCount, plural, =1 {úkol} other {úkoly}}{subIssueCount, plural, =0 {?} =1 { a podúkol?} other { a podúkoly?}}",
"Milestone": "Milník",
"NoMilestone": "Žádný milník",
"MoveToMilestone": "Vybrat milník",
"Milestones": "Milníky",
"AllMilestones": "Vše",
"PlannedMilestones": "Plánované",
"ActiveMilestones": "Aktivní",
"ClosedMilestones": "Dokončené",
"AddToMilestone": "Přidat do milníku",
"MilestoneNamePlaceholder": "Název milníku",
"NewMilestone": "Nový milník",
"CreateMilestone": "Vytvořit",
"MoveAndDeleteMilestone": "Přesunout úkoly do {newMilestone} a smazat {deleteMilestone}",
"MoveAndDeleteMilestoneConfirm": "Chcete smazat milník a přesunout úkoly do jiného milníku?",
"Estimation": "Odhad",
"ReportedTime": "Strávený čas",
"RemainingTime": "Zbývající čas",
"TimeSpendReports": "Zprávy o stráveném čase",
"TimeSpendReport": "Čas",
"TimeSpendReportAdd": "Přidat zprávu o čase",
"TimeSpendReportDate": "Datum",
"TimeSpendReportValue": "Strávený čas",
"TimeSpendReportValueTooltip": "Strávený čas v hodinách",
"TimeSpendReportDescription": "Popis",
"TimeSpendDays": "{value}d",
"TimeSpendHours": "{value}h",
"TimeSpendMinutes": "{value}m",
"ChildEstimation": "Odhad podúkolů",
"ChildReportedTime": "Čas podúkolů",
"CapacityValue": "z {value}d",
"NewRelatedIssue": "Nový související úkol",
"RelatedIssuesNotFound": "Související úkoly nenalezeny",
"AddedReference": "Přidán odkaz",
"AddedAsBlocked": "Označeno jako blokované",
"AddedAsBlocking": "Označeno jako blokující",
"IssueTemplate": "Šablona",
"IssueTemplates": "Šablony",
"NewProcess": "Nová šablona",
"SaveProcess": "Uložit šablonu",
"NoIssueTemplate": "Žádná šablona",
"TemplateReplace": "Chcete použít novou šablonu?",
"TemplateReplaceConfirm": "Všechna pole budou přepsána hodnotami nové šablony",
"Apply": "Použít",
"CurrentWorkDay": "Aktuální pracovní den",
"PreviousWorkDay": "Předchozí pracovní den",
"TimeReportDayTypeLabel": "Vyberte typ pracovního dne",
"DefaultAssignee": "Výchozí přiřazení úkolů",
"SevenHoursLength": "Sedm hodin",
"EightHoursLength": "Osm hodin",
"HourLabel": "h",
"MinuteLabel": "m",
"Saved": "Uloženo...",
"CreatedIssue": "Úkol vytvořen",
"CreatedSubIssue": "Podúkol vytvořen",
"ChangeStatus": "Změnit stav",
"ConfigLabel": "Přehled",
"ConfigDescription": "Rozšíření pro správu pracovních úkolů a projektů.",
"NoStatusFound": "Nebyl nalezen odpovídající stav",
"CreateMissingStatus": "Vytvořit chybějící stav",
"UnsetParent": "Nadřazený úkol bude odebrán",
"AllProjects": "Všechny projekty",
"IssueNotificationTitle": "{issueTitle}",
"IssueNotificationBody": "Aktualizováno uživatelem {senderName}",
"IssueNotificationChanged": "{senderName} změnil {property}",
"IssueNotificationChangedProperty": "{senderName} změnil {property} na \"{newValue}\"",
"IssueNotificationMessage": "{senderName}: {message}",
"PreviousAssigned": "Původně přiřazeno",
"IssueAssignedToYou": "Přiřazeno vám",
"RelatedIssueTargetDescription": "Cílový projekt pro související úkol",
"MapRelatedIssues": "Nastavit výchozí projekty pro související úkoly",
"DefaultIssueStatus": "Výchozí stav úkolu",
"IssueStatus": "Stav",
"Extensions": "Rozšíření",
"UnsetParentIssue": "Odebrat nadřazený úkol",
"ForbidCreateProjectPermission": "Zakázat vytvoření projektu",
"ForbidCreateProjectPermissionDescription": "Zakazuje uživatelům vytvářet nové projekty",
"AllowCreatingIssues": "Povolit vytváření úkolů",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse",
"GanttCornerNoOpInSwimlane": "No effect in group-by mode",
"ModeSelectorDisabledByFilter": "Stav je řízen aktivním filtrem. Chcete-li použít tuto zkratku, odstraňte filtr stavu.",
"ShowQuickModeSelector": "Rychlý filtr: Vše / Aktivní / Návrhy",
"SearchScopeLabel": "Hledat v…",
"SearchScopeTitle": "Pouze název",
"SearchScopeTitleDescription": "Název + popis",
"SearchScopeAll": "Název + popis + komentáře",
"SearchHighlight": "Zvýraznit shody hledání",
"SearchEmptyTitle": "Pro „{query}\" nebyly nalezeny žádné úkoly",
"SearchEmptyActiveFilters": "Aktivní filtry: {filters}",
"SearchEmptyClearFilters": "Hledat bez filtrů",
"SearchEmptyAllProjects": "Hledat ve všech projektech"
},
"status": {}
}