From 58649ed0197b7f4f1d5cb9df38f8d411074e361c Mon Sep 17 00:00:00 2001
From: b0ink <40929320+b0ink@users.noreply.github.com>
Date: Wed, 3 Dec 2025 10:30:53 +1100
Subject: [PATCH 1/3] refactor: init summary task status chart component
migration
---
src/app/doubtfire-angular.module.ts | 2 +
src/app/doubtfire-angularjs.module.ts | 6 ++
.../units/states/analytics/analytics.tpl.html | 1 +
.../summary-task-status-chart.component.html | 18 ++++
.../summary-task-status-chart.component.scss | 0
.../summary-task-status-chart.component.ts | 99 +++++++++++++++++++
6 files changed, 126 insertions(+)
create mode 100644 src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html
create mode 100644 src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.scss
create mode 100644 src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts
diff --git a/src/app/doubtfire-angular.module.ts b/src/app/doubtfire-angular.module.ts
index fa5708f4d9..09bf6851f4 100644
--- a/src/app/doubtfire-angular.module.ts
+++ b/src/app/doubtfire-angular.module.ts
@@ -296,6 +296,7 @@ import {PortfoliosAssessmentComponent} from './units/states/portfolios/directive
import {UnitGroupsComponent} from './units/states/groups/unit-groups/unit-groups.component';
import {RolloverComponent} from './units/states/rollover/rollover.component';
import {ProjectGroupsComponent} from './projects/states/groups/project-groups/project-groups.component';
+import {SummaryTaskStatusChartComponent} from './visualisations/summary-task-status-chart/summary-task-status-chart.component';
@NgModule({
// Components we declare
@@ -440,6 +441,7 @@ import {ProjectGroupsComponent} from './projects/states/groups/project-groups/pr
RolloverComponent,
ProjectGroupsComponent,
GroupMemberContributionAssignerComponent,
+ SummaryTaskStatusChartComponent,
],
// Services we provide
providers: [
diff --git a/src/app/doubtfire-angularjs.module.ts b/src/app/doubtfire-angularjs.module.ts
index 4855d04ad6..0aed2df656 100644
--- a/src/app/doubtfire-angularjs.module.ts
+++ b/src/app/doubtfire-angularjs.module.ts
@@ -209,6 +209,7 @@ import {PortfolioAddExtraFilesStepComponent} from './projects/states/portfolio/d
import {UnitGroupsComponent} from './units/states/groups/unit-groups/unit-groups.component';
import {ProjectGroupsComponent} from './projects/states/groups/project-groups/project-groups.component';
import {GroupMemberContributionAssignerComponent} from './groups/group-member-contribution-assigner/group-member-contribution-assigner.component';
+import {SummaryTaskStatusChartComponent} from './visualisations/summary-task-status-chart/summary-task-status-chart.component';
export const DoubtfireAngularJSModule = angular.module('doubtfire', [
'doubtfire.config',
@@ -559,3 +560,8 @@ DoubtfireAngularJSModule.directive(
'fGroupMemberContributionAssigner',
downgradeComponent({component: GroupMemberContributionAssignerComponent}),
);
+
+DoubtfireAngularJSModule.directive(
+ 'fSummaryTaskStatusChart',
+ downgradeComponent({component: SummaryTaskStatusChartComponent}),
+);
diff --git a/src/app/units/states/analytics/analytics.tpl.html b/src/app/units/states/analytics/analytics.tpl.html
index abc07aea56..c518a36708 100644
--- a/src/app/units/states/analytics/analytics.tpl.html
+++ b/src/app/units/states/analytics/analytics.tpl.html
@@ -20,4 +20,5 @@
-->
+
diff --git a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html
new file mode 100644
index 0000000000..b178a4e20a
--- /dev/null
+++ b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.scss b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts
new file mode 100644
index 0000000000..a47368b3cc
--- /dev/null
+++ b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts
@@ -0,0 +1,99 @@
+import {Component, Input, OnInit} from '@angular/core';
+import {Unit} from 'src/app/api/models/unit';
+import {TaskService} from 'src/app/api/services/task.service';
+import {GradeService} from 'src/app/common/services/grade.service';
+
+const actualData = {
+ '1.1P': {'1': 7, '2': 5, '9': 3, '10': 1},
+ '1.2P': {'1': 7, '2': 5, '7': 1, '8': 1, '4': 1, '9': 1},
+ '1.3P': {'1': 7, '2': 6, '9': 3},
+ '1.4C': {'1': 10, '2': 5, '9': 1},
+ '2.1P': {'1': 10, '2': 5, '9': 1},
+ '2.2P': {'1': 10, '2': 5, '5': 1},
+ '2.3P': {'1': 10, '2': 5, '9': 1},
+ '2.4P': {'1': 10, '2': 6},
+ '2.5C': {'1': 11, '2': 4, '9': 1},
+ '3.1P': {'1': 11, '2': 5},
+ '3.2P': {'1': 11, '2': 4, '10': 1},
+ '3.3P': {'1': 11, '2': 4, '10': 1},
+ '3.4C': {'1': 12, '2': 3, '5': 1},
+ '3.5C': {'1': 12, '2': 2, '8': 1, '7': 1},
+ '3.6D': {'1': 15, '2': 1},
+ '4.1P': {'1': 11, '2': 2, '10': 1, '9': 1, '5': 1},
+ '4.2C': {'1': 12, '2': 2, '10': 1, '9': 1},
+ '4.3C': {'1': 12, '2': 2, '9': 2},
+ 'T1': {'1': 11, '2': 2, '9': 3},
+ '5.1P': {'1': 14, '2': 1, '10': 1},
+ '5.2P': {'1': 14, '2': 1, '5': 1},
+ '5.3C': {'1': 14, '2': 2},
+ '5.4C': {'1': 14, '8': 1, '10': 1},
+ '5.5D': {'1': 15, '2': 1},
+ '6.1P': {'1': 14, '9': 2},
+ '7.1P': {'1': 16},
+ '7.2D': {'1': 16},
+ '8.1P': {'1': 16},
+ '8.2P': {'1': 16},
+ 'T2': {'1': 16},
+ '9.1P': {'1': 16},
+ '9.2C': {'1': 16},
+ '10.1H': {'1': 16},
+ '10.2H': {'1': 16},
+ '11.1P': {'1': 16},
+ '6.2D': {'1': 16},
+ 'T10': {'1': 16},
+};
+
+@Component({
+ selector: 'f-summary-task-status-chart',
+ templateUrl: './summary-task-status-chart.component.html',
+ styleUrl: './summary-task-status-chart.component.scss',
+})
+export class SummaryTaskStatusChartComponent implements OnInit {
+ @Input() unit: Unit;
+
+ data = [];
+
+ // view: any[] = [700, 400];
+
+ // options
+ showXAxis: boolean = true;
+ showYAxis: boolean = true;
+ gradient: boolean = false;
+ showLegend: boolean = true;
+ showXAxisLabel: boolean = true;
+ xAxisLabel: string = 'Task';
+ showYAxisLabel: boolean = true;
+ yAxisLabel: string = 'Status';
+ animations: boolean = true;
+
+ colorScheme = {
+ domain: ['#5AA454', '#C7B42C', '#AAAAAA'],
+ };
+
+ constructor(
+ private gradeService: GradeService,
+ private taskService: TaskService,
+ ) {}
+
+ statusLabelsArr = Array.from(this.taskService.statusLabels.values());
+
+ ngOnInit(): void {
+ this.colorScheme.domain = [...this.taskService.statusColors.values()];
+
+ const data = Object.entries(actualData).map(([taskDef, counts]) => ({
+ name: taskDef,
+ series: this.statusLabelsArr.map((label, idx) => ({
+ name: label,
+ value: counts[String(idx)] ?? 0,
+ })),
+ }));
+
+ this.data = data;
+
+ console.log(data);
+ }
+
+ onSelect(event) {
+ console.log(event);
+ }
+}
From efe8a4fc66181e5b89f6f52e2532f18a334e8f40 Mon Sep 17 00:00:00 2001
From: b0ink <40929320+b0ink@users.noreply.github.com>
Date: Wed, 3 Dec 2025 11:21:33 +1100
Subject: [PATCH 2/3] feat: add campus filtering
---
.../summary-task-status-chart.component.html | 7 +
.../summary-task-status-chart.component.ts | 157 +++++++++++++-----
2 files changed, 121 insertions(+), 43 deletions(-)
diff --git a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html
index b178a4e20a..4b07dbd1cb 100644
--- a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html
+++ b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.html
@@ -1,4 +1,11 @@
+
+
+ All
+ Geelong
+ Online
+
+
({
+ refreshData() {
+ const mergedData: Record> = {};
+
+ // combine all campuses
+ Object.values(actualData).forEach((campusData) => {
+ Object.entries(campusData).forEach(([taskDef, counts]) => {
+ mergedData[taskDef] = mergedData[taskDef] || {};
+ Object.entries(counts).forEach(([status, value]) => {
+ mergedData[taskDef][status] = (mergedData[taskDef][status] || 0) + value;
+ });
+ });
+ });
+
+ // if a campus filter is set, use only that campus
+ const dataSource =
+ this.campusFilter && this.campusFilter !== 'all' && actualData[this.campusFilter]
+ ? actualData[this.campusFilter]
+ : mergedData;
+
+ // build chart series
+ const data = Object.entries(dataSource).map(([taskDef, counts]) => ({
name: taskDef,
series: this.statusLabelsArr.map((label, idx) => ({
name: label,
@@ -89,8 +162,6 @@ export class SummaryTaskStatusChartComponent implements OnInit {
}));
this.data = data;
-
- console.log(data);
}
onSelect(event) {
From d11e545531d626ba0f5e4c4b0dd97a471512b588 Mon Sep 17 00:00:00 2001
From: b0ink <40929320+b0ink@users.noreply.github.com>
Date: Wed, 3 Dec 2025 11:53:05 +1100
Subject: [PATCH 3/3] chore: add gh reference
---
.../summary-task-status-chart.component.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts
index 79407c54bb..3d6ef66ce0 100644
--- a/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts
+++ b/src/app/visualisations/summary-task-status-chart/summary-task-status-chart.component.ts
@@ -118,6 +118,7 @@ export class SummaryTaskStatusChartComponent implements OnInit {
private viewContainerRef: ViewContainerRef,
private injectorObj: Injector,
) {
+ // https://github.com/swimlane/ngx-charts/issues/1428#issuecomment-659237562
this.chartToolTipService = this.injectorObj.get(TooltipService);
this.viewContainerRef = this.injectorObj.get(ViewContainerRef);
}