diff --git a/common/locales/en/gear.json b/common/locales/en/gear.json index 37ca45998a..c9cc62f30c 100644 --- a/common/locales/en/gear.json +++ b/common/locales/en/gear.json @@ -1,4 +1,6 @@ { + "set": "Set", + "weapon": "weapon", "weaponBase0Text": "No Weapon", diff --git a/common/locales/en/generic.json b/common/locales/en/generic.json index 409e48e1f0..0fc346bc35 100644 --- a/common/locales/en/generic.json +++ b/common/locales/en/generic.json @@ -177,5 +177,6 @@ "hatchPetShare": "I hatched a new pet by completing my real-life tasks!", "raisePetShare": "I raised a pet into a mount by completing my real-life tasks!", "wonChallengeShare": "I won a challenge in Habitica!", - "achievementShare": "I earned a new achievement in Habitica!" + "achievementShare": "I earned a new achievement in Habitica!", + "orderBy": "Order By" } diff --git a/test/spec/controllers/sortableInventoryCtrlSpec.js b/test/spec/controllers/sortableInventoryCtrlSpec.js new file mode 100644 index 0000000000..c2f85a9a4c --- /dev/null +++ b/test/spec/controllers/sortableInventoryCtrlSpec.js @@ -0,0 +1,32 @@ +'use strict'; + +describe('Sortable Inventory Controller', function() { + var scope; + + beforeEach(inject(function($rootScope, $controller) { + scope = $rootScope.$new(); + $controller('SortableInventoryController', {$scope: scope}); + })); + + it('has no default sort order', function(){ + expect(scope.order).to.not.exist; + }); + + it('sets sort criteria for all standard attributes', function(){ + var oldOrder = scope.order; + + var attrs = ['con', 'int', 'per', 'str', 'name', 'set']; + + attrs.forEach(function (attribute) { + scope.setOrder(attribute); + expect(scope.order).to.exist; + expect(scope.order).to.not.eql(oldOrder); + oldOrder = scope.order; + }); + }); + + it('does nothing when missing sort criteria', function(){ + scope.setOrder('foooo'); + expect(scope.order).to.not.exist; + }); +}); diff --git a/website/public/css/inventory.styl b/website/public/css/inventory.styl index 1740daa407..f0b8a65cde 100644 --- a/website/public/css/inventory.styl +++ b/website/public/css/inventory.styl @@ -32,6 +32,13 @@ menu.pets div display: inline-block vertical-align: top +span.sort-menu + width: 100% + display: block + +span.sort-menu > span.btn-group + margin-left: 10px + .current-pet left: 0px bottom: 0px diff --git a/website/public/js/controllers/sortableInventoryCtrl.js b/website/public/js/controllers/sortableInventoryCtrl.js new file mode 100644 index 0000000000..07f52dcd91 --- /dev/null +++ b/website/public/js/controllers/sortableInventoryCtrl.js @@ -0,0 +1,19 @@ +habitrpg.controller('SortableInventoryController', ['$scope', + function ($scope) { + + // doing this in a function causes 10 $digest iteration error + attributeSort = { + con: ['-con', '-(con+int+per+str)'], + int: ['-int', '-(con+int+per+str)'], + per: ['-per', '-(con+int+per+str)'], + str: ['-str', '-(con+int+per+str)'], + name: 'text()', + set: 'set' + } + + $scope.setOrder = function(order) { + if (order in attributeSort) { + $scope.order = attributeSort[order]; + } + }; +}]); diff --git a/website/public/manifest.json b/website/public/manifest.json index accb695df3..c4d107c03e 100644 --- a/website/public/manifest.json +++ b/website/public/manifest.json @@ -91,6 +91,7 @@ "js/controllers/partyCtrl.js", "js/controllers/rootCtrl.js", "js/controllers/settingsCtrl.js", + "js/controllers/sortableInventoryCtrl.js", "js/controllers/tavernCtrl.js", "js/controllers/tasksCtrl.js", "js/controllers/userCtrl.js" diff --git a/website/views/options/inventory/equipment.jade b/website/views/options/inventory/equipment.jade index 8d77a25a8b..370232d245 100644 --- a/website/views/options/inventory/equipment.jade +++ b/website/views/options/inventory/equipment.jade @@ -17,8 +17,14 @@ li.customize-menu.inventory-gear menu.pets-menu(label='{{::label}}', ng-show='gear[klass]', - ng-repeat='(klass,label) in {warrior:env.t("warrior"), wizard:env.t("mage"), rogue:env.t("rogue"), healer:env.t("healer"), special:env.t("special"), mystery:env.t("mystery"), armoire:env.t("armoireText")}') - div(ng-repeat='item in gear[klass]') + ng-repeat='(klass,label) in {warrior:env.t("warrior"), wizard:env.t("mage"), rogue:env.t("rogue"), healer:env.t("healer"), special:env.t("special"), mystery:env.t("mystery"), armoire:env.t("armoireText")}', ng-controller="SortableInventoryController") + span(class="sort-menu") {{env.t('orderBy')}} + span.btn-group.btn-group-xs + button.btn.btn-default(ng-click='setOrder("name")')=env.t('name') + button.btn.btn-default(ng-if='klass == "armoire"' ng-click='setOrder("set")')=env.t('set') + span.btn-group.btn-group-xs + button.btn.btn-default(ng-repeat='attr in ["con", "int", "per", "str"]', ng-click='setOrder(attr)') {{env.t(attr)}} + div(ng-repeat='item in gear[klass] | orderBy:order') button.customize-option(, class='shop_{{::item.key}}', ng-class='{selectableInventory: user.items.gear.equipped[item.type] == item.key}', ng-click='equip(item.key, "equipped")', @@ -50,8 +56,14 @@ li.customize-menu(ng-if='user.preferences.costume') menu.pets-menu(label='{{::label}}', ng-show='gear[klass]', - ng-repeat='(klass,label) in {warrior:env.t("warrior"), wizard:env.t("mage"), rogue:env.t("rogue"), healer:env.t("healer"), special:env.t("special"), mystery:env.t("mystery"), armoire:env.t("armoireText")}') - div(ng-repeat='item in gear[klass]') + ng-repeat='(klass,label) in {warrior:env.t("warrior"), wizard:env.t("mage"), rogue:env.t("rogue"), healer:env.t("healer"), special:env.t("special"), mystery:env.t("mystery"), armoire:env.t("armoireText")}', ng-controller="SortableInventoryController") + span(class="sort-menu") {{env.t('orderBy')}} + span.btn-group.btn-group-xs + button.btn.btn-default(ng-click='setOrder("name")')=env.t('name') + button.btn.btn-default(ng-if='klass == "armoire"' ng-click='setOrder("set")')=env.t('set') + span.btn-group.btn-group-xs + button.btn.btn-default(ng-repeat='attr in ["con", "int", "per", "str"]', ng-click='setOrder(attr)') {{env.t(attr)}} + div(ng-repeat='item in gear[klass] | orderBy:order') button.customize-option(class='shop_{{::item.key}}', ng-class='{selectableInventory: user.items.gear.costume[item.type] == item.key}', ng-click='equip(item.key, "costume")',