/** * Product Category/Archive Page JavaScript * Handles filters, sorting, view mode switching, and product interactions */ (function($) { 'use strict'; // Check if we're on a product category/archive page if (!$('body.taxonomy-product_category, body.page-product-category, body.archive').length) { return; } const sfArchiveState = { page: 1, hasMore: false, isLoadingMore: false }; const sfArchiveState = { page: 1, hasMore: false, isLoadingMore: false }; /** * Initialize Archive Page Functionality */ function initArchivePage() { initFilters(); initSorting(); initViewMode(); initActiveFilters(); initMobileFiltersToggle(); initLoadMore(); } function isTopLevelCategory() { return $('#products-grid').data('category-level') === 'top'; } function getTermId() { const fromForm = parseInt($('#product-filters-form').data('term-id'), 10) || 0; if (fromForm) return fromForm; return parseInt($('#products-grid').data('term-id'), 10) || 0; } function getCurrentTotalCountFromToolbar() { const txt = $('.catalog-toolbar__results strong:last').text() || '0'; const n = parseInt(txt, 10); return Number.isFinite(n) ? n : 0; } function ensureLoadMoreDom() { let $wrap = $('#catalog-load-more-wrap'); if ($wrap.length) return $wrap; $wrap = $('
'); const $btn = $(''); $btn.attr('data-next-page', '2'); $wrap.append($btn); $('.catalog-products').append($wrap); return $wrap; } function setLoadMoreVisibility(show) { const $wrap = ensureLoadMoreDom(); if (show) $wrap.show(); else $wrap.hide(); } function initLoadMore() { if (!isTopLevelCategory()) { return; } const total = getCurrentTotalCountFromToolbar(); const loaded = $('#products-grid .catalog-product-card').length; sfArchiveState.page = 1; sfArchiveState.hasMore = loaded < total; setLoadMoreVisibility(sfArchiveState.hasMore); $(document).on('click', '#catalog-load-more-btn', function() { if (sfArchiveState.isLoadingMore || !sfArchiveState.hasMore) return; loadMoreProducts(); }); } function loadMoreProducts() { const $productsGrid = $('#products-grid'); const termId = getTermId(); const filters = collectSelectedFilters(); if (!window.shaperfactoryArchive || !window.shaperfactoryArchive.ajaxUrl || !termId) { return; } sfArchiveState.isLoadingMore = true; const nextPage = sfArchiveState.page + 1; $('#catalog-load-more-btn').prop('disabled', true).text('Loading...'); $.ajax({ url: window.shaperfactoryArchive.ajaxUrl, method: 'POST', dataType: 'json', data: { action: 'shaperfactory_filter_products', nonce: window.shaperfactoryArchive.nonce, term_id: termId, body_area: filters.bodyArea, color: filters.color, compression: filters.compression, page: nextPage, append: 1 } }).done(function(resp) { if (!resp || !resp.success || !resp.data) return; $productsGrid.append(resp.data.html || ''); sfArchiveState.page = parseInt(resp.data.page, 10) || nextPage; sfArchiveState.hasMore = !!resp.data.has_more; updateProductCount(parseInt(resp.data.count, 10) || 0, parseInt(resp.data.loaded_count, 10) || 0); setLoadMoreVisibility(sfArchiveState.hasMore); }).always(function() { sfArchiveState.isLoadingMore = false; $('#catalog-load-more-btn').prop('disabled', false).text('Load More'); }); } /** * Initialize Filter Functionality */ function initFilters() { const $form = $('#product-filters-form'); const $checkboxes = $form.find('.catalog-filters__checkbox'); const $resetBtn = $form.find('.catalog-filters__reset'); $form.on('submit', function(e) { e.preventDefault(); applyFiltersRealTime(); }); $checkboxes.on('change', function() { const $current = $(this); const name = $current.attr('name'); // 每个筛选组最多只能选择一个(Body Area / Color / Compression 各 1 个) if ($current.is(':checked') && name) { $form.find('.catalog-filters__checkbox[name="' + name + '"]').not($current).prop('checked', false); } applyFiltersRealTime(); }); $resetBtn.on('click', function() { resetFiltersRealTime(); }); } function collectSelectedFilters() { const $form = $('#product-filters-form'); const bodyArea = []; const color = []; const compression = []; $form.find('input[name="body_area[]"]:checked').each(function() { bodyArea.push($(this).val()); }); $form.find('input[name="color[]"]:checked').each(function() { color.push($(this).val()); }); $form.find('input[name="compression[]"]:checked').each(function() { compression.push($(this).val()); }); return { bodyArea, color, compression }; } function syncFilterUrl(filters) { const params = new URLSearchParams(window.location.search); params.delete('body_area[]'); params.delete('color[]'); params.delete('compression[]'); filters.bodyArea.forEach(function(v) { params.append('body_area[]', v); }); filters.color.forEach(function(v) { params.append('color[]', v); }); filters.compression.forEach(function(v) { params.append('compression[]', v); }); const nextUrl = window.location.pathname + (params.toString() ? ('?' + params.toString()) : ''); window.history.pushState({}, '', nextUrl); } /** * Apply Filters (AJAX realtime) */ function applyFiltersRealTime() { const $productsGrid = $('#products-grid'); const termId = getTermId(); const filters = collectSelectedFilters(); syncFilterUrl(filters); updateActiveFilters(); if (!window.shaperfactoryArchive || !window.shaperfactoryArchive.ajaxUrl || !termId) { return; } $productsGrid.addClass('is-loading'); sfArchiveState.page = 1; sfArchiveState.hasMore = false; $.ajax({ url: window.shaperfactoryArchive.ajaxUrl, method: 'POST', dataType: 'json', data: { action: 'shaperfactory_filter_products', nonce: window.shaperfactoryArchive.nonce, term_id: termId, body_area: filters.bodyArea, color: filters.color, compression: filters.compression, page: 1 } }).done(function(resp) { if (!resp || !resp.success || !resp.data) return; $productsGrid.html(resp.data.html || ''); const total = parseInt(resp.data.count, 10) || 0; const loaded = parseInt(resp.data.loaded_count, 10) || total; updateProductCount(total, loaded); sfArchiveState.page = parseInt(resp.data.page, 10) || 1; sfArchiveState.hasMore = !!resp.data.has_more; setLoadMoreVisibility(isTopLevelCategory() && sfArchiveState.hasMore); }).always(function() { $productsGrid.removeClass('is-loading'); }); } /** * Update Product Count Display */ function updateProductCount(totalCount, loadedCount) { const $results = $('.catalog-toolbar__results'); const total = totalCount > 0 ? totalCount : 0; const loaded = loadedCount > 0 ? loadedCount : 0; if (total === 0) { $results.html('Showing 0-0 of 0 products'); return; } const end = Math.min(loaded, total); $results.html('Showing 1-' + end + ' of ' + total + ' products'); } /** * Reset All Filters (AJAX realtime) */ function resetFiltersRealTime() { const $form = $('#product-filters-form'); $form.find('.catalog-filters__checkbox').prop('checked', false); applyFiltersRealTime(); } /** * Initialize Active Filters Display */ function initActiveFilters() { updateActiveFilters(); } /** * Update Active Filters Display */ function updateActiveFilters() { const $activeFilters = $('#active-filters'); const $tagsContainer = $('#active-filters-tags'); const $form = $('#product-filters-form'); // Clear existing tags $tagsContainer.empty(); // Get all checked filters const activeFilters = []; $form.find('.catalog-filters__checkbox:checked').each(function() { const $checkbox = $(this); const name = $checkbox.attr('name'); const value = $checkbox.val(); const label = $checkbox.closest('.catalog-filters__option').find('.catalog-filters__label').text().trim(); if (name && value) { activeFilters.push({ name: name, value: value, label: label.split('(')[0].trim() // Remove count from label }); } }); // Display active filters if (activeFilters.length > 0) { activeFilters.forEach(function(filter) { const $tag = $('') .addClass('catalog-active-filters__tag') .html(filter.label + ' '); $tagsContainer.append($tag); }); $activeFilters.show(); } else { $activeFilters.hide(); } // Handle remove filter button clicks $tagsContainer.find('button').on('click', function() { const filterName = $(this).data('filter-name'); const filterValue = $(this).data('filter-value'); // Uncheck the corresponding checkbox $form.find('.catalog-filters__checkbox[name="' + filterName + '"][value="' + filterValue + '"]') .prop('checked', false); // Reapply filters (实时筛选) applyFiltersRealTime(); }); } /** * Initialize Sorting */ function initSorting() { const $sortSelect = $('#product-sort'); if (!$sortSelect.length) return; // Get current sort value from URL const urlParams = new URLSearchParams(window.location.search); const currentSort = urlParams.get('sort') || 'newest'; $sortSelect.val(currentSort); // Handle sort change $sortSelect.on('change', function() { const sortValue = $(this).val(); const currentUrl = new URL(window.location.href); if (sortValue && sortValue !== 'newest') { currentUrl.searchParams.set('sort', sortValue); } else { currentUrl.searchParams.delete('sort'); } window.location.href = currentUrl.toString(); }); } /** * Initialize View Mode (Grid/List) */ function initViewMode() { const $viewBtns = $('.catalog-toolbar__view-btn'); // Get current view mode from localStorage or default to grid const currentView = localStorage.getItem('product-view-mode') || 'grid'; setViewMode(currentView); // Handle view mode button clicks $viewBtns.on('click', function() { const viewMode = $(this).data('view'); setViewMode(viewMode); localStorage.setItem('product-view-mode', viewMode); }); } /** * Set View Mode */ function setViewMode(mode) { const $viewBtns = $('.catalog-toolbar__view-btn'); const $productsGrid = $('#products-grid'); // Update button states $viewBtns.removeClass('active'); $viewBtns.filter('[data-view="' + mode + '"]').addClass('active'); // Update grid class $productsGrid.removeClass('grid-view list-view'); $productsGrid.addClass(mode + '-view'); } /** * Initialize Mobile Filters Toggle */ function initMobileFiltersToggle() { const $toggle = $('.catalog-filters__toggle'); const $content = $('.catalog-filters__content'); $toggle.on('click', function() { $content.toggleClass('active'); $(this).toggleClass('active'); }); } /** * Initialize Get Quote Form Modal */ function initGetQuote() { $(document).on('click', '.catalog-product-card__inquiry', function(e) { e.preventDefault(); e.stopPropagation(); const $target = $('#ss-category-inquiry, #product-inquiry-form').first(); if ($target.length) { const headerOffset = 100; const offsetPosition = $target.offset().top - headerOffset; $('html, body').animate({ scrollTop: offsetPosition }, 500, 'swing'); return; } // Fallback: open global quote modal if inquiry section not found. const globalModal = document.getElementById('quote-modal'); if (globalModal) { globalModal.classList.add('is-open'); globalModal.setAttribute('aria-hidden', 'false'); document.body.classList.add('quote-modal-open'); } }); } /** * Restore Filter State from URL */ function restoreFilterState() { const urlParams = new URLSearchParams(window.location.search); const $form = $('#product-filters-form'); ['body_area[]', 'color[]', 'compression[]'].forEach(function(name) { const values = urlParams.getAll(name); values.forEach(function(value) { $form.find('.catalog-filters__checkbox[name="' + name + '"][value="' + value + '"]').prop('checked', true); }); }); updateActiveFilters(); } // Initialize when DOM is ready $(document).ready(function() { initArchivePage(); restoreFilterState(); initGetQuote(); // 页面加载时应用实时筛选(如果有选中的筛选条件) const $form = $('#product-filters-form'); if ($form.find('.catalog-filters__checkbox:checked').length > 0) { applyFiltersRealTime(); } else if (isTopLevelCategory()) { // 顶级分类初始状态下,根据首屏已加载数量决定是否显示 Load More const total = getCurrentTotalCountFromToolbar(); const loaded = $('#products-grid .catalog-product-card').length; sfArchiveState.page = 1; sfArchiveState.hasMore = loaded < total; setLoadMoreVisibility(sfArchiveState.hasMore); } }); })(jQuery); Wholesale Lounge Dress Soft Lounge Long Slip Dress - MT000298P %

Wholesale Lounge Dress Soft Lounge Long Slip Dress – MT000298P

Wholesale pink bodycon dress, Buy shapewear and waist trainer from Nanbin manufacturer, support OEM/ODM, enjoy factory price, low MOQ, new product discount. 24 hours fast delivery.
MOQ: 100 pcs
Lead Time: 15-25 days
Sample Time: 5-7 days

No Shaper

Material: 95%Modal+5%Elastane

This soft lounge long slip dress is designed for comfort and style. It features chest padding for added support and a flattering fit. The adjustable shoulder straps ensure a customized fit, while the fitted maxi length adds an elegant touch. It's the perfect lounge dress for a relaxed yet chic look.

Soft Lounge Slip Dress Design Show

Bodycon Slip Dress Soft Lounge Long Slip Dress Pink Bodycon Dress

OEM service waist trainer corset shapewear

shapewear customization processshapewear customization process

nanbin shapewear products vendor

nanbin certification

shapewear transport

shapewear buying guild FAQ

shapewear buying guild FAQ

Nanbin Fashion - Professional Shapewear Manufacturer

Nanbin Fashion - Professional Shapewear Manufacturer

Nanbin Fashion is a leading shapewear and activewear manufacturer, focusing on OEM/ODM services for global brands and wholesalers.

  • 13+ years of shapewear manufacturing experience
  • Strong OEM / ODM capability with professional design team
  • Support for small-batch customization and private label

Get Quote / Contact Us

Tell us about your shapewear project and target market. Our sales team will get back to you within 24 hours.

  • Private label & OEM / ODM service
  • Support small MOQ for start-up brands
  • One-to-one consultation from Nanbin team
WhatsApp