/
datepicker.opa
118 lines (95 loc) · 2.69 KB
/
datepicker.opa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
Copyright © 2011 MLstate
This file is part of OPA.
OPA is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License, version 3, as published by
the Free Software Foundation.
OPA is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
more details.
You should have received a copy of the GNU Affero General Public License
along with OPA. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Elvis Binding of the Datepicker Widget
*
* @category UI
* @author François-Régis Sinot, 2011
* @destination PUBLIC
* @stability EXPERIMENTAL
*/
/**
* {1 Datepicker}
*
* Demonstrating how to wrap a widget into an elvis.
* No support for the "menu-style" datepicker.
*/
import stdlib.widgets.datepicker
/**
* {1 Theming}
*
* The input always has classes "mlstate", "elvis", "datepicker".
*/
/**
* {1 Sources for this elvis}
*/
type EDatepicker.sources =
{
changed_date: Event.source(Date.date)
}
type EDatepicker.options =
{
initial_date: Date.date
/* TODO: all options of WDatepicker.config except stylers */
}
@abstract type EDatepicker.implementation =
{
/**
* Parameters for WDatepicker
*/
wdatepicker_id: string
wdatepicker_config: WDatepicker.config
}
type EDatepicker.elvis = Elvis.elvis(EDatepicker.sources, EDatepicker.implementation)
@client EDatepicker = {{
/**
* {2 Constructors}
*/
simple(initial_date : Date.date): EDatepicker.elvis =
(
make({ default_options with ~initial_date})
)
make(options: EDatepicker.options): EDatepicker.elvis =
(
id_datepicker = "edatepicker_{Random.string(32)}"
//Setup sources
changed_date_net = Network.empty()
//Translate to WDatepicker
wdatepicker_config = WDatepicker.default_config
display(theme) =
(
_theme_name = Elvis.Theme.get_classes(theme) /* TODO: use it */
on_change_date = Network.broadcast(_, changed_date_net)
xhtml = WDatepicker.edit(wdatepicker_config, on_change_date, id_datepicker, options.initial_date)
dom = Dom.of_xhtml(xhtml)
~{dom xhtml}
)
sources : EDatepicker.sources =
{
changed_date = (changed_date_net)
}
implem : EDatepicker.implementation =
({
wdatepicker_id = id_datepicker
~wdatepicker_config
})
Elvis.make(sources, implem, display)
)
/**
* A default set of options
*/
default_options: EDatepicker.options =
{initial_date = Date.epoch
}
}}