Working on tables
authorSteve Sutton <steve@gaslightmedia.com>
Fri, 18 Oct 2019 21:04:25 +0000 (17:04 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Fri, 18 Oct 2019 21:04:25 +0000 (17:04 -0400)
setup tables to update data

models/admin/plugins/plugins.php
models/admin/plugins/servers.php
models/admin/plugins/sites.php
views/admin/plugins/plugin-detail.html
views/admin/plugins/server-detail.html
views/admin/plugins/site-detail.html

index 9040b68..5c0a874 100644 (file)
@@ -109,6 +109,7 @@ class GlmMembersAdmin_plugins_plugins extends GlmDataPlugins
         wp_enqueue_style( 'Foundation6', GLM_MEMBERS_PLUGIN_URL . '/css/foundation-6.min.css' );
         wp_enqueue_script( 'Foundation6', GLM_MEMBERS_PLUGIN_URL . '/js/foundation-6.min.js' );
 
+        // Lead Tabulater js library
         wp_enqueue_style( 'Tabulator', GLM_MEMBERS_PLUGINS_PLUGIN_URL . '/js/tabulator/dist/css/tabulator.min.css' );
         wp_enqueue_script( 'Tabulator', GLM_MEMBERS_PLUGINS_PLUGIN_URL . '/js/tabulator/dist/js/tabulator.min.js' );
 
index d8e9b28..0b8f1d6 100644 (file)
@@ -140,7 +140,7 @@ class GlmMembersAdmin_plugins_servers extends GlmDataServers
                 if ( $server['fieldData']['production']['value'] ) {
                     $tData['sites']  = $this->wpdb->get_results(
                         $this->wpdb->prepare(
-                            "SELECT S.name as site_name,S.prod_url as url
+                            "SELECT S.id,S.name as site_name,S.prod_url as url
                                FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "sites S
                                     LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "servers PS ON (PS.id = S.prod_server)
                               WHERE PS.id = %d
@@ -152,7 +152,7 @@ class GlmMembersAdmin_plugins_servers extends GlmDataServers
                 } else {
                     $tData['sites']  = $this->wpdb->get_results(
                         $this->wpdb->prepare(
-                            "SELECT S.name as site_name,S.dev_url as url
+                            "SELECT S.id,S.name as site_name,S.dev_url as url
                                FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "sites S
                                     LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "servers DS ON (DS.id = S.dev_server)
                               WHERE DS.id = %d
index c160d7c..bff1d15 100644 (file)
@@ -104,10 +104,11 @@ class GlmMembersAdmin_plugins_sites extends GlmDataSites
         $option2  = false;
         $viewPath = 'admin/plugins/';
 
-        // Setup Foundation 6
+        // Setup Foundation 6.
         wp_enqueue_style( 'Foundation6', GLM_MEMBERS_PLUGIN_URL . 'css/foundation-6.min.css' );
         wp_enqueue_script( 'Foundation6', GLM_MEMBERS_PLUGIN_URL . 'js/foundation-6.min.js' );
 
+        // Load Tabulator js library.
         wp_enqueue_style( 'Tabulator', GLM_MEMBERS_PLUGINS_PLUGIN_URL . '/js/tabulator/dist/css/tabulator.min.css' );
         wp_enqueue_script( 'Tabulator', GLM_MEMBERS_PLUGINS_PLUGIN_URL . '/js/tabulator/dist/js/tabulator.min.js' );
 
@@ -132,7 +133,6 @@ class GlmMembersAdmin_plugins_sites extends GlmDataSites
                 $plugin = $this->updateEntry( $id );
             }
 
-
         case 'view':
             $view = 'site-detail';
             if ( isset( $_REQUEST['site_id'] ) && $id = filter_var( $_REQUEST['site_id'], FILTER_VALIDATE_INT ) ) {
@@ -140,7 +140,7 @@ class GlmMembersAdmin_plugins_sites extends GlmDataSites
                 $tData['site']    = $site;
                 $tData['plugins'] = $this->wpdb->get_results(
                     $this->wpdb->prepare(
-                        "SELECT P.name,P.latest_version,SP.prod_version,SP.dev_version
+                        "SELECT SP.id as site_plugin_id,P.id,P.name,P.latest_version,SP.prod_version,SP.dev_version
                            FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "site_plugins SP
                                 LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "plugins P ON (P.id = SP.plugin)
                           WHERE SP.site = %d
index 20bf74b..c7ed7bc 100644 (file)
 
     {$data = $plugin}
 
-    {* Name *}
-    {$ui = [
-        'value'       => $data.fieldData.name,
-        'field'       => 'name',
-        'label'       => 'Name',
-        'required'    => $data.fieldRequired.name,
-        'errorText'   => 'Name is Required',
-        'dataError'   => $data.fieldFail.name
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Latest Version *}
-    {$ui = [
-        'value'       => $data.fieldData.latest_version,
-        'field'       => 'latest_version',
-        'label'       => 'Latest Version',
-        'required'    => $data.fieldRequired.latest_version,
-        'errorText'   => 'Latest Version is Required',
-        'dataError'   => $data.fieldFail.latest_version
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Notes *}
-    {$ui = [
-        'value'     => $data.fieldData.notes,
-        'field'     => 'notes',
-        'label'     => 'Notes',
-        'height'    => '250',
-        'teeny'     => true,
-        'required'  => $data.fieldRequired.notes,
-        'errorText' => 'Notes is Required',
-        'dataError' => $data.fieldFail.notes
-    ]}
-    {include file='ui/f6/editor.html'}
-
-    {* GLMA *}
-    {$ui = [
-        'value'     => $data.fieldData.glm_associate.value|default:'',
-        'field'     => 'glm_associate',
-        'label'     => 'GLMA',
-        'required'  => $data.fieldRequired.glm_associate,
-        'errorText' => 'GLMA is Required',
-        'dataError' => $data.fieldFail.glm_associate
-    ]}
-    {include file='ui/f6/checkbox.html'}
-
-    {* Plugin Submit *}
-    {$ui = [
-        'class'  => 'primary',
-        'label'  => 'Save',
-        'submit' => true,
-        'id'     => 'plugin-submit',
-        'cancel' => ""
-    ]}
-    {include file='ui/f6/submit.html'}
+    <div class="grid-x grid-margin-x">
+
+        {* Section Start *}
+        {$ui = [
+            'title'    => '',
+            'wrapSize' => '5',
+            'callout'  => true
+        ]}
+        {include file="ui/f6/section-start.html"}
+
+            {* Name *}
+            {$ui = [
+                'value'       => $data.fieldData.name,
+                'field'       => 'name',
+                'label'       => 'Name',
+                'required'    => $data.fieldRequired.name,
+                'errorText'   => 'Name is Required',
+                'dataError'   => $data.fieldFail.name
+            ]}
+            {include file='ui/f6/text.html'}
+
+            {* Latest Version *}
+            {$ui = [
+                'value'       => $data.fieldData.latest_version,
+                'field'       => 'latest_version',
+                'label'       => 'Latest Version',
+                'required'    => $data.fieldRequired.latest_version,
+                'errorText'   => 'Latest Version is Required',
+                'dataError'   => $data.fieldFail.latest_version
+            ]}
+            {include file='ui/f6/text.html'}
+
+            {* GLMA *}
+            {$ui = [
+                'value'     => $data.fieldData.glm_associate.value|default:'',
+                'field'     => 'glm_associate',
+                'label'     => 'GLMA',
+                'required'  => $data.fieldRequired.glm_associate,
+                'errorText' => 'GLMA is Required',
+                'dataError' => $data.fieldFail.glm_associate
+            ]}
+            {include file='ui/f6/checkbox.html'}
+
+        {include file="ui/f6/section-end.html"}
+
+        {* Section Start *}
+        {$ui = [
+            'title'    => '',
+            'wrapSize' => '7',
+            'callout'  => true
+        ]}
+        {include file="ui/f6/section-start.html"}
+
+            {* Notes *}
+            {$ui = [
+                'value'     => $data.fieldData.notes,
+                'field'     => 'notes',
+                'label'     => 'Notes',
+                'height'    => '250',
+                'teeny'     => true,
+                'required'  => $data.fieldRequired.notes,
+                'errorText' => 'Notes is Required',
+                'dataError' => $data.fieldFail.notes
+            ]}
+            {include file='ui/f6/editor.html'}
+
+        {include file="ui/f6/section-end.html"}
+
+        {* Plugin Submit *}
+        {$ui = [
+            'class'  => 'primary',
+            'label'  => 'Save',
+            'submit' => true,
+            'id'     => 'plugin-submit',
+            'cancel' => ""
+        ]}
+        {include file='ui/f6/submit.html'}
+
+    </div>
 
 {* Form End *}
 {include file='ui/f6/form-end.html'}
 
 
-<style>
-    .row-green {
-        background-color: rgb( 225, 250, 234 );
-    }
-    .row-red {
-        background-color: rgb( 247, 228, 225 );
-    }
-</style>
-
 {if $newEntry}
     {$baseUrl = "{$thisUrl}?page={$thisPage}&glm_action={$thisAction}&option=view"}
 {else}
 
 <a class="button primary" href="{$baseUrl}&option=pluginSite{if !empty($smarty.request.order)}&order={$smarty.request.order}{/if}">Add Site</a>
 
-{if !empty($sites) && !$newEntry}
-    <table class="stack hover hide">
-        <tr>
-            <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'nameA'}nameA{else}nameD{/if}">Site Name</a></th>
-            <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'prod_serverA'}prod_serverA{else}prod_serverD{/if}">Prod Server</a></th>
-            <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'prod_versionA'}prod_versionA{else}prod_versionD{/if}">Prod Version</a></th>
-            <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'dev_serverA'}dev_serverA{else}dev_serverD{/if}">Dev Server</a></th>
-            <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'dev_versionA'}dev_versionA{else}dev_versionD{/if}">Dev Version</a></th>
-        </tr>
-        {foreach $sites as $site}
-            <tr>
-                <td><a href="{$baseUrl}&option=pluginSite&site_id={$site.id}{if !empty($smarty.request.order)}&order={$smarty.request.order}{/if}">{$site.site_name}</a></td>
-                <td width="110">{$site.prod_server}</td>
-                <td width="110" class="{if !empty($site.prod_version) && version_compare( $plugin.fieldData.latest_version, $site.prod_version, '>' )}row-red{elseif !empty($site.prod_version)}row-green{/if}">{$site.prod_version}</td>
-                <td width="110">{$site.dev_server}</td>
-                <td width="110" class="{if !empty($site.dev_version) && version_compare( $plugin.fieldData.latest_version, $site.dev_version, '>' )}row-red{elseif !empty($site.dev_version)}row-green{/if}">{$site.dev_version}</td>
-            </tr>
-        {/foreach}
-    </table>
-
-    <div id="siteList"></div>
-{/if}
+<div id="siteList"></div>
 
 {* Grid End *}
 {include file='ui/f6/grid-end.html'}
         $(document).foundation();
         var tabledata = [
             {foreach $sites as $site}
-                { id:"{$site.site_plugin_id}", siteId: "{$site.id}", name:"{$site.site_name|escape:'quotes'}",
-                prodServer: "{$site.prod_server}", prodVersion: "{$site.prod_version}",
-                prodUpToDate: {if !empty($site.prod_version) && version_compare( $plugin.fieldData.latest_version, $site.prod_version, '>' )}false{elseif !empty($site.prod_version)}true{else}null{/if},
-                devServer: "{$site.dev_server}", devVersion: "{$site.dev_version}",
-                devUpToDate: {if !empty($site.dev_version) && version_compare( $plugin.fieldData.latest_version, $site.dev_version, '>' )}false{elseif !empty($site.dev_version)}true{else}null{/if}
+                {
+                    id:"{$site.site_plugin_id}",
+                    siteId: "{$site.id}",
+                    name:"{$site.site_name|escape:'quotes'}",
+                    prodServer: "{$site.prod_server}",
+                    prodVersion: "{$site.prod_version}",
+                    prodUpToDate: {if !empty($site.prod_version) && version_compare( $plugin.fieldData.latest_version, $site.prod_version, '>' )}false{elseif !empty($site.prod_version)}true{else}null{/if},
+                    devServer: "{$site.dev_server}",
+                    devVersion: "{$site.dev_version}",
+                    devUpToDate: {if !empty($site.dev_version) && version_compare( $plugin.fieldData.latest_version, $site.dev_version, '>' )}false{elseif !empty($site.dev_version)}true{else}null{/if}
                 },
             {/foreach}
         ];
 
         {literal}
+        /**
+         * Function updateVersion. Calls the ajax handler to save tho date for the version.
+         *
+         * Saves the data for prod and dev versions for the site_plugin record of that row.
+         *
+         * @param Object cell Tabulator cell object.
+         *
+         * @return void
+         */
         function updateVersion( cell ) {
             if ( cell == undefined ) {
                 console.log('ERROR');
index 9a7e50e..6febc6e 100644 (file)
 
     {$data = $server}
 
-    <input type="hidden" name="glm_action" value="servers">
-    <input type="hidden" name="option" value="save">
-    <input type="hidden" name="server_id" value="{$server.fieldData.id}">
-
-    {* Production *}
-    {$ui = [
-        'value'     => $data.fieldData.production.value,
-        'field'     => 'production',
-        'label'     => 'Production',
-        'required'  => $data.fieldRequired.production,
-        'errorText' => 'Production is Required',
-        'dataError' => $data.fieldFail.production
-    ]}
-    {include file='ui/f6/checkbox.html'}
-
-    {* Name *}
-    {$ui = [
-        'value'       => $data.fieldData.name,
-        'field'       => 'name',
-        'label'       => 'Name',
-        'required'    => $data.fieldRequired.name,
-        'errorText'   => 'Name is Required',
-        'dataError'   => $data.fieldFail.name
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Location *}
-    {$ui = [
-        'value'       => $data.fieldData.location,
-        'field'       => 'location',
-        'label'       => 'Location',
-        'required'    => $data.fieldRequired.location,
-        'errorText'   => 'Location is Required',
-        'dataError'   => $data.fieldFail.location
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* PHP Version *}
-    {$ui = [
-        'value'       => $data.fieldData.php_version,
-        'field'       => 'php_version',
-        'label'       => 'PHP Version',
-        'required'    => $data.fieldRequired.php_version,
-        'errorText'   => 'PHP Version is Required',
-        'dataError'   => $data.fieldFail.php_version
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Mysql Version *}
-    {$ui = [
-        'value'       => $data.fieldData.mysql_version,
-        'field'       => 'mysql_version',
-        'label'       => 'Mysql Version',
-        'required'    => $data.fieldRequired.mysql_version,
-        'errorText'   => 'Mysql Version is Required',
-        'dataError'   => $data.fieldFail.mysql_version
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Save *}
-    {$ui = [
-        'class'  => 'primary',
-        'label'  => 'Save',
-        'submit' => true,
-        'id'     => 'form-save',
-        'cancel' => ""
-    ]}
-    {include file='ui/f6/submit.html'}
+    <div class="grid-x grid-margin-x">
+
+        <input type="hidden" name="glm_action" value="servers">
+        <input type="hidden" name="option" value="save">
+        <input type="hidden" name="server_id" value="{$server.fieldData.id}">
+
+        {* Section Start *}
+        {$ui = [
+            'title'    => '',
+            'wrapSize' => '6',
+            'callout'  => true
+        ]}
+        {include file="ui/f6/section-start.html"}
+
+            {* Production *}
+            {$ui = [
+                'value'     => $data.fieldData.production.value,
+                'field'     => 'production',
+                'label'     => 'Production',
+                'required'  => $data.fieldRequired.production,
+                'errorText' => 'Production is Required',
+                'dataError' => $data.fieldFail.production
+            ]}
+            {include file='ui/f6/checkbox.html'}
+
+            {* Name *}
+            {$ui = [
+                'value'       => $data.fieldData.name,
+                'field'       => 'name',
+                'label'       => 'Name',
+                'required'    => $data.fieldRequired.name,
+                'errorText'   => 'Name is Required',
+                'dataError'   => $data.fieldFail.name
+            ]}
+            {include file='ui/f6/text.html'}
+
+            {* Location *}
+            {$ui = [
+                'value'       => $data.fieldData.location,
+                'field'       => 'location',
+                'label'       => 'Location',
+                'required'    => $data.fieldRequired.location,
+                'errorText'   => 'Location is Required',
+                'dataError'   => $data.fieldFail.location
+            ]}
+            {include file='ui/f6/text.html'}
+
+        {include file="ui/f6/section-end.html"}
+
+        {* Section Start *}
+        {$ui = [
+            'title'    => '',
+            'wrapSize' => '6',
+            'callout'  => true
+        ]}
+        {include file="ui/f6/section-start.html"}
+
+            {* PHP Version *}
+            {$ui = [
+                'value'       => $data.fieldData.php_version,
+                'field'       => 'php_version',
+                'label'       => 'PHP Version',
+                'required'    => $data.fieldRequired.php_version,
+                'errorText'   => 'PHP Version is Required',
+                'dataError'   => $data.fieldFail.php_version
+            ]}
+            {include file='ui/f6/text.html'}
+
+            {* Mysql Version *}
+            {$ui = [
+                'value'       => $data.fieldData.mysql_version,
+                'field'       => 'mysql_version',
+                'label'       => 'Mysql Version',
+                'required'    => $data.fieldRequired.mysql_version,
+                'errorText'   => 'Mysql Version is Required',
+                'dataError'   => $data.fieldFail.mysql_version
+            ]}
+            {include file='ui/f6/text.html'}
+
+        {include file="ui/f6/section-end.html"}
+
+        {* Save *}
+        {$ui = [
+            'class'  => 'primary',
+            'label'  => 'Save',
+            'submit' => true,
+            'id'     => 'form-save',
+            'cancel' => ""
+        ]}
+        {include file='ui/f6/submit.html'}
+
+    </div>
 
 {* Form End *}
 {include file='ui/f6/form-end.html'}
             ],
             rowClick:function(e, row){
                 console.log('Row ' + row.getData().id + ' Clicked!!!');
+                window.location.href="{/literal}{$thisUrl}?page={$thisPage}&glm_action=sites&option=view&site_id={literal}" + row.getData().id;
             }
         });
         {/literal}
index 0d7dc51..2ab42fc 100644 (file)
@@ -8,7 +8,8 @@
 {$ui = [
     'nowrap'          => false,
     'backgroundColor' => '',
-    'sectionColor'    => ''
+    'sectionColor'    => '',
+    'startGridX'      => false
 ]}
 {include file='ui/f6/grid-start.html'}
 
 
     {$data = $site}
 
-    {* Active *}
-    {$ui = [
-        'value'     => $data.fieldData.active.value,
-        'field'     => 'active',
-        'label'     => 'Active',
-        'required'  => $data.fieldRequired.active,
-        'errorText' => 'Active is Required',
-        'dataError' => $data.fieldFail.active
-    ]}
-    {include file='ui/f6/checkbox.html'}
-
-    {* Name *}
-    {$ui = [
-        'value'       => $data.fieldData.name,
-        'field'       => 'name',
-        'label'       => 'Name',
-        'required'    => $data.fieldRequired.name,
-        'errorText'   => 'Name is Required',
-        'dataError'   => $data.fieldFail.name
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Prod Url *}
-    {$ui = [
-        'value'       => $data.fieldData.prod_url,
-        'field'       => 'prod_url',
-        'label'       => 'Prod Url',
-        'required'    => $data.fieldRequired.prod_url,
-        'errorText'   => 'Prod Url is Required',
-        'dataError'   => $data.fieldFail.prod_url
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Dev Url *}
-    {$ui = [
-        'value'       => $data.fieldData.dev_url,
-        'field'       => 'dev_url',
-        'label'       => 'Dev Url',
-        'required'    => $data.fieldRequired.dev_url,
-        'errorText'   => 'Dev Url is Required',
-        'dataError'   => $data.fieldFail.dev_url
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Prod Server *}
-    {$ui = [
-        'value'     => $data.fieldData.prod_server.value,
-        'field'     => 'prod_server',
-        'label'     => 'Prod Server',
-        'list'      => $data.fieldData.prod_server.list,
-        'l_label'   => 'name',
-        'l_value'   => 'value',
-        'l_blank'   => false,
-        'required'  => $data.fieldRequired.prod_server,
-        'errorText' => 'Prod Server is Required',
-        'dataError' => $data.fieldFail.prod_server
-    ]}
-    {include file='ui/f6/select.html'}
-
-    {* Dev Server *}
-    {$ui = [
-        'value'     => $data.fieldData.dev_server.value,
-        'field'     => 'dev_server',
-        'label'     => 'Dev Server',
-        'list'      => $data.fieldData.dev_server.list,
-        'l_label'   => 'name',
-        'l_value'   => 'value',
-        'l_blank'   => false,
-        'required'  => $data.fieldRequired.dev_server,
-        'errorText' => 'Dev Server is Required',
-        'dataError' => $data.fieldFail.dev_server
-    ]}
-    {include file='ui/f6/select.html'}
-
-    {* Map Key *}
-    {$ui = [
-        'value'       => $data.fieldData.map_key,
-        'field'       => 'map_key',
-        'label'       => 'Map Key',
-        'required'    => $data.fieldRequired.map_key,
-        'errorText'   => 'Map Key is Required',
-        'dataError'   => $data.fieldFail.map_key
-    ]}
-    {include file='ui/f6/text.html'}
-
-    {* Has Contacts *}
-    {$ui = [
-        'value'     => $data.fieldData.has_contacts.value,
-        'field'     => 'has_contacts',
-        'label'     => 'Has Contacts',
-        'required'  => $data.fieldRequired.has_contacts,
-        'errorText' => 'Has Contacts is Required',
-        'dataError' => $data.fieldFail.has_contacts
-    ]}
-    {include file='ui/f6/checkbox.html'}
-
-    {* Has Members *}
-    {$ui = [
-        'value'     => $data.fieldData.has_members.value,
-        'field'     => 'has_members',
-        'label'     => 'Has Members',
-        'required'  => $data.fieldRequired.has_members,
-        'errorText' => 'Has Members is Required',
-        'dataError' => $data.fieldFail.has_members
-    ]}
-    {include file='ui/f6/checkbox.html'}
+    <div class="grid-x grid-margin-x">
+
+        {* Section Start *}
+        {$ui = [
+            'title'    => '',
+            'wrapSize' => '6',
+            'callout'  => true
+        ]}
+        {include file="ui/f6/section-start.html"}
+
+            {* Active *}
+            {$ui = [
+                'value'     => $data.fieldData.active.value,
+                'field'     => 'active',
+                'label'     => 'Active',
+                'required'  => $data.fieldRequired.active,
+                'errorText' => 'Active is Required',
+                'dataError' => $data.fieldFail.active
+            ]}
+            {include file='ui/f6/checkbox.html'}
+
+            {* Has Contacts *}
+            {$ui = [
+                'value'     => $data.fieldData.has_contacts.value,
+                'field'     => 'has_contacts',
+                'label'     => 'Has Contacts',
+                'required'  => $data.fieldRequired.has_contacts,
+                'errorText' => 'Has Contacts is Required',
+                'dataError' => $data.fieldFail.has_contacts
+            ]}
+            {include file='ui/f6/checkbox.html'}
+
+            {* Has Members *}
+            {$ui = [
+                'value'     => $data.fieldData.has_members.value,
+                'field'     => 'has_members',
+                'label'     => 'Has Members',
+                'required'  => $data.fieldRequired.has_members,
+                'errorText' => 'Has Members is Required',
+                'dataError' => $data.fieldFail.has_members
+            ]}
+            {include file='ui/f6/checkbox.html'}
+
+            {* Name *}
+            {$ui = [
+                'value'       => $data.fieldData.name,
+                'field'       => 'name',
+                'label'       => 'Name',
+                'required'    => $data.fieldRequired.name,
+                'errorText'   => 'Name is Required',
+                'dataError'   => $data.fieldFail.name
+            ]}
+            {include file='ui/f6/text.html'}
+
+            {* Map Key *}
+            {$ui = [
+                'value'       => $data.fieldData.map_key,
+                'field'       => 'map_key',
+                'label'       => 'Map Key',
+                'required'    => $data.fieldRequired.map_key,
+                'errorText'   => 'Map Key is Required',
+                'dataError'   => $data.fieldFail.map_key
+            ]}
+            {include file='ui/f6/text.html'}
+
+
+        {include file="ui/f6/section-end.html"}
+
+        {* Section Start *}
+        {$ui = [
+            'title'    => '',
+            'wrapSize' => '6',
+            'callout'  => true
+        ]}
+        {include file="ui/f6/section-start.html"}
+
+            {* Prod Server *}
+            {$ui = [
+                'value'     => $data.fieldData.prod_server.value,
+                'field'     => 'prod_server',
+                'label'     => 'Prod Server',
+                'list'      => $data.fieldData.prod_server.list,
+                'l_label'   => 'name',
+                'l_value'   => 'value',
+                'l_blank'   => false,
+                'required'  => $data.fieldRequired.prod_server,
+                'errorText' => 'Prod Server is Required',
+                'dataError' => $data.fieldFail.prod_server
+            ]}
+            {include file='ui/f6/select.html'}
+
+            {* Prod Url *}
+            {$ui = [
+                'value'       => $data.fieldData.prod_url,
+                'field'       => 'prod_url',
+                'label'       => 'Prod Url',
+                'required'    => $data.fieldRequired.prod_url,
+                'errorText'   => 'Prod Url is Required',
+                'dataError'   => $data.fieldFail.prod_url
+            ]}
+            {include file='ui/f6/text.html'}
+
+            {* Dev Server *}
+            {$ui = [
+                'value'     => $data.fieldData.dev_server.value,
+                'field'     => 'dev_server',
+                'label'     => 'Dev Server',
+                'list'      => $data.fieldData.dev_server.list,
+                'l_label'   => 'name',
+                'l_value'   => 'value',
+                'l_blank'   => false,
+                'required'  => $data.fieldRequired.dev_server,
+                'errorText' => 'Dev Server is Required',
+                'dataError' => $data.fieldFail.dev_server
+            ]}
+            {include file='ui/f6/select.html'}
+
+            {* Dev Url *}
+            {$ui = [
+                'value'       => $data.fieldData.dev_url,
+                'field'       => 'dev_url',
+                'label'       => 'Dev Url',
+                'required'    => $data.fieldRequired.dev_url,
+                'errorText'   => 'Dev Url is Required',
+                'dataError'   => $data.fieldFail.dev_url
+            ]}
+            {include file='ui/f6/text.html'}
+
+        {include file="ui/f6/section-end.html"}
+
+    </div>
 
     {* Save *}
     {$ui = [
 {* Form End *}
 {include file='ui/f6/form-end.html'}
 
-<style>
-    .row-green {
-        background-color: rgb( 225, 250, 234 );
-    }
-    .row-red {
-        background-color: rgb( 247, 228, 225 );
-    }
-</style>
-
-{if !empty($plugins)}
-    <table class="stack hover hide">
-        <tr>
-            <th class="text-left">Plugin Name</th>
-            <th class="text-left">Prod Version</th>
-            <th class="text-left">Dev Version</th>
-        </tr>
-        {foreach $plugins as $plugin}
-            <tr>
-                <td>{$plugin.name}</td>
-                <td width="110" class="{if !empty($plugin.prod_version) && version_compare( $plugin.latest_version, $plugin.prod_version, '>' )}row-red{elseif !empty($plugin.prod_version)}row-green{/if}">{$plugin.prod_version}</td>
-                <td width="110" class="{if !empty($plugin.dev_version) && version_compare( $plugin.latest_version, $plugin.dev_version, '>' )}row-red{elseif !empty($plugin.dev_version)}row-green{/if}">{$plugin.dev_version}</td>
-            </tr>
-        {/foreach}
-    </table>
-
-    <div id="pluginList"></div>
-{/if}
-
+<div id="pluginList"></div>
 
 {* Grid End *}
 {include file='ui/f6/grid-end.html'}
 <script>
 jQuery(document).ready(function($){
     $(document).foundation();
-      var tabledata = [
-            {foreach $plugins as $plugin}
-                { id:"{$plugin.id}", name:"{$plugin.name|escape:'quotes'}",
+    var tabledata = [
+        {foreach $plugins as $plugin}
+            {
+                id:"{$plugin.site_plugin_id}",
+                pluginId:"{$plugin.id}",
+                name:"{$plugin.name|escape:'quotes'}",
                 prodVersion: "{$plugin.prod_version}",
                 prodUpToDate: {if !empty($plugin.prod_version) && version_compare( $plugin.latest_version, $plugin.prod_version, '>' )}false{elseif !empty($plugin.prod_version)}true{else}null{/if},
                 devVersion: "{$plugin.dev_version}",
                 devUpToDate: {if !empty($plugin.dev_version) && version_compare( $plugin.latest_version, $plugin.dev_version, '>' )}false{elseif !empty($plugin.dev_version)}true{else}null{/if}
-                },
-            {/foreach}
-        ];
-
-        {literal}
-        var table = new Tabulator("#pluginList",{
-            height: "350px",
-            data: tabledata,
-            layout: "fitColumns",
-            tooltips: true,
-            addRowPos: "top",
-            initialSort: [ {column: "name", dir: "asc"} ],
-            columns:[
-                {title:"Site Name", field:"name", width:"250"},
-                {title:"Prod Version", field:"prodVersion", align:"left"},
-                {title:"Status", field:"prodUpToDate", formatter:"tickCross"},
-                {title:"Dev Version", field:"devVersion", align:"left"},
-                {title:"Status", field:"devUpToDate", formatter:"tickCross"},
-            ],
-            rowClick:function(e, row){
-                console.log('Row ' + row.getData().id + ' Clicked!!!');
-                window.location.href="{/literal}{$baseUrl}&option=pluginSite{if !empty($smarty.request.order)}&order={$smarty.request.order}{/if}&site_id={literal}" + row.getData().id;
-            }
+            },
+        {/foreach}
+    ];
+
+    {literal}
+    function updateVersion( cell ) {
+        if ( cell == undefined ) {
+            console.log('ERROR');
+            return false;
+        }
+        // Get data from row.
+        var data = cell.getRow().getData();
+        // Call ajax page to update the sitePlugin record.
+        $.ajax({
+            cache: false,
+            url: '{/literal}{$ajaxUrl}{literal}?action=glm_members_admin_ajax&glm_action=sitePluginUpdate',
+            data: data,
+            dataType: 'json',
+        }).done(function( rsp ){
+            console.log( 'return: ', rsp );
+            table.updateData([{id: rsp.id, prodUpToDate: rsp.prodStatus, devUpToDate: rsp.devStatus}]);
         });
-        {/literal}
+    }
+    var table = new Tabulator("#pluginList",{
+        height: "350px",
+        data: tabledata,
+        layout: "fitColumns",
+        tooltips: true,
+        addRowPos: "top",
+        initialSort: [ {column: "name", dir: "asc"} ],
+        columns:[
+            {title:"Site Name", field:"name", width:"250"},
+            {title:"Prod Version", field:"prodVersion", align:"left", editor:true, cellEdited: updateVersion },
+            {title:"Status", field:"prodUpToDate", formatter:"tickCross"},
+            {title:"Dev Version", field:"devVersion", align:"left", editor:true, cellEdited: updateVersion },
+            {title:"Status", field:"devUpToDate", formatter:"tickCross"},
+        ],
+        rowClick:function(e, row){
+            console.log('Row ' + row.getData().id + ' Clicked!!!');
+            //window.location.href="{/literal}{$baseUrl}&option=pluginSite{if !empty($smarty.request.order)}&order={$smarty.request.order}{/if}&site_id={literal}" + row.getData().id;
+        }
+    });
+    {/literal}
 });
 </script>