Skip to content

Commit

Permalink
Merge pull request #48 from RhoInc/settings-schema
Browse files Browse the repository at this point in the history
Settings schema
  • Loading branch information
samussiah authored Feb 1, 2018
2 parents c9f0d74 + 286b665 commit 8aadcff
Show file tree
Hide file tree
Showing 13 changed files with 614 additions and 72 deletions.
59 changes: 42 additions & 17 deletions build/safetyResultsOverTime.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@
function assignKey(to, from, key) {
var val = from[key];

if (val === undefined || val === null) {
if (val === undefined) {
return;
}

Expand Down Expand Up @@ -208,8 +208,7 @@
return target;
}

var defaultSettings = {
//Custom settings for this template
var rendererSettings = {
id_col: 'USUBJID',
time_settings: {
value_col: 'VISIT',
Expand All @@ -232,10 +231,11 @@
missingValues: ['', 'NA', 'N/A'],
visits_without_data: false,
unscheduled_visits: false,
unscheduled_visit_values: null, // takes precedence over unscheduled_visit_pattern
unscheduled_visit_pattern: /unscheduled|early termination/i,
unscheduled_visit_pattern: '/unscheduled|early termination/i',
unscheduled_visit_values: null // takes precedence over unscheduled_visit_pattern
};

//Standard webcharts settings
var webchartsSettings = {
x: {
column: null, // set in syncSettings()
type: 'ordinal',
Expand Down Expand Up @@ -272,6 +272,8 @@
aspect: 3
};

var defaultSettings = merge(rendererSettings, webchartsSettings);

// Replicate settings in multiple places in the settings object
function syncSettings(settings) {
settings.x.column = settings.time_settings.value_col;
Expand All @@ -293,6 +295,19 @@
settings.marks[0].per = [settings.color_by];
settings.margin = settings.margin || { bottom: settings.time_settings.vertical_space };

//Convert unscheduled_visit_pattern from string to regular expression.
if (
typeof settings.unscheduled_visit_pattern === 'string' &&
settings.unscheduled_visit_pattern !== ''
) {
var flags = settings.unscheduled_visit_pattern.replace(/.*?\/([gimy]*)$/, '$1'),
pattern = settings.unscheduled_visit_pattern.replace(
new RegExp('^/(.*?)/' + flags + '$'),
'$1'
);
settings.unscheduled_visit_regex = new RegExp(pattern, flags);
}

return settings;
}

Expand Down Expand Up @@ -334,18 +349,17 @@

// Map values from settings to control inputs
function syncControlInputs(controlInputs, settings) {
var measureControl = controlInputs.filter(function(controlInput) {
return controlInput.label === 'Measure';
})[0],
groupControl = controlInputs.filter(function(controlInput) {
return controlInput.label === 'Group';
})[0];

//Sync measure control.
var measureControl = controlInputs.filter(function(controlInput) {
return controlInput.label === 'Measure';
})[0];
measureControl.value_col = settings.measure_col;
measureControl.start = settings.start_value;

//Sync group control.
var groupControl = controlInputs.filter(function(controlInput) {
return controlInput.label === 'Group';
})[0];
groupControl.start = settings.color_by;
settings.groups
.filter(function(group) {
Expand Down Expand Up @@ -380,6 +394,17 @@
});
}

//Remove unscheduled visit conrol if unscheduled visit pattern is unscpecified.
if (!settings.unscheduled_visit_regex)
controlInputs.splice(
controlInputs
.map(function(controlInput) {
return controlInput.label;
})
.indexOf('Unscheduled visits'),
1
);

return controlInputs;
}

Expand Down Expand Up @@ -437,8 +462,8 @@
? _this.config.unscheduled_visit_values.indexOf(
d[_this.config.time_settings.value_col]
) > -1
: _this.config.unscheduled_visit_pattern
? _this.config.unscheduled_visit_pattern.test(
: _this.config.unscheduled_visit_regex
? _this.config.unscheduled_visit_regex.test(
d[_this.config.time_settings.value_col]
)
: false;
Expand Down Expand Up @@ -716,9 +741,9 @@
this.config.x.domain = this.config.x.domain.filter(function(visit) {
return _this.config.unscheduled_visit_values.indexOf(visit) < 0;
});
else if (this.config.unscheduled_visit_pattern)
else if (this.config.unscheduled_visit_regex)
this.config.x.domain = this.config.x.domain.filter(function(visit) {
return !_this.config.unscheduled_visit_pattern.test(visit);
return !_this.config.unscheduled_visit_regex.test(visit);
});
}
}
Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@
],
"dependencies": {
"d3": "^3",
"webcharts": "^1.9"
"webcharts": "^1"
},
"scripts": {
"build": "npm run bundle && npm run format",
"build": "npm run bundle && npm run format && npm run build-md",
"build-md": "node ./scripts/configuration-markdown.js",
"bundle": "rollup -c",
"format": "npm run format-src && npm run format-build",
"format-src": "prettier --print-width=100 --tab-width=4 --single-quote --write src/**/*.js",
Expand Down
119 changes: 119 additions & 0 deletions scripts/configuration-markdown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
var pkg = require('../package'),
schema = require('../settings-schema'),
properties = schema.properties,
markdown = [],
fs = require('fs'),
webchartsSettingsFlag = 0,
webchartsSettings = fs.readFileSync('./src/defaultSettings.js', 'utf8')
.split('\n')
.filter(line => {
if (line.indexOf('const webchartsSettings') > -1)
webchartsSettingsFlag = 1;

if (webchartsSettingsFlag === 1 && /};/.test(line))
webchartsSettingsFlag = 0;

return webchartsSettingsFlag;
});
webchartsSettings.splice(0,1,'{\r');
webchartsSettings.push('}');

schema.overview
.split('\n')
.forEach(paragraph => {
markdown.push(paragraph);
markdown.push('');
});
markdown.push(`# Renderer-specific settings`);
markdown.push(`The sections below describe each ${pkg.name} setting as of version ${schema.version}.`);
markdown.push(``);

//Build configuration markdown array.
var keys = Object.keys(properties);
keys.forEach((property,i) => {
var setting = properties[property];
markdown.push(`## settings.${property}`);
markdown.push(`\`${setting.type}\``);
markdown.push(``);
markdown.push(`${setting.description}`);
if (setting.type !== 'object')
markdown.push(``);

//Primitive types
if (['object', 'array'].indexOf(setting.type) === -1)
markdown.push(`**default:** ${
setting.default
? ('`"' + setting.default + '"`')
: 'none'}`);
//Arrays
else if (setting.type === 'array') {
//of primitive types
if (setting.type === 'array' && ['object', 'array'].indexOf(setting.items.type) === -1)
markdown.push(`**default:** ${
setting.defaultArray
? `[${setting.defaultArray.map(item => `"${item}"`).join(', ')}]`
: 'none'}`);
//of objects
else if (setting.items.type === 'object') {

if (setting.default) {
markdown.push(`**default:**`);
markdown.push(`\`\`\``);
markdown.push(`${JSON.stringify(setting.default, null, 2)}`);
markdown.push(`\`\`\``);
markdown.push(``);
} else
markdown.push(`**default:** none`);

var subProperties = setting.items.properties;
Object.keys(subProperties).forEach(subProperty => {
var subSetting = subProperties[subProperty];
markdown.push(``);
markdown.push(`### settings.${property}[].${subProperty}`);
markdown.push(`\`${subSetting.type}\``);
markdown.push(``);
markdown.push(`${subSetting.title}`);
});
}
}
//Objects
else if (setting.type === 'object') {
var subKeys = Object.keys(setting.properties);
subKeys.forEach((subProperty,i) => {
var subSetting = setting.properties[subProperty];
markdown.push(``);
markdown.push(`## settings.${property}.${subProperty}`);
markdown.push(`\`${subSetting.type}\``);
markdown.push(``);
markdown.push(`${subSetting.title}`);
markdown.push(``);
markdown.push(`**default:** ${
subSetting.default
? ('`"' + subSetting.default + '"`')
: 'none'}`);
});
}

if (i < keys.length - 1) {
markdown.push(``);
markdown.push(``);
markdown.push(``);
}
});

markdown.push(``);
markdown.push(`# Webcharts-specific settings`);
markdown.push(`The object below contains each Webcharts setting as of version ${schema.version}.`);
markdown.push(``);
markdown.push('```');
markdown.push(webchartsSettings.join(''));
markdown.push('```');

fs.writeFile(
'./scripts/configuration.md',
markdown.join('\n'),
(err) => {
if (err)
console.log(err);
console.log('The configuration markdown file was built!');
});
Loading

0 comments on commit 8aadcff

Please sign in to comment.