describe('options - beforeShow hooks', function () {
let clock;
let input;
beforeEach(function () {
clock = sinon.useFakeTimers({now: new Date(2020, 1, 14)});
input = document.createElement('input');
testContainer.appendChild(input);
});
afterEach(function () {
testContainer.removeChild(input);
clock.restore();
});
describe('beforeShowDay', function () {
it('disables the date when it returns false', function () {
const beforeShowDay = date => !!(date.getDate() % 10);
const {dp, picker} = createDP(input, {beforeShowDay});
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[4], cells[15], cells[25]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['30', '10', '20']);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['10', '20', '30', '10']);
dp.destroy();
});
it('adds classes to the date when it returns spece separated classes', function () {
const beforeShowDay = date => date.getDate() % 10 ? undefined : 'foo bar';
const {dp, picker} = createDP(input, {beforeShowDay});
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[4], cells[15], cells[25]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['30', '10', '20']);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['10', '20', '30', '10']);
dp.destroy();
});
it('disables the date when the return contains enabled: false', function () {
const beforeShowDay = date => ({enabled: !!(date.getDate() % 10)});
const {dp, picker} = createDP(input, {beforeShowDay});
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[4], cells[15], cells[25]]);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
dp.destroy();
});
it('adds classes to the date when the return contains space separated classes in the classes property', function () {
const beforeShowDay = date => date.getDate() % 10 ? undefined : {classes: 'foo bar'};
const {dp, picker} = createDP(input, {beforeShowDay});
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[4], cells[15], cells[25]]);
expect(barCells, 'to equal', fooCells);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
expect(barCells, 'to equal', fooCells);
dp.destroy();
});
it('uses custom content to the date cell when the return contains text/html in the content property', function () {
const beforeShowDay = (date) => date.getDate() % 10 === 4 ? {content: '❤️'} : undefined;
const {dp, picker} = createDP(input, {beforeShowDay});
let cells = getCells(picker);
let ccCells = cells.filter(el => el.children.length > 0);
expect(ccCells, 'to equal', [cells[9], cells[19], cells[29], cells[38]]);
ccCells.forEach((cell) => {
expect(cell.innerHTML, 'to be', '❤️');
});
picker.querySelector('.next-btn').click();
cells = getCells(picker);
ccCells = cells.filter(el => el.children.length > 0);
expect(ccCells, 'to equal', [cells[3], cells[13], cells[23], cells[34]]);
ccCells.forEach((cell) => {
expect(cell.innerHTML, 'to be', '❤️');
});
dp.destroy();
});
it('can be updated with setOptions()', function () {
const {dp, picker} = createDP(input);
dp.setOptions({beforeShowDay: date => !!(date.getDate() % 10)});
dp.show();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[4], cells[15], cells[25]]);
dp.hide();
dp.setOptions({beforeShowDay: null});
dp.show();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', []);
dp.destroy();
});
});
describe('beforeShowMonth', function () {
it('disables the month on months view when it returns false', function () {
const beforeShowMonth = date => !!(date.getMonth() % 5);
const {dp, picker} = createDP(input, {beforeShowMonth});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
dp.destroy();
});
it('adds classes to the month on months view when it returns spece separated classes', function () {
const beforeShowMonth = date => date.getMonth() % 5 ? undefined : 'foo bar';
const {dp, picker} = createDP(input, {beforeShowMonth});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
dp.destroy();
});
it('disables the month on months view when the return contains enabled: false', function () {
const beforeShowMonth = date => ({enabled: !!(date.getMonth() % 5)});
const {dp, picker} = createDP(input, {beforeShowMonth});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
dp.destroy();
});
it('adds classes to the month on months view when the return contains space separated classes in the classes property', function () {
const beforeShowMonth = date => date.getMonth() % 5 ? undefined : {classes: 'foo bar'};
const {dp, picker} = createDP(input, {beforeShowMonth});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
expect(barCells, 'to equal', fooCells);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
expect(barCells, 'to equal', fooCells);
dp.destroy();
});
it('uses custom content to the month cell when the return contains text/html in the content property', function () {
const beforeShowMonth = (date) => (date.getMonth() + date.getFullYear() % 10) % 10 ? undefined : {content: '🍀'};
const {dp, picker} = createDP(input, {beforeShowMonth});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
let cells = getCells(picker);
let ccCells = cells.filter(el => el.textContent.length < 3);
expect(ccCells, 'to equal', [cells[0], cells[10]]);
ccCells.forEach((cell) => {
expect(cell.textContent, 'to be', '🍀');
});
picker.querySelector('.next-btn').click();
cells = getCells(picker);
ccCells = cells.filter(el => el.textContent.length < 3);
expect(ccCells, 'to equal', [cells[9]]);
ccCells.forEach((cell) => {
expect(cell.textContent, 'to be', '🍀');
});
dp.destroy();
});
it('can be updated with setOptions()', function () {
const {dp, picker} = createDP(input);
const viewSwitch = getViewSwitch(picker);
dp.setOptions({beforeShowMonth: date => !!(date.getMonth() % 5)});
dp.show();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
dp.hide();
dp.setOptions({beforeShowMonth: null});
dp.show();
viewSwitch.click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', []);
dp.destroy();
});
});
describe('beforeShowYear', function () {
it('disables the year on years view when it returns false', function () {
const beforeShowYear = date => !!(date.getFullYear() % 4);
const {dp, picker} = createDP(input, {beforeShowYear});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['2020', '2024', '2028',]);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['2032', '2036', '2040']);
dp.destroy();
});
it('adds classes to the year on years view when it returns spece separated classes', function () {
const beforeShowYear = date => date.getFullYear() % 4 ? undefined : 'foo bar';
const {dp, picker} = createDP(input, {beforeShowYear});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['2020', '2024', '2028']);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['2032', '2036', '2040']);
dp.destroy();
});
it('disables the year on years view when the return contains enabled: false', function () {
const beforeShowYear = date => ({enabled: !!(date.getFullYear() % 4)});
const {dp, picker} = createDP(input, {beforeShowYear});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
dp.destroy();
});
it('adds classes to the year on years view when the return contains space separated classes in the classes property', function () {
const beforeShowYear = date => date.getFullYear() % 4 ? undefined : {classes: 'foo bar'};
const {dp, picker} = createDP(input, {beforeShowYear});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
expect(barCells, 'to equal', fooCells);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
expect(barCells, 'to equal', fooCells);
dp.destroy();
});
it('uses custom content to the year cell when the return contains text/html in the content property', function () {
const beforeShowYear = (date) => {
const year = date.getFullYear();
return (year + Math.floor(year / 10) % 10) % 4 ? undefined : {content: ''};
};
const {dp, picker} = createDP(input, {beforeShowYear});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let ccCells = cells.filter(el => el.children.length > 0);
expect(ccCells, 'to equal', [cells[1], cells[5], cells[9]]);
ccCells.forEach((cell) => {
expect(cell.innerHTML, 'to be', '');
});
picker.querySelector('.next-btn').click();
cells = getCells(picker);
ccCells = cells.filter(el => el.children.length > 0);
expect(ccCells, 'to equal', [cells[2], cells[6], cells[10]]);
ccCells.forEach((cell) => {
expect(cell.innerHTML, 'to be', '');
});
dp.destroy();
});
it('can be updated with setOptions()', function () {
const {dp, picker} = createDP(input);
const viewSwitch = getViewSwitch(picker);
dp.setOptions({beforeShowYear: date => !!(date.getFullYear() % 4)});
dp.show();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
dp.hide();
dp.setOptions({beforeShowYear: null});
dp.show();
viewSwitch.click();
viewSwitch.click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', []);
dp.destroy();
});
});
describe('beforeShowDecade', function () {
it('disables the decade on decades view when it returns false', function () {
const beforeShowDecade = date => !!((date.getFullYear() / 10) % 4);
const {dp, picker} = createDP(input, {beforeShowDecade});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['2000', '2040', '2080',]);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
expect(disabledCells.map(el => el.textContent), 'to equal', ['2120', '2160', '2200']);
dp.destroy();
});
it('adds classes to the decade on decades view when it returns spece separated classes', function () {
const beforeShowDecade = date => (date.getFullYear() / 10) % 4 ? undefined : 'foo bar';
const {dp, picker} = createDP(input, {beforeShowDecade});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['2000', '2040', '2080']);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
expect(barCells, 'to equal', fooCells);
expect(fooCells.map(el => el.textContent), 'to equal', ['2120', '2160', '2200']);
dp.destroy();
});
it('disables the decade on decades view when the return contains enabled: false', function () {
const beforeShowDecade = date => ({enabled: !!((date.getFullYear() / 10) % 4)});
const {dp, picker} = createDP(input, {beforeShowDecade});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
dp.destroy();
});
it('adds classes to the decade on decades view when the return contains space separated classes in the classes property', function () {
const beforeShowDecade = date => (date.getFullYear() / 10) % 4 ? undefined : {classes: 'foo bar'};
const {dp, picker} = createDP(input, {beforeShowDecade});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let fooCells = filterCells(cells, '.foo');
let barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
expect(barCells, 'to equal', fooCells);
picker.querySelector('.next-btn').click();
cells = getCells(picker);
fooCells = filterCells(cells, '.foo');
barCells = filterCells(cells, '.bar');
expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
expect(barCells, 'to equal', fooCells);
dp.destroy();
});
it('uses custom content to the decade cell when the return contains text/html in the content property', function () {
const beforeShowDecade = (date) => {
const dec = date.getFullYear() / 10;
return (dec + Math.floor(dec / 10) % 10) % 5 ? undefined : {content: 'X'};
};
const {dp, picker} = createDP(input, {beforeShowDecade});
const viewSwitch = getViewSwitch(picker);
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let ccCells = cells.filter(el => el.children.length > 0);
expect(ccCells, 'to equal', [cells[1], cells[6]]);
ccCells.forEach((cell) => {
expect(cell.innerHTML, 'to be', 'X');
});
picker.querySelector('.next-btn').click();
cells = getCells(picker);
ccCells = cells.filter(el => el.children.length > 0);
expect(ccCells, 'to equal', [cells[5], cells[10]]);
ccCells.forEach((cell) => {
expect(cell.innerHTML, 'to be', 'X');
});
dp.destroy();
});
it('can be updated with setOptions()', function () {
const {dp, picker} = createDP(input);
const viewSwitch = getViewSwitch(picker);
dp.setOptions({beforeShowDecade: date => !!((date.getFullYear() / 10) % 4)});
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
let cells = getCells(picker);
let disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
dp.hide();
dp.setOptions({beforeShowDecade: null});
dp.show();
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
cells = getCells(picker);
disabledCells = filterCells(cells, '.disabled');
expect(disabledCells, 'to equal', []);
dp.destroy();
});
});
});