Source: boost-pfs-components.js

import jQ from 'jquery';
import noUiSlider from 'nouislider';

import Settings from './helpers/settings';
import Utils from './helpers/utils';
import Labels from './helpers/labels';
import Globals from './helpers/globals';
import Selector from './helpers/selector';
import Navigation from './helpers/navigation';
import Class from "./helpers/class";
import Analytics from "./helpers/analytics";
import FunctionMapper from './legacy/function-mapper';

// API
import Api from "./helpers/api";
import FilterApi from './api/filter-api';
import InstantSearchApi from './api/instant-search-api';

// Enums
import FilterTreeEnum from './enum/filter-tree-enum';
import FilterOptionEnum from "./enum/filter-option-enum";
import InstantSearchEnum from "./enum/instant-search-enum";

// Instant Search Components
import SearchInput from './components/instant-search/instant-search-element/search-input';
import InstantSearch from './components/instant-search/instant-search';
import InstantSearchMobile from './components/instant-search/instant-search-style/instant-search-mobile';
import InstantSearchResult from "./components/instant-search/instant-search-style/instant-search-result";
import InstantSearchStyle from "./components/instant-search/instant-search-style/instant-search-style";
import InstantSearchResultStyle2 from "./components/instant-search/instant-search-style/instant-search-result-style2";

// Instant Search Block
import InstantSearchResultBlock from "./components/instant-search/instant-search-block/instant-search-result-block";
import InstantSearchResultBlockDym from "./components/instant-search/instant-search-block/instant-search-result-block-dym";
import InstantSearchResultBlockEmpty from "./components/instant-search/instant-search-block/instant-search-result-block-empty";
import InstantSearchResultBlockLoading from "./components/instant-search/instant-search-block/instant-search-result-block-loading";
import InstantSearchResultBlockViewAll from "./components/instant-search/instant-search-block/instant-search-result-block-view-all";

// Instant Search Item
import InstantSearchResultItem from "./components/instant-search/instant-search-item/instant-search-result-item";
import InstantSearchResultItemCollection from "./components/instant-search/instant-search-item/instant-search-result-item-collection";
import InstantSearchResultItemPage from "./components/instant-search/instant-search-item/instant-search-result-item-page";
import InstantSearchResultItemPopular from "./components/instant-search/instant-search-item/instant-search-result-item-popular";
import InstantSearchResultItemProduct from './components/instant-search/instant-search-item/instant-search-result-item-product';

// Instant Search Others
import AutocompleteMenuCustom from './components/instant-search/others/autocomplete-menu-custom';
import InstantSearchResultRedirect from "./components/instant-search/others/instant-search-result-redirect";

// Filter Components
import Filter from './components/filter/filter';
import FilterTree from "./components/filter/filter-tree/filter-tree";
import FilterRefineBy from "./components/filter/filter-tree/filter-refine-by/filter-refine-by";
import FilterRefineByItem from "./components/filter/filter-tree/filter-refine-by/filter-refine-by-item";
import FilterOption from "./components/filter/filter-tree/filter-option/filter-option";

import FilterOptionBox from "./components/filter/filter-tree/filter-option/filter-option-box";
import FilterOptionList from "./components/filter/filter-tree/filter-option/filter-option-list";
import FilterOptionSwatch from "./components/filter/filter-tree/filter-option/filter-option-swatch";
import FilterOptionMultiLevelTag from "./components/filter/filter-tree/filter-option/filter-option-multi-level-tag";
import FilterOptionMultiLevelCollections from "./components/filter/filter-tree/filter-option/filter-option-multi-level-collections";
import FilterOptionRangeSlider from "./components/filter/filter-tree/filter-option/filter-option-range-slider";
import FilterOptionRating from "./components/filter/filter-tree/filter-option/filter-option-rating";
import FilterOptionSubCategory from "./components/filter/filter-tree/filter-option/filter-option-sub-category";
import FilterApplyButton from "./components/filter/filter-tree/filter-option-element/filter-apply-button";
import FilterClearButton from "./components/filter/filter-tree/filter-option-element/filter-clear-button";
import FilterScrollbar from "./components/filter/filter-tree/filter-option-element/filter-scrollbar";
import FilterViewMore from "./components/filter/filter-tree/filter-option-element/filter-view-more";
import FilterCollapse from "./components/filter/filter-tree/filter-option-element/filter-collapse";
import FilterSearchBox from "./components/filter/filter-tree/filter-option-element/filter-search-box";
import FilterTooltip from "./components/filter/filter-tree/filter-option-element/filter-tooltip";
import FilterOptionItem from "./components/filter/filter-tree/filter-option-item/filter-option-item";
import FilterOptionItemBox from "./components/filter/filter-tree/filter-option-item/filter-option-item-box";
import FilterOptionItemList from "./components/filter/filter-tree/filter-option-item/filter-option-item-list";
import FilterOptionItemSwatch from "./components/filter/filter-tree/filter-option-item/filter-option-item-swatch";
import FilterOptionItemMultiLevelTag from "./components/filter/filter-tree/filter-option-item/filter-option-item-multi-level-tag";
import { FilterOptionItemSecondLevelTag, FilterOptionItemThirdLevelTag } from "./components/filter/filter-tree/filter-option-item/filter-option-item-multi-level-tag";
import FilterOptionItemMultiLevelCollections from "./components/filter/filter-tree/filter-option-item/filter-option-item-multi-level-collections";
import { FilterOptionItemSecondLevelCollections, FilterOptionItemThirdLevelCollections } from "./components/filter/filter-tree/filter-option-item/filter-option-item-multi-level-collections";
import FilterOptionItemRangeSlider from "./components/filter/filter-tree/filter-option-item/filter-option-item-range-slider";
import FilterOptionItemRating from "./components/filter/filter-tree/filter-option-item/filter-option-item-rating";
import FilterOptionItemSubCategory from "./components/filter/filter-tree/filter-option-item/filter-option-item-sub-category";
import FilterStyle from "./components/filter/filter-tree/filter-style/filter-style";
import FilterTreeStyle2 from "./components/filter/filter-tree/filter-style/filter-tree-style2";
import FilterTreeStyle3 from "./components/filter/filter-tree/filter-style/filter-tree-style3";
import FilterTreeStyle4 from "./components/filter/filter-tree/filter-style/filter-tree-style4";
import FilterLoadingIcon from "./components/filter/filter-tree/filter-loading-icon";
import FilterMobileButton from "./components/filter/filter-tree/filter-mobile-button";
import FilterScrollToTop from "./components/filter/filter-tree/filter-scroll-to-top";

// Filter results
import FilterResult from "./components/filter/filter-result/filter-result";
import ProductList from './components/filter/filter-result/product/product-list';
import ProductListPlaceholder from './components/filter/filter-result/product/product-list-placeholder';

// Product Item
import ProductItem from "./components/filter/filter-result/product/product-item/product-item";
import ProductGridItem from './components/filter/filter-result/product/product-item/product-grid-item';
import ProductListItem from "./components/filter/filter-result/product/product-item/product-list-item";
import ProductCollageItem from './components/filter/filter-result/product/product-item/product-collage-item';

// Filter result elements
import ProductDisplayType from './components/filter/filter-result/filter-result-element/product-display-type';
import ProductSorting from './components/filter/filter-result/filter-result-element/product-sorting';
import ProductLimit from './components/filter/filter-result/filter-result-element/product-limit';
import PageInfoCollection from './components/filter/filter-result/filter-result-element/page-info-collection';
import PageInfoSearch from "./components/filter/filter-result/filter-result-element/page-info-search";
import Breadcrumb from "./components/filter/filter-result/filter-result-element/breadcrumb";
import RobotsMeta from "./components/filter/filter-result/filter-result-element/robots-meta";
import SearchResultPanels from "./components/filter/filter-result/filter-result-element/search-result-panels";
import SearchResultPanelItem from "./components/filter/filter-result/filter-result-element/search-result-panel-item";
import SearchResultTotal from "./components/filter/filter-result/filter-result-element/search-result-total";

// Pagination
import ProductPagination from "./components/filter/filter-result/filter-result-element/pagination/product-pagination";
import ProductPaginationDefault from './components/filter/filter-result/filter-result-element/pagination/product-pagination-default';
import ProductPaginationInfinite from "./components/filter/filter-result/filter-result-element/pagination/product-pagination-infinite";
import ProductPaginationLoadMore from "./components/filter/filter-result/filter-result-element/pagination/product-pagination-load-more";
import ProductPaginationLoadPrevious from "./components/filter/filter-result/filter-result-element/pagination/product-pagination-load-previous";
import SearchDisplayPagination from "./components/filter/filter-result/filter-result-element/pagination/search-display-pagination"


/**
 * Injects all components into a scope, to override and customize outside applib.
 * @param scope
 */
const inject = (scope) => {
	// Library
	scope.jQ = jQ;
	scope.noUiSlider = noUiSlider;

	// Helpers
	scope.Analytics = Analytics;
	scope.Class = Class;
	scope.Globals = Globals;
	scope.Labels = Labels;
	scope.Navigation = Navigation;
	scope.Selector = Selector;
	scope.Settings = Settings;
	scope.Utils = Utils;
	scope.FunctionMapper = FunctionMapper;

	// Api
	scope.Api = Api;
	scope.FilterApi = FilterApi;
	scope.InstantSearchApi = InstantSearchApi;

	// Enums
	scope.FilterTreeEnum = FilterTreeEnum;
	scope.FilterOptionEnum = FilterOptionEnum;
	scope.InstantSearchEnum = InstantSearchEnum;

	// Filter
	scope.Filter = Filter;
	scope.FilterTree = FilterTree;
	scope.FilterStyle = FilterStyle;
	scope.FilterTreeStyle2 = FilterTreeStyle2;
	scope.FilterTreeStyle3 = FilterTreeStyle3;
	scope.FilterTreeStyle4 = FilterTreeStyle4;

	// Filter Option
	scope.FilterOption = FilterOption;
	scope.FilterOptionList = FilterOptionList;
	scope.FilterOptionBox = FilterOptionBox;
	scope.FilterOptionSwatch = FilterOptionSwatch;
	scope.FilterOptionMultiLevelCollections = FilterOptionMultiLevelCollections;
	scope.FilterOptionMultiLevelTag = FilterOptionMultiLevelTag;
	scope.FilterOptionRangeSlider = FilterOptionRangeSlider;
	scope.FilterOptionRating = FilterOptionRating;
	scope.FilterOptionSubCategory = FilterOptionSubCategory;

	// Filter Option Element
	scope.FilterApplyButton = FilterApplyButton;
	scope.FilterClearButton = FilterClearButton;
	scope.FilterCollapse = FilterCollapse;
	scope.FilterScrollbar = FilterScrollbar;

	scope.FilterSearchBox = FilterSearchBox;
	scope.FilterTooltip = FilterTooltip;
	scope.FilterViewMore = FilterViewMore;

	// Filter Option Item
	scope.FilterOptionItem = FilterOptionItem;
	scope.FilterOptionItemList = FilterOptionItemList;
	scope.FilterOptionItemBox = FilterOptionItemBox;
	scope.FilterOptionItemSwatch = FilterOptionItemSwatch;
	scope.FilterOptionItemMultiLevelCollections = FilterOptionItemMultiLevelCollections;
	scope.FilterOptionItemSecondLevelCollections = FilterOptionItemSecondLevelCollections;
	scope.FilterOptionItemThirdLevelCollections = FilterOptionItemThirdLevelCollections;
	scope.FilterOptionItemMultiLevelTag = FilterOptionItemMultiLevelTag;
	scope.FilterOptionItemSecondLevelTag = FilterOptionItemSecondLevelTag;
	scope.FilterOptionItemThirdLevelTag = FilterOptionItemThirdLevelTag;
	scope.FilterOptionItemRangeSlider = FilterOptionItemRangeSlider;
	scope.FilterOptionItemRating = FilterOptionItemRating;
	scope.FilterOptionItemSubCategory = FilterOptionItemSubCategory;


	// Filter Refine By
	scope.FilterRefineBy = FilterRefineBy;
	scope.FilterRefineByItem = FilterRefineByItem;

	// Filter extra elements
	scope.FilterLoadingIcon = FilterLoadingIcon;
	scope.FilterMobileButton = FilterMobileButton;
	scope.FilterScrollToTop = FilterScrollToTop;


	// Filter Results
	scope.FilterResult = FilterResult;
	scope.ProductList = ProductList;
	scope.ProductListPlaceholder =  ProductListPlaceholder;

	// Product item
	scope.ProductItem = ProductItem;
	scope.ProductGridItem = ProductGridItem;
	scope.ProductListItem = ProductListItem;
	scope.ProductCollageItem = ProductCollageItem

	// Filter results elements
	scope.Breadcrumb = Breadcrumb;
	scope.PageInfoCollection = PageInfoCollection;
	scope.PageInfoSearch = PageInfoSearch;
	scope.ProductDisplayType = ProductDisplayType;
	scope.ProductLimit = ProductLimit;
	scope.ProductSorting = ProductSorting;
	scope.RobotsMeta = RobotsMeta;
	scope.SearchResultPanels = SearchResultPanels;
	scope.SearchResultPanelItem = SearchResultPanelItem;
	scope.SearchResultTotal = SearchResultTotal;

	// Pagination
	scope.ProductPagination = ProductPagination;
	scope.ProductPaginationDefault = ProductPaginationDefault;
	scope.ProductPaginationInfinite = ProductPaginationInfinite;
	scope.ProductPaginationLoadMore = ProductPaginationLoadMore;
	scope.ProductPaginationLoadPrevious = ProductPaginationLoadPrevious;
	scope.SearchDisplayPagination = SearchDisplayPagination;

	// Instant search
	scope.SearchInput = SearchInput;
	scope.InstantSearch = InstantSearch;
	scope.InstantSearchMobile = InstantSearchMobile;
	scope.InstantSearchResult = InstantSearchResult;
	scope.InstantSearchStyle = InstantSearchStyle;
	scope.InstantSearchResultStyle2 = InstantSearchResultStyle2;

	// Instant search result block
	scope.InstantSearchResultBlock = InstantSearchResultBlock;
	scope.InstantSearchResultBlockDym = InstantSearchResultBlockDym;
	scope.InstantSearchResultBlockEmpty = InstantSearchResultBlockEmpty;
	scope.InstantSearchResultBlockLoading = InstantSearchResultBlockLoading;
	scope.InstantSearchResultBlockViewAll = InstantSearchResultBlockViewAll;

	// Instant search item
	scope.InstantSearchResultItem = InstantSearchResultItem;
	scope.InstantSearchResultItemCollection = InstantSearchResultItemCollection;
	scope.InstantSearchResultItemPage = InstantSearchResultItemPage;
	scope.InstantSearchResultItemPopular = InstantSearchResultItemPopular;
	scope.InstantSearchResultItemProduct = InstantSearchResultItemProduct;

	// Instant search others
	scope.AutocompleteMenuCustom = AutocompleteMenuCustom;
	scope.InstantSearchResultRedirect = InstantSearchResultRedirect;
}

const Components = {
	inject: inject
}

export default Components;