-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsearch.liquid
122 lines (113 loc) · 3.4 KB
/
search.liquid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
---
layout: page
title: Search
description: Search this Site
---
<style>
[v-cloak] {display: none}
</style>
{% raw %}
<div id="app" v-cloak>
<form data-members-form="subscribe" class="subscribe-form">
<div v-cloak class="form-group">
<input v-model="search" class="subscribe-email" type="search">
<button @click.prevent="doSearch" class="button"><span v-if="searching">Searching...</span><span v-else>Search</span></button>
</div>
</form>
<div v-if="noResults">
<p>
Sorry, but there were no results.
</p>
</div>
<div v-if="results && !noResults">
<p v-if="numResults > 1">
There were {{numResults}} total results for this search.
</p><p v-else>
There was one total result for this search.
</p>
<p v-for="(result,idx) in results" :key="idx">
{{ idx+1}}) <a :href="result.url" @click="track(result.url, result.objectID, idx+1)">{{result.title}}</a><br/>
Published: {{ result.date }}<br/>
Excerpt: <span v-html="result._snippetResult.content.value"></span>
</p>
</div>
</div>
<p>
<img src="/images/algolia.webp" title="Search by Algolia">
</p>
{% endraw %}
<script src="https://cdn.jsdelivr.net/npm/algoliasearch@4/dist/algoliasearch-lite.umd.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var ALGOLIA_INSIGHTS_SRC = "https://cdn.jsdelivr.net/npm/search-insights@1.6.3";
!function(e,a,t,n,s,i,c){e.AlgoliaAnalyticsObject=s,e[s]=e[s]||function(){
(e[s].queue=e[s].queue||[]).push(arguments)},i=a.createElement(t),c=a.getElementsByTagName(t)[0],
i.async=1,i.src=n,c.parentNode.insertBefore(i,c)
}(window,document,"script",ALGOLIA_INSIGHTS_SRC,"aa");
// Initialize library
aa('init', {
appId: 'WFABFE7Z9Q',
apiKey: 'd1c88c3f98648a69f11cdd9d5a87de08'
});
</script>
<script>
const app = new Vue({
el:'#app',
data: {
search:'',
searching:false,
algolia_client:null,
algolia_index:null,
results:null,
numResults:null,
noResults:false,
queryID:null
},
created() {
this.client = algoliasearch('WFABFE7Z9Q', 'd1c88c3f98648a69f11cdd9d5a87de08');
this.index = this.client.initIndex('raymondcamden');
// support url param search
let qp = new URLSearchParams(window.location.search);
let search = qp.get('search');
if(search) {
this.search = search;
this.doSearch();
}
},
methods: {
async doSearch() {
this.results = null;
if(this.search === '') return;
this.searching = true;
this.noResults = false;
console.log('search for '+this.search);
let resultsRaw = await this.index.search(this.search,{
attributesToRetrieve:['title', 'url','date'],
attributesToSnippet:['content'],
hitsPerPage: 50,
clickAnalytics:true
});
//console.log('results', resultsRaw);
let options = { year: 'numeric', month: 'long', day: 'numeric' };
let formatter = new Intl.DateTimeFormat('en-US',options);
resultsRaw.hits.forEach(h => {
h.date = formatter.format(new Date(h.date));
});
this.results = resultsRaw.hits;
this.numResults = resultsRaw.nbHits;
this.searching = false;
this.noResults = this.results.length === 0;
this.queryID = resultsRaw.queryID;
},
track(url,id, pos) {
aa('clickedObjectIDsAfterSearch', {
eventName: 'click_on_search_page',
index: 'raymondcamden',
queryID: this.queryID,
objectIDs:[id],
positions:[pos]
});
}
}
})
</script>