From 578583da59cd330ed58f583973684c92b9b7ae9e Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 29 Mar 2013 17:17:36 +0100 Subject: [PATCH] admin interface --- .../commafeed/frontend/pages/HomePage.java | 2 + .../references/nggrid/NGGridReference.java | 35 + .../references/nggrid/ng-grid-2.0.2.js | 3185 +++++++++++++++++ .../references/nggrid/ng-grid-2.0.2.min.js | 2 + .../frontend/references/nggrid/ng-grid.css | 472 +++ .../frontend/rest/RESTApplication.java | 4 +- .../{AdminREST.java => AdminUsersREST.java} | 6 +- src/main/webapp/js/controllers.js | 11 +- src/main/webapp/js/main.js | 3 +- src/main/webapp/js/services.js | 16 +- src/main/webapp/templates/admin.users.html | 4 +- 11 files changed, 3730 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/commafeed/frontend/references/nggrid/NGGridReference.java create mode 100644 src/main/java/com/commafeed/frontend/references/nggrid/ng-grid-2.0.2.js create mode 100644 src/main/java/com/commafeed/frontend/references/nggrid/ng-grid-2.0.2.min.js create mode 100644 src/main/java/com/commafeed/frontend/references/nggrid/ng-grid.css rename src/main/java/com/commafeed/frontend/rest/resources/{AdminREST.java => AdminUsersREST.java} (88%) diff --git a/src/main/java/com/commafeed/frontend/pages/HomePage.java b/src/main/java/com/commafeed/frontend/pages/HomePage.java index 05366746..20b7c8cd 100644 --- a/src/main/java/com/commafeed/frontend/pages/HomePage.java +++ b/src/main/java/com/commafeed/frontend/pages/HomePage.java @@ -14,6 +14,7 @@ import com.commafeed.frontend.references.angularuibootstrap.AngularUIBootstrapRe import com.commafeed.frontend.references.angularuistate.AngularUIStateReference; import com.commafeed.frontend.references.csstreeview.CssTreeViewReference; import com.commafeed.frontend.references.mousetrap.MouseTrapReference; +import com.commafeed.frontend.references.nggrid.NGGridReference; import com.commafeed.frontend.references.nginfinitescroll.NGInfiniteScrollReference; import com.commafeed.frontend.references.ngupload.NGUploadReference; import com.commafeed.frontend.references.select2.Select2Reference; @@ -37,6 +38,7 @@ public class HomePage extends BasePage { Select2Reference.renderHead(response); SpinJSReference.renderHead(response); MouseTrapReference.renderHead(response); + NGGridReference.renderHead(response); CssTreeViewReference.renderHead(response); diff --git a/src/main/java/com/commafeed/frontend/references/nggrid/NGGridReference.java b/src/main/java/com/commafeed/frontend/references/nggrid/NGGridReference.java new file mode 100644 index 00000000..a49a14af --- /dev/null +++ b/src/main/java/com/commafeed/frontend/references/nggrid/NGGridReference.java @@ -0,0 +1,35 @@ +package com.commafeed.frontend.references.nggrid; + +import java.util.Arrays; + +import org.apache.wicket.markup.head.CssHeaderItem; +import org.apache.wicket.markup.head.HeaderItem; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; +import org.apache.wicket.request.resource.CssResourceReference; +import org.apache.wicket.request.resource.JavaScriptResourceReference; + +import com.commafeed.frontend.references.angular.AngularReference; + +public class NGGridReference extends JavaScriptResourceReference { + private static final long serialVersionUID = 1L; + + public static final NGGridReference INSTANCE = new NGGridReference(); + + private NGGridReference() { + super(NGGridReference.class, "ng-grid-2.0.2.js"); + } + + @SuppressWarnings("unchecked") + @Override + public Iterable getDependencies() { + return Arrays.asList(JavaScriptHeaderItem + .forReference(AngularReference.INSTANCE), CssHeaderItem + .forReference(new CssResourceReference(NGGridReference.class, + "ng-grid.css"))); + } + + public static void renderHead(final IHeaderResponse response) { + response.render(JavaScriptHeaderItem.forReference(INSTANCE)); + } +} \ No newline at end of file diff --git a/src/main/java/com/commafeed/frontend/references/nggrid/ng-grid-2.0.2.js b/src/main/java/com/commafeed/frontend/references/nggrid/ng-grid-2.0.2.js new file mode 100644 index 00000000..7c95af76 --- /dev/null +++ b/src/main/java/com/commafeed/frontend/references/nggrid/ng-grid-2.0.2.js @@ -0,0 +1,3185 @@ +/*********************************************** +* ng-grid JavaScript Library +* Authors: https://github.com/angular-ui/ng-grid/blob/master/README.md +* License: MIT (http://www.opensource.org/licenses/mit-license.php) +* Compiled At: 03/08/2013 17:03 +***********************************************/ +(function(window) { +'use strict'; +// the # of rows we want to add to the top and bottom of the rendered grid rows +var EXCESS_ROWS = 6; +var SCROLL_THRESHOLD = 4; +var ASC = "asc"; +// constant for sorting direction +var DESC = "desc"; +// constant for sorting direction +var NG_FIELD = '_ng_field_'; +var NG_DEPTH = '_ng_depth_'; +var NG_HIDDEN = '_ng_hidden_'; +var NG_COLUMN = '_ng_column_'; +var CUSTOM_FILTERS = /CUSTOM_FILTERS/g; +var COL_FIELD = /COL_FIELD/g; +var DISPLAY_CELL_TEMPLATE = /DISPLAY_CELL_TEMPLATE/g; +var EDITABLE_CELL_TEMPLATE = /EDITABLE_CELL_TEMPLATE/g; +var TEMPLATE_REGEXP = /<.+>/; +if (!window.ng) { + window.ng = {}; +} +window.ngGrid = {}; +window.ngGrid.i18n = {}; + +// Declare app level module which depends on filters, and services +var ngGridServices = angular.module('ngGrid.services', []); +var ngGridDirectives = angular.module('ngGrid.directives', []); +var ngGridFilters = angular.module('ngGrid.filters', []); +// initialization of services into the main module +angular.module('ngGrid', ['ngGrid.services', 'ngGrid.directives', 'ngGrid.filters']); +//set event binding on the grid so we can select using the up/down keys +ng.moveSelectionHandler = function($scope, elm, evt, grid) { + if ($scope.selectionService.selectedItems === undefined) { + return true; + } + var charCode = evt.which || evt.keyCode, + newColumnIndex, + lastInRow = false, + firstInRow = false, + rowIndex = $scope.selectionService.lastClickedRow.rowIndex; + + if ($scope.col) { + newColumnIndex = $scope.col.index; + } + if(charCode != 37 && charCode != 38 && charCode != 39 && charCode != 40 && charCode != 9 && charCode != 13){ + return true; + } + + if($scope.enableCellSelection){ + if(charCode == 9){ //tab key + evt.preventDefault(); + } + var focusedOnFirstColumn = $scope.showSelectionCheckbox ? $scope.col.index == 1 : $scope.col.index == 0; + var focusedOnFirstVisibleColumns = $scope.$index == 1 || $scope.$index == 0; + var focusedOnLastVisibleColumns = $scope.$index == ($scope.renderedColumns.length - 1) || $scope.$index == ($scope.renderedColumns.length - 2); + var focusedOnLastColumn = $scope.col.index == ($scope.columns.length - 1); + + if(charCode == 37 || charCode == 9 && evt.shiftKey){ + if (focusedOnFirstVisibleColumns) { + if(focusedOnFirstColumn && charCode == 9 && evt.shiftKey){ + grid.$viewport.scrollLeft(grid.$canvas.width()); + newColumnIndex = $scope.columns.length - 1; + firstInRow = true; + } else { + grid.$viewport.scrollLeft(grid.$viewport.scrollLeft() - $scope.col.width); + } + } + if(!focusedOnFirstColumn){ + newColumnIndex -= 1; + } + } else if(charCode == 39 || charCode == 9 && !evt.shiftKey){ + if (focusedOnLastVisibleColumns) { + if(focusedOnLastColumn && charCode == 9 && !evt.shiftKey){ + grid.$viewport.scrollLeft(0); + newColumnIndex = $scope.showSelectionCheckbox ? 1 : 0; + lastInRow = true; + } else { + grid.$viewport.scrollLeft(grid.$viewport.scrollLeft() + $scope.col.width); + } + } + if(!focusedOnLastColumn){ + newColumnIndex += 1; + } + } + } + + var items; + if ($scope.configGroups.length > 0) { + items = grid.rowFactory.parsedData.filter(function (row) { + return !row.isAggRow; + }); + } else { + items = grid.filteredRows; + } + + var offset = 0; + if(rowIndex != 0 && (charCode == 38 || charCode == 13 && evt.shiftKey || charCode == 9 && evt.shiftKey && firstInRow)){ //arrow key up or shift enter or tab key and first item in row + offset = -1; + } else if(rowIndex != items.length - 1 && (charCode == 40 || charCode == 13 && !evt.shiftKey || charCode == 9 && lastInRow)){//arrow key down, enter, or tab key and last item in row? + offset = 1; + } + + if (offset) { + var r = items[rowIndex + offset]; + if (r.beforeSelectionChange(r, evt)) { + r.continueSelection(evt); + $scope.$emit('ngGridEventDigestGridParent'); + + if ($scope.selectionService.lastClickedRow.renderedRowIndex >= $scope.renderedRows.length - EXCESS_ROWS - 2) { + grid.$viewport.scrollTop(grid.$viewport.scrollTop() + $scope.rowHeight); + } else if ($scope.selectionService.lastClickedRow.renderedRowIndex <= EXCESS_ROWS + 2) { + grid.$viewport.scrollTop(grid.$viewport.scrollTop() - $scope.rowHeight); + } + } + } + + if($scope.enableCellSelection){ + setTimeout(function(){ + $scope.domAccessProvider.focusCellElement($scope, $scope.renderedColumns.indexOf($scope.columns[newColumnIndex])); + },3); + } + return false; +}; + +if (!String.prototype.trim) { + String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, ''); + }; +} +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(elt /*, from*/) { + var len = this.length >>> 0; + var from = Number(arguments[1]) || 0; + from = (from < 0) ? Math.ceil(from) : Math.floor(from); + if (from < 0) { + from += len; + } + for (; from < len; from++) { + if (from in this && this[from] === elt) { + return from; + } + } + return -1; + }; +} +if (!Array.prototype.filter) { + Array.prototype.filter = function(fun /*, thisp */) { + "use strict"; + var t = Object(this); + var len = t.length >>> 0; + if (typeof fun !== "function") { + throw new TypeError(); + } + var res = []; + var thisp = arguments[1]; + for (var i = 0; i < len; i++) { + if (i in t) { + var val = t[i]; // in case fun mutates this + if (fun.call(thisp, val, i, t)) { + res.push(val); + } + } + } + return res; + }; +} +ngGridFilters.filter('checkmark', function() { + return function(input) { + return input ? '\u2714' : '\u2718'; + }; +}); +ngGridFilters.filter('ngColumns', function() { + return function(input) { + return input.filter(function(col) { + return !col.isAggCol; + }); + }; +}); +ngGridServices.factory('$domUtilityService',['$utilityService', function($utils) { + var domUtilityService = {}; + var regexCache = {}; + var getWidths = function() { + var $testContainer = $('
'); + $testContainer.appendTo('body'); + // 1. Run all the following measurements on startup! + //measure Scroll Bars + $testContainer.height(100).width(100).css("position", "absolute").css("overflow", "scroll"); + $testContainer.append('
'); + domUtilityService.ScrollH = ($testContainer.height() - $testContainer[0].clientHeight); + domUtilityService.ScrollW = ($testContainer.width() - $testContainer[0].clientWidth); + $testContainer.empty(); + //clear styles + $testContainer.attr('style', ''); + //measure letter sizes using a pretty typical font size and fat font-family + $testContainer.append('M'); + domUtilityService.LetterW = $testContainer.children().first().width(); + $testContainer.remove(); + }; + domUtilityService.eventStorage = {}; + domUtilityService.AssignGridContainers = function($scope, rootEl, grid) { + grid.$root = $(rootEl); + //Headers + grid.$topPanel = grid.$root.find(".ngTopPanel"); + grid.$groupPanel = grid.$root.find(".ngGroupPanel"); + grid.$headerContainer = grid.$topPanel.find(".ngHeaderContainer"); + $scope.$headerContainer = grid.$headerContainer; + + grid.$headerScroller = grid.$topPanel.find(".ngHeaderScroller"); + grid.$headers = grid.$headerScroller.children(); + //Viewport + grid.$viewport = grid.$root.find(".ngViewport"); + //Canvas + grid.$canvas = grid.$viewport.find(".ngCanvas"); + //Footers + grid.$footerPanel = grid.$root.find(".ngFooterPanel"); + + $scope.$watch(function () { + return grid.$viewport.scrollLeft(); + }, function (newLeft) { + return grid.$headerContainer.scrollLeft(newLeft); + }); + domUtilityService.UpdateGridLayout($scope, grid); + }; + domUtilityService.getRealWidth = function (obj) { + var width = 0; + var props = { visibility: "hidden", display: "block" }; + var hiddenParents = obj.parents().andSelf().not(':visible'); + $.swap(hiddenParents[0], props, function () { + width = obj.outerWidth(); + }); + return width; + }; + domUtilityService.UpdateGridLayout = function($scope, grid) { + //catch this so we can return the viewer to their original scroll after the resize! + var scrollTop = grid.$viewport.scrollTop(); + grid.elementDims.rootMaxW = grid.$root.width(); + if (grid.$root.is(':hidden')) { + grid.elementDims.rootMaxW = domUtilityService.getRealWidth(grid.$root); + } + grid.elementDims.rootMaxH = grid.$root.height(); + //check to see if anything has changed + grid.refreshDomSizes(); + $scope.adjustScrollTop(scrollTop, true); //ensure that the user stays scrolled where they were + }; + domUtilityService.numberOfGrids = 0; + domUtilityService.BuildStyles = function($scope, grid, digest) { + var rowHeight = grid.config.rowHeight, + $style = grid.$styleSheet, + gridId = grid.gridId, + css, + cols = $scope.columns, + sumWidth = 0; + + if (!$style) { + $style = $('#' + gridId); + if (!$style[0]) { + $style = $("