From af1166d8ca5b55a5effe80ebb02ec2213589abe6 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Tue, 2 Dec 2014 01:58:23 +0100
Subject: [PATCH] Further progress in counter editing in the plugin config

-) Implement loading indicator during the AJAX calls
-) Give each type of number its own fieldset (and thus its own
   tab in the plugin config)
-) Fix display of system messages generated by ajax call in Joomla 2.x
-) Fix JSON output in Joomla 2.x (two Content-Disposition
   headers generated, which broke parsing of the AJAX response
   in Chromium) -> Use raw format for joomla and manually send
   the json content-disposition header
-) Fix jQuery in Joomla 2.x
---
 Makefile                                      |   4 +--
 fields/vmordernumbercounters.php              |   8 ++---
 .../en-GB/en-GB.plg_vmshopper_ordernumber.ini |   4 +++
 .../en-GB.plg_vmshopper_ordernumber.sys.ini   |   4 +++
 ordernumber.php                               |  30 +++++++++++-------
 ordernumber.xml                               |   8 +++--
 ordernumber/assets/css/ordernumber.css        |  17 +++++++++-
 ordernumber/assets/images/loading.gif         | Bin 0 -> 2211 bytes
 ordernumber/assets/images/loading.png         | Bin 0 -> 18117 bytes
 ordernumber/assets/js/ordernumber.js          |  28 ++++++++++------
 10 files changed, 74 insertions(+), 29 deletions(-)
 create mode 100644 ordernumber/assets/images/loading.gif
 create mode 100644 ordernumber/assets/images/loading.png

diff --git a/Makefile b/Makefile
index 2bc6e55..62feb1f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
 BASE=ordernumber
 PLUGINTYPE=vmshopper
-VERSION=1.90
+VERSION=2.0
 
-PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html
+PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html $(BASE)/
 
 SYSTRANSLATIONS=$(call wildcard,language/*/*.plg_$(PLUGINTYPE)_$(BASE).*sys.ini)
 NONSYSTRANSLATIONS=${SYSTRANSLATIONS:%.sys.ini=%.ini}
diff --git a/fields/vmordernumbercounters.php b/fields/vmordernumbercounters.php
index 4897222..2c1dbf1 100644
--- a/fields/vmordernumbercounters.php
+++ b/fields/vmordernumbercounters.php
@@ -66,20 +66,20 @@ class JFormFieldVmOrdernumberCounters extends JFormField {
         $pluginpath = '/plugins/vmshopper/ordernumber/ordernumber/';
         $doc = JFactory::getDocument()->addStyleSheet(JURI::root(true) . $pluginpath . 'assets/css/ordernumber.css');
         $doc->addScript(JURI::root(true).$pluginpath . 'assets/js/ordernumber.js');
+        vmJsApi::jQuery();
         
         // Look up the current counters
         $db = JFactory::getDBO();
         $db->setQuery('SELECT `number_format`, `count` FROM `#__virtuemart_shopper_plg_ordernumber` WHERE `number_type`='.$db->quote($this->countertype) . ' ORDER BY `number_format`;' );
         $counters = $db->loadObjectList();
         // Joomla 2.x uses <li> for the params and float:left on the controls, so we need to add that too
-        $version = new JVersion();
         $float = "";
         if (version_compare(JVERSION, '3.0', 'lt')) {
             $float = "float: left; ";
         }
         
         $html=array();
-        $html[] = "<table class=\"vmordernumber-countertable table-striped \" display: inline-table; $float\">";
+        $html[] = "<img src='".JURI::root(true).$pluginpath . "assets/images/loading.gif' class='vm-ordernumber-loading' style=\"display: none; position: absolute; top: 2px; left: 0px; z-index: 9999;\"/><table class=\"vmordernumber-countertable table-striped \" style=\"display: inline-table; $float\">";
         $html[] = "  <tr>";
         $html[] = "    <th class='counter_format'>".JText::_('PLG_ORDERNUMBER_COUNTERLIST_HEADER_COUNTER')."</th>";
         $html[] = "    <th class='counter_value'>".JText::_('PLG_ORDERNUMBER_COUNTERLIST_HEADER_VALUE'). "</th>";
@@ -94,11 +94,11 @@ class JFormFieldVmOrdernumberCounters extends JFormField {
             $html[] = "  <tr class='counter_row counter_type_$this->countertype'>";
             $html[] = "    <td class='counter_format'>" . (string)$displayfmt . "</td>";
             $html[] = "    <td class='counter_value'>" . (string)$c->count . "</td>";
-            $html[] = "    <td class='counter_buttons'><img src='" .JURI::root(true).$pluginpath . "assets/images/icon-16-edit.png' class='vmordernumber-counter-editbtn vmordernumber-btn' onClick='ajaxEditCounter(this, $this->countertype, ".json_encode($c->number_format).", $c->count)' /><img src='" . JURI::root(true).$pluginpath . "assets/images/icon-16-delete.png' class='vmordernumber-counter-deletebtn vmordernumber-btn' onClick='ajaxDeleteCounter(this, $this->countertype, ".json_encode($c->number_format).", $c->count)' /></td>";
+            $html[] = "    <td class='counter_buttons'><div class='ordernumber-ajax-loading'><img src='" .JURI::root(true).$pluginpath . "assets/images/icon-16-edit.png' class='vmordernumber-counter-editbtn vmordernumber-btn' onClick='ajaxEditCounter(this, $this->countertype, ".json_encode($c->number_format).", $c->count)' /></div><div class='ordernumber-ajax-loading'><img src='" . JURI::root(true).$pluginpath . "assets/images/icon-16-delete.png' class='vmordernumber-counter-deletebtn vmordernumber-btn' onClick='ajaxDeleteCounter(this, $this->countertype, ".json_encode($c->number_format).", $c->count)' /></div></td>";
             $html[] = "  </tr>";
         }
         $html[] = "  <tr class='addcounter_row'>";
-        $html[] = "    <td colspan=3 class='counter_add'><div class='vmordernumber-counter-addbtn vmordernumber-btn' onClick='ajaxAddCounter(this, $this->countertype)'><img src='" . JURI::root(true).$pluginpath . "assets/images/icon-16-new.png' class='vmordernumber-counter-addbtn' />" . JText::_('PLG_ORDERNUMBER_COUNTERLIST_ADD') . "</div></td>";
+        $html[] = "    <td colspan=3 class='counter_add'><div class='vmordernumber-counter-addbtn vmordernumber-btn' onClick='ajaxAddCounter(this, $this->countertype)'><div class='ordernumber-ajax-loading'><img src='" . JURI::root(true).$pluginpath . "assets/images/icon-16-new.png' class='vmordernumber-counter-addbtn' /></div>" . JText::_('PLG_ORDERNUMBER_COUNTERLIST_ADD') . "</div></td>";
         $html[] = "  </tr>";
         $html[] = "</table>";
         return implode("\n", $html);
diff --git a/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini b/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini
index 37a3f73..b421813 100644
--- a/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini
+++ b/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini
@@ -51,3 +51,7 @@ PLG_ORDERNUMBER_COUNTERLIST_HEADER_COUNTER="Counter format/name"
 PLG_ORDERNUMBER_COUNTERLIST_HEADER_VALUE="Counter value"
 PLG_ORDERNUMBER_COUNTERLIST_ADD="Add new counter"
 PLG_ORDERNUMBER_COUNTERLIST_EXISTS="Counter '%s' already exists."
+
+PLG_ORDERNUMBER_FIELDSET_ORDERNUMBER="Order Numbers"
+PLG_ORDERNUMBER_FIELDSET_INVOICENUMBER="Invoice Numbers"
+PLG_ORDERNUMBER_FIELDSET_CUSTOMERNUMBER="Customer Numbers"
diff --git a/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini b/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini
index 37a3f73..b421813 100644
--- a/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini
+++ b/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini
@@ -51,3 +51,7 @@ PLG_ORDERNUMBER_COUNTERLIST_HEADER_COUNTER="Counter format/name"
 PLG_ORDERNUMBER_COUNTERLIST_HEADER_VALUE="Counter value"
 PLG_ORDERNUMBER_COUNTERLIST_ADD="Add new counter"
 PLG_ORDERNUMBER_COUNTERLIST_EXISTS="Counter '%s' already exists."
+
+PLG_ORDERNUMBER_FIELDSET_ORDERNUMBER="Order Numbers"
+PLG_ORDERNUMBER_FIELDSET_INVOICENUMBER="Invoice Numbers"
+PLG_ORDERNUMBER_FIELDSET_CUSTOMERNUMBER="Customer Numbers"
diff --git a/ordernumber.php b/ordernumber.php
index d422692..9270fc6 100644
--- a/ordernumber.php
+++ b/ordernumber.php
@@ -274,26 +274,26 @@ class plgVmShopperOrdernumber extends vmShopperPlugin {
         $authorized = ($user->authorise('core.admin','com_virtuemart') or
                        $user->authorise('core.manage','com_virtuemart') or 
                        $user->authorise('vm.orders','com_virtuemart'));
-        $output = array();
-        $output['authorized'] = $authorized;
+        $json = array();
+        $json['authorized'] = $authorized;
         if (!$authorized) return FALSE;
 
         $action = vRequest::getCmd('action');
         $counter= vRequest::getString('counter');
         $nrtype = vRequest::getInt('nrtype');
-        $output['action'] = $action;
-        $output['success'] = 0; // default: unsuccessfull
+        $json['action'] = $action;
+        $json['success'] = 0; // default: unsuccessfull
         switch ($action) {
             case "deleteCounter":
-                $output['success'] = $this->_deleteCounter($nrtype, $counter);
+                $json['success'] = $this->_deleteCounter($nrtype, $counter);
                 break;
             case "addCounter":
                 $value = vRequest::getInt('value',0);
                 if ($this->_counterExists($nrtype, $counter)) {
-                    $output['error'] = JText::sprintf('PLG_ORDERNUMBER_COUNTERLIST_EXISTS', $counter);
-                    $output['success'] = false;
+                    $json['error'] = JText::sprintf('PLG_ORDERNUMBER_COUNTERLIST_EXISTS', $counter);
+                    $json['success'] = false;
                 } else {
-                    $output['success'] = $this->_addCounter($nrtype, $counter, $value);
+                    $json['success'] = $this->_addCounter($nrtype, $counter, $value);
                     // Return the table row for the new counter in the JSON:
                     $pluginpath = '/plugins/vmshopper/ordernumber/ordernumber/';
                     $displayfmt = ($counter=="") ? JText::_('PLG_ORDERNUMBER_COUNTERLIST_GLOBAL') : $counter;
@@ -303,12 +303,12 @@ class plgVmShopperOrdernumber extends vmShopperPlugin {
                     $html[] = "  <td class='counter_value'>" . (string)$value . "</td>";
                     $html[] = "  <td class='counter_buttons'><img src='" .JURI::root(true).$pluginpath . "assets/images/icon-16-edit.png' class='vmordernumber-counter-editbtn vmordernumber-btn' onClick='ajaxEditCounter(this, $nrtype, ".json_encode($counter).", $value)' /><img src='" . JURI::root(true).$pluginpath . "assets/images/icon-16-delete.png' class='vmordernumber-counter-deletebtn vmordernumber-btn' onClick='ajaxDeleteCounter(this, $nrtype, ".json_encode($counter).", $value)' /></td>";
                     $html[] = "</tr>";
-                    $output['newrow'] = implode("\n", $html);
+                    $json['newrow'] = implode("\n", $html);
                 }
                 break;
             case "setCounter":
                 $value = vRequest::getInt('value');
-                $output['success'] = $this->_setCounter($nrtype, $counter, $value);
+                $json['success'] = $this->_setCounter($nrtype, $counter, $value);
                 break;
         }
         
@@ -319,8 +319,16 @@ class plgVmShopperOrdernumber extends vmShopperPlugin {
         $previoustype = $document->getType();
         $document->setType('html');
         $msgrenderer = $document->loadRenderer('message');
-        $output['messages'] = $msgrenderer->render('Message');
+        $json['messages'] = $msgrenderer->render('Message');
         $document->setType($previoustype);
+
+        // WORKAROUND for broken (i.e. duplicate) content-disposition headers in Joomla 2.x:
+        // We request everything in raw and here send the headers for JSON and return
+        // the raw output in json format
+        $document =JFactory::getDocument();
+        $document->setMimeEncoding('application/json');
+        JResponse::setHeader('Content-Disposition','attachment;filename="ordernumber.json"');
+        $output = json_encode($json);
     }
     
     
diff --git a/ordernumber.xml b/ordernumber.xml
index e702bd7..7caf4ba 100644
--- a/ordernumber.xml
+++ b/ordernumber.xml
@@ -20,6 +20,7 @@
         <filename>index.html</filename>
         <folder>language</folder>
         <folder>fields</folder>
+        <folder>ordernumber</folder>
     </files>
     <scriptfile>ordernumber.script.php</scriptfile>
     <languages folder="language">
@@ -31,7 +32,7 @@
     <!-- Joomla 2.5 & 3.0 config -->
     <config>
         <fields name="params" addfieldpath="/plugins/vmshopper/ordernumber/fields">
-            <fieldset name="basic">
+            <fieldset name="ordernumbers" label="PLG_ORDERNUMBER_FIELDSET_ORDERNUMBER">
                 <field name="order_options" type="spacer" label="PLG_ORDERNUMBER_ORDERNR" />
                 <field name="customize_order_number" type="radio" default="0" class="btn-group btn-group-yesno" label="PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE" description="PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE_DESC">
                     <option value="1">JYES</option>
@@ -45,14 +46,15 @@
                 </field>
                 <field name="order_number_allcounters" type="VmOrdernumberCounters" label="PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS" countertype="0" />
 
-
                 <field name="password_options" type="spacer" label="PLG_ORDERNUMBER_PASSWD" />
                 <field name="customize_order_password" type="radio" default="0" class="btn-group btn-group-yesno" label="PLG_ORDERNUMBER_PASSWD_CUSTOMIZE" description="PLG_ORDERNUMBER_PASSWD_CUSTOMIZE_DESC">
                     <option value="1">JYES</option>
                     <option value="0">JNO</option>
                 </field>
                 <field name="order_password_format" type="text" default="p_[randomHex5]" label="PLG_ORDERNUMBER_PASSWD_FMT" description="PLG_ORDERNUMBER_PASSWD_FMT_DESC"/>
+            </fieldset>
 
+            <fieldset name="invoicenumbers" label="PLG_ORDERNUMBER_FIELDSET_INVOICENUMBER">
                 <field name="invoice_options" type="spacer" label="PLG_ORDERNUMBER_INVOICENR" />
                 <field name="customize_invoice_number" type="radio" default="0" class="btn-group btn-group-yesno" label="PLG_ORDERNUMBER_INVOICENR_CUSTOMIZE" description="PLG_ORDERNUMBER_INVOICENR_CUSTOMIZE_DESC">
                     <option value="1">JYES</option>
@@ -65,7 +67,9 @@
                     <option value="0">PLG_ORDERNUMBER_COUNTER_PERFORMAT</option>
                 </field>
                 <field name="invoice_number_allcounters" type="VmOrdernumberCounters" label="PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS" countertype="1" />
+            </fieldset>
 
+            <fieldset name="customernumbers" label="PLG_ORDERNUMBER_FIELDSET_CUSTOMERNUMBER">
                 <field name="customer_options" type="spacer" label="PLG_ORDERNUMBER_CUSTOMERNR" />
                 <field name="customize_customer_number" type="radio" default="0" class="btn-group btn-group-yesno" label="PLG_ORDERNUMBER_CUSTOMERNR_CUSTOMIZE" description="PLG_ORDERNUMBER_CUSTOMERNR_CUSTOMIZE_DESC">
                     <option value="1">JYES</option>
diff --git a/ordernumber/assets/css/ordernumber.css b/ordernumber/assets/css/ordernumber.css
index ca33790..140beb3 100644
--- a/ordernumber/assets/css/ordernumber.css
+++ b/ordernumber/assets/css/ordernumber.css
@@ -15,4 +15,19 @@ table.vmordernumber-countertable.table-striped tbody > tr:nth-child(odd) > th {
 
 col.counter_type, th.counter_type, td.counter_type {
     display:none;
-}
\ No newline at end of file
+}
+
+fieldset table.vmordernumber-countertable img {
+    padding: 0;
+    margin: 0;    
+}
+div.ordernumber-ajax-loading, div.vmordernumber-counter-addbtn {
+    display: inline;
+}
+div.ordernumber-ajax-loading, div.ordernumber-ajax-loading img.vmordernumber-btn {
+    position: relative;
+    top: 0; left: 0;
+}
+div.ordernumber-ajax-loading img {
+    z-index:0;
+}
diff --git a/ordernumber/assets/images/loading.gif b/ordernumber/assets/images/loading.gif
new file mode 100644
index 0000000000000000000000000000000000000000..94da6d80e05ef96d9d7551013d59c22551c0ae1a
GIT binary patch
literal 2211
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

literal 0
HcmV?d00001

diff --git a/ordernumber/assets/images/loading.png b/ordernumber/assets/images/loading.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac0aa90cbc6fde315828934a2494ec1324b8af56
GIT binary patch
literal 18117
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
Bb$<W=

literal 0
HcmV?d00001

diff --git a/ordernumber/assets/js/ordernumber.js b/ordernumber/assets/js/ordernumber.js
index bee01ca..7ef87b7 100644
--- a/ordernumber/assets/js/ordernumber.js
+++ b/ordernumber/assets/js/ordernumber.js
@@ -1,11 +1,15 @@
 var updateMessages = function(messages, area) {
-    jQuery( "#system-message-container #system-message div."+area+"-message").remove();
+    jQuery( "#system-message-container #system-message ."+area+"-message").remove();
     // Extract the messages from the returned string, add the ordernumber-message class (so the next ajax call
     // can remove them again) and then move the messages to the original message container.
     // Things are complicated by the fact that no #system-message element exists if no messages were printed so far
-    var newmessages = jQuery( messages ).find("div.alert").addClass(area+"-message");
+    var newmessages = jQuery( messages ).find("div.alert, .message").addClass(area+"-message");
     if (!jQuery( "#system-message-container #system-message").length && newmessages.length) {
-        jQuery( "#system-message-container" ).append( "<div id='system-message'></div>" );
+        if (jQuery(newmessages).first().prop("tagName")=="dt") { // Joomla 2.x:
+            jQuery( "#system-message-container" ).append( "<dl id='system-message'></div>" );
+        } else {
+            jQuery( "#system-message-container" ).append( "<div id='system-message'></div>" );
+        }
     }
     newmessages.appendTo( "#system-message-container #system-message");
 }
@@ -38,11 +42,12 @@ var ajaxEditCounter = function (btn, nrtype, ctr, value) {
             msgprefix = "You entered an invalid value for the counter.\n\n";
     }
     if (value != null) {
+        var loading = jQuery("img.vm-ordernumber-loading").first().clone().insertAfter(btn).show();
         jQuery.ajax({
             type: "POST",
             cache: false,
             dataType: "text", // Read text, but interpret as JSON later in the done method (prevents a warning!)
-            url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=setCounter&format=json",
+            url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=setCounter&format=raw",
             data: { nrtype: counter.type, counter: counter.counter, value: value },
             success: function( data ) {
                 var json = data ? jQuery.parseJSON(data) : null;
@@ -53,7 +58,8 @@ var ajaxEditCounter = function (btn, nrtype, ctr, value) {
                     alert ("Failed modifying counter "+counter.counter);
                 }
             },
-            error: function() { alert ("ERROR: Failed modifying counter "+counter.counter); }
+            error: function() { alert ("ERROR: Failed modifying counter "+counter.counter); },
+            complete: function() { jQuery(loading).remove(); },
         });
     }
 }
@@ -64,11 +70,12 @@ var ajaxDeleteCounter = function (btn, nrtype, ctr, value) {
     counter.value=value;
     var proceed = confirm ("Really delete counter '"+counter.counter+"' with value '"+counter.value+"'?");
     if (proceed == true) {
+        var loading = jQuery("img.vm-ordernumber-loading").first().clone().insertAfter(btn).show();
         jQuery.ajax({
             type: "POST",
             cache: false,
             dataType: "text", // Read text, but interpret as JSON later in the done method (prevents a warning!)
-            url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=deleteCounter&format=json",
+            url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=deleteCounter&format=raw",
             data: { nrtype: counter.type, counter: counter.counter },
             success: function( data ) {
                 var json = data ? jQuery.parseJSON(data) : null;
@@ -79,7 +86,8 @@ var ajaxDeleteCounter = function (btn, nrtype, ctr, value) {
                     alert ("Failed modifying counter "+counter.counter);
                 }
             },
-            error: function() { alert ("ERROR: Failed modifying counter "+counter.counter); }
+            error: function() { alert ("ERROR: Failed modifying counter "+counter.counter); },
+            complete: function() { jQuery(loading).remove(); },
         });
     }
 }
@@ -87,11 +95,12 @@ var ajaxAddCounter = function (btn, nrtype) {
     var row = jQuery(btn).parents("tr.addcounter_row");
     var countername = prompt ("Please enter the format/name of the new counter:");
     if (countername != null) {
+        var loading = jQuery("img.vm-ordernumber-loading").first().clone().insertAfter(jQuery(btn).find("img.vmordernumber-counter-addbtn")).show();
         jQuery.ajax({
             type: "POST",
             cache: false,
             dataType: "text", // Read text, but interpret as JSON later in the done method (prevents a warning!)
-            url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=addCounter&format=json",
+            url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=addCounter&format=raw",
             data: { nrtype: nrtype, counter: countername },
             success: function( data ) {
                 var json = data ? jQuery.parseJSON(data) : null;
@@ -102,7 +111,8 @@ var ajaxAddCounter = function (btn, nrtype) {
                     }
                 }
             },
-            error: function() { alert ("ERROR: Failed adding counter "+countername); }
+            error: function() { alert ("ERROR: Failed adding counter "+countername); },
+            complete: function() { jQuery(loading).remove(); },
         });
     }
 }
-- 
GitLab