From 5c1ff57e7d3a5870c098538b50d789fa8702ed59 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Tue, 25 Jan 2022 04:43:28 -0500 Subject: [PATCH 01/11] Re-arranged get() method for Proxy object which is returned by a given computed field to ensure it returns the appropriate data (if any) --- src/mixins/computedFields.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/mixins/computedFields.js b/src/mixins/computedFields.js index 1939b9df7..c1c870fcd 100644 --- a/src/mixins/computedFields.js +++ b/src/mixins/computedFields.js @@ -6,15 +6,21 @@ export default { evaluateExpression(expression, type) { let value = null; - const merged = {}; - _.merge(merged, this.vdata, this._data); - try { + const self = this; + const merged = {}; + + _.merge({}, self.vdata, self._data); + //monitor if variable belongs to data (defined variables) or vdata (external variables) //in this way the event is not executed again when the variable is update const data = new Proxy(merged, { get(data, name) { - return data[name]; + if (undefined !== data[name]) { + return data[name]; + } + + return self.vdata[name]; }, set() { throw 'You are not allowed to set properties from inside an expression'; From 80eace4765dd1aaab193129d72d1f2463818da07 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Tue, 25 Jan 2022 13:04:04 -0500 Subject: [PATCH 02/11] Add reference to proper variable --- src/mixins/computedFields.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/computedFields.js b/src/mixins/computedFields.js index c1c870fcd..c620319b3 100644 --- a/src/mixins/computedFields.js +++ b/src/mixins/computedFields.js @@ -10,7 +10,7 @@ export default { const self = this; const merged = {}; - _.merge({}, self.vdata, self._data); + _.merge(merged, self.vdata, self._data); //monitor if variable belongs to data (defined variables) or vdata (external variables) //in this way the event is not executed again when the variable is update From bde7cf1bae2377b332f21a0ded14bed8cb93adc9 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Mon, 31 Jan 2022 12:51:17 -0500 Subject: [PATCH 03/11] Partial cypress test for bug found in FOUR-5139. Still incomplete. --- tests/e2e/specs/ComputedFields.spec.js | 32 ++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/e2e/specs/ComputedFields.spec.js b/tests/e2e/specs/ComputedFields.spec.js index 244ec02cd..30867504f 100644 --- a/tests/e2e/specs/ComputedFields.spec.js +++ b/tests/e2e/specs/ComputedFields.spec.js @@ -1,5 +1,33 @@ describe('Computed fields', () => { + it.only('Make sure new rows can be added to the loop, even with a javascript-driven computed field', () => { + cy.visit('/'); + + // Add a loop and configure it + cy.get('[data-cy=controls-FormLoop]').drag('[data-cy=screen-drop-zone]', 'bottom'); + cy.get('[data-cy=screen-element-container]').click(); + cy.get('[data-cy=inspector-source]').select('existing'); + cy.get('[data-cy=inspector-add]').click(); + + // Add input to loop + cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-element-container] .column-draggable div', 'bottom'); + + // Create a calculated property + cy.get('[data-cy="topbar-calcs"]').click(); + cy.get('[data-cy="calcs-add-property"]').click(); + cy.get('[data-cy="calcs-property-name"]').clear().type('loop_1'); + cy.get('[data-cy="calcs-property-description"]').clear().type('loop_1'); + cy.get('[data-cy="calcs-switch-javascript"]').click(); + cy.get('[data-cy="calcs-property-javascript"]').type(`let agents = this.loop_1; + +return (agents === undefined) ? [] : agents;`); + cy.get('[data-cy="calcs-button-save"]').click(); + cy.get('[data-cy="calcs-modal"] .close').click(); + + // Preview + cy.get('[data-cy=mode-preview]').click(); + }); + it('CRUD of computed fields', () => { cy.visit('/'); // Create a calculated property @@ -56,7 +84,7 @@ describe('Computed fields', () => { it('Create a javascript computed field', () => { cy.visit('/'); // Add an input field - cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-drop-zone]', 'bottom'); + cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-drop-zone]', 'bottom'); // Add a second input field cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-element-container]', 'bottom'); @@ -86,7 +114,7 @@ describe('Computed fields', () => { it('Create a computed field with formula', () => { cy.visit('/'); // Add an input field - cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-drop-zone]', 'bottom'); + cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-drop-zone]', 'bottom'); // Add a second input field cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-element-container]', 'bottom'); From 49e0fb278cfb1761fe478b33dabb2261788ddd67 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Fri, 11 Feb 2022 18:20:30 -0400 Subject: [PATCH 04/11] add the tests for the use cases --- tests/e2e/fixtures/FOUR-4853.json | 486 +++ tests/e2e/fixtures/FOUR-5086.json | 3826 +++++++++++++++++ tests/e2e/fixtures/FOUR-5161.json | 1111 +++++ .../e2e/specs/ValidationCalcsAndLoop.spec.js | 99 + 4 files changed, 5522 insertions(+) create mode 100644 tests/e2e/fixtures/FOUR-4853.json create mode 100644 tests/e2e/fixtures/FOUR-5086.json create mode 100644 tests/e2e/fixtures/FOUR-5161.json create mode 100644 tests/e2e/specs/ValidationCalcsAndLoop.spec.js diff --git a/tests/e2e/fixtures/FOUR-4853.json b/tests/e2e/fixtures/FOUR-4853.json new file mode 100644 index 000000000..e255c579e --- /dev/null +++ b/tests/e2e/fixtures/FOUR-4853.json @@ -0,0 +1,486 @@ +{ + "type": "screen_package", + "version": "2", + "screens": [ + { + "id": 14, + "screen_category_id": "1", + "title": "FOUR-4853", + "description": "test", + "type": "FORM", + "config": [ + { + "name": "FOUR-4853", + "items": [ + { + "label": "Line Input", + "config": { + "icon": "far fa-square", + "name": "foo.two", + "type": "text", + "label": "foo.two", + "helper": null, + "readonly": false, + "dataFormat": "string", + "validation": [], + "placeholder": null + }, + "component": "FormInput", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^(?:[A-Za-z])(?:[0-9A-Z_.a-z])*[^.]$\/|required|not_in:null,break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,class,const,enum,export,extends,import,super,true,false" + } + }, + { + "type": "FormInput", + "field": "label", + "config": { + "label": "Label", + "helper": "The label describes the field's name" + } + }, + { + "type": "FormMultiselect", + "field": "dataFormat", + "config": { + "name": "Data Type", + "label": "Data Type", + "helper": "The data type specifies what kind of data is stored in the variable.", + "options": [ + { + "value": "string", + "content": "Text" + }, + { + "value": "int", + "content": "Integer" + }, + { + "value": "currency", + "content": "Currency" + }, + { + "value": "percentage", + "content": "Percentage" + }, + { + "value": "float", + "content": "Decimal" + }, + { + "value": "datetime", + "content": "Datetime" + }, + { + "value": "date", + "content": "Date" + }, + { + "value": "password", + "content": "Password" + } + ], + "validation": "required" + } + }, + { + "type": { + "extends": { + "props": [ + "label", + "error", + "options", + "helper", + "name", + "value", + "selectedControl" + ], + "mixins": [ + { + "props": { + "validation": { + "type": null + }, + "validationData": { + "type": null + }, + "validationField": { + "type": null + }, + "validationMessages": { + "type": null + } + }, + "watch": { + "validationData": { + "deep": true + } + }, + "methods": [], + "computed": [] + } + ], + "methods": [], + "computed": [], + "_compiled": true, + "inheritAttrs": false, + "staticRenderFns": [] + }, + "computed": [], + "_compiled": true, + "staticRenderFns": [] + }, + "field": "dataMask", + "config": { + "name": "Data Format", + "label": "Data Format", + "helper": "The data format for the selected type." + } + }, + { + "type": "ValidationSelect", + "field": "validation", + "config": { + "label": "Validation Rules", + "helper": "The validation rules needed for this field" + } + }, + { + "type": "FormInput", + "field": "placeholder", + "config": { + "label": "Placeholder Text", + "helper": "The placeholder is what is shown in the field when no value is provided yet" + } + }, + { + "type": "FormInput", + "field": "helper", + "config": { + "label": "Helper Text", + "helper": "Help text is meant to provide additional guidance on the field's value" + } + }, + { + "type": "FormCheckbox", + "field": "readonly", + "config": { + "label": "Read Only", + "helper": null + } + }, + { + "type": "ColorSelect", + "field": "color", + "config": { + "label": "Text Color", + "helper": "Set the element's text color", + "options": [ + { + "value": "text-primary", + "content": "primary" + }, + { + "value": "text-secondary", + "content": "secondary" + }, + { + "value": "text-success", + "content": "success" + }, + { + "value": "text-danger", + "content": "danger" + }, + { + "value": "text-warning", + "content": "warning" + }, + { + "value": "text-info", + "content": "info" + }, + { + "value": "text-light", + "content": "light" + }, + { + "value": "text-dark", + "content": "dark" + } + ] + } + }, + { + "type": "ColorSelect", + "field": "bgcolor", + "config": { + "label": "Background Color", + "helper": "Set the element's background color", + "options": [ + { + "value": "alert alert-primary", + "content": "primary" + }, + { + "value": "alert alert-secondary", + "content": "secondary" + }, + { + "value": "alert alert-success", + "content": "success" + }, + { + "value": "alert alert-danger", + "content": "danger" + }, + { + "value": "alert alert-warning", + "content": "warning" + }, + { + "value": "alert alert-info", + "content": "info" + }, + { + "value": "alert alert-light", + "content": "light" + }, + { + "value": "alert alert-dark", + "content": "dark" + } + ] + } + }, + { + "type": { + "props": [ + "value", + "helper" + ], + "watch": { + "value": { + "immediate": true + } + }, + "methods": [], + "_scopeId": "data-v-172d71e1", + "computed": { + "effectiveValue": [] + }, + "_compiled": true, + "components": { + "MonacoEditor": { + "name": "monaco-editor", + "_Ctor": [], + "props": { + "amdRequire": [] + }, + "extends": { + "name": "MonacoEditor", + "model": { + "event": "change" + }, + "props": { + "theme": { + "default": "vs" + }, + "value": { + "required": true + }, + "options": [], + "language": [], + "original": [], + "amdRequire": [], + "diffEditor": { + "default": false + } + }, + "watch": { + "options": { + "deep": true, + "user": true + } + }, + "methods": [] + }, + "methods": [] + } + }, + "staticRenderFns": [] + }, + "field": "defaultValue", + "config": { + "label": "Default Value", + "helper": "The default value is pre populated using the existing request data. This feature will allow you to modify the value displayed on screen load if needed." + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
Date ##\/##\/####
SSN ###-##-####
Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + }, + { + "type": "FormInput", + "field": "ariaLabel", + "config": { + "label": "Aria Label", + "helper": "Attribute designed to help assistive technology (e.g. screen readers) attach a label" + } + }, + { + "type": "FormInput", + "field": "tabindex", + "config": { + "label": "Tab Order", + "helper": "Order in which a user will move focus from one control to another by pressing the Tab key", + "validation": "regex: [0-9]*" + } + } + ], + "editor-control": "FormInput", + "editor-component": "FormInput" + }, + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "

output: {{ output }}<\/p>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
Date ##\/##\/####
SSN ###-##-####
Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + }, + { + "type": "FormInput", + "field": "ariaLabel", + "config": { + "label": "Aria Label", + "helper": "Attribute designed to help assistive technology (e.g. screen readers) attach a label" + } + }, + { + "type": "FormInput", + "field": "tabindex", + "config": { + "label": "Tab Order", + "helper": "Order in which a user will move focus from one control to another by pressing the Tab key", + "validation": "regex: [0-9]*" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + } + ] + } + ], + "computed": [ + { + "id": 2, + "name": "test", + "type": "javascript", + "formula": "return this.foo.one;", + "property": "output" + } + ], + "custom_css": null, + "created_at": "2021-12-17T21:24:43+00:00", + "updated_at": "2021-12-17T21:26:25+00:00", + "status": "ACTIVE", + "key": null, + "watchers": [], + "categories": [ + { + "id": 1, + "name": "Uncategorized", + "status": "ACTIVE", + "is_system": 0, + "created_at": "2021-12-17T21:02:03+00:00", + "updated_at": "2021-12-17T21:02:03+00:00", + "pivot": { + "assignable_id": 14, + "category_id": 1, + "category_type": "ProcessMaker\\Models\\ScreenCategory" + } + } + ] + } + ], + "screen_categories": [], + "scripts": [] +} \ No newline at end of file diff --git a/tests/e2e/fixtures/FOUR-5086.json b/tests/e2e/fixtures/FOUR-5086.json new file mode 100644 index 000000000..1bcd738f0 --- /dev/null +++ b/tests/e2e/fixtures/FOUR-5086.json @@ -0,0 +1,3826 @@ +{ + "type": "screen_package", + "version": "2", + "screens": [ + { + "id": 2, + "screen_category_id": "1", + "title": "Screen Form Task Start", + "description": "Screen with calcs", + "type": "FORM", + "config": [ + { + "name": "Screen Form Task Start", + "items": [ + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "

    \n
  • Calc with control table<\/strong><\/span><\/li>\n<\/ul>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + }, + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "

    Books<\/strong><\/span><\/h4>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + }, + { + "label": "Select List", + "config": { + "icon": "fas fa-angle-double-down", + "name": "form_select_list_1", + "label": null, + "helper": null, + "options": { + "key": "value", + "value": "content", + "dataName": "response", + "jsonData": "[{\"value\":\"https:\/\/www.infobae.com\/new-resizer\/9gv8XYFq7qmOw86jtRR_u7AlDdI=\/420x630\/filters:format(jpg):quality(85)\/s3.amazonaws.com\/arc-wordpress-client-uploads\/infobae-wp\/wp-content\/uploads\/2016\/07\/20201800\/mejores-libros-Don-Quijote-sf.jpg\",\"content\":\"Don Quijote\"},{\"value\":\"data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wCEAAoHCBYWFRgWFhYZGRgYHB4cGhwaHBwaHh8aGhgaHB4eHh4eIS4lHh4rHxwcJzgmKy8xNTU1HCQ7QDszPy40NTEBDAwMEA8QHhISHjQkISs0NDQ0NDQ0NDQ0NDQ0NDQ0NDE0NDQ0NDQ0NDE0NDQ0NDQ0NDQ0MTQ0NDQ0NDQ0NDE0NP\/AABEIAQ4AuwMBIgACEQEDEQH\/xAAbAAACAwEBAQAAAAAAAAAAAAACAwEEBQAGB\/\/EAEAQAAEDAgQDBgQEBAQFBQAAAAEAAhEDIQQSMUFRYXEFBiKBkfATMqGxFELB0QdScuEzgpLxJWKio8IVJFRjsv\/EABoBAQEBAQEBAQAAAAAAAAAAAAEAAgMEBgX\/xAAlEQEBAAICAgICAQUAAAAAAAAAAQIREiEDMQRBIlEyE2FxocH\/2gAMAwEAAhEDEQA\/APaYWi3KLbCFZpUiNNOaHDiAOifSC88danL0Tcms6qOiGQkGaR+nHgpB92VetXaxskwBqYJQPxTQ4ibiCRyJsfVWr9Lci03fbf3CIOAm49wqIxTbgB0g5YLHSTAIAkXMGel1zscyPmiYBkEQSYvItdPHL9DlP20BCNrwqArtLg2832JAg72gaoq+JayA4nSbBxsNZIEAdVcadxbfUGy59SbxsqrXtdmibGCYIEgkEAmxuDolOxLAHmYDbEwYmYN4ve1t0aq5RYfUHBCXW0CQazQQC6HEwLanLm+0oW4lkhskkyR4XRYgG8RYx6hXGrlFlthdC9wOv2STiRJvGXUwYGm5EbjdScQ0zfTNP+Uw70JVxq5QTiPJQIvwSamKZ4rkkbAEk8hxv90XxmiQXAFok62EA\/QET1Vxq5T9iIlBliyNpkWMwSD1GoQuaUWGVLHAGUNSpef7Lo80h7De+iLDtZpVgfC7TaQD78kf4Np\/M\/1cf\/JUiVGd3FHaWsIPCOit0mqphgcoVxpOwW56FS5s7JT3Bs6Sdkx56o2\/0xzKgqVaecAHQGbmJsYnfn1AQMwTXWJdaIMiQG7T0sf3WhIgSuYzeUy2eqLjL7VnYUGTJDs+eRBghoZuCIy8eJS\/wjZuSZgyYuZJvaN4jgrzhw03XFPKrjKoYfs5oIcDOWYmHWJBiSJEQBxTa2Hzn5i3wlrgIu063OnkrIPDzCkxGpRyu9rjJ0rUMK1mYiPESdANXE6jUXtKh3ZwLiXEnMQSBDQS2Yktgk3F9fC3grTADoUwOCuV3va4460zHYBuhkgRryblFxeefFdTwo8PiccrHNnQ+ItJMjQ+Hbir7gPe6ktCrlapjjPpm\/gLv8UZxe0uiGgjNO4GvOUL8BDQ1rsoDXMFp8DotrqIAB9Z1Wi8jzSnD14q5ZLjipO7OEGDfNMkTadLEGNNCNAmMwcPL5udRFoytFr8Wz58grQZbiudqBvsrlkuOKvSwoYxrRBygDhoOC4tVhzLaIXToNlm3syaivlIQAK04JDxAPT35KpUniCbc1MHkmPEwYS8p9lRXMIJA4K6zqqmAb4fX7lXmpnpmjc21lDYIjf1RhlpH1QOPDopALVAMKS0m6giOYUhAcEUIGj0TWdVIp0+tlw53T3sOyVlKi8u\/v3hw+pTNLEZ6Zc14bTz5S12UyWOcIkaqxhe+GHqNqvIqsZRawvc+k+2fPfK1rjlAYSXaCV5TsTtenhu0O0XPZUdmfANNjqlw95ObKLcuN+C9F2t20zE4DGVGNcGijUZL2ljjFLNcETALz9Vu4xjbX7K7Zo4kE0HF7R+bI9rdSIDntAJ4gExvC0SvK\/wzbHZ9Li51Q\/9x4\/ReqJWb1Wo57Uk005vNSRKCQG8PdkQp3CaGX5pjnQqRK9WyS4qw95J+irvZ+6ErV3w0uLy0DgAd43Bkk6BBTecvjAmLjh767Lq2FaTmMz\/AFEX0kAGAdp1QPEC8CI9+i83iw8mOVuV3L6\/s10PMAb77QkFo9wmPZpZRl9wvRKNLGBJy7+yVfZU97qlg2mL3uI9P3Vss3WgZnOk2Clo+yUOQ016KQ+JCkM++qDLBjZDmnRHI9VAwFNaOCQ0iAnsclCY3iFzwnZlAqBQfI+7XePC4fHdomtXazPWOQw5wdlqVZuwED5h62XoO1e18PicDjX4d4e1tF4c4NIGY0jbxAEnKB9F7R9OmfyNt\/yj9lTr9nUHS11KmQSHOBa0gltgSCIJAMTqm2bE28f3I7fwtPBUWPxNJr2tdLXVGNIJe43BMjWV7DAYtlVgfTeHsJcA5sEHK4tJBFiJBuqZ7u4R0h2FoEc6TP2V\/B4OnRYKdJgYxpcQxogDO5zzHAS420EoujDIvdGuDURFkFA5oXkxClxCEgKRLjbolO\/RG9uq4gIJVRiU5gMpzr324KuD5TtxRUW9qV8QcfqnvSYCCsYarYfqrbXGOqq4Ztgri2Hge\/zf\/ddnjTPVyvi2YfEo+F38zYLrH+Y8UzvNWOAq4evRJaypUFOrSk5HAiQ5rDZjgAbtjbnI9\/SRi+zYEn4xgaT46K1O0examKr0n1w1lGg7Oym12dz3iIc8wA1oj5RM3k3W\/wBMsmu17+2RRdUq\/C+DnyCrVDcxzCQA8R0HAK12N2hUp9pVsCXuqUsgqUy9xc9tmy0ud4nN8R1JNgqOPpVHdsuFF7WVfwksc5uZs5jZw4e76K3\/AA9xDHVMR8Zpbjw6K5f8zmgwC0CA1gsC1oj5TcFqddD7Wv4j9p18Nhm1aNRzH5w0wGkFpa8mzmkbC60u3sdWw2BdVY8uqtFOC5ocS51RgLcrQJmSIEG9jN1i\/wAX2TgWDjVaP+h62e\/xyYM8qtA+mIpn9FSels\/ul3rZjafh8FVn+JTOrbxmbu5s77aGCgGMrf8AqQo\/Fd8E4c1cmVnzirkInJmy5SLT5rI7592ntqfj8D4MQyXPa0f4g3OX8zo1H5hz1Dux2+zHY2nUaMrxhajXsv4XitRiD+ZpkkH9Ua+4trje2K2OxNXD4d\/waGHOWrWa0Oe+pJGVmYFrWy10uIMxbUJXavdHEZHvpdoYxzwx2Vr3gtccpOWGhoExE7Sqf8KiGHG0H\/4jK\/iB4XZP+prvVfRXaaIvVM7jxPe\/tGvQrYNlKq5gr1WseMrHeHPTBLczTDoceIsEvvt2viMM7CilVI+LUFJ8tY6ZLBmu2zrnS3JI7\/PH4zs1v\/3T\/wByiLeqH+JQAf2fP\/yWE+TmT1TJ6TS7b7arYGpRdVeKuGqu+GXFrW1KbyCQSWgMe2A4kZQRl30Nbtzt3E0u0MPhWOZkrjMSWS5sZ5DSHAGzdxuo72YR\/aDqOGptf8NlQVa1ZzHNaAGOAYwuAzuIc7SQLSVW7xt\/4z2eeLH\/AP4qqkiaWNo9pOrVDRr0WUswyNexznfIybiPDmzbrzHYPb3a2MbUNJ+FZ8Nwa7OxzTJBNoDhaPqvpc7L5\/8Awsb4MTw\/EEDya390bmt6Wu17E9uV8Nh6DKrRWxtZ72MbMNLviOGckC1MAtiwsRpeNFvZuLy5nY1wf\/KylT+EDwDXNzkf5weixO1x\/wAbwuf5fguyf1xWnziPova1Ijki9KPOdjd4Hmu\/B4ljW4hgzNcyclRkA5mA3aYvl5HgQNt5IkkLxfbrM3bOEyjxNplzyNmxWifqPNe0eCffLgs5tShaNfXglwfcKTPC+6CTt9isylZwxs3yV2d1RwzCQ222yvgQthh9t93W4mrRquqvY7Duz0w0NjNmY7xSCSJYNI3W40W48Tzj6KHOhSx0lOwwWd3an4\/8dnpx8P4WTK75M05s0\/NG0Lu8HdF9XE0sXh6ooVmCHHJnDwNA4Bw2LmniCBsI9K2dArFIka9FqVmx5rvX3aqY2lTpuqNp5HB58BfLw1zY+YQ3xdUzvV2LVxeG+C1zGOc5rnOOYgZHhwAEXmOIXpKhlLa8yra0WxrsoLgA7kZHkSBPosPAd1WUsc\/FUyGCpTcx7ALZ3PY7O3YTldmHGDuV6Fz5Olt0LyZMfp+qzsvPdq91G1K34mhUfh8SBBe0BzXtsIqMNniABsbC9hFfH9n9puY5oxNCCIPw6Tqb3DcBzqhDSRYO2lerYXbwiq+7K5DTx\/eLuxUxOJw9cVWMGGcHNaWuJd42PMkOEXZFgdVHe7sDE4l+Fez4QGHqNqOzvcC4hzDlADDHym5O69UH8bI88Dl1VMjpXbMXsdxrfeDF15LtXsbE1MfQxLWU8mHDmwajg54c14mMkN+bSSvXve5CXngiXR0TVa7KSxoc7YOcWjXd0GPQryncju3icIKra3wiKj84cx7nQYAghzBw1lezcbc0JerfWhp53vN3fdiQx7H\/AA69B2em+JANiWOG7DAnpuJBRTx+KAyvwNRzxYmnUommTxDnPa5oPNsjmvUTZA52yS8p2L2C9tapicSWmvVbl8BJbTYIDWMJuTAEutcdSduqCIm2ysVXwIA\/2SSZ0Ezr781jK7pkA5vHzS\/D7Kebg3\/VV5j8qCuYU2E7D7LRY0FZ2GNh73WkwLbLn0LT6KG04lOL5G0IS3qpOpPAtCaXiEiI6InFOwa1oRNZe1wk0jFjoVZa4DySKqY0PzAsBIDTYFo8UgtmSLWcLHfzFWqcQabpDWvmBlMiIF5O+q1S9IPzIqjMbWxBIJpsEAkidTtBneI\/zcrw7EYmP8NhMCxcAJm4FyTa8+UbrWY0e\/sizCdNEFnh9b4byaYzj5GhwMyNyTFr8Pl5hDSNZtN5czM+QGMzNuIaJnQXzEzwMWhabqsCSEE7+9E9Dtm069cmHUGtEgXe2wkS60zYyBGxV97IGnuyms76qC+RoolhloQxx0U68FRxVQh7WMcC4jMROjQRtqJnXkVjPPHDG5Zeo1JtbMTogqNukDOLktdyAIOuok8NvZbSqh0Wsb3tHLhPJcfD8nx+b+NVxsKr0rG5SQ6ytVtZ4\/sk5PXgu+kQ2TNoAP04hKc3mPVPfTukujj9kaQsE6Wjr9lptfAWZgBIBiDcfVXi3ZMRzXnQlSXXQNBUvalOFQucRNgAT5zA+n2RxwJH19ZVNz8rsx0MDzBMesn0HFWc4Gtl8\/8ANz82Pn6tnrTWMmjqby6+kfcGPfkrVMhU6LoF4uZ9+UJ0iZlfveO5cJcvepv\/AC52HkyZChwifZQtcNZlRO5034rac0k6aKariF2YbIQ+ZlCRUmOSW9x0Kcx4iCgrFojgTspFvedlzHeqgs1v9FB1UUyDtyWPj2gVQS5zdIDSRJPgvGo0Mea1M1456rL7ZxDWS8va2GjMDOmaxFtTceh68PPjyx9bbwv5Iq9oZGh96jC8NORuZwk5bRr4om3FX8HROWXfMSTFrB14NzJE6rL7EqtqBzmODg0jQkiTPECYsbWutSm43taf0\/dcPi\/HxwvOTVp8l70slgvY8FUc0CI++isMpkA39eKTl4L3Oas+5KRB4R6KyWGeSq1Kdzb6oJ2CdYEe7rRA14rPwQEBaQAjdMAAw7GAurNMc00MSqjuCkQ9tvuhp0QLgAHoN1xeYmDrG2xjirFNqxMsM713r\/ScxhVkATC5jePVE57d910AGPHnuEbyCEuoYIPqeA58ue3SUQAm1\/7ISCY0Uvq5RofLW6kapNeiTF+fU8weGqM7lMbx9k2jUadCDZQTOvBLoUoLiTcgdLSpaw73\/wB1jx3K4y5TVRmUX2Sbpotskk36fquidfyXle2sQDUe1zCWhwb4mnKctPPYmzrj3depAN15fvC1735WFmYOzHODBAYwECND4vusZ3WmcpuUplRrLWYXZnEthtxlBM2uZC9F2bihUY1xdcEtMaZhebaAiDG2aF5fs\/EP+Ixj6RpuGYwILMoYRLXC2paI1uOC9ThGQweECSXWA1cZJ631XPC\/lYPHjZju1oEWVF8wB6H37urJaYvwVEOJAJG5jpJ0Xatwx++3mqzgmvd7lC5qiHBWa33vZXiPRUsJo3yV4m8JRrNOaF7UdMbLi1QVm0hFyYvInU39L8E8N81IYE5rYRjhjj\/GaSGjgns04oA2yNrloVApjdVoymAPCbf0nYDkfp9m1i4eJokgfLMSPPf90lz\/AIjTlPK4Ouha4JR7G8kRbGyq4KuSIdIcLEcxaRxB1HVP+KJiRPCYt0WfSS5u4gwLINpKKpopGnkpK7weKWxs9d016Xl1EXUXSsTtED4r3TeB6wP0DfVbmX1Xl8e\/O9zhfM9sdAQB\/wBLfqseSbjn5MtQykRmLp+QZDyc8scPQAE8nL0LCIiOQuvOVT4XRqRP01jjYLfqucWktg8ATAJ2kgGBzgrHjmra1hlvHUOIkCD79lV3snSeWkJeHfnJi7RoYI3c0jSDBYd5vpoS95EQN\/uusu27NKriVXc4\/wAye+oCfCZixgzfcdUnMOH3RUsdnCzSOC0XMmCAs3APENPJazKghaiAwEarnmE5rQgcwJARfzTTFh7shZSKcKeig5hEaoGEp4ZyUhq1obA4KnXpyZaYcN9QeRG\/3V4hV3ASs1RULnBwcRBHhfF5adCLXg346qRuIkkk6GDNwZFk7E0pGZs5htxHBDh3wZE5XfQn9zbr1XD5Hx55pJbrV30ZdHFsgX2CDORr0TX6W1SnOiN12SHTlcWiSAY2vFln4HPLs5vYwIjVwkdQG77aN3LGdqBkj5ncBp58PqViYjFPeZLiBcZW2EEg33Og5ckzG27O2h3g7QbSpPMmSC1oa0ucSRs1oJnnovN4fF58kseyTMPYWxDXGCdJtpMrSDABA+ghV8ZSzNMTIkth2U5o4oyw32zljyWWu9FZZ2mwMYx2bM4hp8JPygl+k\/ykeaw+z6FYMitVzvNyWNa0C2g8N+pCtU6Aa0NMuifE6CSXGSTAAuTsI5Ixws9s4Y3H29AztKlBioDGzZJudwLjzVHF9oFzw1lhEk7kaWj5b+ZjZU2Hbkgi8xrA+\/0v911kkbP7OqNzvBIEwGt0ktBcY42dp\/yq7A4BZDfAQ7bOHE8gACfQFanx2fzjzK55Tto3APsPe612cDusvBAQPJabdLIiWTohcLpdO6MzaEgbBumgmUDWo2ujVLNS03MpgQyCpK1EgET0SqoPC3RdWq5S2BOYweQgmfUAeaHOXCY1sN+Urn\/VxuXDfftSBY\/iUvE0rWsTrwPXgeah1L+yV2o8tovIEuyugSB4iCAJJAuYF+K1CzcP3gOTPUYWTu0h9pEE2Ea8wOKo9o9o1nuOV4YyDLQ2XzOodMRHLUJdN8tB2I3sfMJZp\/8AKBHykdPp9tF01Cq4XCBly4vcfzHWNhGg8gOaeCoLVMLQTdS5iIMU5VggyqS0IyLqIUkshKc6\/wDZGWocslSQGgyDdc2kRoTG0ifrupyHZCQeSN6TawTrN97K\/mhZ+C\/L5fZagbZYKKb9R70RGsQoayygsUlhlWUzfTQWKRTAF0yk4ypk5vopzTuoPD36riftslIqUmu1AMWnhx+yh7YADcoHCP2KlzoUZ99f7o1N712gEcf1Xne8GKzE0IhpjMZOhuLi7YOUzzbdb+LrhjXPdoBtvew87DqvGNxBc9xOpJJ6mT6LeMSwGz82xt5Rfr73hS4IRUUhy2S3tXNamlQEVIAXARcrqlmk2kAnWPrtfdVsNis0+E+GJu0m7ZuAZHpeLWhFqWtVBC5oKlwRsgAXOZBRhmilwuoFvbGifSo2Ex6pZMgiTy9nZFTqEADNpxH91i9lfwAs2eC1GEQsjA0yQOgWiKbxopLTRayY5nv9kmg8xB1RPeAQL3UBuG24XMMJRCNlipCqumx003RMN\/7pTyJuf29UYZpHqoDJA\/ZKzweSN3TRJHBSY3eSvmyU53zuG1pDZ4jU9QFiNbdX+0Kmao92w8P+k5VQJuu2PURzU0aJDHJzFUiBRBQ0LiCspNVjXCHAEWkEWtf7oWU2tENEAWHQaJhQwqpAUuXOsEBBKzaYsU27rjHuyQxxUnXqjaS5yVk5lMLbHeEvN19EBq4A2HQfZabKizsCPCOivjdRWg7hCW50qASjcVJzWH2ETGA6xyCAO59UZJ02UDmU4n90QA1gSktcRPRQDPIFLOjanRUHMg6\/r9ldcNtByKzSzI4jNqSWknUmTHXU845Eopjz+IBOY7FzncfmcXfqqharbrNF7W\/QBIcF1hDTaQmtfdA0oy5VRo1UkpIcjaUI1x4Im3CSToiYdkIvF1i3KAPmOXNJkEtJBAi+nJVuzKrnskuzABoDi0tJOQFxJ+V0n+Wwhamyr2AhoAA0AtA6BZs7OxMCF52UtKF9j71UgNf521S8w4lE4G\/X9EHw+J+imbWxhK0FrY1bJN955EbbkKw7HNa8tgk5mjrmiT0GYT1HFLw1MEtMCQBBV4UmnYXIJ6iI+w9Ey4qzL6om4jxhkXIBmev7KXViXEBphtiZEAwDpqbEevWHNw4zB0eKIkEi17RN9SliiMxdeeRIB6iYNuIV0Oy6VbM9zI+UC8ibgHTWLi6tudAnX6amEqnTaHFwmTrcwTAE5ZiYAEwjs6Lm1+vVYzt1+Pv\/AKZL9mth3kY05KXgAIKAjTXdSWG9\/ZVjy4\/l7QHDmb8dFm4xj3tjMBLmgDUklwyybZYN7XtrstQsEapFSjJBtDTO+sETzsU+qXjMVgS4gmo8kODgJhsgzBb0trunObJWl2lhyHnn4v8AVP8A5Aqi9sLtLuDRICnMOfoP3XOCWTdNB7SNj+n1UAwLIUxjLSsEybLmH1UMansp7+aLSEOseqWdUxzP7IMiyXGEp4uNCUwNKgMv1UiiDeOO6C\/FOezr90Hl9v3QLGxQfAHQfZWmVgNVRp9n0iWuaHtIjR5v\/VM5tN9EbhBjafsSotdtUDe6UalufSOizGV77+yifW1Umh8VcagmZWQK8GL+7p+fQo2mkzFQfNP+MDvusb8UJFvfqn3cAQY\/urLKSW\/oaaT6g1m3BVziBxVJrjFzqYQjDuM3FpnXbgiZcpLEPtN4IzD8o8UcOPlfyJWRW1Wo9sQNZ4rI+EZInQkelgt43SA7SEPw+AVivVLXECw2jp\/ukGsTufVb5DSpUwlXOS2qAwyQ0gSHQ2BI0ZLeBJzu0gKKWHrS3NXadM0MiYzCG38MgiXXu2wgwLbah4lSKzjAlFp0p\/g64Jc15JzRa0Me+mTGYEABrLiOJTvwlUh+esHSWWaMgLWuaXCDIEjNprbQKxfWd4\/VC6pEc1ndTnseX55Bs4ASQ1pcGQdCXEQ7cbaSYThqdYtbnqXyiWwJDiGzmcAJ\/MNNxrEqxnN9LImCSBa6UqNp1w3KarCY+YMAvlH5by2ZtIMRfc18PTxDXw6pLQ0G4BaSXVJGzrAsvOgA3JWuBZILp25+qgo0KFVuXPUDgDLhlJmc+jiRF3NOlgwBW49+yicFDSeP0\/ui0ybf\/9k=\",\"content\":\"El principito\"},{\"value\":\"data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wCEAAoHCBUVFRgWFhUYGRgaGhocHBgaGhwaGhwcGhkaGhgYGRgcIS4lHCErIRoaJjgmKy8xNTU1GiQ7QDs0Py40NTEBDAwMEA8QHhISHzQrJSw0NDQ0NDQ0NDQ0NDc0NDY0MTQ0NDQ0NDQ0MTQ0NDQ0NDQ0NDQ0NDQ2NDQ0NDQ0NDQ0NP\/AABEIAQMAwgMBIgACEQEDEQH\/xAAbAAABBQEBAAAAAAAAAAAAAAADAAIEBQYBB\/\/EAEUQAAIBAgQDBAcFBAgFBQAAAAECEQADBBIhMQVBUSJhcYEGEzKRobHBQlJy0fAUI5KyFRZTc4Ki0vEHJGPC4TM0Q2KT\/8QAGQEAAwEBAQAAAAAAAAAAAAAAAAECAwQF\/8QAKREAAgIBAgUEAwEBAQAAAAAAAAECEQMhMQQSMkFRE2FxgRQiMwWhkf\/aAAwDAQACEQMRAD8AmqtOCV0LQ8bcKW3cbhSR48qG6JSt0gyrTstZVuI3vVh\/WGS7LEKIChTIET9qK0HB3Z7SszSTOvmamM1J0bZMEoR5nRMCU8JXADTgDVGAstOyVyD1rvnQMWWlkrE4jil4OwFx4DNz7zFCHFb\/APav76x9ZeDuXAza3Ru8ldC1hV4vf\/tW+B+Yp78axB\/+Q+QUfIUesvAfgT8o28UorDf0ziP7Vvh+VO\/pnEf2je5fyo9ZeA\/An5RtstdisSON4j+0P8K\/6acOPYj7\/wDlT8qfrRF+Dk8o2kUorGjj9\/74\/hX8qm8L43de6iMVgkz2QORP0prLFkS4PJFNutDSZK4Up2Y1wsa0s5AZSm+romY00selFgDKUzLRwJ+NcK0wA5RXaJFKgdHAKruN3otunVatVWqLjX2\/D8qmWzLx9a+TNIK2vBF\/cJ4H5msxjOGNaW0zR+8QOI5KSw190+dazgy\/uE\/D+dY4lUju4xpwVeSWBXa6BXYrc885FKKcBSigEeb4p4c97sPOTTYp+ITMWHUny1kGmqpMTGyyfCCY8fpXIoxa31PcUpR7WhClSRTEd\/dtuN+8n4U7Lv3senMKPofdS5V2ZXqSvVDYpDw\/UTSVDI2gDWYPKBHf+fdXQu5jfv8ApPdT5Ur1FzSdUu5yKUUvV9+06yNiYn3GfKkV35b9NsoAA6660+ReQ9V+GcFT+Df+4t\/i\/wC01BCnTbvjbUH8h76mcEBF63P3v0TS5a7inPmg1XZm7iuEU+K4RXUeGDIrmWiRSK0ADQASJ5mnRNRrzkMf1yomEeTHdTALkpUTL312mSDUVnuNfb8vpWkVaznHP\/k8R8xUy6Wa4utfJG4tcJW2ucMqWgqnLlYdpsysJ3DKwHcBWh4UP3Nv8A+VZrGj2vx3B5S7fP51p+GD91b\/AAL8hWUN2dfF9CXuSYrsV2qn0h4ucKivkDqWynt5SCQSNMpkaGt0rPPLWKQqrs8RvZ0R7CqtwNldbmYAhcwVhlBEig8F429+7ctm0q+qYqzesLSZYdkZRzWl2sdHT6M2iZzP71\/01z+rFr7z+9f9NX0VRW+NPduOmHtq6oYd3cqpb7qwCT41HJHwb\/k5fLOf1Ztfef3r+VL+rFr77+9f9NEfj6pbuvdQ2zbfJkkMWYqrDKRoZmQemulNucae2iXL9kJbcgFlcsyZtVLrlGneDT9OPgPycvljD6MW\/vv\/AJfypp9GLf33\/wAv5UTivpCMPdRHQZLkEXA8wNiSscvHap1\/FuLqoqKwZGYN6yPZgEEZTzYUnjiuw1xOXyVv9WE++\/uFNPoun9o3uFNwvpOXR7n7O2S20OVdSy9TlIEipnFOPpatJfVc9tyACrQZIJGhHcfA0elHwH5WXyQ\/6rL\/AGh\/hH50TC+jmR1cXJykGMsTHKZqbh+JOXRHsuguAlXzKymBmjQyDFP4zxRcMmdkZlkA5csgnbRiKFji9kEuJy1TZOiuRVdheMo7qjI9t3XMgcCHG\/ZZSQfDemNx1PWtZ9XdLrqQFU6aGR2tdCPfV0YFnFLLQsDi1upnUMNWUhhlYFTBBFSIoAgYodryHyFPwK9ryp2KXteQ+VOwS9vyNAEzLXKJFKmSRwKzXHNn\/EPmK1AFZfjf2vxD51E+lm2HrXyiFjh7f42j\/MPpWswC\/u0\/Av8AKKx+PJjzuE\/\/AKPWzwg7CfhX5Cs8e7OvjOlBYrLf8Q\/\/AGyf3q\/yPWrqn9IuCtilVM4RVbN7MkmCBrMRB2iuiLp2ecN4Irj1nripb1i5SBCx6pAuWddpHjNVPoYP+Zxp\/wCof53q4HDLzOjvfUi3JCBMqlspUM3akxPWovDvR+7Ze46YgTcYs02wRJLHs9rTVjUp0minuXV+5mR8hllDjTkwXb5Vm\/8AhzH7M0b+sM\/wrFaDhOANlMhc3GLMzORBJdixJHnUC3wJ7Tu+GuhFc5nR0zpm+8moK7nTb4U70oXcqf8AiCkJZaNDc7R6nLCz5BhVh6ax+xP424\/jX6VPu8FR7L2rrM+c5mc6Nm5MsaLECBtyqJiOA3Lqol68Ht2yDlCZWfKIXO2Yg+QFCdU\/AV2INrhwxFm3bfRjhlIJ3Vgwyn8+4mheiWLc3VsXAQ9hLiEn7pa3lHlB16RWjGDcXg4dQgTIEycpBnNm3kdNvfXH4aBfN9IDm2UMiQdQVYgEbRHeI6Uls0xvczPomoNnGA7ZnnwyNNU0k8L12F8R4FTPxJrT4b0ZuIlxBiAEumXi32tdwpLQJmNqkcS9HA+HTDW3CIpBJKliSJ1mR1qlJX\/0TWg\/gWc5zdCyGtlI2ANtVUgnmdR4k0D04X\/lH\/En81SV4biCbQe6mS2VJVUZS+UQuYljtvRvSDhr4i0baMqyQSSCdjIiKmDp6jepnPSlstjBuvtqUynn7APzUUHil64mOvNbXM5sTExAyLLDqRExV2OAO5s+udClkDKiAjMQAMzEnuG1cvcIv\/tZxK+rIyZMjFtRESTl3oT0r2BrUu8MgAkfahj4kDX4UaKg8Kw11S7XSkuwyhJyqiqAFE+Z86sCKS2EyLiF7XuruDHbFdxBJYk867hfbFMZPilXYpUwIlZji25\/GPnWpArMcTEsO+4B86ifSa4OtFZix2P4v52ra4cdhfwj5VisX7CnqG+Lg\/WtvaHZHgPlWeLdnTxnTH7Kz0kv3Usl7LQ4IAGVWDSQIII36RUXhXHGuYL1xg3ACm0AvOVNO8lT51Z8VGif3tv+asnwHCOmJv4aP3du563\/ACn1Y9zKf8FbeThSD8D9Irn7NexN98+RsiplVQSQuXVROpb3VJF7FjCnFG92wvrPVZE9XkGpTbP7Mmc01mMBYZ+FXSv2bqufAKgJ8pnyrYYi+v8ARZadDho8ymUD3mKutfsXYgcb41ebDWsThnK5pzplRgMoYvMrOhU7HbWrK1xJsRbw921cZA9wI6gI2uViynMpIgruORqB6K4UpYwoce1cutB+61t408KhYTAvhMelhf8A0bj+sSeWVGEDvEx4ZaWjTrsFU0F43i8ZYS0xxDZrlwqU9XahFnQA5N461N41cxWHs3X\/AGhmyG2Uc27YkO2V0YBYMHWRG4oX\/EAaYb+9\/KrH02H\/ACVzxt\/zpQlsDejAYC5iGWy\/7Qz5hbd7Ztp7FwlZDKoIgj4Un4jdxGJexZf1aW\/bcBWZmmCBmBAEyNuVN9HrIsILzsxR7VkdozDSVyL3dpYHeajeiaFMXirb+1mLDvXOTPuZT51PZsb3JuOu4m0t6bshLWdHyKCSubMriIJ22A3FVzcbxKYa1iWdXVnyuhQDTtaqyxB7PPrWh9IHBw2IWRmFlzHOCrQY8j7qwaqws4VrrM2FLtmQQAjBmEkgSdJOs7NVJdwNRxvil5L+HS24CXuqKSuqjQ\/4udSLOPu3b962lxE9VlAQrOcxJZtZCzppt51A9KABicFG2YxG0ZrcV3jnBTed8RhnKXrbFWAMZioEEEbNljfQ6UJLS\/AvgkYniGKFtrgyKEsh2DITL9rOoOYRGUe+lw3it820v3SnqmVy+VGDIVBIM5iCDlPLmK6Mc2I4c9xh2jauTykqGBIHfE+dRMBaZ+FMq6nJc06w5JHwpVp90MmYXimJuWWxCogQZitshs7Ku\/bmAdDyq64fikvW0uIeywnvB5g94NU3o3cH7Ap5C3cB8s00vQXN+zSdi7R4QAfjND2+wLnEb+X1NLC+2POn4gajw+ppuH9sUgLCaVdilTAhVm8bq6\/3g+ZrTRWYxhh0\/vB8yKzn0muDrRV4nREHcPiltv8AurcoNB4Vg8Vsv4E\/kt1vlqMW7Onjdo\/ZGxuBW7llnXKwYZGy9obE9Yrr4FCXbUNcVVZlMNCzGo23o4cmYHmdp+Zp2Q82Plp8tfjW1HBZXcK4JawysiZsjbqzZl2gmD3aVGPo5hyAmZ\/VhswtesJtgzPs9J1jarlbSjkPmfeafRqFkK\/w1HZHl1Nv2ArFVGkHs7HTSj38KjlGYSUbMp6GCp94Jo8UgKKCyu4pwW1iCpuBzl9kB2AB6wOffRcdwxLqC25cqI+0RMbZiN6m0qYilHo5Y7GtwhCCim45VSp0hSYqRj+EW7rq5zI66B0Yo8dCRuPGrBq5S2HZWjg1vI6Euc+juXJdhEQW3iNIpqcAsiybHaNsmcpacpmZU7jWrSu0LQLKS56NWm9XL3D6v2Jf2YIIjTXYb9KO3Bll2W5cRrntlWHa0C6giAYG4g1ZswAJPLWkpBEjnSCyE3DE9T6hZRMuXsxOU6ESRzrvDOHLYTIjMVGoDQYkyYIFTaVOgspLnAFyuiXHS3cJL21y5TPtBSRKg9AatMJhltoqIIVRAFHpUd7CwOI5eBpmGHbFEvjbz+lDsntDxoGWUUq7mpUxURKymMcB0Y7C4CfAGa1dY7i+wjq3yNRk6Tfh1eRELED2fwp\/Kn5VvRWBuz2J+7b\/AJR+Xxrfis8Xc6OO2RkcZgWXEuyFllg0qSDJAJ286u7D3I9snuIU\/EAGiYlBn8gfmPpTFxCZsmYZhy51yTnNTaTo59HFaE1bx0kCnm4Y6UANpFEJFdMZNrcxaOO78iPdNFS7I2g9KSARSyRVpSTuwCIa7XFrta9iRrVyKca5FBQ2gXMbbUkM6gjcSJHsnbwZf4hUmsvxp\/2e+rl2CXNkUOe2D2jmGmsjQnlSAZ6ZvBtZrgRO2CJftE5fsoCTAn+Krbgl5Gtj1ZkeDLJ20zAdKzfpnZzWUdgc6uAJIkK6nNoD1VN+lWWA4hawyIbhZTcAUQrMJUSdF23ovQA+E9JA7tbCEOrOpEMwBBIXUDXUa1eoSdxGvWZ76w9rF5MdktKuR2BDkHUuMzwZjcnSt0tACrsUqVMAd\/l5\/Sg2faHiKLiDt5\/ShW\/aHiKALOlXaVMCGayOPu5GVt4ZpHltWurG8VJGXLuWZf4hB+tZ5NmbcN\/RFeCSFnkLdehCvPyPZj\/p\/L\/et+WA1JgdTUYe50cd2IePbKyNy1XzMEfI1AFpWctkRjmSGYbCGmCPAUT0gvBrLZDLAqRAJ5wdu4mq3D4wLbz7lcpIGugYof56wyprJa7o5or9S\/z6kQBEajvmdPIU9DVa2KBLHaFQ\/wATECjWblYyyuLVhyaFihoq1GtNUpRXfikpq0ZPQTMBXahcQ4eLuUkkFCSupEExqCNQdKJgywlWMlYk9Z2PwM++q5v25WgrSyRSpGkKYCNZ70ttlksgDX1yx\/C81oapuJ3M162jDKJDK0ggtqMpXddNj1NJuhJWZHCcHOQyurOMx2gZwdCfCKvOOYIEYcawrNEeAj5U3i2LdHTIwhOyQSDnmCcy9BAjzqdhcUL4WQAytOm0QRUPIuY05Go2AbDfvLCgTBdp5aZdfia0gqsuYcIAy+0FYKeQmJ08qi4Xi7i8iXB2XkKYIIYbCRoQdelHOuahKLasvqVKlWhILF6EL3T\/ABQRQrR7Q8aLieXmKDZPaXxpgWc0qVKmBFNZHiN0IysRMMxA74OUnumK1p2rF8Y+z+I\/Ss8nSzfhleRIho+iieYnyKx9a1XG+G3L2XJdyZd11AJ65hqOlY22e0PL516QKyxK07Orj\/1cWjPYbg720JIVj0U6+WYAUD+k7QaAQGGhzdlvDMdwe+Qe+tPeEq0dDp5VmeK4BnHaOc2z7RguFYNCtGjCQpneDUzwqP7Js44zcnTOOVdHFpFZ2AlZyXIUyCF9lwOqxXMBiTGV5DDcEFSPEGpz27fq1L2wsx2VEazAgDnzHOi5HUTBZQNC4GYd2fOG9+tZTgsmj7FKTjoHsXZ2+FTbLNzB8TA\/XuqDhsU7jRSI5NIPxUz7zUa7xkK4t51LlsuUSYPMEiOh0FaYkoKrf\/hnJWy+FNSJJ6wPd\/uaBhS8tmjTYidZGsipFdadqzOhGlSNcpDEay\/pChN4ET7CjfY5mINaW9dVRLGB1Pwqmsol1rh9qGgHwAEDwg1jmelIuGjspONqheFAkAZoOubn4b7VouE4TIg6nU1Du4Jf2gMeaqfMDL9KuQIFYrWRpOX6pHWAbeoz4JHMkajbuMyDpzp16+qas0eNM\/alyl1II7vnTck2Qk6I3Csc4drLksQSVc\/aGhC+Ik+6rms9fckhrerkysGfGRyG8+NXCYoBlRiM5EkDUDrr8vCtcc7Wopxp2h+J2FAQ9oeIouJOgqMhMjxrZEFzNKmyaVUSRjtWL4zsPxGtoaxPGzoPxGs8vSzq4T+qK22e0PL516OtebWz2h5fOvSVrLBszp\/0N19g8bi0tIXeYkCFBYksQoAA7yKqbOKW4z5UEZSqOJkopGZWHjMDkJqbxdoVJ29Zb\/ytm0\/hpLby3GMCD2vJhDe5tT3NV5LeiOCNLUPhDCDTaoeLwQvETnQhplWgsBsDyg8xFTjagQJ\/XKioOtRGMqUX2E3rZGS2c08ulAt2UDsIUsHZgSASpYySJ23qRdXLBDxPcCSOkflUW25e7mJEahAAdRpJJI1M+6okqVLeylqWtvUU6hYa6HQMpkHUHzohrrWxn3EaY7gCSQB1Ogp81QcbxTkm0iycsnXkRzrOcuVWXGPM6BcVvtdurZUaB1YkTpEyG5RrUrhSgF9dc7EiI1JNQMMly06uTmDhi86HsgtPvgVbYC3u59pzJ+gHdXO3zNGklSoFjVLXUAX2dS3v0qY7wCelFdaz\/G+MNbZUQZmJgganwgUONNkr9qXgrPSDiBfKgGjewYMlpHZA66j3ipPBcO72guRk3zO0iT2iDB15gf71Os4VMOoe4M92PHKYAOWdtIE1FxLtdCvdLBSSq20JVSFBZmck66CPMd9OopUzS322DjG2rC5EIe6RBZdQD47RPIdNaYb7W8Qhf7USTrqQVG22se+rHD4C06IUUBQBA+h99MxnC1clo1IA\/wDNJ3o60DmjsWOJOg8ajIdR4ig2Lbp2GfOoAyk+0IEQTz8d6Kp1HiK6ou0c7VFxNKuZqVWBHJ0rFcb2X8RraGsVxrYfiNZ5elnRwn9UVSHX9da9LU15kh1\/XWvS128qywdzq\/0O32QONrmCrznN4QCB86k4cllBPtD\/AGIPcfyoV22Scx3\/AFA\/XWj2TAioi5PM29jgbXKkcMgyu+xUnQ9ATyPQ+VFturggjX7SNv5jmKcyT49f1yqO6BjBPaXXMPaE7eX6766Xa2IO+pyf+miCfER5Df4UPGXXCFSVDv2VjlO5ieQmum027XWK9xCj\/KATUO+mViQADlUqSNdSQZ5z7OnhWE3Km0mXFK9Q3DlNslVkqAC3QE7ZR4bjw87NHDAEEEHYjaqzH2MlhkU9pwQW5tI7R067eYqbgbeVFX7oy+7Srx6fr4FLXUffmDl35VXWeGkEsSSx1JJ+vSrU0qcsak9QjJxWhW3LAE5ogiJ3OsaADrHwomGvqTGxiYJ8gKmFZoNzCoxkrNVGEYkylJnXedtfCIHjJqrw3DvUBnQZ3dpLRoJMlRJ0HfvtvVl+yISDlGmn6608AJoqnrpRKKewKTRBwmFckvcGvIGNKk3sOjABwNNQPn+u+iG71VhNBtlCdAemo99EcSQ3NtklMoGkQOkRWeuYhmuhBeLsLgyi3IABcuwukkKYQFQuu0xJEXlqwoERWdxaM2KQMOyrDK3q2txroouFWL+WUHrVNKmSrsvsSPnUdDqPEUbEpGuu\/WgIdR40JUMuKVcpVQEc1jON7D8R+tbMVjON+z\/i\/Os8mzN+F\/qinH0r0y2dB4CvMga9KsHsjwHyrLB3Ov8A0O32cKcv1FcTejMKERrWso62eYmOuvlRm6DTx5fGqzhVv1fbdyWuZ2ZiftSIj\/CNu6rHErKhepH5127bGUQAcvLu2PwJpa37JFWqM7jDde4zSVQZcqroVMkByebGfdpUhEukoXck28rHaGVmUt3yAJg9DvTrmKdLxXIMrCQCYMgbEiRyOlWOHhsoOhiY8SR5gbeYrCLcpU39Gj0WwS72riryAB+JJ+S++pFndh\/9vnrVRbxDm+MhB3Dr3BE1HTtQPfVsjakjYge\/UVtCrb9zOXYI1CKtOp06VxsSAYgnwpqYkExlIjnGla0ybCODpB8a6xyjcedNW4DuIpwAikM5avBtiP141DucQDMyI0ZSVZoGhCloGbQ7VJe4qoX2AXN00AmsH6MO7k3DqHuXCSx0RozTprqTvypN1qCVmg4D6RetdrblcwPYZdAw6QToef8AtWhjpFeb+kWFey9u4kKxcFmHs59WlSddt62XCuJtdHaSNjv8frQ5JV7j5WWhYAEk6CSSY0jeT3VlluI91ewqZ7gZLvq7il4bNAdgBLARruCYmrvEulxXsM4DOrIwU6iV1InxqMeFklQ+JuuFZWCEWgDkIKzlQGJHWqa0JRPxh086iLuPEVIxR0FRU3HiKSGXNKm0qoAdYzjns\/4\/zrYg1j+N+yfx\/nWeTZm\/Df1XyUimvSMMewv4V+VebLXo2DbsJ+Bf5RWeHudfH7R+yUDSYUwNT1Nb7nlgcPmbtsCv3VO4HU956cqkGmlopKOZ8h+udFUBCuWwTJ3Gknu\/8a+dOVAWUgjMpIIkbMdiPIHyqRdXQ94I+GlQ7QUMVGjECRz2AWem1YOCjLbc0TtHOG8PW0zuJ7cMSeXMr4SSZ745CrH1esg+I5Hv8acBXAI293Kt1GiG7FlFNBHKu5q4SBSGKgY3ElFlVzHTs9eo7qP300oCZ50R03E\/YqFvHEoyMrW5WCJ3B5jnHdWQucAxdh869qWAlZ1GaBmiCPZWfEVusXacEMiqx2luXfAruD9aM2cAyZGu2mw7tKpxW628CUnszF4\/gl3EMfVpk9XMozGMxAMIuwB8dx31ecB4fdW0yPIJ06FQd4jx0q3sYV1diXzKdgdwTyB6U58EDuT399LlVq3sO2CwHC0tsX1ZjuzEknxJqnRFa7lCqzC6XF0W39YQLhkZyIyiChObYQBqK0tsEAAmY51lURPXhgih\/WkFMtrKFzntBpz5o7XjOlDbdtglWxf4kmNY8qAh1HiKPijtUZD2h4igZcUqZNKmAwGsjxsdlvx\/nWrBrKcb2f8AF9aifSzXB\/RfJRqa9BwB\/dp+Bf5RXnimtUmKvrZtBAsnTMfugDLp1137u+ssKcnSO3\/QdRRopoimqTC8YDMqFZJkFhEAgkbVbqa6HFxep5aaew9NdT\/tRAaj3HygmY051z9pULmLACJJnSOs9KEBIoZQZpjXme4D84ptu8GEg6R86JSZQ+aWagXsQiAlmAA9\/kNzSt3ldQymQ2x\/W1GtWAQHnTABM8+tZnjPpcuHuOhtM2TKJBAHaUsBB7gfdRR6Uqbnq8hksF36mJqbouOOUtkXrYq1nyF1zj7PMT1p1nFI5YKZK76Ee6d\/KoWD4SLbl85YmZzanoBJ10FGxWHaOxoTzmPPStGo3SZlbJD3DqMpPhXEYmNCPGiAmNaaY21qbAczxQ3u+NcuLOxigZHEzDecGKRQ5T0LeOtUKXx+0hQ0sWI7dtbeVR7QTN2mn7wGvXlVzaL5u1oOg27qqGvIzoVuOTnU5XaYBLCAu26nvApsSLjEgACo6HtDxomKbagWz2h40kMts1doc0qoVglaszxvZ\/xfWtGrVmeNHR\/xfWon0s1wf0XyijWtvwzDq1lDEEoNR4Vhga13DWvG1byFAuXmCTz5z9Kywbs7uP6V8k5OHIFIie8aHTaIqTZxaDskwRpDbkAb94pthH+02Y+AHyovZmYk+H1rpbvfU8uvBDx7FxkkZSNzpVfhuDlgTPtKVg8hETpvB18qt8RicpHYJBG+nl9fhT7eIU8iPEflVJtR0FypvU7g8P6tAoJMczqa7iLRcRmIH\/1MT5jWus5A0ANRsWtxkIViCRy5ctDUK27G9iJibYtgBRLHm0tlUb6TJ328aDhvXEFS4Vcx1QZS07MemkCBU7Co+gftwNyAT76biQ09hOs7bysTqOWb4Vo5JaE1ZiPSFVW6yspclVzMXcZoGmYBhNahOFWZD5Dm0aczb77T1ov7IzHM9q2TpqRPSQddB7XwopW7B7KTpHTbWdetcfEQlk5eR1T19zXFKUG9dy2sXSRJFPtXVdQymQdjVOlp2PbbTtaKT5fCfcKlYO0ySA3Z5A8t9vM10aUTqHvY1EYIzgMRIB3ojXgBJM\/WoeM4ctyJJkfa57g\/Si+r+xGgG5p1GtBaitYzNJCNpy01oqXQfHpzFCt4dVBAmO8zSFpRyqXyjVhXaKzy4oPeREW37WctbBPZU6y8AbkTqavLyhlKsAwOhBEgjoQd6r7XCkR1dGdMoIyBpQqd1CtOUSAezG1IZIxJoKHUeNPxLUKz7QpoCyzUqZNKmAENVJxfDMyuVBJkGBvuOVW4auyKTVqhxk4yTXYxIwr\/AHH\/AITWj4Xhn9Wpzup+6SQBr0q1SKKsVMIcrtG2bO8sUmhtl8ogtND\/AKSXPkCOYA7cdnadDUqB0pBB0q\/k5gVjGhyQVKxsTEH3U5751yhe4k\/QUYIOldyDpQBWPauOe1eyiZhNPjzoiYeGDm4xbn3jXSOlT8g6UlUVVsKQz1w7\/dQi4PX3VKyjpSyiooojkj9A0Eu33Z8KnwKQAooCA9wjZGJ8NPPWj2LhgSpB5ipMCuUUBExN54hF1P2jsO+NzUWwt4ZczHTcyCT46VbTXDVJ0qFRHDnoaaWbp8akk0wtU0MCc3dTHRjzijMaYzUUAEWY7+811UinE0xmpgOzUqbNKgAAp9KlQA5aKtKlQATnThSpUEjhXaVKgDtcFKlQA4UjSpUAKu0qVAHa4K7SoA5SNKlQAw0w0qVADDTDSpUAMNNalSoKOVylSoGf\/9k=\",\"content\":\"El conde\"},{\"value\":\"https:\/\/i.blogs.es\/43a404\/91uo5gydkil\/450_1000.jpg\",\"content\":\"Harry potter\"}]", + "renderAs": "dropdown", + "editIndex": null, + "pmqlQuery": null, + "dataSource": "provideData", + "optionsList": [ + { + "value": "https:\/\/www.infobae.com\/new-resizer\/9gv8XYFq7qmOw86jtRR_u7AlDdI=\/420x630\/filters:format(jpg):quality(85)\/s3.amazonaws.com\/arc-wordpress-client-uploads\/infobae-wp\/wp-content\/uploads\/2016\/07\/20201800\/mejores-libros-Don-Quijote-sf.jpg", + "content": "Don Quijote" + }, + { + "value": "data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wCEAAoHCBYWFRgWFhYZGRgYHB4cGhwaHBwaHh8aGhgaHB4eHh4eIS4lHh4rHxwcJzgmKy8xNTU1HCQ7QDszPy40NTEBDAwMEA8QHhISHjQkISs0NDQ0NDQ0NDQ0NDQ0NDQ0NDE0NDQ0NDQ0NDE0NDQ0NDQ0NDQ0MTQ0NDQ0NDQ0NDE0NP\/AABEIAQ4AuwMBIgACEQEDEQH\/xAAbAAACAwEBAQAAAAAAAAAAAAACAwEEBQAGB\/\/EAEAQAAEDAgQDBgQEBAQFBQAAAAEAAhEDIQQSMUFRYXEFBiKBkfATMqGxFELB0QdScuEzgpLxJWKio8IVJFRjsv\/EABoBAQEBAQEBAQAAAAAAAAAAAAEAAgMEBgX\/xAAlEQEBAAICAgICAQUAAAAAAAAAAQIREiEDMQRBIlEyE2FxocH\/2gAMAwEAAhEDEQA\/APaYWi3KLbCFZpUiNNOaHDiAOifSC88danL0Tcms6qOiGQkGaR+nHgpB92VetXaxskwBqYJQPxTQ4ibiCRyJsfVWr9Lci03fbf3CIOAm49wqIxTbgB0g5YLHSTAIAkXMGel1zscyPmiYBkEQSYvItdPHL9DlP20BCNrwqArtLg2832JAg72gaoq+JayA4nSbBxsNZIEAdVcadxbfUGy59SbxsqrXtdmibGCYIEgkEAmxuDolOxLAHmYDbEwYmYN4ve1t0aq5RYfUHBCXW0CQazQQC6HEwLanLm+0oW4lkhskkyR4XRYgG8RYx6hXGrlFlthdC9wOv2STiRJvGXUwYGm5EbjdScQ0zfTNP+Uw70JVxq5QTiPJQIvwSamKZ4rkkbAEk8hxv90XxmiQXAFok62EA\/QET1Vxq5T9iIlBliyNpkWMwSD1GoQuaUWGVLHAGUNSpef7Lo80h7De+iLDtZpVgfC7TaQD78kf4Np\/M\/1cf\/JUiVGd3FHaWsIPCOit0mqphgcoVxpOwW56FS5s7JT3Bs6Sdkx56o2\/0xzKgqVaecAHQGbmJsYnfn1AQMwTXWJdaIMiQG7T0sf3WhIgSuYzeUy2eqLjL7VnYUGTJDs+eRBghoZuCIy8eJS\/wjZuSZgyYuZJvaN4jgrzhw03XFPKrjKoYfs5oIcDOWYmHWJBiSJEQBxTa2Hzn5i3wlrgIu063OnkrIPDzCkxGpRyu9rjJ0rUMK1mYiPESdANXE6jUXtKh3ZwLiXEnMQSBDQS2Yktgk3F9fC3grTADoUwOCuV3va4460zHYBuhkgRryblFxeefFdTwo8PiccrHNnQ+ItJMjQ+Hbir7gPe6ktCrlapjjPpm\/gLv8UZxe0uiGgjNO4GvOUL8BDQ1rsoDXMFp8DotrqIAB9Z1Wi8jzSnD14q5ZLjipO7OEGDfNMkTadLEGNNCNAmMwcPL5udRFoytFr8Wz58grQZbiudqBvsrlkuOKvSwoYxrRBygDhoOC4tVhzLaIXToNlm3syaivlIQAK04JDxAPT35KpUniCbc1MHkmPEwYS8p9lRXMIJA4K6zqqmAb4fX7lXmpnpmjc21lDYIjf1RhlpH1QOPDopALVAMKS0m6giOYUhAcEUIGj0TWdVIp0+tlw53T3sOyVlKi8u\/v3hw+pTNLEZ6Zc14bTz5S12UyWOcIkaqxhe+GHqNqvIqsZRawvc+k+2fPfK1rjlAYSXaCV5TsTtenhu0O0XPZUdmfANNjqlw95ObKLcuN+C9F2t20zE4DGVGNcGijUZL2ljjFLNcETALz9Vu4xjbX7K7Zo4kE0HF7R+bI9rdSIDntAJ4gExvC0SvK\/wzbHZ9Li51Q\/9x4\/ReqJWb1Wo57Uk005vNSRKCQG8PdkQp3CaGX5pjnQqRK9WyS4qw95J+irvZ+6ErV3w0uLy0DgAd43Bkk6BBTecvjAmLjh767Lq2FaTmMz\/AFEX0kAGAdp1QPEC8CI9+i83iw8mOVuV3L6\/s10PMAb77QkFo9wmPZpZRl9wvRKNLGBJy7+yVfZU97qlg2mL3uI9P3Vss3WgZnOk2Clo+yUOQ016KQ+JCkM++qDLBjZDmnRHI9VAwFNaOCQ0iAnsclCY3iFzwnZlAqBQfI+7XePC4fHdomtXazPWOQw5wdlqVZuwED5h62XoO1e18PicDjX4d4e1tF4c4NIGY0jbxAEnKB9F7R9OmfyNt\/yj9lTr9nUHS11KmQSHOBa0gltgSCIJAMTqm2bE28f3I7fwtPBUWPxNJr2tdLXVGNIJe43BMjWV7DAYtlVgfTeHsJcA5sEHK4tJBFiJBuqZ7u4R0h2FoEc6TP2V\/B4OnRYKdJgYxpcQxogDO5zzHAS420EoujDIvdGuDURFkFA5oXkxClxCEgKRLjbolO\/RG9uq4gIJVRiU5gMpzr324KuD5TtxRUW9qV8QcfqnvSYCCsYarYfqrbXGOqq4Ztgri2Hge\/zf\/ddnjTPVyvi2YfEo+F38zYLrH+Y8UzvNWOAq4evRJaypUFOrSk5HAiQ5rDZjgAbtjbnI9\/SRi+zYEn4xgaT46K1O0examKr0n1w1lGg7Oym12dz3iIc8wA1oj5RM3k3W\/wBMsmu17+2RRdUq\/C+DnyCrVDcxzCQA8R0HAK12N2hUp9pVsCXuqUsgqUy9xc9tmy0ud4nN8R1JNgqOPpVHdsuFF7WVfwksc5uZs5jZw4e76K3\/AA9xDHVMR8Zpbjw6K5f8zmgwC0CA1gsC1oj5TcFqddD7Wv4j9p18Nhm1aNRzH5w0wGkFpa8mzmkbC60u3sdWw2BdVY8uqtFOC5ocS51RgLcrQJmSIEG9jN1i\/wAX2TgWDjVaP+h62e\/xyYM8qtA+mIpn9FSels\/ul3rZjafh8FVn+JTOrbxmbu5s77aGCgGMrf8AqQo\/Fd8E4c1cmVnzirkInJmy5SLT5rI7592ntqfj8D4MQyXPa0f4g3OX8zo1H5hz1Dux2+zHY2nUaMrxhajXsv4XitRiD+ZpkkH9Ua+4trje2K2OxNXD4d\/waGHOWrWa0Oe+pJGVmYFrWy10uIMxbUJXavdHEZHvpdoYxzwx2Vr3gtccpOWGhoExE7Sqf8KiGHG0H\/4jK\/iB4XZP+prvVfRXaaIvVM7jxPe\/tGvQrYNlKq5gr1WseMrHeHPTBLczTDoceIsEvvt2viMM7CilVI+LUFJ8tY6ZLBmu2zrnS3JI7\/PH4zs1v\/3T\/wByiLeqH+JQAf2fP\/yWE+TmT1TJ6TS7b7arYGpRdVeKuGqu+GXFrW1KbyCQSWgMe2A4kZQRl30Nbtzt3E0u0MPhWOZkrjMSWS5sZ5DSHAGzdxuo72YR\/aDqOGptf8NlQVa1ZzHNaAGOAYwuAzuIc7SQLSVW7xt\/4z2eeLH\/AP4qqkiaWNo9pOrVDRr0WUswyNexznfIybiPDmzbrzHYPb3a2MbUNJ+FZ8Nwa7OxzTJBNoDhaPqvpc7L5\/8Awsb4MTw\/EEDya390bmt6Wu17E9uV8Nh6DKrRWxtZ72MbMNLviOGckC1MAtiwsRpeNFvZuLy5nY1wf\/KylT+EDwDXNzkf5weixO1x\/wAbwuf5fguyf1xWnziPova1Ijki9KPOdjd4Hmu\/B4ljW4hgzNcyclRkA5mA3aYvl5HgQNt5IkkLxfbrM3bOEyjxNplzyNmxWifqPNe0eCffLgs5tShaNfXglwfcKTPC+6CTt9isylZwxs3yV2d1RwzCQ222yvgQthh9t93W4mrRquqvY7Duz0w0NjNmY7xSCSJYNI3W40W48Tzj6KHOhSx0lOwwWd3an4\/8dnpx8P4WTK75M05s0\/NG0Lu8HdF9XE0sXh6ooVmCHHJnDwNA4Bw2LmniCBsI9K2dArFIka9FqVmx5rvX3aqY2lTpuqNp5HB58BfLw1zY+YQ3xdUzvV2LVxeG+C1zGOc5rnOOYgZHhwAEXmOIXpKhlLa8yra0WxrsoLgA7kZHkSBPosPAd1WUsc\/FUyGCpTcx7ALZ3PY7O3YTldmHGDuV6Fz5Olt0LyZMfp+qzsvPdq91G1K34mhUfh8SBBe0BzXtsIqMNniABsbC9hFfH9n9puY5oxNCCIPw6Tqb3DcBzqhDSRYO2lerYXbwiq+7K5DTx\/eLuxUxOJw9cVWMGGcHNaWuJd42PMkOEXZFgdVHe7sDE4l+Fez4QGHqNqOzvcC4hzDlADDHym5O69UH8bI88Dl1VMjpXbMXsdxrfeDF15LtXsbE1MfQxLWU8mHDmwajg54c14mMkN+bSSvXve5CXngiXR0TVa7KSxoc7YOcWjXd0GPQryncju3icIKra3wiKj84cx7nQYAghzBw1lezcbc0JerfWhp53vN3fdiQx7H\/AA69B2em+JANiWOG7DAnpuJBRTx+KAyvwNRzxYmnUommTxDnPa5oPNsjmvUTZA52yS8p2L2C9tapicSWmvVbl8BJbTYIDWMJuTAEutcdSduqCIm2ysVXwIA\/2SSZ0Ezr781jK7pkA5vHzS\/D7Kebg3\/VV5j8qCuYU2E7D7LRY0FZ2GNh73WkwLbLn0LT6KG04lOL5G0IS3qpOpPAtCaXiEiI6InFOwa1oRNZe1wk0jFjoVZa4DySKqY0PzAsBIDTYFo8UgtmSLWcLHfzFWqcQabpDWvmBlMiIF5O+q1S9IPzIqjMbWxBIJpsEAkidTtBneI\/zcrw7EYmP8NhMCxcAJm4FyTa8+UbrWY0e\/sizCdNEFnh9b4byaYzj5GhwMyNyTFr8Pl5hDSNZtN5czM+QGMzNuIaJnQXzEzwMWhabqsCSEE7+9E9Dtm069cmHUGtEgXe2wkS60zYyBGxV97IGnuyms76qC+RoolhloQxx0U68FRxVQh7WMcC4jMROjQRtqJnXkVjPPHDG5Zeo1JtbMTogqNukDOLktdyAIOuok8NvZbSqh0Wsb3tHLhPJcfD8nx+b+NVxsKr0rG5SQ6ytVtZ4\/sk5PXgu+kQ2TNoAP04hKc3mPVPfTukujj9kaQsE6Wjr9lptfAWZgBIBiDcfVXi3ZMRzXnQlSXXQNBUvalOFQucRNgAT5zA+n2RxwJH19ZVNz8rsx0MDzBMesn0HFWc4Gtl8\/8ANz82Pn6tnrTWMmjqby6+kfcGPfkrVMhU6LoF4uZ9+UJ0iZlfveO5cJcvepv\/AC52HkyZChwifZQtcNZlRO5034rac0k6aKariF2YbIQ+ZlCRUmOSW9x0Kcx4iCgrFojgTspFvedlzHeqgs1v9FB1UUyDtyWPj2gVQS5zdIDSRJPgvGo0Mea1M1456rL7ZxDWS8va2GjMDOmaxFtTceh68PPjyx9bbwv5Iq9oZGh96jC8NORuZwk5bRr4om3FX8HROWXfMSTFrB14NzJE6rL7EqtqBzmODg0jQkiTPECYsbWutSm43taf0\/dcPi\/HxwvOTVp8l70slgvY8FUc0CI++isMpkA39eKTl4L3Oas+5KRB4R6KyWGeSq1Kdzb6oJ2CdYEe7rRA14rPwQEBaQAjdMAAw7GAurNMc00MSqjuCkQ9tvuhp0QLgAHoN1xeYmDrG2xjirFNqxMsM713r\/ScxhVkATC5jePVE57d910AGPHnuEbyCEuoYIPqeA58ue3SUQAm1\/7ISCY0Uvq5RofLW6kapNeiTF+fU8weGqM7lMbx9k2jUadCDZQTOvBLoUoLiTcgdLSpaw73\/wB1jx3K4y5TVRmUX2Sbpotskk36fquidfyXle2sQDUe1zCWhwb4mnKctPPYmzrj3depAN15fvC1735WFmYOzHODBAYwECND4vusZ3WmcpuUplRrLWYXZnEthtxlBM2uZC9F2bihUY1xdcEtMaZhebaAiDG2aF5fs\/EP+Ixj6RpuGYwILMoYRLXC2paI1uOC9ThGQweECSXWA1cZJ631XPC\/lYPHjZju1oEWVF8wB6H37urJaYvwVEOJAJG5jpJ0Xatwx++3mqzgmvd7lC5qiHBWa33vZXiPRUsJo3yV4m8JRrNOaF7UdMbLi1QVm0hFyYvInU39L8E8N81IYE5rYRjhjj\/GaSGjgns04oA2yNrloVApjdVoymAPCbf0nYDkfp9m1i4eJokgfLMSPPf90lz\/AIjTlPK4Ouha4JR7G8kRbGyq4KuSIdIcLEcxaRxB1HVP+KJiRPCYt0WfSS5u4gwLINpKKpopGnkpK7weKWxs9d016Xl1EXUXSsTtED4r3TeB6wP0DfVbmX1Xl8e\/O9zhfM9sdAQB\/wBLfqseSbjn5MtQykRmLp+QZDyc8scPQAE8nL0LCIiOQuvOVT4XRqRP01jjYLfqucWktg8ATAJ2kgGBzgrHjmra1hlvHUOIkCD79lV3snSeWkJeHfnJi7RoYI3c0jSDBYd5vpoS95EQN\/uusu27NKriVXc4\/wAye+oCfCZixgzfcdUnMOH3RUsdnCzSOC0XMmCAs3APENPJazKghaiAwEarnmE5rQgcwJARfzTTFh7shZSKcKeig5hEaoGEp4ZyUhq1obA4KnXpyZaYcN9QeRG\/3V4hV3ASs1RULnBwcRBHhfF5adCLXg346qRuIkkk6GDNwZFk7E0pGZs5htxHBDh3wZE5XfQn9zbr1XD5Hx55pJbrV30ZdHFsgX2CDORr0TX6W1SnOiN12SHTlcWiSAY2vFln4HPLs5vYwIjVwkdQG77aN3LGdqBkj5ncBp58PqViYjFPeZLiBcZW2EEg33Og5ckzG27O2h3g7QbSpPMmSC1oa0ucSRs1oJnnovN4fF58kseyTMPYWxDXGCdJtpMrSDABA+ghV8ZSzNMTIkth2U5o4oyw32zljyWWu9FZZ2mwMYx2bM4hp8JPygl+k\/ykeaw+z6FYMitVzvNyWNa0C2g8N+pCtU6Aa0NMuifE6CSXGSTAAuTsI5Ixws9s4Y3H29AztKlBioDGzZJudwLjzVHF9oFzw1lhEk7kaWj5b+ZjZU2Hbkgi8xrA+\/0v911kkbP7OqNzvBIEwGt0ktBcY42dp\/yq7A4BZDfAQ7bOHE8gACfQFanx2fzjzK55Tto3APsPe612cDusvBAQPJabdLIiWTohcLpdO6MzaEgbBumgmUDWo2ujVLNS03MpgQyCpK1EgET0SqoPC3RdWq5S2BOYweQgmfUAeaHOXCY1sN+Urn\/VxuXDfftSBY\/iUvE0rWsTrwPXgeah1L+yV2o8tovIEuyugSB4iCAJJAuYF+K1CzcP3gOTPUYWTu0h9pEE2Ea8wOKo9o9o1nuOV4YyDLQ2XzOodMRHLUJdN8tB2I3sfMJZp\/8AKBHykdPp9tF01Cq4XCBly4vcfzHWNhGg8gOaeCoLVMLQTdS5iIMU5VggyqS0IyLqIUkshKc6\/wDZGWocslSQGgyDdc2kRoTG0ifrupyHZCQeSN6TawTrN97K\/mhZ+C\/L5fZagbZYKKb9R70RGsQoayygsUlhlWUzfTQWKRTAF0yk4ypk5vopzTuoPD36riftslIqUmu1AMWnhx+yh7YADcoHCP2KlzoUZ99f7o1N712gEcf1Xne8GKzE0IhpjMZOhuLi7YOUzzbdb+LrhjXPdoBtvew87DqvGNxBc9xOpJJ6mT6LeMSwGz82xt5Rfr73hS4IRUUhy2S3tXNamlQEVIAXARcrqlmk2kAnWPrtfdVsNis0+E+GJu0m7ZuAZHpeLWhFqWtVBC5oKlwRsgAXOZBRhmilwuoFvbGifSo2Ex6pZMgiTy9nZFTqEADNpxH91i9lfwAs2eC1GEQsjA0yQOgWiKbxopLTRayY5nv9kmg8xB1RPeAQL3UBuG24XMMJRCNlipCqumx003RMN\/7pTyJuf29UYZpHqoDJA\/ZKzweSN3TRJHBSY3eSvmyU53zuG1pDZ4jU9QFiNbdX+0Kmao92w8P+k5VQJuu2PURzU0aJDHJzFUiBRBQ0LiCspNVjXCHAEWkEWtf7oWU2tENEAWHQaJhQwqpAUuXOsEBBKzaYsU27rjHuyQxxUnXqjaS5yVk5lMLbHeEvN19EBq4A2HQfZabKizsCPCOivjdRWg7hCW50qASjcVJzWH2ETGA6xyCAO59UZJ02UDmU4n90QA1gSktcRPRQDPIFLOjanRUHMg6\/r9ldcNtByKzSzI4jNqSWknUmTHXU845Eopjz+IBOY7FzncfmcXfqqharbrNF7W\/QBIcF1hDTaQmtfdA0oy5VRo1UkpIcjaUI1x4Im3CSToiYdkIvF1i3KAPmOXNJkEtJBAi+nJVuzKrnskuzABoDi0tJOQFxJ+V0n+Wwhamyr2AhoAA0AtA6BZs7OxMCF52UtKF9j71UgNf521S8w4lE4G\/X9EHw+J+imbWxhK0FrY1bJN955EbbkKw7HNa8tgk5mjrmiT0GYT1HFLw1MEtMCQBBV4UmnYXIJ6iI+w9Ey4qzL6om4jxhkXIBmev7KXViXEBphtiZEAwDpqbEevWHNw4zB0eKIkEi17RN9SliiMxdeeRIB6iYNuIV0Oy6VbM9zI+UC8ibgHTWLi6tudAnX6amEqnTaHFwmTrcwTAE5ZiYAEwjs6Lm1+vVYzt1+Pv\/AKZL9mth3kY05KXgAIKAjTXdSWG9\/ZVjy4\/l7QHDmb8dFm4xj3tjMBLmgDUklwyybZYN7XtrstQsEapFSjJBtDTO+sETzsU+qXjMVgS4gmo8kODgJhsgzBb0trunObJWl2lhyHnn4v8AVP8A5Aqi9sLtLuDRICnMOfoP3XOCWTdNB7SNj+n1UAwLIUxjLSsEybLmH1UMansp7+aLSEOseqWdUxzP7IMiyXGEp4uNCUwNKgMv1UiiDeOO6C\/FOezr90Hl9v3QLGxQfAHQfZWmVgNVRp9n0iWuaHtIjR5v\/VM5tN9EbhBjafsSotdtUDe6UalufSOizGV77+yifW1Umh8VcagmZWQK8GL+7p+fQo2mkzFQfNP+MDvusb8UJFvfqn3cAQY\/urLKSW\/oaaT6g1m3BVziBxVJrjFzqYQjDuM3FpnXbgiZcpLEPtN4IzD8o8UcOPlfyJWRW1Wo9sQNZ4rI+EZInQkelgt43SA7SEPw+AVivVLXECw2jp\/ukGsTufVb5DSpUwlXOS2qAwyQ0gSHQ2BI0ZLeBJzu0gKKWHrS3NXadM0MiYzCG38MgiXXu2wgwLbah4lSKzjAlFp0p\/g64Jc15JzRa0Me+mTGYEABrLiOJTvwlUh+esHSWWaMgLWuaXCDIEjNprbQKxfWd4\/VC6pEc1ndTnseX55Bs4ASQ1pcGQdCXEQ7cbaSYThqdYtbnqXyiWwJDiGzmcAJ\/MNNxrEqxnN9LImCSBa6UqNp1w3KarCY+YMAvlH5by2ZtIMRfc18PTxDXw6pLQ0G4BaSXVJGzrAsvOgA3JWuBZILp25+qgo0KFVuXPUDgDLhlJmc+jiRF3NOlgwBW49+yicFDSeP0\/ui0ybf\/9k=", + "content": "El principito" + }, + { + "value": "data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wCEAAoHCBUVFRgWFhUYGRgaGhocHBgaGhwaGhwcGhkaGhgYGRgcIS4lHCErIRoaJjgmKy8xNTU1GiQ7QDs0Py40NTEBDAwMEA8QHhISHzQrJSw0NDQ0NDQ0NDQ0NDc0NDY0MTQ0NDQ0NDQ0MTQ0NDQ0NDQ0NDQ0NDQ2NDQ0NDQ0NDQ0NP\/AABEIAQMAwgMBIgACEQEDEQH\/xAAbAAABBQEBAAAAAAAAAAAAAAADAAIEBQYBB\/\/EAEUQAAIBAgQDBAcFBAgFBQAAAAECEQADBBIhMQVBUSJhcYEGEzKRobHBQlJy0fAUI5KyFRZTc4Ki0vEHJGPC4TM0Q2KT\/8QAGQEAAwEBAQAAAAAAAAAAAAAAAAECAwQF\/8QAKREAAgIBAgUEAwEBAQAAAAAAAAECEQMhMQQSMkFRE2FxgRQiMwWhkf\/aAAwDAQACEQMRAD8AmqtOCV0LQ8bcKW3cbhSR48qG6JSt0gyrTstZVuI3vVh\/WGS7LEKIChTIET9qK0HB3Z7SszSTOvmamM1J0bZMEoR5nRMCU8JXADTgDVGAstOyVyD1rvnQMWWlkrE4jil4OwFx4DNz7zFCHFb\/APav76x9ZeDuXAza3Ru8ldC1hV4vf\/tW+B+Yp78axB\/+Q+QUfIUesvAfgT8o28UorDf0ziP7Vvh+VO\/pnEf2je5fyo9ZeA\/An5RtstdisSON4j+0P8K\/6acOPYj7\/wDlT8qfrRF+Dk8o2kUorGjj9\/74\/hX8qm8L43de6iMVgkz2QORP0prLFkS4PJFNutDSZK4Up2Y1wsa0s5AZSm+romY00selFgDKUzLRwJ+NcK0wA5RXaJFKgdHAKruN3otunVatVWqLjX2\/D8qmWzLx9a+TNIK2vBF\/cJ4H5msxjOGNaW0zR+8QOI5KSw190+dazgy\/uE\/D+dY4lUju4xpwVeSWBXa6BXYrc885FKKcBSigEeb4p4c97sPOTTYp+ITMWHUny1kGmqpMTGyyfCCY8fpXIoxa31PcUpR7WhClSRTEd\/dtuN+8n4U7Lv3senMKPofdS5V2ZXqSvVDYpDw\/UTSVDI2gDWYPKBHf+fdXQu5jfv8ApPdT5Ur1FzSdUu5yKUUvV9+06yNiYn3GfKkV35b9NsoAA6660+ReQ9V+GcFT+Df+4t\/i\/wC01BCnTbvjbUH8h76mcEBF63P3v0TS5a7inPmg1XZm7iuEU+K4RXUeGDIrmWiRSK0ADQASJ5mnRNRrzkMf1yomEeTHdTALkpUTL312mSDUVnuNfb8vpWkVaznHP\/k8R8xUy6Wa4utfJG4tcJW2ucMqWgqnLlYdpsysJ3DKwHcBWh4UP3Nv8A+VZrGj2vx3B5S7fP51p+GD91b\/AAL8hWUN2dfF9CXuSYrsV2qn0h4ucKivkDqWynt5SCQSNMpkaGt0rPPLWKQqrs8RvZ0R7CqtwNldbmYAhcwVhlBEig8F429+7ctm0q+qYqzesLSZYdkZRzWl2sdHT6M2iZzP71\/01z+rFr7z+9f9NX0VRW+NPduOmHtq6oYd3cqpb7qwCT41HJHwb\/k5fLOf1Ztfef3r+VL+rFr77+9f9NEfj6pbuvdQ2zbfJkkMWYqrDKRoZmQemulNucae2iXL9kJbcgFlcsyZtVLrlGneDT9OPgPycvljD6MW\/vv\/AJfypp9GLf33\/wAv5UTivpCMPdRHQZLkEXA8wNiSscvHap1\/FuLqoqKwZGYN6yPZgEEZTzYUnjiuw1xOXyVv9WE++\/uFNPoun9o3uFNwvpOXR7n7O2S20OVdSy9TlIEipnFOPpatJfVc9tyACrQZIJGhHcfA0elHwH5WXyQ\/6rL\/AGh\/hH50TC+jmR1cXJykGMsTHKZqbh+JOXRHsuguAlXzKymBmjQyDFP4zxRcMmdkZlkA5csgnbRiKFji9kEuJy1TZOiuRVdheMo7qjI9t3XMgcCHG\/ZZSQfDemNx1PWtZ9XdLrqQFU6aGR2tdCPfV0YFnFLLQsDi1upnUMNWUhhlYFTBBFSIoAgYodryHyFPwK9ryp2KXteQ+VOwS9vyNAEzLXKJFKmSRwKzXHNn\/EPmK1AFZfjf2vxD51E+lm2HrXyiFjh7f42j\/MPpWswC\/u0\/Av8AKKx+PJjzuE\/\/AKPWzwg7CfhX5Cs8e7OvjOlBYrLf8Q\/\/AGyf3q\/yPWrqn9IuCtilVM4RVbN7MkmCBrMRB2iuiLp2ecN4Irj1nripb1i5SBCx6pAuWddpHjNVPoYP+Zxp\/wCof53q4HDLzOjvfUi3JCBMqlspUM3akxPWovDvR+7Ze46YgTcYs02wRJLHs9rTVjUp0minuXV+5mR8hllDjTkwXb5Vm\/8AhzH7M0b+sM\/wrFaDhOANlMhc3GLMzORBJdixJHnUC3wJ7Tu+GuhFc5nR0zpm+8moK7nTb4U70oXcqf8AiCkJZaNDc7R6nLCz5BhVh6ax+xP424\/jX6VPu8FR7L2rrM+c5mc6Nm5MsaLECBtyqJiOA3Lqol68Ht2yDlCZWfKIXO2Yg+QFCdU\/AV2INrhwxFm3bfRjhlIJ3Vgwyn8+4mheiWLc3VsXAQ9hLiEn7pa3lHlB16RWjGDcXg4dQgTIEycpBnNm3kdNvfXH4aBfN9IDm2UMiQdQVYgEbRHeI6Uls0xvczPomoNnGA7ZnnwyNNU0k8L12F8R4FTPxJrT4b0ZuIlxBiAEumXi32tdwpLQJmNqkcS9HA+HTDW3CIpBJKliSJ1mR1qlJX\/0TWg\/gWc5zdCyGtlI2ANtVUgnmdR4k0D04X\/lH\/En81SV4biCbQe6mS2VJVUZS+UQuYljtvRvSDhr4i0baMqyQSSCdjIiKmDp6jepnPSlstjBuvtqUynn7APzUUHil64mOvNbXM5sTExAyLLDqRExV2OAO5s+udClkDKiAjMQAMzEnuG1cvcIv\/tZxK+rIyZMjFtRESTl3oT0r2BrUu8MgAkfahj4kDX4UaKg8Kw11S7XSkuwyhJyqiqAFE+Z86sCKS2EyLiF7XuruDHbFdxBJYk867hfbFMZPilXYpUwIlZji25\/GPnWpArMcTEsO+4B86ifSa4OtFZix2P4v52ra4cdhfwj5VisX7CnqG+Lg\/WtvaHZHgPlWeLdnTxnTH7Kz0kv3Usl7LQ4IAGVWDSQIII36RUXhXHGuYL1xg3ACm0AvOVNO8lT51Z8VGif3tv+asnwHCOmJv4aP3du563\/ACn1Y9zKf8FbeThSD8D9Irn7NexN98+RsiplVQSQuXVROpb3VJF7FjCnFG92wvrPVZE9XkGpTbP7Mmc01mMBYZ+FXSv2bqufAKgJ8pnyrYYi+v8ARZadDho8ymUD3mKutfsXYgcb41ebDWsThnK5pzplRgMoYvMrOhU7HbWrK1xJsRbw921cZA9wI6gI2uViynMpIgruORqB6K4UpYwoce1cutB+61t408KhYTAvhMelhf8A0bj+sSeWVGEDvEx4ZaWjTrsFU0F43i8ZYS0xxDZrlwqU9XahFnQA5N461N41cxWHs3X\/AGhmyG2Uc27YkO2V0YBYMHWRG4oX\/EAaYb+9\/KrH02H\/ACVzxt\/zpQlsDejAYC5iGWy\/7Qz5hbd7Ztp7FwlZDKoIgj4Un4jdxGJexZf1aW\/bcBWZmmCBmBAEyNuVN9HrIsILzsxR7VkdozDSVyL3dpYHeajeiaFMXirb+1mLDvXOTPuZT51PZsb3JuOu4m0t6bshLWdHyKCSubMriIJ22A3FVzcbxKYa1iWdXVnyuhQDTtaqyxB7PPrWh9IHBw2IWRmFlzHOCrQY8j7qwaqws4VrrM2FLtmQQAjBmEkgSdJOs7NVJdwNRxvil5L+HS24CXuqKSuqjQ\/4udSLOPu3b962lxE9VlAQrOcxJZtZCzppt51A9KABicFG2YxG0ZrcV3jnBTed8RhnKXrbFWAMZioEEEbNljfQ6UJLS\/AvgkYniGKFtrgyKEsh2DITL9rOoOYRGUe+lw3it820v3SnqmVy+VGDIVBIM5iCDlPLmK6Mc2I4c9xh2jauTykqGBIHfE+dRMBaZ+FMq6nJc06w5JHwpVp90MmYXimJuWWxCogQZitshs7Ku\/bmAdDyq64fikvW0uIeywnvB5g94NU3o3cH7Ap5C3cB8s00vQXN+zSdi7R4QAfjND2+wLnEb+X1NLC+2POn4gajw+ppuH9sUgLCaVdilTAhVm8bq6\/3g+ZrTRWYxhh0\/vB8yKzn0muDrRV4nREHcPiltv8AurcoNB4Vg8Vsv4E\/kt1vlqMW7Onjdo\/ZGxuBW7llnXKwYZGy9obE9Yrr4FCXbUNcVVZlMNCzGo23o4cmYHmdp+Zp2Q82Plp8tfjW1HBZXcK4JawysiZsjbqzZl2gmD3aVGPo5hyAmZ\/VhswtesJtgzPs9J1jarlbSjkPmfeafRqFkK\/w1HZHl1Nv2ArFVGkHs7HTSj38KjlGYSUbMp6GCp94Jo8UgKKCyu4pwW1iCpuBzl9kB2AB6wOffRcdwxLqC25cqI+0RMbZiN6m0qYilHo5Y7GtwhCCim45VSp0hSYqRj+EW7rq5zI66B0Yo8dCRuPGrBq5S2HZWjg1vI6Euc+juXJdhEQW3iNIpqcAsiybHaNsmcpacpmZU7jWrSu0LQLKS56NWm9XL3D6v2Jf2YIIjTXYb9KO3Bll2W5cRrntlWHa0C6giAYG4g1ZswAJPLWkpBEjnSCyE3DE9T6hZRMuXsxOU6ESRzrvDOHLYTIjMVGoDQYkyYIFTaVOgspLnAFyuiXHS3cJL21y5TPtBSRKg9AatMJhltoqIIVRAFHpUd7CwOI5eBpmGHbFEvjbz+lDsntDxoGWUUq7mpUxURKymMcB0Y7C4CfAGa1dY7i+wjq3yNRk6Tfh1eRELED2fwp\/Kn5VvRWBuz2J+7b\/AJR+Xxrfis8Xc6OO2RkcZgWXEuyFllg0qSDJAJ286u7D3I9snuIU\/EAGiYlBn8gfmPpTFxCZsmYZhy51yTnNTaTo59HFaE1bx0kCnm4Y6UANpFEJFdMZNrcxaOO78iPdNFS7I2g9KSARSyRVpSTuwCIa7XFrta9iRrVyKca5FBQ2gXMbbUkM6gjcSJHsnbwZf4hUmsvxp\/2e+rl2CXNkUOe2D2jmGmsjQnlSAZ6ZvBtZrgRO2CJftE5fsoCTAn+Krbgl5Gtj1ZkeDLJ20zAdKzfpnZzWUdgc6uAJIkK6nNoD1VN+lWWA4hawyIbhZTcAUQrMJUSdF23ovQA+E9JA7tbCEOrOpEMwBBIXUDXUa1eoSdxGvWZ76w9rF5MdktKuR2BDkHUuMzwZjcnSt0tACrsUqVMAd\/l5\/Sg2faHiKLiDt5\/ShW\/aHiKALOlXaVMCGayOPu5GVt4ZpHltWurG8VJGXLuWZf4hB+tZ5NmbcN\/RFeCSFnkLdehCvPyPZj\/p\/L\/et+WA1JgdTUYe50cd2IePbKyNy1XzMEfI1AFpWctkRjmSGYbCGmCPAUT0gvBrLZDLAqRAJ5wdu4mq3D4wLbz7lcpIGugYof56wyprJa7o5or9S\/z6kQBEajvmdPIU9DVa2KBLHaFQ\/wATECjWblYyyuLVhyaFihoq1GtNUpRXfikpq0ZPQTMBXahcQ4eLuUkkFCSupEExqCNQdKJgywlWMlYk9Z2PwM++q5v25WgrSyRSpGkKYCNZ70ttlksgDX1yx\/C81oapuJ3M162jDKJDK0ggtqMpXddNj1NJuhJWZHCcHOQyurOMx2gZwdCfCKvOOYIEYcawrNEeAj5U3i2LdHTIwhOyQSDnmCcy9BAjzqdhcUL4WQAytOm0QRUPIuY05Go2AbDfvLCgTBdp5aZdfia0gqsuYcIAy+0FYKeQmJ08qi4Xi7i8iXB2XkKYIIYbCRoQdelHOuahKLasvqVKlWhILF6EL3T\/ABQRQrR7Q8aLieXmKDZPaXxpgWc0qVKmBFNZHiN0IysRMMxA74OUnumK1p2rF8Y+z+I\/Ss8nSzfhleRIho+iieYnyKx9a1XG+G3L2XJdyZd11AJ65hqOlY22e0PL516QKyxK07Orj\/1cWjPYbg720JIVj0U6+WYAUD+k7QaAQGGhzdlvDMdwe+Qe+tPeEq0dDp5VmeK4BnHaOc2z7RguFYNCtGjCQpneDUzwqP7Js44zcnTOOVdHFpFZ2AlZyXIUyCF9lwOqxXMBiTGV5DDcEFSPEGpz27fq1L2wsx2VEazAgDnzHOi5HUTBZQNC4GYd2fOG9+tZTgsmj7FKTjoHsXZ2+FTbLNzB8TA\/XuqDhsU7jRSI5NIPxUz7zUa7xkK4t51LlsuUSYPMEiOh0FaYkoKrf\/hnJWy+FNSJJ6wPd\/uaBhS8tmjTYidZGsipFdadqzOhGlSNcpDEay\/pChN4ET7CjfY5mINaW9dVRLGB1Pwqmsol1rh9qGgHwAEDwg1jmelIuGjspONqheFAkAZoOubn4b7VouE4TIg6nU1Du4Jf2gMeaqfMDL9KuQIFYrWRpOX6pHWAbeoz4JHMkajbuMyDpzp16+qas0eNM\/alyl1II7vnTck2Qk6I3Csc4drLksQSVc\/aGhC+Ik+6rms9fckhrerkysGfGRyG8+NXCYoBlRiM5EkDUDrr8vCtcc7Wopxp2h+J2FAQ9oeIouJOgqMhMjxrZEFzNKmyaVUSRjtWL4zsPxGtoaxPGzoPxGs8vSzq4T+qK22e0PL516OtebWz2h5fOvSVrLBszp\/0N19g8bi0tIXeYkCFBYksQoAA7yKqbOKW4z5UEZSqOJkopGZWHjMDkJqbxdoVJ29Zb\/ytm0\/hpLby3GMCD2vJhDe5tT3NV5LeiOCNLUPhDCDTaoeLwQvETnQhplWgsBsDyg8xFTjagQJ\/XKioOtRGMqUX2E3rZGS2c08ulAt2UDsIUsHZgSASpYySJ23qRdXLBDxPcCSOkflUW25e7mJEahAAdRpJJI1M+6okqVLeylqWtvUU6hYa6HQMpkHUHzohrrWxn3EaY7gCSQB1Ogp81QcbxTkm0iycsnXkRzrOcuVWXGPM6BcVvtdurZUaB1YkTpEyG5RrUrhSgF9dc7EiI1JNQMMly06uTmDhi86HsgtPvgVbYC3u59pzJ+gHdXO3zNGklSoFjVLXUAX2dS3v0qY7wCelFdaz\/G+MNbZUQZmJgganwgUONNkr9qXgrPSDiBfKgGjewYMlpHZA66j3ipPBcO72guRk3zO0iT2iDB15gf71Os4VMOoe4M92PHKYAOWdtIE1FxLtdCvdLBSSq20JVSFBZmck66CPMd9OopUzS322DjG2rC5EIe6RBZdQD47RPIdNaYb7W8Qhf7USTrqQVG22se+rHD4C06IUUBQBA+h99MxnC1clo1IA\/wDNJ3o60DmjsWOJOg8ajIdR4ig2Lbp2GfOoAyk+0IEQTz8d6Kp1HiK6ou0c7VFxNKuZqVWBHJ0rFcb2X8RraGsVxrYfiNZ5elnRwn9UVSHX9da9LU15kh1\/XWvS128qywdzq\/0O32QONrmCrznN4QCB86k4cllBPtD\/AGIPcfyoV22Scx3\/AFA\/XWj2TAioi5PM29jgbXKkcMgyu+xUnQ9ATyPQ+VFturggjX7SNv5jmKcyT49f1yqO6BjBPaXXMPaE7eX6766Xa2IO+pyf+miCfER5Df4UPGXXCFSVDv2VjlO5ieQmum027XWK9xCj\/KATUO+mViQADlUqSNdSQZ5z7OnhWE3Km0mXFK9Q3DlNslVkqAC3QE7ZR4bjw87NHDAEEEHYjaqzH2MlhkU9pwQW5tI7R067eYqbgbeVFX7oy+7Srx6fr4FLXUffmDl35VXWeGkEsSSx1JJ+vSrU0qcsak9QjJxWhW3LAE5ogiJ3OsaADrHwomGvqTGxiYJ8gKmFZoNzCoxkrNVGEYkylJnXedtfCIHjJqrw3DvUBnQZ3dpLRoJMlRJ0HfvtvVl+yISDlGmn6608AJoqnrpRKKewKTRBwmFckvcGvIGNKk3sOjABwNNQPn+u+iG71VhNBtlCdAemo99EcSQ3NtklMoGkQOkRWeuYhmuhBeLsLgyi3IABcuwukkKYQFQuu0xJEXlqwoERWdxaM2KQMOyrDK3q2txroouFWL+WUHrVNKmSrsvsSPnUdDqPEUbEpGuu\/WgIdR40JUMuKVcpVQEc1jON7D8R+tbMVjON+z\/i\/Os8mzN+F\/qinH0r0y2dB4CvMga9KsHsjwHyrLB3Ov8A0O32cKcv1FcTejMKERrWso62eYmOuvlRm6DTx5fGqzhVv1fbdyWuZ2ZiftSIj\/CNu6rHErKhepH5127bGUQAcvLu2PwJpa37JFWqM7jDde4zSVQZcqroVMkByebGfdpUhEukoXck28rHaGVmUt3yAJg9DvTrmKdLxXIMrCQCYMgbEiRyOlWOHhsoOhiY8SR5gbeYrCLcpU39Gj0WwS72riryAB+JJ+S++pFndh\/9vnrVRbxDm+MhB3Dr3BE1HTtQPfVsjakjYge\/UVtCrb9zOXYI1CKtOp06VxsSAYgnwpqYkExlIjnGla0ybCODpB8a6xyjcedNW4DuIpwAikM5avBtiP141DucQDMyI0ZSVZoGhCloGbQ7VJe4qoX2AXN00AmsH6MO7k3DqHuXCSx0RozTprqTvypN1qCVmg4D6RetdrblcwPYZdAw6QToef8AtWhjpFeb+kWFey9u4kKxcFmHs59WlSddt62XCuJtdHaSNjv8frQ5JV7j5WWhYAEk6CSSY0jeT3VlluI91ewqZ7gZLvq7il4bNAdgBLARruCYmrvEulxXsM4DOrIwU6iV1InxqMeFklQ+JuuFZWCEWgDkIKzlQGJHWqa0JRPxh086iLuPEVIxR0FRU3HiKSGXNKm0qoAdYzjns\/4\/zrYg1j+N+yfx\/nWeTZm\/Df1XyUimvSMMewv4V+VebLXo2DbsJ+Bf5RWeHudfH7R+yUDSYUwNT1Nb7nlgcPmbtsCv3VO4HU956cqkGmlopKOZ8h+udFUBCuWwTJ3Gknu\/8a+dOVAWUgjMpIIkbMdiPIHyqRdXQ94I+GlQ7QUMVGjECRz2AWem1YOCjLbc0TtHOG8PW0zuJ7cMSeXMr4SSZ745CrH1esg+I5Hv8acBXAI293Kt1GiG7FlFNBHKu5q4SBSGKgY3ElFlVzHTs9eo7qP300oCZ50R03E\/YqFvHEoyMrW5WCJ3B5jnHdWQucAxdh869qWAlZ1GaBmiCPZWfEVusXacEMiqx2luXfAruD9aM2cAyZGu2mw7tKpxW628CUnszF4\/gl3EMfVpk9XMozGMxAMIuwB8dx31ecB4fdW0yPIJ06FQd4jx0q3sYV1diXzKdgdwTyB6U58EDuT399LlVq3sO2CwHC0tsX1ZjuzEknxJqnRFa7lCqzC6XF0W39YQLhkZyIyiChObYQBqK0tsEAAmY51lURPXhgih\/WkFMtrKFzntBpz5o7XjOlDbdtglWxf4kmNY8qAh1HiKPijtUZD2h4igZcUqZNKmAwGsjxsdlvx\/nWrBrKcb2f8AF9aifSzXB\/RfJRqa9BwB\/dp+Bf5RXnimtUmKvrZtBAsnTMfugDLp1137u+ssKcnSO3\/QdRRopoimqTC8YDMqFZJkFhEAgkbVbqa6HFxep5aaew9NdT\/tRAaj3HygmY051z9pULmLACJJnSOs9KEBIoZQZpjXme4D84ptu8GEg6R86JSZQ+aWagXsQiAlmAA9\/kNzSt3ldQymQ2x\/W1GtWAQHnTABM8+tZnjPpcuHuOhtM2TKJBAHaUsBB7gfdRR6Uqbnq8hksF36mJqbouOOUtkXrYq1nyF1zj7PMT1p1nFI5YKZK76Ee6d\/KoWD4SLbl85YmZzanoBJ10FGxWHaOxoTzmPPStGo3SZlbJD3DqMpPhXEYmNCPGiAmNaaY21qbAczxQ3u+NcuLOxigZHEzDecGKRQ5T0LeOtUKXx+0hQ0sWI7dtbeVR7QTN2mn7wGvXlVzaL5u1oOg27qqGvIzoVuOTnU5XaYBLCAu26nvApsSLjEgACo6HtDxomKbagWz2h40kMts1doc0qoVglaszxvZ\/xfWtGrVmeNHR\/xfWon0s1wf0XyijWtvwzDq1lDEEoNR4Vhga13DWvG1byFAuXmCTz5z9Kywbs7uP6V8k5OHIFIie8aHTaIqTZxaDskwRpDbkAb94pthH+02Y+AHyovZmYk+H1rpbvfU8uvBDx7FxkkZSNzpVfhuDlgTPtKVg8hETpvB18qt8RicpHYJBG+nl9fhT7eIU8iPEflVJtR0FypvU7g8P6tAoJMczqa7iLRcRmIH\/1MT5jWus5A0ANRsWtxkIViCRy5ctDUK27G9iJibYtgBRLHm0tlUb6TJ328aDhvXEFS4Vcx1QZS07MemkCBU7Co+gftwNyAT76biQ09hOs7bysTqOWb4Vo5JaE1ZiPSFVW6yspclVzMXcZoGmYBhNahOFWZD5Dm0aczb77T1ov7IzHM9q2TpqRPSQddB7XwopW7B7KTpHTbWdetcfEQlk5eR1T19zXFKUG9dy2sXSRJFPtXVdQymQdjVOlp2PbbTtaKT5fCfcKlYO0ySA3Z5A8t9vM10aUTqHvY1EYIzgMRIB3ojXgBJM\/WoeM4ctyJJkfa57g\/Si+r+xGgG5p1GtBaitYzNJCNpy01oqXQfHpzFCt4dVBAmO8zSFpRyqXyjVhXaKzy4oPeREW37WctbBPZU6y8AbkTqavLyhlKsAwOhBEgjoQd6r7XCkR1dGdMoIyBpQqd1CtOUSAezG1IZIxJoKHUeNPxLUKz7QpoCyzUqZNKmAENVJxfDMyuVBJkGBvuOVW4auyKTVqhxk4yTXYxIwr\/AHH\/AITWj4Xhn9Wpzup+6SQBr0q1SKKsVMIcrtG2bO8sUmhtl8ogtND\/AKSXPkCOYA7cdnadDUqB0pBB0q\/k5gVjGhyQVKxsTEH3U5751yhe4k\/QUYIOldyDpQBWPauOe1eyiZhNPjzoiYeGDm4xbn3jXSOlT8g6UlUVVsKQz1w7\/dQi4PX3VKyjpSyiooojkj9A0Eu33Z8KnwKQAooCA9wjZGJ8NPPWj2LhgSpB5ipMCuUUBExN54hF1P2jsO+NzUWwt4ZczHTcyCT46VbTXDVJ0qFRHDnoaaWbp8akk0wtU0MCc3dTHRjzijMaYzUUAEWY7+811UinE0xmpgOzUqbNKgAAp9KlQA5aKtKlQATnThSpUEjhXaVKgDtcFKlQA4UjSpUAKu0qVAHa4K7SoA5SNKlQAw0w0qVADDTDSpUAMNNalSoKOVylSoGf\/9k=", + "content": "El conde" + }, + { + "value": "https:\/\/i.blogs.es\/43a404\/91uo5gydkil\/450_1000.jpg", + "content": "Harry potter" + } + ], + "removeIndex": null, + "showRenderAs": true, + "showJsonEditor": false, + "showOptionCard": false, + "selectedOptions": [], + "allowMultiSelect": true, + "showRemoveWarning": false, + "valueTypeReturned": "object" + }, + "readonly": false, + "dataFormat": "array", + "validation": [], + "placeholder": null, + "rootElement": "response", + "defaultValue": { + "mode": "basic", + "value": null + }, + "dataSourceUrl": null, + "dataSourceEndpoint": null + }, + "component": "FormSelectList", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^([a-zA-Z]([a-zA-Z0-9_]?)+\\.?)+(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormSelectList", + "editor-component": "FormSelectList" + }, + { + "items": [ + [ + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "
    Image<\/strong><\/h6>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + } + ], + [ + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "
    Title<\/strong><\/h6>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + } + ], + [ + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "
    Cant.<\/strong><\/h6>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + } + ], + [ + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "
    Total<\/strong><\/h6>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + } + ] + ], + "label": "Multicolumn \/ Table", + "config": { + "icon": "fas fa-table", + "label": null, + "options": [ + { + "value": "1", + "content": "3" + }, + { + "value": "2", + "content": "3" + }, + { + "value": "2", + "content": "3" + }, + { + "value": "2", + "content": "3" + } + ], + "customCssSelector": "lista" + }, + "component": "FormMultiColumn", + "container": true, + "inspector": [ + { + "type": "ContainerColumns", + "field": "options", + "config": { + "label": "Column Width", + "helper": null, + "validation": "columns-adds-to-12" + } + }, + { + "type": "ColorSelect", + "field": "color", + "config": { + "label": "Text Color", + "helper": "Set the element's text color", + "options": [ + { + "value": "text-primary", + "content": "primary" + }, + { + "value": "text-secondary", + "content": "secondary" + }, + { + "value": "text-success", + "content": "success" + }, + { + "value": "text-danger", + "content": "danger" + }, + { + "value": "text-warning", + "content": "warning" + }, + { + "value": "text-info", + "content": "info" + }, + { + "value": "text-light", + "content": "light" + }, + { + "value": "text-dark", + "content": "dark" + } + ] + } + }, + { + "type": "ColorSelect", + "field": "bgcolor", + "config": { + "label": "Background Color", + "helper": "Set the element's background color", + "options": [ + { + "value": "alert alert-primary", + "content": "primary" + }, + { + "value": "alert alert-secondary", + "content": "secondary" + }, + { + "value": "alert alert-success", + "content": "success" + }, + { + "value": "alert alert-danger", + "content": "danger" + }, + { + "value": "alert alert-warning", + "content": "warning" + }, + { + "value": "alert alert-info", + "content": "info" + }, + { + "value": "alert alert-light", + "content": "light" + }, + { + "value": "alert alert-dark", + "content": "dark" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormMultiColumn", + "editor-component": "MultiColumn" + }, + { + "items": [ + { + "items": [ + [ + { + "label": "Image", + "config": { + "icon": "fas fa-image", + "name": null, + "event": "submit", + "label": "Image", + "value": null, + "width": "100", + "height": "100", + "variant": "primary", + "imageName": "value", + "renderImage": true + }, + "component": "FormImage", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "label": "Name", + "helper": "Image name" + } + }, + { + "type": "ImageUpload", + "field": "image", + "config": { + "label": "Upload", + "helper": "Upload image" + } + }, + { + "type": "ImageVariable", + "field": "imageName", + "config": { + "label": "Render from a variable name", + "helper": null + } + }, + { + "type": "FormInput", + "field": "helper", + "config": { + "label": "Helper Text", + "helper": "Help text is meant to provide additional guidance on the field's value" + } + }, + { + "type": "FormInput", + "field": "height", + "config": { + "type": "number", + "label": "Height", + "helper": "Image height" + } + }, + { + "type": "FormInput", + "field": "width", + "config": { + "type": "number", + "label": "Width", + "helper": "image width" + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormImage", + "editor-component": "FormImage" + } + ], + [ + { + "label": "Line Input", + "config": { + "icon": "far fa-square", + "name": "content", + "type": "text", + "label": null, + "helper": null, + "readonly": false, + "dataFormat": "string", + "validation": [], + "placeholder": null, + "defaultValue": { + "mode": "basic", + "value": null + } + }, + "component": "FormInput", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^(?:[A-Z_a-z])(?:[0-9A-Z_a-z])*(?:[A-Z.a-z])*(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormInput", + "editor-component": "FormInput" + } + ], + [ + { + "label": "Line Input", + "config": { + "icon": "far fa-square", + "name": "cant", + "type": "text", + "label": null, + "helper": null, + "readonly": false, + "dataFormat": "int", + "validation": [], + "placeholder": null, + "defaultValue": { + "mode": "basic", + "value": null + } + }, + "component": "FormInput", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^(?:[A-Z_a-z])(?:[0-9A-Z_a-z])*(?:[A-Z.a-z])*(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormInput", + "editor-component": "FormInput" + } + ], + [ + { + "label": "Line Input", + "config": { + "icon": "far fa-square", + "name": "tot", + "type": "text", + "label": null, + "helper": null, + "readonly": true, + "dataFormat": "float", + "validation": [], + "placeholder": null, + "defaultValue": { + "mode": "js", + "value": "c= this.content;\nif(c == \"Don Quijote\"){\n res = this.cant * 100;\n}else{\n if(c == \"El principito\"){\n res = this.cant * 120;\n }else{\n if(c == \"El conde\"){\n res = this.cant * 56;\n }else{\n if(c == \"Harry potter\"){\n res = this.cant * 123.50;\n }\n }\n }\n}\nreturn res;" + } + }, + "component": "FormInput", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^(?:[A-Z_a-z])(?:[0-9A-Z_a-z])*(?:[A-Z.a-z])*(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormInput", + "editor-component": "FormInput" + } + ] + ], + "label": "Multicolumn \/ Table", + "config": { + "icon": "fas fa-table", + "label": null, + "options": [ + { + "value": "1", + "content": "3" + }, + { + "value": "2", + "content": "3" + }, + { + "value": "2", + "content": "3" + }, + { + "value": "2", + "content": "3" + } + ], + "customCssSelector": null + }, + "component": "FormMultiColumn", + "container": true, + "inspector": [ + { + "type": "ContainerColumns", + "field": "options", + "config": { + "label": "Column Width", + "helper": null, + "validation": "columns-adds-to-12" + } + }, + { + "type": "ColorSelect", + "field": "color", + "config": { + "label": "Text Color", + "helper": "Set the element's text color", + "options": [ + { + "value": "text-primary", + "content": "primary" + }, + { + "value": "text-secondary", + "content": "secondary" + }, + { + "value": "text-success", + "content": "success" + }, + { + "value": "text-danger", + "content": "danger" + }, + { + "value": "text-warning", + "content": "warning" + }, + { + "value": "text-info", + "content": "info" + }, + { + "value": "text-light", + "content": "light" + }, + { + "value": "text-dark", + "content": "dark" + } + ] + } + }, + { + "type": "ColorSelect", + "field": "bgcolor", + "config": { + "label": "Background Color", + "helper": "Set the element's background color", + "options": [ + { + "value": "alert alert-primary", + "content": "primary" + }, + { + "value": "alert alert-secondary", + "content": "secondary" + }, + { + "value": "alert alert-success", + "content": "success" + }, + { + "value": "alert alert-danger", + "content": "danger" + }, + { + "value": "alert alert-warning", + "content": "warning" + }, + { + "value": "alert alert-info", + "content": "info" + }, + { + "value": "alert alert-light", + "content": "light" + }, + { + "value": "alert alert-dark", + "content": "dark" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormMultiColumn", + "editor-component": "MultiColumn" + } + ], + "label": "Loop", + "config": { + "icon": "fas fa-redo", + "name": "loop_1", + "label": null, + "settings": { + "add": false, + "type": "existing", + "times": "1", + "varname": "loop_1" + }, + "customCssSelector": "lista" + }, + "component": "FormLoop", + "container": true, + "inspector": [ + { + "type": "LoopInspector", + "field": "settings", + "config": { + "label": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "Loop", + "editor-component": "Loop" + }, + { + "items": [ + [], + [], + [ + { + "label": "Rich Text", + "config": { + "icon": "fas fa-pencil-ruler", + "label": null, + "content": "

     <\/p>\n

    TOTAL<\/strong><\/span><\/p>", + "interactive": true, + "renderVarHtml": false + }, + "component": "FormHtmlViewer", + "inspector": [ + { + "type": "FormTextArea", + "field": "content", + "config": { + "rows": 5, + "label": "Content", + "value": null, + "helper": "The HTML text to display" + } + }, + { + "type": "FormCheckbox", + "field": "renderVarHtml", + "config": { + "label": "Render HTML from a Variable", + "value": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormHtmlEditor", + "editor-component": "FormHtmlEditor" + } + ], + [ + { + "label": "Line Input", + "config": { + "icon": "far fa-square", + "name": "total", + "type": "text", + "label": null, + "helper": null, + "readonly": true, + "dataFormat": "float", + "validation": [], + "placeholder": null, + "defaultValue": { + "mode": "js", + "value": null + } + }, + "component": "FormInput", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^(?:[A-Z_a-z])(?:[0-9A-Z_a-z])*(?:[A-Z.a-z])*(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormInput", + "editor-component": "FormInput" + } + ] + ], + "label": "Multicolumn \/ Table", + "config": { + "icon": "fas fa-table", + "label": null, + "options": [ + { + "value": "1", + "content": "3" + }, + { + "value": "2", + "content": "3" + }, + { + "value": "2", + "content": "3" + }, + { + "value": "2", + "content": "3" + } + ], + "customCssSelector": "lista" + }, + "component": "FormMultiColumn", + "container": true, + "inspector": [ + { + "type": "ContainerColumns", + "field": "options", + "config": { + "label": "Column Width", + "helper": null, + "validation": "columns-adds-to-12" + } + }, + { + "type": "ColorSelect", + "field": "color", + "config": { + "label": "Text Color", + "helper": "Set the element's text color", + "options": [ + { + "value": "text-primary", + "content": "primary" + }, + { + "value": "text-secondary", + "content": "secondary" + }, + { + "value": "text-success", + "content": "success" + }, + { + "value": "text-danger", + "content": "danger" + }, + { + "value": "text-warning", + "content": "warning" + }, + { + "value": "text-info", + "content": "info" + }, + { + "value": "text-light", + "content": "light" + }, + { + "value": "text-dark", + "content": "dark" + } + ] + } + }, + { + "type": "ColorSelect", + "field": "bgcolor", + "config": { + "label": "Background Color", + "helper": "Set the element's background color", + "options": [ + { + "value": "alert alert-primary", + "content": "primary" + }, + { + "value": "alert alert-secondary", + "content": "secondary" + }, + { + "value": "alert alert-success", + "content": "success" + }, + { + "value": "alert alert-danger", + "content": "danger" + }, + { + "value": "alert alert-warning", + "content": "warning" + }, + { + "value": "alert alert-info", + "content": "info" + }, + { + "value": "alert alert-light", + "content": "light" + }, + { + "value": "alert alert-dark", + "content": "dark" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormMultiColumn", + "editor-component": "MultiColumn" + }, + { + "label": "Submit Button", + "config": { + "icon": "fas fa-share-square", + "name": null, + "event": "submit", + "label": "Submit", + "variant": "success", + "fieldValue": null, + "defaultSubmit": true, + "customCssSelector": null + }, + "component": "FormButton", + "inspector": [ + { + "type": "FormInput", + "field": "label", + "config": { + "label": "Label", + "helper": "The label describes the button's text" + } + }, + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information." + } + }, + { + "type": "FormMultiselect", + "field": "event", + "config": { + "label": "Type", + "helper": "Choose whether the button should submit the form", + "options": [ + { + "value": "submit", + "content": "Submit Button" + }, + { + "value": "script", + "content": "Regular Button" + } + ] + } + }, + { + "type": "FormInput", + "field": "fieldValue", + "config": { + "label": "Value", + "helper": "The value being submitted" + } + }, + { + "type": "FormMultiselect", + "field": "variant", + "config": { + "label": "Button Variant Style", + "helper": "The variant determines the appearance of the button", + "options": [ + { + "value": "primary", + "content": "Primary" + }, + { + "value": "secondary", + "content": "Secondary" + }, + { + "value": "success", + "content": "Success" + }, + { + "value": "danger", + "content": "Danger" + }, + { + "value": "warning", + "content": "Warning" + }, + { + "value": "info", + "content": "Info" + }, + { + "value": "light", + "content": "Light" + }, + { + "value": "dark", + "content": "Dark" + }, + { + "value": "link", + "content": "Link" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormSubmit", + "editor-component": "FormButton" + }, + { + "items": [ + [], + [], + [] + ], + "label": "Multicolumn \/ Table", + "config": { + "icon": "fas fa-table", + "label": null, + "options": [ + { + "value": "1", + "content": "4" + }, + { + "value": "2", + "content": "4" + }, + { + "value": "2", + "content": "4" + } + ] + }, + "component": "FormMultiColumn", + "container": true, + "inspector": [ + { + "type": "ContainerColumns", + "field": "options", + "config": { + "label": "Column Width", + "helper": null, + "validation": "columns-adds-to-12" + } + }, + { + "type": "ColorSelect", + "field": "color", + "config": { + "label": "Text Color", + "helper": "Set the element's text color", + "options": [ + { + "value": "text-primary", + "content": "primary" + }, + { + "value": "text-secondary", + "content": "secondary" + }, + { + "value": "text-success", + "content": "success" + }, + { + "value": "text-danger", + "content": "danger" + }, + { + "value": "text-warning", + "content": "warning" + }, + { + "value": "text-info", + "content": "info" + }, + { + "value": "text-light", + "content": "light" + }, + { + "value": "text-dark", + "content": "dark" + } + ] + } + }, + { + "type": "ColorSelect", + "field": "bgcolor", + "config": { + "label": "Background Color", + "helper": "Set the element's background color", + "options": [ + { + "value": "alert alert-primary", + "content": "primary" + }, + { + "value": "alert alert-secondary", + "content": "secondary" + }, + { + "value": "alert alert-success", + "content": "success" + }, + { + "value": "alert alert-danger", + "content": "danger" + }, + { + "value": "alert alert-warning", + "content": "warning" + }, + { + "value": "alert alert-info", + "content": "info" + }, + { + "value": "alert alert-light", + "content": "light" + }, + { + "value": "alert alert-dark", + "content": "dark" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormMultiColumn", + "editor-component": "MultiColumn" + } + ] + }, + { + "name": "addPage", + "items": [ + { + "label": "Image", + "config": { + "icon": "fas fa-image", + "name": "image", + "event": "submit", + "label": "Image", + "value": null, + "variant": "primary", + "renderImage": false + }, + "component": "FormImage", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "label": "Name", + "helper": "Image name" + } + }, + { + "type": "ImageUpload", + "field": "image", + "config": { + "label": "Upload", + "helper": "Upload image" + } + }, + { + "type": "ImageVariable", + "field": "imageName", + "config": { + "label": "Render from a variable name", + "helper": null + } + }, + { + "type": "FormInput", + "field": "helper", + "config": { + "label": "Helper Text", + "helper": "Help text is meant to provide additional guidance on the field's value" + } + }, + { + "type": "FormInput", + "field": "height", + "config": { + "type": "number", + "label": "Height", + "helper": "Image height" + } + }, + { + "type": "FormInput", + "field": "width", + "config": { + "type": "number", + "label": "Width", + "helper": "image width" + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormImage", + "editor-component": "FormImage" + } + ] + } + ], + "computed": [ + { + "id": 1, + "name": "total", + "type": "javascript", + "formula": "var list = this.loop_1;\nvar resultado = 0;\nfor (i = 0; i < list.length; i++){\n resultado=resultado + list[i].tot; \n}\nreturn resultado;", + "property": "total" + }, + { + "id": 2, + "name": "test", + "type": "javascript", + "formula": "\/\/select list with data\nlet dataSelected = this.form_select_list_1;\n\/\/loop we want to fill\nlet dataLoop = this.loop_1 || [];\n\nlet newRecordSelected = dataSelected.filter(item => {\n return !dataLoop.find(out => out.value == item.value)\n});\n\/\/ add a copy of the new selected item\nnewRecordSelected.forEach(item => dataLoop.push(JSON.parse(JSON.stringify(item))));\n\nlet removeFromLoop = dataLoop.filter(item => !dataSelected.find(inp => inp.value == item.value) );\n\/\/ remove From Loop the items\nremoveFromLoop.forEach(item => {\n let index = dataLoop.indexOf(item)\n dataLoop.splice(index, 1)\n});", + "property": "copySelectToLoop" + } + ], + "custom_css": "[selector='lista'] {\n color: black;\n margin: 1rem;\n padding: 1rem;\n border: 2px solid rgb(136, 136, 119);\n \/* IMPORTANTE *\/\n text-align: center;\n}\nbutton {width: 100%;}", + "created_at": "2021-03-30T19:51:20+00:00", + "updated_at": "2022-01-26T21:11:10+00:00", + "status": "ACTIVE", + "key": null, + "watchers": [], + "categories": [ + { + "id": 1, + "name": "Uncategorized", + "status": "ACTIVE", + "is_system": 0, + "created_at": "2022-01-26T16:38:04+00:00", + "updated_at": "2022-01-26T16:38:04+00:00", + "pivot": { + "assignable_id": 2, + "category_id": 1, + "category_type": "ProcessMaker\\Models\\ScreenCategory" + } + } + ] + } + ], + "screen_categories": [], + "scripts": [] +} \ No newline at end of file diff --git a/tests/e2e/fixtures/FOUR-5161.json b/tests/e2e/fixtures/FOUR-5161.json new file mode 100644 index 000000000..2d732ec4a --- /dev/null +++ b/tests/e2e/fixtures/FOUR-5161.json @@ -0,0 +1,1111 @@ +{ + "type": "screen_package", + "version": "2", + "screens": [ + { + "id": 257, + "screen_category_id": "1", + "title": "gfdg", + "description": "dgdfg", + "type": "FORM", + "config": [ + { + "name": "gfdg", + "items": [ + { + "label": "Checkbox", + "config": { + "icon": "fas fa-check-square", + "name": "form_checkbox_1", + "label": "New Checkbox", + "helper": null, + "toggle": false, + "disabled": false, + "validation": [], + "initiallyChecked": false + }, + "component": "FormCheckbox", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^([a-zA-Z]([a-zA-Z0-9_]?)+\\.?)+(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormCheckbox", + "editor-component": "FormCheckbox" + }, + { + "items": [ + { + "items": [ + [ + { + "label": "Line Input", + "config": { + "icon": "far fa-square", + "name": "color", + "type": "text", + "label": "New Input", + "helper": null, + "readonly": false, + "dataFormat": "string", + "validation": [ + { + "value": "required", + "helper": "Checks if the length of the String representation of the value is >", + "content": "Required" + } + ], + "placeholder": null + }, + "component": "FormInput", + "inspector": [ + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information.", + "validation": "regex:\/^([a-zA-Z]([a-zA-Z0-9_]?)+\\.?)+(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormInput", + "editor-component": "FormInput" + } + ], + [] + ], + "label": "Multicolumn \/ Table", + "config": { + "icon": "fas fa-table", + "label": null, + "options": [ + { + "value": "1", + "content": "6" + }, + { + "value": "2", + "content": "6" + } + ] + }, + "component": "FormMultiColumn", + "container": true, + "inspector": [ + { + "type": "ContainerColumns", + "field": "options", + "config": { + "label": "Column Width", + "validation": "columns-adds-to-12" + } + }, + { + "type": "ColorSelect", + "field": "color", + "config": { + "label": "Text Color", + "helper": "Set the element's text color", + "options": [ + { + "value": "text-primary", + "content": "primary" + }, + { + "value": "text-secondary", + "content": "secondary" + }, + { + "value": "text-success", + "content": "success" + }, + { + "value": "text-danger", + "content": "danger" + }, + { + "value": "text-warning", + "content": "warning" + }, + { + "value": "text-info", + "content": "info" + }, + { + "value": "text-light", + "content": "light" + }, + { + "value": "text-dark", + "content": "dark" + } + ] + } + }, + { + "type": "ColorSelect", + "field": "bgcolor", + "config": { + "label": "Background Color", + "helper": "Set the element's background color", + "options": [ + { + "value": "alert alert-primary", + "content": "primary" + }, + { + "value": "alert alert-secondary", + "content": "secondary" + }, + { + "value": "alert alert-success", + "content": "success" + }, + { + "value": "alert alert-danger", + "content": "danger" + }, + { + "value": "alert alert-warning", + "content": "warning" + }, + { + "value": "alert alert-info", + "content": "info" + }, + { + "value": "alert alert-light", + "content": "light" + }, + { + "value": "alert alert-dark", + "content": "dark" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "MultiColumn", + "editor-component": "MultiColumn" + } + ], + "label": "Loop", + "config": { + "icon": "fas fa-redo", + "name": "loop_1", + "label": null, + "settings": { + "add": true, + "type": "new", + "times": "1", + "varname": "loop_1" + }, + "conditionalHide": "form_checkbox_1" + }, + "component": "FormLoop", + "container": true, + "inspector": [ + { + "type": "LoopInspector", + "field": "settings", + "config": { + "label": null, + "helper": null + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + }, + { + "type": "FormInput", + "field": "ariaLabel", + "config": { + "label": "Aria Label", + "helper": "Attribute designed to help assistive technology (e.g. screen readers) attach a label" + } + }, + { + "type": "FormInput", + "field": "tabindex", + "config": { + "label": "Tab Order", + "helper": "Order in which a user will move focus from one control to another by pressing the Tab key", + "validation": "regex: [0-9]*" + } + } + ], + "editor-control": "Loop", + "editor-component": "Loop" + }, + { + "label": "Submit Button", + "config": { + "icon": "fas fa-share-square", + "name": null, + "event": "submit", + "label": "New Submit", + "variant": "primary", + "fieldValue": null, + "defaultSubmit": true + }, + "component": "FormButton", + "inspector": [ + { + "type": "FormInput", + "field": "label", + "config": { + "label": "Label", + "helper": "The label describes the button's text" + } + }, + { + "type": "FormInput", + "field": "name", + "config": { + "name": "Variable Name", + "label": "Variable Name", + "helper": "A variable name is a symbolic name to reference information." + } + }, + { + "type": "FormMultiselect", + "field": "event", + "config": { + "label": "Type", + "helper": "Choose whether the button should submit the form", + "options": [ + { + "value": "submit", + "content": "Submit Button" + }, + { + "value": "script", + "content": "Regular Button" + } + ] + } + }, + { + "type": "FormInput", + "field": "fieldValue", + "config": { + "label": "Value", + "helper": "The value being submitted" + } + }, + { + "type": "FormMultiselect", + "field": "variant", + "config": { + "label": "Button Variant Style", + "helper": "The variant determines the appearance of the button", + "options": [ + { + "value": "primary", + "content": "Primary" + }, + { + "value": "secondary", + "content": "Secondary" + }, + { + "value": "success", + "content": "Success" + }, + { + "value": "danger", + "content": "Danger" + }, + { + "value": "warning", + "content": "Warning" + }, + { + "value": "info", + "content": "Info" + }, + { + "value": "light", + "content": "Light" + }, + { + "value": "dark", + "content": "Dark" + }, + { + "value": "link", + "content": "Link" + } + ] + } + }, + { + "type": "FormInput", + "field": "conditionalHide", + "config": { + "label": "Visibility Rule", + "helper": "This control is hidden until this expression is true" + } + }, + { + "type": "FormInput", + "field": "customFormatter", + "config": { + "label": "Custom Format String", + "helper": "Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####", + "validation": null + } + }, + { + "type": "FormInput", + "field": "customCssSelector", + "config": { + "label": "CSS Selector Name", + "helper": "Use this in your custom css rules", + "validation": "regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]" + } + } + ], + "editor-control": "FormSubmit", + "editor-component": "FormButton" + } + ] + } + ], + "computed": [ + { + "id": 1, + "name": "loop_1", + "type": "javascript", + "formula": "let loop_1 = this.loop_1;\nif (this.loop_1 && Array.isArray(this.loop_1) && this.loop_1.length > 0){\n for (let i = 0; i < loop_1.length; i++) {\n let color = loop_1[i].color;\n \n loop_1[i].decription = \"Color is :\" + color;\n }\n\treturn loop_1;\n}\nreturn [{}];", + "property": "loop_1" + } + ], + "custom_css": null, + "created_at": "2022-01-18T01:51:44+00:00", + "updated_at": "2022-01-18T02:27:20+00:00", + "status": "ACTIVE", + "key": null, + "watchers": [], + "categories": [ + { + "id": 1, + "name": "Uncategorized", + "status": "ACTIVE", + "is_system": 0, + "created_at": "2022-01-04T13:18:09+00:00", + "updated_at": "2022-01-04T13:18:09+00:00", + "pivot": { + "assignable_id": 257, + "category_id": 1, + "category_type": "ProcessMaker\\Models\\ScreenCategory" + } + } + ] + } + ], + "screen_categories": [], + "scripts": [] +} \ No newline at end of file diff --git a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js new file mode 100644 index 000000000..cbc0e5450 --- /dev/null +++ b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js @@ -0,0 +1,99 @@ +describe('Validation Calcs properties and loop', () => { + beforeEach(() => { + cy.server(); + cy.visit('/'); + }); + + it('Data is fully accessible from a collection screen', () => { + cy.loadFromJson('FOUR-4853.json', 0); + cy.get('[data-cy=mode-preview]').click(); + + cy.get('[data-cy=preview-data-input]').click() + .focused() + .type('{ctrl}a') + .type('{\n') + .type('"foo": {\n') + .type('"one": "one",\n"two": "two"'); + + cy.get('[data-cy=mode-editor]').click(); + cy.get('[data-cy=mode-preview]').click(); + + cy.get('[data-cy=preview-content] [data-cy="screen-field-foo.two"]') + .parent() + .should('contain.text', 'two'); + + cy.get(':nth-child(2) > .form-group > :nth-child(1) > div > p') + .should('contain.text', 'output: one'); + }); + + it('Calcs working with select list and loop', () => { + cy.loadFromJson('FOUR-5086.json', 0); + cy.get('[data-cy=mode-preview]').click(); + + cy.get('[data-cy=preview-content] [data-cy="screen-field-form_select_list_1"]').selectOption('Don Quijote'); + + cy.get('[data-cy=preview-content] [data-cy="screen-field-cant"]').type('12'); + + // Check final result + cy.assertPreviewData( + { + + 'form_select_list_1': + [ + { + 'value': + 'https://www.infobae.com/new-resizer/9gv8XYFq7qmOw86jtRR_u7AlDdI=/420x630/filters:format(jpg):quality(85)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2016/07/20201800/mejores-libros-Don-Quijote-sf.jpg', + 'content': + 'Don Quijote', + }, + ], + 'loop_1': + [ + { + 'value': + 'https://www.infobae.com/new-resizer/9gv8XYFq7qmOw86jtRR_u7AlDdI=/420x630/filters:format(jpg):quality(85)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2016/07/20201800/mejores-libros-Don-Quijote-sf.jpg', + 'content': + 'Don Quijote', + 'cant': + 12, + 'tot': + 1200, + }, + ], + 'total': + 1200, + }); + }); + + it('Calcs working with loop', () => { + cy.loadFromJson('FOUR-5161.json', 0); + cy.get('[data-cy=mode-preview]').click(); + + cy.get('[data-cy=preview-content] [name=form_checkbox_1]').click(); + + cy.get('[data-cy=preview-content] [data-cy="screen-field-color"]').type('red'); + + cy.get('[data-cy=loop-loop_1-add]').click(); + + cy.get(':nth-child(2) > .container-fluid > :nth-child(1) > .page > :nth-child(1) > .row > :nth-child(1) > :nth-child(1) > .form-group > [data-cy=screen-field-color]').type('green'); + + // Check final result + cy.get('#screen-builder-container').then((div) => { + const data = div[0].__vue__.previewData; + expect(data).to.eql({ + 'form_checkbox_1': true, + 'loop_1':[ + { + 'decription': 'Color is :red', + 'color': 'red', + }, + { + 'decription': 'Color is :green', + 'color': 'green', + }, + ], + }); + }); + }); + +}); From f8ff5fd89b257a40536c8230636256a5982a20e5 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 08:45:02 -0500 Subject: [PATCH 05/11] Some refactoring for clarity and computedProperties mixin refactored to resolve bug --- src/mixins/ScreenBase.js | 21 +++++++++------------ src/mixins/computedFields.js | 20 ++++++-------------- src/mixins/extensions/ComputedFields.js | 24 +++++++++++++++++++----- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/mixins/ScreenBase.js b/src/mixins/ScreenBase.js index be5502636..1dd265c5e 100644 --- a/src/mixins/ScreenBase.js +++ b/src/mixins/ScreenBase.js @@ -154,21 +154,17 @@ export default { }, setValue(name, value, object = this, defaults = object) { if (object && value !== undefined) { - const splittedName = name.split('.'); - splittedName.forEach((attr, index) => { + const parsedName = name.split('.'); - let isLastElement, setValue; - const originalValue = get(object, attr); + for (const attr of parsedName) { + let setValue; + let index = parsedName.indexOf(attr); + let isLastElement = index === parsedName.length - 1; - if (index === splittedName.length - 1) { - isLastElement = true; - } else { - isLastElement = false; - } + const originalValue = get(object, attr); if (isLastElement) { setValue = value; - } else { setValue = originalValue; @@ -176,7 +172,7 @@ export default { // Check defaults setValue = get(defaults, attr); } - + if (!setValue) { // Still no value? Set empty object setValue = {}; @@ -192,9 +188,10 @@ export default { attr, setValue ); + object = get(object, attr); defaults = get(defaults, attr); - }); + } } }, validationMessage(validation) { diff --git a/src/mixins/computedFields.js b/src/mixins/computedFields.js index c620319b3..0e6d3961d 100644 --- a/src/mixins/computedFields.js +++ b/src/mixins/computedFields.js @@ -1,26 +1,18 @@ -import _ from 'lodash'; import { Parser } from 'expr-eval'; export default { methods: { evaluateExpression(expression, type) { + const self = this; let value = null; try { - const self = this; - const merged = {}; - - _.merge(merged, self.vdata, self._data); - - //monitor if variable belongs to data (defined variables) or vdata (external variables) - //in this way the event is not executed again when the variable is update - const data = new Proxy(merged, { + // Monitor if variable belongs to data (defined variables) or + // vdata (external variables)in this way the event is not + // executed again when the variable is update + const data = new Proxy(Object.assign({}, self, self.vdata), { get(data, name) { - if (undefined !== data[name]) { - return data[name]; - } - - return self.vdata[name]; + return undefined === data[name] ? self.vdata[name] : data[name]; }, set() { throw 'You are not allowed to set properties from inside an expression'; diff --git a/src/mixins/extensions/ComputedFields.js b/src/mixins/extensions/ComputedFields.js index d1be25643..e4d4fb152 100644 --- a/src/mixins/extensions/ComputedFields.js +++ b/src/mixins/extensions/ComputedFields.js @@ -3,14 +3,28 @@ import computedFields from '../computedFields'; export default { methods: { computedFields(screen, definition) { + // Add computed fields screen.mixins.push(computedFields); - definition.computed.forEach(computed => { + + for (const computed of definition.computed) { screen.computed[computed.property] = { - get: new Function(`return this.evaluateExpression(${JSON.stringify(computed.formula)}, ${JSON.stringify(computed.type)});`), - set() {}, + get: (() => { + const formula = JSON.stringify(computed.formula); + const type = JSON.stringify(computed.type); + + return new Function(`return this.evaluateExpression(${formula}, ${type});`); + })(), + set() { + // Do nothing (as it's not allowed) + }, }; - this.addWatch(screen, computed.property, `this.setValue(${JSON.stringify(computed.property)}, value, this.vdata);`); - }); + + this.addWatch( + screen, + computed.property, + `this.setValue(${JSON.stringify(computed.property)}, value, this.vdata);` + ); + } }, }, mounted() { From 57e94060238d41cb5d28263d22a7cd4edfe5a999 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 11:11:06 -0500 Subject: [PATCH 06/11] Updated ComputedFields cypress test to include test for FOUR-5139 --- tests/e2e/fixtures/FOUR-5139.json | 1 + tests/e2e/specs/ComputedFields.spec.js | 45 ++++++++++++++------------ 2 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 tests/e2e/fixtures/FOUR-5139.json diff --git a/tests/e2e/fixtures/FOUR-5139.json b/tests/e2e/fixtures/FOUR-5139.json new file mode 100644 index 000000000..72e11c7d5 --- /dev/null +++ b/tests/e2e/fixtures/FOUR-5139.json @@ -0,0 +1 @@ +{"type":"screen_package","version":"2","screens":[{"id":13,"screen_category_id":"1","title":"FOUR-5139","description":"Fixture to test ticket FOUR-5139","type":"FORM","config":[{"name":"FOUR-5139","items":[{"items":[{"label":"Line Input","config":{"icon":"far fa-square","name":"form_input_1","type":"text","label":"New Input","helper":null,"dataFormat":"string","validation":null,"placeholder":null},"component":"FormInput","inspector":[{"type":"FormInput","field":"name","config":{"name":"Variable Name","label":"Variable Name","helper":"A variable name is a symbolic name to reference information.","validation":"regex:\/^([a-zA-Z]([a-zA-Z0-9_]?)+\\.?)+(? Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####","validation":null}},{"type":"FormInput","field":"customCssSelector","config":{"label":"CSS Selector Name","helper":"Use this in your custom css rules","validation":"regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]"}},{"type":"FormInput","field":"ariaLabel","config":{"label":"Aria Label","helper":"Attribute designed to help assistive technology (e.g. screen readers) attach a label"}},{"type":"FormInput","field":"tabindex","config":{"label":"Tab Order","helper":"Order in which a user will move focus from one control to another by pressing the Tab key","validation":"regex: [0-9]*"}}],"editor-control":"FormInput","editor-component":"FormInput"}],"label":"Loop","config":{"icon":"fas fa-redo","name":"loop_1","label":null,"settings":{"add":true,"type":"existing","times":"3","varname":"loop_1"}},"component":"FormLoop","container":true,"inspector":[{"type":"LoopInspector","field":"settings","config":{"label":null,"helper":null}},{"type":"FormInput","field":"conditionalHide","config":{"label":"Visibility Rule","helper":"This control is hidden until this expression is true"}},{"type":"FormInput","field":"customFormatter","config":{"label":"Custom Format String","helper":"Use the Mask Pattern format
    Date ##\/##\/####
    SSN ###-##-####
    Phone (###) ###-####","validation":null}},{"type":"FormInput","field":"customCssSelector","config":{"label":"CSS Selector Name","helper":"Use this in your custom css rules","validation":"regex: [-?[_a-zA-Z]+[_-a-zA-Z0-9]*]"}},{"type":"FormInput","field":"ariaLabel","config":{"label":"Aria Label","helper":"Attribute designed to help assistive technology (e.g. screen readers) attach a label"}},{"type":"FormInput","field":"tabindex","config":{"label":"Tab Order","helper":"Order in which a user will move focus from one control to another by pressing the Tab key","validation":"regex: [0-9]*"}}],"editor-control":"Loop","editor-component":"Loop"}]}],"computed":[{"id":2,"name":"loop_1","type":"javascript","formula":"let agents = this.loop_1;\n\nif (agents === undefined) {\n agents = [];\n}\n\nreturn agents;","property":"loop_1"}],"custom_css":null,"created_at":"2022-02-16T15:27:59+00:00","updated_at":"2022-02-16T15:29:15+00:00","status":"ACTIVE","key":null,"watchers":[],"categories":[{"id":1,"name":"Uncategorized","status":"ACTIVE","is_system":0,"created_at":"2022-02-16T13:46:12+00:00","updated_at":"2022-02-16T13:46:12+00:00","pivot":{"assignable_id":13,"category_id":1,"category_type":"ProcessMaker\\Models\\ScreenCategory"}}]}],"screen_categories":[],"scripts":[]} \ No newline at end of file diff --git a/tests/e2e/specs/ComputedFields.spec.js b/tests/e2e/specs/ComputedFields.spec.js index 30867504f..ada1399c3 100644 --- a/tests/e2e/specs/ComputedFields.spec.js +++ b/tests/e2e/specs/ComputedFields.spec.js @@ -1,31 +1,36 @@ describe('Computed fields', () => { it.only('Make sure new rows can be added to the loop, even with a javascript-driven computed field', () => { + cy.server(); cy.visit('/'); + cy.loadFromJson('FOUR-5139.json', 0); - // Add a loop and configure it - cy.get('[data-cy=controls-FormLoop]').drag('[data-cy=screen-drop-zone]', 'bottom'); - cy.get('[data-cy=screen-element-container]').click(); - cy.get('[data-cy=inspector-source]').select('existing'); - cy.get('[data-cy=inspector-add]').click(); + // Enter preview mode + cy.get('[data-cy=mode-preview]').click(); - // Add input to loop - cy.get('[data-cy=controls-FormInput]').drag('[data-cy=screen-element-container] .column-draggable div', 'bottom'); + // Add three inputs input in loop + cy.get('[data-cy=loop-loop_1-add]').click(); + cy.get('[data-cy=loop-loop_1-add]').click(); + cy.get('[data-cy=loop-loop_1-add]').click(); - // Create a calculated property - cy.get('[data-cy="topbar-calcs"]').click(); - cy.get('[data-cy="calcs-add-property"]').click(); - cy.get('[data-cy="calcs-property-name"]').clear().type('loop_1'); - cy.get('[data-cy="calcs-property-description"]').clear().type('loop_1'); - cy.get('[data-cy="calcs-switch-javascript"]').click(); - cy.get('[data-cy="calcs-property-javascript"]').type(`let agents = this.loop_1; + cy.get('[data-cy=screen-field-form_input_1]') + .first() + .clear() + .type('First input'); -return (agents === undefined) ? [] : agents;`); - cy.get('[data-cy="calcs-button-save"]').click(); - cy.get('[data-cy="calcs-modal"] .close').click(); - - // Preview - cy.get('[data-cy=mode-preview]').click(); + cy.assertPreviewData({ + "loop_1": [ + { + "form_input_1": "First input" + }, + { + "form_input_1": "" + }, + { + "form_input_1": "" + } + ] + }); }); it('CRUD of computed fields', () => { From ab3258a5376e737e833a46242f49c21b34a296ec Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 11:11:36 -0500 Subject: [PATCH 07/11] Had to remove only() function call in cypress function chain --- tests/e2e/specs/ComputedFields.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/specs/ComputedFields.spec.js b/tests/e2e/specs/ComputedFields.spec.js index ada1399c3..2bdff864c 100644 --- a/tests/e2e/specs/ComputedFields.spec.js +++ b/tests/e2e/specs/ComputedFields.spec.js @@ -1,6 +1,6 @@ describe('Computed fields', () => { - it.only('Make sure new rows can be added to the loop, even with a javascript-driven computed field', () => { + it('Make sure new rows can be added to the loop, even with a javascript-driven computed field', () => { cy.server(); cy.visit('/'); cy.loadFromJson('FOUR-5139.json', 0); From b2724fac38da092a7f25775f73fcfdab1b6726fe Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 12:16:02 -0500 Subject: [PATCH 08/11] Cypress test fix --- tests/e2e/specs/ValidationCalcsAndLoop.spec.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js index cbc0e5450..cf5479e12 100644 --- a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js +++ b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js @@ -4,16 +4,15 @@ describe('Validation Calcs properties and loop', () => { cy.visit('/'); }); - it('Data is fully accessible from a collection screen', () => { + it.only('Data is fully accessible from a collection screen', () => { cy.loadFromJson('FOUR-4853.json', 0); cy.get('[data-cy=mode-preview]').click(); - cy.get('[data-cy=preview-data-input]').click() + cy.get('[data-cy=preview-data-input]') + .click() .focused() - .type('{ctrl}a') - .type('{\n') - .type('"foo": {\n') - .type('"one": "one",\n"two": "two"'); + .type(`{backspace}{backspace}`) + .type(`{\n"foo": {\n"one": "one",\n"two": "two"`); cy.get('[data-cy=mode-editor]').click(); cy.get('[data-cy=mode-preview]').click(); From f0902a5096ac6bced870f158fc6acbe75f08e1e0 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 12:20:05 -0500 Subject: [PATCH 09/11] Removed only() from cypress test (oops) --- tests/e2e/specs/ValidationCalcsAndLoop.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js index cf5479e12..a138df065 100644 --- a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js +++ b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js @@ -4,7 +4,7 @@ describe('Validation Calcs properties and loop', () => { cy.visit('/'); }); - it.only('Data is fully accessible from a collection screen', () => { + it('Data is fully accessible from a collection screen', () => { cy.loadFromJson('FOUR-4853.json', 0); cy.get('[data-cy=mode-preview]').click(); From 30378bc0f45030fe82f10b21db4d110d50c81935 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 12:41:15 -0500 Subject: [PATCH 10/11] Removed backticks and replaced with single quotes to resolve code linting issue --- tests/e2e/specs/ValidationCalcsAndLoop.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js index a138df065..4b4cd411a 100644 --- a/tests/e2e/specs/ValidationCalcsAndLoop.spec.js +++ b/tests/e2e/specs/ValidationCalcsAndLoop.spec.js @@ -11,8 +11,8 @@ describe('Validation Calcs properties and loop', () => { cy.get('[data-cy=preview-data-input]') .click() .focused() - .type(`{backspace}{backspace}`) - .type(`{\n"foo": {\n"one": "one",\n"two": "two"`); + .type('{backspace}{backspace}') + .type('{\n"foo": {\n"one": "one",\n"two": "two"'); cy.get('[data-cy=mode-editor]').click(); cy.get('[data-cy=mode-preview]').click(); From 41a7c46214d6702a519df855f8fbf730e3200116 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 16 Feb 2022 12:46:12 -0500 Subject: [PATCH 11/11] Additional reformatting to resolve linting failure --- tests/e2e/specs/ComputedFields.spec.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/e2e/specs/ComputedFields.spec.js b/tests/e2e/specs/ComputedFields.spec.js index 2bdff864c..155b1e44c 100644 --- a/tests/e2e/specs/ComputedFields.spec.js +++ b/tests/e2e/specs/ComputedFields.spec.js @@ -19,22 +19,23 @@ describe('Computed fields', () => { .type('First input'); cy.assertPreviewData({ - "loop_1": [ - { - "form_input_1": "First input" - }, - { - "form_input_1": "" - }, - { - "form_input_1": "" - } - ] + 'loop_1': [ + { + 'form_input_1': 'First input', + }, + { + 'form_input_1': '', + }, + { + 'form_input_1': '', + }, + ], }); }); it('CRUD of computed fields', () => { cy.visit('/'); + // Create a calculated property cy.get('[data-cy="topbar-calcs"]').click(); cy.get('[data-cy="calcs-add-property"]').click();