Changeset 260 for Dev


Ignore:
Timestamp:
02/14/12 18:22:25 (13 years ago)
Author:
hendrikvanantwerpen
Message:
  • Clear LoginDialog? on show (in case of re-show).
  • Allow to link nodes/widgets to rft.ui.Page members with data-rft-attach-point attribute.
  • Allow arguments to a page to be passed with data-rft-props argument. Content loader rft.content sets this argument on the top node of a loaded page.
  • Have longer cookie-lifetime and update cookie when session is restored. Allow session restore in API and client code.
  • Moved startup Javascript to rft/run.js.
Location:
Dev/branches/rest-dojo-ui
Files:
9 edited
1 moved

Legend:

Unmodified
Added
Removed
  • Dev/branches/rest-dojo-ui/client/index.html

    r256 r260  
    88        <link type="text/css" href="dojox/grid/resources/claroGrid.css" rel="stylesheet" />
    99        <link type="text/css" href="rft/css/main.css" rel="stylesheet" />
    10         <script data-dojo-config="async: true, parseOnLoad: false, tlmSiblingOfDojo: false, isDebug: true, baseUrl: '', packages: ['dojo','dijit', 'dojox', 'rft']" src="dojo/dojo.js"></script>
    11         <script>
    12             require([ 'dojo/parser', 'rft/ui/LoginDialog', 'dojo/dom', 'dojo/_base/connect', 'dojo/cookie', 'rft/content', 'dojo/domReady!', 'dijit/layout/ContentPane', 'dijit/MenuBar', 'dijit/MenuBarItem', 'rft/ui/MenuBarLink', 'rft/ui/Page' ],
    13             function(parser,LoginDialog,dom,connect,cookie,content) {
    14                 parser.parse();
    15                
    16                 var session_cookie = cookie('rft_uid');
    17                 if ( !session_cookie ) {
    18                     var login = new LoginDialog().placeAt(document.body);
    19                     login.startup();
    20                     login.show();
    21                 } else {
    22                     content.initial();
    23                 }
    24                
    25                 connect.connect(dom.byId('userinfo'),'click',function(){
    26                     login.show();
    27                 });
    28             });
    29         </script>
     10        <script type="text/javascript" src="dojo/dojo.js" data-dojo-config="async: true, parseOnLoad: false, tlmSiblingOfDojo: false, isDebug: true, baseUrl: '', packages: ['dojo','dijit', 'dojox', 'rft']"></script>
     11        <script type="text/javascript" src="rft/run.js"></script>
    3012    </head>
    3113    <body class="claro">
  • Dev/branches/rest-dojo-ui/client/pages/session.html

    r257 r260  
    11<div data-dojo-type="rft.ui.Page">
    2     <script type="dojo/method" data-dojo-event="init" data-dojo-args="args">
     2    <script type="dojo/method" data-dojo-event="init">
     3        var that = this;
    34        require(['dojo/_base/json','dojo/dom','dojo/store/JsonRest','dojo/domReady!'],
    45            function(json,dom,JsonRest){
     
    78                    idProperty: 'uid'
    89                });
    9                 store.get(args.uid).then(function(obj){
    10                     dom.byId('page_session_form').innerHTML = json.toJson(obj);
     10                store.get(that.args.uid).then(function(obj){
     11                    that.page_session_form.innerHTML = json.toJson(obj);
    1112                });
    1213            });
    1314    </script>
    14     <div class="largeFrame" id="page_session" style="width: 400px;">
     15    <div class="largeFrame" style="width: 400px;">
    1516        <div class="largeTitle">Session</div>
    1617        <div class="content">
    17             <div id="page_session_form"></div>
     18            <div data-rft-attach-point="page_session_form"></div>
    1819        </div>
    1920    </div>
  • Dev/branches/rest-dojo-ui/client/pages/sessions.html

    r257 r260  
    11<div data-dojo-type="rft.ui.Page">
    2     <script type="dojo/method" data-dojo-event="init" data-dojo-args="args">
     2    <script type="dojo/method" data-dojo-event="init">
     3        var that = this;
    34        require(['dojo/store/JsonRest','dojox/grid/DataGrid',
    45                'dojo/data/ObjectStore','dojo/domReady!'],
     
    89                idProperty: 'uid'
    910            });
    10                 var grid = new DataGrid({
    11                         store: ObjectStore({objectStore: store}),
     11            var grid = new DataGrid({
     12                store: ObjectStore({objectStore: store}),
    1213                autoWidth: true,
    1314                autoHeight: true,
    14                         structure: [
    15                                 {name:"Title", field:"title", width: "200px"},
    16                                 {name:"Id", field:"uid", width: "200px"}
    17                         ]
    18                 }, "page_sessions_grid");
    19                 grid.startup();
     15                structure: [
     16                        {name:"Title", field:"title", width: "200px"}
     17                ]
     18            }, that.page_sessions_grid);
     19            grid.startup();
    2020        });
    2121    </script>
    22     <div class="largeFrame" id="page_sessions" style="width: 400px;">
     22    <div class="largeFrame" style="width: 400px;">
    2323        <div class="largeTitle">Sessions</div>
    2424        <div class="content">
    25             <div id="page_sessions_grid"></div>
     25            <div data-rft-attach-point="page_sessions_grid"></div>
    2626        </div>
    2727    </div>
  • Dev/branches/rest-dojo-ui/client/rft/auth.js

    r256 r260  
    1 define(['dojo/_base/Deferred','./api'],function(Deferred,api){
    2     return new (function() {
    3         var self = this;
    4         var currentUser = null;
     1define(['dojo/_base/Deferred','dojo/_base/xhr','dojo/_base/json'],
     2    function(Deferred,xhr,json){
     3        return new (function() {
     4            var self = this;
     5            var currentUser = null;
    56
    6         self.login = function(username,password) {
    7             var d = new Deferred();
    8             api.post("login",
    9             {
    10                 username:username,
    11                 password:password
    12             })
    13             .then(function(data) {
    14                 currentUser = data;
    15                 d.resolve(data);
    16             },function(){
    17                 d.reject();
    18             });
    19             return d.promise;
    20         };
     7            function post(path,args) {
     8                return xhr.post({
     9                    url: "../server/api.php"+path,
     10                    handleAs: "json",
     11                    headers: {
     12                        "Content-Type": "application/json"
     13                    },
     14                    rawBody: json.toJson(args)
     15                });
     16            }
     17
     18            self.login = function(username,password) {
     19                var d = new Deferred();
     20                post("/login",
     21                {
     22                    username:username,
     23                    password:password
     24                })
     25                .then(function(data) {
     26                    currentUser = data;
     27                    d.resolve(data);
     28                },function(){
     29                    d.reject();
     30                });
     31                return d.promise;
     32            };
     33
     34            self.restore = function() {
     35                var d = new Deferred();
     36                post("/login",{})
     37                .then(function(data) {
     38                    currentUser = data;
     39                    d.resolve(data);
     40                },function(){
     41                    d.reject();
     42                });
     43                return d.promise;
    2144           
    22         self.register = function(username,password) {
    23             var d = new Deferred();
    24             api.post("register",
    25             {
    26                 username:username,
    27                 password:password
    28             })
    29             .then(function(data) {
    30                 currentUser = data;
    31                 d.resolve(data);
    32             },function(){
    33                 d.reject();
    34             });
    35             return d.promise;
    36         };
     45            };
     46
     47            self.register = function(username,password) {
     48                var d = new Deferred();
     49                post("/register",
     50                {
     51                    username:username,
     52                    password:password
     53                })
     54                .then(function(data) {
     55                    currentUser = data;
     56                    d.resolve(data);
     57                },function(){
     58                    d.reject();
     59                });
     60                return d.promise;
     61            };
    3762           
    38         self.getUser = function(){
    39             return currentUser;
    40         };
    41     })();
    42 });
     63            self.getUser = function(){
     64                return currentUser;
     65            };
     66        })();
     67    });
  • Dev/branches/rest-dojo-ui/client/rft/content.js

    r257 r260  
    1 define(['dojo/_base/declare','dojo/_base/connect','dojo/_base/xhr','dojo/_base/lang','dojo/_base/Deferred','dojo/hash','dojo/io-query','dijit/registry','dijit','rft/util','rft/ui/Page'],
    2     function(declare,connect,xhr,lang,Deferred,hash,uriQuery,registry,dijit,util,Page){
     1define(['dojo/_base/declare','dojo/_base/connect','dojo/_base/xhr','dojo/dom-construct',
     2    'dojo/dom-attr','dojo/_base/lang','dojo/_base/Deferred','dojo/hash',
     3    'dojo/io-query','dojo/_base/json','dijit','rft/util'],
     4    function(declare,connect,xhr,domConstruct,attr,lang,Deferred,hash,uriQuery,json,dijit,util){
    35        return new (function() {
    46            var self = this;
     
    68           
    79            var HRI = declare(null,{
    8                 constructor: function(){
     10                constructor: function() {
    911                    this._path = '/';
    1012                    this._args = {};
     
    6163                hash(newHash,replace);
    6264                xhr.get({
    63                     url: 'pages'+hri.path()+'.html'
     65                    url: 'pages'+hri.path()+'.html',
     66                    failOk: true
    6467                })
    6568                .then(function(html){
    66                     contentPane.set('content',html);
    67                     var widgets = registry.findWidgets(contentPane.containerNode);
    68                     for(var i in widgets) {
    69                         if ( widgets[i].isInstanceOf(Page) ) {
    70                             widgets[i].init(hri.args());
    71                             break;
    72                         }
    73                     }
     69                    var root = domConstruct.toDom(html)
     70                    var props = json.toJson(hri.args());
     71                    props = props.slice(1,props.length-2);
     72                    if ( props )
     73                        attr.set(root,'data-rft-props',props);
     74                    contentPane.set('content',root);
    7475                    d.resolve();
    7576                },function(){
     
    8283            self.initial = function(path,args) {
    8384                if ( current ) {
    84                     return;
     85                    var dfd = new Deferred();
     86                    dfd.resolved();
     87                    return dfd.promise;
    8588                }
    8689                if ( hash() ) {
    8790                    var hri = new HRI(hash());
    88                     _goTo(hri, true);
     91                    return _goTo(hri, true);
    8992                } else {
    90                     _goTo(new HRI(path,args));
     93                    return _goTo(new HRI(path,args));
    9194                }
    9295            }
    9396
    9497            self.goTo = function(path,args) {
    95                 _goTo(new HRI(path,args));
     98                return _goTo(new HRI(path,args));
    9699            }
    97100
  • Dev/branches/rest-dojo-ui/client/rft/run.js

    r258 r260  
    1 define(['require'], function(require) {
    2     return {};
    3 });
     1require(['dojo/_base/window','dojo/parser', 'rft/ui/LoginDialog',
     2    'dojo/dom', 'dojo/_base/connect', 'rft/auth', 'rft/content',
     3    'dojo/domReady!', 'dijit/layout/ContentPane', 'dijit/MenuBar',
     4    'dijit/MenuBarItem', 'rft/ui/MenuBarLink', 'rft/ui/Page'],
     5    function(win,parser,LoginDialog,dom,connect,auth,content) {
     6        parser.parse();
     7
     8        var login = new LoginDialog().placeAt(document.body);
     9        login.startup();
     10
     11        auth.restore()
     12        .then(function(user){
     13            content.initial();
     14        },function(){
     15            login.show();
     16        });
     17
     18        connect.connect(dom.byId('userinfo'),'click',function(){
     19            login.show();
     20        });
     21    });
  • Dev/branches/rest-dojo-ui/client/rft/ui/LoginDialog.html

    r256 r260  
    66        </span>
    77    </div>
    8     <form data-dojo-type="dijit.form.Form" data-dojo-attach-point="loginForm">
    9         <fieldset>
    10             <label for="username" class="loginLabel">Email</label>
    11             <input data-dojo-type="dijit.form.TextBox" name="username" type="text" class="loginInput" />
    12             <label for="password" class="loginLabel">Password</label>
    13             <input data-dojo-type="dijit.form.TextBox" name="password" type="password" class="loginInput" />
    14         </fieldset>
    15     </form>
    16     <button type="button" data-dojo-type="dijit.form.Button" data-dojo-attach-event="onClick:onLogin">Login</button>
    17     <button type="button" data-dojo-type="dijit.form.Button" data-dojo-attach-event="onClick:onCancel">Cancel</button>
    18     <div data-dojo-attach-point="loginErrors"></div>
    19     <div data-dojo-attach-point="containerNode"></div>
     8    <div data-dojo-attach-point="containerNode">
     9        <form data-dojo-type="dijit.form.Form" data-dojo-attach-point="loginForm">
     10            <fieldset>
     11                <label for="username" class="loginLabel">Email</label>
     12                <input data-dojo-type="dijit.form.TextBox" name="username" type="text" class="loginInput" />
     13                <label for="password" class="loginLabel">Password</label>
     14                <input data-dojo-type="dijit.form.TextBox" name="password" type="password" class="loginInput" />
     15            </fieldset>
     16        </form>
     17        <button type="button" data-dojo-type="dijit.form.Button" data-dojo-attach-event="onClick:onLogin">Login</button>
     18        <button type="button" data-dojo-type="dijit.form.Button" data-dojo-attach-event="onClick:onCancel">Cancel</button>
     19        <div data-dojo-attach-point="loginErrors"></div>
     20    </div>
    2021</div>
  • Dev/branches/rest-dojo-ui/client/rft/ui/LoginDialog.js

    r256 r260  
    88            title: "Login",
    99            baseClass: "rftLoginDialog",
     10            show: function() {
     11                this.loginErrors.innerHTML = '';
     12                this.loginForm.reset();
     13                this.inherited(arguments);
     14            },
    1015            onLogin: function() {
    1116                this.loginErrors.innerHTML = '';
     
    1520                .then(function() {
    1621                    hide();
    17                     content.initial("sessions");
     22                    content.initial();
    1823                },function() {
    1924                    this.loginErrors.innerHTML = 'Login failed.';
  • Dev/branches/rest-dojo-ui/client/rft/ui/Page.js

    r257 r260  
    1 define(['dojo/_base/declare','dijit/_WidgetBase','dijit/_Container'],
    2 function(declare,_WidgetBase,_Container){
    3     return declare('rft.ui.Page',[_WidgetBase,_Container],{
    4         init: function(args){
    5         }
     1define(['dojo/_base/declare','dojo/query','dojo/_base/json','dojo/dom-attr','dojo/_base/lang','dijit/registry','dijit/_WidgetBase','dijit/_Container'],
     2    function(declare,query,json,attr,lang,registry,_WidgetBase,_Container){
     3        return declare('rft.ui.Page',[_WidgetBase,_Container],{
     4            postCreate: function() {
     5                this.inherited(arguments);
     6                this.args = {};
     7                var props = attr.get(this.domNode,'data-rft-props');
     8                if ( props ) {
     9                    props = json.fromJson.call(this,'{'+props+'}');
     10                    lang.mixin(this.args,props);
     11                }
     12            },
     13            startup: function() {
     14                this.inherited(arguments);
     15                query('[data-rft-attach-point]').forEach(lang.hitch(this,function(node){
     16                    var name = attr.get(node,'data-rft-attach-point');
     17                    this[name] = registry.byNode(node) || node;
     18                }));
     19                this.init();
     20            },
     21            init: function(){}
     22        });
    623    });
    7 });
  • Dev/branches/rest-dojo-ui/server/api.php

    r256 r260  
    1212use Tonic\Resource as Resource;
    1313
    14 function restore_session() {
     14function set_session_cookie($response,$user) {
     15    $response->addHeader('Set-Cookie', 'rft_uid=' . $user->uid . '; Max-Age: 3600; Path=' . $response->request->baseUri);
     16}
     17
     18function restore_session($response) {
    1519    if (isset($_COOKIE['rft_uid'])) {
    1620        $user = Auth::restore($_COOKIE['rft_uid']);
    1721        if ($user) {
     22            set_session_cookie($response, $user);
    1823            return $user;
    1924        }
     
    3439        $response = new Response($request);
    3540
    36         if (!empty($request->data)) {
    37             $data = json_decode($request->data);
    38             $user = Auth::login($data->username, sha1($data->password));
    39             if ($user) {
    40                 $response->addHeader('Set-Cookie', 'rft_uid=' . $user->uid . '; Path=' . $request->baseUri);
    41                 $response->body = json_encode($user);
    42             } else {
     41        $user = null;
     42        $data = null;
     43        if ( !empty($request->data) ) {
     44            $data = json_decode($request->data,true);
     45        }
     46        if (!empty($data)) {
     47            $user = Auth::login($data['username'], sha1($data['password']));
     48            if (!$user) {
    4349                throw new ResponseException("Incorrect username and password", Response::UNAUTHORIZED);
    4450            }
    4551        } else {
    46             throw new ResponseException("No login data provided", Response::BADREQUEST);
    47         }
     52            $user = restore_session($response);
     53        }
     54        $response->body = json_encode($user);
    4855        return $response;
    4956    }
     
    6471
    6572    function get($request) {
    66         restore_session();
    67         $response = new Response($request);
     73        $response = new Response($request);
     74        restore_session($response);
    6875
    6976        $type = $this->getType($request);
    70 
    7177        $objects = $type::get(array());
    7278        //$objects = array_map(function($val) { return array('uid' => $val->uid); }, $objects);
     
    7783
    7884    function post($request) {
    79         restore_session();
    80         $response = new Response($request);
     85        $response = new Response($request);
     86        restore_session($response);
    8187
    8288        $type = $this->getType($request);
     
    128134
    129135    function get($request) {
    130         restore_session();
    131         $response = new Response($request);
     136        $response = new Response($request);
     137        restore_session($response);
    132138
    133139        $info = $this->getTypeAndUid($request);
    134 
    135140        $objects = $info['type']::get(array('uid' => $info['uid']));
    136141        if (empty($objects)) {
     
    143148
    144149    function put($request) {
    145         restore_session();
    146         $response = new Response($request);
     150        $response = new Response($request);
     151        restore_session($response);
    147152
    148153        $info = $this->getTypeAndUid($request);
Note: See TracChangeset for help on using the changeset viewer.