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 @@

- {{statsExplication}}

+
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); + } }