function ExtractXmlDocumentFromFrame(frame) { var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document; if (doc == null) return null; if (doc.XMLDocument) return $(doc.XMLDocument); else return $(doc); } $.fn.sm_show_grid_error = function (a_options) { var _this = this; var grid; var defaults = { errorMessageHeader: 'Errors:', errorMessage: 'Some error message', columnSpan: 0, useBlockGUI: false }; var options = $.extend(defaults, a_options); function ConstructErrorRow() { var row = $(''); var cell = $(''); cell.attr('colspan', options.columnSpan); cell.addClass('odd'); cell.addClass('grid_error_row'); var errorPanel = $('
'); errorPanel.addClass('alert').addClass('alert-error'); errorPanel.append('' + options.errorMessageHeader + '
'); errorPanel.append(options.errorMessage); var closeButton = $(''); closeButton.addClass('close'); closeButton .click(RemoveErrorPanelHandler); errorPanel.prepend(closeButton); row.append(cell); cell.append(errorPanel); return row; } function RemoveErrorPanelHandler(event) { event.preventDefault(); var errorRow = $(this).closest('tr'); RemoveErrorPanel(errorRow); } function RemoveErrorPanel(errorRow) { var errorPanel = errorRow.find('div.grid_error_message'); errorPanel.remove(); errorRow.remove(); } function construct() { grid = $(_this); grid.each(function () { $(this).find('> thead > tr.header').before(ConstructErrorRow()); }); return _this; } return construct(); } $.fn.sm_inline_grid_edit = function (a_options) { var _this = this; var defaults = { row: null, debug: false, editControlsContainer: '[data-column-name=InlineEdit]', initEditControl: 'a.inline_edit_init', cancelEditControl: 'a.inline_edit_cancel', commitEditControl: 'a.inline_edit_commit', cancelInsertControl: 'a.inline_insert_cancel', commitInsertControl: 'a.inline_insert_commit', requestAddress: '', useBlockGUI: true, inlineAddControl: '.inline_add_button', cancelButtonHint: 'Cancel', commitButtonHint: 'Commit', useImagesForActions: true, newRecordRowTemplate: '.new-record-row[data-new-row=false]', newRecordAfterRowTemplate: '.new-record-after-row[data-new-row=false]', responseCheckCount: 200, editingErrorMessageHeader: 'Errors:' }; var options = $.extend(defaults, a_options); var grid; function ClearErrorRow() { var row = $('td.grid_error_row').closest('tr'); row.remove(); } function SetupEditControls(editControlsContainer) { var initEditControl = editControlsContainer.find(options.initEditControl); initEditControl.click(InlineEditHandler); var cancelControl = editControlsContainer.find(options.cancelEditControl); cancelControl.click(CancelEditingClickHandler) var commitControl = editControlsContainer.find(options.commitEditControl); commitControl.click(CommitClickHandler); HideCompleteEditControls(editControlsContainer); } function HideInitEditControls(editControlsContainer) { editControlsContainer.find(options.initEditControl).hide(); } function ShowInitEditControls(editControlsContainer) { editControlsContainer.find(options.initEditControl).show(); } function HideCompleteEditControls(editControlsContainer) { editControlsContainer.find(options.cancelEditControl).hide(); editControlsContainer.find(options.commitEditControl).hide(); } function ShowCompleteEditControls(editControlsContainer) { editControlsContainer.find(options.cancelEditControl).show(); editControlsContainer.find(options.commitEditControl).show(); } function CancelEditingClickHandler(event) { event.preventDefault(); var cancelControl = $(this); var row = cancelControl.closest('tr'); var editControlsContainer = cancelControl.closest(options.editControlsContainer); CancelInlineEditing(row, editControlsContainer); } function CommitClickHandler(event) { event.preventDefault(); var commitControl = $(this); var row = commitControl.closest('tr'); var editControlsContainer = commitControl.closest(options.editControlsContainer); CommitInlineEditing(row, editControlsContainer); } function CompleteEditing(editControlsContainer) { ShowInitEditControls(editControlsContainer); HideCompleteEditControls(editControlsContainer); DestroyValidationErrorContainer(editControlsContainer); ClearErrorRow(); require(['pgui.controls'], function(ctrls) { ctrls.destroyEditors(editControlsContainer); }); } function ReturnOldHtmlForCell(dataCell) { var oldHtml = dataCell.children('div.phpgen-ui-inline-edit-cell-old-data').html(); dataCell.html(oldHtml); } function EmbedEditorFromXml(row, editorXmlElement, isInsert) { var editorHtml = editorXmlElement.find('html').text(); var editorScript = editorXmlElement.find('script').text(); var editorFieldName = editorXmlElement.attr('name'); var dataCell = row.find('[data-column-name="' + editorFieldName + '"]'); dataCell.attr('data-inline-editing', 'true'); var inlineEditorContainer = $('
'); inlineEditorContainer.addClass('inline_editor_container'); var form = $('
').addClass('inline-edit-editor-form'); form.append(editorHtml); inlineEditorContainer.append(form); var oldHtmlContainer = $('
'); oldHtmlContainer.addClass('phpgen-ui-inline-edit-cell-old-data'); oldHtmlContainer.css('display', 'none'); oldHtmlContainer.append(dataCell.html()); dataCell.html(''); dataCell.append(inlineEditorContainer); dataCell.append(oldHtmlContainer); require(['pgui.controls'], function(ctrls) { ctrls.initEditors(dataCell); }); try { eval(editorScript); } catch (e) { } } function CancelInlineEditing(currentRow, editControlsContainer) { currentRow.children('td[data-inline-editing=true]').each(function () { var dataCell = $(this); ReturnOldHtmlForCell(dataCell); }); CompleteEditing(editControlsContainer); } function BlockInterface() { return; if (!options.debug && options.useBlockGUI) { require([PhpGen.Module.UIBlock], function() { $.blockUI( { message: 'Please wait...', overlayCSS: { backgroundColor: '#fff' }, css: { border: 'no', padding: '15px', backgroundColor: '#aaa', '-webkit-border-radius': '10px', '-moz-border-radius': '10px', opacity: .5, color: '#000' } }); }); } } function UnblockInterface() { return; if (!options.debug && options.useBlockGUI) { require([PhpGen.Module.UIBlock], function() { $.unblockUI(); }); } } function CreateFormForPostInlineEditors() { var postForm = $(''); postForm.attr('id', 'inline_edit_form'); postForm.attr('enctype', 'multipart/form-data'); postForm.attr('action', options.requestAddress); postForm.attr('method', 'POST'); postForm.css('display', 'none'); postForm.append(''); return postForm; } function MoveRowInlineEditorsToForm(row, targetForm) { targetForm.append(row.find('td[data-inline-editing=true] div.inline_editor_container form > *')); } function SubmitFormWithTarget(form, target) { form.submit(function () { form.attr('target', target); }); form.submit(); } function CheckValidness(row) { var isAllControlsValid = true; /*row.find('form').each(function(index, form) { if (!$(form).valid()) isAllControlsValid = false; });*/ return isAllControlsValid; } function CommitInlineEditing(row, editControlsContainer) { var currentRow = row; if (!CheckValidness(row)) return; var postForm = CreateFormForPostInlineEditors(); postForm.append(editControlsContainer.find('input:hidden').clone()); require(['pgui.controls'], function(ctrls) { ctrls.destroyEditors(currentRow); }); MoveRowInlineEditorsToForm(currentRow, postForm); var operationRandom = Math.floor(Math.random() * 100000); var resultFrame = $(''); resultFrame.attr('src', 'about:black'); if (options.debug) { resultFrame.css('width', '1000px'); resultFrame.css('height', '800px'); resultFrame.css('border', '2px'); } else { resultFrame.css('width', '0px'); resultFrame.css('height', '0px'); resultFrame.css('border', '0px'); } resultFrame.css('padding', '0px'); resultFrame.css('margin', '0px'); $('body').append(postForm); $('body').append(resultFrame); BlockInterface(); domCheckCount = options.responseCheckCount; function ProcessResponce() { io = resultFrame[0]; try { doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document var isXml = doc.XMLDocument || $.isXMLDoc(doc); } catch (e) { isXml = false; } if (!isXml) { if (--domCheckCount) { setTimeout(ProcessResponce, 250); return; } if (!options.debug) setInterval(function () { $('#inlineEditPostForm_' + operationRandom).remove(); }, 1000); $('#inline_edit_form').remove(); currentRow.children('td[data-inline-editing=true]').each(function () { var dataCell = $(this); ReturnOldHtmlForCell(dataCell); }); CompleteEditing(editControlsContainer); grid.sm_show_grid_error( { errorMessage: 'Response is not available', columnSpan: currentRow.children('td').length, errorMessageHeader: options.editingErrorMessageHeader }); UnblockInterface(); return; } responseXml = ExtractXmlDocumentFromFrame(resultFrame[0]); if (responseXml.find('errormessage').length > 0) { grid.sm_show_grid_error( { errorMessage: responseXml.find('errormessage').text(), columnSpan: currentRow.children('td').length, errorMessageHeader: options.editingErrorMessageHeader }); responseXml.find('editor').each(function () { var dataCell = currentRow.find('[data-column-name="' + $(this).attr('name') + '"]'); ReturnOldHtmlForCell(dataCell); EmbedEditorFromXml(currentRow, $(this), false); DestroyValidationErrorContainer(editControlsContainer); CreateValidationErrorContainer(row, editControlsContainer); EnableValidation(row); }); } else { CompleteEditing(editControlsContainer); responseXml.find('fieldvalue').each(function () { var newValue = $(this).find('value').text(); var style = $(this).find('style'); var dataCell = currentRow.children('[data-column-name="' + $(this).attr('name') + '"]'); dataCell.attr('data-inline-editing', 'false'); if (style) dataCell.attr('style', style.text()); dataCell.html(''); dataCell.append(newValue); if (dataCell.is('[data-column-name=InlineEdit]')) { dataCell.closest('table').sm_inline_grid_edit( { row: currentRow, useBlockGUI: true }); } }); } UnblockInterface(); if (!options.debug) setInterval(function () { $('#inlineEditPostForm_' + operationRandom).remove(); }, 1000); $('#inline_edit_form').remove(); } setTimeout(function () { SubmitFormWithTarget(postForm, 'inlineEditPostForm'); }, 100); setTimeout(ProcessResponce, 250); } function GetEditorsNameSuffix(responseXml) { return $(responseXml).find('namesuffix').text(); } function CreateInlineInsertingControls(editControlsContainer) { if (options.useImagesForActions) { editControlsContainer.append( '' + '' + '' + ''); } else { editControlsContainer.append( '' + '' + options.cancelButtonHint + '' + '' + options.commitButtonHint + '' + ''); } editControlsContainer.find(options.cancelInsertControl).click(CancelInsertHandler); editControlsContainer.find(options.commitInsertControl).click(CommitInsertHandler); } function DeleteInlineInsertingControls(editControlsContainer) { var inlineInsertControls = editControlsContainer.find('span[data-content=inline_insert_controls]'); inlineInsertControls.remove(); } function CancelInsertHandler(event) { event.preventDefault(); var row = $(this).closest('tr'); row.remove(); DestroyValidationErrorContainer(row.find(options.editControlsContainer)); } function CommitInsertHandler(event) { event.preventDefault(); var row = $(this).closest('tr'); var editControlsContainer = row.find(options.editControlsContainer); CommitInlineInserting(row, editControlsContainer); } function CreateFormForPostInsertInlineEditors() { var postForm = $(''); postForm.attr('id', 'inline_edit_form'); postForm.attr('enctype', 'multipart/form-data'); postForm.attr('action', options.requestAddress); postForm.attr('method', 'POST'); postForm.css('display', 'none'); postForm.append(''); return postForm; } function CommitInlineInserting(row, editControlsContainer) { var currentRow = row; if (!CheckValidness(row)) return; var postForm = CreateFormForPostInsertInlineEditors(); postForm.append(editControlsContainer.find('input[type=hidden]').clone()); require(['pgui.controls'], function(ctrls) { ctrls.destroyEditors(currentRow); }); MoveRowInlineEditorsToForm(currentRow, postForm); var operationRandom = Math.floor(Math.random() * 100000); var resultFrame = $(''); resultFrame.attr('src', 'about:black'); if (options.debug) { resultFrame.css('width', '1000px'); resultFrame.css('height', '800px'); resultFrame.css('border', '2px'); } else { resultFrame.css('width', '0px'); resultFrame.css('height', '0px'); resultFrame.css('border', '0px'); } resultFrame.css('padding', '0px'); resultFrame.css('margin', '0px'); $('body').append(postForm); $('body').append(resultFrame); BlockInterface(); domCheckCount = options.responseCheckCount; function ProcessResponse() { io = resultFrame[0]; try { doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document var isXml = doc.XMLDocument || $.isXMLDoc(doc); } catch (e) { isXml = false; } if (!isXml) { if (--domCheckCount) { setTimeout(ProcessResponse, 250); return; } if (!options.debug) setInterval(function () { $('#inlineEditPostForm_' + operationRandom).remove(); }, 1000); $('#inline_edit_form').remove(); currentRow.next().remove(); currentRow.remove(); grid.sm_show_grid_error( { errorMessage: 'Response is not available', columnSpan: currentRow.children('td').length, errorMessageHeader: options.editingErrorMessageHeader }); DestroyValidationErrorContainer(editControlsContainer); UnblockInterface(); return; } var responseXml = ExtractXmlDocumentFromFrame(resultFrame[0]); if (responseXml.find('errormessage').length > 0) { grid.sm_show_grid_error( { errorMessage: responseXml.find('errormessage').text(), columnSpan: currentRow.children('td').length, errorMessageHeader: options.editingErrorMessageHeader }); responseXml.find('editor').each(function () { var dataCell = currentRow.find('[data-column-name="' + $(this).attr('name') + '"]'); ReturnOldHtmlForCell(dataCell); EmbedEditorFromXml(currentRow, $(this), true); }); DestroyValidationErrorContainer(editControlsContainer); CreateValidationErrorContainer(currentRow, editControlsContainer); EnableValidation(currentRow); } else { grid.find('.emplygrid').remove(); DeleteInlineInsertingControls(editControlsContainer); responseXml.find('fieldvalue').each(function () { var newValue = $(this).find('value').text(); var afterRow = $(this).find('afterrowcontrol').text(); var cellStyle = $(this).find('style'); var dataCell = currentRow.children('[data-column-name="' + $(this).attr('name') + '"]'); dataCell.attr('data-inline-editing', 'false'); if (cellStyle) dataCell.attr('style', cellStyle.text()); dataCell.html(''); dataCell.append(newValue); currentRow.next().find('td').append(afterRow); }); currentRow.removeAttr('id'); currentRow.addClass('pg-row'); //RecalculateGridLineNumbers(); DestroyValidationErrorContainer(editControlsContainer); SetupEditControls(editControlsContainer); ClearErrorRow(); } UnblockInterface(); if (!options.debug) setInterval(function () { $('#inlineEditPostForm_' + operationRandom).remove(); }, 1000); $('#inline_edit_form').remove(); } setTimeout(function () { SubmitFormWithTarget(postForm, 'inlineEditPostForm'); }, 100); setTimeout(ProcessResponse, 250); } function InlineAddHandler() { var templateRow = grid.find(options.newRecordRowTemplate); var templateAfterRow = grid.find(options.newRecordAfterRowTemplate); var row = templateRow.clone(); var afterRow = templateAfterRow.clone(); row.attr('data-new-row', 'true'); afterRow.attr('data-new-row', 'true'); templateRow.before(row); row.after(afterRow); var editControlsContainer = row.find(options.editControlsContainer); var requestData = {}; requestData['operation'] = 'arqii'; BlockInterface(); $.get( options.requestAddress, requestData, function ready(data) { row.css('display', ''); afterRow.css('display', ''); CreateInlineInsertingControls(editControlsContainer); // HideInitEditControls(editControlsContainer); // ShowCompleteEditControls(editControlsContainer); var nameSuffixInput = $(''); nameSuffixInput.val(GetEditorsNameSuffix(data)); editControlsContainer.append(nameSuffixInput); $(data).find('editor').each(function () { EmbedEditorFromXml(row, $(this), true); }); CreateValidationErrorContainer(row, editControlsContainer); EnableValidation(row); UnblockInterface(); } ); } function InlineEditHandler(event) { event.preventDefault(); var row = $(this).closest('tr'); var editControlsContainer = $(this).closest(options.editControlsContainer); BlockInterface(); var requestData = {}; editControlsContainer.find('input[type=hidden]').each(function () { requestData[$(this).attr('name')] = $(this).val(); }); requestData['operation'] = 'arqie'; $.get( options.requestAddress, requestData, function ready(data) { HideInitEditControls(editControlsContainer); ShowCompleteEditControls(editControlsContainer); var nameSuffixInput = $(''); nameSuffixInput.val(GetEditorsNameSuffix(data)); editControlsContainer.append(nameSuffixInput); $(data).find('editor').each(function () { try { EmbedEditorFromXml(row, $(this), false); } catch(e) { alert(e); } }); CreateValidationErrorContainer(row, editControlsContainer); EnableValidation(row); UnblockInterface(); } ); } function EnableValidation(row) { /*$(row).find('form').pgui_validate_form( { validate_errorClass: 'inline-edit-error', validate_errorPlacement: function(error, element) { relatedElement = element; if ($(element.attr('validation-error-label-related-control')).length > 0) relatedElement = $(element.attr('validation-error-label-related-control')); var oldError = $(row.attr('error-container')).find('label[for=' + error.attr('for') + ']'); if ((oldError.length > 0 && oldError.text() != error.text()) || (oldError.length == 0)) { if (oldError.length > 0) oldError.closest("li").remove(); error.attr('for', element.attr('name')); error.appendTo(row.attr('error-container')); error.wrap("
  • "); } }, validate_success: function (error) { error.closest("li").remove(); } });*/ } function DestroyValidationErrorContainer(editControlsContainer) { $(editControlsContainer.closest('tr').attr('error-container')).remove(); } function CreateValidationErrorContainer(row, editControlsContainer) { var errorContainerId = 'error-box' + Math.floor(Math.random() * 100000); row.attr('error-container', '#' + errorContainerId); var errorBox = $("
      "); errorBox.addClass('inline-editing-error-box'); errorBox.attr('id', errorContainerId); errorBox.css('position', 'absolute'); $('body').append(errorBox); errorBox.offset( { top: editControlsContainer.offset().top + editControlsContainer.outerHeight(), left: editControlsContainer.offset().left }); } function construct() { grid = $(_this); if (options.row != null) { editControlsContainers = options.row.find(options.editControlsContainer); editControlsContainers.each(function () { SetupEditControls($(this)); }); } else { var inlineAddButton = grid.find(options.inlineAddControl); inlineAddButton.click(InlineAddHandler); editControlsContainers = grid.find('tr').find(options.editControlsContainer); editControlsContainers.each(function () { SetupEditControls($(this)); }); } // return _this; } return construct(); }