| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- <template>
- <div class="shop-widget"
- :style="localOptions.style">
- <q-banner>
- محصولات
- </q-banner>
- <div class="shop-widget__content">
- <div class="shop-widget__sidebar">
- <sidebar :type="searchTab"
- @onChangeFilters="onChangeSidebarFilters" />
- </div>
- <div class="shop-widget__main">
- <div class="shop-widget__main-top-filter">
- <div class="shop-widget__main-top-filter-tools">
- <div class="shop-widget__main-top-filter-txt">
- <q-input v-model="topFilters.search"
- :debounce="300"
- placeholder="جستجوی محصولات"
- @update:model-value="search">
- <template #prepend>
- <q-icon name="search" />
- </template>
- </q-input>
- </div>
- <div class="shop-widget__main-top-filter-sort">
- <div class="shop-widget__main-top-filter-sort-label">
- ترتیب نمایش
- </div>
- <div class="shop-widget__main-top-filter-sort-select">
- <q-select v-model="topFilters.sort"
- emit-value
- map-options
- :options="sortOptions"
- @update:model-value="search" />
- </div>
- </div>
- </div>
- <div class="shop-widget__main-top-filter-tabs">
- <q-tabs v-model="searchTab"
- align="left"
- active-bg-color="primary"
- active-color="white">
- <q-tab label="محصولات"
- name="product" />
- <q-tab label="بسته"
- name="package" />
- </q-tabs>
- </div>
- </div>
- <div v-if="mounted"
- class="shop-widget__result">
- <q-tab-panels v-model="searchTab"
- animated>
- <q-tab-panel name="product">
- <entity-index ref="productEntityIndex"
- v-model:value="productInputs"
- :default-layout="false"
- :api="productApi"
- :table="tableColumns"
- :table-keys="tableKeys"
- :table-grid-size="true"
- :show-expand-button="false"
- :show-reload-button="false"
- :show-search-button="false">
- <template #entity-index-table-item-cell="{inputData}">
- <div class="shop-widget__result-product-item">
- <product-item :product="getProduct(inputData.props.row)" />
- </div>
- </template>
- </entity-index>
- </q-tab-panel>
- <q-tab-panel name="package">
- <entity-index ref="packageEntityIndex"
- v-model:value="packageInputs"
- :default-layout="false"
- :api="packageApi"
- :table="tableColumns"
- :table-keys="tableKeys"
- :table-grid-size="true"
- :show-expand-button="false"
- :show-reload-button="false"
- :show-search-button="false">
- <template #entity-index-table-item-cell="{inputData}">
- <div class="shop-widget__result-product-item">
- <package-item :package-item="getPackage(inputData.props.row)" />
- </div>
- </template>
- </entity-index>
- </q-tab-panel>
- </q-tab-panels>
- </div>
- </div>
- </div>
- </div>
- </template>
- <script>
- import { EntityIndex } from 'quasar-crud'
- import Sidebar from './components/sidebar.vue'
- import { Product } from 'src/models/Product.js'
- import { Package } from 'src/models/Package.js'
- import { mixinWidget } from 'src/mixin/Mixins.js'
- import { APIGateway } from 'src/api/APIGateway.js'
- import ProductItem from './components/productItem.vue'
- import PackageItem from './components/packageItem.vue'
- import { FormBuilderAssist } from 'quasar-form-builder'
- export default {
- name: 'ContentList',
- components: { EntityIndex, ProductItem, PackageItem, Sidebar },
- mixins: [mixinWidget],
- data () {
- return {
- mounted: false,
- searchTab: 'package', // product - package
- topFilters: {
- search: null,
- sort: 'BEST_SELLING'
- },
- sidebarFilters: {},
- sortOptions: [
- {
- label: 'پرفروش ترین',
- value: 'BEST_SELLING'
- },
- {
- label: 'گران ترین',
- value: 'MOST_EXPENSIVE'
- },
- {
- label: 'ارزان ترین',
- value: 'LEAST_EXPENSIVE'
- }
- ],
- tableColumns: {
- columns: []
- },
- tableKeys: {
- data: 'results',
- total: 'count',
- currentPage: 'current',
- perPage: 'per_page',
- pageKey: 'page'
- },
- productApi: APIGateway.product.APIAdresses.base,
- packageApi: APIGateway.package.APIAdresses.base,
- productInputs: [
- { type: 'hidden', name: 'search', value: null },
- { type: 'hidden', name: 'sort', value: null },
- { type: 'hidden', name: 'unit_price__lt', value: null },
- { type: 'hidden', name: 'unit_price__gte', value: null },
- { type: 'hidden', name: 'inventory__gte', value: null },
- { type: 'hidden', name: 'category__in', value: null },
- { type: 'hidden', name: 'physical_type__in', value: null },
- { type: 'hidden', name: 'medias__type__in', value: null }
- ],
- packageInputs: [
- { type: 'hidden', name: 'search', value: null },
- { type: 'hidden', name: 'sort', value: null },
- { type: 'hidden', name: 'unit_price__lt', value: null },
- { type: 'hidden', name: 'unit_price__gte', value: null },
- { type: 'hidden', name: 'inventory__gte', value: null }
- ]
- }
- },
- mounted() {
- this.mounted = true
- },
- methods: {
- onChangeSidebarFilters (filters) {
- this.sidebarFilters = filters
- this.search()
- },
- search () {
- this.updateFilters()
- if (this.searchTab === 'product') {
- this.searchProducts()
- }
- if (this.searchTab === 'package') {
- this.searchPackage()
- }
- },
- updateFilters () {
- this.updateProductFilters()
- this.updatePackageFilters()
- },
- updateProductFilters () {
- // topFilters
- FormBuilderAssist.setAttributeByName(this.productInputs, 'sort', 'value', this.topFilters.sort)
- FormBuilderAssist.setAttributeByName(this.productInputs, 'search', 'value', this.topFilters.search)
- // sidebarFilters
- FormBuilderAssist.setAttributeByName(this.productInputs, 'unit_price__lt', 'value', this.sidebarFilters.unit_price__lt)
- FormBuilderAssist.setAttributeByName(this.productInputs, 'unit_price__gte', 'value', this.sidebarFilters.unit_price__gte)
- FormBuilderAssist.setAttributeByName(this.productInputs, 'inventory__gte', 'value', this.sidebarFilters.inventory__gte)
- FormBuilderAssist.setAttributeByName(this.productInputs, 'category__in', 'value', this.sidebarFilters.category__in?.join())
- FormBuilderAssist.setAttributeByName(this.productInputs, 'physical_type__in', 'value', this.sidebarFilters.physical_type__in?.join())
- FormBuilderAssist.setAttributeByName(this.productInputs, 'medias__type__in', 'value', this.sidebarFilters.medias__type__in?.join())
- },
- updatePackageFilters () {
- // topFilters
- FormBuilderAssist.setAttributeByName(this.packageInputs, 'sort', 'value', this.topFilters.sort)
- FormBuilderAssist.setAttributeByName(this.packageInputs, 'search', 'value', this.topFilters.search)
- // sidebarFilters
- FormBuilderAssist.setAttributeByName(this.packageInputs, 'unit_price__lt', 'value', this.sidebarFilters.unit_price__lt)
- FormBuilderAssist.setAttributeByName(this.packageInputs, 'unit_price__gte', 'value', this.sidebarFilters.unit_price__gte)
- FormBuilderAssist.setAttributeByName(this.packageInputs, 'inventory__gte', 'value', this.sidebarFilters.inventory__gte)
- },
- searchProducts () {
- if (!this.$refs.productEntityIndex) {
- return
- }
- this.$refs.productEntityIndex.search()
- },
- searchPackage () {
- if (!this.$refs.packageEntityIndex) {
- return
- }
- this.$refs.packageEntityIndex.search()
- },
- getProduct (data) {
- return new Product(data)
- },
- getPackage (data) {
- return new Package(data)
- }
- }
- }
- </script>
- <style scoped lang="scss">
- .shop-widget {
- .shop-widget__content {
- display: flex;
- gap: 24px;
- justify-content: flex-start;
- $sidebar-width: 312px;
- .shop-widget__sidebar {
- width: $sidebar-width;
- }
- .shop-widget__main {
- width: calc( 100% - #{$sidebar-width} );
- .shop-widget__main-top-filter {
- .shop-widget__main-top-filter-tools {
- display: flex;
- justify-content: flex-start;
- gap: 24px;
- $sort-width: 312px;
- margin-bottom: 20px;
- .shop-widget__main-top-filter-sort {
- width: $sort-width;
- gap: 24px;
- display: flex;
- align-items: center;
- justify-content: flex-start;
- .shop-widget__main-top-filter-sort-label {}
- .shop-widget__main-top-filter-sort-select {
- flex: 1;
- }
- }
- .shop-widget__main-top-filter-txt {
- width: calc( 100% - #{$sort-width} );
- :deep(.q-field) {
- .q-field__inner {
- .q-field__control {
- .q-field__prepend {
- padding: 0;
- width: 36px;
- justify-content: flex-end;
- height: 100%;
- font-size: 26px;
- }
- .q-field__control-container {
- .q-field__native {
- padding-left: 4px;
- }
- .q-field__label {
- margin-left: 4px;
- }
- }
- }
- }
- }
- }
- }
- .shop-widget__main-top-filter-tabs {
- padding: 12px 20px;
- border: 1px solid #DFE1EC;
- border-radius: 8px 8px 0 0;
- margin-bottom: 27px;
- :deep(.q-tabs) {
- .q-tabs__content {
- .q-tab {
- border-radius: 8px;
- min-height: 45px;
- width: 160px;
- .q-tab__indicator {
- display: none;
- }
- }
- }
- }
- }
- }
- :deep(.shop-widget__result) {
- .q-tab-panel {
- padding: 0;
- .quasar-crud-index-table {
- padding: 0;
- .q-table__grid-content {
- margin: -18px;
- .shop-widget__result-product-item {
- width: 33%;
- padding: 18px;
- flex: 0 0 auto;
- }
- }
- }
- }
- }
- }
- }
- }
- </style>
|