1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # User preference window and other user-related view
21 # Update the content of `lbl_welcome`
25 self.text
= if name
!= null then
26 "Logged in as %0".t
.format
(name
)
27 else "Not logged in".t
30 # Set `text` to welcome an authentified user or invite to authentify
34 self.text
= if name
!= null then
35 "Welcome %0".t
.format
(name
)
40 # User preference window
45 var layout
= new ListLayout(parent
=self)
47 private var layout_user_options
= new VerticalLayout(parent
=layout
)
49 private var lbl_user_options_title
= new Label(parent
=layout_user_options
,
50 text
="Account options".t
)
52 private var lbl_welcome
= new Label(parent
=layout_user_options
)
53 private var but_logout
= new Button(parent
=layout_user_options
, text
="Logout".t
)
55 # Refesh displayed text
58 lbl_user_options_title
.size
= 1.5
59 lbl_welcome
.set_user_name
60 but_logout
.enabled
= app
.user
!= null
65 but_logout
.observers
.add
self
69 redef fun on_event
(event
)
71 if event
isa ButtonPressEvent then
72 var sender
= event
.sender
73 if sender
== but_logout
then
85 # Window for signing up a new user or logging in
90 var layout
= new ListLayout(parent
=self)
92 private var lbl_welcome
= new Label(parent
=layout
, text
="Welcome")
95 private var name_line
= new HorizontalLayout(parent
=layout
)
96 private var lbl_name
= new Label(parent
=name_line
, text
="Username".t
)
97 private var txt_name
= new TextInput(parent
=name_line
, text
=app
.user
)
100 private var pass_line
= new HorizontalLayout(parent
=layout
)
101 private var lbl_pass
= new Label(parent
=pass_line
, text
="Password".t
)
102 private var txt_pass
= new TextInput(parent
=pass_line
, is_password
=true)
103 private var lbl_pass_desc
= new Label(parent
=layout
,
104 text
="Passwords must be composed of at least 6 characters.".t
)
106 private var but_login
= new Button(parent
=layout
, text
="Login".t
)
109 private var email_line
= new HorizontalLayout(parent
=layout
)
110 private var lbl_email
= new Label(parent
=email_line
, text
="Email".t
)
111 private var txt_email
= new TextInput(parent
=email_line
)
113 private var but_signup
= new Button(parent
=layout
, text
="Signup".t
)
115 private var lbl_feedback
= new Label(parent
=layout
, text
="")
119 lbl_pass_desc
.size
= 0.5
121 for c
in [but_login
, but_signup
] do
126 redef fun on_event
(event
)
128 if debug
then print
"BenitluxWindow::on_event {event}"
130 if event
isa ButtonPressEvent then
131 var sender
= event
.sender
132 if sender
== but_login
or sender
== but_signup
then
134 var name
= txt_name
.text
135 if name
== null or not name
.name_is_ok
then
136 feedback
"Invalid name".t
140 var pass
= txt_pass
.text
141 if pass
== null or not pass
.pass_is_ok
then
142 feedback
"Invalid password".t
146 if sender
== but_login
then
147 (new LoginOrSignupAction(self, "rest/login?name={name}&pass={pass.pass_hash}")).start
148 else if sender
== but_signup
then
149 var email
= txt_email
.text
150 if email
== null or email
.is_empty
then
151 feedback
"Invalid email".t
155 (new LoginOrSignupAction(self, "rest/signup?name={name}&pass={pass.pass_hash}&email={email}")).start
163 # Show lasting feedback to the user in a label
164 fun feedback
(text
: String) do lbl_feedback
.text
= text
168 # Async RESTful actions
170 # Async request for login in or signing up
171 class LoginOrSignupAction
172 super WindowHttpRequest
174 redef type W
: SignupWindow
176 init do affected_views
.add_all
([window
.but_login
, window
.but_signup
])
178 redef fun on_load
(res
)
180 if intercept_error
(res
) then return
182 if not res
isa LoginResult then
183 on_fail
new Error("Server sent unexpected data {res or else "null"}")
187 app
.token
= res
.token
188 app
.user
= res
.user
.name
193 redef fun feedback
(text
) do window
.feedback text