diff --git a/.travis.yml b/.travis.yml index 4cec06da8..0a35a6f44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ script: - yamale -s schemaSoftware.yaml _data/software - yamale -s schemaStandard.yaml _data/standard - yamale -s schemaPartnership.yaml _data/partnership +- yamale -s schemaResearch.yaml _data/research - npm test - yamllint -d configYamlLint.yml _data diff --git a/_data/forms/config-research.yml b/_data/forms/config-research.yml new file mode 100644 index 000000000..5b3553b73 --- /dev/null +++ b/_data/forms/config-research.yml @@ -0,0 +1,28 @@ +--- + +id: research + +formGroups: + - preset: empty + title: administrations + param: {start: true} + - preset: adminCode + - preset: selectResearch + - preset: description + param: {model: true} + - preset: category + - preset: tags + - preset: homepageURL + param: {type: url} + - preset: team + - preset: empty + title: uses + param: {start: true} + - preset: contact + param: {phone: false} + - widget: string + title: date + param: {type: date, rule: dateISO} + - preset: empty + - preset: empty + diff --git a/_data/i18n/form.yml b/_data/i18n/form.yml index f3b51c9f5..d397c4f43 100644 --- a/_data/i18n/form.yml +++ b/_data/i18n/form.yml @@ -803,6 +803,95 @@ partnership: fr: Information à propos de chacun des projects # Future project form specifics +research: + name: + title: + en: Research Name + fr: Nom de la recherche + label: + en: + en: English research Name + fr: Nom de la recherche en anglais + fr: + en: French research Name + fr: Nom de la recherche en français + schema: + en: Research Name + fr: Nom de la recherche + labels: + select: + en: If you wish to update information of a research that already exists in our library, please select it below + fr: Si vous souhaitez mettre à jour les données d'une recherche déjà ajouté au catalogue, veuillez le sélectionner de la liste + infobulle: + en: Add the name of the open research + fr: Ajouter le nom de la recherche libre + date: + title: + en: Published date + fr: Date de publication + label: + en: Published date + fr: Date de publication + infobulle: + en: Select the date when the research was published. + fr: Choisir la date lorsque la recherche a été publié. + administrations: *administrations + uses: + title: + en: Informations about research participants + fr: Information à propos des participants à la recherche + infobulle: + en: Information concerning the participations on this research + fr: Information à propos des participations à cette recherche + description: + title: + en: Description + fr: Description + labels: + whatItDoes: + subtitle: + en: Research subject + fr: Sujet de recherche + en: + en: English + fr: Anglais + fr: + en: French + fr: Français + schema: + en: Research subject + fr: Sujet de recherche + howItWorks: + subtitle: + en: Abstract + fr: Résumé + en: + en: English + fr: Anglais + fr: + en: French + fr: Français + schema: + en: Abstract + fr: Résumé + label: + schema: + en: Description + fr: Description + charactersLimit: + en: (200 characters limit) + fr: (limite de 200 caractères) + infobulle: + en: Add a brief description of the research. + fr: Ajoutez une brève description de la recherche. + titles: + whatItDoes: + en: Description of the research's subject + fr: Description du sujet de la recherche + howItWorks: + en: Description of the abstract's research + fr: Description du résumé de la recherche +# Future project form specifics design: name: title: diff --git a/_data/i18n/general.yml b/_data/i18n/general.yml index 35be7ec75..6512c27a6 100644 --- a/_data/i18n/general.yml +++ b/_data/i18n/general.yml @@ -80,6 +80,12 @@ nav: link: en: https://www.canada.ca/en.html fr: https://www.canada.ca/fr.html + research: + en: Open Research + fr: Recherche Libre + link: + en: ./open-researches.html + fr: ./recherches-libres.html footer: AboutGovernment: diff --git a/_data/schemaResearch.yaml b/_data/schemaResearch.yaml new file mode 100644 index 000000000..a31c21757 --- /dev/null +++ b/_data/schemaResearch.yaml @@ -0,0 +1,35 @@ +--- +schemaVersion: str() +adminCode: str() +projects: + - contact: + email: str() + name: str(required=False) + phone: str(required=False) + category: str() + date: + closed: str() + started: str() + metadataLastUpdated: str() + description: + whatItDoes: + en: str() + fr: str() + howItWorks: + en: str(required=False) + fr: str(required=False) + name: + en: str() + fr: str() + partners: + - adminCode: str(required=False) + email: str(required=False) + name: str(required=False) + tags: + en: + - str(required=False) + fr: + - str(required=False) + team: + en: str(required=False) + fr: str(required=False) diff --git a/_includes/footer.html b/_includes/footer.html index 1eea45745..74ea4da19 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -73,6 +73,10 @@
{{ site.data.i18n.form.presets.description.charactersLimit[page.lang] }}
-{%- include form/components/textarea-i18n.html id=include.idPreset title=title group="whatItDoes" -%} -{{ site.data.i18n.form.presets.description.charactersLimit[page.lang] }}
-{%- include form/components/textarea-i18n.html id=include.idPreset title=title group="howItWorks" param=site.data.forms.param.required_false -%} -+ {{ site.data.i18n.form[descriptionPosition][title].charactersLimit[page.lang] + }} +
+ {%- include form/components/textarea-i18n.html id=include.idPreset + title=title group="whatItDoes" -%} ++ {{ site.data.i18n.form[descriptionPosition][title].charactersLimit[page.lang] + }} +
+ {%- include form/components/textarea-i18n.html id=include.idPreset + title=title group="howItWorks" param=site.data.forms.param.required_false + -%} +| {{ site.data.i18n.tables.research[page.lang] }} | +{{ site.data.i18n.tables.category[page.lang] }} | +{{ site.data.i18n.tables.description[page.lang] }} | +{{ site.data.i18n.tables.licence[page.lang] }}(s) | +{{ site.data.i18n.tables.tag[page.lang] }} | +{{ site.data.i18n.tables.usage[page.lang] }} | +{{ site.data.i18n.tables.homepage[page.lang] }} | +{{ site.data.i18n.form.presets.orgLevel.title[page.lang] }} | +
|---|---|---|---|---|---|---|---|
| {{ research.name[page.lang] }} | ++ {{ site.data.i18n.categories[research.category][page.lang] }} + | +{{ research.description.whatItDoes[page.lang] }} | ++ {%- for licence in research.licences -%} + {{ licence.spdxID }} + {%- endfor -%} + | ++ {%- for tag in research.tags[page.lang] -%} + {{ tag }} + {%- endfor -%} + | +{{ research.administrations.size }} | +{{ research.homepageURL[page.lang] | remove: "https://" | rstrip }} | ++ {%- for administration in research.administrations -%} + {%- for levels in site.data.i18n.administrations -%} + {%- assign govLevel = levels[0] -%} + {%- assign admin = site.data.administrations[govLevel] | where: "code": administration.adminCode -%} + {%- if admin[0] != nil -%} + {{ site.data.i18n.administrations[govLevel].value }} + {%- endif -%} + {%- endfor -%} + {% endfor %} + | +
Fill out this form to add or update information on research done by Canadian public administrations. Please note that some fields are required in both English and French languages, as to support the collaboration and sharing of open source solutions between all provinces and territories across Canada.
diff --git a/_pages/en/open-research-schema.html b/_pages/en/open-research-schema.html new file mode 100644 index 000000000..852485934 --- /dev/null +++ b/_pages/en/open-research-schema.html @@ -0,0 +1,15 @@ +--- +layout: schema +ref: researchSchema +lang: en +permalink: /en/open-research-schema.html +config: config-research +--- + +The metadata schema for {{ site.data.i18n.general.nav.research[page.lang] }}.
+Data files are hosted on GitHub.
+ +Mandatory fields are marked with "mandatory".
+We've created an example file with only mandatory fields you can use to get started.
diff --git a/_pages/en/open-researches.html b/_pages/en/open-researches.html new file mode 100644 index 000000000..285741962 --- /dev/null +++ b/_pages/en/open-researches.html @@ -0,0 +1,16 @@ +--- +layout: default +ref: research +lang: en +permalink: /en/open-researches.html +--- + +Open research refers to any research where anyone with relevant expertise is allowed to contribute and the resulting data is available to everyone online.
+Search the catalog for research by different levels of Canadian public administrations.
+You may also add a research or update its data using using the Open Research Form.
+Need help? Check our user guide on how to use the Open Resource Exchange platform.
+ +{% include researchTable.html %} + +Data is also made available in JSON format for open data and use in other applications.
\ No newline at end of file diff --git a/_pages/fr/index.html b/_pages/fr/index.html index 052e4880b..40be72464 100644 --- a/_pages/fr/index.html +++ b/_pages/fr/index.html @@ -89,6 +89,23 @@Remplissez ce formulaire pour ajouter ou modifier des données sur les recherches libres utilisés par les administrations publiques canadiennes. Veuillez noter que quelques champs sont requis dans les deux langues Français et Anglais, afin de promouvoir la collaboration et la partage de solutions ouvertes à travers tout le Canada.
diff --git a/_pages/fr/recherche-libre-schema.html b/_pages/fr/recherche-libre-schema.html new file mode 100644 index 000000000..9393f2c92 --- /dev/null +++ b/_pages/fr/recherche-libre-schema.html @@ -0,0 +1,15 @@ +--- +layout: schema +ref: researchSchema +lang: fr +permalink: /fr/recherche-libre-schema.html +config: config-research +--- + +Le schéma de métadonnées pour les {{ site.data.i18n.general.nav.research[page.lang] }}.
+Les données sont hébergés sur GitHub.
+ +Les champs obligatoires sont marqués avec "obligatoire".
+Nous avons créé un fichier exemple avec seulement les champs obligatoires que vous pouvez utiliser pour commencer.
diff --git a/_pages/fr/recherches-libres.html b/_pages/fr/recherches-libres.html new file mode 100644 index 000000000..3f04c8bba --- /dev/null +++ b/_pages/fr/recherches-libres.html @@ -0,0 +1,16 @@ +--- +layout: default +ref: research +lang: fr +permalink: /fr/recherches-libres.html +--- + +Une recherche libre est une recherche ou tout individu ou organisation ayant une expertise appropriée peux contribuer et toutes les données résultantes sont disponibles au public.
+Consultez la liste des recherches libres utilisés par les administrations publiques canadiennes.
+Vous pouvez ajouter une recherche ou modifier ses informations en utilisant le Formulaire des Recherches Libres.
+Besoin d’aide? Consultez la documentation sur comment utiliser la plateforme Échange de Ressources Ouvert.
+ +{% include researchTable.html %} + +Les données sont aussi rendu disponible en format JSON pour utilisation dans d'autres applications.
diff --git a/assets/js/src/researchForm.js b/assets/js/src/researchForm.js new file mode 100644 index 000000000..af8e6d72d --- /dev/null +++ b/assets/js/src/researchForm.js @@ -0,0 +1,480 @@ +/* + global + YamlWriter jsyaml + USERNAME REPO_NAME PRBOT_URL + getTagsEN getTagsFR resetTags addTags + submitInit submitConclusion + getAdminObject getAdminCode hideNewAdminForm slugify + addMoreLicences resetMoreGroup fillLicenceField + getToday addMoreGroup +*/ + +const researchSelect = $('.page-researchForm #researchAcronymselect'); +const adminSelect = $('.page-researchForm #adminCode'); + +$(document).ready(function() { + $('#prbotSubmitresearchForm').click(function() { + if (submitInit()) { + if ($('#ennewAdminName').val() != '') submitResearchFormNewAdmin(); + else submitResearchForm(); + } + }); + + researchSelect.change(function() { + selectResearch(); + if (adminSelect.val() != '') selectAdmin(); + }); + + adminSelect.change(function() { + selectAdmin(); + }); + + $('#formReset').click(function() { + $('#validation').trigger('reset'); + resetTags(); + hideNewAdminForm(); + resetMoreGroup($('#addMorelicences')); + }); +}); + +function getresearchObject() { + // Mandatory fields + let researchObject = { + schemaVersion: '1.0', + description: { + whatItDoes: { + en: $('#endescriptionwhatItDoes').val(), + fr: $('#frdescriptionwhatItDoes').val() + } + }, + homepageURL: { + en: $('#enhomepageURL').val(), + fr: $('#frhomepageURL').val() + }, + licences: [], + name: { + en: $('#enname').val(), + fr: $('#frname').val() + }, + researchAcronym: $('#researchAcronym') + .val() + .toUpperCase(), + researchOrg: { + en: $('#enresearchOrg').val(), + fr: $('#frresearchOrg').val() + }, + tags: { + en: getTagsEN(), + fr: getTagsFR() + }, + administrations: [ + { + adminCode: getAdminCode(), + contact: { + email: $('#contactemail').val() + }, + date: { + created: $('#date').val(), + metadataLastUpdated: getToday() + }, + references: [], + status: $('#status').val() + } + ] + }; + + // More-groups + addMoreLicences(researchObject); + $('#addMorereference ul.list-unstyled > li').each(function(i) { + let id = + $(this).attr('data-index') == '0' ? '' : $(this).attr('data-index'); + researchObject.administrations[0].references[i] = { + URL: { + en: $('#enreferenceURL' + id).val(), + fr: $('#frreferenceURL' + id).val() + }, + name: { + en: $('#enreferencename' + id).val(), + fr: $('#frreferencename' + id).val() + } + }; + }); + + // Optional fields + if ( + $('#endescriptionhowItWorks').val() || + $('#frdescriptionhowItWorks').val() + ) { + researchObject.description.howItWorks = {}; + if ($('#endescriptionhowItWorks').val()) + researchObject.description.howItWorks.en = $( + '#endescriptionhowItWorks' + ).val(); + if ($('#frdescriptionhowItWorks').val()) + researchObject.description.howItWorks.fr = $( + '#frdescriptionhowItWorks' + ).val(); + } + + if ($('#contactname').val()) { + researchObject.administrations[0].contact.name = $('#contactname').val(); + } + + if ($('#enteam').val() || $('#frteam').val()) { + researchObject.administrations[0].team = {}; + if ($('#enteam').val()) + researchObject.administrations[0].team.en = $('#enteam').val(); + if ($('#frteam').val()) + researchObject.administrations[0].team.fr = $('#frteam').val(); + } + + return researchObject; +} + +function submitResearchForm() { + let submitButton = document.getElementById('prbotSubmitresearchForm'); + let resetButton = document.getElementById('formReset'); + submitButton.disabled = true; + resetButton.disabled = true; + + let researchObject = getresearchObject(); + console.log('TCL: submitResearchForm -> researchObject', researchObject); + let fileWriter = new YamlWriter(USERNAME, REPO_NAME); + let file = `_data/research/${researchObject.researchAcronym.toLowerCase()}.yml`; + + fileWriter + .merge(file, researchObject, 'administrations', 'adminCode') + .then(result => { + return fetch( + PRBOT_URL, + getConfigUpdate(result, file, researchObject.researchAcronym) + ); + }) + .catch(err => { + if (err.status == 404) { + return fetch(PRBOT_URL, getConfigNew(researchObject, file)); + } else throw err; + }) + .then(response => { + let url = + $('html').attr('lang') == 'en' + ? './open-researches.html' + : './recherches-libres.html'; + submitConclusion(response, submitButton, resetButton, url); + }); +} + +function getConfigUpdate(result, file, code) { + return { + body: JSON.stringify({ + user: USERNAME, + repo: REPO_NAME, + title: `Updated the ${code} research file`, + description: 'Authored by: ' + $('#submitteremail').val() + '\n', + commit: 'Committed by ' + $('#submitteremail').val(), + author: { + name: $('#submitterusername').val(), + email: $('#submitteremail').val() + }, + files: [ + { + path: file, + content: '---\n' + jsyaml.dump(result) + } + ] + }), + method: 'POST' + }; +} + +function getConfigNew(researchObject, file) { + return { + body: JSON.stringify({ + user: USERNAME, + repo: REPO_NAME, + title: 'Created the research file for ' + researchObject.researchAcronym, + description: 'Authored by: ' + $('#submitteremail').val() + '\n', + commit: 'Committed by ' + $('#submitteremail').val(), + author: { + name: $('#submitterusername').val(), + email: $('#submitteremail').val() + }, + files: [ + { + path: file, + content: '---\n' + jsyaml.dump(researchObject) + } + ] + }), + method: 'POST' + }; +} + +function submitResearchFormNewAdmin() { + let submitButton = document.getElementById('prbotSubmitresearchForm'); + let resetButton = document.getElementById('formReset'); + submitButton.disabled = true; + resetButton.disabled = true; + + let researchObject = getresearchObject(); + let adminObject = getAdminObject(); + + let researchName = researchObject.researchAcronym.toLowerCase(); + let adminName = slugify( + $('#ennewAdminName').val() + '-' + $('#provinceSelect').val() + ); + + let fileWriter = new YamlWriter(USERNAME, REPO_NAME); + let researchFile = `_data/research/${researchName}.yml`; + let adminFile = `_data/administrations/${$('#orgLevel').val()}.yml`; + + fileWriter + .mergeAdminFile(adminFile, adminObject, '', 'code') + .then(adminResult => { + fileWriter + .merge(researchFile, researchObject, 'administrations', 'adminCode') + .then(researchResult => { + return fetch( + PRBOT_URL, + getConfigUpdateResearchNewAdmin( + researchName, + adminName, + researchFile, + adminFile, + researchResult, + adminResult + ) + ); + }) + .catch(err => { + if (err.status == 404) { + return fetch( + PRBOT_URL, + getConfigNewResearchNewAdmin( + researchName, + adminName, + researchFile, + adminFile, + researchObject, + adminResult + ) + ); + } else throw err; + }) + .then(response => { + let url = + $('html').attr('lang') == 'en' + ? './open-researches.html' + : './recherches-libres.html'; + submitConclusion(response, submitButton, resetButton, url); + }); + }) + .catch(err => { + if (err.status == 404) console.log('File not Found'); + else throw err; + }); +} + +function getConfigUpdateResearchNewAdmin( + researchName, + adminName, + researchFile, + adminFile, + researchResult, + adminObject +) { + return { + body: JSON.stringify({ + user: USERNAME, + repo: REPO_NAME, + title: + 'Updated research file for ' + + researchName + + ' and created ' + + adminName + + ' in administration file', + description: 'Authored by: ' + $('#submitteremail').val() + '\n', + commit: 'Committed by ' + $('#submitteremail').val(), + author: { + name: $('#submitterusername').val(), + email: $('#submitteremail').val() + }, + files: [ + { + path: researchFile, + content: '---\n' + jsyaml.dump(researchResult) + }, + { + path: adminFile, + content: '---\n' + jsyaml.dump(adminObject) + } + ] + }), + method: 'POST' + }; +} + +function getConfigNewResearchNewAdmin( + researchName, + adminName, + researchFile, + adminFile, + researchObject, + adminObject +) { + return { + body: JSON.stringify({ + user: USERNAME, + repo: REPO_NAME, + title: + 'Creaded research file for ' + + researchName + + ' and created ' + + adminName + + ' in administration file', + description: 'Authored by: ' + $('#submitteremail').val() + '\n', + commit: 'Committed by ' + $('#submitteremail').val(), + author: { + name: $('#submitterusername').val(), + email: $('#submitteremail').val() + }, + files: [ + { + path: researchFile, + content: '---\n' + jsyaml.dump(researchObject) + }, + { + path: adminFile, + content: '---\n' + jsyaml.dump(adminObject) + } + ] + }), + method: 'POST' + }; +} + +function selectResearch() { + let value = researchSelect.val(); + $.getJSON('http://localhost:4000/ore-ero/research.json', function(result) { + if (result[value]) { + addValueToFieldsResearch(result[value]); + $('#adminCode').focus(); + } else if (value == '') { + resetFieldsResearch(); + } else { + alert('Error retrieving the data'); + } + }); +} + +function addValueToFieldsResearch(obj) { + resetFieldsResearch(); + + $('#researchAcronym') + .val(obj.researchAcronym) + .prop('disabled', true); + $('#enname') + .val(obj.name.en) + .prop('disabled', true); + $('#frname') + .val(obj.name.fr) + .prop('disabled', true); + + $('#endescriptionwhatItDoes').val(obj.description.whatItDoes.en); + $('#frdescriptionwhatItDoes').val(obj.description.whatItDoes.fr); + if (obj.description.howItWorks) { + if (obj.description.howItWorks.en) + $('#endescriptionhowItWorks').val(obj.description.howItWorks.en); + if (obj.description.howItWorks.fr) + $('#frdescriptionhowItWorks').val(obj.description.howItWorks.fr); + } + $('#enhomepageURL').val(obj.homepageURL.en); + $('#frhomepageURL').val(obj.homepageURL.fr); + $('#enresearchOrg').val(obj.researchOrg.en); + $('#frresearchOrg').val(obj.researchOrg.fr); + fillLicenceField(obj.licences); + + addTags(obj); +} + +function resetFieldsResearch() { + $('#researchAcronym') + .val('') + .prop('disabled', false); + $('#enname') + .val('') + .prop('disabled', false); + $('#frname') + .val('') + .prop('disabled', false); + $('#endescriptionwhatItDoes').val(''); + $('#frdescriptionwhatItDoes').val(''); + $('#endescriptionhowItWorks').val(''); + $('#frdescriptionhowItWorks').val(''); + $('#enhomepageURL').val(''); + $('#frhomepageURL').val(''); + $('#enspecURL').val(''); + $('#frspecURL').val(''); + $('#enresearchOrg').val(''); + $('#frresearchOrg').val(''); + resetMoreGroup($('#addMorelicences')); + resetTags(); +} + +function selectAdmin() { + let research = researchSelect.val(); + let administration = adminSelect.val(); + $.getJSON('http://localhost:4000/ore-ero/research.json', function(result) { + if (result[research]) { + for (let i = 0; i < result[research].administrations.length; i++) { + if (result[research].administrations[i].adminCode == administration) { + addValueToFieldsAdmin(result[research].administrations[i]); + break; + } else { + resetFieldsAdmin(); + } + } + } else { + resetFieldsAdmin(); + } + }); +} + +function addValueToFieldsAdmin(obj) { + resetFieldsAdmin(); + + $('#contactemail').val(obj.contact.email); + if (obj.contact.name) $('#contactname').val(obj.contact.name); + + $('#date').val(obj.date.created); + + obj.references.forEach(function(reference, i) { + let id; + if (i == 0) id = ''; + else { + id = i; + addMoreGroup($('#addMorereference')); + } + $('#enreferenceURL' + id).val(reference.URL.en); + $('#frreferenceURL' + id).val(reference.URL.fr); + $('#enreferencename' + id).val(reference.name.en); + $('#frreferencename' + id).val(reference.name.fr); + }); + + $('#status').val(obj.status); + + if (obj.team) { + if (obj.team.en) $('#enteam').val(obj.team.en); + if (obj.team.fr) $('#frteam').val(obj.team.fr); + } +} + +function resetFieldsAdmin() { + $('#contactemail').val(''); + $('#contactname').val(''); + $('#date').val(''); + resetMoreGroup($('#addMorereference')); + $('#status').val(''); + $('#enteam').val(''); + $('#frteam').val(''); +}