Skip to content

Commit

Permalink
Date Prompt Improvements (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
elie-g authored and terkelg committed Feb 20, 2019
1 parent 605be8a commit c7658c0
Show file tree
Hide file tree
Showing 21 changed files with 733 additions and 10 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
node_modules
.DS_Store
dist

\.idea/
7 changes: 7 additions & 0 deletions example.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ let interval;
initial: `terkelg`,
format: v => `@${v}`
},
{
type: 'date',
name: 'birthday',
message: `What's your birth day?`,
mask: '"Year:" YYYY, "Month:" MM, "Day:" DD \\\\\\\\||// \\Hour: HH, \\Minute: mm, "Seconds:" ss',
validate: date => date > Date.now() ? `Your birth day can't be in the future` : true
},
{
type: 'number',
name: 'age',
Expand Down
35 changes: 35 additions & 0 deletions lib/dateparts/datepart.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
'use strict';

class DatePart {
constructor({token, date, parts, locales}) {
this.token = token;
this.date = date || new Date();
this.parts = parts || [this];
this.locales = locales || {};
}

up() {}

down() {}

next() {
const currentIdx = this.parts.indexOf(this);
return this.parts.find((part, idx) => idx > currentIdx && part instanceof DatePart);
}

setTo(val) {}

prev() {
let parts = [].concat(this.parts).reverse();
const currentIdx = parts.indexOf(this);
return parts.find((part, idx) => idx > currentIdx && part instanceof DatePart);
}

toString() {
return String(this.date);
}
}

module.exports = DatePart;


42 changes: 42 additions & 0 deletions lib/dateparts/day.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';

const DatePart = require('./datepart');

const pos = n => {
n = n % 10;
return n === 1 ? 'st'
: n === 2 ? 'nd'
: n === 3 ? 'rd'
: 'th';
}

class Day extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setDate(this.date.getDate() + 1);
}

down() {
this.date.setDate(this.date.getDate() - 1);
}

setTo(val) {
this.date.setDate(parseInt(val.substr(-2)));
}

toString() {
let date = this.date.getDate();
let day = this.date.getDay();
return this.token === 'DD' ? String(date).padStart(2, '0')
: this.token === 'Do' ? date + pos(date)
: this.token === 'd' ? day + 1
: this.token === 'ddd' ? this.locales.weekdaysShort[day]
: this.token === 'dddd' ? this.locales.weekdays[day]
: date;
}
}

module.exports = Day;
30 changes: 30 additions & 0 deletions lib/dateparts/hours.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';

const DatePart = require('./datepart');

class Hours extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setHours(this.date.getHours() + 1);
}

down() {
this.date.setHours(this.date.getHours() - 1);
}

setTo(val) {
this.date.setHours(parseInt(val.substr(-2)));
}

toString() {
let hours = this.date.getHours();
if (/h/.test(this.token))
hours = (hours % 12) || 12;
return this.token.length > 1 ? String(hours).padStart(2, '0') : hours;
}
}

module.exports = Hours;
13 changes: 13 additions & 0 deletions lib/dateparts/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
'use strict';

module.exports = {
DatePart: require('./datepart'),
Meridiem: require('./meridiem'),
Day: require('./day'),
Hours: require('./hours'),
Milliseconds: require('./milliseconds'),
Minutes: require('./minutes'),
Month: require('./month'),
Seconds: require('./seconds'),
Year: require('./year'),
}
24 changes: 24 additions & 0 deletions lib/dateparts/meridiem.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
'use strict';

const DatePart = require('./datepart');

class Meridiem extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setHours((this.date.getHours() + 12) % 24);
}

down() {
this.up();
}

toString() {
let meridiem = this.date.getHours() > 12 ? 'pm' : 'am';
return /\A/.test(this.token) ? meridiem.toUpperCase() : meridiem;
}
}

module.exports = Meridiem;
28 changes: 28 additions & 0 deletions lib/dateparts/milliseconds.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

const DatePart = require('./datepart');

class Milliseconds extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setMilliseconds(this.date.getMilliseconds() + 1);
}

down() {
this.date.setMilliseconds(this.date.getMilliseconds() - 1);
}

setTo(val) {
this.date.setMilliseconds(parseInt(val.substr(-(this.token.length))));
}

toString() {
return String(this.date.getMilliseconds()).padStart(4, '0')
.substr(0, this.token.length);
}
}

module.exports = Milliseconds;
28 changes: 28 additions & 0 deletions lib/dateparts/minutes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

const DatePart = require('./datepart');

class Minutes extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setMinutes(this.date.getMinutes() + 1);
}

down() {
this.date.setMinutes(this.date.getMinutes() - 1);
}

setTo(val) {
this.date.setMinutes(parseInt(val.substr(-2)));
}

toString() {
let m = this.date.getMinutes();
return this.token.length > 1 ? String(m).padStart(2, '0') : m;
}
}

module.exports = Minutes;
33 changes: 33 additions & 0 deletions lib/dateparts/month.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';

const DatePart = require('./datepart');

class Month extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setMonth(this.date.getMonth() + 1);
}

down() {
this.date.setMonth(this.date.getMonth() - 1);
}

setTo(val) {
val = parseInt(val.substr(-2)) - 1;
this.date.setMonth(val < 0 ? 0 : val);
}

toString() {
let month = this.date.getMonth();
let tl = this.token.length;
return tl === 2 ? String(month + 1).padStart(2, '0')
: tl === 3 ? this.locales.monthsShort[month]
: tl === 4 ? this.locales.months[month]
: String(month + 1);
}
}

module.exports = Month;
28 changes: 28 additions & 0 deletions lib/dateparts/seconds.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

const DatePart = require('./datepart');

class Seconds extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setSeconds(this.date.getSeconds() + 1);
}

down() {
this.date.setSeconds(this.date.getSeconds() - 1);
}

setTo(val) {
this.date.setSeconds(parseInt(val.substr(-2)));
}

toString() {
let s = this.date.getSeconds();
return this.token.length > 1 ? String(s).padStart(2, '0') : s;
}
}

module.exports = Seconds;
28 changes: 28 additions & 0 deletions lib/dateparts/year.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

const DatePart = require('./datepart');

class Year extends DatePart {
constructor(opts={}) {
super(opts);
}

up() {
this.date.setFullYear(this.date.getFullYear() + 1);
}

down() {
this.date.setFullYear(this.date.getFullYear() - 1);
}

setTo(val) {
this.date.setFullYear(val.substr(-4));
}

toString() {
let year = String(this.date.getFullYear()).padStart(4, '0');
return this.token.length === 2 ? year.substr(-2) : year;
}
}

module.exports = Year;
2 changes: 1 addition & 1 deletion lib/elements/confirm.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class ConfirmPrompt extends Prompt {

render() {
if (this.closed) return;
if (this.first) this.out.write(cursor.hide);
if (this.firstRender) this.out.write(cursor.hide);
super.render();

this.out.write(
Expand Down
Loading

0 comments on commit c7658c0

Please sign in to comment.