Ignore:
Timestamp:
02/28/12 16:19:52 (13 years ago)
Author:
hendrikvanantwerpen
Message:

[Client] Added surveys list and survey details skeleton pages.
[Client] Changed method of passing parameters to pages. This still feels clumsy, because we're working against Dojo a bit with this.
[Server] Integrated REST resources for collections and objects, since they shared more than they differed.

Location:
Dev/branches/rest-dojo-ui
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • Dev/branches/rest-dojo-ui/client/rft/content.js

    r274 r292  
    1919 * this e.g. to ask confirmation of changed values are not saved.
    2020 */
    21 define(['dojo/_base/declare','dojo/_base/connect','dojo/_base/xhr',
    22     'dojo/_base/lang','dojo/_base/Deferred','dojo/hash',
     21define(['dojo/_base/declare','dojo/_base/connect','dojo/_base/xhr','dojo/_base/json',
     22    'dojo/_base/lang','dojo/_base/Deferred','dojo/hash','dojo/dom-attr','dojo/dom-construct',
    2323    'dojo/io-query','dijit','rft/util','rft/ui/_Page'],
    24     function(declare,connect,xhr,lang,Deferred,hash,uriQuery,dijit,util,_Page){
     24    function(declare,connect,xhr,json,lang,Deferred,hash,attr,domConstruct,uriQuery,dijit,util,_Page){
    2525        return new (function() {
    2626            var self = this;
    27             var currentHash = "";
    28             var currentPage = null;
    29            
     27
    3028            var HRI = declare(null,{
    3129                constructor: function() {
     
    7371            });
    7472
     73            var currentHri = null;
     74            var currentPage = null;
     75           
    7576            function _goTo(hri,replace) {
    7677                var contentPane = dijit.byId('content');
    7778                var dfd = new Deferred();
    78                 var newHash = hri.hash();
    7979               
    8080                // if already there, return
    81                 if ( currentHash === newHash ) {
     81                if ( currentHri && currentHri.hash() === hri.hash() ) {
    8282                    dfd.resolve();
    8383                    return dfd.promise;
     
    8888                    if ( currentPage.onLeave() === false ) {
    8989                        // restore hash if changed by hand or back button
    90                         hash(currentHash);
     90                        hash(currentHri.hash());
    9191                        dfd.reject();
    9292                        return dfd.promise;
     
    9595                }
    9696               
     97                function mixinArgs(node) {
     98                    var props = {};
     99                    if ( attr.has(node,'data-dojo-props') ) {
     100                        props = json.fromJson(attr.get(node,'data-dojo-props'));
     101                    }
     102                    lang.mixin(props,{pageArgs:hri.args()});
     103                    var jsonStr = json.toJson(props);
     104                    attr.set(node,'data-dojo-props',jsonStr.slice(1,jsonStr.length-1));
     105                }
     106               
    97107                // update hash
    98                 currentHash = newHash;
    99                 hash(newHash,replace);
     108                currentHri = hri;
     109                hash(hri.hash(),replace);
    100110               
    101111                // load html
     
    108118                // initialize page or create error message
    109119                .then(function(html){
    110                     contentPane.set('content',html);
    111                     var rootNode = contentPane.containerNode.firstChild;
     120                    var rootNode = domConstruct.toDom(html);
     121                    mixinArgs(rootNode);
     122                    contentPane.set('content',rootNode);
    112123                    currentPage = dijit.byNode(rootNode);
    113124                    if ( !currentPage ) {
     
    123134
    124135            self.initial = function(path,args) {
    125                 if ( currentHash ) {
     136                if ( currentHri ) {
    126137                    var dfd = new Deferred();
    127138                    dfd.resolve();
     
    140151            }
    141152
     153            self.getArgs = function() {
     154                if ( currentHri ) {
     155                    return currentHri.args();
     156                } else {
     157                    return {};
     158                }
     159            }
     160
    142161            connect.subscribe('/dojo/hashchange', function(){
    143162                _goTo(new HRI(hash()));
  • Dev/branches/rest-dojo-ui/client/rft/run.js

    r288 r292  
    2020    'dijit/form/Button',
    2121    'dijit/form/Textarea',
     22    'dijit/form/SimpleTextarea',
    2223    'dijit/form/ComboBox',
    2324    'dijit/form/Select',
     
    3132   
    3233    // pages -> load dynamically?
    33     'rft/pages/questions'],
     34    'rft/pages/questions',
     35    'rft/pages/surveys',
     36    'rft/pages/survey',
     37    ],
    3438    function(win,parser,LoginDialog,dom,connect,auth,content) {
    3539        parser.parse();
  • Dev/branches/rest-dojo-ui/client/rft/ui/_Page.js

    r288 r292  
    1 define(['dojo/_base/declare','dojo/_base/lang','dojo/_base/array','dojo/parser',
    2     'dojo/query','dojo/dom-attr','dojo/_base/connect','dijit','dijit/_WidgetBase',
    3     'dijit/_Container','dijit/_Contained'],
    4     function(declare,lang,array,parser,query,attr,connect,dijit,_WidgetBase,_Container,_Contained){
     1define(['dojo/_base/declare','dojo/_base/lang','dojo/parser','dojo/query',
     2    'dojo/dom-attr','dijit','dijit/_WidgetBase'],
     3    function(declare,lang,parser,query,attr,dijit,_WidgetBase){
    54        return declare('rft.ui._Page',[_WidgetBase],{
    65            startup: function() {
  • Dev/branches/rest-dojo-ui/server/api.php

    r275 r292  
    7474            set_session_cookie($response, $user);
    7575        } else {
    76             throw new ResponseException("No email and password provided.",Response::BADREQUEST);
     76            throw new ResponseException("No email and password provided.", Response::BADREQUEST);
    7777        }
    7878        $response->body = $user;
     
    8383
    8484/**
    85  * @uri /data/\w+
     85 * @uri /data/\w+(/\w+)?
    8686 */
    87 class DataCollectionResource extends Resource {
    88 
    89     function getType($request) {
     87class DataResource extends Resource {
     88
     89    function getTypeAndUid($request) {
    9090        $uri = get_clean_uri($request);
    9191        $path = explode('/', $uri);
    92         $type = $path[2];
    93         return $type;
     92
     93        $info = array();
     94        $info['type'] = $path[2];
     95        if (isset($path[3])) {
     96            $info['uid'] = $path[3];
     97        }
     98       
     99        return $info;
    94100    }
    95101
     
    98104        restore_session($response);
    99105
    100         $type = $this->getType($request);
    101         $objects = $type::get(array());
    102 
    103         $response->body = $objects;
     106        $info = $this->getTypeAndUid($request);
     107        if (isset($info['uid'])) {
     108            $objects = $info['type']::get(array('uid' => $info['uid']));
     109            if (empty($objects)) {
     110                throw new ResponseException("Object not found", Response::NOTFOUND);
     111            }
     112            $response->body = $objects[0];
     113        } else {
     114            $objects = $info['type']::get(array());
     115            $response->body = $objects;
     116        }
     117
    104118        return $response;
    105119    }
     
    107121    function post($request) {
    108122        $response = new Response($request);
    109         restore_session($response);
    110 
    111         $type = $this->getType($request);
     123        $user = restore_session($response);
     124
     125        $info = $this->getTypeAndUid($request);
    112126        $onlyAdd = $request->ifNoneMatch('*');
    113127        $onlyUpdate = $request->ifMatch('*');
    114128
    115         $object = FALSE;
    116         if (isset($request->data->uid)) {
    117             $objects = $type::get(array('uid' => $request->data->uid));
     129        $uid = null;
     130        if (isset($info['uid'])) {
     131            $uid = $info['uid'];
     132        } else if (isset($request->data->uid)) {
     133            $uid = $request->data->uid;
     134        }
     135
     136        $object = null;
     137        if ($uid) {
     138            $objects = $info['type']::get(array('uid' => $uid));
    118139            if (!empty($objects)) {
    119140                $object = $objects[0];
     
    126147
    127148        if (!$object) {
    128             $object = new $type(null);
     149            $object = new $info['type']($uid);
    129150            $response->code = Response::CREATED;
    130151        } else {
     
    134155            $object->$key = $val;
    135156        }
    136         if (!$object->save()) {
    137             throw new ResponseException("Save failed", Response::INTERNALSERVERERROR);
    138         }
    139 
    140         $response->body = $object;
    141         return $response;
    142     }
    143 
    144     function put($request) {
    145         return $this->post($request);
    146     }
    147    
    148 }
    149 
    150 /**
    151  * @uri /data/\w+/\w+
    152  */
    153 class DataObjectResource extends Resource {
    154 
    155     function getTypeAndUid($request) {
    156         $uri = get_clean_uri($request);
    157         $path = explode('/', $uri);
    158         $type = $path[2];
    159         $uid = $path[3];
    160         return array('type' => $type, 'uid' => $uid);
    161     }
    162 
    163     function get($request) {
    164         $response = new Response($request);
    165         restore_session($response);
    166 
    167         $info = $this->getTypeAndUid($request);
    168         $objects = $info['type']::get(array('uid' => $info['uid']));
    169         if (empty($objects)) {
    170             throw new ResponseException("Object not found", Response::NOTFOUND);
    171         }
    172 
    173         $response->body = $objects[0];
    174         return $response;
    175     }
    176 
    177     function post($request) {
    178         $response = new Response($request);
    179         restore_session($response);
    180 
    181         $info = $this->getTypeAndUid($request);
    182         $onlyAdd = $request->ifNoneMatch('*');
    183         $onlyUpdate = $request->ifMatch('*');
    184 
    185         $object = FALSE;
    186         $objects = $info['type']::get(array('uid' => $info['uid']));
    187         if (!empty($objects)) {
    188             $object = $objects[0];
    189         }
    190 
    191         if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
    192             throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
    193         }
    194 
    195         if (!$object) {
    196             $object = new $info['type']($info->uid);
    197             $response->code = Response::CREATED;
    198         } else {
    199             $response->code = Response::OK;
    200         }
    201         foreach ($request->data as $key => $val) {
    202             $object->$key = $val;
     157        if (isset($object->creator)) {
     158            $object->creator = $user;
    203159        }
    204160        if (!$object->save()) {
Note: See TracChangeset for help on using the changeset viewer.