Skip to content

Commit 7b33244

Browse files
committed
Remove jquery (WIP)
1 parent f7f270b commit 7b33244

File tree

5 files changed

+76
-41
lines changed

5 files changed

+76
-41
lines changed
Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
1-
import $ from 'jquery'
2-
31
import {queryByHook} from '../util'
42

53
export default class {
64
constructor (opts) {
7-
const elements = {
8-
resourceItem: queryByHook('resource-item', opts.el)
9-
}
5+
const resourceItems = queryByHook('resource-item', opts.el)
106

117
// Resource details links
12-
elements.resourceItem.each((index, item) => {
13-
if ($('table tr', item).length) {
14-
queryByHook('show-resource-details', item).show()
8+
resourceItems.forEach((resourceItem) => {
9+
const hasDetails = !!resourceItem.querySelector('table tr')
10+
if (hasDetails) {
11+
const showDetailsBtns = queryByHook('show-resource-details', resourceItem)
12+
showDetailsBtns.forEach((btn) => {
13+
btn.style.display = 'inline-block' // TODO: replace with show()
14+
btn.addEventListener('click', (event) => {
15+
const details = queryByHook('resource-details', btn.parentNode)
16+
// TODO: toggle visibility of details
17+
event.preventDefault()
18+
})
19+
})
1520
}
1621
})
17-
elements.resourceItem.on('click', '[data-hook~=show-resource-details]', (e) => {
18-
$(e.currentTarget).closest('[data-hook~=resource-item]').children('[data-hook~=resource-details]').toggle()
19-
e.preventDefault()
22+
23+
const showDetailsBtns = queryByHook('show-resource-details')
24+
showDetailsBtns.forEach((btn) => {
25+
btn.addEventListener
2026
})
2127
}
2228
}

scripts/src/components/datasets-list.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default class {
2525

2626
// Filter datasets and render in items container
2727
const paramFilters = pick(opts.params, ['organization', 'category'])
28-
const attributeFilters = pick(opts.el.data(), ['organization', 'category'])
28+
const attributeFilters = pick(opts.el.dataset, ['organization', 'category'])
2929
const filters = createDatasetFilters(defaults(paramFilters, attributeFilters))
3030
const filteredDatasets = filter(opts.datasets, filters)
3131
const datasetsMarkup = filteredDatasets.map(TmplDatasetItem)
@@ -38,7 +38,7 @@ export default class {
3838

3939
// Search datasets listener
4040
const searchFunction = this._createSearchFunction(filteredDatasets)
41-
elements.searchQuery.on('keyup', (e) => {
41+
elements.searchQuery.forEach((el) => el.addEventListener('keyup', (e) => {
4242
const query = e.currentTarget.value
4343

4444
// Datasets
@@ -49,7 +49,7 @@ export default class {
4949
// Dataset count
5050
const resultsCountMarkup = results.length + ' datasets'
5151
setContent(elements.datasetsCount, resultsCountMarkup)
52-
})
52+
}))
5353
}
5454

5555
// Returns a function that can be used to search an array of datasets

scripts/src/components/organizations-filter.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import $ from 'jquery'
21
import {chain, pick, omit, filter, defaults} from 'lodash'
32

43
import TmplListGroupItem from '../templates/list-group-item'
5-
import {setContent, slugify, createDatasetFilters, collapseListGroup} from '../util'
4+
import {setContent, slugify, createDatasetFilters, collapseListGroup, param} from '../util'
65

76
export default class {
87
constructor (opts) {
@@ -23,7 +22,7 @@ export default class {
2322
const itemParams = selected ? omit(params, 'organization') : defaults({organization: orgSlug}, params)
2423
return {
2524
title: organization,
26-
url: '?' + $.param(itemParams),
25+
url: '?' + param(itemParams),
2726
count: filteredDatasets.length,
2827
unfilteredCount: datasetsInOrg.length,
2928
selected: selected

scripts/src/index.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/* global settings */
2-
import $ from 'jquery'
3-
import 'jquery-deparam'
2+
import deparam from 'jquery-deparam'
43
import 'bootstrap/js/dist/collapse'
54

65
import DatasetsList from './components/datasets-list'
@@ -9,12 +8,13 @@ import OrganizationsFilter from './components/organizations-filter'
98
import DatasetDisplay from './components/dataset-display'
109
import {queryByComponent} from './util'
1110

12-
const params = $.deparam(window.location.search.substr(1))
11+
const params = deparam(window.location.search.substr(1))
1312

1413
// Helper function to ensure datasets.json is only fetched once per page
1514
let datasetsCache
1615
function getDatasets () {
17-
datasetsCache = datasetsCache || $.getJSON(`${settings.BASE_URL}/datasets.json`)
16+
const url = `${settings.BASE_URL}/datasets.json`
17+
datasetsCache = datasetsCache || fetch(url).then((response) => response.json())
1818
return datasetsCache
1919
}
2020

@@ -31,11 +31,11 @@ for (let component of components) {
3131
// If the component depends on datasets.json, fetch it first (once per page) and pass it
3232
if (component.usesDatasets) {
3333
getDatasets().then((datasets) => {
34-
els.each((index, el) => new component.class({el: $(el), params, datasets})) // eslint-disable-line
34+
els.forEach((el) => new component.class({el: el, params, datasets})) // eslint-disable-line
3535
})
3636
// Otherwise simply initialize the component
3737
} else {
38-
els.each((index, el) => new component.class({el: $(el), params})) // eslint-disable-line
38+
els.forEach((el) => new component.class({el: el, params})) // eslint-disable-line
3939
}
4040
}
4141
}

scripts/src/util.js

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
import $ from 'jquery'
2-
31
export function queryByHook (hook, container) {
4-
return $(`[data-hook~=${hook}]`, container)
2+
const context = container || document
3+
return Array.from(context.querySelectorAll(`[data-hook~=${hook}]`))
54
}
65

76
export function queryByComponent (component, container) {
8-
return $(`[data-component~=${component}]`, container)
7+
const context = container || document
8+
return Array.from(context.querySelectorAll(`[data-component~=${component}]`))
99
}
1010

1111
export function setContent (container, content) {
12-
return container.empty().append(content)
12+
const containerList = ensureArray(container)
13+
const contentString = Array.isArray(content) ? content.join('\n') : content
14+
containerList.forEach((container) => container.innerHTML = contentString)
1315
}
1416

1517
// Meant to mimic Jekyll's slugify function
@@ -37,20 +39,48 @@ export function createDatasetFilters (filters) {
3739

3840
// Collapses a bootstrap list-group to only show a few items by default
3941
// Number of items to show can be specified in [data-show] attribute or passed as param
40-
export function collapseListGroup (container, show) {
41-
if (!show) show = container.data('show') || 5
42+
export function collapseListGroup (container, numToShow) {
43+
if (!numToShow) numToShow = +container.dataset.show || 5
44+
45+
const hideFromIndex = numToShow + 1
46+
const itemsToHideQuery = `.list-group-item:nth-of-type(n+${hideFromIndex}):not(.active)`
47+
const itemsToHide = Array.from(container.querySelectorAll(itemsToHideQuery))
4248

43-
const itemsToHide = $('.list-group-item:gt(' + (show - 1) + '):not(.active)', container)
4449
if (itemsToHide.length) {
45-
itemsToHide.hide()
46-
47-
const showMoreButton = $('<a href="#" class="list-group-item">Show ' + itemsToHide.length + ' more...</a>')
48-
showMoreButton.on('click', function (e) {
49-
itemsToHide.show()
50-
$(this).off('click')
51-
$(this).remove()
52-
e.preventDefault()
53-
})
54-
container.append(showMoreButton)
50+
hide(itemsToHide)
51+
52+
const showMoreButton = createShowMoreButton(itemsToHide)
53+
container.appendChild(showMoreButton)
5554
}
5655
}
56+
57+
export function param (obj) {
58+
const params = new URLSearchParams(obj)
59+
return params.toString()
60+
}
61+
62+
export function hide (els) {
63+
ensureArray(els).forEach((el) => el.style.display = 'none')
64+
}
65+
66+
export function show (els) {
67+
ensureArray(els).forEach((el) => el.style.display = '')
68+
}
69+
70+
function ensureArray (item) {
71+
return Array.isArray(item) ? item : [item]
72+
}
73+
74+
function createShowMoreButton (hiddenItems) {
75+
const el = document.createElement('a')
76+
el.classList.add('list-group-item')
77+
el.setAttribute('href', '#')
78+
el.textContent = `Show ${hiddenItems.length} more...`
79+
el.addEventListener('click', function (event) {
80+
show(hiddenItems)
81+
this.remove()
82+
event.preventDefault()
83+
}, {once: true})
84+
85+
return el
86+
}

0 commit comments

Comments
 (0)