[Ur] Ur/Web people organizer: editable table with fixed (hidden) field?

Marko Schütz Schmuck markoschuetz at googlemail.com
Mon Apr 17 13:58:22 EDT 2017


While in the long run something as general as what Ziv suggested is
desirable I decided to experiment with the seemingly simpler idea of a
hidden widget used with an unchanged version of EditableTable.

Here is an example

structure Theme = Ui.Make(Default)

cookie userC : string
               
table blocked : { User : string, Weekday : string, StartTime : string, CompleteTime : string }
  PRIMARY KEY (User, Weekday, StartTime)

open Widget

fun pad (n : int) : string
  = (if n < 10
    then "0" 
    else "") ^ show n

fun twelveHour (h : int) (m : int) : string
  =
  let
      val ampm = if h < 12 then " am" else " pm"
      val hr = if h > 12 then h - 12 else h
  in 
      pad hr ^ ":" ^ pad m ^ ampm
  end
  
fun timeSlots (h : int) (lastH : int) : list string
  =
  let
      fun loop (acc : list string) (h : int) (lastH : int)
        = if h <= lastH
          then loop (twelveHour h 30 :: twelveHour h 0 :: acc) (h + 1) lastH
          else List.rev acc
  in loop [] h lastH
  end
  
fun head [a] (ls : list a) : a
  = case ls of
        x :: _ => x
      | _ => error <xml>head of empty list</xml>

fun tail [a] (ls : list a) : list a
  = case ls of
        _ :: ls' => ls'
      | _ => error <xml>tail of empty list</xml>

fun withUser [t ::: Type] (action : string -> transaction t)
    : transaction t
  = user <- getCookie userC;
    case user of
        None => error <xml>cookie not set!</xml>
      | Some u => action u
    
structure ET
  = EditableTable.Make(
    struct
        val tab = blocked
        val labels = {User = "",
                      Weekday = "weekday",
                      StartTime = "start time",
                      CompleteTime = "end time"}
        val permission = return {Add = True,
                                 Delete = True,
                                 Modify = True}
        val widgets =
            let
                val timeSlots = timeSlots 7 21
                val ht = head timeSlots
                val tt = tail timeSlots
            in 
                {User =
                 Widget.make
                     { Configure = return (),
                       Create = fn () => withUser source,
                       Initialize = fn () => source,
                       Reset = fn s => withUser (set s),
                       AsWidget = fn s ido =>
                                     case ido of
                                         None => <xml/>
                                       | Some id => <xml>{[id]}</xml>,
                       Value = signal,
                       AsValue = fn _ => <xml/> },
                  Weekday =
                     choicebox "Sunday"
                        ("Monday" :: "Tuesday" :: "Wednesday"
                         :: "Thursday" :: "Friday"
                         :: "Saturday" :: []),
                  StartTime = choicebox ht tt,
                  CompleteTime = choicebox ht tt
                } ++ _
            end
        fun onAdd _ = return ()
        fun onDelete _ = return ()
        fun onModify _ = return ()
    end)
    
val main =
    setCookie userC {Value = "marko", Expires = None, Secure = False};
    Theme.simple "Main" ET.ui



On Thu, 13 Apr 2017 15:14:29 -0400,
Adam Chlipala wrote:
> 
> It seems the outcome is that someone would need to add this feature, but it's probably along the lines of
> code already present for other modules.
> 
> On 04/11/2017 01:47 PM, Marko Schütz Schmuck wrote:
> 
>     On Tue, 11 Apr 2017 13:13:19 -0400,
>     Ziv Scully wrote:
>     
>         Am I correct in thinking that you basically want something like InputStrings's "const" and "given"
>         parameters, but for EditableTable?
>         
>     Yes, from what I can tell...
> 
>         On Tue, Apr 11, 2017 at 13:03 Marko Schütz Schmuck <markoschuetz at googlemail.com> wrote:
>         
>             On Tue, 11 Apr 2017 12:18:59 -0400,
>             Adam Chlipala wrote:
>             >
>             > If the "user" field is not editable, how do you choose which user to associate with a new row?
>            
>             I was thinking that it could be a transaction argument to the widget
>             function like
>            
>                     ...
>                     val widgets = {User = sinkWidget (getCookie userC), ...}
>            
>             alternatively maybe it should be another part of the struct passed to
>             the EditableTable.Make functor like "permission"?
>            
>             Best regards,
>            
>             Marko
>            
>             > On 04/11/2017 12:10 PM, Marko Schütz Schmuck wrote:
>             >
>             >     On Tue, 11 Apr 2017 10:58:31 -0400,
>             >     Adam Chlipala wrote:
>             >
>             >         OK, so you don't want to support adding or deleting rows, just editing the ones that
>             >         already exist?  I'm not sure UPO has something like that right now, but I'd need to look
>             >         through the code again to be sure.
>             >
>             >     No, no: adding and deleting are required too. It's just that I want to
>             >     have the User field not editable. A "sink widget" that does not
>             >     display but can be assigned as the widget of a field might work? The
>             >     field would still be in the records and be stored in the table.
>             >
>             >     Best regards,
>             >
>             >     Marko
>             >
>             >         On 04/10/2017 04:14 PM, Marko Schütz Schmuck wrote:
>             >
>             >             I was wondering whether the tools available in UPO are already
>             >             sufficient to cover the following:
>             >
>             >             I have a table where each user can register several tuples. For now,
>             >             I'd like to present it as an editable table where the field User is
>             >             not editable (not even visible) and will be constants for all tuples
>             >             entered by that user.
>             >
>             >             Best regards,
>             >
>             >             Marko
>             >
>             >         _______________________________________________
>             >         Ur mailing list
>             >         Ur at impredicative.com
>             >         http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>             >
>             >         _______________________________________________
>             >         Ur mailing list
>             >         Ur at impredicative.com
>             >         http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>             >
>             >
>             > [2  <text/plain; utf-8 (base64)>]
>             > _______________________________________________
>             > Ur mailing list
>             > Ur at impredicative.com
>             > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>             _______________________________________________
>             Ur mailing list
>             Ur at impredicative.com
>             http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
> 
>         [2  <text/plain; utf-8 (base64)>]
>         _______________________________________________
>         Ur mailing list
>         Ur at impredicative.com
>         http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
> 
>         _______________________________________________
>         Ur mailing list
>         Ur at impredicative.com
>         http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
> 
> 
> [2  <text/plain; utf-8 (base64)>]
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP Digital Signature
URL: <http://www.impredicative.com/pipermail/ur/attachments/20170417/32a25906/attachment.sig>


More information about the Ur mailing list