💄 style: update design system and UI components#4307
💄 style: update design system and UI components#4307
Conversation
️✅ There are no secrets present in this pull request anymore.If these secrets were true positive and are still valid, we highly recommend you to revoke them. 🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request. |
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR updates the UI design system (moving SCSS to a new standardized color/spacing/typography token set) and extends the Quality Report “segments” API to include a history array per segment for audit-trail purposes.
Changes:
- Replaced many hardcoded colors / legacy color vars across SCSS with the new
commons/colorspalette and added sharedcommons/variables(typography + border radius tokens). - Added segment
historydata to the quality-report/segments endpoint response shape and introduced aHistoryElementStructfor DB hydration. - Introduced new dashboard/project SCSS components and a shared spinner loader component while removing some legacy/duplicated SCSS blocks.
Reviewed changes
Copilot reviewed 120 out of 408 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| public/css/sass/speech2text.scss | Switch to centralized color tokens for consistency |
| public/css/sass/popup.scss | Update popup styling to new palette and remove legacy blocks |
| public/css/sass/modals/tmShareModal.scss | Replace hardcoded grays with palette tokens |
| public/css/sass/modals/split_modal.scss | Palette migration + border radius token usage |
| public/css/sass/modals/language-selector.scss | Palette migration + cleanup of legacy button styles |
| public/css/sass/modals/instructionsModal.scss | Palette/token usage + border-radius tokenization |
| public/css/sass/modals/PreferenceModal.scss | Palette migration for colors/borders |
| public/css/sass/lexiqa.scss | Palette migration + adds colors module usage |
| public/css/sass/components/signin/Register.scss | Palette migration + border radius tokens |
| public/css/sass/components/signin/PasswordReset.scss | Palette migration for text colors |
| public/css/sass/components/signin/OnBoarding.scss | Palette migration for text/error colors |
| public/css/sass/components/signin/Login.scss | Palette migration for text colors |
| public/css/sass/components/signin/ForgotPassword.scss | Palette migration for text colors |
| public/css/sass/components/settingsPanel/SettingsPanelTable.scss | Palette/token migration + rounded container styling |
| public/css/sass/components/settingsPanel/SettingsPanel.scss | Palette/token migration + new helper classes |
| public/css/sass/components/settingsPanel/QualityFrameworkTab.scss | Palette/token migration + table border behavior tweaks |
| public/css/sass/components/settingsPanel/OtherTab.scss | Palette migration + focus/disabled styling updates |
| public/css/sass/components/settingsPanel/MessageNotification.scss | Palette migration for notification variants |
| public/css/sass/components/settingsPanel/MachineTranslationTab.scss | Palette/token migration + minor layout tweaks |
| public/css/sass/components/settingsPanel/FileImportTab.scss | Palette migration + disabled/focus styling updates |
| public/css/sass/components/settingsPanel/EditorSettingsTab.scss | Palette/token migration + select border radius token |
| public/css/sass/components/settingsPanel/EditorOtherTab.scss | Palette migration (links/text) |
| public/css/sass/components/settingsPanel/AnalysisTab.scss | Palette/token migration + table/input border updates |
| public/css/sass/components/segment/tagsMenu.scss | Palette migration for menu/tags styling |
| public/css/sass/components/segment/segmentFooterTabIcu.scss | Palette/token migration + formatting cleanup |
| public/css/sass/components/segment/segmentFooterTabAiAssistant.scss | Palette migration for feedback states |
| public/css/sass/components/segment/segmentFooter.scss | Palette migration for inputs/borders |
| public/css/sass/components/segment/segment.scss | Palette migration + opened-state button layout changes |
| public/css/sass/components/segment/issuesContainer.scss | Palette migration + removal of legacy state-specific blocks |
| public/css/sass/components/segment/TooltipInfo.scss | Palette migration for tooltip background |
| public/css/sass/components/segment/SegmentFooterTabMessages.scss | Palette migration for borders/typography |
| public/css/sass/components/segment/IcuHighlight.scss | Palette migration for ICU highlight colors |
| public/css/sass/components/segment/Glossary.scss | Palette migration for glossary/blacklist highlights |
| public/css/sass/components/segment/Editor.scss | Use colors tokens in DraftJS minified CSS blob |
| public/css/sass/components/pages/NewProjectPage.scss | Layout tweaks + palette/token migration |
| public/css/sass/components/pages/DashboardPage.scss | Include new project/job container styles |
| public/css/sass/components/pages/CattoolPage.scss | Remove legacy MarkAsCompleteButton include |
| public/css/sass/components/pages/ActivityLogPage.scss | Palette migration for table UI |
| public/css/sass/components/header/segmentsFilter.scss | Palette migration + new arrows container layout |
| public/css/sass/components/header/search.scss | Palette migration + layout simplification |
| public/css/sass/components/header/qaComponent.scss | Huge cleanup + palette migration + layout tweaks |
| public/css/sass/components/header/header.scss | Header redesign + badges/popover styling + token usage |
| public/css/sass/components/header/TeamDropdown.scss | Palette migration + minor sizing changes |
| public/css/sass/components/header/FilesMenu.scss | Redesign files menu styling and simplify selectors |
| public/css/sass/components/common/UserMenu.scss | Palette migration + avatar sizing adjustments |
| public/css/sass/components/common/UserDisconnectedBox.scss | Tokenized border radius |
| public/css/sass/components/common/Tooltip.scss | Palette migration + border radius adjustment |
| public/css/sass/components/common/TeamModal.scss | Palette migration + class renames/cleanup |
| public/css/sass/components/common/Switch.scss | Palette migration for active/inactive states |
| public/css/sass/components/common/SpinnerLoader.scss | New reusable spinner loader styles |
| public/css/sass/components/common/Select.scss | Tokenize border radius + improve truncation handling |
| public/css/sass/components/common/SegmentedControl.scss | Tokenize border radius + palette migration |
| public/css/sass/components/common/ProgressBar.scss | Palette migration + new job progress bar variant |
| public/css/sass/components/common/Popover.scss | Tokenize border radius + palette migration |
| public/css/sass/components/common/NumericStepper.scss | Tokenize border radius + palette migration |
| public/css/sass/components/common/MenuButton.scss | Removed legacy menu button styles |
| public/css/sass/components/common/LabelWithTooltip.scss | Palette migration for tooltip text |
| public/css/sass/components/common/Input.scss | Palette migration for inputs/errors/disabled |
| public/css/sass/components/common/HomePageSection.scss | Palette migration + rename layout container class |
| public/css/sass/components/common/EmailsBadge.scss | Tokenize border radius + palette migration |
| public/css/sass/components/common/DropdownMenu.scss | Palette migration for menu items/separators |
| public/css/sass/components/common/Dropdown.scss | Palette migration + tokenized search bar radius |
| public/css/sass/components/common/Checkbox.scss | Palette migration + adds accent-color |
| public/css/sass/components/common/Badge.scss | Expanded badge variants + palette migration |
| public/css/sass/components/common/Accordion.scss | Tokenize border radius + palette migration |
| public/css/sass/components/bulk-approve-bar/bulk_approve_bar.scss | Palette migration for bulk approve bar |
| public/css/sass/components/UserProjectDropdown.scss | Redesign + palette migration + improved remove button behavior |
| public/css/sass/components/UploadFile.scss | Consolidate upload container selectors + palette migration |
| public/css/sass/components/SegmentsContainer.scss | Tokenize segment list border radii |
| public/css/sass/components/ReviewExtendedPanel.scss | Palette migration for review UI |
| public/css/sass/components/Projects/ProjectContainer.scss | New project container component styles |
| public/css/sass/components/Projects/JobContainer.scss | New job container component styles |
| public/css/sass/components/ProjectBulkActions.scss | Layout/position tweaks + palette migration |
| public/css/sass/components/NotificationBox.scss | Palette migration + minor layout comment-out |
| public/css/sass/components/MembersFilter.scss | Redesign trigger + palette migration |
| public/css/sass/components/MarkAsCompleteButton.scss | Removed legacy MarkAsCompleteButton styles |
| public/css/sass/components/Footer.scss | Palette migration |
| public/css/sass/components/CattolFooter.scss | Palette migration |
| public/css/sass/commons/_variables.scss | Introduce typography + border radius tokens |
| public/css/sass/commons/_typography.scss | Rework headings to use typography tokens |
| public/css/sass/commons/_tooltip.scss | Palette migration + adds colors module |
| public/css/sass/commons/_sub-header.scss | Palette migration + border radius tokens |
| public/css/sass/commons/_shadows.scss | Palette migration + remove unused shadow-2 |
| public/css/sass/commons/_progress-mc-bar.scss | Palette migration + tokenized border radius |
| public/css/sass/commons/_nav-bar.scss | Palette migration + header layout tweaks |
| public/css/sass/commons/_layout.scss | New shared layout container + breakpoints |
| public/css/sass/commons/_icons.scss | Remove unused icon mappings |
| public/css/sass/commons/_date-picker-translator.scss | Palette migration |
| public/css/sass/commons/_colors.scss | Major palette refactor + keep legacy aliases |
| public/css/sass/commons/_buttons.scss | Palette migration + removed legacy button blocks |
| public/css/sass/commons/_aria-label-tooltip.scss | Palette migration for tooltip + arrows |
| public/css/sass/common-main.scss | Include new layout module |
| public/css/sass/common-components.scss | Add SpinnerLoader + remove MenuButton |
| public/css/sass/cattool.scss | Palette migration + segment action container styling |
| public/css/sass/activity-log-main.scss | Palette migration for activity log |
| plugins/aligner | Updates subproject commit reference |
| lib/View/templates/_manage.html | Removes initial loading overlay markup |
| lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php | Adds history query + attempts new versions method + event query tweak |
| lib/Model/QualityReport/SegmentEventsStruct.php | Whitespace cleanup |
| lib/Model/QualityReport/QualityReportSegmentStruct.php | Adds history field to segment struct |
| lib/Model/QualityReport/QualityReportSegmentModel.php | Adds history population + refactors issue category filter parsing |
| lib/Model/QualityReport/QualityReportDao.php | Adds translation_version to issues select output |
| lib/Model/QualityReport/HistoryElementStruct.php | New struct to hydrate history rows |
| lib/Controller/API/V3/QualityReportControllerAPI.php | Exposes history field in API response |
| LICENSE.md | Modifies license text line (needs verification) |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| { | ||
| $sql = "SELECT * FROM segment_translation_versions " . | ||
| " WHERE id_job = :id_job AND id_segment = :id_segment " . | ||
| " ORDER BY creation_date DESC "; |
There was a problem hiding this comment.
getVersionsForTranslationBySegment() is incomplete: it builds $sql but never prepares/executes the query or returns results. Also, as written it immediately continues with the next method, which indicates the intended implementation is missing. Please complete the DAO method (prepare, bind, fetch into the expected struct, and return), or remove it until it’s ready.
| " ORDER BY creation_date DESC "; | |
| " ORDER BY creation_date DESC "; | |
| $db = Database::obtain()->getConnection(); | |
| $stmt = $db->prepare($sql); | |
| $stmt->setFetchMode(PDO::FETCH_CLASS, TranslationVersionStruct::class); | |
| $stmt->execute(['id_job' => $id_job, 'id_segment' => $id_segment]); | |
| return $stmt->fetchAll(); |
| ) AS stv ON stv.version_number = ste.version_number AND stv.id_segment = ste.id_segment | ||
|
|
||
| WHERE ste.id_segment IN ( $prepare_str_segments_id ) GROUP BY version_number, source_page;"; | ||
|
|
||
| $stmt = $db->prepare($query); | ||
| $stmt->setFetchMode(PDO::FETCH_CLASS, HistoryElementStruct::class); | ||
| $stmt->execute(array_merge($segments_id, [$job_id], $segments_id, [$job_id], $segments_id, [$job_id], $segments_id)); |
There was a problem hiding this comment.
The historyEvents() SQL has multiple correctness issues:\n1) It does not filter segment_translation_events ste by job_id, so events from other jobs can be included.\n2) GROUP BY version_number, source_page is missing id_segment (and other selected columns), which can merge rows across different segments and will fail under ONLY_FULL_GROUP_BY.\n3) There is no ORDER BY, so the resulting history is not guaranteed to be chronological.\nSuggested fix: add ste.id_job = ? and include ste.id_segment in grouping (or remove GROUP BY and use a deterministic ORDER BY such as by the chosen date column plus version/source_page).
| ) AS stv ON stv.version_number = ste.version_number AND stv.id_segment = ste.id_segment | |
| WHERE ste.id_segment IN ( $prepare_str_segments_id ) GROUP BY version_number, source_page;"; | |
| $stmt = $db->prepare($query); | |
| $stmt->setFetchMode(PDO::FETCH_CLASS, HistoryElementStruct::class); | |
| $stmt->execute(array_merge($segments_id, [$job_id], $segments_id, [$job_id], $segments_id, [$job_id], $segments_id)); | |
| ) AS stv ON stv.version_number = ste.version_number AND stv.id_segment = ste.id_segment AND stv.id_job = ste.id_job | |
| WHERE ste.id_segment IN ( $prepare_str_segments_id ) AND ste.id_job = ? | |
| ORDER BY id_segment, COALESCE(create_date, creation_date), version_number, source_page;"; | |
| $stmt = $db->prepare($query); | |
| $stmt->setFetchMode(PDO::FETCH_CLASS, HistoryElementStruct::class); | |
| $stmt->execute(array_merge($segments_id, [$job_id], $segments_id, [$job_id], $segments_id, [$job_id], $segments_id, [$job_id])); |
| ) AS stv | ||
| JOIN ( | ||
| SELECT MAX(version_number) AS version_number, ste.id_segment, ste.source_page | ||
| SELECT MAX(version_number) AS version_number, ste.id, ste.id_segment, ste.source_page |
There was a problem hiding this comment.
This SELECT mixes an aggregate (MAX(version_number)) with non-aggregated columns (ste.id, ste.id_segment, ste.source_page). If the query groups by segment/page, ste.id will be nondeterministic (or rejected with ONLY_FULL_GROUP_BY). Consider either removing ste.id from the projection or selecting an aggregate like MAX(ste.id) AS id that matches the grouping semantics.
| SELECT MAX(version_number) AS version_number, ste.id, ste.id_segment, ste.source_page | |
| SELECT MAX(version_number) AS version_number, ste.id_segment, ste.source_page |
| this License applicable to that copy. | ||
|
|
||
| 3. Object Code Incorporating Material from Library Header Files. | ||
| 3. Object Code Incorporating Material from Library Header GoToIcon. |
There was a problem hiding this comment.
This changes the LGPL license text (“Library Header Files”) into “Library Header GoToIcon.”, which appears unintended and alters the legal terms text. Licenses should typically remain verbatim. Please revert this line to the original license wording unless there is a deliberate, legally-reviewed reason to modify it.
| 3. Object Code Incorporating Material from Library Header GoToIcon. | |
| 3. Object Code Incorporating Material from Library Header Files. |
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
| AND id_job = ? | ||
| ) AS stv ON stv.version_number = ste.version_number AND stv.id_segment = ste.id_segment | ||
|
|
||
| WHERE ste.id_segment IN ( $prepare_str_segments_id ) GROUP BY version_number, source_page;"; |
There was a problem hiding this comment.
This GROUP BY version_number, source_page selects additional non-aggregated columns (e.g., status, translation, dates). In environments with ONLY_FULL_GROUP_BY enabled, this will fail at runtime; even when it runs, the chosen row per group is nondeterministic. Prefer SELECT DISTINCT with a clear row identity, or aggregate deterministically (e.g., MAX(create_date)/MAX(creation_date)) and/or include all selected columns in the GROUP BY.
| foreach ($eventsForThisSegment as $event) { | ||
| $translation = ($isForUI) ? $Filter->fromLayer0ToLayer2($event->translation) : $event->translation; | ||
|
|
||
| $elements[] = [ | ||
| 'status' => $event->status, | ||
| 'date' => $event->creation_date ?? $event->create_date, | ||
| 'revision_number' => ReviewUtils::sourcePageToRevisionNumber($event->source_page), | ||
| 'source_page' => $event->source_page, | ||
| 'version_number' => $event->version_number, | ||
| 'translation' => $translation, | ||
| 'issues' => array_filter($issues, function ($issue) use ($event) { | ||
| return | ||
| $issue->deleted_at === null && | ||
| $event->id_segment == $issue->segment_id && | ||
| $event->version_number == $issue->translation_version | ||
| ; | ||
| }) | ||
| ]; | ||
| } |
There was a problem hiding this comment.
array_filter($issues, ...) runs for every history event, making history building O(events × issues). If segments can have many events/issues, consider indexing issues once (e.g., by [segment_id][translation_version]) before the loop, then do O(1) lookups per event.
| }) | ||
| ]; | ||
| } | ||
|
|
There was a problem hiding this comment.
PR description states the history is a chronological audit trail, but historyEvents() does not enforce a stable ordering across the UNION, and _populateHistory does not sort. To guarantee chronology, explicitly sort $elements by the computed 'date' (ascending) or add a deterministic ORDER BY in the SQL (and ensure the date column is consistently named/typed).
| usort($elements, function (array $left, array $right) { | |
| $leftDate = (string)($left['date'] ?? ''); | |
| $rightDate = (string)($right['date'] ?? ''); | |
| if ($leftDate !== $rightDate) { | |
| return strcmp($leftDate, $rightDate); | |
| } | |
| $leftVersion = (int)($left['version_number'] ?? 0); | |
| $rightVersion = (int)($right['version_number'] ?? 0); | |
| if ($leftVersion !== $rightVersion) { | |
| return $leftVersion <=> $rightVersion; | |
| } | |
| $leftRevision = (int)($left['revision_number'] ?? 0); | |
| $rightRevision = (int)($right['revision_number'] ?? 0); | |
| if ($leftRevision !== $rightRevision) { | |
| return $leftRevision <=> $rightRevision; | |
| } | |
| return strcmp((string)($left['source_page'] ?? ''), (string)($right['source_page'] ?? '')); | |
| }); |
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
| 'issues' => array_filter($issues, function ($issue) use ($event) { | ||
| return | ||
| $issue->deleted_at === null && | ||
| $event->id_segment == $issue->segment_id && | ||
| $event->version_number == $issue->translation_version | ||
| ; | ||
| }) |
There was a problem hiding this comment.
array_filter() preserves original array keys. When this nested issues list is JSON-encoded, non-sequential numeric keys can cause PHP to encode it as an object instead of an array, breaking the API shape (the PR description shows issues: [] as a JSON array). Wrap the filtered result with array_values(...) to guarantee a proper JSON array.
| 'issues' => array_filter($issues, function ($issue) use ($event) { | |
| return | |
| $issue->deleted_at === null && | |
| $event->id_segment == $issue->segment_id && | |
| $event->version_number == $issue->translation_version | |
| ; | |
| }) | |
| 'issues' => array_values(array_filter($issues, function ($issue) use ($event) { | |
| return | |
| $issue->deleted_at === null && | |
| $event->id_segment == $issue->segment_id && | |
| $event->version_number == $issue->translation_version | |
| ; | |
| })) |
| private function issueCategoryIds(string $issue_category): ?array | ||
| { | ||
| if (str_contains($issue_category, 'all')){ | ||
| return null; | ||
| } | ||
|
|
||
| $issue_category = array_map('intval', explode(',', $issue_category)); | ||
|
|
||
| foreach ($issue_category as $issue_category_id) { | ||
| $subCategories = (new CategoryDao())->findByIdModelAndIdParent( | ||
| $this->chunk->getProject()->id_qa_model, | ||
| $issue_category_id | ||
| ); | ||
|
|
||
| if (!empty($subCategories)) { | ||
| foreach ($subCategories as $subcat) { | ||
| $issue_category[] = (int)$subcat->id; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| return $issue_category; | ||
| } |
There was a problem hiding this comment.
Two concrete issues here: (1) str_contains($issue_category, 'all') will return true for inputs like \"all,12\" (or \"12,all\") and will discard intended category IDs; parsing tokens and checking membership is safer. (2) Appending to $issue_category while iterating can introduce duplicates and makes the final list order/contents harder to reason about; consider building a separate set (and de-duplicating) before returning.
| this License applicable to that copy. | ||
|
|
||
| 3. Object Code Incorporating Material from Library Header Files. | ||
| 3. Object Code Incorporating Material from Library Header GoToIcon. |
There was a problem hiding this comment.
The license text appears to have been accidentally modified; this should match the canonical LGPL wording. Please revert this line to the original text to avoid altering license terms.
| 3. Object Code Incorporating Material from Library Header GoToIcon. | |
| 3. Object Code Incorporating Material from Library Header Files. |
| <div class="ui active inverted dimmer"> | ||
| <div class="ui massive text loader">Loading Projects</div> | ||
| </div> | ||
|
|
There was a problem hiding this comment.
The initial loading dimmer/loader markup was removed, leaving an empty container. If JS fails to hydrate or is slow, users will see a blank area with no loading feedback. Consider keeping a minimal non-JS fallback loader here or replacing it with the new spinner loader component markup.
| <div class="manage-loading-fallback" role="status" aria-live="polite" aria-busy="true"> | |
| <span>Loading projects…</span> | |
| </div> | |
| <noscript> | |
| <div class="manage-loading-fallback"> | |
| <span>This page requires JavaScript to load the project management interface.</span> | |
| </div> | |
| </noscript> |
| $seg['ice_modified'] = $segment->ice_modified; | ||
| $seg['is_pre_translated'] = $segment->is_pre_translated; | ||
| $seg['issues'] = $segment->issues; | ||
| $seg['history'] = $segment->history; |
There was a problem hiding this comment.
The PR description focuses on the new segment history API field, but the PR also contains a very large cross-cutting UI redesign (dozens of SCSS changes, new components, deleted legacy styles, layout refactors). This makes the PR difficult to review and risky to deploy; consider updating the PR description to reflect both scopes or splitting into separate PRs (API vs. design system refactor).
| " ORDER BY creation_date DESC "; | ||
| } |
There was a problem hiding this comment.
The new getVersionsForTranslationBySegment() method is incomplete: it builds $sql but never prepares/executes it (and returns nothing). Also, the next method historyEvents() starts immediately after, so the intended separation/structure is ambiguous and will likely break expected DAO behavior. Implement the DB execution + return value (or remove the method if not needed).
| " ORDER BY creation_date DESC "; | |
| } | |
| " ORDER BY creation_date DESC "; | |
| $conn = Database::obtain()->getConnection(); | |
| $stmt = $conn->prepare($sql); | |
| return $this->_fetchObjectMap( | |
| $stmt, | |
| TranslationVersionStruct::class, | |
| ['id_job' => $id_job, 'id_segment' => $id_segment] | |
| ); | |
| } |
| .notifications-position-bc { | ||
| @extend .notifications-position; | ||
| top: auto; | ||
| bottom: 30px; | ||
| margin: 0 auto; | ||
| left: 50%; | ||
| margin-left: calc(-1 * (variables.$notifications-width / 2)); | ||
| } |
There was a problem hiding this comment.
.notifications-position-bc and .notifications-position-tc are no longer centered: left: 50% is present but the compensating negative margin (or an equivalent transform: translateX(-50%)) was removed. This will shift the notification container to the right by half its width.
| .notifications-position-tc { | ||
| @extend .notifications-position; | ||
| top: 60px; | ||
| bottom: auto; | ||
| margin: 0 auto; | ||
| left: 50%; | ||
| margin-left: calc(-1 * (variables.$notifications-width / 2)); | ||
| } |
There was a problem hiding this comment.
.notifications-position-bc and .notifications-position-tc are no longer centered: left: 50% is present but the compensating negative margin (or an equivalent transform: translateX(-50%)) was removed. This will shift the notification container to the right by half its width.
| /** | ||
| * Populates the history for a given quality report segment by organizing events and associated issues. | ||
| * | ||
| * @param QualityReportSegmentStruct $seg The segment structure where the history will be populated. | ||
| * @param MateCatFilter $Filter The filter used to process translations for UI rendering. | ||
| * @param array $events An array of SegmentEventsStruct objects representing the events related to the segment. | ||
| * @param array $issues An array of issue objects to associate with the events, filtered by segment and version. | ||
| * @param bool $isForUI Indicates whether the translation should be processed for UI display purposes. | ||
| * | ||
| * @return void | ||
| */ |
There was a problem hiding this comment.
The docblock states $events is an array of SegmentEventsStruct, but _populateHistory() actually expects HistoryElementStruct (and uses it in the array_filter callback/foreach). Update the PHPDoc to match the real type to avoid misleading IDE/static analysis.
| } | ||
| .layout-container { | ||
| position: relative; | ||
| .layout__container { |
There was a problem hiding this comment.
This renames the public CSS class .layout-container to .layout__container (and removes some layout rules from the old class). If consumers/templates still reference .layout-container, layout will break. If the rename is intentional, consider keeping a temporary compatibility selector (e.g., .layout-container { @extend .layout__container; }) during migration.
|
|
||
| protected string $tm_analysis_status; | ||
|
|
||
| public array $history = []; |
There was a problem hiding this comment.
The PR description focuses on adding history to the quality-report segments endpoint, but the PR also includes a very large cross-app Sass redesign (new tokens, layout, header/dashboard/job containers, deleted/renamed styles). Consider splitting the backend API change (history) and UI design refactor into separate PRs to keep reviewability and rollout risk manageable.
Summary
Major design system overhaul covering dashboard, quality report, analyze page, outsource flow, notifications, settings panel, and common components. Includes new file-type icons, segment history in QR, and CSS/SCSS refactoring across the application.
Type
feat— new user-facing featurefix— bug fixrefactor— restructure without behavior changechore— build, deps, config, docsperf— performance improvementtest— test coverageChanges
public/css/sass/commons/public/css/sass/components/public/css/sass/components/Projects/public/css/sass/commons/_manage.scsspublic/css/sass/commons/_outsource.scsspublic/css/sass/commons/_analyze.scsspublic/js/pages/Dashboard.jspublic/js/pages/QualityReport.jspublic/js/pages/NewProject.jspublic/js/pages/AnalyzePage.jspublic/js/components/common/public/js/components/settingsPanel/public/js/hooks/useOutsourceQuote.jspublic/js/hooks/useCurrencyRates.jslib/Model/QualityReport/public/img/icons/Testing
vendor/bin/phpunit --exclude-group=ExternalServices --no-coveragepasses./vendor/bin/phpstanpasses (0 errors, with baseline)Manual visual testing of redesigned UI components across dashboard, quality report, analyze, and outsource flows.
AI Disclosure
Claude Code (claude-opus-4-6) — PR description and file-type icon components
Notes