From e621f4895f9a51d0bea75784eb5635df057a1371 Mon Sep 17 00:00:00 2001 From: Thierry Francois Date: Sat, 3 May 2014 18:33:57 +0300 Subject: [PATCH] Process updates in bulk --- .../code/GridFieldBulkActionEditHandler.php | 50 ++-- .../javascript/GridFieldBulkEditingForm.js | 228 +++++++++--------- 2 files changed, 142 insertions(+), 136 deletions(-) diff --git a/bulkManager/code/GridFieldBulkActionEditHandler.php b/bulkManager/code/GridFieldBulkActionEditHandler.php index 294cf39..524a096 100644 --- a/bulkManager/code/GridFieldBulkActionEditHandler.php +++ b/bulkManager/code/GridFieldBulkActionEditHandler.php @@ -87,7 +87,7 @@ class GridFieldBulkActionEditHandler extends GridFieldBulkActionHandler $recordCMSDataFields = GridFieldBulkEditingHelper::getModelFilteredDataFields($config, $recordCMSDataFields); $recordCMSDataFields = GridFieldBulkEditingHelper::populateCMSDataFields( $recordCMSDataFields, $this->gridField->list->dataClass, $id ); - $recordCMSDataFields['ID'] = new HiddenField('ID', '', $id); + //$recordCMSDataFields['ID'] = new HiddenField('ID', '', $id); $recordCMSDataFields = GridFieldBulkEditingHelper::escapeFormFieldsName( $recordCMSDataFields, $id ); $recordsFieldList->push( @@ -155,26 +155,40 @@ class GridFieldBulkActionEditHandler extends GridFieldBulkActionHandler */ public function update() { - $data = GridFieldBulkEditingHelper::unescapeFormFieldsPOSTData($this->request->requestVars()); - $record = DataObject::get_by_id($this->gridField->list->dataClass, $data['ID']); - - foreach($data as $field => $value) - { - if ( $record->hasMethod($field) ) - { - $list = $record->$field(); - $list->setByIDList( $value ); + $data = $this->request->requestVars(); + $return = array(); + $className = $this->gridField->list->dataClass; + + if ( isset($data['url']) ) unset($data['url']); + if ( isset($data['cacheBuster']) ) unset($data['cacheBuster']); + + foreach ($data as $recordID => $recordDataSet) + { + $record = DataObject::get_by_id($className, $recordID); + foreach($recordDataSet as $recordData) + { + $field = preg_replace('/record_(\d+)_(\w+)/i', '$2', $recordData['name']); + $value = $recordData['value']; + + if ( $record->hasMethod($field) ) + { + $list = $record->$field(); + $list->setByIDList($value); + } + else{ + $record->setCastedField($field, $value); + } } - else{ - $record->setCastedField($field, $value); - } - } - $record->write(); + $done = $record->write(); + array_push($return, array( + 'id' => $done, + 'title' => $record->getTitle() + )); + } return json_encode(array( - 'done' => 1, - 'recordID' => $data['ID'], - 'title' => $record->getTitle() + 'done' => 1, + 'records' => $return ), JSON_NUMERIC_CHECK); } } \ No newline at end of file diff --git a/bulkManager/javascript/GridFieldBulkEditingForm.js b/bulkManager/javascript/GridFieldBulkEditingForm.js index 2767460..68f4497 100644 --- a/bulkManager/javascript/GridFieldBulkEditingForm.js +++ b/bulkManager/javascript/GridFieldBulkEditingForm.js @@ -1,131 +1,123 @@ -(function($) { - $.entwine('colymba', function($) { +(function($) { + $.entwine('colymba', function($) { - $('#bulkEditToggle') .entwine({ - onmatch: function(){}, - onunmatch: function(){}, - onclick: function(e) - { - var toggleFields = $(this).parents('#Form_bulkEditingForm').find('.ss-toggle h4'), - state = this.data('state') - ; + $('#bulkEditToggle') .entwine({ + onmatch: function(){}, + onunmatch: function(){}, + onclick: function(e) + { + var toggleFields = $(this).parents('#Form_bulkEditingForm').find('.ss-toggle h4'), + state = this.data('state') + ; - if ( !state || state === 'close' ) - { - state = 'open'; - } - else { - state = 'close'; - } + if ( !state || state === 'close' ) + { + state = 'open'; + } + else { + state = 'close'; + } - toggleFields.each(function() - { - var $this = $(this); - - if ( state === 'open' && !$this.hasClass('ui-state-active') ) - { - $this.click(); - } + toggleFields.each(function() + { + var $this = $(this); + + if ( state === 'open' && !$this.hasClass('ui-state-active') ) + { + $this.click(); + } - if ( state === 'close' && $this.hasClass('ui-state-active') ) - { - $this.click(); - } - }); + if ( state === 'close' && $this.hasClass('ui-state-active') ) + { + $this.click(); + } + }); - this.data('state', state); - } - }); - - - $('.bulkEditingFieldHolder').entwine({ - onmatch: function(){ - var id, name = 'bulkEditingForm'; - id = $(this).attr('id').split('_')[3]; - $(this).wrap('
'); - }, - onunmatch: function(){ - } - }); + this.data('state', state); + } + }); + + + $('.bulkEditingFieldHolder').entwine({ + onmatch: function(){ + var id = this.attr('id').split('_')[3], + name = 'bulkEditingForm', + $wrap = $('
') + ; - $('.bulkEditingForm').entwine({ - onsubmit: function(){ - return false; - }, - onchange: function(){ - this.removeClass('updated'); - if ( !this.hasClass('hasUpdate') ) - { - this.addClass('hasUpdate'); - } - } - }); - - $('#bulkEditingUpdateBtn').entwine({ - onmatch: function(){ - $(this).data('completedForms', 0); - }, - onunmatch: function(){ - }, - onclick: function(e){ - e.stopImmediatePropagation(); + $wrap.attr('id', name + '_' + id).addClass(name).data('id', id); + this.wrap($wrap); + }, + onunmatch: function(){} + }); - var $formsWithUpadtes = $('form.bulkEditingForm.hasUpdate'), - url = $(this).data('url'), - data, - cacheBuster - ; - - $(this).data('formsToUpdate', $formsWithUpadtes.length); - - if ( $formsWithUpadtes.length > 0 ) $(this).addClass('loading'); - - $formsWithUpadtes.each(function(){ - cacheBuster = new Date().getTime() + '_' + $(this).attr('name'); - data = $(this).serialize(); - - if ( url.indexOf('?') !== -1 ) cacheBuster = '&cacheBuster=' + cacheBuster; - else cacheBuster = '?cacheBuster=' + cacheBuster; + $('.bulkEditingForm').entwine({ + onchange: function(){ + this.removeClass('updated'); + if ( !this.hasClass('hasUpdate') ) + { + this.addClass('hasUpdate'); + } + } + }); + + $('#bulkEditingUpdateBtn').entwine({ + onmatch: function(){}, + onunmatch: function(){}, + onclick: function(e){ + e.stopImmediatePropagation(); - $.ajax({ - url: url + cacheBuster, - data: data, - type: "POST", - context: $(this) - }).success(function(data, textStatus, jqXHR) { - var $btn = $('#bulkEditingUpdateBtn'), - totalForms = parseInt( $btn.data('formsToUpdate') ), - counter = parseInt( $btn.data('completedForms') ), - title - ; + var $formsWithUpadtes = $('div.bulkEditingForm.hasUpdate'), + url = this.data('url'), + data = {}, + cacheBuster = new Date().getTime() + '_' + this.attr('name') + ; + + if ( $formsWithUpadtes.length > 0 ) + { + this.addClass('loading'); + } + else{ + return; + } - counter = counter + 1; - $btn.data('completedForms', counter); - - $(this).removeClass('hasUpdate'); - $(this).addClass('updated'); + if ( url.indexOf('?') !== -1 ) + { + cacheBuster = '&cacheBuster=' + cacheBuster; + } + else{ + cacheBuster = '?cacheBuster=' + cacheBuster; + } - try{ - data = $.parseJSON( data ); - }catch(er){} + $formsWithUpadtes.each(function(){ + var $this = $(this); + data[$this.data('id')] = $this.find(':input').serializeArray(); + }); - if ( data.title ) - { - $(this).find('.ui-accordion-header a').html(data.title); - } - $(this).find('.ui-accordion-header').click(); - - if ( counter == totalForms ) - { - $('#bulkEditingUpdateBtn').data('completedForms', 0); - $('#bulkEditingUpdateBtn').removeClass('loading'); - } - }); - }) - - } - }); + $.ajax({ + url: url + cacheBuster, + data: data, + type: "POST", + context: this + }).success(function(data, textStatus, jqXHR){ + try{ + data = $.parseJSON(data); + }catch(er){} - - }); + $.each(data.records, function(index, record){ + var $form = $('#bulkEditingForm_'+record.id) + $formHeader = $form.find('.ui-accordion-header') + ; + + $form.removeClass('hasUpdate').addClass('updated'); + $formHeader.find('a').html(record.title); + $formHeader.click(); + }); + + this.removeClass('loading'); + }); + } + }); + + }); }(jQuery)); \ No newline at end of file