diff --git a/examples/timeline-variables.html b/examples/timeline-variables.html index 35b5c15c..de5ae930 100644 --- a/examples/timeline-variables.html +++ b/examples/timeline-variables.html @@ -13,8 +13,9 @@ var jsPsych = initJsPsych({ on_finish: function() { + metadata.generate(jsPsych.data.get().json()); - + // metadata.saveAsJsonFile(); jsPsych.data.displayData(); metadata.displayMetadata(jsPsych.getDisplayElement()); diff --git a/packages/metadata/src/VariablesMap.ts b/packages/metadata/src/VariablesMap.ts index b348da9c..bd18a17a 100644 --- a/packages/metadata/src/VariablesMap.ts +++ b/packages/metadata/src/VariablesMap.ts @@ -34,7 +34,7 @@ export class VariablesMap { const trial_type_var = { type: "PropertyValue", name: "trial_type", - description: "The name of the plugin used to run the trial.", + description: { default: "The name of the plugin used to run the trial." }, value: "string", }; this.setVariable(trial_type_var); @@ -42,7 +42,7 @@ export class VariablesMap { const trial_index_var = { type: "PropertyValue", name: "trial_index", - description: "The index of the current trial across the whole experiment.", + description: { default: "The index of the current trial across the whole experiment." }, value: "numeric", }; this.setVariable(trial_index_var); @@ -50,27 +50,13 @@ export class VariablesMap { const time_elapsed_var = { type: "PropertyValue", name: "time_elapsed", - description: - "The number of milliseconds between the start of the experiment and when the trial ended.", + description: { + default: + "The number of milliseconds between the start of the experiment and when the trial ended.", + }, value: "numeric", }; this.setVariable(time_elapsed_var); - - // const response_time_var = { - // type: "PropertyValue", - // name: "rt", // adjusted to response time - // description: "Time measured in ms participant takes to respond to a stimulus", - // value: "numeric", - // }; - // this.setVariable(response_time_var); - // not necessary in this iteration - // const internal_type_node_id = { - // type: "PropertyValue", - // name: "internal_node_id", - // description: "A string identifier for the current TimelineNode.", - // value: "interval", - // }; - // this.setVariable(internal_type_node_id); } /** @@ -80,8 +66,32 @@ export class VariablesMap { */ getList(): {}[] { var var_list = []; + + // need to check that this works as intended for (const key of Object.keys(this.variables)) { - var_list.push(this.variables[key]); + const variable = this.variables[key]; + const description = variable["description"]; + const numKeys = Object.keys(description).length; + + if (numKeys === 0) console.error("Empty description"); // error: description empty + else if (numKeys === 1) { + // description becomes single field (assumed to be default) + const key = Object.keys(description)[0]; + variable["description"] = description[key]; + } else if (numKeys == 2) { + delete description["default"]; // deletes default + + if (Object.keys(description).length == 1) { + // error checking that it reduced to one key + const key = Object.keys(description)[0]; + variable["description"] = description[key]; + } + } else if (numKeys > 2) { + // deletes default + delete description["default"]; + } + + var_list.push(variable); } return var_list; } @@ -189,11 +199,7 @@ export class VariablesMap { this.updateLevels(updated_var, added_value); } else if (field_name === "minValue" || field_name === "maxValue") { this.updateMinMax(updated_var, added_value, field_name); - } else if ( - field_name === "description" && - (var_name === "response" || var_name === "stimulus" || var_name == "rt") // error with not hard coding - mention with josh - ) { - // handles logic with dict description + } else if (field_name === "description") { this.updateDescription(updated_var, added_value); } else if (field_name === "name") { this.updateName(updated_var, added_value); @@ -232,6 +238,12 @@ export class VariablesMap { // getting key and value for new value for clarity const add_key = Object.keys(added_value)[0]; const add_value = Object.values(added_value)[0]; + + if (add_key === "undefined" || add_value === "undefined") { + console.error("New value is passed in correct format"); + return; + } + var exists = false; // creates map for description if doesn't exist if (typeof updated_var["description"] !== "object") { diff --git a/packages/metadata/src/index.ts b/packages/metadata/src/index.ts index 782546ca..df34436c 100644 --- a/packages/metadata/src/index.ts +++ b/packages/metadata/src/index.ts @@ -11,6 +11,7 @@ import { VariablesMap } from "./VariablesMap"; * @typedef {JsPsychMetadata} */ export default class JsPsychMetadata { + private count: number; /** * Field that contains all metadata fields that aren't represented as a list. * @@ -57,6 +58,7 @@ export default class JsPsychMetadata { this.setMetadataField("description", "Dataset generated using JsPsych"); this.authors = new AuthorsMap(); this.variables = new VariablesMap(); + this.count = 0; } /** @@ -244,6 +246,7 @@ export default class JsPsychMetadata { URL.revokeObjectURL(url); } + // passing in authors mapping and variables mapping and then goes through each variable generate(data) { // have it so that can pass in a dict of object that the researcher wants to do if (typeof data === "string") { @@ -283,14 +286,13 @@ export default class JsPsychMetadata { // probably should work in a call to the plugin here const description = this.getPluginInfo(pluginType); const type = typeof value; - // should check type in order to see if need to see with levels -- if numeric type is not it - // do need to update levels? -- write in levels logic ot the VariablesMap + console.log(type); // probs should have update description called here const new_var = { type: "PropertyValue", name: variable, - description: "FILL IN THIS DESCRIPTION", // can't get description unless finish the unpkg + description: { default: "FILL IN THIS DESCRIPTION" }, // can't get description unless finish the unpkg value: type, }; @@ -301,22 +303,24 @@ export default class JsPsychMetadata { } // hardest part is updating the description + // want to hardcode in the variables check + // logic is that probably won't need to be doing the dict thing + // implement all as description private generateUpdate(variable, value, pluginType) { const type = typeof value; const field_name = "description"; // update description const description = this.getPluginInfo(pluginType); - const new_value = {}; // logic: this is an object with { key = pluginType, value = Description } - // if the field is already a dictionary - // if the new value that is being added doesn't match the old value + // const new_value = { pluginType: description }; + const key = "hello" + this.count; + const test_value = "THIS IS ANOTHER DESCRIPTION" + this.count; + const new_value = { [key]: test_value }; - // fill in with logic on how to update the plugin -- will need to think about levels - // need to call the other UPDATEVARIABLE logic -- where if it is just a description can probably add it to the thing - // how to check levels - - // this.updateVariable(variable, field_name, new_value); + this.updateVariable(variable, field_name, new_value); this.updateFields(variable, value, type); + + this.count += 1; } private updateFields(variable, value, type) {