@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 8.42 kB
JavaScript
import{__decorate as a}from"tslib";import{getConfig as m}from"@expofp/config";import{action as c,observable as g,reaction as u}from"mobx";import{PREFIXES as S}from"../store/search-buttons/constants";import l from"../tools/logger";import{decodeString as P,decodeStringArray as F,encodeString as L,encodeStringArray as T,toLowerCaseArray as d,toLowerCaseString as f}from"../utils/urlEncoding";import{replaceQuery as I}from"./url-sync";const h={CATEGORIES:"categories",POI_TYPE:"poiType",POI_TYPES:"poiTypes",EXHIBITORS:"exhibitors"};export class URLFilterManager{constructor(e){this.rootStore=e,this.currentFilters={categories:[],poiType:null,poiTypes:[],exhibitors:!1},this.isInitialized=!1,this.setupReactions()}initialize(){this.parseURLFilters(),this.applyFiltersToStore(),this.isInitialized=!0,l.log("URLFilterManager initialized with filters:",this.currentFilters)}parseURLFilters(){const{categories:e,poiType:t,poiTypes:r,exhibitors:i}=this.readRawFilters(),o=r.filter(s=>{if(!s)return!1;const n=this.rootStore.poiTypeStore.poiTypes.some(p=>p.name.toLowerCase()===s.toLowerCase());return n||l.warn(`POI type not found in data: ${s}`),n});e.length>0&&(t||o.length>0)?(l.warn("URL contains both categories and POI types. Clearing POI types."),this.currentFilters={categories:e,poiType:null,poiTypes:[],exhibitors:i}):this.currentFilters={categories:e,poiType:t,poiTypes:o,exhibitors:i},l.log("URLFilterManager parsed filters:",{categories:e,poiType:t,poiTypes:r,exhibitors:i}),this.validateFilters(this.currentFilters)}readRawFilters(){const e=m().filters;if(Object.keys(e).length>0)return{categories:[...e.categories??[]],poiType:e.poiType??null,poiTypes:[...e.poiTypes??[]],exhibitors:e.exhibitors??!1};const t=new URLSearchParams(window.location.search),r=t.get(h.CATEGORIES),i=r?F(r):[],o=t.get(h.POI_TYPE),s=o?P(o):null,n=t.get(h.POI_TYPES),p=n?F(n):[],y=t.get(h.EXHIBITORS);return{categories:i,poiType:s,poiTypes:p,exhibitors:y==="true"||y===""}}applyFiltersToStore(){const{uiState:e,categoryFilterStore:t,searchButtonsStore:r}=this.rootStore;if(this.currentFilters.categories.length>0){const i=this.currentFilters.categories.map(o=>this.rootStore.categoryStore.categories.find(s=>s.name.toLowerCase()===o.toLowerCase())).filter(o=>o!==void 0);i.length>0?(e.selectedCategoryFilters=i,t.state.selectedItems=i.map(o=>({id:o.id,name:o.name})),e.categoryFilterOpen=!0,l.log("URLFilterManager applied categories:",i.map(o=>o.name)),setTimeout(()=>{this.focusOnFilteredBooths(),this.rootStore.searchStore.setFocused(!0)},100)):l.warn("URLFilterManager: no categories found for names:",this.currentFilters.categories)}if(this.currentFilters.poiType){const i=this.rootStore.poiTypeStore.poiTypes.find(o=>o.name.toLowerCase()===this.currentFilters.poiType.toLowerCase());i?(e.selectedPoiTypeFilters=[i],r.setPoiFilterId(`${S.POI_TYPE}${i.id}`),l.log("URLFilterManager applied POI type:",i.name),setTimeout(()=>{this.focusOnFilteredBooths(),this.rootStore.searchStore.setFocused(!0)},100)):l.warn("URLFilterManager: no POI type found for name:",this.currentFilters.poiType)}if(this.currentFilters.poiTypes.length>0){const i=this.currentFilters.poiTypes.map(o=>o?this.rootStore.poiTypeStore.poiTypes.find(s=>s.name.toLowerCase()===o.toLowerCase()):null).filter(o=>o!=null);i.length>0?(e.selectedPoiTypeFilters=i,l.log("URLFilterManager applied POI types:",i.map(o=>o.name)),setTimeout(()=>{this.focusOnFilteredBooths(),this.rootStore.searchStore.setFocused(!0)},100)):(l.warn("URLFilterManager: no POI types found for names:",this.currentFilters.poiTypes),this.currentFilters.poiTypes=[])}this.currentFilters.exhibitors&&this.openExhibitorsList()}filterSearch(){const{uiState:e}=this.rootStore,t=new URLSearchParams;if(e.selectedCategoryFilters.length>0){const r=e.selectedCategoryFilters.map(o=>o.name.toLowerCase()),i=T(r);i&&t.set(h.CATEGORIES,i)}if(e.selectedPoiTypeFilters.length>0&&e.selectedCategoryFilters.length===0)if(e.selectedPoiTypeFilters.length===1){const r=e.selectedPoiTypeFilters[0].name.toLowerCase();if(r){const i=L(r);i&&t.set(h.POI_TYPE,i)}}else{const r=e.selectedPoiTypeFilters.map(o=>o.name.toLowerCase()),i=T(r);i&&t.set(h.POI_TYPES,i)}return this.currentFilters.exhibitors&&e.selectedCategoryFilters.length===0&&e.selectedPoiTypeFilters.length===0&&t.set(h.EXHIBITORS,"true"),t.toString()?`?${t.toString()}`:""}updateURLFromFilters(){const{uiState:e}=this.rootStore;I(this.filterSearch()),this.currentFilters={categories:e.selectedCategoryFilters.length>0?e.selectedCategoryFilters.map(t=>t.name):[],poiType:e.selectedPoiTypeFilters.length===1&&e.selectedCategoryFilters.length===0?e.selectedPoiTypeFilters[0].name:null,poiTypes:e.selectedPoiTypeFilters.length>1&&e.selectedCategoryFilters.length===0?e.selectedPoiTypeFilters.map(t=>t.name):[],exhibitors:this.currentFilters.exhibitors}}setCategories(e){this.currentFilters.categories=d(e),this.currentFilters.poiType=null,this.isInitialized&&this.updateURLFromFilters()}setPoiType(e){this.currentFilters.poiType=f(e),this.currentFilters.poiTypes=[],this.currentFilters.categories=[],this.isInitialized&&this.updateURLFromFilters()}setPoiTypes(e){this.currentFilters.poiTypes=d(e),this.currentFilters.poiType=null,this.currentFilters.categories=[],this.isInitialized&&this.updateURLFromFilters()}clearAllFilters(){this.currentFilters={categories:[],poiType:null,poiTypes:[],exhibitors:!1};const{uiState:e}=this.rootStore;e.categoryFilterOpen=!1,this.updateURLFromFilters()}getCurrentFilters(){return{...this.currentFilters}}setupReactions(){u(()=>this.rootStore.uiState.selectedCategoryFilters,e=>{if(this.isInitialized&&e.length>0){const t=d(e.map(r=>r.name));this.setCategories(t)}}),u(()=>this.rootStore.uiState.selectedPoiTypeFilters,e=>{if(this.isInitialized&&e.length>0)if(e.length===1){const t=f(e[0].name);t&&this.setPoiType(t)}else{const t=d(e.map(r=>r.name));this.setPoiTypes(t)}})}validateFilters(e){if(e.categories.length>0&&(e.poiType||e.poiTypes.length>0))return l.warn("Categories and POI types cannot be active simultaneously"),!1;if(e.poiType&&e.poiTypes.length>0)return l.warn("Both single POI type and multiple POI types cannot be active simultaneously"),!1;for(const t of e.categories)if(!this.getCategoryIdByName(t))return l.warn(`Category not found: ${t}`),!1;if(e.poiType&&!this.getPoiTypeIdByName(e.poiType))return l.warn(`POI type not found: ${e.poiType}`),!1;for(const t of e.poiTypes)if(!this.getPoiTypeIdByName(t))return l.warn(`POI type not found: ${t}`),!1;return!0}getCategoryIdByName(e){const t=this.rootStore.categoryStore.categories.find(r=>r.name.toLowerCase()===e.toLowerCase());return t?t.id:null}getPoiTypeIdByName(e){const t=this.rootStore.poiTypeStore.poiTypes.find(r=>r.name.toLowerCase()===e.toLowerCase());return t?t.id:null}focusOnFilteredBooths(){if(!this.rootStore.layerStore.layersLoaded){u(()=>this.rootStore.layerStore.layersLoaded,()=>{this.focusOnFilteredBooths()},{fireImmediately:!1});return}const{uiState:e,exhibitorStore:t,boothStore:r}=this.rootStore;let i=[];if(e.selectedCategoryFilters.length>0){const s=t.exhibitors.filter(n=>e.selectedCategoryFilters.some(p=>n.categories.some(y=>y.id===p.id)));i=r.booths.filter(n=>s.some(p=>p.id===n.exhibitors[0]?.id))}if(e.selectedPoiTypeFilters.length>0){const s=r.booths.filter(n=>e.selectedPoiTypeFilters.some(p=>n.poiTypeId===p.id));i.length>0?i=i.filter(n=>s.some(p=>p.id===n.id)):i=s}const o=i.filter(s=>s.visible);o.length>0?(e.moveToBooths=o,this.rootStore.moveToList(o)):i.length>0&&(this.rootStore.showMap(),this.rootStore.moveToList(i))}openExhibitorsList(){const{uiState:e}=this.rootStore;e.list={type:"exhibitors",text:"",focused:!1},setTimeout(()=>{this.rootStore.searchStore.setFocused(!0)},100),l.log("URLFilterManager opened exhibitors list")}}a([g],URLFilterManager.prototype,"currentFilters",void 0),a([g],URLFilterManager.prototype,"isInitialized",void 0),a([c],URLFilterManager.prototype,"initialize",null),a([c],URLFilterManager.prototype,"parseURLFilters",null),a([c],URLFilterManager.prototype,"applyFiltersToStore",null),a([c],URLFilterManager.prototype,"updateURLFromFilters",null),a([c],URLFilterManager.prototype,"setCategories",null),a([c],URLFilterManager.prototype,"setPoiType",null),a([c],URLFilterManager.prototype,"setPoiTypes",null),a([c],URLFilterManager.prototype,"clearAllFilters",null),a([c],URLFilterManager.prototype,"focusOnFilteredBooths",null),a([c],URLFilterManager.prototype,"openExhibitorsList",null);