diff --git a/ordre-du-jour/odj/src/app/app.component.html b/ordre-du-jour/odj/src/app/app.component.html
index de521a48..ab7dd09e 100644
--- a/ordre-du-jour/odj/src/app/app.component.html
+++ b/ordre-du-jour/odj/src/app/app.component.html
@@ -19,7 +19,8 @@
{{ i + 1 }}) {{ s.title }}
- {{ s.duration }} min, par {{ s.author }}. Reste: {{ resteTopicMinutes(s) }}. Passé: {{ round(s.spentSeconds) }}.
+ {{ s.duration }} min, par {{ s.author }}. Reste: {{ resteTopicMinutes(s) }}.
+ Passé: {{ round(s.spentSeconds) }}.
🎉
@@ -34,17 +35,22 @@
Texte du pad
-
- Compte rendu
+ Compte rendu du {{ (today) | date:'yyyy-MM-dd'}}
-
- {{buildCompteRendu()}}
-
+
+{{buildCompteRendu()}}
+
+
+
@@ -66,11 +72,11 @@
+
debug:
@@ -96,21 +102,38 @@
Reste: {{ countRemainingMinutes(subjects[currentSubjectId]) }} min
avancement: {{ getPercentProgressTimeForTopic(subjects[currentSubjectId]) }} %
- Début: {{ startTime }}
- Fin: {{ endTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
Début: {{ startTime }}, Fin: {{ endTime }}. Durée: {{round(getMinutesBetweenTwoDates(startDate,endDate))}}
+
+
+
+
+
+
diff --git a/ordre-du-jour/odj/src/app/app.component.scss b/ordre-du-jour/odj/src/app/app.component.scss
index 49f31b34..4944d8a6 100644
--- a/ordre-du-jour/odj/src/app/app.component.scss
+++ b/ordre-du-jour/odj/src/app/app.component.scss
@@ -164,17 +164,35 @@ main {
border-left-color: #00b89c;
}
}
+label{
+ margin-right: 2ch;
+ margin-top: 1rem;
+ min-width: 10rem;
+ display: inline-block;
+}
.btn{
cursor: pointer;
padding: 0.75rem 1.5rem;
border: solid 1px slategray;
border-radius: 0.5rem;
+ float:left;
+ margin-right: 2ch;
+ display: inline-block;
}
pre{
padding: 0.5rem;
background: lightslategrey;
}
+
+.is-clickable{
+ cursor: pointer;
+ &:hover{
+ &.subject{
+ background: rgba(170, 210, 199,0.2);
+ }
+ }
+}
@media screen and (max-width: 650px) {
.content {
flex-direction: column;
diff --git a/ordre-du-jour/odj/src/app/app.component.ts b/ordre-du-jour/odj/src/app/app.component.ts
index 2055e4fa..f1b3db98 100644
--- a/ordre-du-jour/odj/src/app/app.component.ts
+++ b/ordre-du-jour/odj/src/app/app.component.ts
@@ -30,6 +30,11 @@ export class AppComponent implements OnInit, OnDestroy {
startTime: string = "20:30";
// startTime: string = "17:00";
endTime: string = "22:00";
+ today: any = new Date();
+ // champs habituels pour le compte rendu:
+ scribe: string = 'tykayn';
+ presents: string = '- tykayn';
+
pasteLand: string = "* Présentation du suivi sur Nextcloud - 5min (tykayn)\n" +
"* Réduction de bus factor - 5min (tykayn)\n" +
"* Réunion avec Wikimedia France - 5min (tykayn)\n" +
@@ -40,9 +45,11 @@ export class AppComponent implements OnInit, OnDestroy {
hints: string = "";
showDebug: boolean = true;
- private startDate: Date = new Date();
- private endDate: Date = new Date();
+ startDate: Date = new Date();
+ endDate: Date = new Date();
private topicChangeDate: Date = new Date();
+ private timekeeper: any;
+ private animator: any;
updateTopicChangeDate(): void {
@@ -54,9 +61,10 @@ export class AppComponent implements OnInit, OnDestroy {
this.subjects[this.currentSubjectId].spentSeconds += timeDifferenceInSeconds;
this.topicChangeDate = currentTime;
}
- round(val:number){
+
+ round(val: number) {
if (val < 60) {
- return Math.round(val) +' s'
+ return Math.round(val) + ' s'
}
return (Math.round(val / 60) * 60) + ' min'
}
@@ -73,12 +81,13 @@ export class AppComponent implements OnInit, OnDestroy {
if (boom[0]) {
accumulatedDuration += this.findMinutesDurationInDescription(topic) | 0
+
newTopics.push({
id: ii,
title: boom[0],
duration: 15,
spentSeconds: 0,
- author: '',
+ author: this.findAuthorInDescription(topic),
notes: '',
finished: false,
startDate: this.getStartDateAfterDuration(accumulatedDuration + ''),
@@ -214,30 +223,30 @@ export class AppComponent implements OnInit, OnDestroy {
}
makeStatisticsOnTopicsSpentSeconds() {
- let totalSeconds = 0;
- for (const topic of this.subjects) {
- totalSeconds += topic.spentSeconds;
- }
-
- let averageSeconds = totalSeconds / this.subjects.length;
-
- let longestTopic = this.subjects[0];
- let longestSeconds = longestTopic.spentSeconds;
- for (const topic of this.subjects) {
- if (topic.spentSeconds > longestSeconds) {
- longestSeconds = topic.spentSeconds;
- longestTopic = topic;
+ let totalSeconds = 0;
+ for (const topic of this.subjects) {
+ totalSeconds += topic.spentSeconds;
}
- }
- let shortestTopic = this.subjects[0];
- let shortestSeconds = shortestTopic.spentSeconds;
- for (const topic of this.subjects) {
- if (topic.spentSeconds < shortestSeconds) {
- shortestSeconds = topic.spentSeconds;
- shortestTopic = topic;
+ let averageSeconds = totalSeconds / this.subjects.length;
+
+ let longestTopic = this.subjects[0];
+ let longestSeconds = longestTopic.spentSeconds;
+ for (const topic of this.subjects) {
+ if (topic.spentSeconds > longestSeconds) {
+ longestSeconds = topic.spentSeconds;
+ longestTopic = topic;
+ }
+ }
+
+ let shortestTopic = this.subjects[0];
+ let shortestSeconds = shortestTopic.spentSeconds;
+ for (const topic of this.subjects) {
+ if (topic.spentSeconds < shortestSeconds) {
+ shortestSeconds = topic.spentSeconds;
+ shortestTopic = topic;
+ }
}
- }
this.statsExplication = `Total spent seconds: ${totalSeconds}\nAverage spent seconds: ${averageSeconds}\nLongest topic: ${longestTopic.title} (${longestSeconds} seconds)\nShortest topic: ${shortestTopic.title} (${shortestSeconds} seconds)`;
@@ -249,21 +258,87 @@ export class AppComponent implements OnInit, OnDestroy {
this.updateTopicChangeDate()
}
- compteRendu:string = ''
+ compteRendu: string = ''
+
+ formatDateYMD(date: Date) {
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+
+ return `${year}-${month}-${day}`;
+ }
- buildCompteRendu(){
- let compteRendu = 'Compte rendu :\n\n';
+ buildCompteRendu() {
+ let compteRendu = `Compte rendu du ${this.formatDateYMD(this.today)}\n`;
+ compteRendu += ` début: ${this.startTime}, fin:${this.endTime}.\n`;
+ compteRendu += ` Présents: ${this.formatPresentLines()}.\n`;
+ if (this.scribe) {
+ compteRendu += ` Scribe: ${this.scribe}.\n`;
+ }
+ if (this.timekeeper) {
+ compteRendu += ` Gardien du temps: ${this.timekeeper}.\n`;
+ }
+ if (this.animator) {
+ compteRendu += ` Animation: ${this.animator}.\n`;
+ }
for (const topic of this.subjects) {
- compteRendu += `Sujet ${topic.id + 1} : ${topic.title}\n`;
- compteRendu += `Durée : ${topic.duration} minutes\n`;
- compteRendu += `Temps écoulé : ${this.resteTopicMinutes(topic)}\n\n`;
+ compteRendu += `* ${topic.title}-`;
+ compteRendu += ` ${topic.duration} min`;
+ compteRendu += ` (${topic.author})\n`;
+ compteRendu += ` \n${topic.notes}\n`;
+ compteRendu += `Temps écoulé : ${this.round(topic.spentSeconds)}\n\n`;
}
this.compteRendu = compteRendu
return compteRendu
}
- copyCompteRenduToClipboard() {
+ /**
+ * returns each present person for each line with a dash at the beggining if missing
+ */
+ formatPresentLines(){
+ let lines = ''
+ if (this.presents) {
+ lines += this.presents.split('\n').map(line => {
+ if(!line.length){
+ return '';
+ }
+ if (!line.startsWith('- ')) {
+ return `- ${line}`;
+ }
+ return line;
+ }).join('\n') + '\n'
+ }
+ return lines;
+ }
+
+ copyCompteRenduToClipboard() {
navigator.clipboard.writeText(this.compteRendu);
}
+
+
+ private findAuthorInDescription(topic: string): string {
+ let authorRegex = /\(([^)]+)\)/g;
+ let matches = authorRegex.exec(topic);
+ if (matches) {
+ return matches[1];
+ }
+ return '';
+ }
+
+ countLinesInPresent() {
+ return this.presents.split('\n').length;
+ }
+
+ downloadCompteRendu() {
+ let fichier = new Blob([this.buildCompteRendu()], {type: 'text/plain'});
+ let lien = document.createElement('a');
+ lien.setAttribute('href', window.URL.createObjectURL(fichier));
+ lien.setAttribute('download', 'compte-rendu.txt');
+ lien.click();
+ }
+
+ getMinutesBetweenTwoDates(date1: Date, date2: Date) {
+ return Math.floor((date2.getTime() - date1.getTime()) / 60000);
+ }
}