/*! * Monday Webforms for CoreMedia v1.9.3, (c) 2018 Monday Consulting GmbH * * @see https://monday-webforms.com/ */ /*global define, window, document, jQuery, exports, require */ ;(function(factory) { "use strict"; if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof exports === 'object' && typeof require === 'function') { // Node/CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function($) { "use strict"; // polyfill for customevent for IE10 (function() { function CustomEvent(event, params) { params = params || {bubbles: false, cancelable: false, detail: undefined}; var evt = document.createEvent('CustomEvent'); evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); return evt; } CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; })(); var EVENTS = { AJAX_FINISHED: "mwf-ajax-finished", AJAX_ERROR: "mwf-ajax-error", FILL_DROPDOWN: "mwf-fill-dropdown", FILL_SELECTION: "mwf-fill-selection", FILL_HIDDEN: "mwf-fill-hidden", SUGGESTION_SELECTED: "mwf-suggestion-selected", VALUE_CHANGED: "mwf-value-changed" }, globalSettings = {}; function triggerEvent(el, eventName, options) { var event; if (window.CustomEvent) { event = new CustomEvent(eventName, options); } else { event = document.createEvent('CustomEvent'); event.initCustomEvent(eventName, true, true, options); } el.dispatchEvent(event); } function globalSettingsWithVariant(variant) { return variant === undefined ? globalSettings.def : $.extend(true, {}, globalSettings.def, globalSettings[variant]); } /** * Monday Webforms jQuery-Plugin * @constructor */ function Webforms(elem, settings) { var plugin = this, $elem = $(elem), operators = {}, formdata = {}, filenames = {}, uiState = { visible: {}, hidden: {}, writable: {}, readonly: {}, optional: {}, mandatory: {}, disabled: {}, enabled: {} }, stateMapping = { visible: 'hidden', hidden: 'visible', writable: 'readonly', readonly: 'writable', optional: 'mandatory', mandatory: 'optional', disabled: 'enabled', enabled: 'disabled' }, $form = $elem.is('form') ? $elem : $elem.find("form"), formId = $form.dataWithDefault('mwf-id', $form.data('mwf-form')), targetUrl = $form.dataWithDefault('mwf-target', settings.url), statisticsUrl = settings.statisticsUrl; if (settings.formdata !== undefined) { formdata = settings.formdata; } if (!statisticsUrl || 0 === statisticsUrl.length) { statisticsUrl = null; } plugin.settings = settings; /* internal utility functions ----------------------------------------------------------------------------------------------------------- */ function updateUI(fields, conditionId, cond) { var s, i, inverseState, isTrue, isFalse, state, input, conditionalFieldsState = { 'visible': [], 'hidden': [], 'writable': [], 'readonly': [], 'optional': [], 'mandatory': [], 'enabled': [], 'disabled': [] }; // clear UI state of this condition for (s in uiState) { if (uiState.hasOwnProperty(s)) { delete uiState[s][conditionId]; } } for (i = 0; i < fields.length; i++) { input = fields[i].input; state = fields[i].state; if (cond) { conditionalFieldsState[state].push(input); } uiState[state][conditionId] = conditionalFieldsState[state]; inverseState = stateMapping[state]; isTrue = containsState(state, input); isFalse = containsState(inverseState, input); if (isTrue) { plugin.settings.operations[state]($form, fields[i]); if (plugin.settings.onConditionTrue !== undefined) { plugin.settings.onConditionTrue($form, fields[i], state); } } else if (isFalse || !isTrue) { plugin.settings.operations[inverseState]($form, fields[i]); if (plugin.settings.onConditionFalse !== undefined) { plugin.settings.onConditionFalse($form, fields[i], inverseState); } } } } function containsState(type, input) { var state = uiState[type], cond; for (cond in state) { if (state.hasOwnProperty(cond) && $.inArray(input, state[cond]) > -1) { return true; } } return false; } function valueChanged($elem) { if (!$elem.is(':file')) { formdata = serializeForm($form); $form.trigger("mwf-valuechange", $elem); } } function startsWith(formValue, value) { if (formValue == null || value == null) { return false; } return formValue.match(new RegExp("^" + value)) == value; } function serializeForm($form) { var o = {}, a = $form.serializeArray(), form = $form.get(0); $.each(a, function() { var input = form.querySelector('[name="' + this.name + '"]'), value = this.value || '', type = input.getAttribute('type'), key; if (type === 'radio' || type === 'checkbox' || input.nodeName.toLowerCase() === 'select') { if (!o.hasOwnProperty(this.name)) { o[this.name] = []; } if (startsWith(value, '{')) { try { key = JSON.parse(value).k; } catch (ex) { // do nothing } } else if (value === 'EMPTY_VALUE') { value = ''; } o[this.name].push((key !== undefined) ? key : value); } else if (type === 'hidden') { if (startsWith(value, '{')) { try { key = JSON.parse(value).v; } catch (ex) { // do nothing } } o[this.name] = (key !== undefined) ? key : value; } else { o[this.name] = value; } }); $.each(form.querySelectorAll('input[type="checkbox"]:not(:checked),input[type="radio"]:not(:checked)'), function() { var name = this.getAttribute('name'); if (!o.hasOwnProperty(name)) { o[name] = ''; } }); return o; } function valueLabel(name, v) { var l = []; $.each($form.find('[name="' + name + '"]'), function() { var $input = $(this); if ($input.is(':radio') || $input.is(':checkbox')) { if ($.inArray($input.attr('data-mwf-value'), v) !== -1) { l.push($input.attr('data-mwf-label')); } } else if ($input.is('select')) { $.each($input.find('option'), function() { var $option = $(this); if ($.inArray($option.attr('data-mwf-value'), v) !== -1) { l.push($option.attr('data-mwf-label')); } }); } else if ($input.is(':file')) { $.merge(l, filenames[name]); } else { l.push(v); } }); return l; } /* API functions ----------------------------------------------------------------------------------------------------------- */ function maxSelected(array, max) { var m = Number(max), l = (array !== null) ? array.length : 0; return (l < m); } function minSelected(array, min) { var m = Number(min), l = (array !== null) ? array.length : 0; return (l > m); } function isSelected(array, s) { return array != null && $.inArray(s, array) > -1; } function parseAge(format, str) { if (str == null) { return null; } var date = parseDate(format, str), today = new Date(); return Math.floor((today - date) / (365.25 * 24 * 60 * 60 * 1000)); } function parseDate(format, date) { if (date == null) { return null; } return $.format.date(date, format); } function isEmptyList(array) { var i, s; if (array != null) { for (i = 0; i < array.length; i++) { s = String(array[i]); if (s !== null && s !== '' && s !== 'EMPTY_VALUE') { return false; } } } return true; } function ajaxFillSelection($elem, attr) { var data = $.extend(formdata, attr.data); if ((attr.createEntry === undefined)) { attr.createEntry = (attr.type === 'checkbox') ? plugin.settings.createCheckBox : plugin.settings.createRadio; } if ((attr.onFillSelection === undefined)) { attr.onFillSelection = plugin.settings.onFillSelection; } $.ajax({ url: attr.url, type: 'POST', data: data, traditional: true, cache: false, xhrFields: { withCredentials: true } // gfi added }) .done(function(json) { var pre = attr.preselected.split(','), i, entry; $elem.find('[data-mwf-mutable]').remove(); for (i in json) { if (json.hasOwnProperty(i)) { entry = json[i]; $elem.append(attr.createEntry($form, attr.name, entry, $.inArray(entry.k, pre) !== -1)); } } attr.onFillSelection($form, $elem); triggerEvent(document, EVENTS.FILL_SELECTION, {detail: {$form: $form, $elem: $elem}}); }) .fail(function(jqXHR, textStatus, errorThrown) { plugin.settings.onAjaxError(jqXHR, textStatus, errorThrown); }); } function ajaxFillHidden($elem, attr) { var data = $.extend(formdata, attr.data); $.ajax({ url: attr.url, type: 'POST', data: data, traditional: true, cache: false, xhrFields: { withCredentials: true } // gfi added }) .done(function(json) { $elem.val(JSON.stringify(json)); $elem.attr('data-mwf-value', json.v); $elem.trigger('change'); triggerEvent(document, EVENTS.FILL_HIDDEN, {detail: {$form: $form, $elem: $elem}}); }) .fail(function(jqXHR, textStatus, errorThrown) { plugin.settings.onAjaxError(jqXHR, textStatus, errorThrown); }); } function ajaxFillDropdown($elem, attr) { var data = $.extend(formdata, attr.data); if ((attr.createOption === undefined)) { attr.createOption = plugin.settings.createOption; } if ((attr.onFillDropdown === undefined)) { attr.onFillDropdown = plugin.settings.onFillDropdown; } $.ajax({ url: attr.url, type: 'POST', data: data, traditional: true, cache: false, xhrFields: { withCredentials: true } // gfi added }) .done(function(json) { var $option, i, entry, pre = attr.preselected.split(','); $elem.find('[data-mwf-mutable]').remove(); for (i in json) { if (json.hasOwnProperty(i)) { entry = json[i]; $option = attr.createOption($form, entry, $.inArray(entry.k, pre) !== -1); $elem.append($option); } } attr.onFillDropdown($form, $elem); triggerEvent(document, EVENTS.FILL_DROPDOWN, {detail: {$form: $form, $elem: $elem}}); }) .fail(function(jqXHR, textStatus, errorThrown) { plugin.settings.onAjaxError(jqXHR, textStatus, errorThrown); }); } function ajaxAutocomplete($elem, attr) { var chars = 1; if (attr.params.chars !== undefined) { chars = attr.params.chars; } var onSelect = function(selection) { triggerEvent(document, EVENTS.SUGGESTION_SELECTED, { detail: { $form: $form, $elem: $elem, id: formId, selection: selection, params: attr.params } }); if ($.isFunction(attr.onSelect)) { attr.onSelect(arguments); } }; $elem.autocomplete({ paramName: 'query', params: attr.data, serviceUrl: attr.url, maxHeight: 150, noCache: true, minChars: chars, type: 'POST', onSelect: onSelect, autoSelectFirst: true, sendFormData: true, transformResult: function(response) { response = JSON.parse(response); return { suggestions: $.map(response, function(entry, key) { return {value: entry.v, data: entry.k}; }) }; } }); } function ajaxSubmit(opt) { var $buttons = $form.find(':button').filter(':not(:disabled)'), data = {_parentUrl: window.location.href}; if (plugin.settings.appendUrlVars) { $.extend(data, $.getUrlVars(window.location.search)); delete data.view; } $.extend(data, $.getUrlVars(opt.query), opt.data, $form.serializeObject()); if (opt.onSubmit !== undefined) { if (!opt.onSubmit($form, opt.url, opt.query)) { return; } } $buttons.prop('disabled', true); $.ajax({ url: opt.url, type: 'POST', data: data, traditional: true, cache: false, xhrFields: { withCredentials: true } // gfi added }) .done(function(data, textStatus, jqXHR) { if (jqXHR && jqXHR.getResponseHeader("webforms_redirect")) { if (opt.onRedirect !== undefined) { opt.onRedirect($form, data, textStatus, jqXHR); } var timeout = (jqXHR.getResponseHeader('webforms_redirect_delay') || 0) * 1000; setTimeout(function() { location.assign(jqXHR.getResponseHeader('webforms_redirect')); }, timeout); if (!timeout) { return; } } $elem = $elem.replaceWithPush(data); $form = $elem.is('form') ? $elem : $elem.find("form"); if (opt.onSuccess !== undefined) { opt.onSuccess($form, data, textStatus, jqXHR); } triggerEvent(document, EVENTS.AJAX_FINISHED, {detail: {$dest: $elem}}); }) .fail(function(jqXHR, textStatus, errorThrown) { if (opt.onError !== undefined) { opt.onError($form, jqXHR, textStatus, errorThrown); } $buttons.prop('disabled', false); triggerEvent(document, EVENTS.AJAX_ERROR, { detail: { $dest: $elem, jqXHR: jqXHR, textStatus: textStatus, errorThrown: errorThrown } }) }); } function createCondition(conditionId, conjunction, conditions, fields) { var checkCondition = function() { var all = true, any = false, condTrue, i, formValue, cond; for (i = 0; i < conditions.length; i++) { cond = conditions[i]; if (!cond) { continue; } formValue = formdata[cond[1]]; if (formValue === undefined) { formValue = cond[4]; } condTrue = operators[cond[2]](formValue, cond[3]); if (condTrue) { any = true; } else { all = false; } if (!conjunction && any) { break; } } updateUI(fields, conditionId, (all || (!conjunction && any))); }; // register event listener $form.on('mwf-valuechange', function(e, input) { var cond, i; for (i = 0; i < conditions.length; i++) { cond = conditions[i]; if (!cond) { continue; } if ($(input).attr("name") === conditions[i][1]) { checkCondition(); } } }); // check conditions initially checkCondition(); if (plugin.settings.onConditionCreated !== undefined) { plugin.settings.onConditionCreated($form, conditionId, conjunction, conditions, fields); } } function createCalculatedValue(calcValueId, js, fields, formVariables, updateValue) { updateValue = (updateValue === undefined) ? plugin.settings.updateCalculatedValue : updateValue; var name, id = calcValueId, vars = formVariables, fct, calculate = function() { var state = $.extend({}, fields, formdata, vars), result = fct(state), $field = $form.find('[data-mwf-id="' + id + '"]'); updateValue($form, id, result); $field.val(result).trigger('change'); }; try { eval('fct = function(s) {' + js + '}'); } catch (ex) { $.logError(ex.message); } // register event listener $form.on('mwf-valuechange', function(e, input) { for (name in fields) { if (fields.hasOwnProperty(name) && $(input).attr('name') === name) { calculate(); break; } } }); } function recursiveEach(obj, callback, maxDeep) { var history = [], deep = -1, _recursiveEach; if (maxDeep === undefined) { maxDeep = Number.MAX_VALUE; } _recursiveEach = function(obj, callback) { var p, o, i, names = Object.getOwnPropertyNames(obj || {}); deep++; for (i = 0; i < names.length; i++) { p = names[i]; o = obj[p]; if (typeof o === "object") { if (deep < maxDeep && $.inArray(o, history) === -1) { history.push(o); _recursiveEach(o, callback); } } else { if (callback.call(obj, obj, p, o) === false) { break; } } } deep--; }; _recursiveEach(obj, callback); } /* condition operators ----------------------------------------------------------------------------------------------------------- */ operators.contains = function(formValue, value) { if (formValue == null || value == null) { return false; } return formValue.indexOf(value) !== -1; }; operators.containsnot = function(formValue, value) { if (formValue == null || value == null) { return false; } return formValue.indexOf(value) === -1; }; operators.startswith = function(formValue, value) { return startsWith(formValue, value); }; operators.endswith = function(formValue, value) { if (formValue == null || value == null) { return false; } return formValue.match(new RegExp(value + "$")) == value; }; operators.equal = function(formValue, value) { if (formValue == null || value == null) { return formValue === value; } var f1 = parseFloat(formValue.replace(',', '.')), f2 = parseFloat(value.replace(',', '.')); return (!isNaN(f1) && !isNaN(f2) && f1 === f2) || (formValue === value); }; operators.notequal = function(formValue, value) { if (formValue == null || value == null) { return formValue !== value; } var f1 = parseFloat(formValue.replace(',', '.')), f2 = parseFloat(value.replace(',', '.')); return (!isNaN(f1) && !isNaN(f2) && f1 !== f2) || (formValue !== value); }; operators.empty = function(formValue, value) { return formValue == null || formValue === ''; }; operators.notempty = function(formValue, value) { return formValue != null && formValue !== ''; }; operators.emptylist = function(formValue, value) { return isEmptyList(formValue); }; operators.notemptylist = function(formValue, value) { return !isEmptyList(formValue); }; operators.selected = function(formValue, value) { if (formValue == null || value == null) { return false; } return $.inArray(value, formValue) !== -1; }; operators.notselected = function(formValue, value) { if (formValue == null || value == null) { return false; } return $.inArray(value, formValue) === -1; }; operators.minselected = function(formValue, value) { var l = (formValue == null) ? 0 : formValue.length; return l > Number(value); }; operators.maxselected = function(formValue, value) { var l = (formValue == null) ? 0 : formValue.length; return l < Number(value); }; operators.lessthan = function(formValue, value) { if (formValue == null || value == null) { return false; } var f1 = parseFloat(formValue.replace(',', '.')), f2 = parseFloat(value.replace(',', '.')); return (!isNaN(f1) && !isNaN(f2) && f1 < f2); }; operators.greaterthan = function(formValue, value) { if (formValue == null || value == null) { return false; } var f1 = parseFloat(formValue.replace(',', '.')), f2 = parseFloat(value.replace(',', '.')); return (!isNaN(f1) && !isNaN(f2) && f1 > f2); }; /* public methods ----------------------------------------------------------------------------------------------------------- */ plugin.formSubmit = function(opt) { ajaxSubmit({ url: targetUrl, id: formId, query: (opt.query !== undefined) ? opt.query : '', onSubmit: (opt.submit !== undefined) ? opt.submit : plugin.settings.onSubmit, onSuccess: (opt.success !== undefined) ? opt.success : plugin.settings.onSuccess, onError: (opt.error !== undefined) ? opt.error : plugin.settings.onAjaxError, onRedirect: (opt.redirect !== undefined) ? opt.redirect : plugin.settings.onRedirect }); }; plugin.gotoPage = function(opt) { ajaxSubmit({ url: targetUrl, id: formId, query: opt.query.concat('&_target', opt.page, '=', opt.page), onSubmit: (opt.submit !== undefined) ? opt.submit : plugin.settings.onSubmit, onSuccess: (opt.success !== undefined) ? opt.success : plugin.settings.onSuccess, onError: (opt.error !== undefined) ? opt.error : plugin.settings.onAjaxError, onRedirect: (opt.redirect !== undefined) ? opt.redirect : plugin.settings.onRedirect }); }; plugin.init = function() { recursiveEach(settings, function(obj, property, value) { if (typeof value === 'string' && value.trim().substring(0, 8) === 'function') { try { eval('obj[property] =' + value); } catch (ex) { $.logError(ex.message); } } }, 1); $form.on('change', function(event) { valueChanged($(event.target)); if (statisticsUrl !== null) { $.ajax({ url: statisticsUrl, xhrFields: { withCredentials: true } // gfi added }); statisticsUrl = null; } }); if (targetUrl === undefined) { $.logError('No target URL specified.') } $.each($form.find('[data-mwf-submit]'), function() { var attr = $(this).data('mwf-submit'), query = (attr.query !== undefined) ? attr.query : '', onSuccess = (attr.success !== undefined) ? attr.success : plugin.settings.onSuccess, onRedirect = (attr.redirect !== undefined) ? attr.redirect : plugin.settings.onRedirect, onError = (attr.error !== undefined) ? attr.error : plugin.settings.onAjaxError, onSubmit = (attr.submit !== undefined) ? attr.submit : plugin.settings.onSubmit; switch (attr.type) { case 'next': case 'back': case 'goto': query = query.concat('&_target', attr.page, '=', attr.page); break; case 'cancel': case 'exit': case 'finish': query = query.concat('&_', attr.type, '=1'); break; } $(this).on('click', function() { ajaxSubmit({ url: targetUrl, id: formId, query: query, onSubmit: onSubmit, onSuccess: onSuccess, onError: onError, onRedirect: onRedirect }); }); }); $.each($form.find('[data-mwf-bind]'), function() { var name = $(this).data('mwf-bind'), $elem = $(this); $form.on('mwf-valuechange', function(e, input) { var v, l; if ($(input).attr('name') === name) { v = formdata[name]; l = valueLabel(name, v); plugin.settings.updateFormValue($form, $elem, name, l); triggerEvent(document, EVENTS.VALUE_CHANGED, { detail: { $form: $form, $elem: $elem, name: name, value: l } }); return false; } }); }); $.each($form.find('[data-mwf-fileupload]'), function() { var $upload = $(this), attr = $(this).data('mwf-fileupload'), $dropzone = $upload.find('[data-mwf-dropzone]'), $files = $upload.find('[data-mwf-files]'), $fileInput = $upload.find('input:file'), multiple = $fileInput.attr('multiple') !== undefined, useXhr = (!multiple && $.support.xhrFileUpload) || $.support.xhrFormDataFileUpload, count = 0, pendingList = [], errorRows = [], enabled = true, $buttons = null; $upload.find('[data-mwf-file-upload-all]').on('click', function() { pendingList.forEach(function(data) { data.submit(); }); pendingList = []; }); $upload.find('[data-mwf-file-delete-all]').on('click', function() { $files.find('[data-mwf-file-delete]').trigger('click'); pendingList = []; }); $upload.on('disable', function() { enabled = false; $upload.fileupload('disable'); $upload.addClass('mwf-upload-disabled'); $upload.find(':button').prop('disabled', true); $fileInput.prop('disabled', true); }); $upload.on('enable', function() { enabled = true; $upload.fileupload('enable'); $upload.removeClass('mwf-upload-disabled'); $upload.find(':button').prop('disabled', false); $fileInput.prop('disabled', false); }); $dropzone.on('dragover', function() { if (enabled) { $(this).addClass('mwf-upload-dragover'); } }); $dropzone.on('dragleave drop', function() { $(this).removeClass('mwf-upload-dragover'); }); $upload.fileupload({ url: attr.url, paramName: attr.name, dataType: 'json', dropZone: $dropzone, fileInput: $fileInput, previewMaxWidth: attr.previewMaxWidth, previewMaxHeight: attr.previewMaxHeight, previewCrop: true, maxNumberOfFiles: 1, formData: {xhr: useXhr}, add: function(e, data) { var $this = $upload; if (!enabled) { return false; } $.each(errorRows, function(index, $row) { $row.remove(); }); if (multiple || count === 0) { count++; } else { return false; } pendingList.push(data); data.process(function() { return $this.fileupload('process', data); }).always(function() { $.each(data.files, function(index, file) { var $row = plugin.settings.createUploadFileRow($form, attr, file); data.context = $row; $row.find('[data-mwf-file-upload]').data(data).on('click', function() { pendingList.splice($.inArray(data, pendingList), 1); data.submit(); }); $row.find('[data-mwf-file-delete]').data(data).on('click', function() { $row.remove(); pendingList.splice($.inArray(data, pendingList), 1); count--; }); $row.find('[data-mwf-file-preview]').append(file.preview); $files.append($row); }); if (attr.autoUpload === true) { data.submit(); } }); }, submit: function(e, data) { if ($buttons === null) { data.xhrFields= { withCredentials: true }; // gfi added $buttons = $form.find(':button').filter(':not(:disabled)'); $buttons.prop('disabled', true); } }, progress: function(e, data) { var progress = parseInt(data.loaded / data.total * 100, 10); if (data.context) { data.context.each(function() { data.context.find('[data-mwf-file-progress]').attr('aria-valuenow', progress).css('display', 'block').children().first().css('width', progress + '%').text(progress + '%'); }); } }, done: function(e, data) { var files = (typeof data.result === 'string') ? JSON.parse(data.result).files : data.result.files; $.each(files, function(index, file) { var $row = plugin.settings.createDownloadFileRow($form, attr, file); if (data.context !== undefined) { data.context.replaceWith($row) } else { $files.append($row); } if (file.error === undefined) { $row.find('[data-mwf-file-delete]').on('click', function() { if (file.delete_url) { $.ajax({ url: file.delete_url, xhrFields: { withCredentials: true } // gfi added }); } $row.remove(); pendingList.splice($.inArray(data, pendingList), 1); // update filenames if (filenames.hasOwnProperty(attr.name)) { filenames[attr.name].splice($.inArray(file.name, filenames[attr.name]), 1); $form.trigger("mwf-valuechange", data.fileInput); } count--; }); // update filenames if (!filenames.hasOwnProperty(attr.name)) { filenames[attr.name] = []; } filenames[attr.name].push(file.name); $form.trigger("mwf-valuechange", data.fileInput); } else { $row.find('[data-mwf-file-delete]').on('click', function() { $row.remove(); pendingList.splice($.inArray(data, pendingList), 1); }); errorRows.push($row); count--; } }); }, fail: function(e, data) { $.each(data.files, function(index, file) { var $row = plugin.settings.createDownloadFileRow($form, attr, { name: file.name, size: file.size, error: attr.labels.error }); $row.find('[data-mwf-file-delete]').data(data).on('click', function() { $row.remove(); pendingList.splice($.inArray(data, pendingList), 1); }); errorRows.push($row); count--; if (data.context !== undefined) { data.context.replaceWith($row) } else { $files.append($row); } }); }, always: function(e, data) { if ($buttons !== null && $upload.fileupload('active') === 1) { $buttons.prop('disabled', false); $buttons = null; } } }); // preload existing files $.ajax({ url: attr.url, dataType: "json", data: {_name: attr.name, _do: 'files'}, xhrFields: { withCredentials: true } // gfi added }).done(function(result) { $upload.fileupload('option', 'done').call($upload, $.Event('done'), {result: result}); count = result.files.length; }); }); $.each($form.find('[data-mwf-datasource]'), function() { var def = { params: {}, data: {} }, attr = $.extend(true, {}, def, $(this).data('mwf-datasource')), $elem = $(this); switch (attr.type) { case 'checkbox': case 'radio': ajaxFillSelection($elem, attr); $form.on('mwf-valuechange', function(e, input) { if ($.trim(attr.params.dependsOn)) { $.each(attr.params.dependsOn.split(','), function(i, v) { if ($(input).attr('name') === v) { ajaxFillSelection($elem, attr); return false; } }); } }); break; case 'selection': ajaxFillDropdown($elem, attr); $form.on('mwf-valuechange', function(e, input) { if ($.trim(attr.params.dependsOn)) { $.each(attr.params.dependsOn.split(','), function(i, v) { if ($(input).attr('name') === v) { ajaxFillDropdown($elem, attr); return false; } }); } }); break; case 'suggestion': ajaxAutocomplete($elem, attr); break; case 'hidden': ajaxFillHidden($elem, attr); $form.on('mwf-valuechange', function(e, input) { if ($.trim(attr.params.dependsOn)) { $.each(attr.params.dependsOn.split(','), function(i, v) { if ($(input).attr('name') === v) { ajaxFillHidden($elem, attr); return false; } }); } }); break; default: $.logError(attr.type === undefined ? 'Please specifiy the datasource type (checkbox, radio, selection or suggestion).' : 'Unknown datasource type "'.concat(attr.type, '".')); } }); //gfi added (behebt Fehler bei dropdowns mit conditions die initial nicht ausgewertet waren): formdata = serializeForm($form); // gfi added end $.each(plugin.settings.conditions, function() { createCondition($(this).attr('id'), $(this).attr('conjunction'), $(this).attr('conditions'), $(this).attr('fields')); }); $.each(plugin.settings.calculatedValues, function() { createCalculatedValue($(this).attr('id'), $(this).attr('js'), $(this).attr('fields'), $(this).attr('vars')); }); plugin.settings.onInit($form); }; plugin.init(); } /* default plugin settings ----------------------------------------------------------------------------------------------------------- */ globalSettings.def = { appendUrlVars: false, operations: {}, conditions: [], calculatedValues: [], fileuploadOptions: {}, onConditionTrue: undefined, onConditionFalse: undefined, statisticsUrl: null }; globalSettings.def.operations['visible'] = function($form, field) { var $field = $form.find('[data-mwf-container="' + field.input + '"]'); $field.removeAttr('disabled'); $field.removeClass('mwf-hidden'); }; globalSettings.def.operations['hidden'] = function($form, field) { var $field = $form.find('[data-mwf-container="' + field.input + '"]'); $field.attr("disabled", "true"); $field.addClass('mwf-hidden'); }; globalSettings.def.operations['writable'] = function($form, field) { var $field = $form.find('[data-mwf-id="' + field.input + '"]'); $field.removeAttr('readonly'); }; globalSettings.def.operations['readonly'] = function($form, field) { var $field = $form.find('[data-mwf-id="' + field.input + '"]'); $field.val(field.value); $field.attr("readonly", "true"); }; globalSettings.def.operations['enabled'] = function($form, field) { var $field = $form.find('[data-mwf-id="' + field.input + '"]'); $field.removeAttr('disabled'); $field.trigger('enable'); }; globalSettings.def.operations['disabled'] = function($form, field) { var $field = $form.find('[data-mwf-id="' + field.input + '"]'); $field.attr("disabled", "true"); $field.trigger('disable'); }; globalSettings.def.operations['optional'] = function($form, field) { var $label = $form.find('label[for="' + field.input + '"]'); $label.children('span.mwf-required').remove(); }; globalSettings.def.operations['mandatory'] = function($form, field) { var $label = $form.find('label[for="' + field.input + '"]'), $span = $('').attr('class', 'mwf-required').text('*'); $label.children('span.mwf-required').remove(); $label.append($span); }; globalSettings.def.createOption = function($form, entry, selected) { var $option = $('') .attr('data-mwf-value', entry.k) .attr('data-mwf-label', entry.v) .attr('data-mwf-mutable', '') .attr('value', JSON.stringify(entry)) .append(entry.v); if (selected) { $option.attr('selected', true); } return $option; }; globalSettings.def.createRadio = function($form, name, entry, checked) { var $span, $input, $label; $span = $('') .attr('class', 'mwf-option') .attr('data-mwf-mutable', ''); $input = $('') .attr('type', 'radio') .attr('id', entry.i) .attr('data-mwf-id', entry.i) .attr('data-mwf-value', entry.k) .attr('data-mwf-label', entry.v) .attr('value', JSON.stringify(entry)) .attr('name', name) .attr('class', 'mwf-radio'); if (checked) { $input.attr('checked', 'checked'); } $label = $('') .attr('for', entry.i).append(entry.v); $span.append($input); $span.append(' '); $span.append($label); return $span; }; globalSettings.def.createCheckBox = function($form, name, entry, checked) { var $span, $input, $label; $span = $('') .attr('class', 'mwf-option') .attr('data-mwf-mutable', ''); $input = $('') .attr('type', 'checkbox') .attr('id', entry.i) .attr('data-mwf-id', entry.i) .attr('data-mwf-value', entry.k) .attr('data-mwf-label', entry.v) .attr('value', JSON.stringify(entry)) .attr('name', name) .attr('class', 'mwf-checkbox'); if (checked) { $input.attr('checked', 'checked'); } $label = $('') .attr('for', entry.i).append(entry.v); $span.append($input); $span.append(' '); $span.append($label); return $span; }; globalSettings.def.updateFormValue = function($form, $elem, name, v) { $elem.html($.isArray(v) ? v.join(', ') : v); }; globalSettings.def.createUploadFileRow = function($form, attr, file) { var $row, $fileinfo, $meta, $preview, $ul, $name, $size, $buttons, $upload, $delete, $span, $progress, $error; $row = $('
').attr('data-mwf-file', '').attr('class', 'mwf-upload-row'); $fileinfo = $('
').attr('class', 'mwf-upload-fileinfo'); $preview = $('
').attr('data-mwf-file-preview', '').attr('class', 'mwf-upload-preview'); $meta = $('
').attr('class', 'mwf-upload-metadata'); $ul = $('
    '); $name = $('
  • ').text(attr.labels.name + ': ' + file.name); $size = $('
  • ').text(attr.labels.size + ': ' + $.formatSize(file.size)); $buttons = $('
    ').attr('class', ' mwf-upload-actions'); $upload = $('