unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Format of lists and alists required for displaying lists of tabulated data
@ 2023-06-16 21:08 uzibalqa
  2023-06-17  7:36 ` Bruno Barbier
  0 siblings, 1 reply; 18+ messages in thread
From: uzibalqa @ 2023-06-16 21:08 UTC (permalink / raw)
  To: uzibalqa via Users list for the GNU Emacs text editor



The file tabulated-list.el does not describe the format of lists and alists
required for displaying lists of tabulated data.

Could some information be added, please ?



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-16 21:08 Format of lists and alists required for displaying lists of tabulated data uzibalqa
@ 2023-06-17  7:36 ` Bruno Barbier
  2023-06-17 12:33   ` uzibalqa
  0 siblings, 1 reply; 18+ messages in thread
From: Bruno Barbier @ 2023-06-17  7:36 UTC (permalink / raw)
  To: uzibalqa, uzibalqa via Users list for the GNU Emacs text editor

uzibalqa <uzibalqa@proton.me> writes:

> The file tabulated-list.el does not describe the format of lists and alists
> required for displaying lists of tabulated data.
>
> Could some information be added, please ?

The documentation of 'tabulated-list-mode'
    (describe-function 'tabulated-list-mode)

points to the documentation of 'tabulated-list-format' and the
documentation of 'tabulated-list-entries'.

Is that what you're looking for ?


Bruno





^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-17  7:36 ` Bruno Barbier
@ 2023-06-17 12:33   ` uzibalqa
  2023-06-17 20:54     ` Tim Landscheidt
  2023-06-18 15:31     ` Jean Louis
  0 siblings, 2 replies; 18+ messages in thread
From: uzibalqa @ 2023-06-17 12:33 UTC (permalink / raw)
  To: Bruno Barbier; +Cc: uzibalqa via Users list for the GNU Emacs text editor


------- Original Message -------
On Saturday, June 17th, 2023 at 7:36 PM, Bruno Barbier <brubar.cs@gmail.com> wrote:


> uzibalqa uzibalqa@proton.me writes:
> 
> > The file tabulated-list.el does not describe the format of lists and alists
> > required for displaying lists of tabulated data.
> > 
> > Could some information be added, please ?
> 
> 
> The documentation of 'tabulated-list-mode'
> (describe-function 'tabulated-list-mode)
> 
> points to the documentation of 'tabulated-list-format' and the
> documentation of 'tabulated-list-entries'.
> 
> Is that what you're looking for ?
> 
> Bruno

Yes, the description of tabulated-list-entries states that the input
if a list, each element has the form (ID [DESC1 ... DESCN]).

Perhaps things can be made clearer and more readily available.  Because
it is important for people to know the exact data input format required.

It would also be handy to have some conversion functions that takes a normal
list or alist, and converts them to ones suitable for tabulated-list-entries.





^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-17 12:33   ` uzibalqa
@ 2023-06-17 20:54     ` Tim Landscheidt
  2023-06-18 10:36       ` uzibalqa
  2023-06-18 15:31     ` Jean Louis
  1 sibling, 1 reply; 18+ messages in thread
From: Tim Landscheidt @ 2023-06-17 20:54 UTC (permalink / raw)
  To: uzibalqa; +Cc: Bruno Barbier, help-gnu-emacs

uzibalqa <uzibalqa@proton.me> wrote:

>> > The file tabulated-list.el does not describe the format of lists and alists
>> > required for displaying lists of tabulated data.
>> >
>> > Could some information be added, please ?

>> The documentation of 'tabulated-list-mode'
>> (describe-function 'tabulated-list-mode)

>> points to the documentation of 'tabulated-list-format' and the
>> documentation of 'tabulated-list-entries'.

>> Is that what you're looking for ?

> Yes, the description of tabulated-list-entries states that the input
> if a list, each element has the form (ID [DESC1 ... DESCN]).

> […]

Not only that, but it also explains what ID is and what DESC
can be and what effects it has.  So what data have you set
tabulated-list-entries to and how does it fail to do what
you want?

Tim



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-17 20:54     ` Tim Landscheidt
@ 2023-06-18 10:36       ` uzibalqa
  2023-06-18 11:29         ` Tim Landscheidt
  0 siblings, 1 reply; 18+ messages in thread
From: uzibalqa @ 2023-06-18 10:36 UTC (permalink / raw)
  To: Tim Landscheidt; +Cc: Bruno Barbier, help-gnu-emacs




------- Original Message -------
On Sunday, June 18th, 2023 at 8:54 AM, Tim Landscheidt <tim@tim-landscheidt.de> wrote:


> uzibalqa uzibalqa@proton.me wrote:
> 
> > > > The file tabulated-list.el does not describe the format of lists and alists
> > > > required for displaying lists of tabulated data.
> > > > 
> > > > Could some information be added, please ?
> 
> > > The documentation of 'tabulated-list-mode'
> > > (describe-function 'tabulated-list-mode)
> 
> > > points to the documentation of 'tabulated-list-format' and the
> > > documentation of 'tabulated-list-entries'.
> 
> > > Is that what you're looking for ?
> 
> > Yes, the description of tabulated-list-entries states that the input
> > if a list, each element has the form (ID [DESC1 ... DESCN]).
> 
> > […]
> 
> 
> Not only that, but it also explains what ID is and what DESC
> can be and what effects it has. So what data have you set
> tabulated-list-entries to and how does it fail to do what
> you want?
> 
> Tim

I am trying to print a header and also some text to the buffer, and
not being successful.



(defun tlprint-alist (alist &optional outbufr keytl valtl)
  "Print an associated list via `tabulated-list-print'."

  (let*
      ( (bufr (or outbufr (get-buffer-create "*Alist2*")))
        (keytl (or keytl "Key Title"))
        (valtl (or valtl "Value Title")) )

    (with-current-buffer bufr
      (tabulated-list-mode)
      (setq buffer-read-only nil)
      (setq tabulated-list-format
             (vector (list keytl 20 t) (list valtl 20 t)))
      (setq tabulated-list-sort-key (cons keytl nil))
      (setq tabulated-list-entries
            (mapcar (lambda (dyad)
                      (list (car dyad) (cdr dyad)))
                    alist))
      (tabulated-list-init-header)
      (insert keytl valtl "\n")
      (insert "TEST \n")
      (princ "Text to be written" (current-buffer))
      (tabulated-list-print) )))

(setq foo '((a . ["aa1" "aa2"]) (b . ["bb1" "bb2"]) (c . ["cc1" "cc2"])))
(tlprint-alist foo)




^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 10:36       ` uzibalqa
@ 2023-06-18 11:29         ` Tim Landscheidt
  2023-06-18 13:20           ` uzibalqa
  2023-06-18 13:37           ` uzibalqa
  0 siblings, 2 replies; 18+ messages in thread
From: Tim Landscheidt @ 2023-06-18 11:29 UTC (permalink / raw)
  To: uzibalqa; +Cc: Bruno Barbier, help-gnu-emacs

uzibalqa <uzibalqa@proton.me> wrote:

>> > > > The file tabulated-list.el does not describe the format of lists and alists
>> > > > required for displaying lists of tabulated data.
>> > > >
>> > > > Could some information be added, please ?

>> > > The documentation of 'tabulated-list-mode'
>> > > (describe-function 'tabulated-list-mode)

>> > > points to the documentation of 'tabulated-list-format' and the
>> > > documentation of 'tabulated-list-entries'.

>> > > Is that what you're looking for ?

>> > Yes, the description of tabulated-list-entries states that the input
>> > if a list, each element has the form (ID [DESC1 ... DESCN]).

>> > […]

>> Not only that, but it also explains what ID is and what DESC
>> can be and what effects it has. So what data have you set
>> tabulated-list-entries to and how does it fail to do what
>> you want?

> I am trying to print a header and also some text to the buffer, and
> not being successful.

> […]

That is not the purpose of tabulated-list-mode and will
likely not work.  tabulated-list-mode is for buffers that
display an interactive table (and nothing else), like
list-packages, etc.

http://rgrinberg.com/posts/emacs-table-display/ has some
code to show how it can be used without defining a derived
mode (and how to populate tabulated-list-entries).

Tim



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 11:29         ` Tim Landscheidt
@ 2023-06-18 13:20           ` uzibalqa
  2023-06-18 13:37           ` uzibalqa
  1 sibling, 0 replies; 18+ messages in thread
From: uzibalqa @ 2023-06-18 13:20 UTC (permalink / raw)
  To: Tim Landscheidt; +Cc: Bruno Barbier, help-gnu-emacs


------- Original Message -------
On Sunday, June 18th, 2023 at 11:29 PM, Tim Landscheidt <tim@tim-landscheidt.de> wrote:


> uzibalqa uzibalqa@proton.me wrote:
> 
> > > > > > The file tabulated-list.el does not describe the format of lists and alists
> > > > > > required for displaying lists of tabulated data.
> > > > > > 
> > > > > > Could some information be added, please ?
> 
> > > > > The documentation of 'tabulated-list-mode'
> > > > > (describe-function 'tabulated-list-mode)
> 
> > > > > points to the documentation of 'tabulated-list-format' and the
> > > > > documentation of 'tabulated-list-entries'.
> 
> > > > > Is that what you're looking for ?
> 
> > > > Yes, the description of tabulated-list-entries states that the input
> > > > if a list, each element has the form (ID [DESC1 ... DESCN]).
> 
> > > > […]
> 
> > > Not only that, but it also explains what ID is and what DESC
> > > can be and what effects it has. So what data have you set
> > > tabulated-list-entries to and how does it fail to do what
> > > you want?
> 
> > I am trying to print a header and also some text to the buffer, and
> > not being successful.
> 
> > […]
> 
> 
> That is not the purpose of tabulated-list-mode and will
> likely not work. tabulated-list-mode is for buffers that
> display an interactive table (and nothing else), like
> list-packages, etc.
> 
> http://rgrinberg.com/posts/emacs-table-display/ has some
> code to show how it can be used without defining a derived
> mode (and how to populate tabulated-list-entries).
> 
> Tim

So only a table ? Just a single table ?  It should also be able to print
a header I think.  Are there any other routines to print a table in a buffer.

I find the table implementation is quite limited.




^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 11:29         ` Tim Landscheidt
  2023-06-18 13:20           ` uzibalqa
@ 2023-06-18 13:37           ` uzibalqa
  2023-06-18 13:51             ` uzibalqa
  1 sibling, 1 reply; 18+ messages in thread
From: uzibalqa @ 2023-06-18 13:37 UTC (permalink / raw)
  To: Tim Landscheidt; +Cc: Bruno Barbier, help-gnu-emacs

------- Original Message -------
On Sunday, June 18th, 2023 at 11:29 PM, Tim Landscheidt <tim@tim-landscheidt.de> wrote:


> uzibalqa uzibalqa@proton.me wrote:
> 
> > > > > > The file tabulated-list.el does not describe the format of lists and alists
> > > > > > required for displaying lists of tabulated data.
> > > > > > 
> > > > > > Could some information be added, please ?
> 
> > > > > The documentation of 'tabulated-list-mode'
> > > > > (describe-function 'tabulated-list-mode)
> 
> > > > > points to the documentation of 'tabulated-list-format' and the
> > > > > documentation of 'tabulated-list-entries'.
> 
> > > > > Is that what you're looking for ?
> 
> > > > Yes, the description of tabulated-list-entries states that the input
> > > > if a list, each element has the form (ID [DESC1 ... DESCN]).
> 
> > > > […]
> 
> > > Not only that, but it also explains what ID is and what DESC
> > > can be and what effects it has. So what data have you set
> > > tabulated-list-entries to and how does it fail to do what
> > > you want?
> 
> > I am trying to print a header and also some text to the buffer, and
> > not being successful.
> 
> > […]
> 
> 
> That is not the purpose of tabulated-list-mode and will
> likely not work. tabulated-list-mode is for buffers that
> display an interactive table (and nothing else), like
> list-packages, etc.
> 
> http://rgrinberg.com/posts/emacs-table-display/ has some
> code to show how it can be used without defining a derived
> mode (and how to populate tabulated-list-entries).
> 
> Tim

There are some problems with that code such as the use of -reduce-from



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 13:37           ` uzibalqa
@ 2023-06-18 13:51             ` uzibalqa
  0 siblings, 0 replies; 18+ messages in thread
From: uzibalqa @ 2023-06-18 13:51 UTC (permalink / raw)
  To: uzibalqa; +Cc: Tim Landscheidt, Bruno Barbier, help-gnu-emacs






Sent with Proton Mail secure email.

------- Original Message -------
On Monday, June 19th, 2023 at 1:37 AM, uzibalqa <uzibalqa@proton.me> wrote:


> ------- Original Message -------
> On Sunday, June 18th, 2023 at 11:29 PM, Tim Landscheidt tim@tim-landscheidt.de wrote:
> 
> 
> 
> > uzibalqa uzibalqa@proton.me wrote:
> > 
> > > > > > > The file tabulated-list.el does not describe the format of lists and alists
> > > > > > > required for displaying lists of tabulated data.
> > > > > > > 
> > > > > > > Could some information be added, please ?
> > 
> > > > > > The documentation of 'tabulated-list-mode'
> > > > > > (describe-function 'tabulated-list-mode)
> > 
> > > > > > points to the documentation of 'tabulated-list-format' and the
> > > > > > documentation of 'tabulated-list-entries'.
> > 
> > > > > > Is that what you're looking for ?
> > 
> > > > > Yes, the description of tabulated-list-entries states that the input
> > > > > if a list, each element has the form (ID [DESC1 ... DESCN]).
> > 
> > > > > […]
> > 
> > > > Not only that, but it also explains what ID is and what DESC
> > > > can be and what effects it has. So what data have you set
> > > > tabulated-list-entries to and how does it fail to do what
> > > > you want?
> > 
> > > I am trying to print a header and also some text to the buffer, and
> > > not being successful.
> > 
> > > […]
> > 
> > That is not the purpose of tabulated-list-mode and will
> > likely not work. tabulated-list-mode is for buffers that
> > display an interactive table (and nothing else), like
> > list-packages, etc.
> > 
> > http://rgrinberg.com/posts/emacs-table-display/ has some
> > code to show how it can be used without defining a derived
> > mode (and how to populate tabulated-list-entries).
> > 
> > Tim
> 
> 
> There are some problems with that code such as the use of -reduce-from

And forces dash and popwin which I don't like.  Could you help me write something similar
but with only standard calls without dependencies?



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-17 12:33   ` uzibalqa
  2023-06-17 20:54     ` Tim Landscheidt
@ 2023-06-18 15:31     ` Jean Louis
  2023-06-18 19:11       ` uzibalqa
  2023-06-18 19:16       ` Christopher Dimech
  1 sibling, 2 replies; 18+ messages in thread
From: Jean Louis @ 2023-06-18 15:31 UTC (permalink / raw)
  To: uzibalqa
  Cc: Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

* uzibalqa <uzibalqa@proton.me> [2023-06-17 16:28]:
> It would also be handy to have some conversion functions that takes a normal
> list or alist, and converts them to ones suitable for tabulated-list-entries.

Those functions would be too much specific, and you can do those functions.

I have functions like these which are using SQL which get expanded into tabulated-list-mode:

(rcd-db-sql-report title sql cf-people-tabulated-format-with-people-list "people" nil refresh-function '(">>>UNKNOWN<<<") return-function)

Or like this: (cf-people-by-id-list (list introducer)) which would show tabulated-list-format by list of people IDs

My SQL has always ID followed by values, so here is the key function that converts it:

(defun rcd-db-sql-report (title sql format table sort-key refresh &optional highlight-list return-function)
  "Prepare SQL for tabulated list report."
  (let* ((entries-1 (rcd-sql sql cf-db))
	 (entries-2
	  (mapcar #'(lambda (i)
		      (list
		       (elt i 0)
		       (vconcat
			(append (list
				 (cond ((numberp (elt i 0)) (number-to-string (elt i 0)))
				       (t (elt i 0))))
				(cdr (append i nil))))))
		  entries-1)))
    (cond (entries-1 (rcd-db-report title entries-2 format "pg" 'cf-db table sort-key refresh highlight-list nil nil return-function))
	  (t (rcd-warning-message (format "No entries for report `%s'" title))))))

(defun rcd-db-report (title entries format database-type db-handle table sort-key 
			    &optional refresh highlight-list place id return-function)
  "RCD database report.

TITLE is buffer name."
  (setq rcd-db-current-database-type database-type)
  (let* ((buffer (generate-new-buffer-name (rcd-notes-name title))))
    (let* ((buffer (get-buffer-create buffer))
	   (mode-map (rcd-db-table-mode-map table)))
      (cond ((string-equal table "edit") (switch-to-buffer buffer))
	    (rcd-dont-switch-windows (switch-to-buffer buffer))
	    (t (switch-to-buffer-other-window buffer)))
      (setq tabulated-list-format format)
      (setq tabulated-list-entries entries)
      (setq rcd-db-edited-table table)
      (setq rcd-db-current-database-type database-type)
      (setq rcd-tabulated-refresh-function refresh)
      (setq rcd-current-return-function return-function)
      (rcd-db-list-mode)
      (use-local-map mode-map)
      (setq rcd-tabulated-marked-items nil)
      (setq rcd-db-current-database-handle db-handle)
      (setq rcd-db-current-table (or (alist-get "table" place nil nil 'equal) table))
      (setq rcd-db-current-table-id id)
      (setq tabulated-list-padding 1)
      (tabulated-list-init-header))
    (setq tabulated-list-sort-key sort-key)
    (tabulated-list-print t)
    (when highlight-list
      (rcd-highlight-list highlight-list))))

The above workflow shall serve only as example to your own functions.

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 15:31     ` Jean Louis
@ 2023-06-18 19:11       ` uzibalqa
  2023-06-19 18:46         ` Jean Louis
  2023-06-18 19:16       ` Christopher Dimech
  1 sibling, 1 reply; 18+ messages in thread
From: uzibalqa @ 2023-06-18 19:11 UTC (permalink / raw)
  To: Jean Louis
  Cc: Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

------- Original Message -------
On Monday, June 19th, 2023 at 3:31 AM, Jean Louis <bugs@gnu.support> wrote:


> * uzibalqa uzibalqa@proton.me [2023-06-17 16:28]:
> 
> > It would also be handy to have some conversion functions that takes a normal
> > list or alist, and converts them to ones suitable for tabulated-list-entries.
> 
> 
> Those functions would be too much specific, and you can do those functions.
> 
> I have functions like these which are using SQL which get expanded into tabulated-list-mode:
> 
> (rcd-db-sql-report title sql cf-people-tabulated-format-with-people-list "people" nil refresh-function '(">>>UNKNOWN<<<") return-function)

Are your tools designed for possibility of having multiple columns ?
 
 
> Or like this: (cf-people-by-id-list (list introducer)) which would show tabulated-list-format by list of people IDs
> 
> My SQL has always ID followed by values, so here is the key function that converts it:
> 
> (defun rcd-db-sql-report (title sql format table sort-key refresh &optional highlight-list return-function)
> "Prepare SQL for tabulated list report."
> (let* ((entries-1 (rcd-sql sql cf-db))
> (entries-2
> (mapcar #'(lambda (i)
> (list
> (elt i 0)
> (vconcat
> (append (list
> (cond ((numberp (elt i 0)) (number-to-string (elt i 0)))
> (t (elt i 0))))
> (cdr (append i nil))))))
> entries-1)))
> (cond (entries-1 (rcd-db-report title entries-2 format "pg" 'cf-db table sort-key refresh highlight-list nil nil return-function))
> (t (rcd-warning-message (format "No entries for report `%s'" title))))))
> 
> (defun rcd-db-report (title entries format database-type db-handle table sort-key
> &optional refresh highlight-list place id return-function)
> "RCD database report.
> 
> TITLE is buffer name."
> (setq rcd-db-current-database-type database-type)
> (let* ((buffer (generate-new-buffer-name (rcd-notes-name title))))
> (let* ((buffer (get-buffer-create buffer))
> (mode-map (rcd-db-table-mode-map table)))
> (cond ((string-equal table "edit") (switch-to-buffer buffer))
> (rcd-dont-switch-windows (switch-to-buffer buffer))
> (t (switch-to-buffer-other-window buffer)))
> (setq tabulated-list-format format)
> (setq tabulated-list-entries entries)
> (setq rcd-db-edited-table table)
> (setq rcd-db-current-database-type database-type)
> (setq rcd-tabulated-refresh-function refresh)
> (setq rcd-current-return-function return-function)
> (rcd-db-list-mode)
> (use-local-map mode-map)
> (setq rcd-tabulated-marked-items nil)
> (setq rcd-db-current-database-handle db-handle)
> (setq rcd-db-current-table (or (alist-get "table" place nil nil 'equal) table))
> (setq rcd-db-current-table-id id)
> (setq tabulated-list-padding 1)
> (tabulated-list-init-header))
> (setq tabulated-list-sort-key sort-key)
> (tabulated-list-print t)
> (when highlight-list
> (rcd-highlight-list highlight-list))))
> 
> The above workflow shall serve only as example to your own functions.
> 
> --
> Jean
> 
> Take action in Free Software Foundation campaigns:
> https://www.fsf.org/campaigns
> 
> In support of Richard M. Stallman
> https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 15:31     ` Jean Louis
  2023-06-18 19:11       ` uzibalqa
@ 2023-06-18 19:16       ` Christopher Dimech
  2023-06-19 18:49         ` Jean Louis
  1 sibling, 1 reply; 18+ messages in thread
From: Christopher Dimech @ 2023-06-18 19:16 UTC (permalink / raw)
  To: Jean Louis
  Cc: uzibalqa, Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor


> Sent: Monday, June 19, 2023 at 3:31 AM
> From: "Jean Louis" <bugs@gnu.support>
> To: "uzibalqa" <uzibalqa@proton.me>
> Cc: "Bruno Barbier" <brubar.cs@gmail.com>, "uzibalqa via Users list for the GNU Emacs text editor" <help-gnu-emacs@gnu.org>
> Subject: Re: Format of lists and alists required for displaying lists of tabulated data
>
> * uzibalqa <uzibalqa@proton.me> [2023-06-17 16:28]:
> > It would also be handy to have some conversion functions that takes a normal
> > list or alist, and converts them to ones suitable for tabulated-list-entries.
>
> Those functions would be too much specific, and you can do those functions.
>
> I have functions like these which are using SQL which get expanded into tabulated-list-mode:
>
> (rcd-db-sql-report title sql cf-people-tabulated-format-with-people-list "people" nil refresh-function '(">>>UNKNOWN<<<") return-function)
>
> Or like this: (cf-people-by-id-list (list introducer)) which would show tabulated-list-format by list of people IDs
>
> My SQL has always ID followed by values, so here is the key function that converts it:


The functions could be difficult to use because of the many calls to your "rcd-" functions.
Perhaps we can come up with something more adept to users to try.  Using same idea of
an ID followed by values.


> (defun rcd-db-sql-report (title sql format table sort-key refresh &optional highlight-list return-function)
>   "Prepare SQL for tabulated list report."
>   (let* ((entries-1 (rcd-sql sql cf-db))
> 	 (entries-2
> 	  (mapcar #'(lambda (i)
> 		      (list
> 		       (elt i 0)
> 		       (vconcat
> 			(append (list
> 				 (cond ((numberp (elt i 0)) (number-to-string (elt i 0)))
> 				       (t (elt i 0))))
> 				(cdr (append i nil))))))
> 		  entries-1)))
>     (cond (entries-1 (rcd-db-report title entries-2 format "pg" 'cf-db table sort-key refresh highlight-list nil nil return-function))
> 	  (t (rcd-warning-message (format "No entries for report `%s'" title))))))
>
> (defun rcd-db-report (title entries format database-type db-handle table sort-key
> 			    &optional refresh highlight-list place id return-function)
>   "RCD database report.
>
> TITLE is buffer name."
>   (setq rcd-db-current-database-type database-type)
>   (let* ((buffer (generate-new-buffer-name (rcd-notes-name title))))
>     (let* ((buffer (get-buffer-create buffer))
> 	   (mode-map (rcd-db-table-mode-map table)))
>       (cond ((string-equal table "edit") (switch-to-buffer buffer))
> 	    (rcd-dont-switch-windows (switch-to-buffer buffer))
> 	    (t (switch-to-buffer-other-window buffer)))
>       (setq tabulated-list-format format)
>       (setq tabulated-list-entries entries)
>       (setq rcd-db-edited-table table)
>       (setq rcd-db-current-database-type database-type)
>       (setq rcd-tabulated-refresh-function refresh)
>       (setq rcd-current-return-function return-function)
>       (rcd-db-list-mode)
>       (use-local-map mode-map)
>       (setq rcd-tabulated-marked-items nil)
>       (setq rcd-db-current-database-handle db-handle)
>       (setq rcd-db-current-table (or (alist-get "table" place nil nil 'equal) table))
>       (setq rcd-db-current-table-id id)
>       (setq tabulated-list-padding 1)
>       (tabulated-list-init-header))
>     (setq tabulated-list-sort-key sort-key)
>     (tabulated-list-print t)
>     (when highlight-list
>       (rcd-highlight-list highlight-list))))
>
> The above workflow shall serve only as example to your own functions.
>
> --
> Jean
>
> Take action in Free Software Foundation campaigns:
> https://www.fsf.org/campaigns
>
> In support of Richard M. Stallman
> https://stallmansupport.org/
>
>



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 19:11       ` uzibalqa
@ 2023-06-19 18:46         ` Jean Louis
  0 siblings, 0 replies; 18+ messages in thread
From: Jean Louis @ 2023-06-19 18:46 UTC (permalink / raw)
  To: uzibalqa
  Cc: Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

* uzibalqa <uzibalqa@proton.me> [2023-06-18 22:12]:
> > (rcd-db-sql-report title sql cf-people-tabulated-format-with-people-list "people" nil refresh-function '(">>>UNKNOWN<<<") return-function)
> 
> Are your tools designed for possibility of having multiple columns ?

Yes, I have multiple columns. See the screenshot here:
https://gnu.support/images/2023/06/2023-06-19/Screenshot-2023-06-19-21-43-51-669841653.png


-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-18 19:16       ` Christopher Dimech
@ 2023-06-19 18:49         ` Jean Louis
  2023-06-19 18:59           ` uzibalqa
  0 siblings, 1 reply; 18+ messages in thread
From: Jean Louis @ 2023-06-19 18:49 UTC (permalink / raw)
  To: Christopher Dimech
  Cc: uzibalqa, Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

* Christopher Dimech <dimech@gmx.com> [2023-06-18 22:16]:
> The functions could be difficult to use because of the many calls to your "rcd-" functions.
> Perhaps we can come up with something more adept to users to try.  Using same idea of
> an ID followed by values.

Yes, good idea. But I did not find use of it for me. All my PostgreSQL database tables follow certain pattern as described by:

GeDaFe - PostgreSQL Generic Database Interface:
http://gedafe.github.io/doc/gedafe-sql.en.html 

and should be compatible with the web interface as well in that
sense. I did not test it for years, since I switched to Emacs
interface.

They follow this pattern "mytable_" plus "_id", so there is always
"ID" which serves handy for tabulated-list-mode

-- ------------------------------------------
-- ------------ Table mytable
-- ------------------------------------------
DROP SEQUENCE mytable_id_seq;

CREATE TABLE mytable (
mytable_id SERIAL NOT NULL PRIMARY KEY,
mytable_uuid UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE,
mytable_datecreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
mytable_datemodified TIMESTAMP,
mytable_usercreated TEXT NOT NULL DEFAULT current_user,
mytable_usermodified TEXT NOT NULL DEFAULT current_user,
mytable_name TEXT,
mytable_title TEXT,
mytable_description TEXT,
mytable_ TEXT
);

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-19 18:49         ` Jean Louis
@ 2023-06-19 18:59           ` uzibalqa
  2023-06-21  4:48             ` Jean Louis
  0 siblings, 1 reply; 18+ messages in thread
From: uzibalqa @ 2023-06-19 18:59 UTC (permalink / raw)
  To: Jean Louis
  Cc: Christopher Dimech, Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

------- Original Message -------
On Tuesday, June 20th, 2023 at 6:49 AM, Jean Louis <bugs@gnu.support> wrote:


> * Christopher Dimech dimech@gmx.com [2023-06-18 22:16]:
> 
> > The functions could be difficult to use because of the many calls to your "rcd-" functions.
> > Perhaps we can come up with something more adept to users to try. Using same idea of
> > an ID followed by values.
> 
> 
> Yes, good idea. But I did not find use of it for me. All my PostgreSQL database tables follow certain pattern as described by:
> 
> GeDaFe - PostgreSQL Generic Database Interface:
> http://gedafe.github.io/doc/gedafe-sql.en.html
> 
> and should be compatible with the web interface as well in that
> sense. I did not test it for years, since I switched to Emacs
> interface.
> 
> They follow this pattern "mytable_" plus "id", so there is always
> "ID" which serves handy for tabulated-list-mode
> 
> -- ------------------------------------------
> -- ------------ Table mytable
> -- ------------------------------------------
> DROP SEQUENCE mytable_id_seq;
> 
> CREATE TABLE mytable (
> mytable_id SERIAL NOT NULL PRIMARY KEY,
> mytable_uuid UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE,
> mytable_datecreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
> mytable_datemodified TIMESTAMP,
> mytable_usercreated TEXT NOT NULL DEFAULT current_user,
> mytable_usermodified TEXT NOT NULL DEFAULT current_user,
> mytable_name TEXT,
> mytable_title TEXT,
> mytable_description TEXT,
> mytable TEXT
> );

How can I adapt the following to print a table with multiple values rather that one ?

(setq foo '((a . ["aa1" "aa2"]) (b . ["bb1" "bb2"]) (c . ["cc1" "cc2"])))
(tlprint-alist foo)

(defun tlprint-alist (alist &optional outbufr keytl valtl)
  "Print an associated list via `tabulated-list-print'."

  (let*
      ( (bufr (or outbufr (get-buffer-create "*Alist2*")))
        (keytl (or keytl "Key Title"))
        (valtl (or valtl "Value Title")) )

    (with-current-buffer bufr
      (tabulated-list-mode)
      (setq buffer-read-only nil)
      (setq tabulated-list-format
             (vector (list keytl 20 t) (list valtl 20 t)))
      (setq tabulated-list-sort-key (cons keytl nil))
      (setq tabulated-list-entries
            (mapcar (lambda (dyad)
                      (list (car dyad) (cdr dyad)))
                    alist))
      (tabulated-list-init-header)
      (tabulated-list-print) )))




^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-19 18:59           ` uzibalqa
@ 2023-06-21  4:48             ` Jean Louis
  2023-06-21 10:45               ` uzibalqa
  0 siblings, 1 reply; 18+ messages in thread
From: Jean Louis @ 2023-06-21  4:48 UTC (permalink / raw)
  To: uzibalqa
  Cc: Christopher Dimech, Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

* uzibalqa <uzibalqa@proton.me> [2023-06-19 22:00]:
> (setq foo '((a . ["aa1" "aa2"]) (b . ["bb1" "bb2"]) (c . ["cc1" "cc2"])))
> (tlprint-alist foo)
> 
> (defun tlprint-alist (alist &optional outbufr keytl valtl)
>   "Print an associated list via `tabulated-list-print'."
> 
>   (let*
>       ( (bufr (or outbufr (get-buffer-create "*Alist2*")))
>         (keytl (or keytl "Key Title"))
>         (valtl (or valtl "Value Title")) )
> 
>     (with-current-buffer bufr
>       (tabulated-list-mode)
>       (setq buffer-read-only nil)
>       (setq tabulated-list-format
>              (vector (list keytl 20 t) (list valtl 20 t)))
>       (setq tabulated-list-sort-key (cons keytl nil))
>       (setq tabulated-list-entries
>             (mapcar (lambda (dyad)
>                       (list (car dyad) (cdr dyad)))
>                     alist))
>       (tabulated-list-init-header)
>       (tabulated-list-print) )))

It works!

Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-21  4:48             ` Jean Louis
@ 2023-06-21 10:45               ` uzibalqa
  2023-06-24 19:19                 ` Jean Louis
  0 siblings, 1 reply; 18+ messages in thread
From: uzibalqa @ 2023-06-21 10:45 UTC (permalink / raw)
  To: Jean Louis
  Cc: Christopher Dimech, Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor


------- Original Message -------
On Wednesday, June 21st, 2023 at 4:48 PM, Jean Louis <bugs@gnu.support> wrote:


> * uzibalqa uzibalqa@proton.me [2023-06-19 22:00]:
> 
> > (setq foo '((a . ["aa1" "aa2"]) (b . ["bb1" "bb2"]) (c . ["cc1" "cc2"])))
> > (tlprint-alist foo)
> > 
> > (defun tlprint-alist (alist &optional outbufr keytl valtl)
> > "Print an associated list via `tabulated-list-print'."
> > 
> > (let*
> > ( (bufr (or outbufr (get-buffer-create "Alist2")))
> > (keytl (or keytl "Key Title"))
> > (valtl (or valtl "Value Title")) )
> > 
> > (with-current-buffer bufr
> > (tabulated-list-mode)
> > (setq buffer-read-only nil)
> > (setq tabulated-list-format
> > (vector (list keytl 20 t) (list valtl 20 t)))
> > (setq tabulated-list-sort-key (cons keytl nil))
> > (setq tabulated-list-entries
> > (mapcar (lambda (dyad)
> > (list (car dyad) (cdr dyad)))
> > alist))
> > (tabulated-list-init-header)
> > (tabulated-list-print) )))
> 
> 
> It works! - Jean

It works indeed.  But instead of just a dyad (a key and value), I want to handle
an arbitrary number of values.



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Format of lists and alists required for displaying lists of tabulated data
  2023-06-21 10:45               ` uzibalqa
@ 2023-06-24 19:19                 ` Jean Louis
  0 siblings, 0 replies; 18+ messages in thread
From: Jean Louis @ 2023-06-24 19:19 UTC (permalink / raw)
  To: uzibalqa
  Cc: Christopher Dimech, Bruno Barbier,
	uzibalqa via Users list for the GNU Emacs text editor

* uzibalqa <uzibalqa@proton.me> [2023-06-21 13:46]:

> It works indeed.  But instead of just a dyad (a key and value), I
> want to handle an arbitrary number of values.

I am always inside tabulated-list-mode as I use heavily my software: RCD Notes & Hyperscope for GNU Emacs, which may not be easy to install.

So I have made functions making my life easy. Let me point out what I mean.

Let us say I wish to find who introduced the person in the list:

(defun cf-people-jump-to-introducer (&optional id)
  "Jump to introducer of person with ID"
  (interactive)
  (when-tabulated-id "people"
      (let ((introducer (rcd-db-get-entry "people" "people_introducedby" id cf-db)))
	(cond (introducer (cf-people-by-id-list (list introducer)))
	      (t (rcd-warning-message "Cannot find introducer for person with ID %s" id))))))

I am pointing now to the function `cf-people-by-id-list'. The rest is only finding the ID of introducer, and then that function is opening that contact of introducer.

Let us say I need people by their relation type:

(defun cf-people-by-relation-type (&optional id)
  "List of people by relation type ID."
  (interactive)
  (when-tabulated-id "relationtypes"
      (let* ((id-list (rcd-sql-list "SELECT peoplerelations_people1 
                                       FROM peoplerelations
                                      WHERE peoplerelations_relationtypes = $1" 
				    cf-db id))
	     (relation-name (rcd-db-get-entry "relationtypes" "relationtypes_name" id cf-db))
	     (title (format "People with relation `%s'" relation-name)))
	(cf-people-by-id-list id-list title))))

Then that function `cf-by-people-id-list` does something more complex:

(defun cf-people-by-id-list (list &optional title refresh-function return-function)
  (rcd-db-log-function 'cf-people-by-id-list)
  (let* ((limit (or (cf-user-number-of-latest-entries) cf-people-list-limit))
	 (refresh-function (or refresh-function (lambda () (cf-people-by-id-list list))))
	 (list (cond ((> (length list) limit) (seq-subseq list 0 limit))
		     (t list)))
	 (sql-id-list (rcd-sql-id-list list)))
    (cond (list (let ((sql (format "SELECT DISTINCT ON (people_id) 
                                           people_id, get_full_contacts_name(people_id), 
                                           coalesce((SELECT get_contacts_name(peoplerelations_people2) 
                                                       FROM peoplerelations 
                                                      WHERE peoplerelations_people1 = people_id 
                                                   ORDER BY peoplerelations_default, peoplerelations_id LIMIT 1),
                                                     '>>>UNKNOWN<<<') 
                                       FROM people 
                                      WHERE people_id IN (%s) 
                                   ORDER BY people_id DESC" sql-id-list))
		      (title (or title "People"))
		      (gc-cons-threshold 500000000))
		  (rcd-message "Fetching list of people")
		  (prog2 (rcd-db-sql-report title sql cf-people-tabulated-format-with-people-list "people" nil refresh-function '(">>>UNKNOWN<<<") return-function)
		      (rcd-message "Total of %s %s" 
				   (rcd-propertize-bold (number-to-string (length list)))
				   (rcd-propertize-bold "people")))))
	(t (rcd-warning-message (cond (title (format "NO REPORT FOR: %s" title))
				      (t "NO REPORT FOR PEOPLE LIST")))))))

So by using that function I am making 2 SQL calls, it could be faster if I am not using that function, right now there are no noticable differences.

However, it is not really arbitrary data, a there is format `cf-people-tabulated-format-with-people-list' which is always used for table `people':

cf-people-tabulated-format-with-people-list ➜ [("ID" 8 rcd-tabulated-number-as-string-predicate) ("Name" 40 t) ("List of people" 40 t)]

To make it more arbitrary one would need to make dynamic format for
tabulated-list-mode, it means your program should figure out how many
columns are there and what are columns names, and maybe even their
width. I think I do not have that possibility currently.

What I have are database table combined views or "combos", so for each table I am sometimes automatically generating the combo view, which has it's ID and NAME, and then I can edit the entry with arbitrary number of lines. Not arbitrary number of columns, even though that is possible too.

For example, I have the entry like:

 33446      countries                    Country                                  public  table   maddox     32 kB

then I press "l" for the list, and I get:

 1          AFGHANISTAN
 2          ÅLAND ISLANDS
 3          ALBANIA
 4          ALGERIA
 5          AMERICAN SAMOA
 6          ANDORRA
 7          ANGOLA
 8          ANGUILLA
 9          ANTARCTICA
 10         ANTIGUA AND BARBUDA
 11         ARGENTINA

then on some of those entries I press `e' to edit:

                             ID   5
                        Country   "AMERICAN SAMOA"
                           Code   "AS"
                 Dialing Prefix   1
                      Apostille   nil
                       Offshore   nil
                      Continent   nil
           Company registration   nil
                            CRS   t
                         Tag #1   nil
                         Tag #2   nil
                         Tag #3   nil
                      EU Member   nil
                     Flag image   nil
                       Schengen   nil
                     Flag emoji   nil
             Potential Schengen   nil

so that is arbitrary number of rows, not columns, as in some other list:

 1          Europe
 2          Africa
 3          North America
 4          South America
 5          Asia
 6          Australia
 7          Antarctica

I would get different rows:

                             ID   2
                           Name   "Africa"
                      Area km^2   30370000.0
                    Description   nil

However, in the same manner one can make a function to recognize number of columns.


-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2023-06-24 19:19 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-16 21:08 Format of lists and alists required for displaying lists of tabulated data uzibalqa
2023-06-17  7:36 ` Bruno Barbier
2023-06-17 12:33   ` uzibalqa
2023-06-17 20:54     ` Tim Landscheidt
2023-06-18 10:36       ` uzibalqa
2023-06-18 11:29         ` Tim Landscheidt
2023-06-18 13:20           ` uzibalqa
2023-06-18 13:37           ` uzibalqa
2023-06-18 13:51             ` uzibalqa
2023-06-18 15:31     ` Jean Louis
2023-06-18 19:11       ` uzibalqa
2023-06-19 18:46         ` Jean Louis
2023-06-18 19:16       ` Christopher Dimech
2023-06-19 18:49         ` Jean Louis
2023-06-19 18:59           ` uzibalqa
2023-06-21  4:48             ` Jean Louis
2023-06-21 10:45               ` uzibalqa
2023-06-24 19:19                 ` Jean Louis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).