Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
3885f1b
[#57688] Primerize Backlogs
myabc Jan 19, 2026
73d891d
Burndown chart: Force Turbo to perform page reload
myabc Jan 25, 2026
3838dd6
UX/UI improvements: responsiveness, story layout
myabc Jan 27, 2026
8688dfd
Make Backlog Header form responsive
myabc Jan 29, 2026
cb72e00
Remove unused jquery.flot vendored/npm dependency
myabc Jan 29, 2026
741d016
Show action buttons in Taskboard/Burndown headers
myabc Jan 29, 2026
16ca906
Use `fetch_or_fallback` for state validation in BacklogHeaderComponen…
Copilot Jan 29, 2026
df2e2aa
Refresh backlogs list on story update via spllt view
myabc Jan 30, 2026
3458c7b
Simplify DnD: remove empty list item CSS hiding
myabc Feb 2, 2026
f61614e
Update Controller flash messages
myabc Feb 2, 2026
82f908b
Ensure Edit sprint form takes full width
myabc Feb 3, 2026
bd05182
Always show drag handle
myabc Feb 3, 2026
ed7f504
Update backlog menu: wording (case), item order
myabc Feb 3, 2026
b1c67cc
Move 'Open details view' button out of story menu
myabc Feb 3, 2026
5ad7d1d
Update "No versions defined" Blankslate text
myabc Feb 3, 2026
03f3eb4
Remove unused backlogs translation keys
myabc Feb 4, 2026
51a0a8b
Use the Stories::Update service for moving and reordering stories.
dombesz Feb 4, 2026
099bc5a
Keep the Stories::UpdateService prev argument for the stories control…
dombesz Feb 4, 2026
dc9d9cb
Visually highlight selected story, set aria-current
myabc Feb 4, 2026
b7bfbdd
Remove unused story create/update actions
myabc Feb 4, 2026
4b3fb24
Use outlet callback for initial selection
myabc Feb 4, 2026
aaaa48f
Hide unavailable story menu move items
myabc Feb 4, 2026
2ceacbf
Revert "Move 'Open details view' button out of story menu"
myabc Feb 5, 2026
a90207c
Vertically center align story top row
myabc Feb 5, 2026
61ff200
Add container query for better page layout responsiveness
HDinger Feb 5, 2026
4e3f812
Unify empty backlog blankslate messages
myabc Feb 5, 2026
abcf52f
Fix story row classes test expectations
myabc Feb 5, 2026
7d54e81
Make story points display responsive
myabc Feb 5, 2026
4d528a4
Replace media queries with container queries
myabc Feb 5, 2026
1697cb5
Optical adjustment of container query
myabc Feb 5, 2026
8767a8a
Optical adjustment of story row top margin
myabc Feb 5, 2026
86cb8f2
Fix collapsible header: make whole area clickable
myabc Feb 5, 2026
60e1a62
Fix N+1 queries, improve permission checks
Copilot Feb 5, 2026
caebb8c
Fix burndown chart responsiveness
myabc Feb 5, 2026
822784b
Hide burndown chart debug info in production
myabc Feb 5, 2026
9c3be80
Fix context menu feature spec description
myabc Feb 5, 2026
c454b6c
Fix error of nil positions when calculating max_position
dombesz Feb 5, 2026
df2b48b
Update the move_after method to handle both the old style prev_id and…
dombesz Feb 5, 2026
2382e37
Hide divider in story menu when only one item
myabc Feb 5, 2026
adc5b1b
Improve Backlogs "not configured" page
myabc Feb 5, 2026
e453132
Remove unused RbCommonHelper#all_workflows method
myabc Feb 5, 2026
b106a78
Autocorrect Rubocop offenses in controllers
myabc Feb 5, 2026
4351c53
Disable Metrics/AbcSize for RbStoriesController#move
myabc Feb 5, 2026
654d256
Disable Metrics/AbcSize for Story.backlogs
myabc Feb 5, 2026
4e104c4
Fix Stories::CreateService prev argument
dombesz Feb 5, 2026
81d5cca
Fix not configured spec
dombesz Feb 5, 2026
3b3bdbd
Add visible scope to sprints controller
dombesz Feb 6, 2026
4b93f5c
Fix ambiguous display of single dates
myabc Feb 6, 2026
00d0b8c
Merge branch 'dev' into feature/57688-primerize-backlogs-classic
myabc Feb 6, 2026
b4970a0
Remove broken toggle transition
myabc Feb 6, 2026
eba6b1b
Remove superfluous drag handle styling
myabc Feb 6, 2026
2118020
Show failure reason if Story cannot be updated
myabc Feb 6, 2026
6dd4a22
Flesh out backlogs controller specs
myabc Feb 6, 2026
b956deb
DRY up `RbSprintsController`
myabc Feb 6, 2026
6edc43a
Fix `load_sprint_and_project` visibility
myabc Feb 6, 2026
1fbd1f1
DRY up `RbStoriesController`
myabc Feb 6, 2026
fc285cd
Fix breadcrumb and misc "unfriendly" project links
myabc Feb 6, 2026
71508a2
Remove skipped feature, Flesh out Stories feature
myabc Feb 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/services/work_packages/set_attributes_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def set_custom_values_to_validate(attributes, validate_custom_fields = nil)

def set_static_attributes(attributes)
assignable_attributes = attributes.select do |key, _|
!CustomField.custom_field_attribute?(key) && work_package.respond_to?(key)
!CustomField.custom_field_attribute?(key) && work_package.respond_to?("#{key}=")
end

work_package.attributes = assignable_attributes
Expand Down
1 change: 1 addition & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4130,6 +4130,7 @@ en:
notice_successful_delete: "Successful deletion."
notice_successful_cancel: "Successful cancellation."
notice_successful_update: "Successful update."
notice_successful_move: "Successful move from %{from} to %{to}."
notice_unsuccessful_create: "Creation failed."
notice_unsuccessful_create_with_reason: "Creation failed: %{reason}"
notice_unsuccessful_update: "Update failed."
Expand Down
11 changes: 0 additions & 11 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@
"jquery": "^3.7.1",
"jquery.caret": "^0.3.1",
"jquery.cookie": "^1.4.1",
"jquery.flot": "^0.8.3",
"json5": "^2.2.2",
"lit-html": "^3.3.2",
"lodash": "^4.17.23",
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ import { WorkPackageFullCreateEntryComponent } from 'core-app/features/work-pack
import { WorkPackageFullViewEntryComponent } from 'core-app/features/work-packages/routing/wp-full-view/wp-full-view-entry.component';
import { MyPageComponent } from './features/my-page/my-page.component';
import { DashboardComponent } from './features/overview/dashboard.component';
import { BurndownChartComponent } from './features/backlogs/burndown-chart.component';

export function initializeServices(injector:Injector) {
return () => {
Expand Down Expand Up @@ -419,5 +420,6 @@ export class OpenProjectModule implements DoBootstrap {

registerCustomElement('opce-my-page', MyPageComponent, { injector });
registerCustomElement('opce-dashboard', DashboardComponent, { injector });
registerCustomElement('opce-burndown-chart', BurndownChartComponent, { injector });
}
}
18 changes: 18 additions & 0 deletions frontend/src/app/features/backlogs/burndown-chart.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div class="position-relative mx-auto" style="height:60vh">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not a big fan of using these classes directly. Primer already changed them in the past and the advantage of system_arguments is that we don't have to care about this. Further, inline styles are also kind of an anti-pattern for me.
So my suggestion would be, to add a class and put all those styles there.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Primer's CSS is quite stable at this point, so I think it's ok to use utility classes directly. This was copy-pasted from the Budgets widget PR, so perhaps I can DRY that up once that is merged.

<canvas baseChart
[data]="lineChartData()"
[options]="lineChartOptions()"
[type]="'line'"></canvas>
</div>

@if (isDevMode) {
<hr/>

<details>
<summary>Debug</summary>
<code>
<pre>{{maxValue() }}</pre>
<pre>{{lineChartData() | json}}</pre>
</code>
</details>
}
86 changes: 86 additions & 0 deletions frontend/src/app/features/backlogs/burndown-chart.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
//-- copyright
// OpenProject is an open source project management software.
// Copyright (C) the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// See COPYRIGHT and LICENSE files for more details.
//++

import { JsonPipe } from '@angular/common';
import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
import { ChartData, ChartOptions } from 'chart.js';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import PrimerColorsPlugin from 'core-app/shared/components/work-package-graphs/plugin.primer-colors';
import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts';
import { environment } from '../../../environments/environment';

const BURNDOWN_Y_SCALE_MIN = 25;

@Component({
selector: 'op-burndown-chart',
templateUrl: './burndown-chart.component.html',
imports: [BaseChartDirective, JsonPipe],
providers: [provideCharts(withDefaultRegisterables(PrimerColorsPlugin))],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class BurndownChartComponent {
readonly isDevMode = !environment.production;
readonly i18n = inject(I18nService);
readonly chartData = input.required<string>();

readonly lineChartData = computed<ChartData<'line'>>(() => {
const data = JSON.parse(this.chartData()) as ChartData<'line'>;
return data;
});

readonly maxValue = computed(() => {
return this.lineChartData().datasets
.flatMap((dataset) => dataset.data)
.filter((item):item is number => typeof item === 'number')
.reduce((a, b) => Math.max(a, b), 0);
});

readonly lineChartOptions = computed<ChartOptions<'line'>>(() => ({
scales: {
x: {
title: {
display: true,
text: this.i18n.t('js.burndown.day')
}
},
y: {
title: {
display: true,
text: this.i18n.t('js.burndown.points')
},
suggestedMin: 0,
max: this.maxValue() + BURNDOWN_Y_SCALE_MIN
Copy link

Copilot AI Feb 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If maxValue() returns 0 (empty dataset), the chart's y-axis max will be set to 25. Consider using suggestedMax instead of max to allow Chart.js to auto-scale when there's no data, or add a minimum value check to ensure proper rendering.

Suggested change
max: this.maxValue() + BURNDOWN_Y_SCALE_MIN
suggestedMax: this.maxValue() + BURNDOWN_Y_SCALE_MIN

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ulferts thoughts?

}
},
plugins: {
legend: {
position: 'top'
}
}
}));
}
2 changes: 2 additions & 0 deletions frontend/src/app/features/plugins/plugin-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import { HttpClient } from '@angular/common/http';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import { TurboRequestsService } from 'core-app/core/turbo/turbo-requests.service';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
import { HalEventsService } from '../hal/services/hal-events.service';
/**
* Plugin context bridge for plugins outside the CLI compiler context
* in order to access services and parts of the core application
Expand All @@ -48,6 +49,7 @@ export class OpenProjectPluginContext {
confirmDialog: this.injector.get<ConfirmDialogService>(ConfirmDialogService),
externalQueryConfiguration: this.injector.get<ExternalQueryConfigurationService>(ExternalQueryConfigurationService),
externalRelationQueryConfiguration: this.injector.get<ExternalRelationQueryConfigurationService>(ExternalRelationQueryConfigurationService),
halEvents: this.injector.get<HalEventsService>(HalEventsService),
halResource: this.injector.get<HalResourceService>(HalResourceService),
hooks: this.injector.get<HookService>(HookService),
i18n: this.injector.get<I18nService>(I18nService),
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/assets/sass/backlogs/_index.sass
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@
* See COPYRIGHT and LICENSE files for more details.
*/

// Variables
@import "../../../global_styles/openproject/_variable_defaults.scss"

@import "../../../global_styles/openproject/_variables.sass"

@import global
@import global_print
@import jqplot
Expand Down
Loading
Loading