public inbox for [email protected]help / color / mirror / Atom feed
[pgAdmin][RM5241] : Tab key navigation is not working in Grant wizard. 4+ messages / 2 participants [nested] [flat]
* [pgAdmin][RM5241] : Tab key navigation is not working in Grant wizard. @ 2020-03-27 04:17 Pradip Parkale <[email protected]> 0 siblings, 1 reply; 4+ messages in thread From: Pradip Parkale @ 2020-03-27 04:17 UTC (permalink / raw) To: pgadmin-hackers Hi Hackers, Attached is a patch for tab key navigation on grant_wizard. This patch includes: 1. Added code to make tab navigation working in grant_wizard. 2. Added entry for .scss to change the shadow of 'ajs-close' button. This patch also includes the code to allow the user to use the keyboard to update the Backgrid cell DateTime picker control. -- Thanks & Regards, Pradip Parkale QMG, EnterpriseDB Corporation Attachments: [application/octet-stream] RM5241.patch (8.4K, 3-RM5241.patch) download | inline diff: diff --git a/web/pgadmin/browser/static/js/wizard.js b/web/pgadmin/browser/static/js/wizard.js index 72590c9e5..7f23bac23 100644 --- a/web/pgadmin/browser/static/js/wizard.js +++ b/web/pgadmin/browser/static/js/wizard.js @@ -155,6 +155,7 @@ define([ 'click button.wizard-finish': 'finishWizard', 'click button.wizard-help': 'onDialogHelp', 'click a.close-error': 'closeErrorMsg', + 'keydown': 'keydownHandler', }, initialize: function(options) { this.options = _.extend({}, this.options, options.options); @@ -239,6 +240,53 @@ define([ delete this.el; // Delete the variable reference to this node return true; }, + keydownHandler: function(event) { + let wizardHeader = $(event.currentTarget).find('.wizard-header'); + let wizardFooter = $(event.currentTarget).find('.wizard-footer'); + let gridElement = $(event.currentTarget).find('.select-row-cell:first'); + let gridElementLast = $(event.currentTarget).find('.select-row-cell:last'); + + let firstWizardHeaderButton = $(wizardHeader).find('button:enabled:first'); + let lastWizardHeaderButton = $(wizardHeader).find('button:enabled:last'); + let lastWizardFooterBtn = $(wizardFooter).find('button:enabled:last'); + let firstWizardFooterBtn = $(wizardFooter).find('button:enabled:first'); + + + if (event.shiftKey && event.keyCode === 9) { + // Move backwards + if(firstWizardHeaderButton && $(firstWizardHeaderButton).is($(event.target))) { + if (lastWizardFooterBtn) { + $(lastWizardFooterBtn).focus(); + event.preventDefault(); + event.stopPropagation(); + } + }else if(event.target.tagName == 'TEXTAREA'){ + $(lastWizardHeaderButton).focus(); + }else if ($(firstWizardFooterBtn).is($(event.target))){ + $(gridElementLast).find('.custom-control-input').focus(); + event.preventDefault(); + event.stopPropagation(); + } + } else if (event.keyCode === 9) { + // Move forwards + // If taget is last button then goto first element + if(lastWizardFooterBtn && $(lastWizardFooterBtn).is($(event.target))) { + $(firstWizardHeaderButton).focus(); + event.preventDefault(); + event.stopPropagation(); + }else if (event.target.innerText == 'Name'){ + $(gridElement).find('.custom-control-input').focus(); + event.preventDefault(); + event.stopPropagation(); + } else if(event.target.tagName == 'DIV'){ + $(event.currentTarget).find('.custom-control-input:first').trigger('focus'); + event.preventDefault(); + event.stopPropagation(); + } else if(event.target.tagName == 'TEXTAREA'){ + $(firstWizardFooterBtn).focus(); + } + } + }, enableDisableNext: function(disable) { if (typeof(disable) != 'undefined') { this.options.disable_next = disable; diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js index b05e1422f..157c74262 100644 --- a/web/pgadmin/static/js/backgrid.pgadmin.js +++ b/web/pgadmin/static/js/backgrid.pgadmin.js @@ -1772,7 +1772,7 @@ define([ this.tabKeyPress = false; this.$el.datetimepicker(options); this.$el.datetimepicker('show'); - this.picker = this.$el.data('DateTimePicker'); + this.picker = this.$el.data('datetimepicker'); }, events: { 'hide.datetimepicker': 'closeIt', @@ -1780,9 +1780,56 @@ define([ 'keydown': 'keydownHandler', }, keydownHandler: function(event) { + let stopBubble = false; + let self = this; + if (!event.altKey && event.keyCode == 38){ + let currdate = self.$el.data('datetimepicker').date().clone(); + if (self.$el.data('datetimepicker').widget.find('.datepicker').is(':visible')){ + $(this.el).datetimepicker('date', currdate.subtract(7, 'd')); + }else{ + $(this.el).datetimepicker('date', currdate.add(7, 'm')); + } + }else if (!event.altKey && event.keyCode == 40){ + let currdate = self.$el.data('datetimepicker').date().clone(); + if (self.$el.data('datetimepicker').widget.find('.datepicker').is(':visible')){ + $(this.el).datetimepicker('date', currdate.add(7, 'd')); + }else{ + $(this.el).datetimepicker('date', currdate.subtract(7, 'm')); + } + }else if (event.keyCode == 39){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.add(1, 'd')); + }else if (event.keyCode == 37){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.subtract(1, 'd')); + } + + if (event.altKey && event.keyCode == 84){ + if (self.$el.data('datetimepicker').widget.find('.timepicker').is(':visible')){ + self.$el.data('datetimepicker').widget.find('.fa-calendar').click(); + }else{ + self.$el.data('datetimepicker').widget.find('.fa-clock-o').click(); + } + } + + if(event.altKey && event.keyCode == 38){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.add(1, 'h')); + }else if(event.altKey && event.keyCode == 40){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.subtract(1, 'h')); + } + + if (event.keyCode == 27){ + this.$el.datetimepicker('hide'); + stopBubble = true; + } + + if(stopBubble) { + event.stopImmediatePropagation(); + } // If Tab key pressed from Cell and not from Datetime picker element // then we should trigger edited event so that we can goto next cell - let self = this; let tabKeyPressed = true; if (event.keyCode === 9 && self.el === event.target) { self.closeIt(event, tabKeyPressed); diff --git a/web/pgadmin/static/scss/_alertify.overrides.scss b/web/pgadmin/static/scss/_alertify.overrides.scss index b20b5ca04..abbe4646a 100644 --- a/web/pgadmin/static/scss/_alertify.overrides.scss +++ b/web/pgadmin/static/scss/_alertify.overrides.scss @@ -281,7 +281,7 @@ } -.ajs-commands { +.ajs-commands, .ajs-close { button { @extend .btn-secondary; outline: none !important; diff --git a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js index 763edef57..6c581288b 100644 --- a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js +++ b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js @@ -431,29 +431,6 @@ define([ hooks: { onshow: function() { commonUtils.findAndSetFocus($(this.elements.body)); - let self = this; - let containerFooter = $(this.elements.content).find('.wizard-buttons').find('.ml-auto'); - //To get last header button - let lastHeaderButton = $(this.elements.content).find('.wizard-header').find('.ml-auto').find('button:first'); - - $(containerFooter).on('keydown', 'button', function(event) { - if (!event.shiftKey && event.keyCode == 9 && $(this).nextAll('button:not([disabled])').length == 0) { - // set focus back to first editable input element of current active tab once we cycle through all enabled buttons. - let container = $(self.elements.content).find('.wizard-header'); - commonUtils.findAndSetFocus(container.find('button:not([disabled]):first')); - return false; - } - }); - - $(lastHeaderButton).on('keydown', function(event) { - if (event.shiftKey && event.keyCode == 9) { - // set focus back to first element of current active tab once we cycle through all enabled buttons. - let container = $(self.elements.content).find('.wizard-footer'); - commonUtils.findAndSetFocus(container.find('button:not([disabled]):last')); - return false; - } - }); - }, }, @@ -1218,7 +1195,6 @@ define([ }; }); } - // Call Grant Wizard Dialog and set dimensions for wizard Alertify.wizardDialog(true).resizeTo(pgBrowser.stdW.lg,pgBrowser.stdH.lg); }, ^ permalink raw reply [nested|flat] 4+ messages in thread
* Re: [pgAdmin][RM5241] : Tab key navigation is not working in Grant wizard. @ 2020-03-27 07:47 Akshay Joshi <[email protected]> parent: Pradip Parkale <[email protected]> 0 siblings, 1 reply; 4+ messages in thread From: Akshay Joshi @ 2020-03-27 07:47 UTC (permalink / raw) To: Pradip Parkale <[email protected]>; +Cc: pgadmin-hackers Hi Pradip Following things are not working, please fix and resend the patch: Object selection (First) Page: - If there is no object in the backgrid to select then tab navigation not proceed after the headers. - Tab navigation not working for 'Select All' checkbox in the backgrid cell. Privileges selection (Second) Page: - Tab navigation not working for the 'Delete' button in the backgrid cell. On Fri, Mar 27, 2020 at 9:47 AM Pradip Parkale < [email protected]> wrote: > Hi Hackers, > > Attached is a patch for tab key navigation on grant_wizard. > > This patch includes: > > 1. Added code to make tab navigation working in grant_wizard. > 2. Added entry for .scss to change the shadow of 'ajs-close' button. > > This patch also includes the code to allow the user to use the keyboard to > update the Backgrid cell DateTime picker control. > > > -- > Thanks & Regards, > Pradip Parkale > QMG, EnterpriseDB Corporation > -- *Thanks & Regards* *Akshay Joshi* *Sr. Software Architect* *EnterpriseDB Software India Private Limited* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 4+ messages in thread
* Re: [pgAdmin][RM5241] : Tab key navigation is not working in Grant wizard. @ 2020-03-30 11:54 Pradip Parkale <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 4+ messages in thread From: Pradip Parkale @ 2020-03-30 11:54 UTC (permalink / raw) To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers Hi Akshay, Please find the attached patch. On Fri, Mar 27, 2020 at 1:17 PM Akshay Joshi <[email protected]> wrote: > Hi Pradip > > Following things are not working, please fix and resend the patch: > > Object selection (First) Page: > > - If there is no object in the backgrid to select then tab navigation > not proceed after the headers. > > Fixed. > > - Tab navigation not working for 'Select All' checkbox in the backgrid > cell. > > Fixed. > Privileges selection (Second) Page: > > - Tab navigation not working for the 'Delete' button in the > backgrid cell. > > This logic was added even before my patch(1st Patch). User needs to press the 'space' key to delete the privilege added. > > On Fri, Mar 27, 2020 at 9:47 AM Pradip Parkale < > [email protected]> wrote: > >> Hi Hackers, >> >> Attached is a patch for tab key navigation on grant_wizard. >> >> This patch includes: >> >> 1. Added code to make tab navigation working in grant_wizard. >> 2. Added entry for .scss to change the shadow of 'ajs-close' button. >> >> This patch also includes the code to allow the user to use the keyboard >> to update the Backgrid cell DateTime picker control. >> >> >> -- >> Thanks & Regards, >> Pradip Parkale >> QMG, EnterpriseDB Corporation >> > > > -- > *Thanks & Regards* > *Akshay Joshi* > > *Sr. Software Architect* > *EnterpriseDB Software India Private Limited* > *Mobile: +91 976-788-8246* > -- Thanks & Regards, Pradip Parkale QMG, EnterpriseDB Corporation Attachments: [application/octet-stream] RM-5241_v2.patch (10.0K, 3-RM-5241_v2.patch) download | inline diff: diff --git a/web/pgadmin/browser/static/js/wizard.js b/web/pgadmin/browser/static/js/wizard.js index 72590c9e5..3068572d1 100644 --- a/web/pgadmin/browser/static/js/wizard.js +++ b/web/pgadmin/browser/static/js/wizard.js @@ -155,6 +155,7 @@ define([ 'click button.wizard-finish': 'finishWizard', 'click button.wizard-help': 'onDialogHelp', 'click a.close-error': 'closeErrorMsg', + 'keydown': 'keydownHandler', }, initialize: function(options) { this.options = _.extend({}, this.options, options.options); @@ -239,6 +240,60 @@ define([ delete this.el; // Delete the variable reference to this node return true; }, + keydownHandler: function(event) { + let wizardHeader = $(event.currentTarget).find('.wizard-header'); + let wizardFooter = $(event.currentTarget).find('.wizard-footer'); + let gridElement = $(event.currentTarget).find('.select-row-cell:first'); + let gridElementLast = $(event.currentTarget).find('.select-row-cell:last'); + + let firstWizardHeaderButton = $(wizardHeader).find('button:enabled:first'); + let lastWizardHeaderButton = $(wizardHeader).find('button:enabled:last'); + let lastWizardFooterBtn = $(wizardFooter).find('button:enabled:last'); + let firstWizardFooterBtn = $(wizardFooter).find('button:enabled:first'); + + + if (event.shiftKey && event.keyCode === 9) { + // Move backwards + if(firstWizardHeaderButton && $(firstWizardHeaderButton).is($(event.target))) { + if (lastWizardFooterBtn) { + $(lastWizardFooterBtn).focus(); + event.preventDefault(); + event.stopPropagation(); + } + } + else if ($(firstWizardFooterBtn).is($(event.target))){ + if ($(gridElement).find('.custom-control-input').is(':visible')){ + $(gridElementLast).find('.custom-control-input').focus(); + event.preventDefault(); + event.stopPropagation(); + }else if ($(event.currentTarget).find('.wizard-content').find('.CodeMirror-scroll').is(':visible')){ + $(lastWizardHeaderButton).focus(); + } + } + } else if (event.keyCode === 9) { + // Move forwards + // If taget is last button then goto first element + if(lastWizardFooterBtn && $(lastWizardFooterBtn).is($(event.target))) { + $(firstWizardHeaderButton).focus(); + event.preventDefault(); + event.stopPropagation(); + }else if (event.target.innerText == 'Name'){ + if ($(gridElement).find('.custom-control-input').is(':visible')){ + $(gridElement).find('.custom-control-input').focus(); + }else { + $(firstWizardFooterBtn).focus(); + } + event.preventDefault(); + event.stopPropagation(); + } else if(event.target.tagName == 'DIV') { + $(event.currentTarget).find('.custom-control-input:first').trigger('focus'); + event.preventDefault(); + event.stopPropagation(); + } else if(event.target.tagName == 'TEXTAREA'){ + $(firstWizardFooterBtn).focus(); + } + } + }, enableDisableNext: function(disable) { if (typeof(disable) != 'undefined') { this.options.disable_next = disable; diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js index b05e1422f..157c74262 100644 --- a/web/pgadmin/static/js/backgrid.pgadmin.js +++ b/web/pgadmin/static/js/backgrid.pgadmin.js @@ -1772,7 +1772,7 @@ define([ this.tabKeyPress = false; this.$el.datetimepicker(options); this.$el.datetimepicker('show'); - this.picker = this.$el.data('DateTimePicker'); + this.picker = this.$el.data('datetimepicker'); }, events: { 'hide.datetimepicker': 'closeIt', @@ -1780,9 +1780,56 @@ define([ 'keydown': 'keydownHandler', }, keydownHandler: function(event) { + let stopBubble = false; + let self = this; + if (!event.altKey && event.keyCode == 38){ + let currdate = self.$el.data('datetimepicker').date().clone(); + if (self.$el.data('datetimepicker').widget.find('.datepicker').is(':visible')){ + $(this.el).datetimepicker('date', currdate.subtract(7, 'd')); + }else{ + $(this.el).datetimepicker('date', currdate.add(7, 'm')); + } + }else if (!event.altKey && event.keyCode == 40){ + let currdate = self.$el.data('datetimepicker').date().clone(); + if (self.$el.data('datetimepicker').widget.find('.datepicker').is(':visible')){ + $(this.el).datetimepicker('date', currdate.add(7, 'd')); + }else{ + $(this.el).datetimepicker('date', currdate.subtract(7, 'm')); + } + }else if (event.keyCode == 39){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.add(1, 'd')); + }else if (event.keyCode == 37){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.subtract(1, 'd')); + } + + if (event.altKey && event.keyCode == 84){ + if (self.$el.data('datetimepicker').widget.find('.timepicker').is(':visible')){ + self.$el.data('datetimepicker').widget.find('.fa-calendar').click(); + }else{ + self.$el.data('datetimepicker').widget.find('.fa-clock-o').click(); + } + } + + if(event.altKey && event.keyCode == 38){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.add(1, 'h')); + }else if(event.altKey && event.keyCode == 40){ + let currdate = self.$el.data('datetimepicker').date().clone(); + $(this.el).datetimepicker('date', currdate.subtract(1, 'h')); + } + + if (event.keyCode == 27){ + this.$el.datetimepicker('hide'); + stopBubble = true; + } + + if(stopBubble) { + event.stopImmediatePropagation(); + } // If Tab key pressed from Cell and not from Datetime picker element // then we should trigger edited event so that we can goto next cell - let self = this; let tabKeyPressed = true; if (event.keyCode === 9 && self.el === event.target) { self.closeIt(event, tabKeyPressed); diff --git a/web/pgadmin/static/scss/_alertify.overrides.scss b/web/pgadmin/static/scss/_alertify.overrides.scss index b20b5ca04..abbe4646a 100644 --- a/web/pgadmin/static/scss/_alertify.overrides.scss +++ b/web/pgadmin/static/scss/_alertify.overrides.scss @@ -281,7 +281,7 @@ } -.ajs-commands { +.ajs-commands, .ajs-close { button { @extend .btn-secondary; outline: none !important; diff --git a/web/pgadmin/static/vendor/backgrid/backgrid-select-all.js b/web/pgadmin/static/vendor/backgrid/backgrid-select-all.js index e9bcf5130..4e0c5c48b 100644 --- a/web/pgadmin/static/vendor/backgrid/backgrid-select-all.js +++ b/web/pgadmin/static/vendor/backgrid/backgrid-select-all.js @@ -101,9 +101,10 @@ } else if (command.save() || command.moveLeft() || command.moveRight() || command.moveUp() || command.moveDown()) { - e.preventDefault(); - e.stopPropagation(); + if(this.model) { + e.preventDefault(); + e.stopPropagation(); this.model.trigger("backgrid:edited", this.model, this.column, command); } } @@ -127,7 +128,7 @@ var id = 'selectall-' + _.uniqueId(this.column.get('name')); this.$el.empty().append([ '<div class="custom-control custom-checkbox custom-checkbox-no-label">', - ' <input tabindex="-1" type="checkbox" class="custom-control-input" id="'+ id +'" />', + ' <input tabindex="0" type="checkbox" class="custom-control-input" id="'+ id +'" />', ' <label class="custom-control-label" for="'+ id +'">', ' <span class="sr-only">Select All<span>', ' </label>', diff --git a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js index 763edef57..6c581288b 100644 --- a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js +++ b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js @@ -431,29 +431,6 @@ define([ hooks: { onshow: function() { commonUtils.findAndSetFocus($(this.elements.body)); - let self = this; - let containerFooter = $(this.elements.content).find('.wizard-buttons').find('.ml-auto'); - //To get last header button - let lastHeaderButton = $(this.elements.content).find('.wizard-header').find('.ml-auto').find('button:first'); - - $(containerFooter).on('keydown', 'button', function(event) { - if (!event.shiftKey && event.keyCode == 9 && $(this).nextAll('button:not([disabled])').length == 0) { - // set focus back to first editable input element of current active tab once we cycle through all enabled buttons. - let container = $(self.elements.content).find('.wizard-header'); - commonUtils.findAndSetFocus(container.find('button:not([disabled]):first')); - return false; - } - }); - - $(lastHeaderButton).on('keydown', function(event) { - if (event.shiftKey && event.keyCode == 9) { - // set focus back to first element of current active tab once we cycle through all enabled buttons. - let container = $(self.elements.content).find('.wizard-footer'); - commonUtils.findAndSetFocus(container.find('button:not([disabled]):last')); - return false; - } - }); - }, }, @@ -1218,7 +1195,6 @@ define([ }; }); } - // Call Grant Wizard Dialog and set dimensions for wizard Alertify.wizardDialog(true).resizeTo(pgBrowser.stdW.lg,pgBrowser.stdH.lg); }, ^ permalink raw reply [nested|flat] 4+ messages in thread
* Re: [pgAdmin][RM5241] : Tab key navigation is not working in Grant wizard. @ 2020-03-30 12:15 Akshay Joshi <[email protected]> parent: Pradip Parkale <[email protected]> 0 siblings, 0 replies; 4+ messages in thread From: Akshay Joshi @ 2020-03-30 12:15 UTC (permalink / raw) To: Pradip Parkale <[email protected]>; +Cc: pgadmin-hackers Thanks, patch applied. On Mon, Mar 30, 2020 at 5:25 PM Pradip Parkale < [email protected]> wrote: > Hi Akshay, > > Please find the attached patch. > > On Fri, Mar 27, 2020 at 1:17 PM Akshay Joshi < > [email protected]> wrote: > >> Hi Pradip >> >> Following things are not working, please fix and resend the patch: >> >> Object selection (First) Page: >> >> - If there is no object in the backgrid to select then tab navigation >> not proceed after the headers. >> >> Fixed. > >> >> - Tab navigation not working for 'Select All' checkbox in the >> backgrid cell. >> >> Fixed. > >> Privileges selection (Second) Page: >> >> - Tab navigation not working for the 'Delete' button in the >> backgrid cell. >> >> This logic was added even before my patch(1st Patch). User needs to press > the 'space' key to delete the privilege added. > >> >> On Fri, Mar 27, 2020 at 9:47 AM Pradip Parkale < >> [email protected]> wrote: >> >>> Hi Hackers, >>> >>> Attached is a patch for tab key navigation on grant_wizard. >>> >>> This patch includes: >>> >>> 1. Added code to make tab navigation working in grant_wizard. >>> 2. Added entry for .scss to change the shadow of 'ajs-close' button. >>> >>> This patch also includes the code to allow the user to use the keyboard >>> to update the Backgrid cell DateTime picker control. >>> >>> >>> -- >>> Thanks & Regards, >>> Pradip Parkale >>> QMG, EnterpriseDB Corporation >>> >> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> >> *Sr. Software Architect* >> *EnterpriseDB Software India Private Limited* >> *Mobile: +91 976-788-8246* >> > > > -- > Thanks & Regards, > Pradip Parkale > QMG, EnterpriseDB Corporation > -- *Thanks & Regards* *Akshay Joshi* *Sr. Software Architect* *EnterpriseDB Software India Private Limited* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 4+ messages in thread
end of thread, other threads:[~2020-03-30 12:15 UTC | newest] Thread overview: 4+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-03-27 04:17 [pgAdmin][RM5241] : Tab key navigation is not working in Grant wizard. Pradip Parkale <[email protected]> 2020-03-27 07:47 ` Akshay Joshi <[email protected]> 2020-03-30 11:54 ` Pradip Parkale <[email protected]> 2020-03-30 12:15 ` Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox