From aa48b83aaa57e343133fa5881c55b9f7f8ad6cce Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 14:06:50 +0100 Subject: [PATCH 01/10] #75 feat: summary class --- src/services/model/Summary.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/services/model/Summary.js diff --git a/src/services/model/Summary.js b/src/services/model/Summary.js new file mode 100644 index 0000000..3c0812b --- /dev/null +++ b/src/services/model/Summary.js @@ -0,0 +1,12 @@ +class Summary { + constructor(tasks, files, pages, url, lti, wiki) { + this.tasks = tasks; + this.files = files; + this.pages = pages; + this.url = url; + this.lti = lti; + this.wiki = wiki; + } +} + +export default Summary; \ No newline at end of file From 0b968c17b6cf57ca2c9343add3cb24f6eeb706a9 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 14:06:57 +0100 Subject: [PATCH 02/10] #75 feat: log class --- src/services/model/Log.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/services/model/Log.js diff --git a/src/services/model/Log.js b/src/services/model/Log.js new file mode 100644 index 0000000..5b2d68c --- /dev/null +++ b/src/services/model/Log.js @@ -0,0 +1,14 @@ +class Log { + constructor(date, id, name, course, type, interaction, client, ip) { + this.date = date; + this.id = id; + this.name = name; + this.course = course; + this.type = type; + this.interaction = interaction; + this.client = client; + this.ip = ip; + } +} + +export default Log; \ No newline at end of file From dd6efc645c112a929f49ad06c06bd38e4ebc6c52 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 14:09:25 +0100 Subject: [PATCH 03/10] #75 feat: vuex store summary --- src/vuex/store.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vuex/store.js b/src/vuex/store.js index d8dab65..3e57e2d 100644 --- a/src/vuex/store.js +++ b/src/vuex/store.js @@ -1,4 +1,5 @@ import { createStore } from 'vuex' +import Summary from "@/services/model/Summary"; const store = createStore({ state() { @@ -34,7 +35,8 @@ const store = createStore({ status: false, message: "Error: Something went wrong", timeout: 0, - } + }, + summary: new Summary(), } }, mutations: { From ddc6ad952869228355ab7036610dcda97b2c3910 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 14:11:34 +0100 Subject: [PATCH 04/10] #75 feat: summary data processing --- src/services/Summary/summary-processing.js | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/services/Summary/summary-processing.js diff --git a/src/services/Summary/summary-processing.js b/src/services/Summary/summary-processing.js new file mode 100644 index 0000000..5933b5c --- /dev/null +++ b/src/services/Summary/summary-processing.js @@ -0,0 +1,29 @@ +function summary_processing(logs) { + let tasks_count = 0; + let files_count = 0; + let pages_count = 0; + let url_count = 0; + let lti_count = 0; + let wiki_count = 0; + + let task_type = {}; + let type = {}; + logs.forEach( (log) => { + + type[log.type] = (type[log.type] + 1) || 1; + /*switch (log.type) { + case 'Tarea': + case 'Tarea': + case 'Tarea': + case 'Tarea': + case 'Tarea': + case 'Tarea': + }*/ + if ( log.type === 'Tarea') { + tasks_count++; + task_type[log.interaction] = (task_type[log.interaction] + 1) || 1; + } + }) +} + +export { summary_processing }; \ No newline at end of file From 2f9d176e811541faacfe764af041293fbac0b456 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 14:12:07 +0100 Subject: [PATCH 05/10] #75 feat: forum data processing - summary processing --- src/services/forum-processing.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/services/forum-processing.js diff --git a/src/services/forum-processing.js b/src/services/forum-processing.js new file mode 100644 index 0000000..fc581ef --- /dev/null +++ b/src/services/forum-processing.js @@ -0,0 +1,16 @@ +import {summary_processing} from "@/services/Summary/summary-processing"; +import Log from "@/services/model/Log"; + +function forum_processing(data){ + let logs = []; + + data[0].forEach( (lg) => { + logs.push( + new Log(lg[0], lg[1], lg[2], lg[3], lg[4], lg[5], lg[6], lg[7], lg[8]) + ) + }) + + summary_processing(logs); +} + +export { forum_processing }; \ No newline at end of file From e3526127fcd3f68289af96a98aabf504d4aa9a26 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 14:12:31 +0100 Subject: [PATCH 06/10] #75 feat: check uploaded file type, moodle logs or forum logs --- src/services/local-processing.js | 54 ++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/services/local-processing.js b/src/services/local-processing.js index b33e856..9122d80 100644 --- a/src/services/local-processing.js +++ b/src/services/local-processing.js @@ -2,6 +2,7 @@ import store from "@/vuex/store"; import router from "@/router/router"; import Message from "@/services/model/Message"; +import {forum_processing} from "@/services/forum-processing"; const UNSUPPORTED_FILE_TYPE = -2 const SUPPORTED_FILE_TYPE = 2 @@ -28,31 +29,36 @@ function local_processing(file) { // Messages log file file_reader.onload = (event) => { let data = JSON.parse(event.target.result); - let messages = data[0]; - let forum = { - "forum_messages": [], - "messages": 0, - "users": 0, - "sentiments": {}, - } - - analyze_sentiment(messages).then( (processed_msg) => { - forum.forum_messages = processed_msg; - // Time format conversion - processed_msg.map( (msg) => { - convert_time(msg); + // Check whether it's a Moodle Logs or Moodle Forum message Logs file + if ( Array.isArray(data[0][0])) { + forum_processing(data); + } else { + let messages = data[0]; + let forum = { + "forum_messages": [], + "messages": 0, + "users": 0, + "sentiments": {}, + } + + analyze_sentiment(messages).then( (processed_msg) => { + forum.forum_messages = processed_msg; + // Time format conversion + processed_msg.map( (msg) => { + convert_time(msg); + }) + // Count messages + forum.messages = processed_msg.length; + // Count users + forum.users = count_users(processed_msg); + // Count sentiment ocurrences + forum.sentiments = count_sentiments(processed_msg); + // Store processed messages in vuex + store.commit('storeForumMessages', forum); + // Push to Dashboard > Sentiment + router.push('/dashboard/sentimental-analysis') }) - // Count messages - forum.messages = processed_msg.length; - // Count users - forum.users = count_users(processed_msg); - // Count sentiment ocurrences - forum.sentiments = count_sentiments(processed_msg); - // Store processed messages in vuex - store.commit('storeForumMessages', forum); - // Push to Dashboard > Sentiment - router.push('/dashboard/sentimental-analysis') - }) + } } file_reader.readAsText(file) From 2fbba4a259dcf5484836f4388948d19b9769e38e Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Mon, 29 Nov 2021 17:17:57 +0100 Subject: [PATCH 07/10] #75 feat: summary cards default value --- src/pages/Dashboard/Summary/Summary.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/Dashboard/Summary/Summary.vue b/src/pages/Dashboard/Summary/Summary.vue index 21e1837..841f7d2 100644 --- a/src/pages/Dashboard/Summary/Summary.vue +++ b/src/pages/Dashboard/Summary/Summary.vue @@ -35,37 +35,37 @@ export default { statistics:[ { statistic_name: "Tasks", - number: 7342, + number: 0, icon: mdiTextBoxCheck , info:"The total number of interactions with all deliveries of a subject." }, { statistic_name: "Files", - number: 1913, + number: 0, icon: mdiFileDocumentOutline, info:" The total number of interactions with all files of a subject." }, { statistic_name: "Pages", - number:75, + number: 0, icon: mdiNewspaperVariantOutline, info:"The total number of interactions with the pages of a subject." }, { statistic_name: "URL", - number:34, + number: 0, icon: mdiLinkVariant, info: "The total number of interactions with the URL resource of a subject." }, { statistic_name: "Learning Tools Interoperability", - number:0, + number: 0, icon: mdiHammerScrewdriver, info:"The total number of interactions with the learning tools interoperability resources of a subject." }, { statistic_name: "Wiki", - number:1, + number: 0, icon: mdiWikipedia , info:"The total number of interactions with the wikis of a subject." } From ee23caeab8732484d0a0f1f507f75b9188789787 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Tue, 30 Nov 2021 16:29:07 +0100 Subject: [PATCH 08/10] #75 feat: summary type count & categories count --- src/services/Summary/summary-processing.js | 33 ++++++++-------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/services/Summary/summary-processing.js b/src/services/Summary/summary-processing.js index 5933b5c..6e04586 100644 --- a/src/services/Summary/summary-processing.js +++ b/src/services/Summary/summary-processing.js @@ -1,29 +1,20 @@ function summary_processing(logs) { - let tasks_count = 0; - let files_count = 0; - let pages_count = 0; - let url_count = 0; - let lti_count = 0; - let wiki_count = 0; - - let task_type = {}; let type = {}; logs.forEach( (log) => { - - type[log.type] = (type[log.type] + 1) || 1; - /*switch (log.type) { - case 'Tarea': - case 'Tarea': - case 'Tarea': - case 'Tarea': - case 'Tarea': - case 'Tarea': - }*/ - if ( log.type === 'Tarea') { - tasks_count++; - task_type[log.interaction] = (task_type[log.interaction] + 1) || 1; + // Process all types of logs and count each one of them + if ( type[log.type] !== undefined ) { + type[log.type].count +=1; + type[log.type].interactions[log.interaction] = (type[log.type].interactions[log.interaction] + 1) || 1; + } else { + type[log.type] = { + count: 1, + interactions: {} + } + type[log.type].interactions[log.interaction] = 1; } }) + + return type; } export { summary_processing }; \ No newline at end of file From eea23f6d834492b00c6dded820815b198b51346b Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Tue, 30 Nov 2021 16:30:06 +0100 Subject: [PATCH 09/10] #75 feat: store summary processed data --- src/services/forum-processing.js | 5 ++++- src/vuex/store.js | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/services/forum-processing.js b/src/services/forum-processing.js index fc581ef..f6736a5 100644 --- a/src/services/forum-processing.js +++ b/src/services/forum-processing.js @@ -1,5 +1,6 @@ import {summary_processing} from "@/services/Summary/summary-processing"; import Log from "@/services/model/Log"; +import store from "@/vuex/store"; function forum_processing(data){ let logs = []; @@ -10,7 +11,9 @@ function forum_processing(data){ ) }) - summary_processing(logs); + let summary_types = summary_processing(logs); + + store.commit('saveSummaryTypes', summary_types) } export { forum_processing }; \ No newline at end of file diff --git a/src/vuex/store.js b/src/vuex/store.js index 3e57e2d..10d78b5 100644 --- a/src/vuex/store.js +++ b/src/vuex/store.js @@ -1,5 +1,4 @@ import { createStore } from 'vuex' -import Summary from "@/services/model/Summary"; const store = createStore({ state() { @@ -36,7 +35,7 @@ const store = createStore({ message: "Error: Something went wrong", timeout: 0, }, - summary: new Summary(), + summary_types: null, } }, mutations: { @@ -57,6 +56,9 @@ const store = createStore({ // Toggle alert this.state.alert.status = !this.state.alert.status; this.state.alert.message = message; + }, + saveSummaryTypes(state, summary_types) { + this.state.summary_types = summary_types; } } }); From 389fc39724b969934b38d72545d0886b02f058b3 Mon Sep 17 00:00:00 2001 From: JiahuiChen99 Date: Tue, 30 Nov 2021 16:30:27 +0100 Subject: [PATCH 10/10] #75 feat: load processed summary data --- src/pages/Dashboard/Summary/Summary.vue | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/pages/Dashboard/Summary/Summary.vue b/src/pages/Dashboard/Summary/Summary.vue index 841f7d2..388c0d6 100644 --- a/src/pages/Dashboard/Summary/Summary.vue +++ b/src/pages/Dashboard/Summary/Summary.vue @@ -8,7 +8,7 @@ sm:auto-rows-auto sm:grid-cols-1 md:auto-rows-auto md:grid-cols-2 xl:auto-rows-auto xl:grid-cols-3"> - + @@ -30,6 +30,23 @@ export default { InteractionCard, SummaryCard }, + computed: { + summary() { + let summary_types = this.$store.state.summary_types; + + this.statistics.forEach( (stat) => { + switch ( stat.statistic_name ) { + case 'Tasks': + stat.number = summary_types['Tarea'].count; + break; + case 'URL': + stat.number = summary_types['URL'].count; + break; + } + }); + return this.statistics + } + }, data(){ return{ statistics:[