{"version":3,"sources":["webpack:///./pages/explore/projects/index.js","webpack:///./filterable_list.js","webpack:///./projects_list.js"],"names":["__webpack_require__","r","__webpack_exports__","_projects_list__WEBPACK_IMPORTED_MODULE_0__","document","addEventListener","ProjectsList","FilterableList","form","filter","holder","filterInputField","arguments","length","undefined","_classCallCheck","this","filterForm","listFilterElement","listHolderElement","isBusy","concat","getAttribute","$","serialize","getFilterEndpoint","debounceFilter","_","debounce","onFilterInput","bind","unbindEvents","bindEvents","queryData","filterGroupsParam","find","val","filterResults","setDefaultFilterOption","removeEventListener","params","_this","fadeTo","axios","get","then","res","onFilterSuccess","onFilterComplete","catch","response","data","html","innerHTML","currentPath","getPagePath","window","history","replaceState","page","title","querySelector","initSearch"],"mappings":"sIAAAA,EAAAC,EAAAC,GAAA,IAAAC,EAAAH,EAAA,KAEAI,SAASC,iBAAiB,mBAAoB,kBAAM,IAAIC,6RCOnCC,aACnB,SAAAA,EAAYC,EAAMC,EAAQC,GAA4C,IAApCC,EAAoCC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAjB,6GAAiBG,CAAAC,KAAAT,GACpES,KAAKC,WAAaT,EAClBQ,KAAKE,kBAAoBT,EACzBO,KAAKG,kBAAoBT,EACzBM,KAAKL,iBAAmBA,EACxBK,KAAKI,QAAS,qEAId,SAAAC,OAAUL,KAAKC,WAAWK,aAAa,UAAvC,KAAAD,OAAoDE,IAAEP,KAAKC,YAAYO,mDAIvE,OAAOR,KAAKS,yDAKZT,KAAKU,eAAiBC,IAAEC,SAASZ,KAAKa,cAAcC,KAAKd,MAAO,KAEhEA,KAAKe,eACLf,KAAKgB,qDAIL,IACMC,KACAC,EAFQX,IAAEP,KAAKC,YAEWkB,KAAN,UAAAd,OAAqBL,KAAKL,iBAA1B,OAAgDyB,MAEtEF,IACFD,EAAUjB,KAAKL,kBAAoBuB,GAGrClB,KAAKqB,cAAcJ,GAEfjB,KAAKsB,wBACPtB,KAAKsB,8DAKPtB,KAAKE,kBAAkBb,iBAAiB,QAASW,KAAKU,uDAItDV,KAAKE,kBAAkBqB,oBAAoB,QAASvB,KAAKU,sDAG7Cc,GAAQ,IAAAC,EAAAzB,KACpB,OAAIA,KAAKI,SAITG,IAAEP,KAAKG,mBAAmBuB,OAAO,IAAK,IAEtC1B,KAAKI,QAAS,EAEPuB,IACJC,IAAI5B,KAAKS,qBACRe,WAEDK,KAAK,SAAAC,GACJL,EAAKM,gBAAgBD,EAAKN,GAC1BC,EAAKO,qBAENC,MAAM,kBAAMR,EAAKO,8DAGNE,EAAUjB,GACpBiB,EAASC,KAAKC,OAChBpC,KAAKG,kBAAkBkC,UAAYH,EAASC,KAAKC,MAInD,IAAME,EAActC,KAAKuC,YAAYtB,GAErC,OAAOuB,OAAOC,QAAQC,cAElBC,KAAML,GAERlD,SAASwD,MACTN,8CAKFtC,KAAKI,QAAS,EACdG,IAAEP,KAAKG,mBAAmBuB,OAAO,IAAK,2HC3FrBpC,EACnB,SAAAA,iGAAcS,CAAAC,KAAAV,GACZ,IAAME,EAAOJ,SAASyD,cAAc,4BAC9BpD,EAASL,SAASyD,cAAc,4BAChCnD,EAASN,SAASyD,cAAc,4BAElCrD,GAAQC,GAAUC,GACP,IAAIH,IAAeC,EAAMC,EAAQC,GACzCoD","file":"pages.explore.projects.ee927f37.chunk.js","sourcesContent":["import ProjectsList from '~/projects_list';\n\ndocument.addEventListener('DOMContentLoaded', () => new ProjectsList());\n","import $ from 'jquery';\nimport _ from 'underscore';\nimport axios from './lib/utils/axios_utils';\n\n/**\n * Makes search request for content when user types a value in the search input.\n * Updates the html content of the page with the received one.\n */\n\nexport default class FilterableList {\n constructor(form, filter, holder, filterInputField = 'filter_groups') {\n this.filterForm = form;\n this.listFilterElement = filter;\n this.listHolderElement = holder;\n this.filterInputField = filterInputField;\n this.isBusy = false;\n }\n\n getFilterEndpoint() {\n return `${this.filterForm.getAttribute('action')}?${$(this.filterForm).serialize()}`;\n }\n\n getPagePath() {\n return this.getFilterEndpoint();\n }\n\n initSearch() {\n // Wrap to prevent passing event arguments to .filterResults;\n this.debounceFilter = _.debounce(this.onFilterInput.bind(this), 500);\n\n this.unbindEvents();\n this.bindEvents();\n }\n\n onFilterInput() {\n const $form = $(this.filterForm);\n const queryData = {};\n const filterGroupsParam = $form.find(`[name=\"${this.filterInputField}\"]`).val();\n\n if (filterGroupsParam) {\n queryData[this.filterInputField] = filterGroupsParam;\n }\n\n this.filterResults(queryData);\n\n if (this.setDefaultFilterOption) {\n this.setDefaultFilterOption();\n }\n }\n\n bindEvents() {\n this.listFilterElement.addEventListener('input', this.debounceFilter);\n }\n\n unbindEvents() {\n this.listFilterElement.removeEventListener('input', this.debounceFilter);\n }\n\n filterResults(params) {\n if (this.isBusy) {\n return false;\n }\n\n $(this.listHolderElement).fadeTo(250, 0.5);\n\n this.isBusy = true;\n\n return axios\n .get(this.getFilterEndpoint(), {\n params,\n })\n .then(res => {\n this.onFilterSuccess(res, params);\n this.onFilterComplete();\n })\n .catch(() => this.onFilterComplete());\n }\n\n onFilterSuccess(response, queryData) {\n if (response.data.html) {\n this.listHolderElement.innerHTML = response.data.html;\n }\n\n // Change url so if user reload a page - search results are saved\n const currentPath = this.getPagePath(queryData);\n\n return window.history.replaceState(\n {\n page: currentPath,\n },\n document.title,\n currentPath,\n );\n }\n\n onFilterComplete() {\n this.isBusy = false;\n $(this.listHolderElement).fadeTo(250, 1);\n }\n}\n","import FilterableList from './filterable_list';\n\n/**\n * Makes search request for projects when user types a value in the search input.\n * Updates the html content of the page with the received one.\n */\nexport default class ProjectsList {\n constructor() {\n const form = document.querySelector('form#project-filter-form');\n const filter = document.querySelector('.js-projects-list-filter');\n const holder = document.querySelector('.js-projects-list-holder');\n\n if (form && filter && holder) {\n const list = new FilterableList(form, filter, holder);\n list.initSearch();\n }\n }\n}\n"],"sourceRoot":""}