Files
d9f9e0c461 UX: New visualizations for new reports (#34)
This adds some new visualizations and styles and reports and cleans up
some existing styles and class names.

Daily activity rhythm 

<img width="1588" height="412" alt="image"
src="https://github.com/user-attachments/assets/0c7980e4-7bb6-4e08-9957-24c3c5718572"
/>


Helping new members

<img width="1456" height="310" alt="image"
src="https://github.com/user-attachments/assets/096a13da-ab63-45d4-9b68-53a01df62a78"
/>

Chat activity 

<img width="1442" height="926" alt="image"
src="https://github.com/user-attachments/assets/07ce2cab-1963-4918-a9ff-805c251a1377"
/>

Assigns 

<img width="1388" height="844" alt="image"
src="https://github.com/user-attachments/assets/ee49c6ee-2da6-4bfa-b500-715ed7ceb13a"
/>

AI usage 

<img width="1442" height="1254" alt="image"
src="https://github.com/user-attachments/assets/b382bffb-010d-4072-9144-cb7e6a8680e3"
/>

Invitations 

<img width="1486" height="1346" alt="image"
src="https://github.com/user-attachments/assets/020f68a9-69d2-46ed-9f38-b0d5e98d02de"
/>

Writing analysis

<img width="917" height="409" alt="image"
src="https://github.com/user-attachments/assets/1147427c-513f-4737-8f28-99bfc6f4aff9"
/>

---------

Co-authored-by: awesomerobot <[email protected]>
Co-authored-by: Martin Brennan <[email protected]>
2025-12-02 09:41:30 -05:00

173 lines
5.6 KiB
Plaintext

import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
import willDestroy from "@ember/render-modifiers/modifiers/will-destroy";
import { i18n } from "discourse-i18n";
export default class WritingAnalysis extends Component {
@tracked currentColorIndex = 0;
terminalColors = ["#0f0", "#ffbf00", "#00ffff", "#ff00ff"];
constructor() {
super(...arguments);
this.handleKeyDown = this.handleKeyDown.bind(this);
}
@action
setupKeyListener(element) {
document.addEventListener("keydown", this.handleKeyDown);
this.element = element;
}
@action
teardownKeyListener() {
document.removeEventListener("keydown", this.handleKeyDown);
}
handleKeyDown(event) {
if (event.key === "F1") {
event.preventDefault();
this.cycleColor();
}
}
@action
cycleColor() {
this.currentColorIndex =
(this.currentColorIndex + 1) % this.terminalColors.length;
const newColor = this.terminalColors[this.currentColorIndex];
document.documentElement.style.setProperty("--rewind-green", newColor);
}
get scoreLabel() {
const score = this.args.report.data.readability_score;
const randomNum = Math.floor(Math.random() * 4) + 1;
switch (true) {
case score >= 80 && score <= 100:
return i18n(
`discourse_rewind.reports.writing_analysis.readability_score.over_80.${randomNum}`
);
case score >= 60 && score < 80:
return i18n(
`discourse_rewind.reports.writing_analysis.readability_score.over_60.${randomNum}`
);
case score >= 40 && score < 60:
return i18n(
`discourse_rewind.reports.writing_analysis.readability_score.over_40.${randomNum}`
);
case score >= 20 && score < 40:
return i18n(
`discourse_rewind.reports.writing_analysis.readability_score.over_20.${randomNum}`
);
default:
return i18n(
`discourse_rewind.reports.writing_analysis.readability_score.over_0.${randomNum}`
);
}
}
<template>
<div
class="rewind-report-page --writing-analysis"
{{didInsert this.setupKeyListener}}
{{willDestroy this.teardownKeyListener}}
>
<h2 class="rewind-report-title">
{{i18n "discourse_rewind.reports.writing_analysis.title"}}
</h2>
<div class="writing-analysis">
<div class="writing-analysis__menubar">
<span class="writing-analysis__menu-item">{{i18n
"discourse_rewind.reports.writing_analysis.menu_file"
}}</span>
<span class="writing-analysis__menu-item">{{i18n
"discourse_rewind.reports.writing_analysis.menu_other"
}}</span>
<span class="writing-analysis__menu-item">{{i18n
"discourse_rewind.reports.writing_analysis.menu_additional"
}}</span>
<span
class="writing-analysis__menu-item writing-analysis__menu-item--right"
>{{i18n
"discourse_rewind.reports.writing_analysis.menu_opening"
}}</span>
</div>
<div class="writing-analysis__frame">
<div class="writing-analysis__header-row">
<div class="writing-analysis__helpbox">
{{i18n "discourse_rewind.reports.writing_analysis.help_text"}}
</div>
<div class="writing-analysis__release">
<div class="writing-analysis__release-name">{{i18n
"discourse_rewind.reports.writing_analysis.app_name"
}}</div>
<div class="writing-analysis__release-meta">
{{i18n
"discourse_rewind.reports.writing_analysis.release_info"
}}
<span>&lt;3</span>
</div>
</div>
</div>
<div class="writing-analysis__stats">
<div class="writing-analysis__stats-col">
<div class="writing-analysis__stats-label">{{i18n
"discourse_rewind.reports.writing_analysis.total_words"
}}</div>
<div
class="writing-analysis__stats-value"
>{{@report.data.total_words}}</div>
<div class="writing-analysis__stats-label">{{i18n
"discourse_rewind.reports.writing_analysis.total_posts"
}}</div>
<div
class="writing-analysis__stats-value"
>{{@report.data.total_posts}}</div>
</div>
<div class="writing-analysis__stats-col">
<div class="writing-analysis__stats-label">{{i18n
"discourse_rewind.reports.writing_analysis.avg_post_length"
}}</div>
<div
class="writing-analysis__stats-value"
>{{@report.data.average_post_length}}</div>
<div class="writing-analysis__stats-label">{{i18n
"discourse_rewind.reports.writing_analysis.readability_score_label"
}}</div>
<div
class="writing-analysis__stats-value"
>{{@report.data.readability_score}}</div>
</div>
<div class="writing-analysis__stats-col">
<div class="writing-analysis__stats-label">{{i18n
"discourse_rewind.reports.writing_analysis.readability_level"
}}</div>
<div
class="writing-analysis__stats-value"
>{{this.scoreLabel}}</div>
</div>
</div>
</div>
</div>
</div>
</template>
}