@total_onion/onion-library 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/package.json +1 -1
  2. package/update-component.js +2 -1
  3. package/components/block-post-type-filter-grid-v2/group_64690c62487bc.json +0 -4380
  4. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/better-reviews-widget.vue +0 -15
  5. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/buy-now-widget.vue +0 -72
  6. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/cocktail-category.vue +0 -54
  7. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/cocktail-tasting-notes.vue +0 -15
  8. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/divider-widget.vue +0 -11
  9. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/drink-tastes.vue +0 -26
  10. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/featured-post-component.vue +0 -61
  11. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/global-image-widget.vue +0 -23
  12. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/media-widget.vue +0 -23
  13. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/person-email-widget.vue +0 -20
  14. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/person-name-widget.vue +0 -15
  15. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/person-questionaire-widget.vue +0 -17
  16. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/person-rating-widget.vue +0 -25
  17. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-author-widget.vue +0 -15
  18. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-category-widget.vue +0 -20
  19. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-component.vue +0 -130
  20. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-headline-widget.vue +0 -16
  21. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-image-widget.vue +0 -60
  22. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-info-description.vue +0 -14
  23. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-info-subtitle.vue +0 -14
  24. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-link-widget.vue +0 -44
  25. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-publish-widget.vue +0 -44
  26. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-tags-widget.vue +0 -20
  27. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-text-alternative-style.vue +0 -18
  28. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/post-title-widget.vue +0 -20
  29. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/pre-render-posts-html.twig +0 -17
  30. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-abv.vue +0 -18
  31. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-age-statement.vue +0 -17
  32. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-bazaarvoice.vue +0 -15
  33. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-brand.vue +0 -16
  34. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-cask-type.vue +0 -16
  35. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-country.vue +0 -14
  36. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-description.vue +0 -15
  37. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-details-name.vue +0 -18
  38. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-details-price.vue +0 -15
  39. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-finish.vue +0 -15
  40. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-history.vue +0 -16
  41. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-link.vue +0 -15
  42. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-logo-widget.vue +0 -22
  43. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-name.vue +0 -17
  44. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-nose.vue +0 -16
  45. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-price.vue +0 -15
  46. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-slug.vue +0 -14
  47. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-taste.vue +0 -16
  48. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/product-whisky-type.vue +0 -25
  49. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/ptfg-posts.twig +0 -449
  50. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/ptfg-utils.vue +0 -38
  51. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/shopify-add-to-cart.vue +0 -31
  52. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/social-media-item.vue +0 -58
  53. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/spacer-widget.vue +0 -13
  54. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2/text-search.vue +0 -10
  55. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2-extra.scss +0 -6
  56. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2.js +0 -15
  57. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2.php +0 -48
  58. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2.scss +0 -989
  59. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2.twig +0 -150
  60. package/components/block-post-type-filter-grid-v2/post-type-filter-grid-v2.vue +0 -893
@@ -1,893 +0,0 @@
1
- <template>
2
- <div id="app" :class="`${blockClassName}__main-container ${blockClassName}__main-container ${!showFilters && 'post-type-filter-grid-v2__main-container--hide-filters'
3
- }`" :data-layout="filterLayout">
4
- <TextSearch v-if="enableTextSearch" v-model="textSearchInput" ref="textSearchInput"
5
- :placeholder="textSearchInputPlaceholder" />
6
- <div ref="filterBlock" v-if="showFilters" :class="`${blockClassName}__filter`" :data-layout="filterLayout">
7
- <button :class="`${blockClassName}__open-filter-toggle cmpl-cta-style-${toggleFilterButtonStyle}`">
8
- {{ modalOpen ? closeFilterText : openFilterText }}
9
- </button>
10
- <div :class="`${blockClassName}__filter-container ${modalOpen ? 'post-type-filter-grid-v2__filter-container--open' : ''
11
- }`" :data-layout="filterLayout">
12
- <button v-if="fields.enable_show_all_button"
13
- :class="`${blockClassName}__show-all cmpl-cta-style-${showAllButtonStyle}`"
14
- v-on:click.prevent="clearAllFilters()" :data-layout="filterLayout">
15
- {{ showAllText }}
16
- </button>
17
- <div v-if="
18
- filterLayout == 1 ||
19
- filterLayout == 2 ||
20
- filterLayout == 4 ||
21
- filterLayout == 5
22
- " :class="`${blockClassName}__filter-categories`" :data-layout="filterLayout">
23
- <div v-if="filterLayout == 4" :class="`${blockClassName}__filter-categories-label`">
24
- {{categoriesTitleText}}
25
- <button @click="modalOpen = !modalOpen"></button>
26
- </div>
27
- <div v-for="(topCategory, index) in computedCategories.topLevelCategories" :class="`${blockClassName}__filter-category ${blockClassName}__cta cmpl-cta-style-${showTopLevelFilters ? topLevelCategoryButtonStyle : 'none'
28
- }`" v-bind:key="index" :data-layout="filterLayout">
29
- <h6 v-if="showTopLevelFilters" :class="`${blockClassName}__filter-top-level-category-name`"
30
- :data-layout="filterLayout">
31
- {{ topCategory.name }}
32
- </h6>
33
- <ul :class="`${blockClassName}__filter-subcategory-list`" :data-layout="filterLayout" :style="`${subFilterOverflowStyles}`">
34
- <li v-for="(subCategory, index) in computedCategories.subCategories[
35
- topCategory.term_id
36
- ]" :key="index" :data-categoryid="subCategory.term_id"
37
- :class="`${blockClassName}__filter-subcategory-list-item`" :data-layout="filterLayout">
38
- <button :class="`${blockClassName}__filter-subcategory-button ${updateCategoryButtonActiveStatus(
39
- subCategory.term_id
40
- )} ${blockClassName}__cta cmpl-cta-style-${categoryButtonStyle} cmpl-cta-style-${categoryButtonStyle}--${updateActiveCategoryButtonStyle(subCategory.term_id) ? 'selected' : ''
41
- }`" :data-categoryid="subCategory.term_id" @click="addOrRemoveIdFromActiveFilters(subCategory.term_id)"
42
- :disabled="updateDisabledStatus(subCategory.term_id)">
43
- <span v-html="subCategory.name"></span>
44
- <img v-if="enableFilterIcon" :src="ctaIcons.cta_filter_icon"
45
- :class="`${blockClassName}__filter-subcategory-button-icon`" />
46
- </button>
47
- </li>
48
- </ul>
49
- </div>
50
- <div :class="`${blockClassName}__filter-update-button`" v-if="filterLayout == 4">
51
- <button @click="modalOpen = false">{{ updateFilterText }}</button>
52
- </div>
53
- </div>
54
- <div v-if="filterLayout == 3" :class="`${blockClassName}__filter-categories`"
55
- :data-layout="filterLayout">
56
- <div :class="`${blockClassName}__filter-categories-container`">
57
- <ul v-if="showTopLevelFilters" @click="toggleTopLevelContainerStatus" :class="`${blockClassName}__filter-top-level-categories ${blockClassName}__filter-top-level-category-container ${topLevelContainerStatus ? 'open' : ''
58
- }`" :data-layout="filterLayout">
59
- <li :class="`${blockClassName}__filter-top-level-category ${placeholderFilterStatus ? 'currently-selected' : ''
60
- }`" @click="toggleActiveTopLevelCategory('placeholder')" v-if="enablePlaceholderFilter"
61
- data-categoryid="placeholder">
62
- <button :class="`${blockClassName}__cta cmpl-cta-style-${showTopLevelFilters ? topLevelCategoryButtonStyle : 'none'
63
- } `">
64
- <span>{{ placeholderFilterText }}</span><img v-if="enableTopLevelFilterIcon"
65
- :src="ctaIcons.cta_filter_icon"
66
- :class="`${blockClassName}__filter-top-level-category-button-icon style-svg`" />
67
- </button>
68
- </li>
69
- <li v-for="(topCategory, index) in computedCategories?.topLevelCategories" v-bind:key="index"
70
- :class="`${blockClassName}__filter-top-level-category ${topLevelCategoryActiveStatus(topCategory.term_id)
71
- ? 'currently-selected'
72
- : ''
73
- }`" :data-categoryid="topCategory.term_id" :data-layout="filterLayout"
74
- @click="toggleActiveTopLevelCategory(topCategory.term_id)">
75
- <button :class="`${blockClassName}__cta ${topLevelCategoryActiveStatus(topCategory.term_id)
76
- ? blockClassName +
77
- '__cta-style-' +
78
- topLevelCategoryButtonStyle +
79
- '--selected'
80
- : ''
81
- } cmpl-cta-style-${showTopLevelFilters ? topLevelCategoryButtonStyle : 'none'
82
- } `">
83
- <span v-html="topCategory?.name"></span><img v-if="enableTopLevelFilterIcon"
84
- :src="ctaIcons.cta_filter_icon"
85
- :class="`${blockClassName}__filter-top-level-category-button-icon style-svg`" />
86
- </button>
87
- </li>
88
- </ul>
89
- </div>
90
- <div :class="`${blockClassName}__filter-subcategories-container`">
91
- <!-- <ul v-if="enablePlaceholderFilter">
92
- <li :class="`${blockClassName}__filter-subcategory-list-item ${placeholderFilterActiveStatus ? 'active' : ''}`"
93
- v-if="enablePlaceholderFilter" data-categoryid="placeholder">
94
- <button
95
- :class="`${blockClassName}__filter-subcategory-button ${placeholderFilterActiveStatus ? 'active' : ''} cmpl-cta-style-${categoryButtonStyle}`">
96
- Choose country <img v-if="enableFilterIcon" :src="ctaIcons.cta_filter_icon"
97
- :class="`${blockClassName}__filter-subcategory-button-icon style-svg`">
98
- </button>
99
-
100
- </li>
101
- </ul>-->
102
- <ul v-for="(topCategory, index) in computedCategories?.topLevelCategories" v-bind:key="index"
103
- @click="toggleSubcategoryListContainer(topCategory?.term_id)" :class="`${blockClassName}__filter-subcategory-list ${topLevelCategoryActiveStatus(topCategory?.term_id)
104
- ? blockClassName + '__filter-subcategory-list--active'
105
- : ''
106
- } ${subCategoryListOpenStatus(topCategory?.term_id) ? 'open' : ''}`" :data-layout="filterLayout"
107
- :data-topcategoryid="topCategory?.term_id" :style="`${subFilterOverflowStyles}`">
108
- <li v-for="(subCategory, index) in computedCategories.subCategories[
109
- topCategory?.term_id
110
- ]" :key="index" :data-categoryid="subCategory.term_id" :class="`${blockClassName}__filter-subcategory-list-item ${updateCategoryButtonActiveStatus(
111
- subCategory.term_id
112
- )}`" :data-layout="filterLayout">
113
- <button :class="`${blockClassName}__filter-subcategory-button ${updateCategoryButtonActiveStatus(
114
- subCategory.term_id
115
- )} ${blockClassName}__cta cmpl-cta-style-${categoryButtonStyle} cmpl-cta-style-${categoryButtonStyle}--${updateActiveCategoryButtonStyle(subCategory.term_id) ? 'selected' : ''
116
- }`" :data-categoryid="subCategory.term_id" @click="addOrRemoveIdFromActiveFilters(subCategory.term_id)"
117
- :disabled="updateDisabledStatus(subCategory.term_id)">
118
- <span v-html="subCategory.name"></span>
119
- <img v-if="enableFilterIcon" :src="ctaIcons.cta_filter_icon"
120
- :class="`${blockClassName}__filter-subcategory-button-icon style-svg`" />
121
- </button>
122
- </li>
123
- </ul>
124
- </div>
125
- </div>
126
- </div>
127
- </div>
128
-
129
- <div :class="`${blockClassName}__featured-post`" v-if="enableFeaturedPost && activeFilterCategories.length < 1" :style="featuredPostBackgroundColour">
130
- <TransitionGroup>
131
- <div :class="`${blockClassName}__featured-post-container`" v-if="featuredPost">
132
- <FeaturedPostComponent :featuredpost="featuredPost" :fields="fields" :options="options" :mappedIcons="mappedIcons" :ctaStyles="ctaStyles" :ctaIcons="ctaIcons">
133
- </FeaturedPostComponent>
134
- </div>
135
- </TransitionGroup>
136
- </div>
137
-
138
- <div :class="`${blockClassName}__grid`">
139
- <TransitionGroup :name="fields.filter_results_transition">
140
- <div :class="`${blockClassName}__post-container`" :style="`
141
- --post-container-background-colour: ${postContainerBackgroundColour(
142
- post
143
- )}; --post-container-grid-gap-mobile: ${fields.post_container_grid_gap_mobile
144
- }; --post-container-grid-gap-portrait: ${fields.post_container_grid_gap_portrait
145
- }; --post-container-grid-gap-desktop: ${fields.post_container_grid_gap_desktop
146
- }; --post-container-grid-auto-rows: ${fields.post_container_grid_auto_rows?.slice(
147
- 2
148
- )}; --post-container-grid-auto-columns: ${fields.post_container_grid_auto_columns?.slice(
149
- 2
150
- )}; --post-container-grid-template-rows: ${fields.post_container_grid_template_rows
151
- }; --post-container-grid-template-columns: ${fields.post_container_grid_template_columns
152
- };`" v-for="post in pagedPosts" :key="post.slug">
153
- <PostComponent :postDataConfig="postDataConfig" :post="post" :fields="fields" :options="options"
154
- :mappedIcons="mappedIcons" :ctaStyles="ctaStyles" :globalImages="globalImages"
155
- :imageSizesAttribute="imageSizesAttribute"
156
- :gradientOverlayColour="postContainerGradientOverlayColour(post)">
157
- </PostComponent>
158
- </div>
159
- </TransitionGroup>
160
- </div>
161
-
162
- <div :class="`${blockClassName}__load-more-container`" ref="loadMore"
163
- v-if="computedLoadMore && enableLoadMoreButton">
164
- <a :href="`${nextPage}`" ref="loadButton" @click.prevent="
165
- page = page + 1;
166
- incrementLoadMoreStatus();
167
- " :class="`${blockClassName}__load-more-button ${blockClassName}__cta cmpl-cta-style-${loadMoreButtonStyle} cmpl-cta-animation-style-${loadMoreAnimationStyle}`">
168
- <span :class="`cmpl-cta-span ${isLoading ? 'hide-text' : ''}`">{{ loadMoreText }}</span> <span
169
- :class="`loader ${isLoading ? 'show-spinner' : ''}`"></span>
170
- <span :class="`${blockClassName}__cta-icon cmpl-cta-icon`" v-if="enableLoadMoreIcon"
171
- v-html="loadmoreIconImage"></span>
172
- </a>
173
- </div>
174
-
175
- </div>
176
- </template>
177
-
178
- <script setup>
179
- import { ref, reactive, onMounted, useAttrs, computed, watch } from "vue";
180
- // import likes from "WpPlugins/cbl-better-reviews/public/src/modules/likes.js";
181
- import reviews from "WpPlugins/cbl-better-reviews/public/src/modules/reviews.js";
182
- import shop from "Assets/js/modules/library-modules/shopify/shop.js";
183
- import reviewModal from "WpPlugins/cbl-better-reviews/public/src/modules/review-modal.js";
184
- import reservebarPopup from "Assets/js/modules/library-modules/reservebar-popup/reservebar-popup.js";
185
- import { isWpAdmin, ctbCTAClickHandler } from "@pernod-ricard-global-cms/jsutils";
186
- import PostComponent from "./post-type-filter-grid-v2/post-component.vue";
187
- import FeaturedPostComponent from "./post-type-filter-grid-v2/featured-post-component.vue";
188
- import TextSearch from "./post-type-filter-grid-v2/text-search.vue";
189
-
190
- // get content data from window
191
- const attrs = useAttrs();
192
- const ptfgData = window["ptfgData" + attrs.blockid];
193
- // if (!ptfgData) {
194
- // console.log('No ptfgData found');
195
- // return;
196
- // }
197
-
198
- // defining refs
199
- let page = ref(0);
200
- let loadMoreStatus = ref(1);
201
- let topLevelContainerStatus = ref(false);
202
- let activeTopLevelCategories = ref([]);
203
- let placeholderFilterStatus = ref(true);
204
-
205
- let activeFilterCategories = ref([]);
206
- let openSubCategoryListContainers = ref([]);
207
- let enableCategoryDisabledStatus = ref(false);
208
-
209
- // ref dom elements
210
- const textSearchInput = ref(null);
211
- const filterBlock = ref(null);
212
-
213
- // defining constant variables
214
- const blockClassName = "post-type-filter-grid-v2";
215
- const fields = ptfgData.fields;
216
- let modalOpen = ref(false);
217
-
218
- const sortText = "Sort";
219
- const sortByText = fields.sort_by_text;
220
-
221
- const openFilterText = fields.mobile_filter_label
222
- ? fields.mobile_filter_label
223
- : "Open Filter";
224
- const closeFilterText = "Close Filter";
225
- const updateFilterText = fields.mobile_filter_update_label
226
- ? fields.mobile_filter_update_label
227
- : "Update Filter";
228
-
229
- const ajaxUrl = ptfgData.ajaxUrl;
230
- const isLoading = ref(false);
231
- const options = ptfgData.options;
232
- const allPosts = reactive({ items: ptfgData.posts });
233
- const allProducts = ptfgData.allProducts;
234
- const postDataConfig = ptfgData.postDataConfig;
235
- const allCategories = ptfgData.taxonomies;
236
- const featuredPost = ptfgData.featuredPost;
237
- const mappedIcons = ptfgData.mappedIcons;
238
- const ctaStyles = ptfgData.ctaStyles;
239
- const totalPosts = ptfgData.total;
240
-
241
- const ctaIcons = ptfgData.theme_cta_icons;
242
- const globalImages = ptfgData.global_images;
243
- const gridColumnsDesktop = fields.columns_desktop;
244
- const gridColumnsPortrait = fields.columns_tablet_portrait;
245
- const gridColumnsMobile = fields.columns_mobile;
246
- const containerWidth = 100;
247
- const defaultImageSizes = `(min-width: 1440px) ${containerWidth / gridColumnsDesktop}vw, (min-width: 1024px) ${containerWidth / gridColumnsDesktop}vw, (min-width: 768px) ${containerWidth / gridColumnsPortrait}vw, (min-width: 500px) ${containerWidth / gridColumnsMobile}vw, ${containerWidth / gridColumnsMobile}vw`;
248
- const customSizesAttribute = fields.custom_image_sizes;
249
- const imageSizesAttribute = customSizesAttribute ? customSizesAttribute : defaultImageSizes;
250
- const postType = fields.post_type?.replace("__", "");
251
- const sorting = fields.sorting?.replace("__", "");
252
- const filterLayout = fields.filter_layout?.toString().replace("__", "");
253
- const topLevelCategoryButtonStyle = fields.top_level_category_button_style
254
- ?.toString()
255
- .replace("__", "");
256
- const categoryButtonStyle = fields.category_button_style?.toString().replace("__", "");
257
- const loadMoreButtonStyle = fields.load_more_button_style?.toString().replace("__", "");
258
- const loadMoreAnimationStyle =
259
- ctaStyles[parseInt(loadMoreButtonStyle) - 1]?.cta_settings
260
- ?.cta_animation_style;
261
- const toggleFilterButtonStyle = fields.toggle_filter_button_style
262
- ?.toString()
263
- .replace("__", "");
264
- const showAllButtonStyle = fields.show_all_button_style?.toString().replace("__", "");
265
- const enableLoadMoreButton = fields.enable_load_more_button;
266
- const showFilters = fields.show_filters;
267
- const showTopLevelFilters = fields.show_top_level_filters;
268
- const topLevelFiltersActiveOnLoad = fields.top_level_filters_active_on_load;
269
- const singleActiveTopLevelCategory = fields.single_active_top_level_category;
270
- const singleActiveFilter = ref(fields.single_active_filter);
271
- const limitPostsToCategories = fields.limit_posts_to_selected_categories;
272
- const categoriesTitleText = fields.categories_title_text;
273
- const loadMoreText = fields.load_more_button_text;
274
- const showAllText = fields.show_all_button_text;
275
- const showAllPosts = fields.show_all_posts;
276
- const postContainerBackgroundColourStyle = fields.post_container_background_style?.replace(
277
- "__",
278
- ""
279
- );
280
- let loadmoreIconImage = '';
281
- if (mappedIcons['cta_link_icon']) {
282
- loadmoreIconImage = mappedIcons['cta_link_icon']['type'] == 'image/svg+xml' ? mappedIcons['cta_link_icon']['image'] : '<img src="' + mappedIcons['cta_link_icon']['image'] + '">';
283
- }
284
- const enableLoadMoreIcon = ctaStyles[parseInt(loadMoreButtonStyle) - 1]?.cta_settings?.include_cta_icon;
285
- const enableTextSearch = fields.enable_text_search;
286
- const textSearchInputPlaceholder = fields.text_filter_placeholder;
287
- const enableFilterIcon = fields.enable_filter_icon;
288
- const enableTopLevelFilterIcon = fields.enable_top_level_filter_icon;
289
- const enableStartingFilter = fields.enable_starting_filter;
290
- const enablePlaceholderFilter = fields.enable_placeholder_filter;
291
- const enableShopify = JSON.parse(localStorage.getItem("enableShopify"));
292
- const placeholderFilterText = fields.placeholder_filter_text;
293
- const enableFeaturedPost = fields.enable_featured_post;
294
- const featuredPostBackgroundColour = `--featured-post-background-colour: ${fields.featured_post_background_colour}`;
295
- const initialPostsPerPageDesktop = fields.initial_posts_per_page_desktop;
296
- const initialPostsPerPageTablet = fields.initial_posts_per_page_portrait;
297
- const initialPostsPerPageMobile = fields.initial_posts_per_page_mobile;
298
- const postsPerPageDesktop = showAllPosts ? 999999 : Number(fields.posts_per_page_desktop);
299
- const postsPerPageTablet = showAllPosts ? 999999 : Number(fields.posts_per_page_tablet);
300
- const postsPerPageMobile = showAllPosts ? 999999 : Number(fields.posts_per_page_mobile);
301
- const loadedCategories = [];
302
- const subFilterOverflowMobileValue = fields.sub_filter_overflow ? fields.sub_filter_overflow.mobile_overflow.toString().replace("__", "") : 'scroll';
303
- const subFilterOverflowTabletValue = fields.sub_filter_overflow ? fields.sub_filter_overflow.tablet_overflow.toString().replace("__", "") : 'scroll';
304
- const subFilterOverflowDesktopValue = fields.sub_filter_overflow ? fields.sub_filter_overflow.desktop_overflow.toString().replace("__", "") : 'scroll';
305
- const subFilterOverflowMobile = `--sub-filter-overflow-mobile: ${subFilterOverflowMobileValue};`;
306
- const subFilterOverflowTablet = `--sub-filter-overflow-tablet: ${subFilterOverflowTabletValue};`;
307
- const subFilterOverflowDesktop = `--sub-filter-overflow-desktop: ${subFilterOverflowDesktopValue};`;
308
- const subFilterOverflowCenterMobile = `--sub-filter-overflow-center-mobile: ${subFilterOverflowMobileValue === 'wrap'? 'center' : ''};`;
309
- const subFilterOverflowCenterTablet = `--sub-filter-overflow-center-tablet: ${subFilterOverflowTabletValue === 'wrap'? 'center' : ''};`;
310
- const subFilterOverflowCenterDesktop = `--sub-filter-overflow-center-desktop: ${subFilterOverflowDesktopValue === 'wrap'? 'center' : ''};`;
311
- const subFilterOverflowStyles = subFilterOverflowMobile + subFilterOverflowTablet + subFilterOverflowDesktop + subFilterOverflowCenterMobile + subFilterOverflowCenterTablet + subFilterOverflowCenterDesktop
312
-
313
- let devicePostsPerPage = postsPerPageDesktop;
314
- let deviceInitialPostsPerPage = initialPostsPerPageDesktop;
315
- if (window.innerWidth < 1024) {
316
- devicePostsPerPage = postsPerPageTablet;
317
- deviceInitialPostsPerPage = initialPostsPerPageTablet;
318
- }
319
- if (window.innerWidth < 768) {
320
- devicePostsPerPage = postsPerPageMobile;
321
- deviceInitialPostsPerPage = initialPostsPerPageMobile;
322
- }
323
- watch(
324
- () => modalOpen.value,
325
- () => {
326
- if (modalOpen.value) {
327
- document.body.classList.add("mobile-menu-active");
328
- } else {
329
- document.body.classList.remove("mobile-menu-active");
330
- }
331
- }
332
- );
333
-
334
-
335
- // computed variables
336
- const computedAllPosts = computed(() => {
337
- if (limitPostsToCategories) {
338
- const allSubcategories = [];
339
- const allParentIds = Object.keys(computedCategories.value.subCategories);
340
- allParentIds.forEach((id) => {
341
- computedCategories.value.subCategories[id].forEach((category) => {
342
- allSubcategories.push(category.term_id);
343
- });
344
- });
345
- return filterPosts(allPosts.items, allSubcategories);
346
- } else {
347
- return allPosts.items;
348
- }
349
- });
350
- const computedFilteredPosts = computed(() => {
351
- let computedPosts = computedAllPosts.value;
352
- if (enableFeaturedPost) {
353
- computedPosts = computedAllPosts.value.filter(
354
- (post) => post.post_data.ID != fields.featured_post
355
- );
356
- }
357
- const posts = filterPosts(computedPosts, activeFilterCategories.value);
358
- return sortPosts(posts);
359
- });
360
-
361
- const computedLoadMore = computed(() => {
362
- if (showAllPosts) {
363
- return false;
364
- }
365
- let postsPerPage = devicePostsPerPage;
366
- if (page.value == 1) {
367
- postsPerPage = deviceInitialPostsPerPage;
368
- }
369
- if (activeFilterCategories.value.length) {
370
- if (computedFilteredPosts.value.length <= (page.value * postsPerPage)) {
371
- return false;
372
- }
373
- }
374
- console.log("🚀 ~ computedLoadMore ~ totalPosts:", totalPosts)
375
- console.log("🚀 ~ computedLoadMore ~ page.value * postsPerPage < totalPosts:", page.value * postsPerPage < totalPosts)
376
- if (
377
- page.value * postsPerPage < totalPosts
378
- ) {
379
- return true;
380
- }
381
- return false;
382
- });
383
-
384
- const nextPage = computed(() => {
385
- const path = `https://${window.location.host}${window.location.pathname}`;
386
- return `${path}?pages=${page.value + 1}`;
387
- });
388
-
389
- const resetPage = () => {
390
- const path = `https://${window.location.host}${window.location.pathname}${window.location.search}`;
391
- page.value = 1;
392
- window.history.pushState({}, "", path);
393
- };
394
-
395
- const computedFeaturedPost = computed(() => {
396
- const featuredPost = computedAllPosts.value.filter(
397
- (post) => post.id == fields.featured_post
398
- );
399
- const [post] = featuredPost;
400
- return post;
401
- });
402
-
403
- const computedProducts = computed(() => {
404
- // const updatedProducts = [];
405
- // allProducts.forEach((product) => {
406
- // product.slug = product["post_name"];
407
- // product.name = product["post_title"];
408
- // product.taxonomy = "products";
409
- // updatedProducts.push(product);
410
- // });
411
- // return updatedProducts;
412
- });
413
-
414
- const pagedPosts = computed(() => {
415
- if (showAllPosts) {
416
- return computedFilteredPosts.value;
417
- } else {
418
- return computedFilteredPosts.value.slice(
419
- 0,
420
- page.value == 1
421
- ? Number(deviceInitialPostsPerPage)
422
- : Number(deviceInitialPostsPerPage) +
423
- Number(page.value - 1) * Number(devicePostsPerPage)
424
- );
425
- }
426
- });
427
-
428
- const computedCategories = computed(() => {
429
- let topLevelCategories = [];
430
- const subCategories = {};
431
- allCategories.forEach((taxonomy) => {
432
- if (taxonomy.parent === 0) {
433
- topLevelCategories.push(taxonomy);
434
- } else {
435
- if (subCategories[taxonomy.parent]) {
436
- subCategories[taxonomy.parent].push(taxonomy);
437
- } else {
438
- subCategories[taxonomy.parent] = [];
439
- subCategories[taxonomy.parent].push(taxonomy);
440
- }
441
- }
442
- });
443
- return {
444
- topLevelCategories: topLevelCategories,
445
- subCategories: subCategories,
446
- };
447
- });
448
-
449
- // functions
450
-
451
- const addOrRemoveIdFromActiveFilters = async (categoryId) => {
452
- if (singleActiveFilter.value) {
453
- activeFilterCategories.value = [];
454
- activeFilterCategories.value.push(categoryId);
455
-
456
- return;
457
- }
458
- if (!activeFilterCategories.value.find((element) => Number(element) === Number(categoryId))
459
- ) {
460
- activeFilterCategories.value.push(categoryId);
461
- } else {
462
- activeFilterCategories.value = activeFilterCategories.value.filter(
463
- (element) => element !== categoryId
464
- );
465
- }
466
- };
467
-
468
- const filterPosts = (posts, filterCategoryIds = activeFilterCategories.value) => {
469
- let filteredPosts = [];
470
- if (filterCategoryIds.length === 0) {
471
- filteredPosts = posts;
472
- } else {
473
- filteredPosts = posts.filter((post) => {
474
- const postSubCategories = post.categories.filter(
475
- (category) => category.parent != 0
476
- );
477
- let categoryMatch = false;
478
- filterCategoryIds.forEach((categoryId) => {
479
- if (
480
- postSubCategories.find(
481
- (subCategory) => Number(subCategory.term_id) == Number(categoryId)
482
- )
483
- ) {
484
- categoryMatch = true;
485
- return;
486
- }
487
- });
488
- return categoryMatch;
489
- });
490
- }
491
-
492
- //filter by text
493
-
494
- //Split the search term by , to get 'or' functionality then trim the spaces and filter empty search terms
495
- let searchTerm = textSearchInput.value ? textSearchInput.value : null;
496
- if (searchTerm) {
497
- const searchTerm = searchTerm
498
- .toLowerCase()
499
- .split(",")
500
- .map((term) => term.trim())
501
- .filter((term) => term != "");
502
-
503
- //Filter drinks based on the search terms
504
- const textFilteredPosts = filteredPosts.filter((post) => {
505
- return searchTerm.some((item) =>
506
- post.post_data.post_title.toLowerCase().includes(item)
507
- );
508
- });
509
- }
510
- filteredPosts = searchTerm == null ? filteredPosts : textFilteredPosts;
511
- setTimeout(() => {
512
- const gridContainer = document.querySelector(".post-type-filter-grid-v2__grid");
513
- ctbCTAClickHandler(gridContainer);
514
- reservebarPopup();
515
- if (enableShopify) {
516
- refreshShopifyBuyButtons();
517
- }
518
- }, 50);
519
-
520
- return filteredPosts;
521
- };
522
-
523
- const sortPosts = (posts) => {
524
- switch (fields.sorting?.replace("__", "")) {
525
- case "menu-order":
526
- return posts.sort((a, b) => a.menu_order - b.menu_order); // Sort by menu order (ascending)
527
- case "date-desc":
528
- return posts.sort((a, b) => new Date(b.post_data.post_date) - new Date(a.post_data.post_date)); // Newest first
529
- case "date-asc":
530
- return posts.sort((a, b) => new Date(a.post_data.post_date) - new Date(b.post_data.post_date)); // Oldest first
531
- case "postorder":
532
- return posts; // Respect post type order plugin
533
- default:
534
- return posts;
535
- }
536
- };
537
-
538
- const incrementLoadMoreStatus = () => {
539
- const url = new URL(window.location);
540
- loadMoreStatus.value = Number(loadMoreStatus.value) + 1;
541
- url.searchParams.set("pages", loadMoreStatus.value);
542
- setTimeout(() => {
543
- reviews.init();
544
- if (enableShopify) {
545
- refreshShopifyBuyButtons();
546
- }
547
- }, 0);
548
- if (!isWpAdmin()) {
549
- window.history.pushState({}, "", url);
550
- }
551
- };
552
-
553
- const postContainerBackgroundColour = (post) => {
554
- switch (postContainerBackgroundColourStyle) {
555
- case "none":
556
- return "none";
557
- break;
558
-
559
- case "colour-palette":
560
- return fields.post_container_background_colour;
561
- break;
562
-
563
- case "post-colour":
564
- return post.post_data.post_colour;
565
- break;
566
- case "post-colour-secondary":
567
- return post.post_data.post_colour_secondary;
568
- break;
569
-
570
- default:
571
- break;
572
- }
573
- };
574
-
575
- const postContainerGradientOverlayColour = (post) => {
576
- switch (fields.gradient_overlay_colour_type?.slice(2)) {
577
- case "colour-palette":
578
- return fields.gradient_overlay_colour;
579
- break;
580
-
581
- case "post-colour":
582
- return post.post_data.post_colour;
583
- break;
584
- case "post-colour-secondary":
585
- return post.post_data.post_colour_secondary;
586
- break;
587
-
588
- default:
589
- break;
590
- }
591
- };
592
-
593
- const getLoadMoreStatusParam = async () => {
594
- const urlParams = new URLSearchParams(window.location.search);
595
- const loadMore = urlParams.get("pages");
596
- if (loadMore) {
597
- loadMoreStatus.value = Number(loadMore);
598
- page.value += loadMoreStatus.value;
599
-
600
- let demandedPosts = Number(initialPostsPerPageDesktop) + (Number(page.value - 1) * Number(postsPerPageDesktop));
601
- let actualMaxPages = Math.ceil(Number((Number(totalPosts.value) - Number(initialPostsPerPageDesktop)) / Number(postsPerPageDesktop)));
602
- let retrievedPosts = Number(initialPostsPerPageDesktop);
603
-
604
- for (let i = 2; i <= loadMore; i++) {
605
- if (retrievedPosts <= totalPosts.value) {
606
- retrievedPosts += Number(postsPerPageDesktop);
607
- page.value = i;
608
- }
609
- }
610
-
611
- if (demandedPosts > totalPosts.value) {
612
- page.value = actualMaxPages;
613
- window.history.pushState({}, "?pages=" + page.value);
614
- }
615
- loadMoreStatus.value = loadMore;
616
- } else {
617
- resetPage();
618
- }
619
- };
620
-
621
- const setupFilterLayout = () => {
622
- if (!showFilters) {
623
- return;
624
- }
625
- if (filterLayout == 1 || filterLayout == 2 || filterLayout == 4 || filterLayout == 5) {
626
- const topLevelCategories = filterBlock.value.querySelectorAll(
627
- ".post-type-filter-grid-v2__filter-category"
628
- );
629
- const primaryCategoryNames = filterBlock.value.querySelectorAll(
630
- ".post-type-filter-grid-v2__filter-top-level-category-name"
631
- );
632
- if (topLevelFiltersActiveOnLoad) {
633
- if (singleActiveTopLevelCategory) {
634
- topLevelCategories[0].classList.add("active");
635
- } else {
636
- topLevelCategories.forEach((topLevelCategory) =>
637
- topLevelCategory.classList.add("active")
638
- );
639
- }
640
- }
641
- primaryCategoryNames.forEach((name) => {
642
- name.addEventListener("click", () => {
643
- name.parentElement.classList.toggle("active");
644
- });
645
- });
646
- if (enableStartingFilter) {
647
- let categoryObject;
648
-
649
- switch (postType) {
650
- case "product":
651
- categoryObject = fields.starting_product_filter_category;
652
- break;
653
- case "person":
654
- categoryObject = fields.starting_person_filter_category;
655
- break;
656
-
657
- default:
658
- break;
659
- }
660
- activeTopLevelCategories.value.push(categoryObject.parent);
661
- activeFilterCategories.value.push(categoryObject.term_id);
662
- }
663
- }
664
- if (filterLayout == 3) {
665
- if (topLevelFiltersActiveOnLoad) {
666
- if (singleActiveTopLevelCategory) {
667
- toggleActiveTopLevelCategory(
668
- computedCategories.value.topLevelCategories[0].term_id
669
- );
670
- } else {
671
- computedCategories.value.topLevelCategories.forEach((topLevelCategory) =>
672
- toggleActiveTopLevelCategory(topLevelCategory.term_id)
673
- );
674
- }
675
- }
676
- }
677
-
678
- if (showFilters) {
679
- filterBlock.value
680
- .querySelector(".post-type-filter-grid-v2__open-filter-toggle")
681
- .addEventListener("click", () => {
682
- modalOpen.value = !modalOpen.value;
683
- });
684
- }
685
- };
686
-
687
- const toggleTopLevelContainerStatus = () => {
688
- topLevelContainerStatus.value = !topLevelContainerStatus.value;
689
- };
690
-
691
- const topLevelCategoryActiveStatus = (id) => {
692
- return activeTopLevelCategories.value.find((catId) => catId == id);
693
- };
694
- const placeholderFilterActiveStatus = () => {
695
- return placeholderFilterStatus.value ? true : false;
696
- };
697
-
698
- const toggleSubcategoryListContainer = (id) => {
699
- if (id == "placeholder") {
700
- activeTopLevelCategories.value = [];
701
- activeFilterCategories.value = [];
702
- return;
703
- }
704
- if (openSubCategoryListContainers.value.find((categoryId) => categoryId == id)) {
705
- openSubCategoryListContainers.value = openSubCategoryListContainers.value.filter(
706
- (categoryId) => categoryId != id
707
- );
708
- } else {
709
- openSubCategoryListContainers.value.push(id);
710
- }
711
- };
712
-
713
- const subCategoryListOpenStatus = (id) => {
714
- return openSubCategoryListContainers.value.find((catId) => catId == id);
715
- };
716
- const updateCategoryButtonActiveStatus = (categoryId) => {
717
- if (
718
- activeFilterCategories.value.find(
719
- (filterCategory) => Number(filterCategory) === Number(categoryId)
720
- )
721
- ) {
722
- return "active";
723
- } else {
724
- return "";
725
- }
726
- };
727
-
728
- const updateActiveCategoryButtonStyle = (categoryId) => {
729
- if (
730
- activeFilterCategories.value.find(
731
- (filterCategory) => Number(filterCategory) === Number(categoryId)
732
- )
733
- ) {
734
- return true;
735
- } else {
736
- return false;
737
- }
738
- };
739
-
740
- const updateDisabledStatus = (categoryId) => {
741
- if (!enableCategoryDisabledStatus.value) {
742
- return false;
743
- }
744
- if (activeFilterCategories.value.length === 0) {
745
- return false;
746
- }
747
- if (
748
- activeFilterCategories.value.find(
749
- (filterCategory) => Number(filterCategory) === Number(categoryId)
750
- )
751
- ) {
752
- return false;
753
- }
754
- const testCategories = [...activeFilterCategories.value];
755
- testCategories.push(categoryId);
756
- const testFilterPosts = filterPosts(allPosts.items, testCategories);
757
- if (testFilterPosts.length <= computedFilteredPosts.value.length) {
758
- return true;
759
- }
760
- };
761
- const getPostSubcategories = (post) => {
762
- return post.categories.filter((category) => category.parent != 0);
763
- };
764
- const clearAllFilters = () => {
765
- activeFilterCategories.value = [];
766
- };
767
- const getCategoryIds = () => {
768
- let allCategoryIds = [];
769
- allCategories.forEach((cat) => {
770
- allCategoryIds.push(cat.term_id);
771
- });
772
- // return JSON.stringify(all_cats);
773
- return allCategoryIds;
774
- };
775
-
776
- const loadMorePosts = async (currentCategoryId = null) => {
777
- console.log('trying to load more posts');
778
-
779
- if (currentCategoryId && loadedCategories.includes(currentCategoryId)) {
780
- console.log('category already loaded');
781
- return;
782
- }
783
-
784
- isLoading.value = true;
785
- let form_data = new FormData();
786
- form_data.append("action", "ptfg_next_page");
787
- form_data.append("pageNum", page.value);
788
- form_data.append("postType", postType);
789
- form_data.append("sorting", sorting);
790
- form_data.append("initialPostsPerPage", initialPostsPerPageDesktop);
791
- form_data.append("desktopPostsPerPage", postsPerPageDesktop);
792
- form_data.append("includeReviews", ptfgData.includeReviews);
793
- form_data.append("reviewDisplayOptions", ptfgData.reviewDisplayOptions);
794
- form_data.append("limitPostsToSelectedCategories", fields.limit_posts_to_selected_categories);
795
- form_data.append("currentMarket", ptfgData.currentMarket);
796
-
797
- form_data.append(
798
- "categoryIds",
799
- activeFilterCategories.value.length > 0 ? activeFilterCategories.value : getCategoryIds()
800
- );
801
-
802
-
803
- form_data.append("initialPostsPerPage", 99999);
804
- if (currentCategoryId && !loadedCategories.includes(currentCategoryId)) {
805
- console.log('category was not yet loaded... getting posts now');
806
- form_data.append("categoryIds", currentCategoryId);
807
- loadedCategories.push(currentCategoryId);
808
- console.log(currentCategoryId, '... added to loaded categories');
809
- }
810
- try {
811
- const response = await fetch(ajaxUrl, {
812
- method: "POST",
813
- body: form_data,
814
- credentials: "same-origin",
815
- });
816
-
817
- if (response.ok) {
818
- const markup = await response.text();
819
- const postData = JSON.parse(markup);
820
- const post_objects = postData.posts;
821
- const mergedArray = [
822
- ...allPosts.items,
823
- ...post_objects.filter(item2 => !allPosts.items.some(item1 => item1.id === item2.id)),
824
- ];
825
- allPosts.items = sortPosts(mergedArray);
826
- setTimeout(() => {
827
- reviews.init();
828
- if (enableShopify) {
829
- refreshShopifyBuyButtons();
830
- }
831
- }, 0);
832
- isLoading.value = false;
833
- }
834
- } catch (e) {
835
- console.error("Get listing error:", e);
836
- }
837
- };
838
-
839
- const toggleActiveTopLevelCategory = async (id) => {
840
- if (id == "placeholder") {
841
- placeholderFilterStatus.value = true;
842
- activeTopLevelCategories.value = [];
843
- activeFilterCategories.value = [];
844
- return;
845
- }
846
- if (filterLayout == 3) {
847
- if (activeTopLevelCategories.value.find((categoryId) => categoryId == id)) {
848
- activeTopLevelCategories.value = activeTopLevelCategories.value.filter(
849
- (categoryId) => categoryId != id
850
- );
851
- } else {
852
- if (singleActiveTopLevelCategory == 1) {
853
- activeTopLevelCategories.value = [];
854
- activeTopLevelCategories.value.push(id);
855
- } else {
856
- activeTopLevelCategories.value.push(id);
857
- }
858
- }
859
- }
860
- if (filterLayout == 4 && topLevelContainerStatus.value) {
861
- placeholderFilterStatus.value = false;
862
- activeTopLevelCategories.value = [];
863
- activeTopLevelCategories.value.push(id);
864
- activeFilterCategories.value = [];
865
- activeFilterCategories.value.push(computedCategories.value.subCategories[id][0].term_id);
866
- }
867
- };
868
-
869
- const refreshShopifyBuyButtons = () => {
870
- postDataConfig.forEach((item) => {
871
- if (item.acf_fc_layout === "shopify_add_to_cart") {
872
- document.dispatchEvent(
873
- new Event('shop-refresh')
874
- )
875
- }
876
- })
877
- }
878
-
879
- onMounted(() => {
880
- getLoadMoreStatusParam();
881
- setupFilterLayout();
882
- reservebarPopup();
883
-
884
-
885
- setTimeout(() => {
886
- if (enableShopify) {
887
- shop.loadShops();
888
- refreshShopifyBuyButtons();
889
- }
890
- loadMorePosts();
891
- }, 500);
892
- });
893
- </script>