UNPKG

formiojs

Version:

Common js library for client side interaction with <form.io>

1,034 lines (796 loc) • 162 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.symbol.js"); require("core-js/modules/es.array.filter.js"); require("core-js/modules/es.object.get-own-property-descriptor.js"); require("core-js/modules/es.object.get-own-property-descriptors.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/es.weak-map.js"); require("core-js/modules/es.symbol.description.js"); require("core-js/modules/es.symbol.iterator.js"); require("regenerator-runtime/runtime.js"); require("core-js/modules/es.string.trim.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/web.dom-collections.for-each.js"); require("core-js/modules/es.array.includes.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/web.dom-collections.iterator.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.string.split.js"); require("core-js/modules/es.string.replace.js"); require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.string.includes.js"); require("core-js/modules/es.promise.js"); require("core-js/modules/es.promise.finally.js"); var _powerAssert = _interopRequireDefault(require("power-assert")); var _chai = require("chai"); var _sinon = _interopRequireDefault(require("sinon")); var _lodash = _interopRequireDefault(require("lodash")); var _each = _interopRequireDefault(require("lodash/each")); var _i18next = _interopRequireDefault(require("i18next")); var _harness = _interopRequireDefault(require("../test/harness")); var _forms = _interopRequireDefault(require("../test/forms")); var _Webform = _interopRequireDefault(require("./Webform")); require("flatpickr"); var _Formio = _interopRequireDefault(require("./Formio")); var _formtest = require("../test/formtest"); var _dataGridOnBlurValidation = _interopRequireDefault(require("../test/forms/dataGridOnBlurValidation")); var _updateErrorClassesWidgets = _interopRequireDefault(require("../test/forms/updateErrorClasses-widgets")); var _nestedModalWizard = _interopRequireDefault(require("../test/forms/nestedModalWizard")); var _disableSubmitButton = _interopRequireDefault(require("../test/forms/disableSubmitButton")); var _formWithAddressComponent = _interopRequireDefault(require("../test/forms/formWithAddressComponent")); var _dataGridWithInitEmpty = _interopRequireDefault(require("../test/forms/dataGridWithInitEmpty")); var _dataGridNestedForm = _interopRequireDefault(require("../test/forms/dataGrid-nestedForm")); var _formWithDataGrid = _interopRequireDefault(require("../test/forms/formWithDataGrid")); var _translationTestForm = _interopRequireDefault(require("../test/forms/translationTestForm")); var _dataGridWithConditionalColumn = _interopRequireDefault(require("../test/forms/dataGridWithConditionalColumn")); var _fixtures = require("../test/fixtures"); var _nativePromiseOnly = _interopRequireDefault(require("native-promise-only")); var _utils = require("../lib/utils/utils"); var _truncateMultipleSpaces = _interopRequireDefault(require("../test/forms/truncateMultipleSpaces")); var _calculatedValue = _interopRequireDefault(require("../test/forms/calculatedValue")); var _conditionalDataGridWithTableAndRadio = _interopRequireDefault(require("../test/forms/conditionalDataGridWithTableAndRadio")); var _calculateValueWithManualOverrideLableValueDataGrid = _interopRequireDefault(require("../test/forms/calculateValueWithManualOverrideLableValueDataGrid")); var _nestedDataGridsAndContainers = _interopRequireDefault(require("../test/forms/nestedDataGridsAndContainers")); var _columnWithConditionalComponents = _interopRequireDefault(require("../test/forms/columnWithConditionalComponents")); var _formWithSurvey = _interopRequireDefault(require("../test/forms/formWithSurvey")); var _formWithSelectBoxes = _interopRequireDefault(require("../test/forms/formWithSelectBoxes")); var _formWithDayComp = _interopRequireDefault(require("../test/forms/formWithDayComp")); var _formWithCalcValue = _interopRequireDefault(require("../test/forms/formWithCalcValue")); var _formWithAllowCalculateOverride = _interopRequireDefault(require("../test/forms/formWithAllowCalculateOverride")); var _clearOnHideInsideEditGrid = _interopRequireDefault(require("../test/forms/clearOnHideInsideEditGrid")); var _nestedDataGridWithInitEmpty = _interopRequireDefault(require("../test/forms/nestedDataGridWithInitEmpty")); var FormioUtils = _interopRequireWildcard(require("./utils/utils")); var _htmlRenderMode = _interopRequireDefault(require("../test/forms/htmlRenderMode")); var _optionalSanitize = _interopRequireDefault(require("../test/forms/optionalSanitize")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } global.requestAnimationFrame = function (cb) { return cb(); }; global.cancelAnimationFrame = function () {}; /* eslint-disable max-statements */ describe('Webform tests', function () { this.retries(3); it('Should recalculate value when submission is being set in edit mode', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement); form.setForm(_formWithCalcValue.default).then(function () { var numberComp = form.getComponent('number'); var checkbox = form.getComponent('checkbox'); form.setSubmission({}).then(function () { setTimeout(function () { _powerAssert.default.equal(numberComp.dataValue, 0); _powerAssert.default.equal(checkbox.dataValue, true); form.setSubmission({ data: { number: 7, checkbox: true } }).then(function () { setTimeout(function () { _powerAssert.default.equal(numberComp.dataValue, 7); _powerAssert.default.equal(checkbox.dataValue, false); done(); }, 500); }); }, 500); }); }).catch(function (err) { return done(err); }); }); it('Should show survey values in html render mode', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement, { renderMode: 'html', readOnly: true }); form.setForm(_formWithSurvey.default).then(function () { form.setSubmission({ data: { survey: { question1: 'a3', question2: 'a1' } } }).then(function () { var survey = form.getComponent('survey'); var values = survey.element.querySelectorAll('td'); _powerAssert.default.equal(values.length, 2); _powerAssert.default.equal(values[0].innerHTML.trim(), 'a3'); _powerAssert.default.equal(values[1].innerHTML.trim(), 'a1'); done(); }); }).catch(function (err) { return done(err); }); }); it('Should show select boxes values in html render mode', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement, { renderMode: 'html', readOnly: true }); form.setForm(_formWithSelectBoxes.default).then(function () { form.setSubmission({ data: { selectBoxes: { a: true, b: true, c: false } } }).then(function () { var selectBoxes = form.getComponent('selectBoxes'); var values = selectBoxes.element.querySelector('[ref="value"]').textContent.trim(); _powerAssert.default.equal(values, 'a, b'); done(); }); }).catch(function (err) { return done(err); }); }); it('Should show day value in html render mode', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement, { renderMode: 'html', readOnly: true }); form.setForm(_formWithDayComp.default).then(function () { form.setSubmission({ data: { day: '05/07/2020' } }).then(function () { var day = form.getComponent('day'); var value = day.element.querySelector('[ref="value"]').textContent.trim(); _powerAssert.default.equal(value, '05/07/2020'); done(); }); }).catch(function (err) { return done(err); }); }); it('Should allow to input value and add rows in deeply nested conditional dataGrid', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement); form.setForm(_nestedDataGridsAndContainers.default).then(function () { var parentDataGrid = form.getComponent('dataGrid6'); _powerAssert.default.equal(parentDataGrid.rows.length, 1); _powerAssert.default.equal(parentDataGrid.rows[0].dataGrid5.visible, false); var checkbox = form.getComponent('checkbox'); checkbox.setValue(true); setTimeout(function () { _powerAssert.default.equal(parentDataGrid.rows.length, 1); _powerAssert.default.equal(parentDataGrid.rows[0].dataGrid5.visible, true); var numberInput = parentDataGrid.rows[0].dataGrid5.rows[0].number.refs.input[0]; numberInput.value = 555; var inputEvent = new Event('input'); numberInput.dispatchEvent(inputEvent); setTimeout(function () { var conditionalDataGrid = form.getComponent('dataGrid6').rows[0].dataGrid5; var numberComp = conditionalDataGrid.rows[0].number; _powerAssert.default.equal(numberComp.dataValue, 555); _powerAssert.default.equal(numberComp.refs.input[0].value, 555); var addRowBtn = conditionalDataGrid.refs['datagrid-dataGrid5-addRow'][0]; var clickEvent = new Event('click'); addRowBtn.dispatchEvent(clickEvent); setTimeout(function () { _powerAssert.default.equal(conditionalDataGrid.rows.length, 2); done(); }, 300); }, 300); }, 300); }).catch(function (err) { return done(err); }); }); it('Should adjust columns when conditional fields appear/disappear', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement); form.setForm(_columnWithConditionalComponents.default).then(function () { var selectBoxes = form.getComponent('selectBoxes'); var columns = form.getComponent('columns'); columns.columns.forEach(function (column, index) { _powerAssert.default.equal(column[0].visible, false, "Column ".concat(index + 1, " component should be hidden")); _powerAssert.default.equal(columns.component.columns[index].currentWidth, 0, "Column ".concat(index + 1, " width should be 0")); }); selectBoxes.setValue({ '1': false, '2': false, '3': true, '4': false, '5': false, '6': true }); setTimeout(function () { columns.columns.forEach(function (column, index) { if ([3, 6].includes(index + 1)) { _powerAssert.default.equal(column[0].visible, true, "Column ".concat(index + 1, " component should be visible")); _powerAssert.default.equal(columns.component.columns[index].currentWidth, 2, "Column ".concat(index + 1, " width should be 2")); } else { _powerAssert.default.equal(column[0].visible, false, "Column ".concat(index + 1, " component should be hidden")); _powerAssert.default.equal(columns.component.columns[index].currentWidth, 0, "Column ".concat(index + 1, " width should be 0")); } }); var visibleTextField1 = columns.columns[2][0].refs.input[0]; var visibleTextField2 = columns.columns[5][0].refs.input[0]; visibleTextField1.value = 'test '; visibleTextField2.value = ' some '; var inputEvent = new Event('input'); visibleTextField1.dispatchEvent(inputEvent); visibleTextField2.dispatchEvent(inputEvent); setTimeout(function () { var visibleTextField1 = columns.columns[2][0].refs.input[0]; var visibleTextField2 = columns.columns[5][0].refs.input[0]; _powerAssert.default.equal(visibleTextField1.value, 'test ', 'Should not cut whitespaces while inputting into the conditional component inside column'); _powerAssert.default.equal(visibleTextField2.value, ' some ', 'Should not cut whitespaces while inputting into the conditional component inside column'); selectBoxes.setValue({ '1': false, '2': false, '3': false, '4': false, '5': false, '6': true }); setTimeout(function () { columns.columns.forEach(function (column, index) { if ([6].includes(index + 1)) { _powerAssert.default.equal(column[0].visible, true, "Column ".concat(index + 1, " component should be visible")); _powerAssert.default.equal(columns.component.columns[index].currentWidth, 2, "Column ".concat(index + 1, " width should be 2")); } else { _powerAssert.default.equal(column[0].visible, false, "Column ".concat(index + 1, " component should be hidden")); _powerAssert.default.equal(columns.component.columns[index].currentWidth, 0, "Column ".concat(index + 1, " width should be 0")); } }); done(); }, 300); }, 300); }, 300); }).catch(function (err) { return done(err); }); }); it('Should not translate en value if _userInput option is provided and value presents in reserved translation names', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement, { language: 'en' }); form.setForm(_translationTestForm.default).then(function () { setTimeout(function () { var selectComp = form.getComponent('select'); var options = selectComp.element.querySelector('[role="listbox"]').children; var option1 = options[0].textContent.trim(); var option2 = options[1].textContent.trim(); var label = selectComp.element.querySelector('label').textContent.trim(); _powerAssert.default.equal(option1, _translationTestForm.default.components[0].data.values[0].label); _powerAssert.default.equal(option2, _translationTestForm.default.components[0].data.values[1].label); _powerAssert.default.equal(label, _translationTestForm.default.components[0].label); document.body.innerHTML = ''; done(); }, 100); }).catch(done); }); it('Should translate in English if _userInput option is provided and value does not present in reserved translation names', function (done) { var formElement = document.createElement('div'); var selectLabel = 'Select test label'; var translationForm = (0, _utils.fastCloneDeep)(_translationTestForm.default); translationForm.components[0].label = selectLabel; var form = new _Webform.default(formElement, { language: 'en', i18n: { en: { 'Select test label': 'English Label' }, fr: { 'Select test label': 'French Label' } } }); form.setForm(translationForm).then(function () { var selectComp = form.getComponent('select'); var label = selectComp.element.querySelector('label').textContent.trim(); _powerAssert.default.equal(label, 'English Label'); document.body.innerHTML = ''; done(); }).catch(done); }); it('Should translate value in franch if _userInput option is provided and value does not present in reserved translation names', function (done) { var formElement = document.createElement('div'); var selectLabel = 'Select test label'; var translationForm = (0, _utils.fastCloneDeep)(_translationTestForm.default); translationForm.components[0].label = selectLabel; var form = new _Webform.default(formElement, { language: 'fr', i18n: { en: { 'Select test label': 'English Label' }, fr: { 'Select test label': 'French Label' } } }); form.setForm(translationForm).then(function () { var selectComp = form.getComponent('select'); var label = selectComp.element.querySelector('label').textContent.trim(); _powerAssert.default.equal(label, 'French Label'); document.body.innerHTML = ''; done(); }).catch(done); }); it('Should display dataGrid conditional column once the condition is met', function (done) { var formElement = document.createElement('div'); var formWithCondDataGridColumn = new _Webform.default(formElement); formWithCondDataGridColumn.setForm(_dataGridWithConditionalColumn.default).then(function () { var condDataGridField = formWithCondDataGridColumn.element.querySelector('[name="data[dataGrid][0][numberCond]"]'); _powerAssert.default.equal(!!condDataGridField, false); var textField = formWithCondDataGridColumn.element.querySelector('[name="data[textField]"]'); textField.value = 'show'; var inputEvent = new Event('input'); textField.dispatchEvent(inputEvent); setTimeout(function () { var condDataGridFieldAfterFulfillingCond = formWithCondDataGridColumn.element.querySelector('[name="data[dataGrid][0][numberCond]"]'); _powerAssert.default.equal(!!condDataGridFieldAfterFulfillingCond, true); done(); }, 300); }).catch(function (err) { return done(err); }); }); it('Should remove dataGrid extra rows and components after setting value with less row number', function (done) { var formElement = document.createElement('div'); var formWithDG = new _Webform.default(formElement); formWithDG.setForm(_formWithDataGrid.default.form).then(function () { formWithDG.setSubmission(_formWithDataGrid.default.submission3rows); setTimeout(function () { _powerAssert.default.equal(formWithDG.components[0].rows.length, 3); _powerAssert.default.equal(formWithDG.components[0].components.length, 3); formWithDG.setSubmission(_formWithDataGrid.default.submission1row); setTimeout(function () { _powerAssert.default.equal(formWithDG.components[0].rows.length, 1); _powerAssert.default.equal(formWithDG.components[0].components.length, 1); done(); }, 200); }, 100); }).catch(function (err) { return done(err); }); }); it('Should not delete/change date value in dataGrid after adding new row', function (done) { var formElement = document.createElement('div'); var formWithDate = new _Webform.default(formElement); formWithDate.setForm(_formtest.formWithCustomFormatDate).then(function () { setTimeout(function () { var clickEvent = new Event('click'); var dateCompInputWidget = formWithDate.element.querySelector('.formio-component-textField').querySelector('.flatpickr-input').widget; var dateAltFormat = dateCompInputWidget.calendar.config.altFormat; dateCompInputWidget.calendar.setDate('30-05-2020', true, dateAltFormat); var dateCompInputWidget1 = formWithDate.element.querySelector('.formio-component-dateTime').querySelector('.flatpickr-input').widget; var dateAltFormat1 = dateCompInputWidget1.calendar.config.altFormat; dateCompInputWidget1.calendar.setDate('30-05-2020', true, dateAltFormat1); var dateCompInputWidget2 = formWithDate.element.querySelector('.formio-component-textField2').querySelector('.flatpickr-input').widget; var dateAltFormat2 = dateCompInputWidget2.calendar.config.altFormat; dateCompInputWidget2.calendar.setDate('30-05-2020', true, dateAltFormat2); setTimeout(function () { var dateCompAltInput = formWithDate.element.querySelector('.formio-component-textField').querySelector('.flatpickr-input'); var dateComp = formWithDate.element.querySelector('.formio-component-textField').querySelector('[type="text"]'); var dateCompAltInput1 = formWithDate.element.querySelector('.formio-component-dateTime').querySelector('.flatpickr-input'); var dateComp1 = formWithDate.element.querySelector('.formio-component-dateTime').querySelector('[type="text"]'); var dateCompAltInput2 = formWithDate.element.querySelector('.formio-component-textField2').querySelector('.flatpickr-input'); var dateComp2 = formWithDate.element.querySelector('.formio-component-textField2').querySelector('[type="text"]'); _powerAssert.default.equal(dateCompAltInput.value, '30-05-2020'); _powerAssert.default.equal(dateComp.value, '30-05-2020'); _powerAssert.default.equal(dateCompAltInput1.value, '2020-05-30T00:00:00'); _powerAssert.default.equal(dateComp1.value, '30-05-2020'); _powerAssert.default.equal(dateCompAltInput2.value, '2020-05-30T00:00:00'); _powerAssert.default.equal(dateComp2.value, '30-05-2020'); var addNewRowBtn = formWithDate.element.querySelector('.formio-button-add-row'); addNewRowBtn.dispatchEvent(clickEvent); setTimeout(function () { var dataGridRows = formWithDate.element.querySelectorAll('[ref="datagrid-dataGrid-row"]'); _powerAssert.default.equal(dataGridRows.length, 2); var dateCompAltInputAfterAddingRow = formWithDate.element.querySelectorAll('.formio-component-textField')[0].querySelector('.flatpickr-input'); var dateCompAfterAddingRow = formWithDate.element.querySelectorAll('.formio-component-textField')[0].querySelector('[type="text"]'); var dateCompAltInputAfterAddingRow1 = formWithDate.element.querySelectorAll('.formio-component-dateTime')[0].querySelector('.flatpickr-input'); var dateCompAfterAddingRow1 = formWithDate.element.querySelectorAll('.formio-component-dateTime')[0].querySelector('[type="text"]'); var dateCompAltInputAfterAddingRow2 = formWithDate.element.querySelectorAll('.formio-component-textField2')[0].querySelector('.flatpickr-input'); var dateCompAfterAddingRow2 = formWithDate.element.querySelectorAll('.formio-component-textField2')[0].querySelector('[type="text"]'); _powerAssert.default.equal(dateCompAltInputAfterAddingRow.value, '30-05-2020'); _powerAssert.default.equal(dateCompAfterAddingRow.value, '30-05-2020'); _powerAssert.default.equal(dateCompAltInputAfterAddingRow1.value, '2020-05-30T00:00:00'); _powerAssert.default.equal(dateCompAfterAddingRow1.value, '30-05-2020'); _powerAssert.default.equal(dateCompAltInputAfterAddingRow2.value, '2020-05-30T00:00:00'); _powerAssert.default.equal(dateCompAfterAddingRow2.value, '30-05-2020'); done(); }, 150); }, 50); }, 100); }).catch(function (err) { return done(err); }); }); it('Should open collapsed panel with invalid components inside container that is inside the panel on submit', function (done) { var formElement = document.createElement('div'); var formWithPanel = new _Webform.default(formElement); formWithPanel.setForm(_formtest.formWithCollapsedPanel).then(function () { var clickEvent = new Event('click'); _powerAssert.default.equal(formWithPanel.components[0].collapsed, true); var submitBtn = formWithPanel.element.querySelector('[name="data[submit]"]'); submitBtn.dispatchEvent(clickEvent); setTimeout(function () { _powerAssert.default.equal(formWithPanel.components[0].collapsed, false); done(); }, 200); }).catch(function (err) { return done(err); }); }); it('Should correctly set date after collapsing and openning the panel', function (done) { var formElement = document.createElement('div'); var formWithDate = new _Webform.default(formElement); formWithDate.setForm(_formtest.formWithDateTimeComponents).then(function () { var clickEvent = new Event('click'); var dateTimeCompInputWidget = formWithDate.element.querySelector('.formio-component-dateTime1').querySelector('.flatpickr-input').widget; var dateTimeAltFormat = dateTimeCompInputWidget.calendar.config.altFormat; dateTimeCompInputWidget.calendar.setDate('05-05-2020T00:00:00', true, dateTimeAltFormat); var textFieldDateCompWidget = formWithDate.element.querySelector('.formio-component-textField1').querySelector('.flatpickr-input').widget; var textFieldDateAltFormat = textFieldDateCompWidget.calendar.config.altFormat; textFieldDateCompWidget.calendar.setDate('04-04-2020T00:00:00', true, textFieldDateAltFormat); setTimeout(function () { var dateTimeCompAltInput = formWithDate.element.querySelector('.formio-component-dateTime1').querySelector('.flatpickr-input'); var textFieldDateCompAltInput = formWithDate.element.querySelector('.formio-component-textField1').querySelector('.flatpickr-input'); var dateTimeComp = formWithDate.element.querySelector('.formio-component-dateTime1').querySelector('[type="text"]'); var textFieldDateComp = formWithDate.element.querySelector('.formio-component-textField1').querySelector('[type="text"]'); _powerAssert.default.equal(dateTimeCompAltInput.value, '2020-05-05T00:00:00'); _powerAssert.default.equal(textFieldDateCompAltInput.value, '2020-04-04T00:00:00'); _powerAssert.default.equal(dateTimeComp.value, '05-05-2020'); _powerAssert.default.equal(textFieldDateComp.value, '04-04-2020'); var panelCollapseBtn = formWithDate.element.querySelector('.formio-collapse-icon'); panelCollapseBtn.dispatchEvent(clickEvent); setTimeout(function () { var panelBody = formWithDate.element.querySelector('.panel-body'); _powerAssert.default.equal(!!panelBody, false); formWithDate.element.querySelector('.formio-collapse-icon').dispatchEvent(clickEvent); setTimeout(function () { var dateTimeCompAfterOpenningPanel = formWithDate.element.querySelector('.formio-component-dateTime1').querySelector('[type="text"]'); var textFieldDateCompAfterOpenningPanel = formWithDate.element.querySelector('.formio-component-textField1').querySelector('[type="text"]'); var dateTimeCompAltInputAfterOpenningPanel = formWithDate.element.querySelector('.formio-component-dateTime1').querySelector('.flatpickr-input'); var textFieldDateCompAltInputAfterOpenningPanel = formWithDate.element.querySelector('.formio-component-textField1').querySelector('.flatpickr-input'); _powerAssert.default.equal(dateTimeCompAltInputAfterOpenningPanel.value, '2020-05-05T00:00:00'); _powerAssert.default.equal(textFieldDateCompAltInputAfterOpenningPanel.value, '2020-04-04T00:00:00'); _powerAssert.default.equal(dateTimeCompAfterOpenningPanel.value, '05-05-2020'); _powerAssert.default.equal(textFieldDateCompAfterOpenningPanel.value, '04-04-2020'); done(); }, 250); }, 150); }, 50); }).catch(function (err) { return done(err); }); }); it("Should show confirmation alert when clicking X btn or clicking outside modal window after editing\n editGrid modal draft row", function (done) { var formElement = document.createElement('div'); var formWithNestedDraftModals = new _Webform.default(formElement); formWithNestedDraftModals.setForm(_formtest.formWithEditGridAndNestedDraftModalRow).then(function () { var editGrid = formWithNestedDraftModals.getComponent('editGrid'); var clickEvent = new Event('click'); var inputEvent = new Event('input'); var addRowBtn = formWithNestedDraftModals.element.querySelector('[ref="editgrid-editGrid-addRow"]'); //click to open row in modal view addRowBtn.dispatchEvent(clickEvent); setTimeout(function () { var rowModal = document.querySelector(".editgrid-row-modal-".concat(editGrid.id)); //checking if row modal was openned _powerAssert.default.equal(!!rowModal, true); var textField = rowModal.querySelector('[name="data[textField]"]'); textField.value = 'test'; //input value textField.dispatchEvent(inputEvent); setTimeout(function () { //checking if the value was set inside the field _powerAssert.default.equal(textField.value, 'test'); var saveModalBtn = rowModal.querySelector('.btn-primary'); //clicking save button to save row draft saveModalBtn.dispatchEvent(clickEvent); setTimeout(function () { var editGridRows = formWithNestedDraftModals.element.querySelectorAll('[ref="editgrid-editGrid-row"]'); //checking if the editGrid row was created _powerAssert.default.equal(editGridRows.length, 1); var editRowBtn = editGridRows[0].querySelector('.editRow'); //click the edit btn to open the row again editRowBtn.dispatchEvent(clickEvent); setTimeout(function () { var rowModalForEditing = document.querySelector(".editgrid-row-modal-".concat(editGrid.id)); var textFieldInputForEditing = rowModalForEditing.querySelector('[name="data[textField]"]'); textFieldInputForEditing.value = 'changed value'; //changing textfield value textFieldInputForEditing.dispatchEvent(inputEvent); setTimeout(function () { //checking if the textfield value was changed var inputValue = textFieldInputForEditing.value; _powerAssert.default.equal(inputValue, 'changed value'); var XCloseBtn = rowModalForEditing.querySelector('[ref="dialogClose"]'); //clicking modal close btn XCloseBtn.dispatchEvent(clickEvent); setTimeout(function () { var dialogConfirmationWindows = document.querySelectorAll(".editgrid-row-modal-confirmation-".concat(editGrid.id)); //checking if confirmation dialog is openned _powerAssert.default.equal(dialogConfirmationWindows.length, 1); var dialogCancelBtn = dialogConfirmationWindows[0].querySelector('[ref="dialogCancelButton"]'); //closing confirmation dialog dialogCancelBtn.dispatchEvent(clickEvent); setTimeout(function () { var confirmationWindows = document.querySelectorAll(".editgrid-row-modal-confirmation-".concat(editGrid.id)); //checking if confirmation dialig is closed _powerAssert.default.equal(confirmationWindows.length, 0); var dialog = document.querySelector(".editgrid-row-modal-".concat(editGrid.id)); var overlay = dialog.querySelector('[ref="dialogOverlay"]'); //clocking model overlay to open confirmation dialog again overlay.dispatchEvent(clickEvent); setTimeout(function () { var confirmationDialogsAfterClickingOverlay = document.querySelectorAll(".editgrid-row-modal-confirmation-".concat(editGrid.id)); _powerAssert.default.equal(confirmationDialogsAfterClickingOverlay.length, 1); document.body.innerHTML = ''; done(); }, 190); }, 170); }, 150); }, 130); }, 110); }, 100); }, 70); }, 50); }).catch(function (err) { return done(err); }); }); it('Should not show validation errors when saving invalid draft row in dataGrid', function (done) { var formElement = document.createElement('div'); var formWithDraftModals = new _Webform.default(formElement); formWithDraftModals.setForm(_formtest.formWithEditGridModalDrafts).then(function () { var clickEvent = new Event('click'); var inputEvent = new Event('input'); var addRowBtn = formWithDraftModals.element.querySelector('[ref="editgrid-editGrid-addRow"]'); //click to open row in modal view addRowBtn.dispatchEvent(clickEvent); setTimeout(function () { var rowModal = document.querySelector('.formio-dialog-content'); //checking if row modal was openned _powerAssert.default.equal(!!rowModal, true); var textFieldInput = rowModal.querySelector('[name="data[editGrid][0][textField]"]'); textFieldInput.value = 'test'; //input value in one of required row fields textFieldInput.dispatchEvent(inputEvent); setTimeout(function () { //checking if the value was set inside the field _powerAssert.default.equal(textFieldInput.value, 'test'); var saveModalBtn = rowModal.querySelector('.btn-primary'); //clicking save button to save row draft saveModalBtn.dispatchEvent(clickEvent); setTimeout(function () { var editGridRows = formWithDraftModals.element.querySelectorAll('[ref="editgrid-editGrid-row"]'); //checking if the editGrid row was created _powerAssert.default.equal(editGridRows.length, 1); var rowError = formWithDraftModals.element.querySelector('.editgrid-row-error').textContent.trim(); var editGridError = formWithDraftModals.element.querySelector('[ref="messageContainer"]').querySelector('.error'); _powerAssert.default.equal(!!rowError, false); _powerAssert.default.equal(!!editGridError, false); done(); }, 200); }, 100); }, 50); }).catch(function (err) { return done(err); }); }); it('Should show dataGrid rows when viewing submission in dataGrid with initEmpty option', function (done) { var formElement = document.createElement('div'); var formWithDataGridInitEmptyOption = new _Webform.default(formElement); formWithDataGridInitEmptyOption.setForm(_dataGridWithInitEmpty.default.form).then(function () { formWithDataGridInitEmptyOption.setSubmission(_dataGridWithInitEmpty.default.submission2); setTimeout(function () { var dataGridRows = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid-row"]'); var dataGrid1Rows = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid1-row"]'); _powerAssert.default.equal(dataGrid1Rows.length, 1); _powerAssert.default.equal(dataGridRows.length, 1); formWithDataGridInitEmptyOption.setSubmission(_dataGridWithInitEmpty.default.submission3); setTimeout(function () { var dataGridRows1 = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid-row"]'); var dataGrid1Rows1 = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid1-row"]'); var dataGridSecondRowComponentValue = formWithDataGridInitEmptyOption.element.querySelector('[name = "data[dataGrid][1][textField]"]'); var dataGrid1FirstRowComponentValue = formWithDataGridInitEmptyOption.element.querySelector('[name = "data[dataGrid1][0][textArea]"]'); var dataGrid1SecondRowComponentValue = formWithDataGridInitEmptyOption.element.querySelector('[name = "data[dataGrid1][1][number]"]'); _powerAssert.default.equal(dataGrid1Rows1.length, 2); _powerAssert.default.equal(dataGridRows1.length, 2); _powerAssert.default.equal(dataGridSecondRowComponentValue.value, 'test2'); _powerAssert.default.equal(dataGrid1FirstRowComponentValue.textContent, 'test3'); _powerAssert.default.equal(dataGrid1SecondRowComponentValue.value, 222); done(); }, 300); }, 200); }).catch(function (err) { return done(err); }); }); it('Should not show dataGrid rows when empty submission is set for dataGrid with initEmpty', function (done) { var formElement = document.createElement('div'); var formWithDataGridInitEmptyOption = new _Webform.default(formElement); formWithDataGridInitEmptyOption.setForm(_dataGridWithInitEmpty.default.form).then(function () { formWithDataGridInitEmptyOption.setSubmission(_dataGridWithInitEmpty.default.submission1); setTimeout(function () { var dataGridRows = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid-row"]'); var dataGrid1Rows = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid1-row"]'); _powerAssert.default.equal(dataGridRows.length, 0); _powerAssert.default.equal(dataGrid1Rows.length, 0); formWithDataGridInitEmptyOption.setSubmission({ data: {} }); setTimeout(function () { var dataGridRows1 = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid-row"]'); var dataGrid1Rows1 = formWithDataGridInitEmptyOption.element.querySelectorAll('[ref = "datagrid-dataGrid1-row"]'); _powerAssert.default.equal(dataGridRows1.length, 0); _powerAssert.default.equal(dataGrid1Rows1.length, 0); done(); }, 300); }, 200); }).catch(function (err) { return done(err); }); }); it('Should show address submission data inside dataGrid', function (done) { var formElement = document.createElement('div'); var formWithAddress = new _Webform.default(formElement); formWithAddress.setForm(_formWithAddressComponent.default.form).then(function () { formWithAddress.setSubmission({ data: _formWithAddressComponent.default.submission }); setTimeout(function () { var addressInput = formWithAddress.element.querySelector('[name = "data[dataGrid][0][address]"]'); _powerAssert.default.equal(addressInput.value, _formWithAddressComponent.default.submission.dataGrid[0].address['formatted_address']); done(); }, 300); }).catch(function (err) { return done(err); }); }); it('Should validate field on blur inside panel', function (done) { var formElement = document.createElement('div'); var formWithBlurValidation = new _Webform.default(formElement); formWithBlurValidation.setForm(_formtest.formWithBlurValidationInsidePanel).then(function () { var inputEvent = new Event('input'); var focusEvent = new Event('focus'); var blurEvent = new Event('blur'); var fieldWithBlurValidation = formWithBlurValidation.element.querySelector('[name="data[textField]"]'); fieldWithBlurValidation.dispatchEvent(focusEvent); 'test'.split('').forEach(function (character) { fieldWithBlurValidation.value = fieldWithBlurValidation.value + character; fieldWithBlurValidation.dispatchEvent(inputEvent); }); setTimeout(function () { var validationErrorBeforeBlur = formWithBlurValidation.element.querySelector('.error'); _powerAssert.default.equal(!!validationErrorBeforeBlur, false); _powerAssert.default.equal(formWithBlurValidation.data.textField, 'test'); fieldWithBlurValidation.dispatchEvent(blurEvent); setTimeout(function () { var validationErrorAfterBlur = formWithBlurValidation.element.querySelector('.error'); _powerAssert.default.equal(!!validationErrorAfterBlur, true); _powerAssert.default.equal(validationErrorAfterBlur.textContent, 'Text Field must have at least 5 characters.'); done(); }, 350); }, 300); }).catch(function (err) { return done(err); }); }); it('Should submit form with empty time field when time field is not required', function (done) { var formElement = document.createElement('div'); var formWithTime = new _Webform.default(formElement); formWithTime.setForm(_formtest.formWithTimeComponent).then(function () { var clickEvent = new Event('click'); var submitBtn = formWithTime.element.querySelector('[name="data[submit]"]'); submitBtn.dispatchEvent(clickEvent); setTimeout(function () { _powerAssert.default.equal(formWithTime.errors.length, 0); _powerAssert.default.equal(formWithTime.data.submit, true); done(); }, 200); }).catch(function (err) { return done(err); }); }); it("Should show validation errors and update validation errors list when openning and editing edit grid rows\n in draft modal mode after pushing submit btn", function (done) { var formElement = document.createElement('div'); var formWithDraftModals = new _Webform.default(formElement, { sanitize: true }); formWithDraftModals.setForm(_formtest.formWithEditGridModalDrafts).then(function () { var clickEvent = new Event('click'); var inputEvent = new Event('input'); var addRowBtn = formWithDraftModals.element.querySelector('[ref="editgrid-editGrid-addRow"]'); //click to open row in modal view addRowBtn.dispatchEvent(clickEvent); setTimeout(function () { var editGrid = formWithDraftModals.getComponent('editGrid'); _powerAssert.default.equal(editGrid.editRows.length, 1, 'Should create a row'); var rowModal = editGrid.editRows[0].dialog; //checking if row modal was openned _powerAssert.default.equal(!!rowModal, true, 'Should open a modal window'); var textFieldInput = rowModal.querySelector('[name="data[editGrid][0][textField]"]'); textFieldInput.value = 'test'; //input value in one of required row fields textFieldInput.dispatchEvent(inputEvent); setTimeout(function () { //checking if the value was set inside the field _powerAssert.default.equal(textFieldInput.value, 'test'); var saveModalBtn = rowModal.querySelector('.btn-primary'); //clicking save button to save row draft saveModalBtn.dispatchEvent(clickEvent); setTimeout(function () { var editGridRows = formWithDraftModals.element.querySelectorAll('[ref="editgrid-editGrid-row"]'); //checking if the editGrid row was created _powerAssert.default.equal(editGridRows.length, 1); var submitBtn = formWithDraftModals.element.querySelector('[name="data[submit]"]'); //pushing submit button to trigger validation submitBtn.dispatchEvent(clickEvent); setTimeout(function () { //checking the number of appeared errors _powerAssert.default.equal(formWithDraftModals.errors.length, 2); var rowError = formWithDraftModals.element.querySelector('.editgrid-row-error').textContent.trim(); var editGridError = formWithDraftModals.element.querySelector('[ref="messageContainer"]').querySelector('.error').textContent; //checking if right errors were shown in right places _powerAssert.default.equal(rowError, 'Invalid row. Please correct it or delete.'); _powerAssert.default.equal(editGridError, 'Please correct invalid rows before proceeding.'); var rowEditBtn = editGridRows[0].querySelector('.editRow'); //open row modal again to check if there are errors rowEditBtn.dispatchEvent(clickEvent); setTimeout(function () { var rowModalAfterValidation = editGrid.editRows[0].dialog; var alertWithErrorText = rowModalAfterValidation.querySelector('.alert-danger'); //checking if alert with errors list appeared inside the modal _powerAssert.default.equal(!!alertWithErrorText, true, 'Should show error alert'); var alertErrorMessages = rowModalAfterValidation.querySelectorAll('[ref="messageRef"]'); _powerAssert.default.equal(alertErrorMessages.length, 1); var numberComponentError = rowModalAfterValidation.querySelector('.formio-component-number').querySelector('.error').textContent; //checking if error was shown for empty required field _powerAssert.default.equal(numberComponentError, 'Number is required'); var numberInput = rowModalAfterValidation.querySelector('[name="data[editGrid][0][number]"]'); numberInput.value = 123; //input value to make the field valid numberInput.dispatchEvent(inputEvent); setTimeout(function () { var rowModalWithValidFields = document.querySelector(".editgrid-row-modal-".concat(editGrid.id)); var alertErrorMessagesAfterInputtingValidValues = rowModalWithValidFields.querySelectorAll('[ref="messageRef"]'); _powerAssert.default.equal(alertErrorMessagesAfterInputtingValidValues.length, 0); //input values to make all row fields invalid var validNumberInput = rowModalWithValidFields.querySelector('[name="data[editGrid][0][number]"]'); validNumberInput.value = null; validNumberInput.dispatchEvent(inputEvent); var validTextInput = rowModalWithValidFields.querySelector('[name="data[editGrid][0][textField]"]'); validTextInput.value = ''; validTextInput.dispatchEvent(inputEvent); setTimeout(function () { var alertErrorMessagesAfterInputtingInvalidValues = document.querySelector(".editgrid-row-modal-".concat(editGrid.id)).querySelectorAll('[ref="messageRef"]'); _powerAssert.default.equal(alertErrorMessagesAfterInputtingInvalidValues.length, 2); document.body.innerHTML = ''; done(); }, 280); }, 240); }, 200); }, 160); }, 120); }, 80); }, 50); }).catch(function (err) { return done(err); }); }); it('Should not override calculated value', function (done) { var formElement = document.createElement('div'); var formWithCalculatedAmount = new _Webform.default(formElement); formWithCalculatedAmount.setForm(_formtest.formWithCalculatedValueWithoutOverriding).then(function () { var inputEvent = new Event('input'); var amountInput1 = formWithCalculatedAmount.element.querySelector('[name="data[amount1]"]'); var amountInput2 = formWithCalculatedAmount.element.querySelector('[name="data[amount2]"]'); amountInput1.value = 6; amountInput2.value = 4; amountInput1.disp