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
89 private var list
= new ListLayout(parent
=self)
90 private var lbl_feedback
= new Label(parent
=list
, text
="Welcome")
92 private var layout_login
= new VerticalLayout(parent
=list
)
95 # First the login options
98 private var name_line
= new HorizontalLayout(parent
=layout_login
)
99 private var lbl_name
= new Label(parent
=name_line
, text
="Username".t
)
100 private var txt_name
= new TextInput(parent
=name_line
, text
=app
.user
)
103 private var pass_line
= new HorizontalLayout(parent
=layout_login
)
104 private var lbl_pass
= new Label(parent
=pass_line
, text
="Password".t
)
105 private var txt_pass
= new TextInput(parent
=pass_line
, is_password
=true)
106 private var lbl_pass_desc
= new Label(parent
=layout_login
, size
= 0.5,
107 text
="Passwords must be composed of at least 6 characters.".t
)
109 private var but_login
= new Button(parent
=layout_login
, text
="Login".t
)
112 # Then, the signup options
114 private var layout_register
= new VerticalLayout(parent
=list
)
116 private var lbl_signup_desc
= new Label(parent
=layout_register
, size
= 0.5,
117 text
="Fill the following fields to sign up.".t
)
120 private var pass_line2
= new HorizontalLayout(parent
=layout_register
)
121 private var lbl_pass2
= new Label(parent
=pass_line2
, text
="Repeat password".t
)
122 private var txt_pass2
= new TextInput(parent
=pass_line2
, is_password
=true)
125 private var email_line
= new HorizontalLayout(parent
=layout_register
)
126 private var lbl_email
= new Label(parent
=email_line
, text
="Email".t
)
127 private var txt_email
= new TextInput(parent
=email_line
)
129 private var but_signup
= new Button(parent
=layout_register
, text
="Signup".t
)
133 for c
in [but_login
, but_signup
] do
138 redef fun on_event
(event
)
140 if debug
then print
"BenitluxWindow::on_event {event}"
142 if event
isa ButtonPressEvent then
143 var sender
= event
.sender
144 if sender
== but_login
or sender
== but_signup
then
146 var name
= txt_name
.text
147 if name
== null or not name
.name_is_ok
then
148 feedback
"Invalid username.".t
152 var pass
= txt_pass
.text
153 if pass
== null or not pass
.pass_is_ok
then
154 feedback
"Invalid password.".t
158 if sender
== but_login
then
159 feedback
"Logging in...".t
160 (new LoginOrSignupAction(self, "rest/login?name={name}&pass={pass.pass_hash}")).start
161 else if sender
== but_signup
then
162 if pass
!= txt_pass2
.text
then
163 feedback
"Passwords do not match.".t
167 var email
= txt_email
.text
168 if email
== null or email
.is_empty
then
169 feedback
"Invalid email".t
173 feedback
"Signing up...".t
174 (new LoginOrSignupAction(self, "rest/signup?name={name}&pass={pass.pass_hash}&email={email}")).start
182 # Show lasting feedback to the user in a label
183 fun feedback
(text
: String) do lbl_feedback
.text
= text
187 # Async RESTful actions
189 # Async request for login in or signing up
190 class LoginOrSignupAction
191 super WindowHttpRequest
193 redef type W
: SignupWindow
195 init do affected_views
.add_all
([window
.but_login
, window
.but_signup
])
197 redef fun on_load
(res
)
199 if intercept_error
(res
) then return
201 if not res
isa LoginResult then
202 on_fail
new Error("Server sent unexpected data {res or else "null"}")
206 app
.token
= res
.token
207 app
.user
= res
.user
.name
212 redef fun feedback
(text
) do window
.feedback text