Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

@@ -24,7 +24,7 @@ consoleColors.load();

const HERODATA = require('./dataMapper/HERODATA.js');
const { badNames, hiddenItems, defaultItems, achievementSprays, specialItems, blizzardItems, allClassEventItems, itemNamesIFuckedUp, idsBlizzardChanged } = require('./dataMapper/itemData.js');
const { EVENTS, EVENTNAMES, EVENTTIMES, EVENTORDER, CURRENTEVENT, EVENT_ITEM_ORDER } = require('./dataMapper/EVENTDATA.js');
const { EVENTS, EVENTNAMES, EVENTTIMES, EVENTORDER, CURRENTEVENT, EVENT_ITEM_ORDER, EVENT_PREVIEWS, NEW_EVENTS } = require('./dataMapper/EVENTDATA.js');
const { EVENTITEMS } = require('./dataMapper/EVENTITEMS.js');
const { getCleanID, getItemType, getPreviewURL, sortObject, qualityOrder, getAchievementForItem } = require('./dataMapper/utils.js');

@@ -241,11 +241,8 @@ for (var hero in data) {
break;
}

if (out.event === EVENTS.ANNIVERSARY17 && type === 'emotes') {
out.url = getPreviewURL(type, id, heroID, out.event);
}

if (out.event === EVENTS.SUMMER && (type === 'emotes' || type === 'intros')) {
// If we store the preview for this item on an event, link to it instead.
if (EVENT_PREVIEWS[out.event] && EVENT_PREVIEWS[out.event].includes(type)) {
out.url = getPreviewURL(type, id, heroID, out.event);
}

@@ -275,12 +272,13 @@ forEach(heroes, hero => {
item.group = actualEvent;
}

if (event === 'SUMMER_GAMES' && !actualEvent) {
// If the item to a new event. e.g. ummergames 2017 instead of 2016
if (NEW_EVENTS.includes(event) && !actualEvent) {
item.isNew = true;
}

let type;
if (event === 'SUMMER_GAMES') {
if (NEW_EVENTS.includes(event)) {
type = (tKey == 'skins' && item.quality == 'legendary' && !actualEvent) ? 'skinsLegendary' : tKey;
} else {
// Split legendary and epic skins up for events as they are displayed seperately.
@@ -344,7 +342,7 @@ forEach(allClassEventItems, (types, type) => {

let name = allClassDataKeys[type][itemID];

if (event !== 'SUMMER_GAMES') {
if (NEW_EVENTS.includes(event)) {
name = name.replace(/ \d{4}$/, '');
}

@@ -443,10 +441,10 @@ forEach(heroes, hero => forEach(hero.items, (items, type) => {
}
hero.items[type] = sortBy(items, [
'standardItem', // Standard items first
(a => qualityOrder[a.quality]), // sort by quality. rare, epic, legendary
(c => c.achievement ? 1 : 0), // achievement items (origins edition/blizzcon) go at the bottom
(b => EVENTORDER[b.event]), // event items go below normal items
(d => d.name.toLowerCase()) // everything in their respective groups is sorted by name
(a => qualityOrder[a.quality]), // sort by quality. rare, epic, legendary
(c => c.achievement ? 1 : 0), // achievement items (origins edition/blizzcon) go at the bottom
(b => EVENTORDER[EVENTORDER[b.group] ? b.group : b.event]), // event items go below normal items
(d => d.name.toLowerCase()) // everything in their respective groups is sorted by name
]);
}));

@@ -1,43 +1,47 @@
const { qualityOrder } = require('./utils.js');
const CURRENTEVENT = 'SUMMER_GAMES';
const CURRENTEVENT = 'HALLOWEEN';

const EVENTS = {
SUMMER: 'SUMMER_GAMES',
SUMMER16: 'SUMMER_GAMES_2016',
HALLOWEEN16: 'HALLOWEEN_2016',
CHRISTMAS16: 'WINTER_WONDERLAND_2016',
ROOSTER17: 'YEAR_OF_THE_ROOSTER_2017',
UPRISING17: 'UPRISING_2017',
ANNIVERSARY17: 'ANNIVERSARY_2017'
ANNIVERSARY17: 'ANNIVERSARY_2017',
SUMMER: 'SUMMER_GAMES',
HALLOWEEN: 'HALLOWEEN',
};

const EVENTORDER = {
undefined: 0, // no event
[EVENTS.SUMMER16]: 1,
[EVENTS.HALLOWEEN16]: 2,
[EVENTS.CHRISTMAS16]: 3,
[EVENTS.ROOSTER17]: 4,
[EVENTS.UPRISING17]: 5,
[EVENTS.ANNIVERSARY17]: 6,
[EVENTS.SUMMER]: 7,
[EVENTS.HALLOWEEN16]: 1,
[EVENTS.CHRISTMAS16]: 2,
[EVENTS.ROOSTER17]: 3,
[EVENTS.UPRISING17]: 4,
[EVENTS.ANNIVERSARY17]: 5
[EVENTS.HALLOWEEN]: 8,
};

const EVENTNAMES = {
[EVENTS.SUMMER]: 'Summer Games',
[EVENTS.HALLOWEEN16]: 'Halloween Terror 2016',
[EVENTS.CHRISTMAS16]: 'Winter Wonderland 2016',
[EVENTS.ROOSTER17]: 'Year of the Rooster 2017',
[EVENTS.UPRISING17]: 'Uprising 2017',
[EVENTS.ANNIVERSARY17]: 'Anniversary 2017'
[EVENTS.ANNIVERSARY17]: 'Anniversary 2017',
[EVENTS.SUMMER]: 'Summer Games',
[EVENTS.HALLOWEEN]: 'Halloween Terror',
};

const EVENTTIMES = {
//[EVENTS.SUMMER16]: {1502204400000
// "start": "1470164400000",
// "end": "1471928400000"
//},
[EVENTS.HALLOWEEN16]: {
"start": "1476208800000",
"end": "1478059200000"
},
//[EVENTS.HALLOWEEN16]: {
// "start": "1476208800000",
// "end": "1478059200000"
//},
[EVENTS.CHRISTMAS16]: {
"start": "1481652000000",
"end": "1483416000000"
@@ -58,16 +62,37 @@ const EVENTTIMES = {
"start": "1502204400000",
"end": "1504000800000"
},
[EVENTS.HALLOWEEN]: {
"start": "1476208800000",
"end": "1478059200000"
}
};

const EVENT_ITEM_ORDER = {
[EVENTS.SUMMER]: {
"icons": ['heroName', 'name'],
"skins": [a => qualityOrder[a.quality], 'heroName', 'name']
},
[EVENTS.HALLOWEEN]: {
"icons": ['heroName', 'name'],
"skins": [a => qualityOrder[a.quality], 'heroName', 'name']
},
[EVENTS.ANNIVERSARY17]: {
"icons": ['heroName', 'name']
}
};

module.exports = { EVENTS, EVENTNAMES, EVENTTIMES, EVENTORDER, CURRENTEVENT, EVENT_ITEM_ORDER };
// Mapping of cases where the new item previews are only stored under the events so when the hero data
// is generated it links the preview to the preview stored under the event. This is because in most cases
// heroes have their own item previews seperate from events but this is not always the case as I am lazy.
const EVENT_PREVIEWS = {
[EVENTS.ANNIVERSARY17]: ['emotes'],
[EVENTS.SUMMER]: ['emotes', 'intros']
}

const NEW_EVENTS = [
EVENTS.SUMMER,
EVENTS.HALLOWEEN
]

module.exports = { EVENTS, EVENTNAMES, EVENTTIMES, EVENTORDER, CURRENTEVENT, EVENT_ITEM_ORDER, EVENT_PREVIEWS, NEW_EVENTS };
@@ -112,6 +112,124 @@ const EVENTITEMS = {
"poses/widowmaker-medal",
"poses/winston-medal",
"poses/zenyatta-medals"
],
'HALLOWEEN_2016': [
"skins/ana-ghoul",
"skins/bastion-tombstone",
"skins/hanzo-demon",
"skins/pharah-possessed",
"skins/reinhardt-coldhardt",
"skins/soldier-76-immortal",
"skins/symmetra-vampire",
"skins/zenyatta-skullyatta",
"emotes/ana-candy",
"emotes/reinhardt-pumpkin-smash",
"emotes/winston-shadow-puppets",
"sprays/ana-trick-or-treat",
"sprays/bastion-trick-or-treat",
"sprays/dva-trick-or-treat",
"sprays/genji-trick-or-treat",
"sprays/hanzo-trick-or-treat",
"sprays/junkrat-trick-or-treat",
"sprays/lucio-trick-or-treat",
"sprays/mccree-trick-or-treat",
"sprays/mei-trick-or-treat",
"sprays/mercy-trick-or-treat",
"sprays/pharah-trick-or-treat",
"sprays/reaper-trick-or-treat",
"sprays/reinhardt-trick-or-treat",
"sprays/roadhog-trick-or-treat",
"sprays/soldier-76-trick-or-treat",
"sprays/symmetra-trick-or-treat",
"sprays/torbjorn-trick-or-treat",
"sprays/tracer-trick-or-treat",
"sprays/widowmaker-trick-or-treat",
"sprays/winston-trick-or-treat",
"sprays/zarya-trick-or-treat",
"sprays/zenyatta-trick-or-treat",
"sprays/never-die",
"sprays/bats",
"sprays/boo",
"sprays/boop",
"sprays/candyball",
"sprays/fangs",
"sprays/gummy-hog",
"sprays/halloween-terror",
"sprays/pumpkins",
"sprays/witchs-brew",
"sprays/halloween-special",
"sprays/junkensteins-revenge",
"sprays/rise-of-the-zomnics",
"sprays/the-reapening",
"voicelines/ana-are-you-scared",
"voicelines/bastion-wwwooooo",
"voicelines/dva-happy-halloween",
"voicelines/genji-my-halloween-costume",
"voicelines/hanzo-you-are-already-dead",
"voicelines/junkrat-happy-halloween",
"voicelines/lucio-killed-it",
"voicelines/mccree-its-your-funeral",
"voicelines/mei-scary",
"voicelines/mercy-superstition",
"voicelines/pharah-dead-or-alive",
"voicelines/reaper-i-work-the-graveyard-shift",
"voicelines/reinhardt-smashing",
"voicelines/roadhog-want-some-candy",
"voicelines/soldier-76-knock-knock",
"voicelines/symmetra-a-frightening-thought",
"voicelines/torbjorn-if-you-build-it",
"voicelines/tracer-ooh-scary",
"voicelines/widowmaker-the-party-is-over",
"voicelines/winston-this-is-not-a-costume",
"voicelines/zarya-never-forget-the-fallen",
"voicelines/zenyatta-trick-or-treat",
"poses/ana-rip",
"poses/bastion-rip",
"poses/dva-rip",
"poses/genji-rip",
"poses/hanzo-rip",
"poses/junkrat-rip",
"poses/lucio-rip",
"poses/mccree-rip",
"poses/mei-rip",
"poses/mercy-rip",
"poses/pharah-rip",
"poses/reaper-rip",
"poses/reinhardt-rip",
"poses/roadhog-rip",
"poses/soldier-76-rip",
"poses/symmetra-rip",
"poses/torbjorn-rip",
"poses/tracer-rip",
"poses/widowmaker-rip",
"poses/winston-rip",
"poses/zarya-rip",
"poses/zenyatta-rip",
"intros/genji-pumpkin-carving",
"intros/mei-ice-scream",
"intros/reaper-eternal-rest",
"skins/junkrat-dr-junkenstein",
"skins/mercy-witch",
"skins/reaper-pumpkin",
"skins/roadhog-junkensteins-monster",
"icons/never-die",
"icons/bewitching",
"icons/calavera",
"icons/candle",
"icons/eyeball",
"icons/ghostymari",
"icons/halloween-terror-2016",
"icons/spider",
"icons/superstition",
"icons/junkrat-the-doctor",
"icons/roadhog-the-monster",
"icons/reaper-the-reaper",
"icons/mercy-the-witch",
"icons/tombstone",
"icons/vampachimari",
"icons/witchs-brew",
"icons/witchs-hat",
"icons/wolf"
]
};

@@ -102,15 +102,15 @@ const data = {
allClassEventItems: {
sprays: {
[EVENTS.SUMMER]: ['summer-games-2016', 'summer-games', 'goal-blossom', 'safe-hands', 'bicycle-kick'],
[EVENTS.HALLOWEEN16]: ['never-die', 'bats', 'boo', 'boop', 'candyball', 'fangs', 'gummy-hog', 'halloween-terror', 'pumpkins', 'witchs-brew', 'halloween-special', 'junkensteins-revenge', 'rise-of-the-zomnics', 'the-reapening'],
[EVENTS.HALLOWEEN]: ['never-die', 'bats', 'boo', 'boop', 'candyball', 'fangs', 'gummy-hog', 'halloween-terror', 'pumpkins', 'witchs-brew', 'halloween-special', 'junkensteins-revenge', 'rise-of-the-zomnics', 'the-reapening'],
[EVENTS.CHRISTMAS16]: ['snowcree', 'snowhog', 'snowmei', 'snowreaper', 'winter-wonderland'],
[EVENTS.ROOSTER17]: ['auspicious-lion', 'awakened-lion', 'dragons-head', 'lucky-pouch', 'red-envelope', 'year-of-the-rooster'],
[EVENTS.UPRISING17]: ['b73ns', 'eradicator', 'null-sector', 'nullmari', 'nulltrooper', 'or14ns', 'slicer'],
[EVENTS.ANNIVERSARY17]: ['anniversary-2017']
},
icons: {
[EVENTS.SUMMER]: ["summer-games-2016", "summer-games-2017", "australia", "brazil", "china", "egypt", "france", "germany", "greece", "japan", "mexico", "nepal", "numbani", "russia", "south-korea", "sweden", "switzerland", "united-kingdom", "united-states-of-america"],
[EVENTS.HALLOWEEN16]: ["halloween-terror-2016", "never-die", "bewitching", "calavera", "candle", "eyeball", "ghostymari", "spider", "superstition", "tombstone", "vampachimari", "witchs-brew", "witchs-hat", "wolf"],
[EVENTS.HALLOWEEN]: ["halloween-terror-2016", "never-die", "bewitching", "calavera", "candle", "eyeball", "ghostymari", "spider", "superstition", "tombstone", "vampachimari", "witchs-brew", "witchs-hat", "wolf"],
[EVENTS.CHRISTMAS16]: ["winter-wonderland-2016", "snowman", "present", "pachimerry", "gingermari", "2017", "holly", "tannenbaum", "bubbly", "gingerbread", "candy-cane", "ornament", "hot-cocoa", "cheers", "wreath", "mochi", "dreidel", "bells", "peppermint", "snow-globe", "pachireindeer", "stocking"],
[EVENTS.ROOSTER17]: ["bokimari", "coin", "dragon-dance", "fortune", "fuchimari", "gold", "have-fish", "lantern", "lion-dance", "lucky-pouch", "peachimari", "new-year-cake", "pachilantern", "red-envelope", "seollal", "tangerines", "year-of-the-rooster-2017"],
[EVENTS.UPRISING17]: ['uprising-2017', 'null-sector', 'drop-pod', 'b73ns', 'nullmari'],
@@ -51,16 +51,16 @@ const getCleanID = (what, hero) => {
what = stupidNames[what] || what;
return (hero ? `${hero}-` : '') +
what.toLowerCase()
.replace('ị', 'i')
.replace('é', 'e')
.replace(/[åäà]/g, 'a')
.replace(/[öôọ]/g, 'o')
.replace('ú', 'u')
.replace('çã', 'ca')
.replace(/[^a-zA-Z 0-9]/g, '')
.trim()
.replace(/\s+/g, " ")
.replace(/ /g, '-');
.replace('ị', 'i')
.replace('é', 'e')
.replace(/[åäà]/g, 'a')
.replace(/[öôọ]/g, 'o')
.replace('ú', 'u')
.replace('çã', 'ca')
.replace(/[^a-zA-Z 0-9]/g, '')
.trim()
.replace(/\s+/g, " ")
.replace(/ /g, '-');
};

// Returns the image or video URL for an item
@@ -0,0 +1,17 @@
const fs = require('fs');
const _ = require('lodash');

const events = require('./events.json')
const event = 'HALLOWEEN_2016'

const stuff = _.reduce(events[event].items, (res, items, type) => {
type = type.includes('skins') ? 'skins' : type

for (let item of items) {
res.push(`${type}/${item.id}`)
}

return res
}, [])

fs.writeFileSync('./stuff.json', JSON.stringify(stuff, null, 2))
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
@@ -0,0 +1,169 @@
<div class="event-progress">
<div class="event-progress-bar progress-bar active" style="width: {{totals.overall.percentage}}%;" ng-class="{'progress-bar-striped': totals.overall.selected === totals.overall.total}"></div>
<span>{{totals.overall.selected}} / {{totals.overall.total}} Unlocks</span>
</div>
<div class="col-md-8 col-padding">
<legendary-skins></legendary-skins>
<div id="voicelines" class="section">
<div class="section-header">
<h2>Voice Lines <small class="itemTotal">{{totals['voicelines'].selected}}/{{totals['voicelines'].total}}</small></h2>
</div>
<div class="items flex-3">
<div
ng-repeat="item in ::data.items.voicelines track by $index"
ng-init="type = 'voicelines'"
class="item"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="300"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4 ng-if="::item.heroName">{{::item.heroName}}</h4>
<h3 class="{{::item.quality}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
<div id="icons" class="section">
<div class="section-header">
<h2>Player Icons <small class="itemTotal">{{totals['icons'].selected}}/{{totals['icons'].total}}</small></h2>
</div>
<div class="items flex-4">
<div
ng-repeat="item in ::data.items.icons track by $index"
ng-init="type = 'icons'"
class="item"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="275"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4>{{::item.heroName || 'All'}}</h4>
<h3 class="{{::item.quality || 'common'}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
</div>

<div class="col-md-4 col-padding">
<div id="skins" class="section">
<div class="section-header">
<h2>Skins <small class="itemTotal">{{totals['skins'].selected}}/{{totals['skins'].total}}</small></h2>
</div>
<div class="items flex-2">
<div
ng-repeat="item in ::data.items.skins track by $index"
ng-init="type = 'skins'"
class="item"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="275"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4 ng-if="::item.heroName">{{::item.heroName}}</h4>
<h3 class="{{::item.quality}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
<div id="victoryposes" class="section">
<div class="section-header">
<h2>Victory Poses <small class="itemTotal">{{totals['poses'].selected}}/{{totals['poses'].total}}</small></h2>
</div>
<div class="items flex-2">
<div
ng-repeat="item in ::data.items.poses track by $index"
ng-init="type = 'poses'"
class="item"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="275"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4 ng-if="::item.heroName">{{::item.heroName}}</h4>
<h3 class="{{::item.quality}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
<div id="emotes" class="section">
<div class="section-header">
<h2>Emotes <small class="itemTotal">{{totals['emotes'].selected}}/{{totals['emotes'].total}}</small></h2>
</div>
<div class="items flex-2">
<div
ng-repeat="item in ::data.items.emotes track by $index"
ng-init="type = 'emotes'"
class="item"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="275"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4 ng-if="::item.heroName">{{::item.heroName}}</h4>
<h3 class="{{::item.quality}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
<div id="intros" class="section">
<div class="section-header">
<h2>Highlight Intros <small class="itemTotal">{{totals['intros'].selected}}/{{totals['intros'].total}}</small></h2>
</div>
<div class="items flex-2">
<div
ng-repeat="item in ::data.items.intros track by $index"
ng-init="type = 'intros'"
class="item"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="275"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4 ng-if="::item.heroName">{{::item.heroName}}</h4>
<h3 class="{{::item.quality}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
<div id="sprays" class="section">
<div class="section-header">
<h2>Sprays <small class="itemTotal">{{totals['sprays'].selected}}/{{totals['sprays'].total}}</small></h2>
</div>
<div class="items flex-2">
<div
ng-repeat="item in ::data.items.sprays track by $index"
ng-init="type = 'sprays'"
class="item"
achievement="{{::item.achievement}}"
uib-tooltip-template="'imagePreviewTemplate.html'"
tooltip-popup-delay="275"
tooltip-class="img-preview"
tooltip-enable="{{::canPlayType(type)}}"
tooltip-placement="bottom auto">
<input type="checkbox" id="{{type + item.id + $index}}" ng-model="checked[item.hero][type][item.id]" ng-change="onSelect(item, type)">
<label for="{{type + item.id + $index}}">
<h4>{{::item.heroName || 'All'}}</h4>
<h3 class="{{::item.quality || 'common'}}">{{::item.name}} <small class="color-cost">{{ ::item | itemPrice:type:true }}</small></h3>
</label>
</div>
</div>
</div>
</div>

<script type="text/ng-template" id="imagePreviewTemplate.html">
<tooltip-image-preview></tooltip-image-preview>
</script>

This file was deleted.