mirror of
https://github.com/hcengineering/platform.git
synced 2026-09-26 19:44:57 +02:00
* 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>
320 lines
13 KiB
JSON
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": {}
|
|
}
|