1 | <!DOCTYPE html>
|
2 | <html lang="en">
|
3 | <head>
|
4 | <meta charset="utf-8">
|
5 | <title>Plumes - Login</title>
|
6 |
|
7 | <meta name="viewport" content="width=device-width, initial-scale=1">
|
8 | <link rel="stylesheet" href="/public/base/base-plumes.css" type="text/css" />
|
9 | <style type="text/css">
|
10 | .example-mask {
|
11 | z-index: 99998;
|
12 | position: fixed;
|
13 | top: 0;
|
14 | left: 0;
|
15 | right: 0;
|
16 | bottom: 0;
|
17 | background: #fff;
|
18 | }
|
19 | </style>
|
20 | </head>
|
21 | <body>
|
22 |
|
23 | <rv-require
|
24 | name="pl-layout-platform"
|
25 | src="../public/layouts/pl-layout-platform"
|
26 |
|
27 | data-bind-onloaded="onloaded"
|
28 | data-bind-beforerequire="beforerequire"
|
29 | data-bind-brand="brand"
|
30 | data-bind-apps="apps"
|
31 | data-bind-user="user"
|
32 | >
|
33 | <rv-partial target="mask-title">
|
34 | Login <span class="accent">example</span>
|
35 | </rv-partial>
|
36 | <rv-partial target="message-title">
|
37 | Login <span class="accent">example</span>
|
38 | </rv-partial>
|
39 | <rv-partial target="content">
|
40 |
|
41 | <rv-require
|
42 | name="pl-login"
|
43 | src="../public/login/pl-login"
|
44 | ondemand="pl-login"
|
45 |
|
46 | data-text-question="Who are you?"
|
47 | data-text-username="Email"
|
48 | data-text-userpassword="Password"
|
49 | ></rv-require>
|
50 |
|
51 | </rv-partial>
|
52 | </rv-require>
|
53 |
|
54 | <div class="example-mask"></div>
|
55 |
|
56 | <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.js"></script>
|
57 | <script type="text/javascript" src="http://cdn.ractivejs.org/latest/ractive.js"></script>
|
58 | <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/ractive-require/0.5.1/ractive-require.js"></script>
|
59 | <script type="text/javascript" src="http://www.myersdaily.org/joseph/javascript/md5.js"></script>
|
60 | <script type="text/javascript" src="/public/base/base-bootstrap.js"></script>
|
61 |
|
62 | <script type="text/javascript">
|
63 | (function() {
|
64 | 'use strict';
|
65 |
|
66 | window.Ractive.bootstrap(function(page) {
|
67 |
|
68 | page.set('brand', 'Plumes');
|
69 | page.set('apps', [{
|
70 | name: 'Layout',
|
71 | select: function() {
|
72 | window.location.href = '/layout.html';
|
73 | }
|
74 | }, {
|
75 | name: 'Login',
|
76 | selected: true,
|
77 | select: function() {
|
78 | window.location.href = 'login.html';
|
79 | }
|
80 | }, {
|
81 | name: 'Lists',
|
82 | select: function() {
|
83 | window.location.href = 'lists.html';
|
84 | }
|
85 | }]);
|
86 | page.set('user', {
|
87 | avatar: 'https://www.gravatar.com/avatar/9e38451efa23937301594f273033c5f1.png'
|
88 | });
|
89 |
|
90 | function _validateEmail(email) {
|
91 | return /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i.test(email);
|
92 | }
|
93 |
|
94 | page.set('beforerequire', function(Layout, callback) {
|
95 | Layout.require('pl-login').then(function() {
|
96 |
|
97 | var Login = Layout.findChild('name', 'pl-login');
|
98 |
|
99 | Login.on('username', function(args) {
|
100 | if (args.username && _validateEmail(args.username)) {
|
101 | var src = 'https://www.gravatar.com/avatar/' + window.md5(args.username) + '.png?s=140';
|
102 |
|
103 | $('<img/>')
|
104 | .load(function() {
|
105 | Login.set('avatar', src);
|
106 | })
|
107 | .attr('src', src);
|
108 |
|
109 | return;
|
110 | }
|
111 |
|
112 | Login.set('avatar', '');
|
113 | });
|
114 |
|
115 | Login.on('login', function(args) {
|
116 | console.log(args);
|
117 | if (!args.username || !args.userpassword) {
|
118 | return Login.fire('error', {
|
119 | message: 'The password entered is incorrect.'
|
120 | });
|
121 | }
|
122 |
|
123 | Login.fire('logged', 'Welcome back <strong class="accent">' + args.username + '</strong>');
|
124 | });
|
125 |
|
126 | Login.on('forgot', function(args) {
|
127 | if (!_validateEmail(args.username)) {
|
128 | return Login.fire('forgotError', {
|
129 | message: 'Please give a valid email address.'
|
130 | });
|
131 | }
|
132 |
|
133 | Login.fire('forgotSuccess');
|
134 | });
|
135 |
|
136 | Login.on('forgotCode', function(args) {
|
137 | if (!args.code) {
|
138 | return Login.fire('forgotCodeError', {
|
139 | message: 'Please give a valid code.'
|
140 | });
|
141 | }
|
142 |
|
143 | Login.fire('forgotCodeSuccess');
|
144 | });
|
145 |
|
146 | Login.on('forgotPassword', function(args) {
|
147 | if (!args.password || args.password != args.confirmPassword) {
|
148 | return Login.fire('forgotPasswordError', {
|
149 | message: 'Please give valid passwords.'
|
150 | });
|
151 | }
|
152 |
|
153 | Login.fire('forgotPasswordSuccess', {
|
154 | message: 'Your new password is registered.'
|
155 | });
|
156 | });
|
157 |
|
158 | Login.on('closed', function() {
|
159 | callback();
|
160 | });
|
161 | });
|
162 | });
|
163 |
|
164 | page.set('onloaded', function() {
|
165 | $('.example-mask').remove();
|
166 | });
|
167 |
|
168 | page.require();
|
169 | });
|
170 |
|
171 | })();
|
172 | </script>
|
173 | </body>
|
174 | </html>
|