Adds preferences to Admin.
Project: http://git-wip-us.apache.org/repos/asf/rave/repo Commit: http://git-wip-us.apache.org/repos/asf/rave/commit/c855ead0 Tree: http://git-wip-us.apache.org/repos/asf/rave/tree/c855ead0 Diff: http://git-wip-us.apache.org/repos/asf/rave/diff/c855ead0 Branch: refs/heads/angular Commit: c855ead09d6efdf65a2cd921abc68b21a44c1c57 Parents: e1f69e1 Author: Jmeas <[email protected]> Authored: Thu Aug 7 16:10:09 2014 -0400 Committer: Jmeas <[email protected]> Committed: Thu Aug 7 16:18:42 2014 -0400 ---------------------------------------------------------------------- rave-portal-ng/mock-api/bootstrap.js | 5 +- .../database/import-data/preferences.js | 36 +++--- .../mock-api/modules/preference/get.js | 46 -------- .../mock-api/modules/preference/put.js | 76 ------------ .../mock-api/modules/preferences/get.js | 14 +-- .../mock-api/modules/preferences/put.js | 56 +++++++++ rave-portal-ng/src/subapps/admin/admin.js | 8 ++ .../admin/categories/resources/categories.js | 3 +- .../preferences/controllers/preferences.js | 47 ++++++++ .../admin/preferences/detail/detail.html | 80 ------------- .../subapps/admin/preferences/preferences.html | 118 ++++++++++--------- .../admin/preferences/resources/preferences.js | 25 ++++ .../src/subapps/admin/preferences/routes.js | 5 - 13 files changed, 230 insertions(+), 289 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/mock-api/bootstrap.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/bootstrap.js b/rave-portal-ng/mock-api/bootstrap.js index 98025b0..3a7cf5a 100644 --- a/rave-portal-ng/mock-api/bootstrap.js +++ b/rave-portal-ng/mock-api/bootstrap.js @@ -38,10 +38,7 @@ define(function(require) { // preferences require('./modules/preferences/get.js'); - - // preference - require('./modules/preference/get.js'); - require('./modules/preference/put.js'); + require('./modules/preferences/put.js'); // pages require('./modules/pages/get.js'); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/mock-api/database/import-data/preferences.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/database/import-data/preferences.js b/rave-portal-ng/mock-api/database/import-data/preferences.js index 18529bc..a885fa8 100644 --- a/rave-portal-ng/mock-api/database/import-data/preferences.js +++ b/rave-portal-ng/mock-api/database/import-data/preferences.js @@ -3,32 +3,38 @@ define(function(require) { return [ { - 'key': 'titleSuffix', - 'values': [ ' - Rave' ] + key: 'titleSuffix', + value: ' - Rave' }, + { - 'key': 'pageSize', - 'values': [ 10 ] + key: 'pageSize', + value: 10 }, + { - 'key': 'defaultWidgetHeight', - 'values': [ 250 ] + key: 'defaultWidgetHeight', + value: 250 }, + { - 'key': 'javaScriptDebugMode', - 'values': [ 1 ] + key: 'showStackTrace', + value: 0 }, + { - 'key': 'showStackTrace', - 'values': [ 1 ] + key: 'javascriptDebugMode', + value: 0 }, + { - 'key': 'initialWidgetStatus', - 'values': [ 'PREVIEW' ] + key: 'initialWidgetStatus', + value: 'preview' }, + { - 'key': 'externalMarketplaceUrl', - 'values': [ '' ] + key: 'externalMarketplaceUrl', + value: '' } ]; -}); \ No newline at end of file +}); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/mock-api/modules/preference/get.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/modules/preference/get.js b/rave-portal-ng/mock-api/modules/preference/get.js deleted file mode 100644 index 1d1c384..0000000 --- a/rave-portal-ng/mock-api/modules/preference/get.js +++ /dev/null @@ -1,46 +0,0 @@ -define(function(require) { - 'use strict'; - - var api = require('../../core.js'); - require('underscore/underscore'); - - function getPreferencesByKey(key) { - var results = api.db.query('preferences', { - key: key - }); - - if (results.length === 1) { - results = results[0]; - if (results.values.length === 1) { - results.values = results.values[0]; - } - return results; - } - return false; - } - - function processRequest(method, url, data, headers) { - if (method !== 'GET') { - return [405, 'Unknown request']; - } else if (!this.requestHasToken) { - return [401, 'A valid token is required']; - } else if (!this.userIsAuthenticated) { - return [401, 'Invalid token']; - } - - var preferenceKey = url.replace('/api/v1/preference/', ''); - if (!_.isString(preferenceKey)) { - return [400, 'Invalid category ID']; - } - - var preference = getPreferencesByKey(preferenceKey); - if (!preference) { - return [404, 'Preference does not exist']; - } - - return [200, preference]; - } - - api.register('/preference/:key', 'get', processRequest); - -} ); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/mock-api/modules/preference/put.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/modules/preference/put.js b/rave-portal-ng/mock-api/modules/preference/put.js deleted file mode 100644 index f48bd64..0000000 --- a/rave-portal-ng/mock-api/modules/preference/put.js +++ /dev/null @@ -1,76 +0,0 @@ -define(function(require) { - 'use strict'; - - var api = require('../../core.js'); - require('underscore/underscore'); - - function preferenceExists(key) { - var results = api.db.query('preferences', { - key: key - }); - - if (results.length === 1) { - return true; - } - return false; - } - - function updatePreference(key, values) { - var searchParams = { - key: key - }; - - if (!_.isArray(values)) { - values = [values]; - } - - api.db.update('preferences', searchParams, function(row) { - row.values = values; - return row; - }); - - var results = api.db.query('preferences', searchParams); - if (results.length === 1) { - results = results[0]; - if (results.values.length === 1) { - results.values = results.values[0]; - } - return results; - } - - return false; - } - - function processRequest(method, url, data, headers) { - if (method !== 'PUT') { - return [405, 'Unknown request']; - } else if (!this.requestHasToken) { - return [401, 'A valid token is required']; - } else if (!this.userIsAuthenticated) { - return [401, 'Invalid token']; - } - - var preferenceKey = url.replace('/api/v1/preference/', ''); - if (!_.isString(preferenceKey)) { - return [400, 'Invalid category ID']; - } else if (!preferenceExists(preferenceKey)) { - return [404, 'Preference does not exist']; - } - - data = angular.fromJson(data); - - if (!data.values) { - return [400, 'Missing values field']; - } - - var updatedPreference = updatePreference(preferenceKey, data.values); - if (!updatedPreference) { - return [500, 'An internal database error has occurred']; - } - - return [200, updatedPreference]; - } - - api.register('/preference/:key', 'put', processRequest); - -} ); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/mock-api/modules/preferences/get.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/modules/preferences/get.js b/rave-portal-ng/mock-api/modules/preferences/get.js index 5aed581..4928b37 100644 --- a/rave-portal-ng/mock-api/modules/preferences/get.js +++ b/rave-portal-ng/mock-api/modules/preferences/get.js @@ -6,13 +6,13 @@ define(function(require) { function getPreferences() { var results = api.db.query('preferences'); - results = _.map(results, function(item) { - if (item.values.length === 1) { - item.values = item.values[0]; - } - return item; + var preferences = {}; + + _.each(results, function(item) { + preferences[item.key] = item.value; }); - return results; + + return preferences; } function processRequest(method, url, data, headers) { @@ -29,4 +29,4 @@ define(function(require) { api.register('/preferences', 'get', processRequest); -} ); \ No newline at end of file +} ); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/mock-api/modules/preferences/put.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/modules/preferences/put.js b/rave-portal-ng/mock-api/modules/preferences/put.js new file mode 100644 index 0000000..845a894 --- /dev/null +++ b/rave-portal-ng/mock-api/modules/preferences/put.js @@ -0,0 +1,56 @@ +define(function(require) { + 'use strict'; + + var api = require('../../core.js'); + require('underscore/underscore'); + + function updatePreferences(data) { + var searchParams; + + // Loop through each data point, updating the corresponding preference + // in the database. + _.each(data, function(value, key) { + searchParams = { + key: key + }; + api.db.update('preferences', searchParams, function(row) { + row.value = value; + return row; + }); + }); + api.db.commit(); + + // This is exactly what we do in the GET method. We might + // want to DRY this up, but it's a mock API so no big deal. + var results = api.db.query('preferences'); + var preferences = {}; + + _.each(results, function(item) { + preferences[item.key] = item.value; + }); + + return preferences; + } + + function processRequest(method, url, data, headers) { + if (method !== 'PUT') { + return [405, 'Unknown request']; + } else if (!this.requestHasToken) { + return [401, 'A valid token is required']; + } else if (!this.userIsAuthenticated) { + return [401, 'Invalid token']; + } + + data = angular.fromJson(data); + + var updatedPreferences = updatePreferences(data); + if (!updatedPreferences) { + return [500, 'An internal database error has occurred']; + } + + return [200, updatedPreferences]; + } + + api.register('/preferences', 'put', processRequest); + +} ); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/admin.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/admin.js b/rave-portal-ng/src/subapps/admin/admin.js index 11aa80d..0cc1ebe 100644 --- a/rave-portal-ng/src/subapps/admin/admin.js +++ b/rave-portal-ng/src/subapps/admin/admin.js @@ -3,6 +3,7 @@ define(function(require) { var admin = angular.module('admin', ['ngResource']); + // Categories var categoriesResource = require('./categories/resources/categories'); admin.factory('categoriesResource', categoriesResource); @@ -15,5 +16,12 @@ define(function(require) { var categoryCtrl = require('./categories/controllers/category'); admin.controller('categoryCtrl', categoryCtrl); + // Preferences + var preferencesResource = require('./preferences/resources/preferences'); + admin.factory('preferencesResource', preferencesResource); + + var preferencesCtrl = require('./preferences/controllers/preferences'); + admin.controller('preferencesCtrl', preferencesCtrl); + return admin; }); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/categories/resources/categories.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/categories/resources/categories.js b/rave-portal-ng/src/subapps/admin/categories/resources/categories.js index c52305d..f79b644 100644 --- a/rave-portal-ng/src/subapps/admin/categories/resources/categories.js +++ b/rave-portal-ng/src/subapps/admin/categories/resources/categories.js @@ -20,8 +20,7 @@ define(function(require) { method: 'GET', isArray: true, headers: authHeader - }, - + } }); }]; }); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/preferences/controllers/preferences.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/preferences/controllers/preferences.js b/rave-portal-ng/src/subapps/admin/preferences/controllers/preferences.js new file mode 100644 index 0000000..62942c9 --- /dev/null +++ b/rave-portal-ng/src/subapps/admin/preferences/controllers/preferences.js @@ -0,0 +1,47 @@ +define(function(require) { + var _ = require('underscore'); + + // Our list of preferences. You must put any + // new preferences here for Angular to auto-update + // the ng-model. + var preferences = [ + 'titleSuffix', + 'pageSize', + 'defaultWidgetHeight', + 'showStackTrace', + 'initialWidgetStatus', + 'externalMarketplaceUrl', + 'javascriptDebugMode' + ]; + + return ['$scope', 'preferencesResource', + function($scope, preferencesResource) { + + // Create our preferences object on the scope. + $scope.preferences = {}; + + // Try to get the current preferences to show the user + $scope.currentPreferences = preferencesResource.get(); + $scope.currentPreferences.$promise + .then(function(res) { + var currentPrefs = _.pick(res, preferences); + _.each(currentPrefs, function(value, key) { + $scope.preferences[key] = value; + }); + }) + .catch(function() { + }); + + $scope.onSubmit = function() { + var updatedPreferences = preferencesResource.update( + $scope.preferences + ); + updatedPreferences.$promise + .then(function(res) { + + }) + .catch(function(err) { + }); + }; + }]; +}); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/preferences/detail/detail.html ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/preferences/detail/detail.html b/rave-portal-ng/src/subapps/admin/preferences/detail/detail.html deleted file mode 100644 index a76d8d5..0000000 --- a/rave-portal-ng/src/subapps/admin/preferences/detail/detail.html +++ /dev/null @@ -1,80 +0,0 @@ -<a ui-sref="portal.admin.preferences">« Back to overview</a> -<h2>Preferences</h2> - -<section class="span10"> - <form id="preferenceForm" class="form-horizontal" action="/portal/app/admin/preferencedetail/update" method="POST"> - <p>Field marked with * are required</p> - <div class="control-group"> - <label for="titleSuffix.value" class="control-label"> - Page title suffix - </label> - <div class="controls"> - <input id="titleSuffix.value" name="titleSuffix.value" type="text" value=" - Rave"> - </div> - </div> - <div class="control-group"> - <label for="pageSize" class="control-label"> - Number of items per page (list) * - </label> - <div class="controls"> - <input id="pageSize" name="pageSize.value" type="number" step="1" value="10"> - </div> - </div> - <div class="control-group"> - <label for="defaultWidgetHeight" class="control-label"> - Default widget height * - </label> - <div class="controls"> - <input id="defaultWidgetHeight" name="defaultWidgetHeight.value" type="number" step="1" value="250"> - </div> - </div> - <div class="control-group"> - <label for="javaScriptDebugMode.value" class="control-label"> - JavaScript Debug Mode * - </label> - <div class="controls"> - <select id="javaScriptDebugMode" name="javaScriptDebugMode.value"> - <option value="0">Disabled</option> - <option value="1" selected="selected">Enabled</option> - </select> - </div> - </div> - <div class="control-group"> - <label for="showStackTrace.value" class="control-label"> - Show stack trace on error pages * - </label> - <div class="controls"> - <select id="showStackTrace" name="showStackTrace.value"> - <option value="0" selected="selected">Disabled</option> - <option value="1">Enabled</option> - </select> - </div> - </div> - <div class="control-group"> - <label for="initialWidgetStatus.value" class="control-label"> - Initial status to use for new widgets * - </label> - <div class="controls"> - <select id="initialWidgetStatus" name="initialWidgetStatus.value"> - <option value="PREVIEW" selected="selected"> - PREVIEW - </option> - <option value="PUBLISHED"> - PUBLISHED - </option> - </select> - </div> - </div> - <div class="control-group"> - <label for="externalMarketplaceUrl.value" class="control-label"> - Location (URL) of external widget marketplace - </label> - <div class="controls"> - <input id="externalMarketplaceUrl.value" name="externalMarketplaceUrl.value" type="text" value=""> - </div> - </div> - <fieldset> - <button class="btn btn-primary" type="submit" value="Update preferences">Update preferences</button> - </fieldset> - </form> -</section> http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/preferences/preferences.html ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/preferences/preferences.html b/rave-portal-ng/src/subapps/admin/preferences/preferences.html index 453e23e..9c7027d 100644 --- a/rave-portal-ng/src/subapps/admin/preferences/preferences.html +++ b/rave-portal-ng/src/subapps/admin/preferences/preferences.html @@ -1,57 +1,67 @@ <article ui-view> <h2>Preferences</h2> - <table class="table table-striped table-bordered table-condensed"> - <tbody> - <tr> - <th scope="row"> - <a ui-sref="portal.admin.preferences.detail">JavaScript Debug Mode</a> - </th> - <td> - <ul> - <li>1</li> - </ul> - </td> - </tr> - <tr> - <th scope="row"> - <a ui-sref="portal.admin.preferences.detail">Default widget height</a> - </th> - <td> - <ul> - <li>250</li> - </ul> - </td> - </tr> - <tr> - <th scope="row"> - <a ui-sref="portal.admin.preferences.detail">Number of items per page (list)</a> - </th> - <td> - <ul> - <li>10</li> - </ul> - </td> - </tr> - <tr> - <th scope="row"> - <a ui-sref="portal.admin.preferences.detail">Show stack trace on error pages</a> - </th> - <td> - <ul> - <li>0</li> - </ul> - </td> - </tr> - <tr> - <th scope="row"> - <a ui-sref="portal.admin.preferences.detail">Page title suffix</a> - </th> - <td> - <ul> - <li> - Rave</li> - </ul> - </td> - </tr> - </tbody> - </table> + <form id="preferenceForm" class="form-horizontal" ng-controller="preferencesCtrl"> + <p>Field marked with * are required</p> + <div class="control-group"> + <label for="titleSuffix.value" class="control-label"> + Page title suffix + </label> + <div class="controls"> + <input id="titleSuffix.value" name="titleSuffix.value" type="text" ng-model="preferences.titleSuffix"> + </div> + </div> + <div class="control-group"> + <label for="pageSize" class="control-label"> + Number of items per page (list) * + </label> + <div class="controls"> + <input id="pageSize" name="pageSize.value" type="number" step="1" ng-model="preferences.pageSize"> + </div> + </div> + <div class="control-group"> + <label for="defaultWidgetHeight" class="control-label"> + Default widget height * + </label> + <div class="controls"> + <input id="defaultWidgetHeight" name="defaultWidgetHeight.value" type="number" step="1" ng-model="preferences.defaultWidgetHeight"> + </div> + </div> + <div class="control-group"> + <label for="javaScriptDebugMode.value" class="control-label"> + JavaScript Debug Mode * + </label> + <div class="controls"> + <select id="javaScriptDebugMode" name="javaScriptDebugMode.value" ng-model="preferences.javascriptDebugMode"> + <option value="0">Disabled</option> + <option value="1">Enabled</option> + </select> + </div> + </div> + <div class="control-group"> + <label for="initialWidgetStatus.value" class="control-label"> + Initial status to use for new widgets * + </label> + <div class="controls"> + <select id="initialWidgetStatus" name="initialWidgetStatus.value" ng-model="preferences.initialWidgetStatus"> + <option value="preview"> + Preview + </option> + <option value="published"> + Published + </option> + </select> + </div> + </div> + <div class="control-group"> + <label for="externalMarketplaceUrl.value" class="control-label"> + Location (URL) of external widget marketplace + </label> + <div class="controls"> + <input id="externalMarketplaceUrl.value" name="externalMarketplaceUrl.value" type="text" ng-model="preferences.externalMarketplaceUrl"> + </div> + </div> + <fieldset> + <button class="btn btn-primary" ng-click="onSubmit()">Update preferences</button> + </fieldset> + </form> </article> http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/preferences/resources/preferences.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/preferences/resources/preferences.js b/rave-portal-ng/src/subapps/admin/preferences/resources/preferences.js new file mode 100644 index 0000000..c068227 --- /dev/null +++ b/rave-portal-ng/src/subapps/admin/preferences/resources/preferences.js @@ -0,0 +1,25 @@ +define(function(require) { + + // The API endpoint for categories + var URL = '/api/v1/preferences'; + + // Return the categories resource + return ['$resource', 'authToken', + function($resource, authToken) { + var authHeader = { + Authorization: 'Basic ' + authToken.get() + }; + + return $resource(URL, {}, { + get: { + method: 'GET', + headers: authHeader + }, + + update: { + method: 'PUT', + headers: authHeader + }, + }); + }]; +}); http://git-wip-us.apache.org/repos/asf/rave/blob/c855ead0/rave-portal-ng/src/subapps/admin/preferences/routes.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/preferences/routes.js b/rave-portal-ng/src/subapps/admin/preferences/routes.js index 27a8ee8..1fc9768 100644 --- a/rave-portal-ng/src/subapps/admin/preferences/routes.js +++ b/rave-portal-ng/src/subapps/admin/preferences/routes.js @@ -10,11 +10,6 @@ define(function(require) { url: '/preferences', templateUrl: '/subapps/admin/preferences/preferences.html', authenticate: true - }) - .state('portal.admin.preferences.detail', { - url: '/preferences/detail', - templateUrl: '/subapps/admin/preferences/detail/detail.html', - authenticate: true }); } ]);
