2772 Commits
Author SHA1 Message Date
Artyom SavchenkoandGitHub 5bb9b2fea6 Redesign Gant charts and fix issues (#11058)
* Redesign Gant charts and fix issues

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix svelte check

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix review comments

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add missing translations

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-10-07 15:31:15 +02:00
d10b0a1414 feat(gantt): snap single issue bar drags, resizes and drops to working days (#11060)
* feat(gantt): working-day span helpers and prevWorkingDay

Add prevWorkingDay (mirror of nextWorkingDay), findWorkingDay (the
nearest working day in a direction, or undefined when none lies within
the 60-day search window, so a caller can tell a failed search from a
result), workingDaySpan (inclusive working-day length of a bar, never
below 1), dueForSpan / startForSpan (the far end of a bar with a given
working-day span) and workingDaysPerWeek (active weekdays of the mask).

The helpers stay bounded for degenerate input: non-finite or inverted
ranges count as one working day, ranges, spans and addWorkingDays step
counts are capped at MAX_WORKING_SPAN_DAYS (about 100 years), and
addWorkingDays treats a non-finite step count as zero instead of looping
forever.

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

* feat(gantt): snap drag, resize and drop previews to working days

reduce() takes an optional WorkingCalendar. With a calendar, a single-bar
body drag lands the start on the nearest working day in the drag direction
and keeps the bar's length in working days; the start handle rounds up to
the next working day and the end handle rounds down to the previous one;
a dropped unscheduled issue starts on the next working day and lasts two
working days. A zero-delta move leaves the bar untouched. A co-drag keeps
its shared raw delta, and without a calendar the reducer is unchanged.

Degenerate calendars fall back to calendar days: a calendar without any
working weekday, a bar whose origin is not a finite range of at most
MAX_WORKING_SPAN_DAYS days, and a preview with no working day within
reach (a holiday blackout longer than the 60-day search window), so a
non-working day is never presented as a snapped result.

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

* feat(tracker): snap Gantt drags to the project working days; move children and keyboard shifts by working days

GanttView passes the project calendar to the drag reducer for single
issue bars; milestones and bulk co-drags keep calendar-day drags. A
parent drag shifts its children by the parent's move measured in
working days (shiftWithPrimary), and the arrow keys move a bar by
working days (shiftScheduleDays), with Shift moving one week = the
number of active weekdays (keyboardWeekStep). The help overlay now
says "±1 week". Without a project calendar every path keeps its
calendar-day arithmetic.

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

* feat(gantt): hold Shift while dragging to ignore working days

Holding Shift during a single issue bar drag, resize or sidebar drop
suspends working-day snapping for that gesture: the preview and the
committed dates move in calendar days, exactly as in a project without
working days, and the children of a dragged parent shift by the same
calendar-day delta. Pressing or releasing Shift mid-drag updates the
preview at once, so the user can decide before dropping. A "Calendar
days" hint is shown under the date pill while snapping is suspended.
The commit uses the modifier state of the release event itself, and
losing window focus counts as releasing Shift, so a Shift let go outside
the window cannot leave the drag committing calendar days.

Shift is the free modifier during a drag: Alt is already read at release
to bypass the cascade simulation (and Alt+drag is grabbed by several
Linux window managers), Cmd/Ctrl toggle the selection, and Shift only
range-selects on a plain click. A body drag still has to start without
a modifier; Shift is pressed once the bar moves.

The reducer takes `calendarDays` on `mousemove` and marks the state
`snapSuspended` only when a calendar would otherwise apply; legacy mode,
co-drags and milestones are unchanged. `dragCalendar(state, calendar)`
gives the commit the calendar for the drag's own arithmetic.
`modifierSyncMove(state, calendarDays, lastMove)` yields the move that
re-syncs a running drag with the modifier at the last pointer position.
Dependency cascades keep following the project calendar. The keyboard
help lists the new shortcut; strings are added for all tracker locales.

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

* test(gantt): make the working-day cap tests deterministic

The addWorkingDays cap test asserted a wall-clock bound (< 2000 ms) that
failed on a slower CI runner. Assert the exact results instead: each loop
step moves the cursor by one calendar day, so the distance of the result
from the input is a deterministic count of the iterations. Cover the
safety bound of calendars without working weekdays with small step counts
and drop the costly 70-holiday walk, which cuts the suite's slowest tests
from ~950 ms to ~250 ms.

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-10-07 10:50:38 +02:00
Artyom SavchenkoandGitHub e4fd72b36a Fix unstable tests (#11052)
* Fix unstable tests

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix date formatting

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artyom Savchenko <armisav@gmail.com>
2026-09-30 13:16:18 +02:00
Artyom SavchenkoandGitHub 90d418c224 Fix validation issues (#11050)
* Fix formatting

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix svelte-check

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix build

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix formatting

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix print resources

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artyom Savchenko <armisav@gmail.com>
2026-09-30 05:12:59 +02:00
f030c2a337 fix: respect locale date order for Asian languages in DatePresenter #10779 (#10781)
* fix: respect locale date order for Asian languages in DatePresenter

Signed-off-by: Learnobug <gunjanaggarwal12345@gmail.com>

* fix: apply formatting fixes

Signed-off-by: Learnobug <gunjanaggarwal12345@gmail.com>

---------

Signed-off-by: Learnobug <gunjanaggarwal12345@gmail.com>
Co-authored-by: Artyom Savchenko <armisav@gmail.com>
2026-09-29 07:42:46 +02:00
Artyom SavchenkoandGitHub afa747d065 Handle blocked audio and invalid VAPID keys (#11046)
* Handle blocked audio and invalid VAPID keys

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Fix build issues

Signed-off-by: Artyom Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artyom Savchenko <armisav@gmail.com>
2026-09-25 18:34:36 +02:00
67c3ebfaf7 fix(front): clean startup console noise (#10965)
* fix(front): clean startup console noise

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

* fix(love-resources): make content-type check strict-boolean safe

The recording availability probe used a negated optional chain
(!res.headers.get(...)?.includes(...)) whose type is boolean | undefined.
The repo ESLint config rejects this under
@typescript-eslint/strict-boolean-expressions and it breaks the
formatting CI job. Compare against true explicitly instead; behaviour
is unchanged (a missing or non-JSON content-type still means not JSON).

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>
Co-authored-by: Artyom Savchenko <armisav@gmail.com>
2026-09-25 17:51:12 +02:00
DawnRatelandGitHub bda10fa45e feat(workbench): add optional workspace logos and color badges to browser tabs (#11035)
* feat: add optional workspace favicon and identification color

Signed-off-by: Ratel-pwn <2448574643@qq.com>

* refactor: simplify workspace identification color control

Signed-off-by: Ratel-pwn <2448574643@qq.com>

* fix: preserve logo size when overlaying favicon color

Signed-off-by: Ratel-pwn <2448574643@qq.com>

* fix(workbench): separate favicon badge with a transparent cutout

Signed-off-by: Ratel-pwn <2448574643@qq.com>

* fix(workbench): restore workspace favicon before app startup

Signed-off-by: Ratel-pwn <2448574643@qq.com>

---------

Signed-off-by: Ratel-pwn <2448574643@qq.com>
2026-09-25 11:00:19 +02:00
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
1be6047c8a feat(tracker): field-prefixed search, inline filter chips and zero-hit empty state (#10998)
* feat(tracker): field-prefixed search, inline filter chips and zero-hit empty state

Adds SearchInputAdvanced (field:value prefixes routed to Elasticsearch query_string), match highlighting, inline filter chips with overflow popover, a reusable zero-hit empty state in view-resources, and search-scope/highlight view options for List and Kanban.

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

* refactor(tracker-search): address review follow-ups on search/filter rework

Shared, non-storage-specific field list, test-folder conventions, locale
coverage, single regex source and an owner-token gate for the result count.

- core: add shared `fullTextSearchFields` constant next to
  FullTextSearchContext as the single source of truth for the full-text
  fields exposed to `field:value` targeting. The client encoder derives
  ES_NATIVE_FIELDS from it and the elastic adapter derives KNOWN_FIELD_RE
  from it, replacing the two "KEEP IN SYNC" copies. Per-field boost weights
  stay a local adapter detail.
- tests: move the five co-located tests into each package's existing test
  folder convention (ui `__test__`, view-resources `__tests__`) and fix the
  relative imports.
- i18n: translate the new tracker search/filter strings in the remaining
  locales (zh, ja, ko, cs, es, fr, it, pt, pt-br, tr), reusing each file's
  existing terminology; ICU placeholders left unchanged.
- encoder: hoist the reserved-character class into one constant and build two
  RegExp instances from it (non-global for `.test()`, global for `.replace()`)
  to avoid the shared-lastIndex trap.
- view-resources: guard `resultIssueCountStore` writes with an owner-token
  gate so a superseded viewlet can no longer clobber the active viewlet's
  count; List/KanbanView claim and release, IssuesView resets through the
  current owner. Assumes a single active IssuesView surface.
- view-resources: make result-count reporting opt-in via a new
  `reportResultCount` prop on List (default true). Embedded, non-primary List
  instances (sub-issues / related issues in the issue edit panel, routed
  through SubIssueList) pass false and never claim the owner token, so opening
  and closing an issue can no longer strand the primary Issues viewlet with a
  dead token — the zero-hit SearchEmptyState card renders again afterwards. Add
  a regression test covering the opted-out embedded consumer.
- elastic: escape every regex metacharacter (not just `.`) when building
  KNOWN_FIELD_RE from `fullTextSearchFields`, so a future field name carrying
  another metacharacter cannot silently corrupt the alternation. Behaviour for
  the current fields is unchanged.

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

* refactor(tracker-search): centralize regex escaping and lock down result-count store

- Share escapeRegExp from @hcengineering/core so the client encoder and the server elastic adapter escape the fulltext field list identically, not just dots on the client.

- Export resultIssueCountStore as a read-only Readable; the owner-token gate functions (setResultCount / resetResultCount / releaseResultCountOwner) are now the only write path.

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>
Co-authored-by: Artyom Savchenko <armisav@gmail.com>
2026-08-11 19:09:33 +07:00
Alexander OnnikovandGitHub 4c5d2d578e fix: use -webkit-user-select for text selection on Safari (#10982)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-07-17 16:44:09 +07:00
abe0cb9625 feat(tracker): Gantt scheduling schema (startDate + IssueRelation) + version bump (#10851)
* feat(tracker): add Gantt scheduling schema (startDate + IssueRelation)

Schema-only foundation for the upcoming Gantt-chart view in tracker.
No UI in this PR.

Changes:
- Issue.startDate: Timestamp | null (interface + IssueDraft + @Prop with @Index)
- Milestone.startDate: Timestamp | null (interface + @Prop, reusing the
  existing tracker.string.StartDate IntlString)
- New DependencyKind type ('finish-to-start' | 'start-to-start' |
  'finish-to-finish' | 'start-to-finish')
- New IssueRelation AttachedDoc class with kind: DependencyKind, signed
  lag: number — registered in models/tracker via TIssueRelation
- 7 new IntlString keys: IssueStartDate, GanttDependency,
  GanttDependency{FinishToStart,StartToStart,FinishToFinish,StartToFinish},
  GanttLag — all 13 locales updated
- Cross-plugin literal updates in importer + github sync to satisfy the new
  required Issue.startDate / Milestone.startDate fields:
  - packages/importer/src/importer/importer.ts: AttachedData<Issue> literal
  - services/github/pod-github/src/sync/issueBase.ts: 'startDate' added to
    GithubIssueData Omit list (github sync does not own scheduling)
  - services/github/pod-github/src/sync/issues.ts + pullrequests.ts:
    AttachedData<Issue|GithubPullRequest> literals

Out of scope (deferred to follow-up PRs):
- UI for Gantt view, drag/resize, dependency editor, critical path
- blockedBy → IssueRelation migration (ships atomically with the writer
  redirect in the dependency-UI PR)
- LinkIssues permission (tracker uses forbid-style permissions; needs
  maintainer discussion)
- Activity-feed wiring for IssueRelation (needs a producer to test against)
- IssueTemplate.startDate (template propagation semantics undecided)

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

* test(model-tracker): add migrateAddStartDate jest tests

3 tests covering migrateAddStartDate:
- writes startDate=null to Issues in DOMAIN_TASK with the right filter
- writes startDate=null to Milestones in DOMAIN_TRACKER with the right filter
- issues exactly two update calls (one per class)

Follows the MigrationClient mock pattern from
models/chat/src/__tests__/migration.test.ts.

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

* feat(model-tracker): add migrateAddStartDate + wire into trackerOperation

Backfills startDate=null on existing Issues (DOMAIN_TASK) and Milestones
(DOMAIN_TRACKER) so the new schema field has a defined value on every
pre-existing document. Idempotent via the standard tryMigrate state-key
mechanism (state: 'gantt-add-startdate').

Verified domain choices against existing migration helpers:
- migrateIdentifiers / passIdentifierToParentInfo use DOMAIN_TASK for
  Issues (lines 145, 161 in this file).
- TMilestone @Model decorator confirms DOMAIN_TRACKER for Milestones
  (models/tracker/src/types.ts:372).

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

* feat(tracker): expose Issue.startDate / Milestone.startDate in UI; tighten typing

UI changes (so the new schema fields are actually editable, in chronological
order Start → Due/Target):

- New StartDateEditor.svelte (mirrors DueDateEditor.svelte for startDate)
- ControlPanel: render Start Date row above Due Date row in the issue
  side panel; both always-visible (no `!== null` guard) so users can set
  them on issues that don't have a date yet
- NewMilestone form: Start Date input above Target Date input
- Milestone list view: Start Date column before Target Date column

- TIssueRelation: tighten interface to `extends AttachedDoc<Issue, 'relations'>`
  so attachedTo + collection are statically typed. The model class
  re-declares `collection: 'relations'` to match the narrower base.
- Drop 4 unused Dependency-kind IntlString keys (FinishToFinish,
  FinishToStart, StartToFinish, StartToStart) — they had no consumer
  in PR 1; will be re-introduced in PR 4 (dependency editor).
- Simplify migration.ts comments — drop ageing line-references.

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

* fix(tracker): set explicit @Prop ranks for Milestone date fields

The DocAttributeBar side panel sorts attributes by attr.rank ?? toRank(_id)
(see plugins/view-resources/src/components/ClassAttributeBar.svelte:42-47),
so without explicit ranks the visible order on a Milestone was hash-based
(startDate before Status, breaking the chronological flow the user expects).

Set ranks so the side panel renders Status → Start date → Target date.
Comments and attachments stay where they are (they're collections, filtered
out of the attribute panel by categorizeFields).

Issues are unaffected — the Issue side panel is the custom ControlPanel.svelte
which renders Start date / Due date in explicit slots (see PR 1's UI commit).

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

* fix(tracker-resources): EditMilestone renders Status/Start/Target in body in chronological order

The right-side DocAttributeBar sorts attributes by attr.rank ?? toRank(_id),
giving startDate before status (toRank('startDate') < toRank('status')
lexicographically). Setting an explicit rank via @Prop's third arg did not
propagate through the workspace upgrade for existing Attribute documents
in the model TX log — the rank made it into the bundled txes but the
existing Attribute creation TXes are not replaced on upgrade-workspace.

Pivot: render Status, Start date, Target date in the EditMilestone body
in explicit chronological order, and add 'status', 'startDate', 'targetDate'
to ignoreKeys so they don't appear duplicated in the side panel. This
mirrors how Issue's ControlPanel.svelte handles its date fields.

Reverts the no-op @Prop rank attempt.

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

* fix(fulltext): bump model version to 0.7.423 to match deployed workspaces

The fulltext-pod's compiled model version (baked into bundle/model.json via
common/scripts/version.txt at build time) lags whenever the workspaces have
been migrated to a newer patch but the pod was not rebuilt. In that state the
indexer rejects every incoming Tx with a `wrong version` warning, new issues
silently fail to land in Elasticsearch, and search returns empty results for
any document created after the migration.

Bumping `version.txt` aligns the compiled model with the workspaces. All
future builds (front, transactor, workspace, tool, fulltext) will emit
0.7.423, the indexer accepts the Tx stream again, and the deferred backlog
gets consumed automatically — no manual reindex needed.

This commit is the build-side companion to the schema migration in this
same PR. Without it the fulltext-pod cannot consume the migrated workspace's
Tx events.

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

* chore: apply rush format after develop merge

Resolves the failing formatting check requested by @ArtyomSavchenko in
review of #10851 after the develop branch merge.

Affects three files in our PR scope:
- models/tracker/src/migration.ts: collapse short multi-line client.update call
- plugins/tracker/src/index.ts: inline DependencyKind union + IssueRelation comment
- plugins/tracker-resources/src/components/milestones/EditMilestone.svelte:
  reformat inline arrow handlers, move QueryIssuesList block ahead of <style>

No logic changes; deterministic prettier output.

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

* test(tracker): fix milestone page-object selectors after startDate field addition

The Gantt schema PR added Milestone.startDate, which:

1. Adds a second datetime-button to the NewMilestone form pool. The
   existing 'div.antiCard-pool button.datetime-button' locator matched
   both buttons and tripped Playwright's strict-mode check. Scope the
   target-date locator to .last() and add a sibling .first() helper for
   the start-date button.

2. Moves Status / Start date / Target date editors from the
   auto-generated side panel into EditMilestone's body
   (div.dates-row > div.date-cell > span.cell-label + <button>) in
   chronological order. The label span no longer has a sibling <div>
   wrapping the button — the button is a direct sibling. Switch the
   buttonStatus/buttonTargetDate XPath to following-sibling::button[1]
   and match the new class="cell-label" span. Add a buttonStartDate
   helper for the new editor row.

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

* test(tracker): shift buttonEstimation index after startDate row addition

ControlPanel.svelte (issue side panel) now renders the Start date and
Due date rows unconditionally — pre-PR the Due date row was conditional
on issue.dueDate !== null and the Start date row didn't exist at all.
Both new rows emit a <div><button> pair via DueDatePresenter, which the
existing (//span[text()='Estimation']/../div/button)[3] XPath counts as
extra matches and pushes the Estimation button from the 3rd to the 5th
direct div/button under the popupPanel-body__aside-grid.

Direct div/button order under the grid (document order):
  1. CreatedBy (EmployeeBox > UserBox div > Button)
  2. Assignee  (AssigneeEditor div > Button)
  3. Start date (NEW — StartDateEditor > DueDatePresenter div > button.datetime-button)
  4. Due date   (NEW — DueDateEditor   > DueDatePresenter div > button.datetime-button)
  5. Estimation (AttributeBarEditor div > Button)

buttonAssignee at [2] is unchanged. textEstimation uses 'following-sibling::div[1]'
(first sibling), which is unaffected by additions earlier in the grid.

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

* chore: apply rush format (prettier compliance for CI)

CI's rush fast-format --branch develop step flagged
tests/sanity/tests/model/tracker/milestones-details-page.ts for a
missing blank line between the buttonTargetDate locator (introduced in
86b1c19ee8) and the next field. Apply the local 'rush format' result.

The two other files CI flagged
(plugins/process-resources/src/components/settings/BindingsEditor.svelte
and ImportSlotsPopup.svelte) were actually upstream changes from PR
#10921 (Fix add tag) that landed after our last develop merge — the
preceding merge of upstream/develop into this branch resolves those
diffs.

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

* fix(tests/tracker): use contains() for cell-label class to survive Svelte CSS scoping

The Svelte 4 compiler appends a scoped `svelte-<hash>` class to every
element matched by a component-local CSS selector. EditMilestone.svelte
styles `.cell-label` locally, so each label span ends up as
`<span class="cell-label svelte-XXXXX">` at runtime, not the bare
`<span class="cell-label">` shipped in source. The previous XPath
locator used strict `@class="cell-label"` and never matched.

Switch buttonStatus / buttonStartDate / buttonTargetDate to the standard
`contains(concat(' ', normalize-space(@class), ' '), ' cell-label ')`
class-match idiom so the locators tolerate the added scoped class.

Verified against the playwright accessibility snapshot from the failed
run (artifact playwright-results, hash 07a8f36b...md): the Status row
renders as a generic with text 'Status' immediately followed by a
button 'In progress' as the next direct sibling, matching the rest of
the XPath.

Fixes 5 milestone.spec.ts failures observed in run 27816114236:
- Create a Milestone (locator timeout on checkIssue → buttonStatus)
- Edit a Milestone   (locator timeout on editIssue  → buttonStatus.click)
- Delete a Milestone (locator timeout on checkIssue → buttonStatus)
plus their two retries each.

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>
Co-authored-by: Artyom Savchenko <armisav@gmail.com>
2026-07-09 09:08:17 +07:00
Alexander OnnikovandGitHub 4891c65b3d fix: do not show notifications in print mode (#10962)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-07-09 09:04:01 +07:00
Denis BykhovandGitHub b32ff0f46a Required attributes (#10918)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-06-22 12:53:11 +05:00
Artyom SavchenkoandGitHub cfa72c2dac Limit files upload (#10878)
* Limit files upload

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Max size limit

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add storage usage and adjust styles

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Use mb for file size limit

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-06-16 15:20:48 +07:00
Paweł KędziorandGitHub 78142ead31 feat: add Polish translation (#10907)
Adds Polish translation for app

Closes #9986

Signed-off-by: Paweł Kędzior <pawel.kedzior@o2.pl>
2026-06-16 12:31:11 +07:00
Alexander OnnikovandGitHub 6287dee479 feat: print fixes and improvements (#10905) 2026-06-10 10:31:27 +07:00
Artyom SavchenkoGitHubCopilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
e3d3276451 feat: Ability to skip initial content creation (#10812)
* feat: Configure workspaces during creation

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix question description

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix formatting

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Potential fix for pull request finding 'CodeQL / Insecure randomness'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Signed-off-by: Artyom Savchenko <armisav@gmail.com>

* Revert "Potential fix for pull request finding 'CodeQL / Insecure randomness'"

This reverts commit e37b6de69c.

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Simplify workspace creation

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix layout

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Keep redesigned version

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
Signed-off-by: Artyom Savchenko <armisav@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-05-22 18:58:10 +07:00
Denis BykhovandGitHub 23faf14cca Card version settings (#10843)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-05-17 14:53:34 +05:00
FVOCIandGitHub 2d73be14f8 feat: Korean (ko) translation (#10820)
Signed-off-by: FVOCI <150913557+fvoci@users.noreply.github.com>
2026-05-05 15:38:15 +05:00
Denis BykhovandGitHub d2591a1e71 Markup properties (#10804)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-04-27 13:46:08 +05:00
Artyom SavchenkoandGitHub ecad38c940 Fix published packages (#10788)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-21 20:31:22 +07:00
Denis BykhovandGitHub e390b94424 Card space type selector with submenu (#10750)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-04-12 12:37:00 +05:00
Denis BykhovandGitHub 963233b81d Card grid (#10749)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-04-12 12:32:43 +05:00
Artyom SavchenkoandGitHub ac1553bd38 feat: Guest auto-join (#10751)
* feat: Guest auto-join

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Revert "Fix tests"

This reverts commit e3b7c7425f.

* Update tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Minor fixes

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Temp ignore test

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-12 13:25:31 +07:00
Artyom SavchenkoandGitHub d0b27dce72 feat: Anonymous guest permissions (#10726)
* Anonymous guest permissions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix channels dropdown

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update guest layout

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-06 23:29:11 +07:00
Artyom SavchenkoandGitHub 4beee5c914 Update dark theme (#10728)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-06 23:28:57 +07:00
cc16352be9 Sync with foundations packages (#10703)
* fix: redesign and compact

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: comments

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: correctly dropping connections in timeout

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* feature: loglevel in config

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: loglevel in config

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* features lopt: direct personal messages between websockets by username

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix collaborator security query

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>

* Fix svelte warnings

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Change log

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add workspace permissions enum

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add changelog

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Permission methods

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update core and account versions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix  predicate

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add changelog

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix object clone

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Bump and add changelog

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix exception in getTypeOf

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Disable changelog check

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix failed to fetch errors in account client

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Support in-memory mode for hulypulse

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update platform-rig

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Comment change log verification

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update pnpm lock

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Sync with foundation

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update platform-rig

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Sync with foundation and bump versions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Sync with foundations

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update and increment versions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Skip change log verification

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix hulypulse connections

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix formatting and ci

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix validation warnings

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix formatting

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix validation

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix pnpm lock

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update versions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update hulypulse version

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Leonid Kaganov <lleo@lleo.me>
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
Signed-off-by: Artem Savchenko <armisav@gmail.com>
Co-authored-by: Leonid Kaganov <lleo@lleo.me>
Co-authored-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-03-31 10:23:56 +07:00
Artyom SavchenkoandGitHub 2bb87bf441 Do not select space not accessible to the user (#10707)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-03-30 22:44:00 +05:00
Artyom SavchenkoandGitHub b42782db1f Reconnect pulse on connection error (#10698)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-03-27 13:39:28 +07:00
Artyom SavchenkoandGitHub 5613b4f708 Fix npm packages to not use legacy repository format (#10576)
* Fix packages script

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix npm packages to not use legacy string repo

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-03-06 12:25:21 +07:00
Alexander OnnikovandGitHub 103a81fa39 fix: embed html instead of showing in iframe (#10549)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-02-24 23:47:02 +05:00
Artyom SavchenkoandGitHub 38ce824a00 Fix Brazilian Portuguese translation (#10522)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-18 21:26:13 +07:00
Artyom SavchenkoandGitHub 850e15fc05 qfix: Remove unused ui dependencies (#10511)
* qfix: Remove unused ui dependencies

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update lock file

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-16 11:15:32 +07:00
Alexander OnnikovandGitHub 7b133e084d fix: secure blobs (#10490)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-02-09 09:22:27 +07:00
Alexander OnnikovandGitHub c06ded12e2 fix: embed pdf via direct link (#10491)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-02-07 17:33:51 +05:00
Artyom SavchenkoandGitHub 40fda7b337 feat: Brazilian Portuguese translation (#10478)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-07 17:33:11 +05:00
Alexander OnnikovandGitHub 70895d7338 fix: proper mermaid diagram size (#10487)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-02-05 09:21:52 +07:00
Alexander OnnikovandGitHub a59c5d0cb0 fix: allow to open mermaid diagram in fullscreen (#10477)
* fix: allow to open mermaid diagram in fullscreen

* fix large diagram scroll

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>

---------

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-02-03 16:52:36 +07:00
Artyom SavchenkoandGitHub 68db02a634 Improve headers legibility (#10473)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-03 10:59:18 +07:00
4563fab7a6 feat(ui): add Turkish language to settings popup (#10441)
* feat(ui): add Turkish language to settings popup

Added Turkish (Türkçe) to the language selection dropdown in SettingsPopup.svelte
and added the Turkish IntlString definition to plugin.ts.
Turkish translation files already exist in the codebase (lang/tr.json files).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>

* ci: add workflow to build front image with Turkish support

Adds a GitHub Actions workflow to build and push the front container
image to GitHub Container Registry for testing Turkish language support.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>

* fix(ci): use lowercase image name for ghcr.io

Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>

* fix(ci): use huly's docker:build for proper image creation

Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>

* chore: remove test workflow file from PR

Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>

* feat(inbox): add Turkish translations for inbox module

Added missing Turkish translation file for the inbox-assets plugin.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>

---------

Signed-off-by: Bahadır Atılgan <gokcel.bahadir@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 20:36:46 +07:00
Artyom SavchenkoandGitHub 0fd1f17fa2 Fix long title display (#10418)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-01-19 20:19:54 +07:00
Alexander OnnikovandGitHub ad50c8840d fix: customize support links (#10405)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2026-01-15 11:08:11 +07:00
Denis BykhovandGitHub 90b93b97c8 Type export/import (#10373)
* Type export/import

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* Fix formatting

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* Fix ID attributes

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

---------

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-01-08 11:15:11 +07:00
Denis BykhovandGitHub 9bb0d35de5 Card versioning (#10336)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-29 19:04:38 +05:00
Alexander OnnikovandGitHub 5d1038a858 fix: adjust table print styles (#10322)
* fix: adjust editor heading indents

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>

* fix: print table borders and background

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>

---------

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2025-12-22 09:43:50 +07:00
Denis BykhovandGitHub 33bb180505 Ability to show ids in title (#10318)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-19 20:26:53 +05:00
d2d8fb74eb Update dependencies (#10305)
* fix: redesign and compact

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: comments

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: correctly dropping connections in timeout

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* feature: loglevel in config

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: loglevel in config

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* features lopt: direct personal messages between websockets by username

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix collaborator security query

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>

* Fix svelte warnings

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Change log

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add workspace permissions enum

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add changelog

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Permission methods

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update core and account versions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update core and account versions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Leonid Kaganov <lleo@lleo.me>
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
Signed-off-by: Artem Savchenko <armisav@gmail.com>
Co-authored-by: Leonid Kaganov <lleo@lleo.me>
Co-authored-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2025-12-18 00:40:41 +05:00
Artyom SavchenkoandGitHub 1dd5db283e feat: Export documents from one workspace to another (#10283)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2025-12-12 12:02:06 +05:00
Artyom SavchenkoandGitHub 8472b9b173 Ignore legacy JS Api warnings in Svelte preprocess (#10279)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2025-12-07 21:08:24 +05:00