definition module htmlFormData
// common data type definition used for forms
// (c) 2005 - MJP
import htmlHandler
import StdMaybe, StdBool
import GenEq
:: FormId d // properties one has to assign to any form
= { id :: !String // id *uniquely* identifying the form
, lifespan :: !Lifespan // lifespan of form
, mode :: !Mode // editable or not
, storage :: !StorageFormat // serialization method
, ival :: !d // initial value
}
:: Init // Usage of the value stored in FormId
= Const // The value is a constant
| Init // The value is taken as initial value
| Set // The value will be used as new iData value
:: Lifespan // defines how long a form will be maintained
= Database // persistent form stored in Database using generic db functions from Gerda
| TxtFile // persistent form stored in a file
| TxtFileRO // persistent form stored in a file which is used Read-Only
| Session // form will live as long as one browses between the pages offered by the application
| Page // form will be automatically garbage collected when no reference is made to it in a page
| Temp // form setting is not stored at all, only lives temporaly in the Clean application
:: Mode // one can choose:
= Edit // an editable form where every change is commited to the server
| Submit // an editable form where the whole content is commited on submit
| Display // a non-editable form
| NoForm // do not generate a form, only a value
:: HBimap d v // swiss army nife allowing to make a distinction between data and view domain
= { toForm :: Init d (Maybe v) -> v // converts data to view domain, given current view
, updForm :: Changed v -> v // update function, True when the form is edited
, fromForm :: Changed v -> d // converts view back to data domain, True when form is edited
, resetForm :: Maybe (v -> v) // can be used to reset view (eg for buttons)
}
:: Changed
= { isChanged :: Bool // is this form changed
, changedId :: [String] // id's of changed forms
}
:: StorageFormat // Serialization method:
= StaticDynamic // + higher order types, fast, NO dynamic linker needed; - works only for a specific application !
| PlainString // - first order types only, slow (requires generic parser); + can be used by anyone who knows the type
:: Form a // result of any form
= { changed :: Bool // the user has edited the form
, value :: a // current value in data domain (feel)
, form :: [BodyTag] // html code to create the form, representing view domain (look)
}
:: InIDataId d :== (!Init,!FormId d) // Often used parameter of iData editors
:: IDataFun a :== St *HSt (Form a) // Often used iData HSt State transition functions
// **** easy creation of FormId's ****
class (<@) infixl 4 att :: !(FormId d) !att -> FormId d
instance <@ String // formId <@ x = {formId & id = x}
instance <@ Lifespan // formId <@ x = {formId & lifespan = x}
instance <@ Mode // formId <@ x = {formId & mode = x}
instance <@ StorageFormat // formId <@ x = {formId & storage = x}
mkFormId :: !String !d -> FormId d // mkFormId str val = {id = str, ival = val} <@ Page <@ Edit <@ PlainString
// editable, string format
tFormId :: !String !d -> FormId d // temp
nFormId :: !String !d -> FormId d // page
sFormId :: !String !d -> FormId d // session
pFormId :: !String !d -> FormId d // persistent
rFormId :: !String !d -> FormId d // persistent read only
dbFormId :: !String !d -> FormId d // database
// non-editable, string format
tdFormId :: !String !d -> FormId d // temp + display
ndFormId :: !String !d -> FormId d // page + display
sdFormId :: !String !d -> FormId d // session + display
pdFormId :: !String !d -> FormId d // persistent + display
rdFormId :: !String !d -> FormId d // persistent read only + display
dbdFormId :: !String !d -> FormId d // database + display
// noform, string format
xtFormId :: !String !d -> FormId d // temp + no form
xnFormId :: !String !d -> FormId d // page + no form
xsFormId :: !String !d -> FormId d // session + no form
xpFormId :: !String !d -> FormId d // persistent + no form
xrFormId :: !String !d -> FormId d // persistent read only + no form
xdbFormId :: !String !d -> FormId d // database + no form
// editable, dynamic format also allows to store functions
nDFormId :: !String !d -> FormId d // page + static dynamic format
sDFormId :: !String !d -> FormId d // session + static dynamic format
pDFormId :: !String !d -> FormId d // persistent + static dynamic format
rDFormId :: !String !d -> FormId d // persistent read only + static dynamic format
dbDFormId :: !String !d -> FormId d // database + static dynamic format
// non-editable, dynamic format also allows to store functions
ndDFormId :: !String !d -> FormId d // page + static dynamic format + display
sdDFormId :: !String !d -> FormId d // session + static dynamic format + display
pdDFormId :: !String !d -> FormId d // persistent + static dynamic format + display
rdDFormId :: !String !d -> FormId d // persistent read only + static dynamic format + display
dbdDFormId :: !String !d -> FormId d // database + static dynamic format + display
// to create new FormId's ou of an existing one, handy for making unique identifiers
extidFormId :: !(FormId d) !String -> FormId d // make new id by adding sufix
subFormId :: !(FormId a) !String !d -> FormId d // make new id for a new type by adding suffix
subnFormId :: !(FormId a) !String !d -> FormId d // idem with lifespan Page
subsFormId :: !(FormId a) !String !d -> FormId d // idem with lifespan Session
subpFormId :: !(FormId a) !String !d -> FormId d // idem with lifespan Persitent
subtFormId :: !(FormId a) !String !d -> FormId d // idem with lifespan Temp
setFormId :: !(FormId d) !d -> FormId d // set new initial value in formid
reuseFormId :: !(FormId a) !d -> FormId d // reuse id for new type (only to be used in gform)
initID :: !(FormId d) -> InIDataId d // (Init,FormId a)
setID :: !(FormId d) !d -> InIDataId d // (Set,FormId a)
onMode :: !Mode a a a a -> a // chose arg depending on Edit, Submit, Display, NoForm
// manipulating initial values
toViewId :: !Init !d! (Maybe d) -> d // copy second on Set or if third is Nothing
toViewMap :: !(d -> v) !Init !d !(Maybe v) -> v // same, but convert to view domain
instance toBool Init
instance < Lifespan
instance toString Lifespan
instance == Init, Mode, Lifespan
derive gEq Init, Mode, Lifespan