Subject: [pgAdmin4][RM#3073] Allow user to schedule without End date from UI

From: Murtuza Zabuawala <[email-masked]>
Date: Mon, 26 Feb 2018 20:16:27 +0530

Hi,

PFA patch to fix the issue where user was not able to create pgAgent job
from UI without entering End date in schedule section.

--
Regards,
Murtuza Zabuawala
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
index 6972dca..a88f9d0 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
@@ -464,18 +464,16 @@ define('pgadmin.node.pga_schedule', [
             this.errorModel.unset('jscstart');
           }
 
-          val = this.get('jscend');
-          if (_.isUndefined(val) || _.isNull(val) ||
-            String(val).replace(/^\s+|\s+$/g, '') == '') {
-            msg = gettext('Please enter the end time.');
-            this.errorModel.set('jscend', msg);
-            errMsg = errMsg || msg;
-          } else {
-            this.errorModel.unset('jscend');
-          }
-
           // End time must be greater than Start time
           if(!errMsg) {
+            val = this.get('jscend');
+            // No further validation required if end date is not provided by
+            // the user
+            if (_.isUndefined(val) || _.isNull(val) ||
+              String(val).replace(/^\s+|\s+$/g, '') == '') {
+              return;
+            }
+
             var start_time = this.get('jscstart'),
               end_time = this.get('jscend'),
               start_time_js =  start_time.split(' '),

---

From: Dave Page <[email-masked]>
Date: Mon, 26 Feb 2018 16:44:37 +0000

Hi

> from UI without entering End date in schedule section.

 Whilst this does resolve the validation issue, there are still a couple of
other related problems, as can be seen in the attached screenshots:

- The Start date/time in the subnode control doesn't seem to be properly
synchronised with the value in the grid.

- If you leave the End date/time blank (but maybe click into it first), the
grid will show "Invalid date".

It's possible there are other oddities as well - please check carefully for
anything else.

Thanks.

-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

---

From: Murtuza Zabuawala <[email-masked]>
Date: Tue, 27 Feb 2018 13:56:19 +0530

Hi Dave,

As validation related patch was committed with RM#3148 [ Sorry about that I
forgot to checkout :) ]
PFA patch to fix the issues you mentioned, I have also removed extra error
message from sub node collection control and made it optional via flag.

On Mon, Feb 26, 2018 at 10:14 PM, Dave Page <[email-masked]> wrote:

> Hi
>
> On Mon, Feb 26, 2018 at 2:46 PM, Murtuza Zabuawala <murtuza.zabuawala@
> enterprisedb.com> wrote:
>
>> Hi,
>>
>  Whilst this does resolve the validation issue, there are still a couple
> of other related problems, as can be seen in the attached screenshots:
>
> - If you leave the End date/time blank (but maybe click into it first),
> the grid will show "Invalid date".
>
> It's possible there are other oddities as well - please check carefully
> for anything else.
>
> Thanks.
>
> --
> Dave Page
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
index a88f9d0..1cfa38c 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
@@ -279,7 +279,7 @@ define('pgadmin.node.pga_schedule', [
           control: 'datetimepicker', cell: DatetimeCell,
           disabled: function() { return false; }, displayInUTC: false,
           displayFormat: 'YYYY-MM-DD HH:mm:ss Z', options: {
-            format: 'YYYY-MM-DD HH:mm:ss Z', useCurrent: false,
+            format: 'YYYY-MM-DD HH:mm:ss Z',
             minDate: moment().add(0, 'm'),
           }, cellHeaderClasses: 'width_percent_25',
           modelFormat: 'YYYY-MM-DD HH:mm:ss Z',
@@ -458,6 +458,9 @@ define('pgadmin.node.pga_schedule', [
           if (_.isUndefined(val) || _.isNull(val) ||
             String(val).replace(/^\s+|\s+$/g, '') == '') {
             msg = gettext('Please enter the start time.');
+            if (val == '') {
+              this.set('jscstart', undefined);
+            }
             this.errorModel.set('jscstart', msg);
             errMsg = errMsg || msg;
           } else {
@@ -471,6 +474,9 @@ define('pgadmin.node.pga_schedule', [
             // the user
             if (_.isUndefined(val) || _.isNull(val) ||
               String(val).replace(/^\s+|\s+$/g, '') == '') {
+              if (val == '') {
+                this.set('jscend', undefined);
+              }
               return;
             }
 
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js b/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
index 1a1cfb1..72fd1be 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
@@ -133,6 +133,7 @@ define('pgadmin.node.pga_job', [
           type: 'collection', mode: ['edit', 'create'],
           model: pgBrowser.Nodes['pga_jobstep'].model, canEdit: true,
           control: 'sub-node-collection', canAdd: true, canDelete: true,
+          showError: false,
           columns: [
             'jstname', 'jstenabled', 'jstkind', 'jstconntype', 'jstonerror',
           ],
@@ -141,6 +142,7 @@ define('pgadmin.node.pga_job', [
           type: 'collection', mode: ['edit', 'create'],
           control: 'sub-node-collection', canAdd: true, canDelete: true,
           canEdit: true, model: pgBrowser.Nodes['pga_schedule'].model,
+          showError: false,
           columns: ['jscname', 'jscenabled', 'jscstart', 'jscend'],
         }],
         validate: function() {
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js b/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
index 0dd3f60..971c2d6 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
@@ -300,6 +300,17 @@ define('pgadmin.node.pga_jobstep', [
             this.errorModel.unset('jstcode');
           }
 
+          val = this.get('jstonerror');
+          if (
+            !_.isUndefined(val) && !_.isNull(val) &&
+              String(val).replace(/^\s+|\s+$/g, '') == ''
+          ) {
+            msg = gettext('Please select valid on error option .');
+            this.errorModel.set('jstonerror', msg);
+          } else {
+            this.errorModel.unset('jstonerror');
+          }
+
           return errMsg;
         },
       }),
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index 2bbaa17..9f1f3db 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -1196,6 +1196,7 @@ define([
         canAddRow: data.canAddRow,
         canEdit: evalF(data.canEdit, data, this.model),
         canDelete: evalF(data.canDelete, data, this.model),
+        showError: data.showError || true,
       });
       // Show Backgrid Control
       var grid = (data.subnode == undefined) ? '' : this.showGridControl(data);
@@ -1224,9 +1225,11 @@ define([
 
       if (_.isEmpty(error)) return;
 
-      self.$el.addClass('subnode-error').append(
-        $('<div></div>').addClass('pgadmin-control-error-message pg-el-xs-offset-4 pg-el-xs-8 help-block').text(error)
-      );
+      if (self.field.get('showError')) {
+        self.$el.addClass('subnode-error').append(
+          $('<div></div>').addClass('pgadmin-control-error-message pg-el-xs-offset-4 pg-el-xs-8 help-block').text(error)
+        );
+      }
     },
     cleanup: function() {
       // Clean up existing grid if any (in case of re-render)
@@ -1238,8 +1241,10 @@ define([
       }
     },
     clearInvalid: function() {
-      this.$el.removeClass('subnode-error');
-      this.$el.find('.pgadmin-control-error-message').remove();
+      if (this.field.get('showError')) {
+        this.$el.removeClass('subnode-error');
+        this.$el.find('.pgadmin-control-error-message').remove();
+      }
       return this;
     },
     showGridControl: function(data) {

---

From: Dave Page <[email-masked]>
Date: Tue, 27 Feb 2018 11:54:54 +0000

Hi

Still not quite right - see the attached screenshot which is the result of
simply viewing the properties of an existing job. Note that the start time
is shown in the grid but not the subnode control.

Thanks.

On Tue, Feb 27, 2018 at 8:26 AM, Murtuza Zabuawala <
[email-masked]> wrote:

> Hi Dave,
>
> As validation related patch was committed with RM#3148 [ Sorry about that
> I forgot to checkout :) ]

---

From: Murtuza Zabuawala <[email-masked]>
Date: Tue, 27 Feb 2018 17:29:53 +0530

Hi Dave,

Could you please send screenshot?

On Tue, Feb 27, 2018 at 5:24 PM, Dave Page <[email-masked]> wrote:

> On Tue, Feb 27, 2018 at 8:26 AM, Murtuza Zabuawala <murtuza.zabuawala@
> enterprisedb.com> wrote:
>
>> Hi Dave,
>>
>> PFA patch to fix the issues you mentioned, I have also removed extra
>> error message from sub node collection control and made it optional via
>> flag.
>>
>>
>>
>> --
>> Regards,
>> Murtuza Zabuawala
>>>> PFA patch to fix the issue where user was not able to create pgAgent
>>>> job from UI without entering End date in schedule section.
>>>>
>>>

---

From: Dave Page <[email-masked]>
Date: Tue, 27 Feb 2018 12:00:57 +0000

Sorry - here it is.

On Tue, Feb 27, 2018 at 11:59 AM, Murtuza Zabuawala <
[email-masked]> wrote:

>> Still not quite right - see the attached screenshot which is the result
>> of simply viewing the properties of an existing job. Note that the start
>> time is shown in the grid but not the subnode control.
>>
>> Thanks.
>>
>>> As validation related patch was committed with RM#3148 [ Sorry about
>>> that I forgot to checkout :) ]
>>>>  Whilst this does resolve the validation issue, there are still a
>>>> couple of other related problems, as can be seen in the attached
>>>> screenshots:
>>>>
>>>> - The Start date/time in the subnode control doesn't seem to be
>>>> properly synchronised with the value in the grid.
>>>>

---

From: Murtuza Zabuawala <[email-masked]>
Date: Tue, 27 Feb 2018 17:33:55 +0530

I'm not able to re-produce the issue, Could you hard refresh and try again?

If possible could you please provide exact steps?

On Tue, Feb 27, 2018 at 5:30 PM, Dave Page <[email-masked]> wrote:

> Sorry - here it is.
>
> On Tue, Feb 27, 2018 at 11:59 AM, Murtuza Zabuawala <murtuza.zabuawala@
> enterprisedb.com> wrote:
>
>> Hi Dave,
>>
>>>>> - If you leave the End date/time blank (but maybe click into it
>>>>> first), the grid will show "Invalid date".
>>>>>
>>>>> It's possible there are other oddities as well - please check
>>>>> carefully for anything else.
>>>>>
>>>>> Thanks.
>>>>>
>>>>> --
>>>>> Dave Page

---

From: Dave Page <[email-masked]>
Date: Tue, 27 Feb 2018 15:07:49 +0000

Hi

> I'm not able to re-produce the issue, Could you hard refresh and try again?

I still see it.

> If possible could you please provide exact steps?

Attached is a dump of my test pgagent schema.

1) Load the schema dump into the maintenance database
2) Connect pgAdmin
3) Browse to pgAgent Jobs
4) Right-click Properties, and select the Schedules tab
5) Open the subnode for sched1

---

From: Murtuza Zabuawala <[email-masked]>
Date: Tue, 27 Feb 2018 20:39:39 +0530

​Thanks Dave, I'll look into it.
​

On Tue, Feb 27, 2018 at 8:37 PM, Dave Page <[email-masked]> wrote:

> Hi
>
> On Tue, Feb 27, 2018 at 12:03 PM, Murtuza Zabuawala <murtuza.zabuawala@
> enterprisedb.com> wrote:
>
>>>>> Still not quite right - see the attached screenshot which is the
>>>>> result of simply viewing the properties of an existing job. Note that the
>>>>> start time is shown in the grid but not the subnode control.
>>>>>
>>>>> Thanks.
>>>>>
>>>>>>>> PFA patch to fix the issue where user was not able to create
>>>>>>>> pgAgent job from UI without entering End date in schedule section.
>>>>>>>>
>>>>>>>

---

From: Murtuza Zabuawala <[email-masked]>
Date: Wed, 28 Feb 2018 16:05:29 +0530

Hi Dave,

I have found the issue, it was in Backform control itself :)
Issue: We were passing today's date value as minDate option in pgAgent
schedule schema while rendering the control, So when server was sending
previous datetime value it was not displaying it causing sync problem.

 
 
index 5bbbf9f..ac6d5aa 100644

@@ -2391,6 +2396,7 @@ define([
               },
             }, this.defaults.options, this.field.get('options'), {
               'date': data.value,
+              'minDate': data.value,
             })
           );
         }

---

From: Joao De Almeida Pereira <[email-masked]>
Date: Wed, 28 Feb 2018 15:10:52 +0000

Hello Murtuza,
I do not have the pgAgent installed so it was a little it hard to test this.
After looking into the code I think we are missing some testing coverage
around the pga_job Javascript part so that we can catch these problems.
Even some code extraction can be done around the pg_jobset change

Nevertheless I passed the patch through our CI and it is all green

Thanks
Joao

On Wed, Feb 28, 2018 at 5:36 AM Murtuza Zabuawala <
[email-masked]> wrote:

>>>>>>>> As validation related patch was committed with RM#3148 [ Sorry
>>>>>>>> about that I forgot to checkout :) ]
>>>>>>>> PFA patch to fix the issues you mentioned, I have also removed
>>>>>>>> extra error message from sub node collection control and made it optional
>>>>>>>> via flag.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Regards,
>>>>>>>> Murtuza Zabuawala

---

From: Murtuza Zabuawala <[email-masked]>
Date: Thu, 1 Mar 2018 11:31:45 +0530

Hi Joao,

It is difficult to test scenario with unit test as html input source has
proper date value in both the cases but bootstrap datetime picker itself
was not displaying the value on the UI.
I'm attaching the screenshot for Start field (Both the scenario when it
displays with Valid date and with invalid date when it doesn't).

Let me know if you have anything in mind.

On Wed, Feb 28, 2018 at 8:40 PM, Joao De Almeida Pereira <
[email-masked]> wrote:

> On Wed, Feb 28, 2018 at 5:36 AM Murtuza Zabuawala <murtuza.zabuawala@
> enterprisedb.com> wrote:
>
>> Hi Dave,
>>
>> On Tue, Feb 27, 2018 at 8:39 PM, Murtuza Zabuawala <murtuza.zabuawala@
>> enterprisedb.com> wrote:
>>

---

From: Dave Page <[email-masked]>
Date: Thu, 1 Mar 2018 09:23:55 +0000

> I do not have the pgAgent installed so it was a little it hard to test

FWIW, you don't need to install pgAgent to test this - you can just load
the SQL file I sent into your maintenance database, and that should enable
all the pgAgent features in pgAdmin. Obviously jobs won't get run, but
you'll be able to create them and edit them.

> Even some code extraction can be done around the pg_jobset change

+1

---

From: Dave Page <[email-masked]>
Date: Fri, 2 Mar 2018 11:12:03 +0000

Thanks, applied.