adamc@1004: con meta = fn (db :: Type, widget :: Type) =>
adamc@1004: {Nam : string,
adamc@1004: Show : db -> xbody,
adamc@1004: Widget : nm :: Name -> xml form [] [nm = widget],
adamc@1004: WidgetPopulated : nm :: Name -> db -> xml form [] [nm = widget],
adamc@1004: Parse : widget -> db,
adamc@1004: Inject : sql_injectable db}
adamc@1004:
adamc@1004: fun default [t] (sh : show t) (rd : read t) (inj : sql_injectable t) name : meta (t, string) =
adamc@1004: {Nam = name,
adamc@1004: Show = txt,
adamc@1004: Widget = fn [nm :: Name] => ,
adamc@1004: WidgetPopulated = fn [nm :: Name] n =>
adamc@1004: ,
adamc@1004: Parse = readError,
adamc@1004: Inject = _}
adamc@1004:
adamc@1004: val int = default
adamc@1004: val float = default
adamc@1004: val string = default
adamc@1004: fun bool name = {Nam = name,
adamc@1004: Show = txt,
adamc@1004: Widget = fn [nm :: Name] => ,
adamc@1004: WidgetPopulated = fn [nm :: Name] b =>
adamc@1004: ,
adamc@1004: Parse = fn x => x,
adamc@1004: Inject = _}
adamc@1007:
adamc@1007: fun textarea name = {Nam = name,
adamc@1007: Show = cdata,
adamc@1007: Widget = fn [nm :: Name] =>
,
adamc@1007: WidgetPopulated = fn [nm :: Name] s =>
adamc@1007:
adamc@1007: ,
adamc@1007: Parse = fn s => s,
adamc@1007: Inject = _}
adamc@1007:
adamc@1007: fun allWidgets [ts ::: {(Type * Type)}] (r : $(map meta ts)) (fl : folder ts) =
adamc@1007: foldR [meta] [fn ts :: {(Type * Type)} => xml form [] (map snd ts)]
adamc@1007: (fn [nm :: Name] [t :: (Type * Type)] [rest :: {(Type * Type)}]
adamc@1007: [[nm] ~ rest] (col : meta t) (acc : xml form [] (map snd rest)) =>
adamc@1007: {[col.Nam]}: {col.Widget [nm]}
adamc@1007: {useMore acc}
adamc@1007: )
adamc@1007:
adamc@1007: [_] fl r