[haiku-depot-web] [haiku-depot-web-app] 2 new revisions pushed by haiku.li...@xxxxxxxxx on 2014-08-06 10:54 GMT

  • From: haiku-depot-web-app@xxxxxxxxxxxxxx
  • To: haiku-depot-web@xxxxxxxxxxxxx
  • Date: Wed, 06 Aug 2014 10:55:20 +0000

master moved from 98cfe0d1d372 to b81b631a7d3f

2 new revisions:

Revision: dd1f91cacde3
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Wed Aug  6 09:46:44 2014 UTC
Log:      + implement 'featured' and 'prominence'
http://code.google.com/p/haiku-depot-web-app/source/detail?r=dd1f91cacde3

Revision: b81b631a7d3f
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Wed Aug  6 10:50:47 2014 UTC
Log:      + implement 'featured' and 'prominence'  (german localization)
http://code.google.com/p/haiku-depot-web-app/source/detail?r=b81b631a7d3f

==============================================================================
Revision: dd1f91cacde3
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Wed Aug  6 09:46:44 2014 UTC
Log:      + implement 'featured' and 'prominence'

http://code.google.com/p/haiku-depot-web-app/source/detail?r=dd1f91cacde3

Added:
/haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesRequest.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesResult.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceRequest.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceResult.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/Prominence.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Prominence.java /haikudepotserver-webapp/src/main/resources/db/haikudepot/migration/V1.14__Prominence.sql /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominence.html /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominencecontroller.js
Modified:
/haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApi.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/PkgApi.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetBulkPkgResult.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetPkgResult.java /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/SearchPkgsRequest.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApiImpl.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/PkgApiImpl.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Pkg.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/model/PkgSearchSpecification.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/AuthorizationService.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/model/Permission.java
 /haikudepotserver-webapp/src/main/resources/HaikuDepot.map.xml
 /haikudepotserver-webapp/src/main/resources/messages.properties
 /haikudepotserver-webapp/src/main/resources/messages_de.properties
/haikudepotserver-webapp/src/main/webapp/js/app/controller/homecontroller.js
 /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkg.html
/haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkgcontroller.js
 /haikudepotserver-webapp/src/main/webapp/js/app/routes.js
/haikudepotserver-webapp/src/main/webapp/js/app/service/breadcrumbfactoryservice.js /haikudepotserver-webapp/src/main/webapp/js/app/service/referencedataservice.js /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/IntegrationTestSupportService.java /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/api1/PkgApiIT.java /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/userrating/UserRatingOrchestrationServiceIT.java

=======================================
--- /dev/null
+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesRequest.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+package org.haikuos.haikudepotserver.api1.model.miscellaneous;
+
+public class GetAllProminencesRequest {
+}
=======================================
--- /dev/null
+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/miscellaneous/GetAllProminencesResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2014, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+package org.haikuos.haikudepotserver.api1.model.miscellaneous;
+
+import java.util.List;
+
+public class GetAllProminencesResult {
+
+    public List<Prominence> prominences;
+
+    public GetAllProminencesResult() {
+    }
+
+    public GetAllProminencesResult(List<Prominence> prominences) {
+        this.prominences = prominences;
+    }
+
+    public static class Prominence {
+
+        public Integer ordering;
+        public String name;
+
+        public Prominence() {
+        }
+
+        public Prominence(Integer ordering, String name) {
+            this.ordering = ordering;
+            this.name = name;
+        }
+    }
+
+}
=======================================
--- /dev/null
+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceRequest.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2014, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+package org.haikuos.haikudepotserver.api1.model.pkg;
+
+public class UpdatePkgProminenceRequest {
+
+    public String pkgName;
+    public Integer prominenceOrdering;
+
+}
=======================================
--- /dev/null
+++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/UpdatePkgProminenceResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+package org.haikuos.haikudepotserver.api1.model.pkg;
+
+public class UpdatePkgProminenceResult {
+}
=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/Prominence.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2014, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+package org.haikuos.haikudepotserver.dataobjects;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.query.Ordering;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.haikuos.haikudepotserver.dataobjects.auto._Prominence;
+
+import java.util.List;
+
+public class Prominence extends _Prominence {
+
+    public final static Integer ORDERING_LAST = 1000;
+
+ public static Optional<Prominence> getByOrdering(ObjectContext context, Integer ordering) {
+        Preconditions.checkNotNull(context);
+        Preconditions.checkState(null!=ordering && ordering >= 0);
+        return Optional.fromNullable(Iterables.getOnlyElement(
+                (List<Prominence>) context.performQuery(new SelectQuery(
+                        Prominence.class,
+ ExpressionFactory.matchExp(Prominence.ORDERING_PROPERTY, ordering))),
+                null
+        ));
+    }
+
+    public static List<Prominence> getAll(ObjectContext context) {
+        Preconditions.checkNotNull(context);
+        SelectQuery query = new SelectQuery(Prominence.class);
+ query.addOrdering(new Ordering(ORDERING_PROPERTY, SortOrder.ASCENDING));
+        return (List<Prominence>) context.performQuery(query);
+    }
+
+    @Override
+    public String toString() {
+        return "prominence;"+getOrdering();
+    }
+
+}
=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Prominence.java Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,26 @@
+package org.haikuos.haikudepotserver.dataobjects.auto;
+
+import org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject;
+
+/**
+ * Class _Prominence was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Prominence extends AbstractDataObject {
+
+    public static final String NAME_PROPERTY = "name";
+    public static final String ORDERING_PROPERTY = "ordering";
+
+    public static final String ID_PK_COLUMN = "id";
+
+    public String getName() {
+        return (String)readProperty(NAME_PROPERTY);
+    }
+
+    public Integer getOrdering() {
+        return (Integer)readProperty(ORDERING_PROPERTY);
+    }
+
+}
=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/resources/db/haikudepot/migration/V1.14__Prominence.sql Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,28 @@
+-- ------------------------------------------------------
+-- ADD PROMINENCE FOR A PACKAGE
+-- ------------------------------------------------------
+
+CREATE TABLE haikudepot.prominence (
+  id BIGINT NOT NULL,
+  ordering INT NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  PRIMARY KEY (id)
+);
+
+CREATE SEQUENCE haikudepot.prominence_seq START WITH 3112 INCREMENT BY 1;
+
+CREATE UNIQUE INDEX prominence_idx01 ON haikudepot.prominence(ordering);
+CREATE UNIQUE INDEX prominence_idx02 ON haikudepot.prominence(name);
+
+INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 100, '1st'); +INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 200, '2nd'); +INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 300, '3rd'); +INSERT INTO haikudepot.prominence (id,ordering,name) VALUES ((SELECT nextval('haikudepot.prominence_seq')), 1000, 'Last');
+
+ALTER TABLE haikudepot.pkg ADD COLUMN prominence_id BIGINT;
+UPDATE haikudepot.pkg SET prominence_id = (SELECT id FROM haikudepot.prominence WHERE ordering=1000);
+ALTER TABLE haikudepot.pkg ALTER COLUMN prominence_id SET NOT NULL;
+
+ALTER TABLE haikudepot.pkg ADD FOREIGN KEY (prominence_id) REFERENCES haikudepot.prominence (id);
+
+INSERT INTO haikudepot.permission (id, code, name) VALUES ((SELECT nextval('haikudepot.permission_seq')), 'pkg_editprominence', 'Edit Package Prominence');
=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominence.html Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,40 @@
+<breadcrumbs items="breadcrumbItems"></breadcrumbs>
+
+<div class="content-container">
+
+    <form name="editPkgCategoriesForm" novalidate="novalidate">
+
+        <label><message key="gen.pkg.title"></message></label>
+        <div class="form-control-group">
+            <div class="form-control-group-static">
+                <pkg-label pkg="pkg"></pkg-label>
+            </div>
+        </div>
+
+ <label for="prominences"><message key="editPkgProminence.prominence.title"></message></label>
+        <div class="form-control-group">
+            <select
+                    id="prominences"
+                    required="true"
+                    ng-model="selectedProminence"
+ ng-options="aProminence.title for aProminence in prominences">
+            </select>
+        </div>
+
+        <div class="form-action-container">
+            <button
+                    ng-disabled="editPkgProminence.$invalid"
+                    ng-click="goStoreProminence()"
+                    type="submit"
+                    class="main-action">
+                <message key="editPkgProminence.action.title"></message>
+            </button>
+        </div>
+
+    </form>
+
+</div>
+
+<div class="footer"></div>
+<spinner spin="shouldSpin()"></spinner>
+
=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/editpkgprominencecontroller.js Wed Aug 6 09:46:44 2014 UTC
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2014, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+angular.module('haikudepotserver').controller(
+    'EditPkgProminenceController',
+    [
+        '$scope','$log','$location','$routeParams',
+        'jsonRpc','constants','errorHandling',
+        'breadcrumbs','referenceData',
+        'pkg','breadcrumbFactory',
+        function(
+            $scope,$log,$location,$routeParams,
+            jsonRpc,constants,errorHandling,
+            breadcrumbs,referenceData,
+            pkg,breadcrumbFactory) {
+
+            $scope.pkg = undefined;
+            $scope.amSaving = false;
+            $scope.selectedProminence = undefined;
+            $scope.prominences = undefined;
+
+            $scope.shouldSpin = function() {
+ return undefined == $scope.pkg || undefined == $scope.prominences || $scope.amSaving;
+            };
+
+ // pulls the pkg data back from the server so that it can be used to
+            // display the form.
+
+            function refetchPkg() {
+ pkg.getPkgWithSpecificVersionFromRouteParams($routeParams, false).then(
+                    function(result) {
+                        $scope.pkg = result;
+                        $log.info('found '+result.name+' pkg');
+                        refreshBreadcrumbItems();
+
+ // now get the categories and from the data in the pkg it should be possible to + // pre-select those categories which are presently configured on the pkg.
+
+                        referenceData.prominences().then(
+                            function(data) {
+
+                                $scope.prominences = _.clone(data);
+
+ // here we're not using the localization system because the names are so + // tightly bound to the ordering and nobody is going to see them anyway.
+
+                                _.each(
+                                    $scope.prominences,
+                                    function(item) {
+ item.title = item.name + ' (' + item.ordering + ')';
+                                    }
+                                );
+
+                                $scope.selectedProminence = _.findWhere(
+                                    $scope.prominences,
+ { ordering : $scope.pkg.prominenceOrdering }
+                                );
+
+                            },
+                            function() {
+                                // logging happens inside
+                                errorHandling.navigateToError();
+                            }
+                        )
+                    },
+                    function() {
+                        errorHandling.navigateToError();
+                    }
+                );
+            }
+
+            refetchPkg();
+
+            function refreshBreadcrumbItems() {
+                breadcrumbs.mergeCompleteStack([
+                    breadcrumbFactory.createHome(),
+ breadcrumbFactory.createViewPkgWithSpecificVersionFromRouteParams($routeParams), + breadcrumbFactory.applyCurrentLocation(breadcrumbFactory.createEditPkgProminence($scope.pkg))
+                ]);
+            }
+
+ // stores the categories back to the server for this package. When it has done this, it will return to
+            // view the pkg again.
+
+            $scope.goStoreProminence = function() {
+                jsonRpc.call(
+                    constants.ENDPOINT_API_V1_PKG,
+                    'updatePkgProminence',
+                    [{
+                        pkgName : $scope.pkg.name,
+ prominenceOrdering : $scope.selectedProminence.ordering
+                    }]
+                ).then(
+                    function() {
+ $log.info('have updated the prominence for pkg '+$scope.pkg.name);
+                        breadcrumbs.popAndNavigate();
+                    },
+                    function(err) {
+                        $log.error('unable to update pkg prominence');
+                        errorHandling.handleJsonRpcError(err);
+                    }
+                );
+            }
+
+        }
+    ]
+);
=======================================
--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApi.java Thu Jul 24 11:35:00 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApi.java Wed Aug 6 09:46:44 2014 UTC
@@ -60,4 +60,10 @@

GetAllUserRatingStabilitiesResult getAllUserRatingStabilities(GetAllUserRatingStabilitiesRequest getAllUserRatingStabilitiesRequest);

+    /**
+     * <p>This method will return all of the possible prominences.</p>
+     */
+
+ GetAllProminencesResult getAllProminences(GetAllProminencesRequest request);
+
 }
=======================================
--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/PkgApi.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/PkgApi.java Wed Aug 6 09:46:44 2014 UTC
@@ -132,4 +132,11 @@

GetBulkPkgResult getBulkPkg(GetBulkPkgRequest getBulkPkgRequest) throws LimitExceededException, ObjectNotFoundException;

+    /**
+ * <p>This method will update the prominence of the nominated package. The prominence is identified by the
+     * ordering of the prominence as a natural identifier.</p>
+     */
+
+ UpdatePkgProminenceResult updatePkgProminence(UpdatePkgProminenceRequest request) throws ObjectNotFoundException;
+
 }
=======================================
--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetBulkPkgResult.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetBulkPkgResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -32,6 +32,8 @@

         public Float derivedRating;

+        public Integer prominenceOrdering;
+
     }

     public static class PkgVersion {
=======================================
--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetPkgResult.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/GetPkgResult.java Wed Aug 6 09:46:44 2014 UTC
@@ -27,8 +27,11 @@
     public List<String> pkgCategoryCodes;

     public Float derivedRating;
+
     public Integer derivedRatingSampleSize;

+    public Integer prominenceOrdering;
+
     public static class PkgVersion {

         public String major;
=======================================
--- /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/SearchPkgsRequest.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-api1/src/main/java/org/haikuos/haikudepotserver/api1/model/pkg/SearchPkgsRequest.java Wed Aug 6 09:46:44 2014 UTC
@@ -7,8 +7,6 @@

 import org.haikuos.haikudepotserver.api1.support.AbstractSearchRequest;

-import java.util.List;
-
 /**
* <p>This is the model object that is used to define the request to search for packages in the system.</p>
  */
@@ -17,6 +15,7 @@

     public enum SortOrdering {
         NAME,
+        PROMINENCE,
         VERSIONCREATETIMESTAMP,
         VERSIONVIEWCOUNTER
     }
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApiImpl.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/MiscellaneousApiImpl.java Wed Aug 6 09:46:44 2014 UTC
@@ -221,5 +221,23 @@
                 )
         );
     }
+
+    @Override
+ public GetAllProminencesResult getAllProminences(GetAllProminencesRequest request) {
+        Preconditions.checkNotNull(request);
+        final ObjectContext context = serverRuntime.getContext();
+
+        return new GetAllProminencesResult(
+                Lists.transform(
+                        Prominence.getAll(context),
+ new Function<Prominence, GetAllProminencesResult.Prominence>() {
+                            @Override
+ public GetAllProminencesResult.Prominence apply(Prominence input) { + return new GetAllProminencesResult.Prominence(input.getOrdering(), input.getName());
+                            }
+                        }
+                )
+        );
+    }

 }
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/PkgApiImpl.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/api1/PkgApiImpl.java Wed Aug 6 09:46:44 2014 UTC
@@ -396,6 +396,7 @@
         result.modifyTimestamp = pkg.getModifyTimestamp().getTime();
         result.derivedRating = pkg.getDerivedRating();
         result.derivedRatingSampleSize = pkg.getDerivedRatingSampleSize();
+        result.prominenceOrdering = pkg.getProminence().getOrdering();
result.pkgCategoryCodes = Lists.transform(pkg.getPkgPkgCategories(), new Function<PkgPkgCategory, String>() {
             @Override
             public String apply(PkgPkgCategory input) {
@@ -1040,6 +1041,7 @@
GetBulkPkgResult.Pkg resultPkg = new GetBulkPkgResult.Pkg(); resultPkg.modifyTimestamp = input.getPkg().getModifyTimestamp().getTime();
                             resultPkg.name = input.getPkg().getName();
+ resultPkg.prominenceOrdering = input.getPkg().getProminence().getOrdering(); resultPkg.derivedRating = input.getPkg().getDerivedRating();

if(getBulkPkgRequest.filter.contains(GetBulkPkgRequest.Filter.PKGICONS)) {
@@ -1117,5 +1119,34 @@

         return result;
     }
+
+    @Override
+ public UpdatePkgProminenceResult updatePkgProminence(UpdatePkgProminenceRequest request) throws ObjectNotFoundException {
+       Preconditions.checkNotNull(request);
+ Preconditions.checkState(!Strings.isNullOrEmpty(request.pkgName),"the package name must be supplied on the request"); + Preconditions.checkState(null!=request.prominenceOrdering,"the presence ordering must be supplied");
+
+        final ObjectContext context = serverRuntime.getContext();
+        Pkg pkg = getPkg(context, request.pkgName);
+
+        User authUser = obtainAuthenticatedUser(context);
+
+ if(!authorizationService.check(context, authUser, pkg, Permission.PKG_EDITPROMINENCE)) {
+            throw new AuthorizationFailureException();
+        }
+
+ Optional<Prominence> prominenceOptional = Prominence.getByOrdering(context, request.prominenceOrdering);
+
+        if(!prominenceOptional.isPresent()) {
+ throw new ObjectNotFoundException(Prominence.class.getSimpleName(), request.prominenceOrdering);
+        }
+
+        pkg.setProminence(prominenceOptional.get());
+        context.commitChanges();
+
+ LOGGER.info("the prominence for {} has been set to; {}", pkg.toString(), prominenceOptional.get().toString());
+
+        return new UpdatePkgProminenceResult();
+    }

 }
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Pkg.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/auto/_Pkg.java Wed Aug 6 09:46:44 2014 UTC
@@ -7,6 +7,7 @@
 import org.haikuos.haikudepotserver.dataobjects.PkgIcon;
 import org.haikuos.haikudepotserver.dataobjects.PkgPkgCategory;
 import org.haikuos.haikudepotserver.dataobjects.PkgScreenshot;
+import org.haikuos.haikudepotserver.dataobjects.Prominence;
 import org.haikuos.haikudepotserver.dataobjects.Publisher;
 import org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject;

@@ -28,6 +29,7 @@
     public static final String PKG_ICONS_PROPERTY = "pkgIcons";
public static final String PKG_PKG_CATEGORIES_PROPERTY = "pkgPkgCategories";
     public static final String PKG_SCREENSHOTS_PROPERTY = "pkgScreenshots";
+    public static final String PROMINENCE_PROPERTY = "prominence";
     public static final String PUBLISHER_PROPERTY = "publisher";

     public static final String ID_PK_COLUMN = "id";
@@ -120,6 +122,15 @@
     public List<PkgScreenshot> getPkgScreenshots() {
         return (List<PkgScreenshot>)readProperty(PKG_SCREENSHOTS_PROPERTY);
     }
+
+
+    public void setProminence(Prominence prominence) {
+        setToOneTarget(PROMINENCE_PROPERTY, prominence, true);
+    }
+
+    public Prominence getProminence() {
+        return (Prominence)readProperty(PROMINENCE_PROPERTY);
+    }


     public void setPublisher(Publisher publisher) {
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java Wed Aug 6 09:46:44 2014 UTC
@@ -300,6 +300,9 @@
orderExpressions.add("pv." + PkgVersion.CREATE_TIMESTAMP_PROPERTY + " DESC");
                     break;

+                case PROMINENCE:
+ orderExpressions.add("pv." + PkgVersion.PKG_PROPERTY + "." + Pkg.PROMINENCE_PROPERTY + "." + Prominence.ORDERING_PROPERTY + " ASC");
+
                 case NAME: // gets added anyway...
                     break;

@@ -616,6 +619,7 @@
persistedPkg = objectContext.newObject(org.haikuos.haikudepotserver.dataobjects.Pkg.class);
             persistedPkg.setName(pkg.getName());
             persistedPkg.setActive(Boolean.TRUE);
+ persistedPkg.setProminence(Prominence.getByOrdering(objectContext, Prominence.ORDERING_LAST).get());

LOGGER.info("the package {} did not exist; will create", pkg.getName());
         }
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/model/PkgSearchSpecification.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/model/PkgSearchSpecification.java Wed Aug 6 09:46:44 2014 UTC
@@ -21,6 +21,7 @@

     public enum SortOrdering {
         NAME,
+        PROMINENCE,
         VERSIONCREATETIMESTAMP,
         VERSIONVIEWCOUNTER
     }
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/AuthorizationService.java Sat Jul 26 04:02:29 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/AuthorizationService.java Wed Aug 6 09:46:44 2014 UTC
@@ -145,6 +145,7 @@
                 case PKG_EDITICON:
                 case PKG_EDITSCREENSHOT:
                 case PKG_EDITCATEGORIES:
+                case PKG_EDITPROMINENCE:
                 case PKG_EDITVERSIONLOCALIZATION: {
List<? extends AuthorizationPkgRule> rules = authenticatedUser.getAuthorizationPkgRules((Pkg) target); if (Iterables.tryFind(rules, new Predicate<AuthorizationPkgRule>() {
@@ -201,6 +202,7 @@
             case PKG_EDITSCREENSHOT:
             case PKG_EDITCATEGORIES:
             case PKG_EDITVERSIONLOCALIZATION:
+            case PKG_EDITPROMINENCE:
return null!=authenticatedUser && authenticatedUser.getIsRoot();

             case USERRATING_EDIT:
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/model/Permission.java Thu Jul 24 11:35:00 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/security/model/Permission.java Wed Aug 6 09:46:44 2014 UTC
@@ -27,7 +27,8 @@
     PKG_EDITICON(TargetType.PKG),
     PKG_EDITSCREENSHOT(TargetType.PKG),
     PKG_EDITCATEGORIES(TargetType.PKG),
-    PKG_EDITVERSIONLOCALIZATION(TargetType.PKG);
+    PKG_EDITVERSIONLOCALIZATION(TargetType.PKG),
+    PKG_EDITPROMINENCE(TargetType.PKG);

     private TargetType requiredTargetType;

=======================================
--- /haikudepotserver-webapp/src/main/resources/HaikuDepot.map.xml Mon Jul 28 09:04:02 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/HaikuDepot.map.xml Wed Aug 6 09:46:44 2014 UTC
@@ -63,6 +63,7 @@
<db-attribute name="id" type="BIGINT" isPrimaryKey="true" isMandatory="true"/> <db-attribute name="modify_timestamp" type="TIMESTAMP" isMandatory="true"/> <db-attribute name="name" type="VARCHAR" isMandatory="true" length="255"/>
+               <db-attribute name="prominence_id" type="BIGINT" 
isMandatory="true"/>
                <db-attribute name="publisher_id" type="BIGINT"/>
                <db-key-generator>
                        <db-generator-type>ORACLE</db-generator-type>
@@ -213,6 +214,16 @@
                        <db-key-cache-size>1</db-key-cache-size>
                </db-key-generator>
        </db-entity>
+       <db-entity name="prominence" schema="haikudepot">
+ <db-attribute name="id" type="BIGINT" isPrimaryKey="true" isMandatory="true"/> + <db-attribute name="name" type="VARCHAR" isMandatory="true" length="255"/>
+               <db-attribute name="ordering" type="INTEGER" 
isMandatory="true"/>
+               <db-key-generator>
+                       <db-generator-type>ORACLE</db-generator-type>
+                       
<db-generator-name>haikudepot.prominence_seq</db-generator-name>
+                       <db-key-cache-size>1</db-key-cache-size>
+               </db-key-generator>
+       </db-entity>
        <db-entity name="publisher" schema="haikudepot">
                <db-attribute name="active" type="BOOLEAN" isMandatory="true"/>
                <db-attribute name="code" type="VARCHAR" length="255"/>
@@ -370,14 +381,18 @@
<obj-attribute name="body" type="java.lang.String" lock="true" db-attribute-path="body"/>
        </obj-entity>
<obj-entity name="PkgVersionLocalization" className="org.haikuos.haikudepotserver.dataobjects.PkgVersionLocalization" lock-type="optimistic" dbEntityName="pkg_version_localization" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> - <obj-attribute name="createTimestamp" type="java.sql.Timestamp" db-attribute-path="create_timestamp"/> + <obj-attribute name="createTimestamp" type="java.sql.Date" db-attribute-path="create_timestamp"/> <obj-attribute name="description" type="java.lang.String" lock="true" db-attribute-path="description"/> - <obj-attribute name="modifyTimestamp" type="java.sql.Timestamp" db-attribute-path="modify_timestamp"/> + <obj-attribute name="modifyTimestamp" type="java.util.Date" db-attribute-path="modify_timestamp"/> <obj-attribute name="summary" type="java.lang.String" lock="true" db-attribute-path="summary"/>
        </obj-entity>
<obj-entity name="PkgVersionUrl" className="org.haikuos.haikudepotserver.dataobjects.PkgVersionUrl" lock-type="optimistic" dbEntityName="pkg_version_url" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> <obj-attribute name="url" type="java.lang.String" lock="true" db-attribute-path="url"/>
        </obj-entity>
+ <obj-entity name="Prominence" className="org.haikuos.haikudepotserver.dataobjects.Prominence" readOnly="true" lock-type="optimistic" dbEntityName="prominence" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> + <obj-attribute name="name" type="java.lang.String" db-attribute-path="name"/> + <obj-attribute name="ordering" type="java.lang.Integer" db-attribute-path="ordering"/>
+       </obj-entity>
<obj-entity name="Publisher" className="org.haikuos.haikudepotserver.dataobjects.Publisher" lock-type="optimistic" dbEntityName="publisher" superClassName="org.haikuos.haikudepotserver.dataobjects.support.AbstractDataObject"> <obj-attribute name="active" type="java.lang.Boolean" lock="true" db-attribute-path="active"/> <obj-attribute name="code" type="java.lang.String" lock="true" db-attribute-path="code"/>
@@ -450,6 +465,9 @@
<db-relationship name="user" source="permission_user_pkg" target="user" toMany="false">
                <db-attribute-pair source="user_id" target="id"/>
        </db-relationship>
+ <db-relationship name="permission_user_pkgs" source="pkg" target="permission_user_pkg" toMany="true">
+               <db-attribute-pair source="id" target="pkg_id"/>
+       </db-relationship>
<db-relationship name="pkg_icons" source="pkg" target="pkg_icon" toMany="true">
                <db-attribute-pair source="id" target="pkg_id"/>
        </db-relationship>
@@ -459,12 +477,12 @@
<db-relationship name="pkg_screenshots" source="pkg" target="pkg_screenshot" toMany="true">
                <db-attribute-pair source="id" target="pkg_id"/>
        </db-relationship>
+ <db-relationship name="prominence" source="pkg" target="prominence" toMany="false">
+               <db-attribute-pair source="prominence_id" target="id"/>
+       </db-relationship>
<db-relationship name="publisher" source="pkg" target="publisher" toMany="false">
                <db-attribute-pair source="publisher_id" target="id"/>
        </db-relationship>
- <db-relationship name="untitledRel" source="pkg" target="permission_user_pkg" toMany="true">
-               <db-attribute-pair source="id" target="pkg_id"/>
-       </db-relationship>
<db-relationship name="pkg_pkg_categories" source="pkg_category" target="pkg_pkg_category" toMany="true">
                <db-attribute-pair source="id" target="pkg_category_id"/>
        </db-relationship>
@@ -540,6 +558,9 @@
<db-relationship name="pkg_version" source="pkg_version_url" target="pkg_version" toMany="false">
                <db-attribute-pair source="pkg_version_id" target="id"/>
        </db-relationship>
+ <db-relationship name="pkgs" source="prominence" target="pkg" toMany="true">
+               <db-attribute-pair source="id" target="prominence_id"/>
+       </db-relationship>
<db-relationship name="pkgs" source="publisher" target="pkg" toMany="true">
                <db-attribute-pair source="id" target="publisher_id"/>
        </db-relationship>
@@ -582,10 +603,11 @@
<obj-relationship name="permission" source="PermissionUserPkg" target="Permission" deleteRule="Nullify" db-relationship-path="permission"/> <obj-relationship name="pkg" source="PermissionUserPkg" target="Pkg" deleteRule="Nullify" db-relationship-path="pkg"/> <obj-relationship name="user" source="PermissionUserPkg" target="User" deleteRule="Nullify" db-relationship-path="user"/> - <obj-relationship name="permissionUserPkgs" source="Pkg" target="PermissionUserPkg" deleteRule="Cascade" db-relationship-path="untitledRel"/> + <obj-relationship name="permissionUserPkgs" source="Pkg" target="PermissionUserPkg" deleteRule="Cascade" db-relationship-path="permission_user_pkgs"/> <obj-relationship name="pkgIcons" source="Pkg" target="PkgIcon" deleteRule="Cascade" db-relationship-path="pkg_icons"/> <obj-relationship name="pkgPkgCategories" source="Pkg" target="PkgPkgCategory" deleteRule="Cascade" db-relationship-path="pkg_pkg_categories"/> <obj-relationship name="pkgScreenshots" source="Pkg" target="PkgScreenshot" deleteRule="Cascade" db-relationship-path="pkg_screenshots"/> + <obj-relationship name="prominence" source="Pkg" target="Prominence" deleteRule="Nullify" db-relationship-path="prominence"/> <obj-relationship name="publisher" source="Pkg" target="Publisher" deleteRule="Nullify" db-relationship-path="publisher"/> <obj-relationship name="mediaType" source="PkgIcon" target="MediaType" deleteRule="Nullify" db-relationship-path="media_type"/> <obj-relationship name="pkg" source="PkgIcon" target="Pkg" deleteRule="Nullify" db-relationship-path="pkg"/>
=======================================
--- /haikudepotserver-webapp/src/main/resources/messages.properties Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/messages.properties Wed Aug 6 09:46:44 2014 UTC
@@ -27,6 +27,7 @@
 breadcrumb.authenticateUser.title=Login
 breadcrumb.createUser.title=Create User
 breadcrumb.editPkgCategories.title=Categories
+breadcrumb.editPkgProminence.title=Prominence
 breadcrumb.editPkgIcon.title=Icon
 breadcrumb.editPkgScreenshots.title=Screenshots
 breadcrumb.editPkgVersionLocalizations.title=Localization
@@ -112,7 +113,8 @@
editPkgVersionLocalization.selectedArchitectureApplicability.singleArchitecture.title=Architecture '{0}' only editPkgVersionLocalization.selectedArchitectureApplicability.allArchitectures.title=Latest version of all architectures for package '{0}'.

-home.viewCriteriaType.all=All
+home.viewCriteriaType.featured=Featured
+home.viewCriteriaType.all=Alphabetical
 home.viewCriteriaType.categories=Categories
 home.viewCriteriaType.mostrecent=Recent Updates; Sort on Version Date
 home.viewCriteriaType.mostviewed=Recent Updates; Sort on Most Viewed
@@ -164,6 +166,9 @@

 rating.none=No rating specified

+editPkgProminence.prominence.title=Prominence
+editPkgProminence.action.title=Save
+
 editPkgCategories.categories.title=Categories
editPkgCategories.categories.maximumThreeNote=A maximum of three package categories is allowed.
 editPkgCategories.action.title=Save
@@ -189,6 +194,7 @@
 listUsers.showInactiveAction.title=Show inactive users
 listUsers.createUserAction.title=Create user

+viewPkg.prominence.title=Prominence
 viewPkg.categories.title=Categories
 viewPkg.categories.none=None
 viewPkg.versionViews.title=Version Views
@@ -199,6 +205,7 @@
 viewPkg.downloadIconHvifAction.title=Download icon in 'hvif' format
 viewPkg.editScreenshotsAction.title=Edit screenshots
 viewPkg.editPkgCategoriesAction.title=Edit categories
+viewPkg.editPkgProminenceAction.title=Edit prominence
 viewPkg.editVersionLocalizationAction.title=Edit localizations
 viewPkg.userRating.title=User Rating
 viewPkg.userRating.title.plural=User Ratings
=======================================
--- /haikudepotserver-webapp/src/main/resources/messages_de.properties Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/messages_de.properties Wed Aug 6 09:46:44 2014 UTC
@@ -110,7 +110,8 @@
editPkgVersionLocalization.selectedArchitectureApplicability.singleArchitecture.title=nur die '{0}' Architektur editPkgVersionLocalization.selectedArchitectureApplicability.allArchitectures.title=die neueste Version für alle Architekturen des Pakets '{0}'.

-home.viewCriteriaType.all=Alles
+home.viewCriteriaType.featured=Gekennzeichnet
+home.viewCriteriaType.all=Alphabetisch
 home.viewCriteriaType.categories=Kategorien
home.viewCriteriaType.mostrecent=Neu aktualisiert; sortiert nach Versionsdatum home.viewCriteriaType.mostviewed=Neu aktualisiert; sortiert nach am meisten angesehen
=======================================
--- /haikudepotserver-webapp/src/main/webapp/js/app/controller/homecontroller.js Tue Jul 8 11:11:57 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/homecontroller.js Wed Aug 6 09:46:44 2014 UTC
@@ -26,6 +26,7 @@
             var KEY_VIEWCRITERIATYPECODE = 'viewcrttyp';

             var ViewCriteriaTypes = {
+                FEATURED : 'FEATURED',
                 ALL : 'ALL',
                 MOSTVIEWED : 'MOSTVIEWED',
                 CATEGORIES : 'CATEGORIES',
@@ -45,6 +46,7 @@
             $scope.selectedPkgCategory = undefined;
             $scope.viewCriteriaTypeOptions = _.map(
                 [
+                    ViewCriteriaTypes.FEATURED,
                     ViewCriteriaTypes.ALL,
                     ViewCriteriaTypes.CATEGORIES,
                     ViewCriteriaTypes.MOSTRECENT,
@@ -62,7 +64,7 @@
             $scope.selectedViewCriteriaTypeOption = _.findWhere(
                 $scope.viewCriteriaTypeOptions,
                 {
- code : $location.search()[KEY_VIEWCRITERIATYPECODE] ? $location.search()[KEY_VIEWCRITERIATYPECODE] : ViewCriteriaTypes.ALL + code : $location.search()[KEY_VIEWCRITERIATYPECODE] ? $location.search()[KEY_VIEWCRITERIATYPECODE] : ViewCriteriaTypes.FEATURED
                 }
             );

@@ -80,11 +82,11 @@
                     -1 != searchMixins.nextMatchSearchExpression(
                         pkg.versions[0].summary.toLowerCase(),0,
$scope.lastRefetchPkgsSearchExpression,'CONTAINS').offset;
-            }
+            };

             $scope.shouldShowDerivedRating = function(pkg) {
                 return angular.isNumber(pkg.derivedRating);
-            }
+            };

             // pagination
             $scope.pkgs = {
@@ -231,11 +233,11 @@

                 function(chain) {

- $scope.$watch('pkgs.offset', function(newValue, oldValue) {
+                    $scope.$watch('pkgs.offset', function() {
                         refetchPkgs();
                     });

- $scope.$watch('selectedPkgCategory', function(newValue, oldValue) {
+                    $scope.$watch('selectedPkgCategory', function() {
                         var option = $scope.selectedViewCriteriaTypeOption;

if(option && option.code == ViewCriteriaTypes.CATEGORIES) {
@@ -245,7 +247,7 @@

// this gets hit when somebody chooses an architecture such as x86, x86_64 etc...

- $scope.$watch('selectedArchitecture', function(newValue, oldValue) {
+                    $scope.$watch('selectedArchitecture', function() {

                         if(undefined != $scope.pkgs.items) {
                             refetchPkgsAtFirstPage();
@@ -264,6 +266,7 @@

                                 case ViewCriteriaTypes.MOSTRECENT:
                                 case ViewCriteriaTypes.MOSTVIEWED:
+                                case ViewCriteriaTypes.FEATURED:
                                 case ViewCriteriaTypes.ALL:
                                     refetchPkgsAtFirstPage();
                                     break;
@@ -275,6 +278,9 @@
                                     refetchPkgsAtFirstPage();
                                     break;

+                                default:
+ throw new Error('unknown view criteria type option; ' + newValue.code);
+
                             }
                         }
                     });
@@ -346,6 +352,10 @@

                     switch ($scope.selectedViewCriteriaTypeOption.code) {

+                        case ViewCriteriaTypes.FEATURED:
+                            req.sortOrdering = 'PROMINENCE';
+                            break;
+
                         case ViewCriteriaTypes.ALL:
                             break;

@@ -367,6 +377,9 @@
                             req.sortOrdering = 'VERSIONVIEWCOUNTER';
                             break;

+                        default:
+ throw new Error('unexpected view criteria type option; ' + $scope.selectedViewCriteriaTypeOption.code);
+
                     }

$scope.lastRefetchPkgsSearchExpression = $scope.searchExpression;
=======================================
--- /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkg.html Sat Jun 21 11:24:37 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkg.html Wed Aug 6 09:46:44 2014 UTC
@@ -65,10 +65,16 @@
                 <span ng-show="pkgCategories && !pkgCategories.length">
                     <message key="viewPkg.categories.none"></message>
                 </span>
- <span ng-show="pkgCategories.length"><span ng-repeat="pkgCategory in pkgCategories"><span ng-show="$index">, </span><pkg-category-label pkg-category="pkgCategory"></pkg-category-label></span> + <span ng-show="pkgCategories.length"><span ng-repeat="pkgCategory in pkgCategories"><span ng-show="$index">, </span><pkg-category-label pkg-category="pkgCategory"></pkg-category-label></span></span>
             </dd>
             <dt><message key="viewPkg.versionViews.title"></message></dt>
             <dd>{{pkg.versions[0].viewCounter}}</dd>
+            <dt pkg="pkg" show-if-pkg-permission="'PKG_EDITPROMINENCE'">
+                <message key="viewPkg.prominence.title"></message>
+            </dt>
+            <dd pkg="pkg" show-if-pkg-permission="'PKG_EDITPROMINENCE'">
+                {{pkg.prominence.name}} ({{pkg.prominence.ordering}})
+            </dd>
         </dl>

     </div>
@@ -188,6 +194,11 @@
                 <a href="" ng-click="goEditVersionLocalization()">
<message key="viewPkg.editVersionLocalizationAction.title"></message>
                 </a>
+            </li>
+            <li pkg="pkg" show-if-pkg-permission="'PKG_EDITPROMINENCE'">
+                <a href="" ng-click="goEditPkgProminence()">
+ <message key="viewPkg.editPkgProminenceAction.title"></message>
+                </a>
             </li>
             <li pkg="pkg" show-if-pkg-permission="'PKG_EDITCATEGORIES'">
                 <a href="" ng-click="goEditPkgCategories()">
=======================================
--- /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkgcontroller.js Sun Jul 27 10:55:51 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/controller/viewpkgcontroller.js Wed Aug 6 09:46:44 2014 UTC
@@ -93,6 +93,7 @@
                         refetchPkgIconMetaData();
                         refetchPkgCategories();
                         refetchUserRatings();
+                        refetchProminence();
                     },
                     function() {
                         errorHandling.navigateToError(); // already logged
@@ -100,6 +101,21 @@
                 );

             }
+
+            function refetchProminence() {
+                referenceData.prominences().then(
+                    function(prominences) {
+                        $scope.pkg.prominence = _.findWhere(
+                            prominences,
+                            { ordering : $scope.pkg.prominenceOrdering }
+                        );
+                    },
+                    function() {
+ $log.error('unable to obtain the list of prominences');
+                        errorHandling.navigateToError();
+                    }
+                )
+            }

             function refetchPkgCategories() {

@@ -303,6 +319,10 @@
breadcrumbs.pushAndNavigate(breadcrumbFactory.createEditPkgCategories($scope.pkg));
             };

+            $scope.goEditPkgProminence = function() {
+ breadcrumbs.pushAndNavigate(breadcrumbFactory.createEditPkgProminence($scope.pkg));
+            }
+
             $scope.goRemoveIcon = function() {
                 jsonRpc.call(
                         constants.ENDPOINT_API_V1_PKG,
=======================================
--- /haikudepotserver-webapp/src/main/webapp/js/app/routes.js Thu Jul 24 11:35:00 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/routes.js Wed Aug 6 09:46:44 2014 UTC
@@ -35,6 +35,7 @@
.when(pkgVersionPrefix+'/editicon',{controller:'EditPkgIconController', templateUrl:'/js/app/controller/editpkgicon.html'}) .when(pkgVersionPrefix+'/editscreenshots',{controller:'EditPkgScreenshotsController', templateUrl:'/js/app/controller/editpkgscreenshots.html'}) .when(pkgVersionPrefix+'/editcategories',{controller:'EditPkgCategoriesController', templateUrl:'/js/app/controller/editpkgcategories.html'}) + .when(pkgVersionPrefix+'/editprominence',{controller:'EditPkgProminenceController', templateUrl:'/js/app/controller/editpkgprominence.html'}) .when(pkgVersionPrefix+'/editversionlocalizations',{controller:'EditPkgVersionLocalizationController', templateUrl:'/js/app/controller/editpkgversionlocalization.html'}) .when(pkgVersionPrefix+'/adduserrating',{controller:'AddEditUserRatingController', templateUrl:'/js/app/controller/addedituserrating.html'})
                 
.when('/',{controller:'HomeController',templateUrl:'/js/app/controller/home.html',reloadOnSearch:false})
=======================================
--- /haikudepotserver-webapp/src/main/webapp/js/app/service/breadcrumbfactoryservice.js Sun Jul 27 10:55:51 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/service/breadcrumbfactoryservice.js Wed Aug 6 09:46:44 2014 UTC
@@ -252,6 +252,10 @@
return createManipulatePkgBreadcrumbItem(pkg, 'editcategories', 'editPkgCategories');
                 },

+                createEditPkgProminence : function(pkg) {
+ return createManipulatePkgBreadcrumbItem(pkg, 'editprominence', 'editPkgProminence');
+                },
+
                 createEditPkgIcon : function(pkg) {
return createManipulatePkgBreadcrumbItem(pkg, 'editicon', 'editPkgIcon');
                 },
=======================================
--- /haikudepotserver-webapp/src/main/webapp/js/app/service/referencedataservice.js Sun Jul 27 10:55:51 2014 UTC +++ /haikudepotserver-webapp/src/main/webapp/js/app/service/referencedataservice.js Wed Aug 6 09:46:44 2014 UTC
@@ -88,6 +88,10 @@
                     return getData('naturalLanguages');
                 },

+                prominences : function() {
+                    return getData('prominences');
+                },
+
                 pkgCategories : function() {
                     return getData('pkgCategories');
                 },
=======================================
--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/IntegrationTestSupportService.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/IntegrationTestSupportService.java Wed Aug 6 09:46:44 2014 UTC
@@ -119,6 +119,8 @@
         ObjectContext context = getObjectContext();
         StandardTestData result = new StandardTestData();

+ Prominence prominence = Prominence.getByOrdering(context, Prominence.ORDERING_LAST).get();
+
         Architecture x86 = Architecture.getByCode(context, "x86").get();
Architecture x86_gcc2 = Architecture.getByCode(context, "x86_gcc2").get();

@@ -133,6 +135,7 @@
         result.pkg1.setName("pkg1");
         result.pkg1.setDerivedRating(3.5f);
         result.pkg1.setDerivedRatingSampleSize(4);
+        result.pkg1.setProminence(prominence);

         {
PkgPkgCategory pkgPkgCategory = context.newObject(PkgPkgCategory.class);
@@ -204,6 +207,7 @@
         result.pkg2 = context.newObject(Pkg.class);
         result.pkg2.setActive(true);
         result.pkg2.setName("pkg2");
+        result.pkg2.setProminence(prominence);

         result.pkg2Version1 = context.newObject(PkgVersion.class);
         result.pkg2Version1.setActive(Boolean.TRUE);
@@ -218,6 +222,7 @@
         result.pkg3 = context.newObject(Pkg.class);
         result.pkg3.setActive(true);
         result.pkg3.setName("pkg3");
+        result.pkg3.setProminence(prominence);

         result.pkg3Version1 = context.newObject(PkgVersion.class);
         result.pkg3Version1.setActive(Boolean.TRUE);
=======================================
--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/api1/PkgApiIT.java Sun Jun 29 11:22:04 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/api1/PkgApiIT.java Wed Aug 6 09:46:44 2014 UTC
@@ -745,5 +745,28 @@
         Assertions.assertThat(pkg1.versions.get(0).minor).isNull();

     }
+
+    @Test
+    public void testUpdatePkgProminence() throws Exception {
+
+        setAuthenticatedUserToRoot();
+
+        integrationTestSupportService.createStandardTestData();
+
+ UpdatePkgProminenceRequest request = new UpdatePkgProminenceRequest();
+        request.pkgName = "pkg1";
+        request.prominenceOrdering = 200;
+
+        // ------------------------------------
+        pkgApi.updatePkgProminence(request);
+        // ------------------------------------
+
+        {
+            ObjectContext context = serverRuntime.getContext();
+            Pkg pkg1 = Pkg.getByName(context, "pkg1").get();
+ Assertions.assertThat(pkg1.getProminence().getOrdering()).isEqualTo(200);
+        }
+
+    }

 }
=======================================
--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/userrating/UserRatingOrchestrationServiceIT.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/userrating/UserRatingOrchestrationServiceIT.java Wed Aug 6 09:46:44 2014 UTC
@@ -64,6 +64,7 @@

         userRatingTestData.pkg = context.newObject(Pkg.class);
         userRatingTestData.pkg.setName("urtestpkg");
+ userRatingTestData.pkg.setProminence(Prominence.getByOrdering(context, Prominence.ORDERING_LAST).get());

userRatingTestData.user1 = integrationTestSupportService.createBasicUser(context,"urtestuser1","password"); userRatingTestData.user2 = integrationTestSupportService.createBasicUser(context,"urtestuser2","password");

==============================================================================
Revision: b81b631a7d3f
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Wed Aug  6 10:50:47 2014 UTC
Log:      + implement 'featured' and 'prominence'  (german localization)

http://code.google.com/p/haiku-depot-web-app/source/detail?r=b81b631a7d3f

Modified:
 /haikudepotserver-webapp/src/main/resources/messages_de.properties

=======================================
--- /haikudepotserver-webapp/src/main/resources/messages_de.properties Wed Aug 6 09:46:44 2014 UTC +++ /haikudepotserver-webapp/src/main/resources/messages_de.properties Wed Aug 6 10:50:47 2014 UTC
@@ -24,6 +24,7 @@
 breadcrumb.changePassword.title=Kennwort ändern
 breadcrumb.authenticateUser.title=Anmelden
 breadcrumb.createUser.title=Benutzer anlegen
+breadcrumb.editPkgProminence.title=Empfehlungsstufen
 breadcrumb.editPkgCategories.title=Kategorien
 breadcrumb.editPkgIcon.title=Icon
 breadcrumb.editPkgScreenshots.title=Screenshots
@@ -87,6 +88,9 @@
 authenticateUser.createUserAction.title=Neuen Benutzer registrieren
authenticateUser.initiatePasswordResetAction.title=Vergessenes Kennwort zurücksetzen

+editPkgProminence.prominence.title=Empfehlungsstufen
+editPkgProminence.action.title=Speichern
+
editPkgIcon.iconBitmap32File.required=Es wird eine 32x32 Pixel große Version des Icons benötigt. editPkgIcon.iconBitmap32File.badsize=Die Datei ist zu groß oder zu klein, um als PNG Bild für dieses Icon benutzt zu werden. editPkgIcon.iconBitmap32File.badformatorsize=Die Datei ist entweder nicht im PNG Format, oder besitzt nicht die richtigen Abmessungen für das Paket-Icon.
@@ -113,6 +117,7 @@
 home.viewCriteriaType.featured=Gekennzeichnet
 home.viewCriteriaType.all=Alphabetisch
 home.viewCriteriaType.categories=Kategorien
+home.viewCriteriaType.featured=Empfehlung
home.viewCriteriaType.mostrecent=Neu aktualisiert; sortiert nach Versionsdatum home.viewCriteriaType.mostviewed=Neu aktualisiert; sortiert nach am meisten angesehen
 home.searchButton.title=Los
@@ -186,6 +191,7 @@
 listUsers.showInactiveAction.title=Zeige inaktive Benutzer
 listUsers.createUserAction.title=Benutzer anlegen

+viewPkg.prominence.title=Empfehlungsstufen
 viewPkg.categories.title=Kategorien
 viewPkg.categories.none=keine
 viewPkg.versionViews.title=Versionsanzeigen
@@ -203,6 +209,7 @@
viewPkg.userRating.addAction.unauthenticated=Um eine Bewertung abgeben zu können, ist eine Anmeldung erforderlich.
 viewPkg.userRating.noResults=Es wurden keine Bewertungen gefunden.
 viewPkg.userRating.noResults.addAction=Erste Bewertung abgeben.
+viewPkg.editPkgProminenceAction.title=Empfehlungsstufe bearbeiten
viewPkg.userRating.noResults.authenticateAction=Anmelden, um die erste Bewertung abzugeben.
 viewPkg.userRating.user.by=von
 viewPkg.derivedUserRating.sampleSize={0} Bewertungen

Other related posts:

  • » [haiku-depot-web] [haiku-depot-web-app] 2 new revisions pushed by haiku.li...@xxxxxxxxx on 2014-08-06 10:54 GMT - haiku-depot-web-app