UNPKG

safety-results-over-time

Version:

Chart showing population averages for lab measures, vital signs and other related measures during the course of a clinical trial.

88 lines (76 loc) 3.26 kB
import { set } from 'd3'; export default function syncSettings(settings) { //x-axis settings.x.column = settings.time_settings.value_col; settings.x.label = settings.time_settings.label; settings.x.behavior = settings.visits_without_data ? 'raw' : 'flex'; //y-axis settings.y.column = settings.value_col; //handle a string arguments to array settings const array_settings = ['filters', 'groups', 'missingValues']; array_settings.forEach(function(s) { if (!(settings[s] instanceof Array)) settings[s] = typeof settings[s] === 'string' ? [settings[s]] : []; }); //stratification const defaultGroup = { value_col: 'srot_none', label: 'None' }; if (!(settings.groups instanceof Array && settings.groups.length)) settings.groups = [defaultGroup]; else settings.groups = [defaultGroup].concat( settings.groups.map(group => { return { value_col: group.value_col || group, label: group.label || group.value_col || group }; }) ); //Remove duplicate values. settings.groups = set(settings.groups.map(group => group.value_col)) .values() .map(value => { return { value_col: value, label: settings.groups.find(group => group.value_col === value).label }; }); //Set initial group-by variable. settings.color_by = settings.color_by ? settings.color_by : settings.groups.length > 1 ? settings.groups[1].value_col : defaultGroup.value_col; //Set initial group-by label. settings.legend.label = settings.groups.find( group => group.value_col === settings.color_by ).label; //marks const lines = settings.marks.find(mark => mark.type === 'line'); const hiddenOutliers = settings.marks.find(mark => mark.type === 'circle' && mark.hidden); const visibleOutliers = settings.marks.find(mark => mark.type === 'circle' && !mark.hidden); lines.per = [settings.color_by]; hiddenOutliers.radius = visibleOutliers.radius * 4; settings.marks .filter(mark => mark.type === 'circle') .forEach(mark => { mark.per = [settings.id_col, settings.time_settings.value_col, settings.value_col]; mark.tooltip = `[${settings.id_col}] at [${settings.x.column}]: [${ settings.value_col }]`; }); //miscellany 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 !== '' ) { const 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; }