diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 9dc3be17..62185e49 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -27,7 +27,7 @@ services: - HARENA_LOGGER_URL=http://localhost:10030 - HARENA_LOGGER_API_VERSION=v1 - restart: always + restart: on-failure:5 networks: - harena-space volumes: @@ -57,7 +57,7 @@ services: - HASH_DRIVER=bcrypt depends_on: - harena-manager-database - restart: always + restart: on-failure:5 networks: - harena-space volumes: @@ -78,7 +78,7 @@ services: - MYSQL_PASSWORD=jacinto - MYSQL_ALLOW_EMPTY_PASSWORD=yes - MYSQL_ROOT_PASSWORD=root - restart: always + restart: on-failure:5 networks: - harena-space diff --git a/src/adonisjs/public/author/drafts/index.html b/src/adonisjs/public/author/drafts/index.html index 0e9ac682..2e6e5191 100644 --- a/src/adonisjs/public/author/drafts/index.html +++ b/src/adonisjs/public/author/drafts/index.html @@ -173,9 +173,22 @@ +
+ + + + +
+
+ diff --git a/src/adonisjs/public/author/env/inf331_2023/css/lab.css b/src/adonisjs/public/author/env/inf331_2023/css/lab.css new file mode 100644 index 00000000..9933d41a --- /dev/null +++ b/src/adonisjs/public/author/env/inf331_2023/css/lab.css @@ -0,0 +1,67 @@ +:root{ + --dark: #1F2232; + --secondary: #596475; + --primary: #BC9EC1; + --light-pink: #E3BAC6; + --light: #FDE8E9; +} +.bg-lab-light { + background-color: var(--light) !important; +} +.bg-lab-light-pink { + background-color: var(--light-pink) !important; +} +.bg-lab-primary { + background-color: var(--primary) !important; +} +.bg-lab-secondary { + background-color: var(--secondary) !important; +} +.bg-lab-dark { + background-color: var(--dark) !important; +} + +.text-lab-dark { + color: var(--dark) !important; +} + +.text-lab-secondary { + color: var(--secondary) !important; +} + +.text-lab-primary { + color: var(--primary) !important; +} +.text-primary { + color: var(--dark) !important; +} + +.text-lab-light-pink { + color: var(--light-pink) !important; +} + +.text-lab-light { + color: var(--light) !important; +} + +.btn-lab-primary { + color: var(--light); + background-color: var(--dark); + border-color: var(--dark); +} +.btn-lab-primary:hover { + color: var(--primary) !important; + font-size: 1.1rem !important; +} + +.btn-lab-secondary { + color: var(--light); + background-color: var(--secondary); + border-color: var(--secondary); +} + +.disabled-lock, .disabled-look{ + pointer-events: none; + background-color: var(--light-pink); + opacity: 0.8 +} diff --git a/src/adonisjs/public/author/env/inf331_2023/index.html b/src/adonisjs/public/author/env/inf331_2023/index.html new file mode 100644 index 00000000..59f4f1d5 --- /dev/null +++ b/src/adonisjs/public/author/env/inf331_2023/index.html @@ -0,0 +1,141 @@ + + + + + INF 331 - Laboratórios + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

INF 331 - Laboratórios

+
+
+
+
+
+
+
+ + diff --git a/src/adonisjs/public/author/env/inf331_2023/js/lab-progress.js b/src/adonisjs/public/author/env/inf331_2023/js/lab-progress.js new file mode 100644 index 00000000..45b19b59 --- /dev/null +++ b/src/adonisjs/public/author/env/inf331_2023/js/lab-progress.js @@ -0,0 +1,463 @@ + class labProgressManager { + constructor() { + function hourExpiration(_date, increment){ + _date.setTime(_date.getTime() + (increment*60*60*1000)) + return _date + } + // this.labRelease = {1:new Date('2023/08/31'),2:new Date('2023/09/06'), + // 3:new Date('2023/09/06'),4:new Date('2023/09/13'), + // 5:new Date('2023/09/20'),6:new Date('2023/09/27')} + this.labRelease = {1:this.setDateToISO(hourExpiration(new Date('2023/08/31 GMT-0300'),18)),2:this.setDateToISO(hourExpiration(new Date('2023/09/06 GMT-0300'),15)), + 3:this.setDateToISO(hourExpiration(new Date('2023/09/06 GMT-0300'),18)),4:this.setDateToISO(hourExpiration(new Date('2023/09/13 GMT-0300'),18)), + 5:this.setDateToISO(hourExpiration(new Date('2023/09/20 GMT-0300'),18)),6:this.setDateToISO(hourExpiration(new Date('2023/09/27 GMT-0300'),18))} + this.labExpiration = {1:this.setDateToISO(hourExpiration(new Date('2023/09/07 GMT-0300'),8)), 2:this.setDateToISO(hourExpiration(new Date('2023/09/16 GMT-0300'),8)), + 3:this.setDateToISO(hourExpiration(new Date('2023/09/16 GMT-0300'),8)),4:this.setDateToISO(hourExpiration(new Date('2023/09/23 GMT-0300'),8)), + 5:this.setDateToISO(hourExpiration(new Date('2023/09/30 GMT-0300'),8)),6:this.setDateToISO(hourExpiration(new Date('2023/10/06 GMT-0300'),8))} + this.start = this.start.bind(this) + MessageBus.i.subscribe('control/html/ready', this.start) + } + + setDateToISO(date){ + return new Date(date.toISOString()) + } + + async start(){ + MessageBus.i.unsubscribe('control/dhtml/ready', this.start) + // await this.getPrognosisUserInfo() + // console.log('getting lab user info...') + await this.getLabUserInfo() + // console.log('Lab user info completed...') + // console.log(labProgressManager.i.lab) + if(document.querySelector('#lab-progress-wrapper')){ + this.listLabProgress() + + } + + + } + async getCaseProperties (id){ + const config = { + method: 'GET', + url: DCCCommonServer.managerAddressAPI + 'case', + params: { + caseId: id, + }, + withCredentials: true + } + let prop + await axios(config) + .then(function (endpointResponse) { + prop = endpointResponse.data.property + }) + .catch(function (error) { + console.log(error) + }) + return prop + } + + async getLabUserInfo (){ + labProgressManager.i.lab = {} + const config = { + method: 'GET', + url: DCCCommonServer.managerAddressAPI + 'user/cases', + params: { + clearance: 5, + fSearchStr: 'INF 331 - Laboratório', + page: 1, + nItems: 30, + }, + withCredentials: true + } + let labList + let prognosisList = {} + await axios(config) + .then(function (endpointResponse) { + labList = endpointResponse.data.cases + }) + .catch(function (error) { + console.log(error) + }) + for (let lab of labList) { + let property = await this.getCaseProperties(lab.id) + if ('complete' in property){ + property = property['complete'] + }else{ + property = null + } + if (lab.title == lab.description && lab.title == lab.keywords){ + labProgressManager.i.lab[lab.title.substring(lab.title.length-1)] = {'id':lab.id,'desc':lab.description,'keywords':lab.keywords,'property':property} + }else if (lab.description == lab.keywords){ + labProgressManager.i.lab[lab.description.substring(lab.description.length-1)] = {'id':lab.id,'desc':lab.description,'keywords':lab.keywords,'property':property} + } + } + MessageBus.i.publish('data/lab.info/ready') + } + + /*async createLab (labNumber){ + const config = { + method: 'POST', + url: DCCCommonServer.managerAddressAPI + '/case', + params: { + title: `INF 331 - Laboratório ${labNumber}`, + source: labMarkdown, + description: `INF 331 - Laboratório ${labNumber}`, + language: 'pt-BR', + // domain: '', + // specialty: '', + keywords: `INF 331 - Laboratório ${labNumber}`, + creationDate: new Date().toJSON().slice(0,10).replace(/-/g,'/'), + institution: sessionStorage.getItem('harena-user-institution'), + // complexity: '', + + }, + withCredentials: true + } + let labList + let prognosisList = {} + await axios(config) + .then(function (endpointResponse) { + labList = endpointResponse.data.cases + }) + .catch(function (error) { + console.log(error) + }) + for (let lab of labList) { + labProgressManager.i.lab[lab.title.substring(lab.title.length-1)] = lab.id + } + MessageBus.i.publish('data/lab.info/ready') + }*/ + + noticeModalContent (txtClass, bodyClass, txt, closeTime){ + $('#notice-modal').modal('show') + let txtModal = document.querySelector(`#modal-notice-txt`) + let modalBody = document.querySelector(`#modal-notice-body`) + modalBody.className = modalBody.className.replace(/bg-+?/g, '') + txtModal.className = txtModal.className.replace(/text-+?/g, '') + + modalBody.classList.add(bodyClass) + txtModal.classList.add(txtClass) + txtModal.innerHTML = txt + + if(closeTime != null && closeTime > 0){ + setTimeout(function(){ + $('#notice-modal').modal('hide') + }, closeTime) + } + } + prependZero (number){ + if (number <10){ + if (number < 0 && number >-10){ + number = '-0'+Math.abs(number) + }else if (number >-10) { + number = '0'+number + } + + } + return number + } + + convertTzBrt(date){ + const convertedDate = date.toLocaleString('pt-BR', { timeZone: 'America/Sao_Paulo',hour12:false }) + return convertedDate + } + + convertToLocalTz(date, _locale){ + let convertedT = new Date(date.toUTCString()) + + if (_locale == 'string'){ + convertedT = date.toLocaleString('pt-BR',{hour12:false}) + }else if (_locale == 'date'){ + convertedT = new Date(date.toLocaleString('pt-BR',{hour12:false})) + } + + return convertedT + } + + + + getDateString(date){ + return date.toLocaleDateString('pt-BR', { hour12:false }) + } + + getTimeString(date){ + return date.toLocaleTimeString('pt-BR',{hour12:false}) + } + + async lockedLvls (wrapper, highest, limitLvl){ + let i = parseInt(highest+1) + let released = true + for (i; i <= limitLvl; i++) { + // let labTemplate = await MessageBus.i.request( + // 'data/template/' + `labs/lab_${i}`.replace(/\//g, '.') + + // '/get', {static: false}, null, true) + // if (labTemplate.message.code == 404){ + // released = false + // } + let template = document.createElement('template') + template.innerHTML = labProgressManager.lvlContainerLocked + .replace(/\[difficulty\]/ig, i) + .replace(/\[labRelease\]/ig, `${this.convertToLocalTz(this.labRelease[i],'string')}`) + .replace(/\[labText\]/ig, 'Ainda não publicado...') + wrapper.appendChild(template.content.cloneNode(true)) + } + + } + + async listLabProgress (){ + let labList = labProgressManager.i.lab + const progressWrapper = document.querySelector('#lab-progress-wrapper') + const successColor = 'bg-lab-dark text-lab-primary' + const failColor = 'bg-lab-light text-lab-dark' + let labCompleted = false + let labDelivered = false + let labLastEdit = null + const highestLab = Object.keys(labList).length + const currentDate = new Date() + // console.log('============',this.convertToLocalTz(new Date(),'date')) + // let tzOffset = this.prependZero(-1*(currentDate.getTimezoneOffset()/60)) + // if (-1*(currentDate.getTimezoneOffset()/60) > 0){ + // tzOffset = `GMT+${tzOffset}00` + // } + // console.log('============',this.getDateString(currentDate)) + // console.log('============',this.getTimeString(this.labRelease[1])) + // console.log('============',this.convertToLocalTz(currentDate,true)) + let createdBtn = false + let released = true + const lateReleaseTxt = 'Não publicado...(atraso)' + progressWrapper.innerHTML = '' + for (var i = 1; i <= Object.keys(this.labRelease).length; i++) { + + let labTemplate = await MessageBus.i.request( + 'data/template/' + `labs/lab_${i}`.replace(/\//g, '.') + + '/get', {static: false}, null, true) + if (labTemplate.message.code == 404){ + released = false + } + createdBtn = false + + let template = document.createElement('template') + // console.log('============ current greater then release',this.setDateToISO(currentDate) > this.setDateToISO(this.labRelease[i])) + // console.log('============ current date greater then expiration',this.setDateToISO(currentDate) > this.setDateToISO(this.labExpiration[i])) + + if (this.setDateToISO(currentDate) > this.setDateToISO(this.labRelease[i]) && highestLab >= i){ + if (labProgressManager.i.lab[i]['property'] != null && labProgressManager.i.lab[i]['property'] == '0'){ + labDelivered = true + } + // console.log('============ current date and release and highestLab') + if (released == false){ + // console.log('============ released false') + template.innerHTML = labProgressManager.lvlContainerLocked + .replace(/\[difficulty\]/ig, i) + .replace(/\[labRelease\]/ig, `${this.convertToLocalTz(this.labRelease[i],'string')}`) + .replace(/\[labText\]/ig, lateReleaseTxt) + + }else if (this.setDateToISO(currentDate) > this.setDateToISO(this.labRelease[i]) && this.setDateToISO(currentDate) > this.setDateToISO(this.labExpiration[i])){ + // console.log('============ release and expiration greater') + template.innerHTML = labProgressManager.lvlContainerExpired + .replace(/\[containerColor\]/ig, 'bg-lab-primary') + .replace(/\[btnColor\]/ig, 'btn-lab-secondary') + .replace(/\[labNumber\]/ig, Object.keys(this.labRelease)[i-1]) + .replace(/\[progress\]/ig, 'Fechado') + .replace(/\[progressColor\]/ig, labCompleted?successColor:'bg-lab-dark text-lab-light') + .replace(/\[this.labExpirationColor\]/ig, 'btn-lab-primary text-lab-light-pink') + .replace(/\[this.labExpiration\]/ig, + `${this.convertToLocalTz(this.labExpiration[i],'string')}`) + .replace(/\[labDelivered\]/ig, labDelivered?'Sim':'Não') + .replace(/\[labDeliveredColor\]/ig, labDelivered?successColor:failColor) + .replace(/\[labLastEdit\]/ig, labLastEdit) + .replace(/\[labLastEditColor\]/ig, (failColor)) + }else{ + template.innerHTML = labProgressManager.lvlContainer + .replace(/\[containerColor\]/ig, 'bg-lab-primary') + .replace(/\[btnColor\]/ig, 'btn-lab-primary') + .replace(/\[labNumber\]/ig, Object.keys(labList)[i-1]) + .replace(/\[progress\]/ig, 'Em aberto') + .replace(/\[progressColor\]/ig, labCompleted?successColor:'bg-lab-dark text-lab-light') + .replace(/\[this.labExpirationColor\]/ig, 'btn-lab-primary text-lab-light-pink') + .replace(/\[this.labExpiration\]/ig, + `${this.convertToLocalTz(this.labExpiration[i],'string')}`) + .replace(/\[labDelivered\]/ig, labDelivered?'Sim!':'Não') + .replace(/\[labDeliveredColor\]/ig, labDelivered?successColor:failColor) + .replace(/\[labLastEdit\]/ig, labLastEdit) + .replace(/\[labLastEditColor\]/ig, (failColor)) + .replace(/\[labId\]/ig, labList[i]['id']) + .replace(/\[buttonIcon\]/ig, 'play') + } + + + }else if(this.setDateToISO(currentDate) > this.setDateToISO(this.labRelease[i]) && this.setDateToISO(currentDate) > this.setDateToISO(this.labExpiration[i])){ + template.innerHTML = labProgressManager.lvlContainerExpired + .replace(/\[containerColor\]/ig, 'bg-lab-primary') + .replace(/\[btnColor\]/ig, 'btn-lab-secondary') + .replace(/\[labNumber\]/ig, Object.keys(this.labRelease)[i-1]) + .replace(/\[progress\]/ig, 'Fechado') + .replace(/\[progressColor\]/ig, labCompleted?successColor:'bg-lab-dark text-lab-light') + .replace(/\[this.labExpirationColor\]/ig, 'btn-lab-primary text-lab-light-pink') + .replace(/\[this.labExpiration\]/ig, + `${this.convertToLocalTz(this.labExpiration[i],'string')}`) + .replace(/\[labDelivered\]/ig, labDelivered?'Sim':'Não') + .replace(/\[labDeliveredColor\]/ig, labDelivered?successColor:failColor) + .replace(/\[labLastEdit\]/ig, labLastEdit) + .replace(/\[labLastEditColor\]/ig, (failColor)) + }else if (currentDate > this.labRelease[i]){ + if (released == false){ + template.innerHTML = labProgressManager.lvlContainerLocked + .replace(/\[difficulty\]/ig, i) + .replace(/\[labRelease\]/ig, `${this.getDateStringthis(this.labRelease[i])}`) + .replace(/\[labText\]/ig, lateReleaseTxt) + + }else{ + createdBtn = true + template.innerHTML = labProgressManager.lvlContainer + .replace(/\[containerColor\]/ig, 'bg-lab-primary') + .replace(/\[btnColor\]/ig, 'btn-lab-secondary') + .replace(/\[labNumber\]/ig, Object.keys(this.labRelease)[i-1]) + .replace(/\[progress\]/ig, 'Em aberto') + .replace(/\[progressColor\]/ig, labCompleted?successColor:'bg-lab-dark text-lab-light') + .replace(/\[this.labExpirationColor\]/ig, 'btn-lab-primary text-lab-light-pink') + .replace(/\[this.labExpiration\]/ig, + `${this.convertToLocalTz(this.labExpiration[i],'string')}`) + .replace(/\[labDelivered\]/ig, labDelivered?'Sim':'Não') + .replace(/\[labDeliveredColor\]/ig, labDelivered?successColor:failColor) + .replace(/\[labLastEdit\]/ig, labLastEdit) + .replace(/\[labLastEditColor\]/ig, (failColor)) + .replace(/\[buttonIcon\]/ig, 'plus') + } + } + + progressWrapper.appendChild(template.content.cloneNode(true)) + + const fnCreateLab = async function(){ + labProgressManager.i.noticeModalContent ('text-dark','bg-white', 'Configurando laboratório...', 0) + //Object containing key 'params'. + //Inside it, needs to contain 'title','description','language','domain','keywords','creationDate','complexity' + //'category','template' + let labN = this.id.substring(this.id.length-1) + const params = { + 'params':{ + 'title': `INF 331 - Laboratório ${labN}`, + 'template': `labs/lab_${labN}`, + 'category': 'plain', + 'description': `INF 331 - Laboratório ${labN}`, + 'language': 'pt-BR', + // 'domain': '', + // 'specialty': '', + 'keywords': `INF 331 - Laboratório ${labN}`, + 'creationDate': `${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`, + 'institution': sessionStorage.getItem('harena-user-institution'), + // 'complexity': '', + } + } + const labId = await TemplateToCase.s.storeCaseNoUi(params) + labProgressManager.i.noticeModalContent ('text-white','bg-success', 'Laboratório configurado! Redirecionando...', 3000) + setTimeout(window.location.href = `/author/env/inf331_2023/lab/?id=${labId['data']}`, 5000) + + } + if (createdBtn){ + let btnCreateLab = progressWrapper.querySelector(`button[id="btn-lab-${i}"]`) + btnCreateLab.addEventListener('click',fnCreateLab) + }else{ + if (progressWrapper.querySelector(`button[id="btn-lab-${i}"]`)){ + let btnLab = progressWrapper.querySelector(`button[id="btn-lab-${i}"]`) + btnLab.addEventListener('click',function(){window.location.href = `/author/env/inf331_2023/lab/?id=${btnLab.dataset.action}`}) + } + } + + + } + let template = document.createElement('template') + /*if(highestLab == '10'){ + let diffCalc = prognosisList[`prognosis-lvl-10-best-guess`] + let overviewTxt = prognosisList[`prognosis-lvl-10-pacient`] + let bestProgn = prognosisList[`prognosis-lvl-10-best-progn`] + let perfectValue = prognosisList[`prognosis-lvl-10-perfect`] + let bestScenario = false + let lvlCompleted = false + if((bestProgn == perfectValue) && (bestProgn != null && perfectValue != null)){ + bestScenario = true + }else{ + bestScenario = false + } + if(bestProgn == null || perfectValue == null){ + lvlCompleted = false + }else { + lvlCompleted = true + } + + template.innerHTML = labProgressManager.lvlContainer + .replace(/\[containerColor\]/ig, 'bg-dark') + .replace(/\[currentLvl\]/ig, '10') + .replace(/\[progress\]/ig, lvlCompleted?'Completo':'Em aberto') + .replace(/\[progressColor\]/ig, lvlCompleted?successColor:'bg-warning text-dark') + .replace(/\[pacientOverviewTxt\]/ig, overviewTxt) + .replace(/\[labDelivered\]/ig, bestScenario?'Sim':'Não') + .replace(/\[labDeliveredColor\]/ig, bestScenario?successColor:failColor) + .replace(/\[labLastEdit\]/ig, accuracy) + .replace(/\[labLastEditColor\]/ig, (accuracy == 'Na mosca!'?successColor:failColor)) + .replace(/\[starPoints\]/ig, labProgressManager.i.stars(lvlSuccess, 3, 2)) + .replace(/\[overviewPart\]/ig, labProgressManager.overviewTxt + .replace(/\[currentLvl\]/ig, '10') + .replace(/\[pacientOverviewTxt\]/ig, overviewTxt) + .replace(/\[gameMode\]/ig, 'progn')) + }else { + template.innerHTML = labProgressManager.lvlContainer + .replace(/\[containerColor\]/ig, 'bg-light') + .replace(/\[currentLvl\]/ig, highestLab) + .replace(/\[progress\]/ig, 'Em aberto') + .replace(/\[progressColor\]/ig, 'text-dark bg-warning') + .replace(/\[pacientOverviewTxt\]/ig, '') + .replace(/\[labDelivered\]/ig, '') + .replace(/\[labDeliveredColor\]/ig, failColor) + .replace(/\[labLastEdit\]/ig, '') + .replace(/\[labLastEditColor\]/ig, failColor) + .replace(/\[starPoints\]/ig, stars([], 3, 2)) + .replace(/\[overviewPart\]/ig, '') + }*/ + /*const prognBusList = document.querySelectorAll('#lab-progress-wrapper [data-bus-entity]') + for (let el of prognBusList) { + //TEMPORARY FIX - Generate change for MutationObserver + el.classList.add('bus') + }*/ + + // lastAvailable(progressWrapper, highestLvl) + this.lockedLvls(progressWrapper, highestLab+1, 6) + + } + +} +(function() { + labProgressManager.i = new labProgressManager() + + /* + +
Última edição: [labLastEdit]
+ */ + labProgressManager.lvlContainer = ` +
+
Laboratório: [labNumber]
+
Progresso: [progress]
+
Data limite: [this.labExpiration]
+
Entregue: [labDelivered]
+
+ +
+ +
+ ` + labProgressManager.lvlContainerExpired = ` +
+
Laboratório: [labNumber]
+
Progresso: [progress]
+
Data limite: [this.labExpiration]
+
Entregue: [labDelivered]
+
+ ` + + labProgressManager.lvlContainerLocked = ` +
+
Laboratório: [difficulty]
+
[labText]
+
Lançamento: [labRelease]
+
` +})() diff --git a/src/adonisjs/public/author/env/inf331_2023/js/lab-rest-proxy.js b/src/adonisjs/public/author/env/inf331_2023/js/lab-rest-proxy.js new file mode 100644 index 00000000..d2f8a693 --- /dev/null +++ b/src/adonisjs/public/author/env/inf331_2023/js/lab-rest-proxy.js @@ -0,0 +1,40 @@ +(function () { + DCC.component( + 'harena-inf331-complete-lab', + 'dcc-rest', + { + environment: { + 'url-manager': HarenaConfig.manager.url + HarenaConfig.manager.api, + 'entity': 'group', + 'clearance': '5', + 'subject_grade':'professor', + 'subject': 'INF 331 - 2023', + // 'subject': sessionStorage.getItem('harena-user-institution-id'), + 'table_id': new URL(document.location).searchParams.get('id'), + }, + oas: { + paths: { + '{url-manager}/case/share': { + 'post': { + operationId: 'inf331-complete-lab', + parameters: [ + {name: 'url-manager', + in: 'path'}, + {name: 'clearance', + in: 'query'}, + {name: 'entity', + in: 'query'}, + {name: 'subject', + in: 'query'}, + {name: 'subject_grade', + in: 'query'}, + {name: 'table_id', + in: 'query'} + ] + } + } + } + } + } + ) +})() \ No newline at end of file diff --git a/src/adonisjs/public/author/env/inf331_2023/lab/index.html b/src/adonisjs/public/author/env/inf331_2023/lab/index.html new file mode 100644 index 00000000..2f79ee38 --- /dev/null +++ b/src/adonisjs/public/author/env/inf331_2023/lab/index.html @@ -0,0 +1,552 @@ + + + + + Harena - Labs Environment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + +
+ +

{{title}}

+ +
+
+ + + +
+
+ + +
+ + + + + + + +
+
+ +
+
+
+ +
+
+
+
+ + + +
+
+ + + + + +
+
+
+ +
+ +
+
+ +
+ + + + diff --git a/src/adonisjs/public/author/index.html b/src/adonisjs/public/author/index.html index 3c07a9e3..241f4169 100644 --- a/src/adonisjs/public/author/index.html +++ b/src/adonisjs/public/author/index.html @@ -27,7 +27,7 @@ - + @@ -238,7 +238,7 @@

Settings

diff --git a/src/adonisjs/public/author/js/author.js b/src/adonisjs/public/author/js/author.js index 22640f16..3f94bb39 100644 --- a/src/adonisjs/public/author/js/author.js +++ b/src/adonisjs/public/author/js/author.js @@ -430,7 +430,7 @@ class AuthorManager { source: md }, null, true) - if(status.message && !status.message.includes('Error') ){ + if(status.message && (!status.message.includes('Error') && !status.message.includes('Forbidden')) ){ Basic.service.authorPropertyStore('caseId', Basic.service.currentCaseId) this.noticeModalContent('text-white','bg-success','SAVED!', 900) @@ -448,9 +448,9 @@ class AuthorManager { }) let dummy = await promise this._messageSpace.classList.add('invisible') - document.getElementById('btn-save-draft').innerHTML = 'SAVE' + // document.getElementById('btn-save-draft').innerHTML = 'SAVE' }else { - this.noticeModalContent('text-white','bg-danger',`${status.message}. Please try again.
If it persists, contact the support.`, 15000) + this.noticeModalContent('text-white','bg-danger',`${status.message}.. Please try again.
If it persists, contact the support.`, 15000) // this._messageSpace.firstElementChild.innerHTML = status.message // this._messageSpace.firstElementChild.style.backgroundColor = '#f21313b5' // this._messageSpace.firstElementChild.style.borderRadius = '50px' @@ -471,12 +471,12 @@ class AuthorManager { this._messageSpace.firstElementChild.style.backgroundColor = null this._messageSpace.firstElementChild.style.borderRadius = null this._messageSpace.firstElementChild.style.right = null - document.getElementById('btn-save-draft').innerHTML = 'SAVE' + // document.getElementById('btn-save-draft').innerHTML = 'SAVE' } } else{ this._messageSpace.firstElementChild.innerHTML = 'Error...try again.' setTimeout(this._messageSpace.classList.add('invisible'), 1500) - document.getElementById('btn-save-draft').innerHTML = 'SAVE' + // document.getElementById('btn-save-draft').innerHTML = 'SAVE' } } diff --git a/src/adonisjs/public/author/js/dcc-author-server-proxy.js b/src/adonisjs/public/author/js/dcc-author-server-proxy.js index 16e55504..02e6f2c8 100644 --- a/src/adonisjs/public/author/js/dcc-author-server-proxy.js +++ b/src/adonisjs/public/author/js/dcc-author-server-proxy.js @@ -295,9 +295,11 @@ class DCCAuthorServer { serviceResponse = endpointResponse.data }) .catch(function (error) { + error.code = JSON.stringify(error.message).includes('404')?404:'undefined error' console.log('=== load ' + sd + ' template error') console.log(error) console.log(error.code) + serviceResponse = error }) if (serviceResponse != null) diff --git a/src/adonisjs/public/author/js/template-case.js b/src/adonisjs/public/author/js/template-case.js index d37501cd..aadcc1fd 100644 --- a/src/adonisjs/public/author/js/template-case.js +++ b/src/adonisjs/public/author/js/template-case.js @@ -17,36 +17,6 @@ class TemplateToCase { document.querySelector('#category').value = _url.searchParams.get('category') const params = new FormData(document.querySelector('#create-case-form')) - // console.log(params); - // console.log(params.get('template')); - /* - // params.set('template', _url.searchParams.get('template').replace(/__/ig, "/")) - // params.set('quest', _url.searchParams.get('quest')) - // for (var pair of params.entries()) { - // console.log(pair[0] + ': ' + pair[1]) - // } - // console.log(params) - - // load template - */ - /* - const templateRequest = { - method: 'GET', - url: '/templates/' + - params.get('template') + '.md' - } - - let markdown = null - await axios(templateRequest) - .then(function (endpointResponse) { - markdown = endpointResponse.data - }) - .catch(function (error) { - console.log(error) - console.log(error.code) - }) - */ - const templateMd = await MessageBus.i.request( 'data/template/' + params.get('template').replace(/\//g, '.') + @@ -106,7 +76,75 @@ class TemplateToCase { } ) } -} + + //Object containing key 'params'. + //Inside it, needs to contain 'title','description','language','domain','keywords','creationDate','complexity' + //'category','template' + async storeCaseNoUi (incoming) { + let _caseId + try { + const _url = new URL(document.location) + + const params = incoming['params'] + const templateMd = + await MessageBus.i.request( + 'data/template/' + params['template'].replace(/\//g, '.') + + '/get', {static: false}, null, true) + let markdown = templateMd.message + + if (markdown != null) { + const config = { + method: 'POST', + url: DCCCommonServer.managerAddressAPI + 'case', + data: { + title: params['title'], + description: params['description'], + language: params['language'], + domain: params['domain'], + specialty: params['specialty'], + keywords: params['keywords'], + source: markdown, + original_date: params['creationDate'], + complexity: params['complexity'], + }, + withCredentials: true + } + + + await axios(config) + .then(function (endpointResponse) { + _caseId = endpointResponse.data.id + }) + .catch(function (error) { + console.log(error) + }) + + const linkCase = { + method: 'POST', + url: DCCCommonServer.managerAddressAPI + 'category/link/case', + data: { + categoryId: params['category'], + caseId: _caseId, + orderPosition: 0 + }, + withCredentials: true + } + await axios(linkCase) + .then(function (endpointResponse) { + // window.location.href = '/author/?id=' + _caseId + }) + .catch(function (error) { + console.log(error) + // window.location.href = '/author/?id=' + _caseId + }) + } + return {'data':_caseId,'message':'Case created successfully!','status':200} + } catch (e) { + console.log(e) + } + } + } + (function () { TemplateToCase.s = new TemplateToCase() diff --git a/src/adonisjs/public/editor/annotate/js/annotator.js b/src/adonisjs/public/editor/annotate/js/annotator.js index 259e93c9..dffa3361 100644 --- a/src/adonisjs/public/editor/annotate/js/annotator.js +++ b/src/adonisjs/public/editor/annotate/js/annotator.js @@ -122,12 +122,12 @@ class Annotator { this._year = c.property_value; break default: let slot - const ifr = c.fragment + '_' + c.range + const ifr = c.fragment.toLowerCase() + '_' + c.range let mem = 0 if (ifrag[ifr]) slot = ifrag[ifr] else { - let frag = c.fragment + let frag = c.fragment.toLowerCase() const fs = c.range.split(';') const fragments = [] for (const f of fs) { @@ -175,21 +175,23 @@ class Annotator { if (questAnn != null && questAnn.message != null) { questAnn = questAnn.message + const doclc = doc.toLowerCase() const annotations = [] const ifrag = {} for (const c of questAnn) { let slot = null - if (ifrag[c.fragment]) - slot = ifrag[c.fragment] + const fraglc = c.fragment.toLowerCase() + if (ifrag[fraglc]) + slot = ifrag[fraglc] else { - const pos = doc.indexOf(c.fragment) + const pos = doclc.indexOf(fraglc) if (pos > -1) { slot = { fragments: [ - {fragment: c.fragment, start: pos, size: c.fragment.length}], + {fragment: fraglc, start: pos, size: fraglc.length}], categories: []} annotations.push(slot) - ifrag[c.fragment] = slot + ifrag[fraglc] = slot } } const cat = c.property_id.substring(4) diff --git a/src/adonisjs/public/infra/conditional-layout.js b/src/adonisjs/public/infra/conditional-layout.js index 2125c32e..a8e8a31d 100644 --- a/src/adonisjs/public/infra/conditional-layout.js +++ b/src/adonisjs/public/infra/conditional-layout.js @@ -36,7 +36,10 @@ class LayoutController { if(new URL(document.location).pathname == '/author/'){ this.dynamicAuthor() + }else if(new URL(document.location).pathname.includes('/author/env/inf331_2023/lab')){ + this.dynamicLab() } + if(new URL(document.location).pathname == '/author/home/'){ this.dynamicMenu() }else if(new URL(document.location).pathname == '/author/drafts/feedback/'){ @@ -60,9 +63,10 @@ class LayoutController { async busMessages(){ // console.log('======= starting conditional-layout') LayoutController.user = await MessageBus.i.waitMessage('user/login/+') - if(new URL(document.location).pathname == '/author/'){ + if(new URL(document.location).pathname == '/author/' || new URL(document.location).pathname.includes('/author/env/inf331_2023/lab')){ LayoutController.case = await MessageBus.i.waitMessage('service/response/get/harena-case') } + // console.log('============ starting controller dynamic') this.startController() @@ -174,9 +178,74 @@ class LayoutController { } } - } + async dynamicLab (){ + const toolbarDiv = document.querySelector('#div-toolbar-rightside') + toolbarDiv.innerHTML = + `
Entregar Laboratório:
+ + +
+ + + +
` + // ------------------------------------------------------------------------------- // + + + + const dccSubmitProp = document.createElement('dcc-submit') + const userGrade = LayoutController.user.message.grade + const formProp = document.querySelector('#form-case-property') + const inputPropertyValue = document.querySelector('#property_value') + + if(userGrade === 'student'){ + + dccSubmitProp.setAttribute('id','dcc-submit-feedback') + dccSubmitProp.setAttribute('bind','submit-case-property') + dccSubmitProp.setAttribute('xstyle','btn btn-secondary m-1') + dccSubmitProp.setAttribute('label', "Entregar") + dccSubmitProp.setAttribute('topic','service/request/post') + dccSubmitProp.setAttribute('data-toggle','tooltip') + dccSubmitProp.setAttribute('data-placement','top') + dccSubmitProp.setAttribute('title',"Entregar laboratório para o/a professor/a.") + await formProp.appendChild(dccSubmitProp) + + inputPropertyValue.value = '0' + + //Disable save button if expiration date is met + } + // else if(userGrade === 'professor' || userGrade === 'coordinator'){ + // dccSubmitProp.setAttribute('id','dcc-submit-feedback') + // dccSubmitProp.setAttribute('bind','submit-case-property') + // dccSubmitProp.setAttribute('xstyle','btn btn-secondary m-1') + // dccSubmitProp.setAttribute('label','Set Feedback Complete') + // dccSubmitProp.setAttribute('topic','service/request/put') + // dccSubmitProp.setAttribute('connect','submit:harena-case-property:service/request/put') + // dccSubmitProp.setAttribute('data-toggle','tooltip') + // dccSubmitProp.setAttribute('data-placement','top') + // dccSubmitProp.setAttribute('title',"Sets feedback as finished (for your student's knowlegde)") + + // await formProp.appendChild(dccSubmitProp) + + // inputPropertyValue.value = '1' + // } + + this.labDeliverButtonCaseState() + + // if(new URL(document.location).searchParams.get('fdbk')){ + // setTimeout(function(){ + // // document.querySelector('#button-comments-nav').click() + // // MessageBus.i.publish('control/properties/expand') + // MessageBus.i.publish('control/comments/expand') + // // MessageBus.i.publish('control/comments/editor') + // }, 500) + // } + + } + async dynamicMenu (){ if((LayoutController.user.message.institution === 'hcpa' || LayoutController.user.message.institution === 'unisinos') @@ -216,6 +285,88 @@ class LayoutController { } } + async labDeliverButtonCaseState (propValue){ + const userGrade = LayoutController.user.message.grade + const btnLabDelivered = document.querySelector('#dcc-submit-feedback') + if(propValue){ + LayoutController.case.message.property.complete = propValue + } + if(userGrade === 'student'){ + let labN = LayoutController.case.message.keywords + labN = labN.substring(labN.length-1) + const expirationDate = labProgressManager.i.labExpiration[labN] + //Verifies property 'feedback' to disable button and change layout + if(LayoutController.case.message.property.complete){ + if(LayoutController.case.message.property.complete == 0){ + + btnLabDelivered.firstElementChild.innerHTML = 'Entregue' + } + // else { + // btnLabDelivered.firstElementChild.innerHTML = 'Recieved' + // } + + btnLabDelivered.firstElementChild.classList.add('disabled') + btnLabDelivered.style.pointerEvents = 'none' + document.querySelector('#dcc-submit-feedback').removeAttribute('topic') + document.querySelector('#dcc-submit-feedback').removeAttribute('connect') + try { + document.querySelector('#property_value').remove() + document.querySelector('#property_title').remove() + document.querySelector('#harena-case-property').remove() + document.querySelector('#harena-inf331-complete-lab').remove() + } catch (e) { + console.log(e) + } + } + btnLabDelivered.addEventListener("click", function(event) { + btnLabDelivered.firstElementChild.innerHTML = 'Entregue' + btnLabDelivered.firstElementChild.classList.add('disabled') + btnLabDelivered.style.pointerEvents = 'none' + document.querySelector('#dcc-submit-feedback').removeAttribute('topic') + document.querySelector('#dcc-submit-feedback').removeAttribute('connect') + document.querySelector('#harena-case-property').remove() + document.querySelector('#harena-inf331-complete-lab').remove() + }) + if (expirationDate < new Date()){ + const saveBtn = document.querySelector('#btn-save-draft') + saveBtn.innerHTML = 'Data da entrega expirada' + btnLabDelivered.firstElementChild.innerHTML = btnLabDelivered.firstElementChild.innerHTML == 'Entregar'?'Não entregue':'Entregue' + saveBtn.classList.add('disabled') + saveBtn.nextElementSibling.remove() + } + } + /*else if(userGrade === 'professor' || userGrade === 'coordinator'){ + if(document.querySelector('#harena-inf331-complete-lab')) + document.querySelector('#harena-inf331-complete-lab').remove() + + let casePropertyRest = document.querySelector('#harena-case-property') + let caseDccSubmit = document.querySelector('#dcc-submit-feedback') + + if(LayoutController.case.message.property.feedback){ + btnLabDelivered.firstElementChild.innerHTML = 'Notify as Complete' + + if(LayoutController.case.message.property.feedback == 1){ + casePropertyRest.remove() + btnLabDelivered.firstElementChild.innerHTML = 'Notified as Complete' + btnLabDelivered.firstElementChild.classList.add('disabled') + btnLabDelivered.style.pointerEvents = 'none' + caseDccSubmit.removeAttribute('topic') + caseDccSubmit.removeAttribute('connect') + try { + document.querySelector('#property_value').remove() + document.querySelector('#property_title').remove() + } catch (e) { + console.log(e) + } + + } + btnLabDelivered.addEventListener("click", function(event) { + btnLabDelivered.firstElementChild.innerHTML = 'Notified as Complete' + }) + } + }*/ + } + async feedbackButtonCaseState (propValue){ const userGrade = LayoutController.user.message.grade const btnFeedback = document.querySelector('#dcc-submit-feedback') @@ -295,7 +446,7 @@ class LayoutController { // console.log('============ entered dynamic modal') const selEntity = document.querySelector('#entity') const wrapperSelEntity = document.querySelector('#wrapper-entity') - const selSubject = document.querySelector('#wrapper-subject .sel-institution') + const selSubject = document.querySelector('#wrapper-subject #subject') const inputSubject = document.querySelector('#wrapper-input-subject') const wrapperSelSubject = document.querySelector('#wrapper-subject') const selSubjectGrade = document.querySelector('#subject_grade') diff --git a/src/adonisjs/public/infra/dcc-rest-proxy.js b/src/adonisjs/public/infra/dcc-rest-proxy.js index 7fba66d4..2f1ba4b8 100644 --- a/src/adonisjs/public/infra/dcc-rest-proxy.js +++ b/src/adonisjs/public/infra/dcc-rest-proxy.js @@ -262,6 +262,7 @@ 'fSpecialty': new URL(document.location).searchParams.get('fSpecialty'), 'fPropertyValue': new URL(document.location).searchParams.get('fPropertyValue'), 'fSearchStr': new URL(document.location).searchParams.get('fSearchStr'), + 'fGroup': new URL(document.location).searchParams.get('fGroup'), 'page': new URL(document.location).searchParams.get('page'), 'nItems': new URL(document.location).searchParams.get('limit'), }, @@ -287,6 +288,8 @@ in: 'query'}, {name: 'fSearchStr', in: 'query'}, + {name: 'fGroup', + in: 'query'}, {name: 'page', in: 'query'}, {name: 'nItems', @@ -430,6 +433,30 @@ } ) + //Retrieves groups that user is a part of + DCC.component( + 'harena-user-groups', + 'dcc-rest', + { + environment: { + 'url-manager': HarenaConfig.manager.url + HarenaConfig.manager.api, + }, + oas: { + paths: { + '{url-manager}/group': { + 'get': { + operationId: 'user-group-list', + parameters: [ + {name: 'url-manager', + in: 'path'} + ] + } + } + } + } + } + ) + DCC.component( 'harena-ask-feedback', 'dcc-rest', @@ -800,4 +827,39 @@ } ) + DCC.component( + 'harena-cases-inf331', + 'dcc-rest', + { + environment: { + 'url-manager': HarenaConfig.manager.url + HarenaConfig.manager.api, + 'clearance': 5, + 'fSearchStr': 'INF 331 - Laboratório', + 'page': 1, + 'nItems': 30, + }, + oas: { + paths: { + '{url-manager}/user/cases': { + 'get': { + operationId: 'cases-list', + parameters: [ + {name: 'url-manager', + in: 'path'}, + {name: 'clearance', + in: 'query'}, + {name: 'fSearchStr', + in: 'query'}, + {name: 'page', + in: 'query'}, + {name: 'nItems', + in: 'query'}, + ] + } + } + } + } + } + ) + })() diff --git a/src/adonisjs/public/templates/labs/lab1/how-to-present.png b/src/adonisjs/public/templates/labs/lab1/how-to-present.png new file mode 100644 index 00000000..4595cacd Binary files /dev/null and b/src/adonisjs/public/templates/labs/lab1/how-to-present.png differ diff --git a/src/adonisjs/public/templates/labs/lab2/orange-diagram.png b/src/adonisjs/public/templates/labs/lab2/orange-diagram.png new file mode 100644 index 00000000..2f4dafbd Binary files /dev/null and b/src/adonisjs/public/templates/labs/lab2/orange-diagram.png differ diff --git a/src/adonisjs/public/templates/labs/lab_1-dynamic.md b/src/adonisjs/public/templates/labs/lab_1-dynamic.md new file mode 100644 index 00000000..cfc1ae2f --- /dev/null +++ b/src/adonisjs/public/templates/labs/lab_1-dynamic.md @@ -0,0 +1,55 @@ +# Tarefa 1 # + +

Componentes Intercambiáveis no Orange

+

Tarefa 1

+ +{{explica +* Modifique o workflow do passo 2 para ler dados de uma planilha Excel (`computed/commodity-profile.xlsx`). +* Sugestão: troque o leitor de CSV pelo leitor genérico de arquivos. +* Veja no terceiro quadro como apresentar o resultado da tarefa. +}} + +{{figura +

Coloque a figura com a resolução da tarefa aqui.

+}} + +# Tarefa 2 # + +

Componentes Intercambiáveis no Orange

+

Tarefa 2

+ +{{explica +* Escreva uma pergunta de pesquisa de algo que você quer investigar sobre a tabela de receitas. A pergunta de pesquisa deve aparecer no workflow, tal como está feito no exemplo de Apresentação do Resultado das Tarefas. +* Elabore um workflow que leia o arquivo de receitas (`recipes/Recipes_WWEIA_FCID_0510.csv`) e apresente uma visualização relacionada a sua pergunta. +* Use um outro tipo de gráfico que não seja o de dispersão. +}} + +{{figura +

Coloque a figura com a resolução da tarefa aqui.

+}} + +# Tarefa 3 # + +

Componentes e Simetria no Orange

+

Tarefa

+ +{{explica +* Modifique o último workflow apresentado, acrescentando a descrição do método de cozimento (cooking method) no resultado. +* O método de cozimento está na tabela `Cooking_Method_Description.csv` na pasta basics. +}} + +{{figura +

Coloque a figura com a resolução da tarefa aqui.

+}} + +# Apresenta # + +

Apresentação do Resultado das Tarefas

+ +Você deve capturar a tela do workflow onde deve aparecer o workflow completo e a janela de resultados, tal como ilustra este exemplo: + +![How to Present](template_fix/labs/lab1/how-to-present.png) + +___ Template ___ + +* template: labs/lab_1 diff --git a/src/adonisjs/public/templates/labs/lab_1-static.md b/src/adonisjs/public/templates/labs/lab_1-static.md new file mode 100644 index 00000000..9026b7b4 --- /dev/null +++ b/src/adonisjs/public/templates/labs/lab_1-static.md @@ -0,0 +1,8 @@ +___ Flow ___ + +* Sequential: + * _sequential_ + +___ Data ___ + +* theme: simple(blue) diff --git a/src/adonisjs/public/templates/labs/lab_2-dynamic.md b/src/adonisjs/public/templates/labs/lab_2-dynamic.md new file mode 100644 index 00000000..0cb2977c --- /dev/null +++ b/src/adonisjs/public/templates/labs/lab_2-dynamic.md @@ -0,0 +1,42 @@ +# Referência # + +

Diagrama de Referência

+ +Para as suas tarefas a seguir, considere o diagrama de referência abaixo: + +![How to Present](template_fix/labs/lab2/orange-diagram.png) + +# Tarefa 1 # + +

Comunicação orientada a Conexões

+

Tarefa

+ +{{explica +* Considere o workflow do diagrama de referência em Orange. +* Construa dois diagramas conectando componentes com interfaces providas e requeridas, bem como atributos usando: padrão push e padrão pull. +* Apresente o detalhamento da interface em UML. +}} + +{{figura +

Coloque o primeiro diagrama (padrão push) com a resolução da tarefa aqui.

+

Coloque o segundo diagrama (padrão pull) com a resolução da tarefa aqui.

+}} + +# Tarefa 2 # + +

Comunicação orientada a Mensagens ou Documentos

+

Tarefa

+ +{{explica +* Considere o workflow do diagrama de referência em Orange. +* Construa um diagrama conectando componentes baseado em mensagens. +* Apresente o detalhamento da mensagens/documentos trocados. +}} + +{{figura +

Coloque o diagrama com a resolução da tarefa aqui.

+}} + +___ Template ___ + +* template: labs/lab_1 diff --git a/src/adonisjs/public/templates/labs/lab_2-static.md b/src/adonisjs/public/templates/labs/lab_2-static.md new file mode 100644 index 00000000..849086fb --- /dev/null +++ b/src/adonisjs/public/templates/labs/lab_2-static.md @@ -0,0 +1,8 @@ +___ Flow ___ + +* Sequential: + * _sequential_ + +___ Data ___ + +* theme: simple(purple) diff --git a/src/adonisjs/public/templates/labs/labs.png b/src/adonisjs/public/templates/labs/labs.png new file mode 100644 index 00000000..b86b96e2 Binary files /dev/null and b/src/adonisjs/public/templates/labs/labs.png differ diff --git a/src/adonisjs/public/templates/templates.json b/src/adonisjs/public/templates/templates.json index 70ccc6d8..5b9efc43 100644 --- a/src/adonisjs/public/templates/templates.json +++ b/src/adonisjs/public/templates/templates.json @@ -4,7 +4,21 @@ "path": "plain/case/empty", "icon": "plain/case/plain.png", "scope": "case", - "environment": "development"}, + "environment": "jacinto"}, +"Lab 1": + {"questId": "labs", + "description": "Lab 1.", + "path": "labs/lab_1", + "icon": "labs/labs.png", + "scope": "case", + "environment": "jacinto"}, +"Lab 2": + {"questId": "labs", + "description": "Lab 2.", + "path": "labs/lab_2", + "icon": "labs/labs.png", + "scope": "case", + "environment": "jacinto"}, "Zombie": {"questId": "zombie", "description": "Zombie Venom.", diff --git a/src/adonisjs/public/user/js/user-signup.js b/src/adonisjs/public/user/js/user-signup.js index 54bfdb5c..6c30a431 100644 --- a/src/adonisjs/public/user/js/user-signup.js +++ b/src/adonisjs/public/user/js/user-signup.js @@ -15,7 +15,7 @@ class UserSignup { document.querySelector('#date_agree_2').innerHTML = sdate } - // TCLE of the Experiment Illness Script Components (ISC) + // TCLE of the Zombie Venom for 18+ years old startAdultMuseum () { this._experimentStartAdultMuseum = this._experimentStartAdultMuseum.bind(this) MessageBus.i.subscribe('control/experiment/start', this._experimentStartAdultMuseum) @@ -27,6 +27,17 @@ class UserSignup { this._startPrognosisISC() } + // TCLE of the Software Engineering for 18+ years old + startAdultSWE () { + MessageBus.i.subscribe('control/experiment/start', this._experimentStartSWE.bind(this)) + + this.finalMessage = +`

Bem-vindo(a)! Você foi convidado(a) a participar de um estudo científico no ambiente Harena.

+

Nas próximas telas, você será conduzido a um ambiente de resolução de laboratórios.

+

` + this._startPrognosisISC() + } + // TCLE of the Prognosis Game startPrognosis () { this.finalMessage = @@ -319,6 +330,15 @@ class UserSignup { // window.location.href = "/player/case/?id=8b969606-ad6b-4772-a8e8-f15ae8033e0e&room=f2ef57a5-7c71-4fd9-9fd5-69448020c981" window.location.href = "/player/case/?id=164e49f9-fee2-49dc-aa16-53bf7cf3ea97&room=2dcc1f39-85e6-4cfe-9539-58145f6cc98b" } + + async _experimentStartSWE () { + const userLogin = { + username: this.current.username, + eventId: this.current.eventId + } + let user = await MessageBus.i.request('user/login/post', userLogin) + window.location.href = '/author/env/inf331_2023' + } } (function () { diff --git a/src/adonisjs/public/user/signup/tcle-swe/index.html b/src/adonisjs/public/user/signup/tcle-swe/index.html new file mode 100644 index 00000000..236feb2a --- /dev/null +++ b/src/adonisjs/public/user/signup/tcle-swe/index.html @@ -0,0 +1,226 @@ + + + + + Cadastro de Usuário + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+

Laboratório de Engenharia de Software

+
+ +
+
+
+
+ +
+ +
+ + +
+ +
+
+
+
+

TERMO DE CONSENTIMENTO LIVRE E ESCLARECIDO

+ +

+ 18 anos ou mais


+ Plataforma de Aprendizagem Virtual baseada em Simulação e Resolução de +Problemas
+ Responsável: André Santanchè
+ Número do CAAE: 46635421.5.0000.5404
+

+


+ +

Você está sendo convidado a participar de uma pesquisa. Este documento, chamado Termo de Consentimento Livre e Esclarecido, visa assegurar seus direitos como participante da pesquisa. Você preencherá um campo com seu nome e clicará em concordo, indicando que concorda participar desta pesquisa. Você deve indicar um e-mail para receber uma cópia deste termo acompanhado de um número de chave. Como a pesquisa é anônima, a plataforma requisitará apenas a chave para lhe dar acesso ao sistema e não guardará seus dados pessoais. Caso em qualquer momento você queira que seus dados sejam excluídos da plataforma, bastará nos informar o número da chave.

+ +

Por favor, leia com atenção e calma, aproveitando para esclarecer suas dúvidas. Se houver perguntas antes ou mesmo depois de aceitá-lo, você poderá esclarecê-las com o pesquisador. Se preferir, pode baixar o termo em seu computador e enviá-lo para seus familiares ou outras pessoas a fim de consultá-los antes de decidir participar. Não haverá nenhum tipo de penalização ou prejuízo se você não aceitar participar ou retirar sua autorização em qualquer momento. Cabe ressaltar que, caso aceite participar, é importante fazer o download deste Termo de Consentimento Livre e Esclarecido (TCLE) e guardar uma cópia em seus arquivos.

+ +

Justificativa e objetivos

+ +

Este projeto envolve um ambiente na Web para treinar pessoas na resolução de desafios e construção de simulações. Alguns desafios são apresentados na forma de casos que você é convidado a resolver. Queremos testar se ao resolver esses casos você irá adquirir habilidades na resolução de problemas. Também queremos verificar se ao construir simulações você aprenderá algo com elas ou sobre elas.

+ +

Procedimentos

+ +

Participando do estudo você está sendo convidado a: resolver um conjunto de desafios que lhe serão apresentados no ambiente. Coletaremos dados sobre como você se desempenha no desafio para verificar a efetividade da plataforma na aprendizagem e na capacidade de criação de cenários. A atividade durará no máximo uma hora e meia.

+ +

Os dados coletados serão armazenados de forma anônima. Em qualquer tempo você pode escolher excluir todos os seus dados e dados coletados sobre você do sistema.

+ +

Por ser um ambiente Web, você sempre pode utilizá-lo onde estiver, sem a necessidade de deslocamento. Os dados são armazenados em nosso servidor de forma segura. Os dados serão armazenados por tempo indeterminado ou até que você solicite a sua exclusão. A exclusão pode ser solicitada diretamente no ambiente.

+ +

Desconfortos e riscos

+ +

Não há riscos previsíveis para esta pesquisa. Todos os equipamentos utilizados neste experimento são seguros e, nas condições de uso previstas, não causam nenhum tipo de dano à saúde. Para evitar períodos longos sentados e em frente ao computador, cada sessão é projetada para durar entre 30 a 40 minutos, podendo excepcionalmente durar até 1 hora. Em qualquer momento você poderá sinalizar caso sentir algum desconforto e o experimento será interrompido imediatamente.

+ +

Benefícios

+ +

Por ser um ambiente que visa a aprendizagem, a sua participação na pesquisa pode lhe trazer novos conhecimentos e habilidades na resolução de problemas. Você também contribuirá na nossa pesquisa e desenvolvimento do ambiente para a aprendizagem baseada na resolução de problemas. Esse ambiente será usado para o aprimoramento na formação principalmente de crianças, adolescentes e jovens. O ambiente será de acesso livre e gratuito para a comunidade.

+ +

Acompanhamento e assistência

+ +

Você tem o direito à assistência integral e gratuita devido a danos diretos e indiretos, imediatos e tardios, pelo tempo que for necessário. Você também tem direito a suporte, por parte da equipe que está realizando esta pesquisa, no uso do ambiente. Você tem acesso através do próprio ambiente a todos os dados que são coletados sobre você, bem como ao seu desempenho auferido pelo ambiente. Você também terá direito a acesso a todos os resultados decorrentes desta pesquisa.

+ +

Não são peparameters.emailrmitidas estratégias para burlar ou modificar o funcionamento normal do sistema. Se forem detectadas estratégias desse tipo, os que estiverem envolvidos serão desligados do ambiente e descontinuados do estudo.

+ +

Sigilo e privacidade

+ +

Você tem a garantia de que sua identidade será mantida em sigilo e nenhuma informação será dada a outras pessoas que não façam parte da equipe de pesquisadores. Na divulgação dos resultados desse estudo, seu nome não será citado.

+ +

O ambiente permite que você compartilhe, ao seu critério, conteúdo que você produza no ambiente, quando você o estiver usando para criar conteúdo. Você poderá, a qualquer tempo, descontinuar esse compartilhamento.

+ +

Ressarcimento e Indenização

+ +

A participação é voluntária e não serão ressarcidas despesas de transporte, alimentação e de nenhum outro tipo, pois a coleta de dados da pesquisa se dará em locais públicos com participantes voluntários que não se deslocaram para o local especificamente para a pesquisa mas que já se encontram presentes no local de coleta.

+ +

As despesas serão ressarcidas ao voluntário em caso de coletas feitas em horários e dias fora da rotina do mesmo.

+ +

Os participantes serão assistidos imediatamente em caso de desconforto e, havendo necessidade, serão acionadas as unidades de emergência públicas disponíveis.

+ +

Nos termos da resolução N° 466 do Conselho Nacional da Saúde (CNS), de 12 de dezembro de 2012, item V.7, os participantes da pesquisa que vierem a sofrer qualquer tipo de dano resultante de sua participação na pesquisa, previsto ou não no Termo de Consentimento Livre e Esclarecido, têm direito à indenização, por parte do pesquisador, do patrocinador e das instituições envolvidas nas diferentes fases da pesquisa.

+ +

Contato

+ +

Em caso de dúvidas sobre a pesquisa, você poderá entrar em contato com o pesquisador André Santanchè

+ +

endereço: Instituto de Computação - Av. Albert Einstein, 1251, Cidade Universitária, Campinas/SP - Brasil, CEP 13083-852.

+ +

telefone: (19) 3521-5854 / (19) 98249-2218

+ +

e-mail: santanche@ic.unicamp.br

+ +

Em caso de denúncias ou reclamações sobre sua participação e sobre questões éticas do estudo, você poderá entrar em contato com a secretaria do Comitê de Ética em Pesquisa (CEP) da UNICAMP das 08:00hs às 11:30hs e das 13:00hs as 17:30hs na Rua: Tessália Vieira de Camargo, 126; CEP 13083-887 Campinas – SP; telefone (19) 3521-8936 ou (19) 3521-7187; e-mail: cep@unicamp.br.

+ +

O Comitê de Ética em Pesquisa (CEP)

+ +

O papel do CEP é avaliar e acompanhar os aspectos éticos de todas as pesquisas envolvendo seres humanos. A Comissão Nacional de Ética em Pesquisa (CONEP), tem por objetivo desenvolver a regulamentação sobre proteção dos seres humanos envolvidos nas pesquisas. Desempenha um papel coordenador da rede de Comitês de Ética em Pesquisa (CEPs) das instituições, além de assumir a função de órgão consultor na área de ética em pesquisas

+ +

Responsabilidade do Pesquisador

+ +

Asseguro ter cumprido as exigências da resolução 466/2012 CNS/MS e complementares na elaboração do protocolo e na obtenção deste Termo de Consentimento Livre e Esclarecido. Asseguro, também, ter explicado e fornecido uma via deste documento ao participante da pesquisa. Informo que o estudo foi aprovado pelo CEP perante o qual o projeto foi apresentado e pela CONEP, quando pertinente. Comprometo-me a utilizar o material e os dados obtidos nesta pesquisa exclusivamente para as finalidades previstas neste documento ou conforme o consentimento dado pelo participante da pesquisa.

+ + + +
+ +
+
+

Consentimento livre e esclarecido

+ +

Após ter recebido esclarecimentos sobre a natureza da pesquisa, seus objetivos, métodos, benefícios previstos, potenciais riscos e o incômodo que esta possa acarretar, aceito participar:

+ +
+ + + + Escolha um email que você usará para fazer login. + +
+

Favor se identificar e concluir este termo, caso concorde em participar:

+ +
+ + + + Digite o seu nome. + +
+ +
+ + +
+ +

Concordo em participar da pesquisa
+ Não desejo participar da pesquisa

+ + + + + +
+
+
+ + +
+ + +
+
+
+
+ + + +