diff --git a/website/client/components/inventory/stable/hatchingModal.vue b/website/client/components/inventory/stable/hatchingModal.vue
new file mode 100644
index 0000000000..cfd89d47bc
--- /dev/null
+++ b/website/client/components/inventory/stable/hatchingModal.vue
@@ -0,0 +1,84 @@
+
+b-modal#hatching-modal(@change="resetHatchablePet($event)")
+ div.content(v-if="hatchablePet")
+ div.potionEggGroup
+ div.potionEggBackground
+ div(:class="'Pet_HatchingPotion_'+hatchablePet.potionKey")
+ div.potionEggBackground
+ div(:class="'Pet_Egg_'+hatchablePet.eggKey")
+ h4.title {{ hatchablePet.name }}
+ div.text(v-html="$t('hatchDialogText', { potionName: hatchablePet.potionName, eggName: hatchablePet.eggName, petName: hatchablePet.name })")
+ span.svg-icon.icon-10(v-html="icons.close", slot="modal-header", @click="closeHatchPetDialog()")
+ div(slot="modal-footer")
+ button.btn.btn-primary(@click="hatchPet(hatchablePet)") {{ $t('hatch') }}
+ button.btn.btn-secondary.btn-flat(@click="closeHatchPetDialog()") {{ $t('cancel') }}
+
+
+
+
+
diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue
index 641e091b1d..d84d563ec7 100644
--- a/website/client/components/inventory/stable/index.vue
+++ b/website/client/components/inventory/stable/index.vue
@@ -1,245 +1,205 @@
- // @TODO: breakdown to componentes and use some SOLID
- .row.stable(v-mousePosition="30", @mouseMoved="mouseMoved($event)")
- .standard-sidebar.d-none.d-sm-block
- div
- #npmMattStable.npc_matt
- b-popover(
- triggers="hover",
- placement="right",
- target="npmMattStable"
- )
- h4.popover-content-title(v-once) {{ $t('mattBoch') }}
- .popover-content-text(v-once) {{ $t('mattBochText1') }}
-
+.row.stable(v-mousePosition="30", @mouseMoved="mouseMoved($event)")
+ .standard-sidebar.d-none.d-sm-block
+ div
+ #npmMattStable.npc_matt
+ b-popover(
+ triggers="hover",
+ placement="right",
+ target="npmMattStable"
+ )
+ h4.popover-content-title(v-once) {{ $t('mattBoch') }}
+ .popover-content-text(v-once) {{ $t('mattBochText1') }}
+ .form-group
+ input.form-control.input-search(type="text", v-model="searchText", :placeholder="$t('search')")
+ .form
+ h2(v-once) {{ $t('filter') }}
+ h3(v-once) {{ $t('pets') }}
.form-group
- input.form-control.input-search(type="text", v-model="searchText", :placeholder="$t('search')")
-
- .form
- h2(v-once) {{ $t('filter') }}
- h3(v-once) {{ $t('pets') }}
- .form-group
- .form-check(
- v-for="petGroup in petGroups",
- :key="petGroup.key"
- )
- .custom-control.custom-checkbox
- input.custom-control-input(
- type="checkbox",
- v-model="viewOptions[petGroup.key].selected",
- :disabled="viewOptions[petGroup.key].animalCount == 0",
- :id="petGroup.key",
- )
- label.custom-control-label(v-once, :for="petGroup.key") {{ petGroup.label }}
- h3(v-once) {{ $t('mounts') }}
- .form-group
- .form-check(
- v-for="mountGroup in mountGroups",
- :key="mountGroup.key"
- )
- .custom-control.custom-checkbox
- input.custom-control-input(
- type="checkbox",
- v-model="viewOptions[mountGroup.key].selected",
- :disabled="viewOptions[mountGroup.key].animalCount == 0",
- :id="mountGroup.key",
- )
- label.custom-control-label(v-once, :for="mountGroup.key") {{ mountGroup.label }}
-
- div.form-group.clearfix
- h3.float-left {{ $t('hideMissing') }}
- toggle-switch.float-right(
- :checked="hideMissing",
- @change="updateHideMissing"
- )
- .standard-page
- .clearfix
- h1.float-left.mb-4.page-header(v-once) {{ $t('stable') }}
-
- div.float-right
- span.dropdown-label {{ $t('sortBy') }}
- b-dropdown(:text="$t(selectedSortBy)", right=true)
- b-dropdown-item(
- v-for="sort in sortByItems",
- @click="selectedSortBy = sort",
- :active="selectedSortBy === sort",
- :key="sort"
- ) {{ $t(sort) }}
-
- h2.mb-3
- | {{ $t('pets') }}
- |
- span.badge.badge-pill.badge-default {{countOwnedAnimals(petGroups[0], 'pet')}}
-
- div(
- v-for="(petGroup, index) in petGroups",
- v-if="viewOptions[petGroup.key].selected",
- :key="petGroup.key"
- )
- h4(v-if="viewOptions[petGroup.key].animalCount !== 0") {{ petGroup.label }}
-
- .pet-row.d-flex(
- v-for="(group, key, index) in pets(petGroup, hideMissing, selectedSortBy, searchTextThrottled)",
- v-if='index === 0 || $_openedItemRows_isToggled(petGroup.key)')
- .pet-group(
- v-for='item in group'
- v-drag.drop.food="item.key",
- @itemDragOver="onDragOver($event, item)",
- @itemDropped="onDrop($event, item)",
- @itemDragLeave="onDragLeave()",
- :class="{'last': item.isLastInRow}"
- )
- petItem(
- :item="item",
- :itemContentClass="getPetItemClass(item)",
- :popoverPosition="'top'",
- :progress="item.progress",
- :emptyItem="!item.isOwned()",
- :showPopover="currentDraggingFood == null",
- :highlightBorder="highlightPet == item.key",
- @click="petClicked(item)"
- )
- span(slot="popoverContent")
- div.hatchablePopover(v-if="item.isHatchable()")
- h4.popover-content-title {{ item.name }}
- div.popover-content-text(v-html="$t('haveHatchablePet', { potion: item.potionName, egg: item.eggName })")
- div.potionEggGroup
- div.potionEggBackground
- div(:class="'Pet_HatchingPotion_'+item.potionKey")
- div.potionEggBackground
- div(:class="'Pet_Egg_'+item.eggKey")
- div(v-else)
- h4.popover-content-title {{ item.name }}
- template(slot="itemBadge", slot-scope="context")
- starBadge(:selected="item.key === currentPet", :show="item.isOwned()", @click="selectPet(item)")
-
- .btn.btn-flat.btn-show-more(@click="setShowMore(petGroup.key)", v-if='petGroup.key !== "specialPets"')
- | {{ $_openedItemRows_isToggled(petGroup.key) ? $t('showLess') : $t('showMore') }}
-
- h2
- | {{ $t('mounts') }}
- |
- span.badge.badge-pill.badge-default {{countOwnedAnimals(mountGroups[0], 'mount')}}
-
- div(
- v-for="mountGroup in mountGroups",
- v-if="viewOptions[mountGroup.key].selected",
- :key="mountGroup.key"
- )
- h4(v-if="viewOptions[mountGroup.key].animalCount != 0") {{ mountGroup.label }}
-
- .pet-row.d-flex(v-for="(group, key, index) in mounts(mountGroup, hideMissing, selectedSortBy, searchTextThrottled)"
- v-if='index === 0 || $_openedItemRows_isToggled(mountGroup.key)')
- .pet-group(v-for='item in group')
- mountItem(
- :item="item",
- :itemContentClass="item.isOwned() ? ('Mount_Icon_' + item.key) : 'PixelPaw GreyedOut'",
- :key="item.key",
- :popoverPosition="'top'",
- :emptyItem="!item.isOwned()",
- :showPopover="true",
- @click="selectMount(item)"
- )
- span(slot="popoverContent")
- h4.popover-content-title {{ item.name }}
- template(slot="itemBadge", slot-scope="context")
- starBadge(
- :selected="item.key === currentMount",
- :show="item.isOwned()",
- @click="selectMount(item)",
- )
-
- .btn.btn-flat.btn-show-more(@click="setShowMore(mountGroup.key)", v-if='mountGroup.key !== "specialMounts"')
- | {{ $_openedItemRows_isToggled(mountGroup.key) ? $t('showLess') : $t('showMore') }}
-
- drawer(
- :title="$t('quickInventory')",
- :errorMessage="(!hasDrawerTabItems(selectedDrawerTab)) ? ((selectedDrawerTab === 0) ? $t('noFoodAvailable') : $t('noSaddlesAvailable')) : null"
- )
- div(slot="drawer-header")
- .drawer-tab-container
- .drawer-tab.text-right
- a.drawer-tab-text(
- @click="selectedDrawerTab = 0",
- :class="{'drawer-tab-text-active': selectedDrawerTab === 0}",
- ) {{ drawerTabs[0].label }}
- .clearfix
- .drawer-tab.float-left
- a.drawer-tab-text(
- @click="selectedDrawerTab = 1",
- :class="{ 'drawer-tab-text-active': selectedDrawerTab === 1 }",
- ) {{ drawerTabs[1].label }}
-
- #petLikeToEatStable.drawer-help-text(v-once)
- | {{ $t('petLikeToEat') + ' ' }}
- span.svg-icon.inline.icon-16(v-html="icons.information")
- b-popover(
- target="petLikeToEatStable"
- placement="top"
- )
- .popover-content-text(v-html="$t('petLikeToEatText')", v-once)
- drawer-slider(
- :items="drawerTabs[selectedDrawerTab].items",
- :scrollButtonsVisible="hasDrawerTabItems(selectedDrawerTab)",
- slot="drawer-slider",
- :itemWidth=94,
- :itemMargin=24,
- :itemType="selectedDrawerTab"
+ .form-check(
+ v-for="petGroup in petGroups",
+ :key="petGroup.key"
)
- template(slot="item", slot-scope="context")
- foodItem(
- :item="context.item",
- :itemCount="userItems.food[context.item.key]",
- :active="currentDraggingFood == context.item",
- @itemDragEnd="onDragEnd()",
- @itemDragStart="onDragStart($event, context.item)",
- @itemClick="onFoodClicked($event, context.item)"
+ .custom-control.custom-checkbox
+ input.custom-control-input(
+ type="checkbox",
+ v-model="viewOptions[petGroup.key].selected",
+ :disabled="viewOptions[petGroup.key].animalCount == 0",
+ :id="petGroup.key",
)
- b-modal#welcome-modal(
- :ok-only="true",
- :ok-title="$t('gotIt')",
- :visible="!hideDialog",
- :hide-header="true",
- @hide="hideFlag()"
- )
- div.content
- div.npc_matt
- h1.page-header(v-once) {{ $t('welcomeStable') }}
- div.content-text(v-once) {{ $t('welcomeStableText') }}
- b-modal#hatching-modal(
- @change="resetHatchablePet($event)"
- )
- div.content(v-if="hatchablePet")
- div.potionEggGroup
- div.potionEggBackground
- div(:class="'Pet_HatchingPotion_'+hatchablePet.potionKey")
- div.potionEggBackground
- div(:class="'Pet_Egg_'+hatchablePet.eggKey")
- h4.title {{ hatchablePet.name }}
- div.text(v-html="$t('hatchDialogText', { potionName: hatchablePet.potionName, eggName: hatchablePet.eggName, petName: hatchablePet.name })")
+ label.custom-control-label(v-once, :for="petGroup.key") {{ petGroup.label }}
+ h3(v-once) {{ $t('mounts') }}
+ .form-group
+ .form-check(
+ v-for="mountGroup in mountGroups",
+ :key="mountGroup.key"
+ )
+ .custom-control.custom-checkbox
+ input.custom-control-input(
+ type="checkbox",
+ v-model="viewOptions[mountGroup.key].selected",
+ :disabled="viewOptions[mountGroup.key].animalCount == 0",
+ :id="mountGroup.key",
+ )
+ label.custom-control-label(v-once, :for="mountGroup.key") {{ mountGroup.label }}
- span.svg-icon.icon-10(v-html="icons.close", slot="modal-header", @click="closeHatchPetDialog()")
+ div.form-group.clearfix
+ h3.float-left {{ $t('hideMissing') }}
+ toggle-switch.float-right(
+ :checked="hideMissing",
+ @change="updateHideMissing"
+ )
+ .standard-page
+ .clearfix
+ h1.float-left.mb-4.page-header(v-once) {{ $t('stable') }}
- div(slot="modal-footer")
- button.btn.btn-primary(@click="hatchPet(hatchablePet)") {{ $t('hatch') }}
- button.btn.btn-secondary.btn-flat(@click="closeHatchPetDialog()") {{ $t('cancel') }}
+ div.float-right
+ span.dropdown-label {{ $t('sortBy') }}
+ b-dropdown(:text="$t(selectedSortBy)", right=true)
+ b-dropdown-item(
+ v-for="sort in sortByItems",
+ @click="selectedSortBy = sort",
+ :active="selectedSortBy === sort",
+ :key="sort"
+ ) {{ $t(sort) }}
- hatchedPetDialog(
- :hideText="true",
- )
+ h2.mb-3
+ | {{ $t('pets') }}
+ |
+ span.badge.badge-pill.badge-default {{countOwnedAnimals(petGroups[0], 'pet')}}
- div.foodInfo(ref="dragginFoodInfo")
- div(v-if="currentDraggingFood != null")
- div.food-icon(:class="'Pet_Food_'+currentDraggingFood.key")
- div.popover
- div.popover-content {{ $t('dragThisFood', {foodName: currentDraggingFood.text() }) }}
+ div(v-for="(petGroup, index) in petGroups",
+ v-if="viewOptions[petGroup.key].selected",
+ :key="petGroup.key")
+ h4(v-if="viewOptions[petGroup.key].animalCount !== 0") {{ petGroup.label }}
- div.foodInfo.mouse(ref="clickFoodInfo", v-if="foodClickMode")
- div(v-if="currentDraggingFood != null")
- div.food-icon(:class="'Pet_Food_'+currentDraggingFood.key")
- div.popover
- div.popover-content {{ $t('clickOnPetToFeed', {foodName: currentDraggingFood.text() }) }}
- mount-raised-modal
+ .pet-row.d-flex(
+ v-for="(group, key, index) in pets(petGroup, hideMissing, selectedSortBy, searchTextThrottled)",
+ v-if='index === 0 || $_openedItemRows_isToggled(petGroup.key)')
+ .pet-group(
+ v-for='item in group'
+ v-drag.drop.food="item.key",
+ @itemDragOver="onDragOver($event, item)",
+ @itemDropped="onDrop($event, item)",
+ @itemDragLeave="onDragLeave()",
+ :class="{'last': item.isLastInRow}"
+ )
+ petItem(
+ :item="item",
+ :itemContentClass="getPetItemClass(item)",
+ :popoverPosition="'top'",
+ :progress="item.progress",
+ :emptyItem="!item.isOwned()",
+ :showPopover="currentDraggingFood == null",
+ :highlightBorder="highlightPet == item.key",
+ @click="petClicked(item)"
+ )
+ span(slot="popoverContent")
+ div.hatchablePopover(v-if="item.isHatchable()")
+ h4.popover-content-title {{ item.name }}
+ div.popover-content-text(v-html="$t('haveHatchablePet', { potion: item.potionName, egg: item.eggName })")
+ div.potionEggGroup
+ div.potionEggBackground
+ div(:class="'Pet_HatchingPotion_'+item.potionKey")
+ div.potionEggBackground
+ div(:class="'Pet_Egg_'+item.eggKey")
+ div(v-else)
+ h4.popover-content-title {{ item.name }}
+ template(slot="itemBadge", slot-scope="context")
+ starBadge(:selected="item.key === currentPet", :show="item.isOwned()", @click="selectPet(item)")
+
+ .btn.btn-flat.btn-show-more(@click="setShowMore(petGroup.key)", v-if='petGroup.key !== "specialPets"')
+ | {{ $_openedItemRows_isToggled(petGroup.key) ? $t('showLess') : $t('showMore') }}
+
+ h2
+ | {{ $t('mounts') }}
+ |
+ span.badge.badge-pill.badge-default {{countOwnedAnimals(mountGroups[0], 'mount')}}
+
+ div(v-for="mountGroup in mountGroups",
+ v-if="viewOptions[mountGroup.key].selected",
+ :key="mountGroup.key")
+ h4(v-if="viewOptions[mountGroup.key].animalCount != 0") {{ mountGroup.label }}
+
+ .pet-row.d-flex(v-for="(group, key, index) in mounts(mountGroup, hideMissing, selectedSortBy, searchTextThrottled)"
+ v-if='index === 0 || $_openedItemRows_isToggled(mountGroup.key)')
+ .pet-group(v-for='item in group')
+ mountItem(
+ :item="item",
+ :itemContentClass="item.isOwned() ? ('Mount_Icon_' + item.key) : 'PixelPaw GreyedOut'",
+ :key="item.key",
+ :popoverPosition="'top'",
+ :emptyItem="!item.isOwned()",
+ :showPopover="true",
+ @click="selectMount(item)"
+ )
+ span(slot="popoverContent")
+ h4.popover-content-title {{ item.name }}
+ template(slot="itemBadge", slot-scope="context")
+ starBadge(
+ :selected="item.key === currentMount",
+ :show="item.isOwned()",
+ @click="selectMount(item)",
+ )
+
+ .btn.btn-flat.btn-show-more(@click="setShowMore(mountGroup.key)", v-if='mountGroup.key !== "specialMounts"')
+ | {{ $_openedItemRows_isToggled(mountGroup.key) ? $t('showLess') : $t('showMore') }}
+
+ drawer(:title="$t('quickInventory')",
+ :errorMessage="(!hasDrawerTabItems(selectedDrawerTab)) ? ((selectedDrawerTab === 0) ? $t('noFoodAvailable') : $t('noSaddlesAvailable')) : null")
+ div(slot="drawer-header")
+ .drawer-tab-container
+ .drawer-tab.text-right
+ a.drawer-tab-text(
+ @click="selectedDrawerTab = 0",
+ :class="{'drawer-tab-text-active': selectedDrawerTab === 0}",
+ ) {{ drawerTabs[0].label }}
+ .clearfix
+ .drawer-tab.float-left
+ a.drawer-tab-text(
+ @click="selectedDrawerTab = 1",
+ :class="{ 'drawer-tab-text-active': selectedDrawerTab === 1 }",
+ ) {{ drawerTabs[1].label }}
+
+ #petLikeToEatStable.drawer-help-text(v-once)
+ | {{ $t('petLikeToEat') + ' ' }}
+ span.svg-icon.inline.icon-16(v-html="icons.information")
+ b-popover(
+ target="petLikeToEatStable"
+ placement="top"
+ )
+ .popover-content-text(v-html="$t('petLikeToEatText')", v-once)
+ drawer-slider(
+ :items="drawerTabs[selectedDrawerTab].items",
+ :scrollButtonsVisible="hasDrawerTabItems(selectedDrawerTab)",
+ slot="drawer-slider",
+ :itemWidth=94,
+ :itemMargin=24,
+ :itemType="selectedDrawerTab"
+ )
+ template(slot="item", slot-scope="context")
+ foodItem(
+ :item="context.item",
+ :itemCount="userItems.food[context.item.key]",
+ :active="currentDraggingFood == context.item",
+ @itemDragEnd="onDragEnd()",
+ @itemDragStart="onDragStart($event, context.item)",
+ @itemClick="onFoodClicked($event, context.item)"
+ )
+ hatchedPetDialog(:hideText="true")
+ div.foodInfo(ref="dragginFoodInfo")
+ div(v-if="currentDraggingFood != null")
+ div.food-icon(:class="'Pet_Food_'+currentDraggingFood.key")
+ div.popover
+ div.popover-content {{ $t('dragThisFood', {foodName: currentDraggingFood.text() }) }}
+ div.foodInfo.mouse(ref="clickFoodInfo", v-if="foodClickMode")
+ div(v-if="currentDraggingFood != null")
+ div.food-icon(:class="'Pet_Food_'+currentDraggingFood.key")
+ div.popover
+ div.popover-content {{ $t('clickOnPetToFeed', {foodName: currentDraggingFood.text() }) }}
+ mount-raised-modal
+ welcome-modal
+ hatching-modal(:hatchablePet.sync='hatchablePet')
diff --git a/website/client/components/inventory/stable/welcomeModal.vue b/website/client/components/inventory/stable/welcomeModal.vue
new file mode 100644
index 0000000000..178da7c3c6
--- /dev/null
+++ b/website/client/components/inventory/stable/welcomeModal.vue
@@ -0,0 +1,63 @@
+
+b-modal#welcome-modal(:ok-only="true",
+ :ok-title="$t('gotIt')",
+ :visible="!hideDialog",
+ :hide-header="true",
+ @hide="hideFlag()")
+ div.content
+ div.npc_matt
+ h1.page-header(v-once) {{ $t('welcomeStable') }}
+ div.content-text(v-once) {{ $t('welcomeStableText') }}
+
+
+
+
+
diff --git a/website/client/mixins/petMixin.js b/website/client/mixins/petMixin.js
new file mode 100644
index 0000000000..8ea3a658cf
--- /dev/null
+++ b/website/client/mixins/petMixin.js
@@ -0,0 +1,13 @@
+export default {
+ methods: {
+ closeHatchPetDialog () {
+ this.$root.$emit('bv::hide::modal', 'hatching-modal');
+ },
+ hatchPet (pet) {
+ this.closeHatchPetDialog();
+
+ this.$store.dispatch('common:hatch', {egg: pet.eggKey, hatchingPotion: pet.potionKey});
+ this.text(this.$t('hatchedPet', {egg: pet.eggName, potion: pet.potionName}));
+ },
+ },
+};