Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ao9gC-0005on-Lh for pgadmin-hackers@arkaria.postgresql.org; Thu, 07 Apr 2016 13:09:00 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1ao9gC-0006K2-0m for pgadmin-hackers@arkaria.postgresql.org; Thu, 07 Apr 2016 13:09:00 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ao9gB-0006Jw-9e for pgadmin-hackers@postgresql.org; Thu, 07 Apr 2016 13:08:59 +0000 Received: from mail-io0-x235.google.com ([2607:f8b0:4001:c06::235]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84_2) (envelope-from ) id 1ao9g5-00014f-Rn for pgadmin-hackers@postgresql.org; Thu, 07 Apr 2016 13:08:58 +0000 Received: by mail-io0-x235.google.com with SMTP id q128so92866737iof.3 for ; Thu, 07 Apr 2016 06:08:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pgadmin-org.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=DOcCjZWtCxStGHDSrGced4YchLRJ+a3eiRGKTuhs1jE=; b=Jeu3QSf7PcrJBdeESVk7r2g7q23KghUsFjJEVnnVYFvZ2ntkkWapbj4nwCH+8rvjDv OnJeqZisBBrvBFKsAuXYN2Rits6XyVQUxSdFN1aPqEfcfN3Mb6LCr7TaGJgkHdeh/Elg la/ej8SW+qM+vclhFt40wF1NuSKe3X95ceiJOYG1YK6hyDyv9CsAHjGh4kXm8cvrZ/yy nrO37M8f0Gac7KTNARRHMk4dtPF4KvOqW3uhOdw/S74gMWig7Aq5JR/xUWifTURpgPDI N6Z4rnnLJ9QjcvonnO2RtW34k3dz8DursqrLtqw945c3kuq/XKkqvfa/79oranlgaoHe qLow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=DOcCjZWtCxStGHDSrGced4YchLRJ+a3eiRGKTuhs1jE=; b=BYBg2yRf6mTgk1neUgTBKsdq6PjNmSzNET1syqEJgiw1Oj1ZJOkQsCo/pSQPFyKpdE E7kCep4SFl+yA0ct3naP0+1m7mE+7Q0p4HxLpgLBFkj5na0GUZ8LaN8fSmrXE+sM/AZ1 kGiteAUywZYv8ees4X/FA3eYpFkwnDrnPZ/Wsuxt1xRSe0xLeXG7mYhW3sBHPrgwh0Ae nXeAqppL7Obp+9k0ffW71MGpuOUVA6JSwjWe//1Erq2jXpW1dnTujnwCKZ5dJEwrnMNO wnNSNifeSXMej8V/YQEdOr7z3ypP4fxKce5mxbexS629IDN36mO4QuFF5WutWHLOSFYS ef5g== X-Gm-Message-State: AD7BkJKdIrmZx5Xcufsf5k4vuhKgEiX0lxTxven8sXblZZN80/F6bcfettGRtRh8MBYpJJD94Tpz6rIPkEbRTw== MIME-Version: 1.0 X-Received: by 10.107.56.196 with SMTP id f187mr3262637ioa.156.1460034531110; Thu, 07 Apr 2016 06:08:51 -0700 (PDT) Received: by 10.64.105.131 with HTTP; Thu, 7 Apr 2016 06:08:50 -0700 (PDT) In-Reply-To: References: Date: Thu, 7 Apr 2016 14:08:50 +0100 Message-ID: Subject: Re: [pgAdmin4] [Patch] Implementation of the Data Grid and Query Tool From: Dave Page To: Akshay Joshi Cc: pgadmin-hackers Content-Type: multipart/related; boundary=001a114ab7b096ef9f052fe4c778 X-Pg-Spam-Score: -2.6 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgadmin-hackers Precedence: bulk Sender: pgadmin-hackers-owner@postgresql.org --001a114ab7b096ef9f052fe4c778 Content-Type: multipart/alternative; boundary=001a114ab7b096ef9c052fe4c777 --001a114ab7b096ef9c052fe4c777 Content-Type: text/plain; charset=UTF-8 On Thu, Apr 7, 2016 at 2:03 PM, Akshay Joshi wrote: > Hi > > On Thu, Apr 7, 2016 at 6:01 PM, Dave Page wrote: > >> Hi >> >> On Thu, Apr 7, 2016 at 10:07 AM, Akshay Joshi < >> akshay.joshi@enterprisedb.com> wrote: >> >>> >>>> - The View Data menu option should be on the Object menu >>>> >>> >>> OK. >>> >>> >>>> , which should mirror the Context menu, except options should be >>>> disabled when not applicable instead of hidden. >>>> >>> >>> Context menu code is generic code, to do this we need to change >>> that code and it impacts other menu items like (Connect/Disconnect server, >>> Connect/Disconnect Database etc ...) >>> >> >> I think you misunderstand. The Context menu is fine - but options that >> are on it, should also be on the main "Object" menu. The difference is that >> where options are hidden on the context menu, they should be disabled on >> the object menu. >> > > The same behaviour I have already added in "Tools" menu, so you want > me to shift that menu from "Tools" to "Object"?? > Just for the View/Edit options. The Query Tool is never shown on the Context menu, so it should be on Tools. > >> >>> >>>> - The Query Tool menu icon should be a glyphicon, to match the others. >>>> >>> >>> There is no glyphicon available which match the Query Tool icon. I >>> have found one like below which is "database-search" or can you please >>> suggest some other icon. >>> [image: Inline image 1] >>> >> >> That one looks perfect. >> >> >>> >>> - Please merge the functionality of the Refresh and Execute buttons into >>>> one button. We shouldn't have two buttons that do essentially the same >>>> thing. >>>> >>> >>> I have modified the button toolbar, we will show buttons on the >>> toolbar specific to the module (QueryTool/EditGrid). Please refer the >>> attached screenshots (QueryTool and EditGrid). >>> >> >> No - please leave all buttons visible in either mode, but disable them as >> appropriate. Then, merge the execute/refresh buttons into one. >> > > In that case we will have to use either refresh icon or execute icon > (play button) or any other, as a user's perspective it's not good to have > play button works as "Refresh" in EG mode or refresh button works as > "Execute" in QT mode. > MySQL Workbench uses something like glyphicon-flash. > >> The reason for doing it this way is that eventually we will add query >> parsing support to the client so that we can start enabling some of the >> Edit Grid features when running in Query Tool mode - e.g. if a Query Tool >> authored query is determined to be updatable, we can enable buttons like >> "Add Row", "Save" etc. >> > > OK. > >> >> >>> >>> >>>> - In Edit Grid mode, the History panel should log all queries (SELECTs, >>>> UPDATEs, DELETEs etc) as it would in the Query Tool. >>>> >>>> - In Edit Grid mode, the Messages panel should display any messages >>>> from the most recent action as it would in the Query Tool. >>>> >>> >>> OK. >>> >> >> Thanks. >> >> >>> >>>> - Please add an SQL button. This should show/hide the SQL panel in >>>> *both* Query Tool and Edit Grid modes. In Edit Grid mode, that textbox >>>> should be read-only, but should display the SQL used (including any >>>> LIMIT/FILTER clauses) >>>> >>> >>> I think we don't need an SQL button, because I have added a >>> Splitter to split SQL panel and Output Panel, so user can any time >>> resize the SQL/Output panel. Please refer the attached screenshots ( >>> QueryTool and EditGrid). >>> >> >> Right, but I'd also like to be able to hide it entirely (which would be >> the default in Edit Grid mode). >> > > To achieve this we need to hide the top half of the splitter, that I > am not sure how we can do that. We can't remove the splitter, because it > provide's ease to user to expand the SQL panel for reading the long SQL > queries/functions. > You could put the small panel (discussed below) that displays the name of the object in the splitter panel as well. Then, you wouldn't have to hide the whole thing. It might look a little weird unless you force the splitter to move when you hide the SQL box though. > >> >>> >>>> - Please remove the border from the SQL box, such that it fills all >>>> available space. >>>> >>> >>> Done. Please refer the attached screenshots (QueryTool and EditGrid). >>> >>>> >>>> - The Filter box should be in a modal overlay over the top of the SQL >>>> box/Results tabs as required. Those elements should be grayed whilst it is >>>> open. >>>> >>> >>> Done. Please refer the attached screenshot (Filter). >>> >> >> Cool. >> >> >>> >>>> - Please adjust the height of the Delete icon in the Edit Grid, such >>>> that it doesn't force the row height to be higher than it should be. >>>> >>> >>> OK. >>> >>>> >>>> - If a field has been edited, but not saved, can we highlight it >>>> somehow? Maybe make the text dark blue? >>>> >>> >>> OK, not sure right now but will try. >>> >>>> >>>> - I think the names of the tabs are far too long. Can we change them to >>>> "Query 1", "Query 2" etc, then rename them to the filename if the user >>>> saves/loads a file? >>>> >>> >>> I personally feel it's been difficult for user to identify the tab if >>> we will give names like "Query 1" . What we can do in case of edit grid we >>> will only show the servername-objectname (remove database and schema) >>> or only objectname, and in case of query tool we will show servername- >>> databasename. What do you think? >>> >> >> I think they're all ambiguous enough to not be useful for many users :-( >> - plus the tabs are so long, they look awful. >> >> We should perhaps add a small panel (below the toolbar?) that shows >> Server -> Database in QT mode, and Server -> Database -> Schema -> >> Table/View in EG mode. >> > > OK. > >> >> >>> >>> >>>> - Ashesh and I discussed changing the History tab to be a grid, >>>> showing: Date/Time, Query (first line only), Rows affected, Runtime and >>>> Status, in a row per query executed. Ashesh suggested using a sub-form that >>>> can be expanded for each row, which could show the full query and error >>>> details (SQL State etc). New rows should be added to the top of the list. >>>> >>>> - We should add an "Edit" button, which opens a drop-down menu. This >>>> would eventually include options as found on the Edit menu in the pgAdmin3 >>>> query tool, such as the "Clear SQL" option. >>>> >>>> - Errors should be highlighted in the SQL box - a marker in the margin >>>> to note the line, and spellcheck-style underlining for the error word. >>>> >>> >>> OK. >>> >>>> >>>> - Query results should have spaces converted to " ", so that >>>> proper indenting is maintained (for example, on EXPLAIN queries). >>>> >>> >>> Instead of converting spaces to " " we can have css style >>> "white-space: pre-wrap;". I have tested it and works fine. >>> >>>> >>>> - The "Add Row" button only works if you're on the last page of the >>>> resultset. >>>> >>> >>> OK. >>> >>>> >>>> - Can the "Copy Row" button also populate the clipboard with CSV data >>>> for the row? >>>> >>> >>> This required some research, not sure at the moment. >>> >>>> >>>> - In Edit mode, we need to be able to represent/set values to NULL. >>>> >>> >>> This will be taken care as part of multi-type rendering task. >>> >> >> OK. >> >> >>> >>>> - If I shutdown my pgAdmin server, then execute a query, I get no >>>> error, 0 rows displayed, and a message in the messages panel saying: >>>> >>>> Total query runtime: 46 msec >>>> 3 rows retrieved. >>>> >>>> If I restart the server, the query will execute correctly, however I >>>> should see appropriate messages when it's not running. >>>> >>>> - The layout of the result tabs should be maintained if new Query Tool >>>> or Edit Grid tabs are opened. >>>> >>> >>> OK. >>> >> >> Cool - thanks! >> >> -- >> Dave Page >> Blog: http://pgsnake.blogspot.com >> Twitter: @pgsnake >> >> EnterpriseDB UK: http://www.enterprisedb.com >> The Enterprise PostgreSQL Company >> > > > > -- > *Akshay Joshi* > *Principal Software Engineer * > > > > *Phone: +91 20-3058-9517 <%2B91%2020-3058-9517>Mobile: +91 976-788-8246* > -- Dave Page Blog: http://pgsnake.blogspot.com Twitter: @pgsnake EnterpriseDB UK: http://www.enterprisedb.com The Enterprise PostgreSQL Company --001a114ab7b096ef9c052fe4c777 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Thu, Apr 7, 2016 at 2:03 PM, Akshay Joshi <akshay.joshi= @enterprisedb.com> wrote:
<= div dir=3D"ltr">Hi

On Thu, Apr 7, 2016 at 6:01 PM, Dave Page <d= page@pgadmin.org> wrote:
Hi

On Thu, Apr 7, 2016 at 10:07 AM, Akshay Joshi= <akshay.joshi@enterprisedb.com> wrote:

- The View= Data menu option should be on the Object menu =C2=A0
=C2=A0=C2=A0
=C2=A0 =C2=A0OK.
=C2=A0
, which should mirror the Contex= t menu, except options should be disabled when not applicable instead of hi= dden.
=C2=A0
=C2= =A0 =C2=A0 =C2=A0Context menu code is generic code, to do this we need to c= hange that code and it impacts other menu items like (Connect/Disconnect se= rver, Connect/Disconnect Database etc ...) =C2=A0

I think you misunderstand. The Contex= t menu is fine - but options that are on it, should also be on the main &qu= ot;Object" menu. The difference is that where options are hidden on th= e context menu, they should be disabled on the object menu.

=C2=A0 =C2=A0 The same beha= viour I have already added in "Tools" menu, so you want me to shi= ft that menu from "Tools" to "Object"??=C2=A0

Just for the View/Edit optio= ns. The Query Tool is never shown on the Context menu, so it should be on T= ools.
=C2=A0
=C2=A0
<= span>

- The Query Tool menu icon should be = a glyphicon, to match the others.
= =C2=A0
=C2=A0 =C2=A0There is no glyphicon ava= ilable which match the Query Tool icon. I have found one like below which i= s "database-search" or can you please suggest some other icon.=C2= =A0
=C2=A0 =C2=A0 =C2=A0 =C2=A03D"Inline=C2=A0

= That one looks perfect.
=C2=A0

- Please merge the functionality= of the Refresh and Execute buttons into one button. We shouldn't have = two buttons that do essentially the same thing.
=C2=A0 =C2=A0
=C2=A0 =C2=A0 I have modified = the button toolbar, we will show buttons on the toolbar specific to the mod= ule (QueryTool/EditGrid). Please refer the attach= ed screenshots (QueryTool and EditGrid).

No - please leave al= l buttons visible in either mode, but disable them as appropriate. Then, me= rge the execute/refresh buttons into one.

=C2=A0 =C2=A0 In that case we will have to us= e either refresh icon or execute icon (play button) or any other, as a user= 's perspective it's not good to have play button works as "Ref= resh" in EG mode or refresh button works as "Execute= " in QT mode.=C2=A0

MySQL Workbench uses something like glyphicon-flash.
=C2=A0=

The reason for doing it this way is that eventually w= e will add query parsing support to the client so that we can start enablin= g some of the Edit Grid features when running in Query Tool mode - e.g. if = a Query Tool authored query is determined to be updatable, we can enable bu= ttons like "Add Row", "Save" etc.

=C2=A0 =C2=A0 OK.=C2=A0
=C2=A0


- In= Edit Grid mode, the History panel should log all queries (SELECTs, UPDATEs= , DELETEs etc) as it would in the Query Tool.

- In= Edit Grid mode, the Messages panel should display any messages from the mo= st recent action =C2=A0as it would in the Query Tool.
=C2=A0
=C2=A0 =C2=A0OK.=C2=A0

Thanks.
<= div>=C2=A0

- Please add an SQL button. This should show/hide the SQL panel in = *both* Query Tool and Edit Grid modes. In Edit Grid mode, that textbox shou= ld be read-only, but should display the SQL used (including any LIMIT/FILTE= R clauses)

= =C2=A0 =C2=A0 I think we don't need an SQL button, because= I have added a Splitter to split SQL panel and Output Panel, = so user can any time resize the SQL/Output panel.= Please refer the attached screenshots (QueryTool and Ed= itGrid). =C2=A0 =C2=A0=C2=A0

Right, but I'd also like to be able to hide it = entirely (which would be the default in Edit Grid mode).
<= /div>

=C2=A0 =C2=A0 To achieve this = we need to hide the top half of the splitter, that I am not sure how we can= do that. We can't remove the splitter, because it provide's<= /span> ease to user to expand the SQL panel for reading the lo= ng SQL queries/functions. =C2=A0

You could put the small panel (discussed below) = that displays the name of the object in the splitter panel as well. Then, y= ou wouldn't have to hide the whole thing. It might look a little weird = unless you force the splitter to move when you hide the SQL box though.
=C2=A0
=C2=A0

- Please remove the border from the SQL box,= such that it fills all available space.
=C2=A0
=C2=A0 =C2=A0Done.=C2=A0Please refer the att= ached screenshots (QueryTool and EditGrid).
=

- The Filter box should be in a moda= l overlay over the top of the SQL box/Results tabs as required. Those eleme= nts should be grayed whilst it is open.
=C2=A0=C2=A0
=C2=A0 =C2=A0Done. Please refer the att= ached screenshot (Filter).=C2=A0
<= br>
Cool.
=C2=A0
<= div class=3D"gmail_quote">

- Please adjust the height of= the Delete icon in the Edit Grid, such that it doesn't force the row h= eight to be higher than it should be.
<= div>=C2=A0
=C2=A0 =C2=A0OK.=C2=A0
=

- If a field has been edited, but not saved, can we hig= hlight it somehow? Maybe make the text dark blue?
=C2=A0
=C2=A0 =C2=A0OK, not sure right now= but will try.=C2=A0

- I think = the names of the tabs are far too long. Can we change them to "Query 1= ", "Query 2" etc, then rename them to the filename if the us= er saves/loads a file?
=C2=A0
=C2=A0 =C2=A0I personally feel it's been difficult for use= r to identify the tab if we will give names like "Query 1" . What= we can do in case of edit grid we will only show the servername-objectname (remove database and schema) or only objec= tname, and in case of query tool we will show servername-databasename. What do you think?

I think they're all ambiguous enoug= h to not be useful for many users :-( - plus the tabs are so long, they loo= k awful.=C2=A0

We should perhaps add a small panel= (below the toolbar?) that shows Server -> Database in QT mode, and Serv= er -> Database -> Schema -> Table/View in EG mode.

=C2=A0 =C2=A0 OK.=C2=A0
=C2=A0
=
=
=C2=A0
<= div>- Ashesh and I discussed changing the History tab to be a grid, showing= : Date/Time, Query (first line only), Rows affected, Runtime and Status, in= a row per query executed. Ashesh suggested using a sub-form that can be ex= panded for each row, which could show the full query and error details (SQL= State etc). New rows should be added to the top of the list.
- We should add an "Edit" button, which opens a drop-= down menu. This would eventually include options as found on the Edit menu = in the pgAdmin3 query tool, such as the "Clear SQL" option.
=

- Errors should be highlighted in the SQL box - a marke= r in the margin to note the line, and spellcheck-style underlining for the = error word.
=C2=A0=C2=A0
=C2=A0 =C2=A0 OK.=C2=A0

- Query results should have spaces converted to "&nbsp;", so= that proper indenting is maintained (for example, on EXPLAIN queries).
=C2=A0=C2=A0
=C2=A0 = =C2=A0 Instead of converting spaces to "&nbsp;" = we can have css style "white-space: pre-wrap= ;". I have tested it and works fine.

=
- The "Add Row" button only works if you're on the= last page of the resultset.
=C2= =A0
=C2=A0 =C2=A0OK.=C2=A0
- Can the "Copy Row" button also populate the clipbo= ard with CSV data for the row?
=C2= =A0
=C2=A0 =C2=A0This required some research, not sure at = the moment. =C2=A0

- In Edit m= ode, we need to be able to represent/set values to NULL.
<= /div>
=C2=A0 =C2=A0
=C2=A0 =C2=A0This wil= l be taken care as part of multi-type rendering task.=C2=A0

OK.
=C2=A0<= /div>

- If= I shutdown my pgAdmin server, then execute a query, I get no error, 0 rows= displayed, and a message in the messages panel saying:

Total query runtime: 46 msec
3 rows retrieved.

If I restart the server, the query will execute cor= rectly, however I should see appropriate messages when it's not running= .

- The layout of the result tabs should be mainta= ined if new Query Tool or Edit Grid tabs are opened.

=C2=A0 =C2=A0OK.=C2=A0
=

Cool - thanks!=C2=A0

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

EnterpriseDB UK: http://www.enterprisedb.com
The Enterpr= ise PostgreSQL Company


=
--
Akshay Joshi
Princi= pal Software Engineer=C2=A0


Phone: +91 20-3058-9517
Mobile: +91 976-788= -8246



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

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Compan= y
--001a114ab7b096ef9c052fe4c777-- --001a114ab7b096ef9f052fe4c778 Content-Type: image/png; name="image.png" Content-Disposition: inline; filename="image.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_153efa7c0422527f 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 r+DRaQAAAABJRU5ErkJggg== --001a114ab7b096ef9f052fe4c778--