diff --git a/source/node/handlers/Play/Api/V1/Servers/index.coffee b/source/node/handlers/Play/Api/V1/Servers/index.coffee
index 6524810..69f95d0 100644
--- a/source/node/handlers/Play/Api/V1/Servers/index.coffee
+++ b/source/node/handlers/Play/Api/V1/Servers/index.coffee
@@ -51,7 +51,9 @@ app.on 'mount', (parent) ->
, loadServerStorageItems(
maria.Server.Storage.Item
)
-
+ , loadServerStorageTags(
+ maria.Server.Tag
+ )
, (req, res) ->
res.json 200, req.storage
@@ -80,7 +82,7 @@ app.on 'mount', (parent) ->
maria.Server.Store.Item.Enchantment
)
, loadServerStoreTags(
- maria.Server.Store.Tag
+ maria.Server.Tag
)
, (req, res) ->
@@ -90,9 +92,16 @@ app.on 'mount', (parent) ->
###
- Отдает предмет из магазина сервера аутентифицированному игроку.
+ Покупает предмет сервера аутентифицированному игроку.
+
+ Перед покупкой следующие условия должны быть удовлетворены:
+ — Покупаемое кол-во предметов делится без остатка на продаваемое кол-во
+
+ Стоимость предмета хранится в базе данных.
+
+ Стоимость зачарованного предмета
###
- app.get '/:serverId(\\d+)/store/items/:itemId'
+ app.post '/:serverId(\\d+)/store/items/:itemId(\\d+)/order'
, access
@@ -101,19 +110,63 @@ app.on 'mount', (parent) ->
, loadServerStore('serverId',
maria.Server.Store
)
- , loadServerStoreEnchantments(
- maria.Server.Store.Enchantment
- )
- , loadServerStoreItem('itemId',
- maria.Server.Store.Item
- )
- , loadServerStoreItemEnchantments(
- maria.Server.Store.Item.Enchantment
- )
-
- , (req, res) ->
- res.json 200, req.store.item
+ # Загружает чары в магазин.
+ # Загруженные чары являются экземплярами класса `Server.Store.Enchantment`.
+ , (req, res, next) ->
+ serverId= req.store.serverId
+ maria.Server.Store.Enchantment.query serverId, req.maria, (err, enchantments) ->
+ if not err
+ req.store.setEnchantments enchantments
+ next err
+
+ # Загружает указанный предмет в магазин.
+ # Загруженный предмет является экземпляром класса `Server.Store.Item`
+ , (req, res, next) ->
+ itemId= req.param 'itemId'
+ maria.Server.Store.Item.get itemId, req.maria, (err, item) ->
+ if not err
+ item= req.store.addItem item
+ if item.enchantability and item.enchantments
+ enchantments= []
+ for enchantment in item.enchantments
+ enchantments.push req.store.factoryItemEnchantment enchantment
+ item.enchantments= enchantments
+ next err
+
+ , maria.transaction()
+
+ # Списывает стоимость предмета со счета игрока.
+ , (req, res, next) ->
+ playerId= req.user.id
+ orig= req.store.getItem req.body.item
+ item= req.item= req.store.factoryItem req.body.item
+ xp= item.calcXp() - orig.calcXp()
+ price= Math.round( ((xp * 0.03) + orig.price) * 100 ) / 100
+ price= price * (item.amount / orig.amount)
+ maria.Player.Balance.dec playerId, price, req.maria, (err) ->
+ next err
+
+ # Сохраняет предмет игроку.
+ , (req, res, next) ->
+ playerId= req.user.id
+ serverId= req.store.serverId
+ maria.Player.Item.create playerId, serverId, req.item, req.maria, (err, item) ->
+ item.enchantments= req.item.enchantments
+ req.item= item
+ next err
+
+ # Сохраняет чары предмета игроку.
+ , (req, res, next) ->
+ return do next if not req.item.enchantments
+ maria.Player.Item.Enchantment.saveItemEnchantments req.item, req.maria, (err, item) ->
+ req.item= item
+ next err
+
+ , maria.transaction.commit()
+
+ , (req, res, next) ->
+ res.json 201, req.item
@@ -169,20 +222,47 @@ loadServerStorageEnchantments= (ServerStorageEnchantment) ->
loadServerStorageItems= (ServerStorageItem) ->
(req, res, next) ->
+ playerId= req.user.id
serverId= req.storage.serverId
-
- console.log 'load server `%s` storage items...', serverId
-
- ServerStorageItem.query serverId, req.maria, (err, items) ->
+ ServerStorageItem.query playerId, serverId, req.maria, (err, items) ->
req.storage.items= items
-
if not items and not err
res.status 404
err= 'server storage items not found'
+ if not err
+ idx= {}
+ items= []
+ for item, i in req.storage.items
+ if not item.name and not item.enchantability
+ if not itm= idx[item.itemId]
+ itm= idx[item.itemId]= item
+ items.push itm
+ else
+ itm.amount= itm.amount + item.amount
+ else
+ items.push item
+ req.storage.items= items
+ next err
+
+loadServerStorageTags= (ServerTag) ->
+ (req, res, next) ->
+ serverId= req.storage.serverId
+
+ console.log 'load server `%s` storage tags...', serverId
+
+ ServerTag.query serverId, req.maria, (err, tags) ->
+ req.storage.tags= tags
+
+ if not tags and not err
+ res.status 404
+ err= 'server storage tags not found'
console.log 'load server storage:', req.storage
next err
+
+
+
loadServerStore= (param, ServerStore) ->
(req, res, next) ->
req.store= null
@@ -242,6 +322,7 @@ loadServerStoreItemsEnchantments= (ServerStoreItemEnchantment) ->
for item in req.store.items
if not item.enchantability
continue
+ item.enchantments= []
if not idx[item.id]
idx[item.id]= item
ids.push item.id
@@ -268,13 +349,13 @@ loadServerStoreItemsEnchantments= (ServerStoreItemEnchantment) ->
console.log 'load server store:', req.store
next err
-loadServerStoreTags= (ServerStoreTag) ->
+loadServerStoreTags= (ServerTag) ->
(req, res, next) ->
serverId= req.store.serverId
console.log 'load server `%s` store tags...', serverId
- ServerStoreTag.query serverId, req.maria, (err, tags) ->
+ ServerTag.query serverId, req.maria, (err, tags) ->
req.store.tags= tags
if not tags and not err
@@ -283,50 +364,3 @@ loadServerStoreTags= (ServerStoreTag) ->
console.log 'load server store:', req.store
next err
-
-loadServerStoreItem= (param, ServerStoreItem) ->
- (req, res, next) ->
- req.store.item= null
-
- itemId= req.param param
-
- console.log 'load server store item `%d`...', itemId
- ServerStoreItem.get itemId, req.maria, (err, item) ->
- req.store.item= item
- if not item and not err
- res.status 404
- err= 'server store item not found'
-
- console.log 'load server store:', req.store
- next err
-
-loadServerStoreItemEnchantments= (ServerStoreItemEnchantment) ->
- (req, res, next) ->
-
- if not req.store.item.enchantability
- req.store.item.enchantments= null
- return next null
-
- itemId= req.store.item.id
-
- req.store.enchantmentsIdx= {}
- for enchantment in req.store.enchantments
- if not req.store.enchantmentsIdx[enchantment.id]
- req.store.enchantmentsIdx[enchantment.id]= enchantment
-
- console.log 'load server store item `%d` enchantments...', itemId
- ServerStoreItemEnchantment.query [itemId], req.maria, (err, enchantments) ->
- req.store.item.enchantments= []
-
- if not enchantments and not err
- err= 'cannot load store item enchantments'
-
- if not err
- ench= null
- for ench in enchantments
- if enchantment= req.store.enchantmentsIdx[ench.enchantmentId]
- req.store.item.enchantments.push extend {}, enchantment,
- level: ench.level
-
- console.log 'load server store:', req.store
- next err
diff --git a/source/node/handlers/index.coffee b/source/node/handlers/index.coffee
index 26d22b7..7eae6c5 100644
--- a/source/node/handlers/index.coffee
+++ b/source/node/handlers/index.coffee
@@ -62,12 +62,6 @@ app.on 'mount', (parent) ->
app.use '/api/v1/player/subscriptions'
, require './Play/Api/V1/Player/Subscriptions'
- ###
- Методы API для работы игрока с магазином.
- ###
- app.use '/api/v1/store'
- , require './Play/Api/V1/Store'
-
###
Методы API для работы с серверами.
###
@@ -92,6 +86,7 @@ app.on 'mount', (parent) ->
Обрабатывает ошибку
###
app.use (err, req, res, next) ->
+ console.log 'ERROR!', err
res.status 500
res.json
name: err.name
diff --git a/source/node/index.coffee b/source/node/index.coffee
index 1a3d58d..5947082 100644
--- a/source/node/index.coffee
+++ b/source/node/index.coffee
@@ -101,6 +101,10 @@ module.exports= (cfg, log, done) ->
return next err if err
req.maria.query 'START TRANSACTION', (err) ->
req.maria.transaction= true if not err
+
+ req.on 'end', ->
+ console.log 'запрос завершен. завершить транзакцию', req.status()
+
return next err
maria.transaction.commit= () ->
@@ -110,10 +114,15 @@ module.exports= (cfg, log, done) ->
return next err
maria.Player= require './models/Player'
+ maria.Player.Balance= require './models/Player/Balance'
maria.Player.Pex= require './models/Player/Pex'
maria.Player.Message= require './models/Player/Message'
+ maria.Player.Item= require './models/Player/Item'
+
maria.Server= require './models/Server'
+ maria.Server.Tag= require './models/Server/Tag'
+
maria.Server.Storage= require './models/Server/Storage'
maria.Server.Storage.Item= require './models/Server/Storage/Item'
@@ -121,7 +130,6 @@ module.exports= (cfg, log, done) ->
maria.Server.Store.Enchantment= require './models/Server/Store/Enchantment'
maria.Server.Store.Item= require './models/Server/Store/Item'
maria.Server.Store.Item.Enchantment= require './models/Server/Store/Item/Enchantment'
- maria.Server.Store.Tag= require './models/Server/Store/Tag'
app.use (req, res, next) ->
req.db= app.db
diff --git a/source/node/models/Item.coffee b/source/node/models/Item.coffee
new file mode 100644
index 0000000..26f7d05
--- /dev/null
+++ b/source/node/models/Item.coffee
@@ -0,0 +1,2 @@
+module.exports= class Item
+ @table= 'item'
diff --git a/source/node/models/Player/Balance.coffee b/source/node/models/Player/Balance.coffee
new file mode 100644
index 0000000..7e4feea
--- /dev/null
+++ b/source/node/models/Player/Balance.coffee
@@ -0,0 +1,27 @@
+module.exports= class PlayerBalance
+ @table: 'player_balance'
+
+ @dec: (playerId, amount, maria, done) ->
+
+ if not amount
+ err= new Error 'PlayerBalance#amount cannot be NULL'
+
+ if err
+ return done err
+
+ maria.query "
+ UPDATE
+ ?? as PlayerBalance
+ SET
+ PlayerBalance.amount = PlayerBalance.amount - ?
+ WHERE
+ PlayerBalance.amount >= ? AND
+ PlayerBalance.playerId = ?
+ "
+ , [@table, amount, amount, playerId]
+ , (err, res) =>
+
+ if not err and res.affectedRows != 1
+ err= 'not enough money'
+
+ done err
diff --git a/source/node/models/Player/Item.coffee b/source/node/models/Player/Item.coffee
new file mode 100644
index 0000000..d4f3189
--- /dev/null
+++ b/source/node/models/Player/Item.coffee
@@ -0,0 +1,35 @@
+Item= require '../Item'
+
+module.exports= class PlayerItem extends Item
+ @table: 'player_server_item'
+
+
+
+ constructor: (data) ->
+ @id= data.id
+ @playerId= data.playerId
+ @serverId= data.serverId
+ @itemId= data.itemId
+ @amount= data.amount
+
+
+
+ @Enchantment= require './Item/Enchantment'
+
+ @create: (playerId, serverId, data, maria, done) ->
+ item= new @
+ playerId: playerId
+ serverId: serverId
+ itemId: data.id
+ amount: data.amount
+ maria.query "
+ INSERT INTO
+ ??
+ SET
+ ?
+ "
+ , [@table, item]
+ , (err, res) ->
+ if not err
+ item.id= res.insertId
+ done err, item
diff --git a/source/node/models/Player/Item/Enchantment.coffee b/source/node/models/Player/Item/Enchantment.coffee
new file mode 100644
index 0000000..7febcc4
--- /dev/null
+++ b/source/node/models/Player/Item/Enchantment.coffee
@@ -0,0 +1,21 @@
+module.exports= class PlayerItemEnchantment
+ @table: 'player_server_item_enchantment'
+
+ @saveItemEnchantments: (item, maria, done) ->
+ bulk= []
+ for ench, i in item.enchantments
+ bulk.push [item.id, ench.id, ench.level, i]
+ maria.query "
+ INSERT INTO
+ ??
+ (
+ `itemId`, `enchantmentId`, `level`, `order`
+ )
+ VALUES
+ ?
+ "
+ , [@table, bulk]
+ , (err, res) ->
+ if not err and res.affectedRows != item.enchantments.length
+ err= 'error insert player item enchantments'
+ done err, item
diff --git a/source/node/models/Server/Storage/Item.coffee b/source/node/models/Server/Storage/Item.coffee
index ef28cfa..c9d742e 100644
--- a/source/node/models/Server/Storage/Item.coffee
+++ b/source/node/models/Server/Storage/Item.coffee
@@ -1,9 +1,15 @@
module.exports= class ServerStorageItem
- @table= 'player_item'
- @tableMaterial= 'bukkit_material'
+ @table= 'player_server_item'
+
+ @tableItem= 'item'
+ @tableItemMaterial= 'bukkit_material'
+ @tableItemEnchantment= 'player_server_item_enchantment'
+ @tableItemTag= 'item_tag'
constructor: (data) ->
@id= data.id
+ @itemId= data.itemId
+
@amount= data.amount
@name= data.name
@@ -16,42 +22,69 @@ module.exports= class ServerStorageItem
@material= data.material
@enchantability= data.enchantability
+ @tags= data.tags or null
+
@createdAt= data.createdAt
- @query: (serverId, maria, done) ->
+ @query: (playerId, serverId, maria, done) ->
maria.query "
SELECT
PlayerItem.id,
+ PlayerItem.itemId,
+
PlayerItem.amount,
PlayerItem.name,
- PlayerItem.titleRu as itemTitleRu,
+ Item.titleRu as itemTitleRu,
Material.titleRu as materialTitleRu,
- PlayerItem.titleEn as itemTitleEn,
+ Item.titleEn as itemTitleEn,
Material.titleEn as materialTitleEn,
- PlayerItem.imageUrl as itemImageUrl,
+ Item.imageUrl as itemImageUrl,
Material.imageUrl as materialImageUrl,
Material.id as material,
Material.enchantability as enchantability,
- PlayerItem.createdAt
- FROM
+ GROUP_CONCAT(DISTINCT CONCAT(ItemEnchantment.enchantmentId, ':', ItemEnchantment.level)
+ ORDER BY ItemEnchantment.order
+ ) as enchantments,
+
+ GROUP_CONCAT(ItemTag.tagId) as tags,
+
+ PlayerItem.updatedAt
+
+ FROM
?? as PlayerItem
- JOIN
+ JOIN
+ ?? as Item
+ ON Item.id= PlayerItem.itemId
+ JOIN
?? as Material
- ON Material.id= PlayerItem.material
- WHERE
+ ON Material.id= Item.material
+ LEFT OUTER JOIN
+ ?? as ItemEnchantment
+ ON ItemEnchantment.itemId= PlayerItem.id
+ LEFT OUTER JOIN
+ ?? as ItemTag
+ ON ItemTag.itemId= Item.id
+
+ WHERE
+ PlayerItem.playerId = ?
+ AND
PlayerItem.serverId = ?
- ORDER BY
- PlayerItem.createdAt DESC,
+
+ GROUP BY
+ PlayerItem.id
+
+ ORDER BY
+ PlayerItem.updatedAt DESC,
material, CAST(material AS SIGNED)
"
- , [@table, @tableMaterial, serverId]
+ , [@table, @tableItem, @tableItemMaterial, @tableItemEnchantment, @tableItemTag, playerId, serverId]
, (err, rows) =>
items= null
diff --git a/source/node/models/Server/Store.coffee b/source/node/models/Server/Store.coffee
index 4771a2c..f64da9f 100644
--- a/source/node/models/Server/Store.coffee
+++ b/source/node/models/Server/Store.coffee
@@ -2,11 +2,60 @@ module.exports= class ServerStore
@table= 'server_store'
+
+
+ @Item= require './Store/Item'
+ @ItemEnchantment= require './Store/Item/Enchantment'
+
+
+
constructor: (data) ->
@serverId= data.serverId
@enchantments= []
+ Object.defineProperty @, 'enchantmentsIdx',
+ value: {}
+
@items= []
+ Object.defineProperty @, 'itemsIdx',
+ value: {}
+
+ addItem: (item) ->
+ if not @itemsIdx[item.id]
+ @items.push @itemsIdx[item.id]= item
+ item
+
+ getItem: (item) ->
+ item= @itemsIdx[item.id]
+ item
+
+ setEnchantments: (enchantments) ->
+ @enchantments= []
+ for enchantment in enchantments
+ @enchantments.push @enchantmentsIdx[enchantment.id]= enchantment
+ @
+
+ getEnchantment: (enchantment) ->
+ enchantment= @enchantmentsIdx[enchantment.id]
+ enchantment
+
+ factoryItem: (data) ->
+ item= @getItem data
+ item= new @constructor.Item item
+ if data.enchantments
+ item.enchantments= []
+ for data in data.enchantments
+ if ench= @factoryItemEnchantment data
+ item.enchantments.push ench
+ item
+
+ factoryItemEnchantment: (data) ->
+ ench= @getEnchantment data
+ ench= new @constructor.ItemEnchantment ench
+ ench.level= data.level |0
+ ench
+
+
@get: (serverId, maria, done) ->
done null, new @
diff --git a/source/node/models/Server/Store/Item.coffee b/source/node/models/Server/Store/Item.coffee
index 48ff332..35e900c 100644
--- a/source/node/models/Server/Store/Item.coffee
+++ b/source/node/models/Server/Store/Item.coffee
@@ -1,29 +1,47 @@
module.exports= class ServerStoreItem
- @table= 'server_item'
- @tableItem= 'item'
- @tableMaterial= 'bukkit_material'
+ @Enchantment= require './Item/Enchantment'
+
- @tableItemTag= 'item_tag'
constructor: (data) ->
@id= data.id
@amount= data.amount
@price= data.price
-
@name= data.name
-
@titleRu= data.itemTitleRu or data.materialTitleRu
@titleEn= data.itemTitleEn or data.materialTitleEn
-
@imageUrl= data.itemImageUrl or data.materialImageUrl
-
@material= data.material
@enchantability= data.enchantability
+ @enchantments= data.enchantments or null
+ @tags= data.tags or null
+
+ addEnchantment: (data) ->
+ if not @enchantability
+ return
+ if not @enchantments or not @enchantments.length
+ @enchantments= []
+ @enchantments.push enchantment= new @constructor.Enchantment data
+ enchantment.id= data.id
+ enchantment
+
+ calcXp: () ->
+ xp= 0
+ if @enchantments and @enchantments.length
+ for enchantment in @enchantments
+ xp= xp + calcXpForEnchantment enchantment.level, @enchantability
+ xp
+
+
+
+ @table= 'server_item'
+ @tableItem= 'item'
+ @tableMaterial= 'bukkit_material'
+ @tableItemEnchantment= 'item_enchantment'
+ @tableItemTag= 'item_tag'
- @enchantments= [] if @enchantability
- @tags= data.tags or null
@query: (serverId, maria, done) ->
items= null
@@ -99,25 +117,55 @@ module.exports= class ServerStoreItem
Material.imageUrl as materialImageUrl,
Material.id as material,
- Material.enchantability as enchantability
+ Material.enchantability as enchantability,
+
+ GROUP_CONCAT(DISTINCT CONCAT(ItemEnchantment.enchantmentId, ':', ItemEnchantment.level)
+ ORDER BY ItemEnchantment.order
+ ) as enchantments
- FROM
+ FROM
?? as ServerItem
- JOIN
+ JOIN
?? as Item
ON Item.id= ServerItem.itemId
- JOIN
+ JOIN
?? as Material
ON Material.id= Item.material
- WHERE
+ LEFT OUTER JOIN
+ ?? as ItemEnchantment
+ ON ItemEnchantment.itemId= Item.id
+
+ WHERE
ServerItem.itemId = ?
"
- , [@table, @tableItem, @tableMaterial, itemId]
+ , [@table, @tableItem, @tableMaterial, @tableItemEnchantment, itemId]
, (err, rows) =>
if not err
row= null
if row= do rows.shift
item= new @ row
+ if item.enchantability
+ enchantments= []
+ for data in item.enchantments.split ','
+ data= data.split ':'
+ enchantments.push new @Enchantment
+ id: data[0]
+ level: data[1]
+ item.enchantments= enchantments
done err, item
+
+
+
+calcXpForLevel= (pLevel) ->
+ if 17 > pLevel
+ return 17 * pLevel
+ if 16 < pLevel and 32 > pLevel
+ return (1.5 * (pLevel * pLevel)) - (29.5 * pLevel) + 360
+ if 31 < pLevel
+ return (3.5 * (pLevel * pLevel)) - (151.5 * pLevel) + 2220
+
+calcXpForEnchantment= (eLevel, enchantability) ->
+ pLevel= Math.floor eLevel - (1 + (enchantability / 2))
+ return calcXpForLevel Math.max 1, pLevel
diff --git a/source/node/models/Server/Store/Item/Enchantment.coffee b/source/node/models/Server/Store/Item/Enchantment.coffee
index 8fd53ea..7831b3f 100644
--- a/source/node/models/Server/Store/Item/Enchantment.coffee
+++ b/source/node/models/Server/Store/Item/Enchantment.coffee
@@ -2,18 +2,22 @@ module.exports= class ServerStoreItemEnchantment
@table= 'item_enchantment'
constructor: (data) ->
-
+ @id= data.id
+ @titleRu= data.titleRu
+ @titleEn= data.titleEn
+ @levelMin= data.levelMin
+ @levelMax= data.levelMax
+ @level= data.level
+
@itemId= data.itemId
@enchantmentId= data.enchantmentId
-
- @level= data.level
@query: (ids, maria, done) ->
enchantments= null
maria.query "
SELECT
-
+
ItemEnchantment.itemId,
ItemEnchantment.enchantmentId,
diff --git a/source/node/models/Server/Store/Tag.coffee b/source/node/models/Server/Tag.coffee
similarity index 97%
rename from source/node/models/Server/Store/Tag.coffee
rename to source/node/models/Server/Tag.coffee
index 498de1c..21794bf 100644
--- a/source/node/models/Server/Store/Tag.coffee
+++ b/source/node/models/Server/Tag.coffee
@@ -1,4 +1,4 @@
-module.exports= class ServerStoreTag
+module.exports= class ServerTag
@table= 'server_tag'
@tableTag= 'tag'
@tableTagTags= 'tag_tags'
diff --git a/source/node/views/templates/Play/includes/Play.coffee b/source/node/views/templates/Play/includes/Play.coffee
index b7b1c30..b67bddc 100644
--- a/source/node/views/templates/Play/includes/Play.coffee
+++ b/source/node/views/templates/Play/includes/Play.coffee
@@ -24,12 +24,16 @@ app= angular.module 'app', ['ngRoute', 'ngResource', 'ngAnimate'], ($routeProvid
$routeProvider.when '/store/:server/:tag',
templateUrl: 'partials/store/server/', controller: 'StoreServerCtrl'
+
$routeProvider.when '/storage',
templateUrl: 'partials/storage/', controller: 'StorageCtrl'
$routeProvider.when '/storage/:server',
templateUrl: 'partials/storage/server/', controller: 'StorageServerCtrl'
+ $routeProvider.when '/storage/:server/:tag',
+ templateUrl: 'partials/storage/server/', controller: 'StorageServerCtrl'
+
app.factory 'Player', ($resource) ->
$resource '/api/v1/player/:action', {},
@@ -169,7 +173,7 @@ app.factory 'ServerStore', ($resource) ->
get: {method:'GET', cache:true, params:{serverId:'@id'}}
app.factory 'ServerStoreItem', ($resource) ->
- $resource '/api/v1/store/servers/:serverId/items/:itemId/:action'
+ $resource '/api/v1/servers/:serverId/store/items/:itemId/:action'
, {serverId:'@serverId', itemId:'@itemId'}
,
order: {method:'POST', params:{action:'order'}}
@@ -635,7 +639,7 @@ app.controller 'StorageCtrl', ($scope, $rootScope, $q, $log) ->
-app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, ServerStorage, $log) ->
+app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, ServerStorage, $log, $thesaurus, $location) ->
$rootScope.route= 'storage'
$scope.storage= null
@@ -651,6 +655,27 @@ app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, Serve
serverId: server.id
, (storage) ->
$scope.storage= $rootScope.server.storage= storage
+
+ # link tags
+ $scope.nodes= $thesaurus.linkTags $scope.storage.tags
+
+ # link items tags
+ $scope.items= $thesaurus.linkTagsItems $scope.storage.tags, $scope.storage.items
+
+ # select tag
+ for tag in $scope.storage.tags
+ if tag.name == $routeParams.tag
+ $scope.tag= tag
+ tag.selected= true
+ tag.expanded= true if tag.nodes and tag.nodes.length
+ if tag.tags and tag.tags.length
+ for t in tag.tags
+ t.expanded= true
+
+ $scope.items= tag.items
+
+ $scope.search.q= tag.titleRuSingular
+
$scope.state= 'ready'
, (err) ->
$scope.state= 'error'
@@ -664,6 +689,8 @@ app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, Serve
q: ''
$scope.searchClear= () ->
$scope.search.q= ''
+ if $routeParams.tag
+ $location.path "/storage/#{$routeParams.server}"
@@ -905,7 +932,7 @@ app.directive 'navTag', ($parse, $compile) ->
scope: false
transclude: true
template: """
- {{node.titleRuPlural}}
+ {{node.titleRuPlural}}
"""
controller: ($scope) ->
diff --git a/source/node/views/templates/Play/partials/storage/server/index.jade b/source/node/views/templates/Play/partials/storage/server/index.jade
index ab8becd..0fbfc00 100644
--- a/source/node/views/templates/Play/partials/storage/server/index.jade
+++ b/source/node/views/templates/Play/partials/storage/server/index.jade
@@ -2,6 +2,18 @@ extends ../layout
+append section--side
+
+ ul.nav.nav-list
+ li(ng-class="{active:!search.q}", ng-click="searchClear()"): a(ng-href="#/storage/{{server.name}}") Все предметы
+ li.nav-list--sep
+
+ ul.nav.nav-list.nav-tags(ng-repeat="node in nodes", nav-tags="node.nodes", deep="'tags'==node.name", ng-init="href='#/storage'")
+ li.nav-list--header(ng-if="'types'==node.name") Предметы по типам
+ li.nav-list--header(ng-if="'tags'==node.name") Предметы по тегам
+
+
+
append section--main
.storage--server
@@ -10,7 +22,6 @@ append section--main
input.input(placeholder='Поиск предметов', ng-model="search.q", required)
a.input-action(ng-show="!!search.q", ng-click="searchClear()"): i.icon-remove
-
.server--items
.item(ng-repeat='item in storage.items | filter:search.q', ng-controller='StoreServerItemCtrl'): .row
.col-12.col-sm-8.col-lg-8
diff --git a/source/node/views/templates/Play/partials/store/server/index.jade b/source/node/views/templates/Play/partials/store/server/index.jade
index 63a0e37..56041af 100644
--- a/source/node/views/templates/Play/partials/store/server/index.jade
+++ b/source/node/views/templates/Play/partials/store/server/index.jade
@@ -8,7 +8,7 @@ append section--side
li(ng-class="{active:!search.q}", ng-click="searchClear()"): a(ng-href="#/store/{{server.name}}") Предметы в продаже
li.nav-list--sep
- ul.nav.nav-list.nav-tags(ng-repeat="node in nodes", nav-tags="node.nodes", deep="'tags'==node.name")
+ ul.nav.nav-list.nav-tags(ng-repeat="node in nodes", nav-tags="node.nodes", deep="'tags'==node.name", ng-init="href='#/store'")
li.nav-list--header(ng-if="'types'==node.name") Предметы по типам
li.nav-list--header(ng-if="'tags'==node.name") Предметы по тегам