Skip to content
Open
Changes from all commits
Commits
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
80 changes: 46 additions & 34 deletions src/helpers/plotting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ interface BorderRadiusValue {
bottomRight: number;
}

interface BorderRadii {
interface BorderRadius {
left: BorderRadiusValue;
middle: BorderRadiusValue;
right: BorderRadiusValue;
Expand All @@ -25,56 +25,68 @@ interface OrgStats {
type ChartJsData = any;
type ChartJsOptions = any;

const getBorderRadii = (left: number, middle: number, right: number): BorderRadii => {
const getBorderRadius = (left: number, middle: number, right: number): BorderRadius => {
const defaultRadius: BorderRadiusValue = {
topLeft: 0,
topRight: 0,
bottomLeft: 0,
bottomRight: 0,
};
const borderRadii: BorderRadii = {
left: { ...defaultRadius },
middle: { ...defaultRadius },
right: { ...defaultRadius },

const borderRadius: BorderRadius = {
left: { ...defaultRadius }, // completed
middle: { ...defaultRadius }, // started
right: { ...defaultRadius }, // not started
};

if (left > 0) {
borderRadii.left.topLeft = Number.MAX_VALUE;
borderRadii.left.bottomLeft = Number.MAX_VALUE;
borderRadius.left.topLeft = Number.MAX_VALUE;
borderRadius.left.bottomLeft = Number.MAX_VALUE;
} else if (middle > 0) {
borderRadii.middle.topLeft = Number.MAX_VALUE;
borderRadii.middle.bottomLeft = Number.MAX_VALUE;
borderRadius.middle.topLeft = Number.MAX_VALUE;
borderRadius.middle.bottomLeft = Number.MAX_VALUE;
} else {
borderRadii.right.topLeft = Number.MAX_VALUE;
borderRadii.right.bottomLeft = Number.MAX_VALUE;
borderRadius.right.topLeft = Number.MAX_VALUE;
borderRadius.right.bottomLeft = Number.MAX_VALUE;
}

if (right > 0) {
borderRadii.right.topRight = Number.MAX_VALUE;
borderRadii.right.bottomRight = Number.MAX_VALUE;
borderRadius.right.topRight = Number.MAX_VALUE;
borderRadius.right.bottomRight = Number.MAX_VALUE;
} else if (middle > 0) {
borderRadii.middle.topRight = Number.MAX_VALUE;
borderRadii.middle.bottomRight = Number.MAX_VALUE;
borderRadius.middle.topRight = Number.MAX_VALUE;
borderRadius.middle.bottomRight = Number.MAX_VALUE;
} else {
borderRadii.left.topRight = Number.MAX_VALUE;
borderRadii.left.bottomRight = Number.MAX_VALUE;
borderRadius.left.topRight = Number.MAX_VALUE;
borderRadius.left.bottomRight = Number.MAX_VALUE;
}

// If all completed
if (middle === 0 && right === 0) {
borderRadius.left.topRight = Number.MAX_VALUE;
borderRadius.left.bottomRight = Number.MAX_VALUE;
}

return borderRadii;
// If all started
if (left === 0 && right === 0) {
borderRadius.middle.topRight = Number.MAX_VALUE;
borderRadius.middle.bottomRight = Number.MAX_VALUE;
}

return borderRadius;
};

export const setBarChartData = (orgStats: OrgStats | null | undefined): ChartJsData => {
let { assigned = 0, started = 0, completed = 0 } = orgStats || {};
const documentStyle = getComputedStyle(document.documentElement);

// Ensure these are numbers before subtraction
started = Number(started) || 0;
completed = Number(completed) || 0;
assigned = Number(assigned) || 0;

started -= completed;
assigned -= started + completed;
const { assigned = 0, started = 0, completed = 0 } = orgStats || {};
const numOfCompleted = Number(completed) || 0;
const numOfAssigned = Number(assigned) || 0;
const numOfStarted = Number(started) || 0;
const numOfIncomplete = numOfStarted - numOfCompleted;
Copy link

Choose a reason for hiding this comment

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

I think this is causing an issue when adults complete surveys - for children, assignments have multiple tasks so they may often be started but not completed, but adults only have one survey so it may get done in one go. When e.g., a child starts (but doesn't finish), and then an adult finishes (but was never tallied as started), it shows started as 0 (or some number of adults less than it actually is) even though there may still be users who have started but not finished. I think we might need to do something more complicated here to fix that - do we have different options for what the orgStats returns?

const numOfNotStarted = numOfAssigned - numOfIncomplete - numOfCompleted;

const borderRadii = getBorderRadii(completed, started, assigned);
const borderRadius = getBorderRadius(numOfCompleted, numOfIncomplete, numOfNotStarted);
const borderWidth = 0;

const chartData = {
Expand All @@ -84,28 +96,28 @@ export const setBarChartData = (orgStats: OrgStats | null | undefined): ChartJsD
type: 'bar',
label: 'Completed',
backgroundColor: documentStyle.getPropertyValue('--bright-green'),
data: [completed],
data: [numOfCompleted],
borderWidth: borderWidth,
borderSkipped: false,
borderRadius: borderRadii.left,
borderRadius: borderRadius.left,
},
{
type: 'bar',
label: 'Started',
backgroundColor: documentStyle.getPropertyValue('--yellow-100'),
data: [started],
data: [numOfIncomplete],
borderWidth: borderWidth,
borderSkipped: false,
borderRadius: borderRadii.middle,
borderRadius: borderRadius.middle,
},
{
type: 'bar',
label: 'Not Started',
backgroundColor: documentStyle.getPropertyValue('--surface-d'),
data: [assigned],
data: [numOfNotStarted],
borderWidth: borderWidth,
borderSkipped: false,
borderRadius: borderRadii.right,
borderRadius: borderRadius.right,
},
],
};
Expand Down
Loading