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 user_options_header
= new SectionHeader(parent
=layout_user_options
)
50 private var lbl_user_options_title
= new SectionTitle(parent
=user_options_header
,
51 text
="Account options".t
)
53 var lbl_welcome
= new DescLabel(parent
=layout_user_options
)
54 private var but_logout
= new Button(parent
=layout_user_options
, text
="Logout".t
)
56 # Refesh displayed text
59 lbl_welcome
.set_user_name
60 but_logout
.enabled
= app
.user
!= null
65 redef fun on_event
(event
)
67 if event
isa ButtonPressEvent then
68 var sender
= event
.sender
69 if sender
== but_logout
then
81 # Window for signing up a new user or logging in
85 private var list
= new ListLayout(parent
=self)
87 private var login_header
= new SectionHeader(parent
=list
)
88 private var login_title
= new SectionTitle(parent
=login_header
, text
="Login".t
)
90 # Layout for the top form
91 var layout_login
= new SignupForm(parent
=list
)
94 # First the login options
97 private var name_line
= new HorizontalLayout(parent
=layout_login
)
98 private var lbl_name
= new Label(parent
=name_line
, text
="Username".t
)
99 private var txt_name
= new TextInput(parent
=name_line
, text
=app
.user
)
102 private var pass_line
= new HorizontalLayout(parent
=layout_login
)
103 private var lbl_pass
= new Label(parent
=pass_line
, text
="Password".t
)
104 private var txt_pass
= new TextInput(parent
=pass_line
, is_password
=true)
105 private var lbl_pass_desc
= new DescLabel(parent
=layout_login
, size
= 0.5,
106 text
="Passwords must be composed of at least 6 characters.".t
)
108 private var but_login
= new Button(parent
=layout_login
, text
="Login".t
)
110 private var lbl_feedback
= new DescLabel(parent
=layout_login
, text
=" ")
113 # Then, the signup options
115 private var signup_header
= new SectionHeader(parent
=list
)
116 private var signup_title
= new SectionTitle(parent
=signup_header
, text
="Signup".t
)
118 # Layout for the 2nd form
119 var layout_signup
= new SignupForm(parent
=list
)
121 private var lbl_signup_desc
= new DescLabel(parent
=layout_signup
, size
= 0.5,
122 text
="Fill the following fields to sign up.".t
)
125 private var pass_line2
= new HorizontalLayout(parent
=layout_signup
)
126 private var lbl_pass2
= new Label(parent
=pass_line2
, text
="Repeat password".t
)
127 private var txt_pass2
= new TextInput(parent
=pass_line2
, is_password
=true)
130 private var email_line
= new HorizontalLayout(parent
=layout_signup
)
131 private var lbl_email
= new Label(parent
=email_line
, text
="Email".t
)
132 private var txt_email
= new TextInput(parent
=email_line
)
134 private var but_signup
= new Button(parent
=layout_signup
, text
="Signup".t
)
136 redef fun on_event
(event
)
138 if debug
then print
"BenitluxWindow::on_event {event}"
140 if event
isa ButtonPressEvent then
141 var sender
= event
.sender
142 if sender
== but_login
or sender
== but_signup
then
144 var name
= txt_name
.text
145 if name
== null or not name
.name_is_ok
then
146 feedback
"Invalid username.".t
150 var pass
= txt_pass
.text
151 if pass
== null or not pass
.pass_is_ok
then
152 feedback
"Invalid password.".t
156 if sender
== but_login
then
157 feedback
"Logging in...".t
158 (new LoginOrSignupAction(self, "rest/login?name={name.to_percent_encoding}&pass={pass.pass_hash}")).start
159 else if sender
== but_signup
then
160 if pass
!= txt_pass2
.text
then
161 feedback
"Passwords do not match.".t
165 var email
= txt_email
.text
166 if email
== null or email
.is_empty
then
167 feedback
"Invalid email".t
171 feedback
"Signing up...".t
172 (new LoginOrSignupAction(self, "rest/signup?name={name.to_percent_encoding}&pass={pass.pass_hash}&email={email.to_percent_encoding}")).start
180 # Show lasting feedback to the user in a label
181 fun feedback
(text
: String) do lbl_feedback
.text
= text
184 # Form for login or signup
191 # Async RESTful actions
193 # Async request for login in or signing up
194 class LoginOrSignupAction
195 super WindowHttpRequest
197 redef type W
: SignupWindow
199 init do affected_views
.add_all
([window
.but_login
, window
.but_signup
])
201 redef fun on_load
(res
, status
)
203 if intercept_error
(res
) then return
205 if not res
isa LoginResult then
206 on_fail
new Error("Server sent unexpected data {res or else "null"}")
210 app
.token
= res
.token
211 app
.user
= res
.user
.name
216 redef fun feedback
(text
) do window
.feedback text