Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F88767963
survey.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Oct 20, 14:24
Size
4 KB
Mime Type
text/x-c++
Expires
Tue, Oct 22, 14:24 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
21814055
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
survey.js
View Options
'use strict';
const ArrayPrompt = require('../types/array');
class Survey extends ArrayPrompt {
constructor(options = {}) {
super(options);
this.emptyError = options.emptyError || 'No items were selected';
this.term = process.env.TERM_PROGRAM;
if (!this.options.header) {
let header = ['', '4 - Strongly Agree', '3 - Agree', '2 - Neutral', '1 - Disagree', '0 - Strongly Disagree', ''];
header = header.map(ele => this.styles.muted(ele));
this.state.header = header.join('\n ');
}
}
async toChoices(...args) {
if (this.createdScales) return false;
this.createdScales = true;
let choices = await super.toChoices(...args);
for (let choice of choices) {
choice.scale = createScale(5, this.options);
choice.scaleIdx = 2;
}
return choices;
}
dispatch() {
this.alert();
}
space() {
let choice = this.focused;
let ele = choice.scale[choice.scaleIdx];
let selected = ele.selected;
choice.scale.forEach(e => (e.selected = false));
ele.selected = !selected;
return this.render();
}
indicator() {
return '';
}
pointer() {
return '';
}
separator() {
return this.styles.muted(this.symbols.ellipsis);
}
right() {
let choice = this.focused;
if (choice.scaleIdx >= choice.scale.length - 1) return this.alert();
choice.scaleIdx++;
return this.render();
}
left() {
let choice = this.focused;
if (choice.scaleIdx <= 0) return this.alert();
choice.scaleIdx--;
return this.render();
}
indent() {
return ' ';
}
async renderChoice(item, i) {
await this.onChoice(item, i);
let focused = this.index === i;
let isHyper = this.term === 'Hyper';
let n = !isHyper ? 8 : 9;
let s = !isHyper ? ' ' : '';
let ln = this.symbols.line.repeat(n);
let sp = ' '.repeat(n + (isHyper ? 0 : 1));
let dot = enabled => (enabled ? this.styles.success('◉') : '◯') + s;
let num = i + 1 + '.';
let color = focused ? this.styles.heading : this.styles.noop;
let msg = await this.resolve(item.message, this.state, item, i);
let indent = this.indent(item);
let scale = indent + item.scale.map((e, i) => dot(i === item.scaleIdx)).join(ln);
let val = i => i === item.scaleIdx ? color(i) : i;
let next = indent + item.scale.map((e, i) => val(i)).join(sp);
let line = () => [num, msg].filter(Boolean).join(' ');
let lines = () => [line(), scale, next, ' '].filter(Boolean).join('\n');
if (focused) {
scale = this.styles.cyan(scale);
next = this.styles.cyan(next);
}
return lines();
}
async renderChoices() {
if (this.state.submitted) return '';
let choices = this.visible.map(async(ch, i) => await this.renderChoice(ch, i));
let visible = await Promise.all(choices);
if (!visible.length) visible.push(this.styles.danger('No matching choices'));
return visible.join('\n');
}
format() {
if (this.state.submitted) {
let values = this.choices.map(ch => this.styles.info(ch.scaleIdx));
return values.join(', ');
}
return '';
}
async render() {
let { submitted, size } = this.state;
let prefix = await this.prefix();
let separator = await this.separator();
let message = await this.message();
let prompt = [prefix, message, separator].filter(Boolean).join(' ');
this.state.prompt = prompt;
let header = await this.header();
let output = await this.format();
let help = await this.error() || await this.hint();
let body = await this.renderChoices();
let footer = await this.footer();
if (output || !help) prompt += ' ' + output;
if (help && !prompt.includes(help)) prompt += ' ' + help;
if (submitted && !output && !body && this.multiple && this.type !== 'form') {
prompt += this.styles.danger(this.emptyError);
}
this.clear(size);
this.write([prompt, header, body, footer].filter(Boolean).join('\n'));
this.restore();
}
submit() {
this.value = {};
for (let choice of this.choices) {
this.value[choice.name] = choice.scaleIdx;
}
return this.base.submit.call(this);
}
}
function createScale(n, options = {}) {
if (Array.isArray(options.scale)) {
return options.scale.map(ele => ({ ...ele }));
}
let scale = [];
for (let i = 1; i < n + 1; i++) scale.push({ i, selected: false });
return scale;
}
module.exports = Survey;
Event Timeline
Log In to Comment