@bridgeline-digital/hawksearch-handlebars-ui 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +2 -0
- package/.eslintrc.json +153 -0
- package/.husky/pre-commit +5 -0
- package/.lintstagedrc.json +4 -0
- package/.prettierignore +7 -0
- package/.prettierrc.json +19 -0
- package/.vscode/launch.json +15 -0
- package/custom1.html +52 -0
- package/custom2.html +44 -0
- package/gulpfile.js +73 -0
- package/index.html +39 -0
- package/package.json +57 -0
- package/src/assets/icons/chevron-back.svg +4 -0
- package/src/assets/icons/chevron-down.svg +3 -0
- package/src/assets/icons/chevron-forward.svg +4 -0
- package/src/assets/icons/chevron-left.svg +3 -0
- package/src/assets/icons/chevron-right.svg +3 -0
- package/src/assets/icons/chevron-up.svg +3 -0
- package/src/assets/icons/cross.svg +3 -0
- package/src/assets/icons/help.svg +4 -0
- package/src/assets/icons/minus.svg +3 -0
- package/src/assets/icons/plus.svg +7 -0
- package/src/assets/images/icons.svg +1 -0
- package/src/assets/images/placeholder.png +0 -0
- package/src/components/autocomplete/autocomplete.component.hbs +60 -0
- package/src/components/autocomplete/autocomplete.component.ts +124 -0
- package/src/components/base.component.ts +120 -0
- package/src/components/facet-types/base-facet.component.ts +114 -0
- package/src/components/facet-types/checkbox-list-facet/checkbox-list-facet.component.hbs +6 -0
- package/src/components/facet-types/checkbox-list-facet/checkbox-list-facet.component.ts +73 -0
- package/src/components/facet-types/checkbox-list-facet/checkbox-list.partial.hbs +42 -0
- package/src/components/facet-types/color-facet/color-facet.component.hbs +29 -0
- package/src/components/facet-types/color-facet/color-facet.component.ts +26 -0
- package/src/components/facet-types/index.ts +6 -0
- package/src/components/facet-types/linked-list-facet/link-list-facet.component.hbs +17 -0
- package/src/components/facet-types/linked-list-facet/link-list-facet.component.ts +32 -0
- package/src/components/facet-types/range-slider-facet/range-slider-facet.component.hbs +11 -0
- package/src/components/facet-types/range-slider-facet/range-slider-facet.component.ts +107 -0
- package/src/components/facet-types/search-within-facet/search-within-facet.component.hbs +3 -0
- package/src/components/facet-types/search-within-facet/search-within-facet.component.ts +33 -0
- package/src/components/facet-types/size-facet/size-facet.component.hbs +29 -0
- package/src/components/facet-types/size-facet/size-facet.component.ts +30 -0
- package/src/components/facet-wrapper/facet-wrapper.component.hbs +36 -0
- package/src/components/facet-wrapper/facet-wrapper.component.ts +62 -0
- package/src/components/facets-list/facets-list.component.hbs +11 -0
- package/src/components/facets-list/facets-list.component.ts +92 -0
- package/src/components/icon/icon.component.hbs +3 -0
- package/src/components/icon/icon.component.ts +40 -0
- package/src/components/index.ts +18 -0
- package/src/components/modified-query/modified-query.component.hbs +7 -0
- package/src/components/modified-query/modified-query.component.ts +38 -0
- package/src/components/page-size/page-size.component.hbs +7 -0
- package/src/components/page-size/page-size.component.ts +35 -0
- package/src/components/pagination/pagination.component.hbs +34 -0
- package/src/components/pagination/pagination.component.ts +85 -0
- package/src/components/query-suggestions/query-suggestions.component.hbs +3 -0
- package/src/components/query-suggestions/query-suggestions.component.ts +66 -0
- package/src/components/range-slider/range-slider.component.hbs +9 -0
- package/src/components/range-slider/range-slider.component.ts +190 -0
- package/src/components/search/search.component.hbs +4 -0
- package/src/components/search/search.component.ts +93 -0
- package/src/components/search-results/search-results.component.hbs +29 -0
- package/src/components/search-results/search-results.component.ts +17 -0
- package/src/components/search-results-item/search-results-item.component.hbs +23 -0
- package/src/components/search-results-item/search-results-item.component.ts +99 -0
- package/src/components/search-results-list/search-results-list.component.hbs +15 -0
- package/src/components/search-results-list/search-results-list.component.ts +24 -0
- package/src/components/selected-facets/selected-facets.component.hbs +11 -0
- package/src/components/selected-facets/selected-facets.component.ts +81 -0
- package/src/components/sorting/sorting.component.hbs +7 -0
- package/src/components/sorting/sorting.component.ts +33 -0
- package/src/components/tabs/tabs.component.hbs +7 -0
- package/src/components/tabs/tabs.component.ts +35 -0
- package/src/components/tooltip/tooltip.component.hbs +6 -0
- package/src/components/tooltip/tooltip.component.ts +48 -0
- package/src/helpers/formatters.ts +15 -0
- package/src/helpers/index.ts +1 -0
- package/src/index.ts +125 -0
- package/src/models/autocomplete.models.ts +71 -0
- package/src/models/component.models.ts +27 -0
- package/src/models/global.models.ts +78 -0
- package/src/models/index.ts +7 -0
- package/src/models/raw-autocomplete.models.ts +46 -0
- package/src/models/raw-search.models.ts +130 -0
- package/src/models/search.models.ts +144 -0
- package/src/models/tracking.models.ts +33 -0
- package/src/scss/components/_autocomplete.scss +55 -0
- package/src/scss/components/_facets.scss +287 -0
- package/src/scss/components/_icons.scss +17 -0
- package/src/scss/components/_modified-query.scss +11 -0
- package/src/scss/components/_page-size.scss +2 -0
- package/src/scss/components/_pagination.scss +23 -0
- package/src/scss/components/_query-suggestions.scss +7 -0
- package/src/scss/components/_range-slider.scss +50 -0
- package/src/scss/components/_search-results-item.scss +64 -0
- package/src/scss/components/_search.scss +4 -0
- package/src/scss/components/_selected-facets.scss +24 -0
- package/src/scss/components/_sorting.scss +2 -0
- package/src/scss/components/_tabs.scss +51 -0
- package/src/scss/components/_tooltips.scss +29 -0
- package/src/scss/general/_forms.scss +82 -0
- package/src/scss/general/_grid-layout.scss +44 -0
- package/src/scss/general/_images.scss +3 -0
- package/src/scss/general/_typography.scss +15 -0
- package/src/scss/hawksearch.scss +35 -0
- package/src/scss/includes/_breakpoints.scss +51 -0
- package/src/scss/includes/_components.scss +14 -0
- package/src/scss/includes/_general.scss +4 -0
- package/src/scss/includes/_reset.scss +203 -0
- package/src/scss/includes/_utility-classes.scss +85 -0
- package/src/services/autocomplete.service.ts +104 -0
- package/src/services/base.service.ts +93 -0
- package/src/services/index.ts +3 -0
- package/src/services/search.service.ts +754 -0
- package/src/services/tracking.service.ts +136 -0
- package/tsconfig.json +22 -0
- package/typings.d.ts +21 -0
- package/webpack.config.js +75 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { AutocompleteItemType, EventType, HawksearchGlobal, PageType, SearchType } from '@models';
|
|
2
|
+
import { BaseService } from './base.service';
|
|
3
|
+
|
|
4
|
+
declare let Hawksearch: HawksearchGlobal;
|
|
5
|
+
|
|
6
|
+
export class TrackingService extends BaseService {
|
|
7
|
+
protected baseUrl = Hawksearch.config.endpoints?.tracking || 'https://tracking-dev.hawksearch.net/api';
|
|
8
|
+
|
|
9
|
+
trackAutocompleteClick(query: string, itemType: AutocompleteItemType, title: string, url: string): Promise<void> {
|
|
10
|
+
const data = {
|
|
11
|
+
Keyword: query,
|
|
12
|
+
Name: title,
|
|
13
|
+
SuggestType: itemType,
|
|
14
|
+
Url: url
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
return this.trackEvent(EventType.AutocompleteClick, data);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
trackBannerClick(bannerId: number, campaignId: number): Promise<void> {
|
|
21
|
+
if (!Hawksearch.searchResponse?.trackingId) {
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const data = {
|
|
26
|
+
BannerId: bannerId,
|
|
27
|
+
CampaignId: campaignId,
|
|
28
|
+
TrackingId: Hawksearch.searchResponse.trackingId
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return this.trackEvent(EventType.BannerClick, data);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
trackBannerImpression(bannerId: number, campaignId: number): Promise<void> {
|
|
35
|
+
if (!Hawksearch.searchResponse?.trackingId) {
|
|
36
|
+
return Promise.resolve();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const data = {
|
|
40
|
+
BannerId: bannerId,
|
|
41
|
+
CampaignId: campaignId,
|
|
42
|
+
TrackingId: Hawksearch.searchResponse.trackingId
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return this.trackEvent(EventType.BannerImpression, data);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
trackPageLoad(pageType: PageType): Promise<void> {
|
|
49
|
+
const data = {
|
|
50
|
+
PageTypeId: pageType,
|
|
51
|
+
RequestPath: window.location.pathname,
|
|
52
|
+
Qs: window.location.search,
|
|
53
|
+
ViewportHeight: document.documentElement.clientHeight,
|
|
54
|
+
ViewportWidth: document.documentElement.clientWidth
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
return this.trackEvent(EventType.PageLoad, data);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
trackSearchResultClick(id: string, url: string, event?: PointerEvent): Promise<void> {
|
|
61
|
+
if (!Hawksearch.searchResponse?.trackingId) {
|
|
62
|
+
return Promise.resolve();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const data = {
|
|
66
|
+
UniqueId: id,
|
|
67
|
+
Url: url,
|
|
68
|
+
TrackingId: Hawksearch.searchResponse.trackingId,
|
|
69
|
+
RequestPath: window.location.pathname,
|
|
70
|
+
Qs: window.location.search,
|
|
71
|
+
ScrollX: window.scrollX,
|
|
72
|
+
ScrollY: window.scrollY,
|
|
73
|
+
ViewportHeight: document.documentElement.clientHeight,
|
|
74
|
+
ViewportWidth: document.documentElement.clientWidth,
|
|
75
|
+
MouseX: event?.pageX,
|
|
76
|
+
MouseY: event?.pageY
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
return this.trackEvent(EventType.Click, data);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
trackSearch(query: string | undefined, newSearch: boolean): Promise<void> {
|
|
83
|
+
if (!Hawksearch.searchResponse?.trackingId) {
|
|
84
|
+
return Promise.resolve();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const data = {
|
|
88
|
+
QueryId: newSearch ? this.setNewQueryId() : this.getQueryId(),
|
|
89
|
+
TrackingId: Hawksearch.searchResponse.trackingId,
|
|
90
|
+
TypeId: newSearch ? SearchType.Initial : SearchType.Refinement,
|
|
91
|
+
ViewportHeight: document.documentElement.clientHeight,
|
|
92
|
+
ViewportWidth: document.documentElement.clientWidth,
|
|
93
|
+
keyword: query
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
return this.trackEvent(EventType.Search, data);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
trackEvent(type: EventType, data: any): Promise<void> {
|
|
100
|
+
if (Hawksearch.config.trackingEnabled === false) {
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const request = {
|
|
105
|
+
ClientGuid: Hawksearch.config.clientId,
|
|
106
|
+
EventType: type,
|
|
107
|
+
EventData: btoa(JSON.stringify(data)),
|
|
108
|
+
VisitorId: this.getVisitorId(),
|
|
109
|
+
VisitId: this.getVisitId()
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return this.httpPost<void>('/trackevent', request);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private getQueryId(): string {
|
|
116
|
+
const key = 'QueryId';
|
|
117
|
+
|
|
118
|
+
let queryId = localStorage.getItem(key);
|
|
119
|
+
|
|
120
|
+
if (!queryId) {
|
|
121
|
+
queryId = this.setNewQueryId();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return queryId;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private setNewQueryId(): string {
|
|
128
|
+
const queryId = this.generateGuid();
|
|
129
|
+
|
|
130
|
+
localStorage.setItem('QueryId', queryId);
|
|
131
|
+
|
|
132
|
+
return queryId;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export const trackingService = new TrackingService();
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"strict": true,
|
|
4
|
+
"outDir": "./dist/",
|
|
5
|
+
"sourceMap": true,
|
|
6
|
+
"noImplicitAny": true,
|
|
7
|
+
"module": "es6",
|
|
8
|
+
"target": "es6",
|
|
9
|
+
"allowJs": true,
|
|
10
|
+
"moduleResolution": "node",
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"baseUrl": "./",
|
|
13
|
+
"paths": {
|
|
14
|
+
"@assets/*": ["src/assets/*"],
|
|
15
|
+
"@components": ["src/components/index"],
|
|
16
|
+
"@helpers": ["src/helpers/index"],
|
|
17
|
+
"@models": ["src/models/index"],
|
|
18
|
+
"@services": ["src/services/index"]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"include": ["src", "typings.d.ts"]
|
|
22
|
+
}
|
package/typings.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
declare module '*.scss';
|
|
2
|
+
|
|
3
|
+
declare module '*.hbs' {
|
|
4
|
+
const content: any;
|
|
5
|
+
export default content;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare module '*.html' {
|
|
9
|
+
const content: any;
|
|
10
|
+
export default content;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare module '*.png' {
|
|
14
|
+
const content: any;
|
|
15
|
+
export default content;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare module '*.svg' {
|
|
19
|
+
const content: any;
|
|
20
|
+
export default content;
|
|
21
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
3
|
+
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
mode: 'development',
|
|
7
|
+
entry: {
|
|
8
|
+
'hawksearch-ui': './src/index.ts'
|
|
9
|
+
},
|
|
10
|
+
devtool: 'source-map',
|
|
11
|
+
plugins: [
|
|
12
|
+
new HtmlWebpackPlugin({
|
|
13
|
+
template: './index.html',
|
|
14
|
+
filename: 'index.html'
|
|
15
|
+
}),
|
|
16
|
+
new HtmlWebpackPlugin({
|
|
17
|
+
template: './custom1.html',
|
|
18
|
+
filename: 'custom1.html'
|
|
19
|
+
}),
|
|
20
|
+
new HtmlWebpackPlugin({
|
|
21
|
+
template: './custom2.html',
|
|
22
|
+
filename: 'custom2.html'
|
|
23
|
+
})
|
|
24
|
+
],
|
|
25
|
+
module: {
|
|
26
|
+
rules: [
|
|
27
|
+
{
|
|
28
|
+
test: /\.scss$/i,
|
|
29
|
+
use: [
|
|
30
|
+
'raw-loader',
|
|
31
|
+
{
|
|
32
|
+
loader: 'sass-loader',
|
|
33
|
+
options: {
|
|
34
|
+
sassOptions: {
|
|
35
|
+
includePaths: [path.resolve(__dirname, 'node_modules')]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
|
43
|
+
type: 'asset/resource'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
test: /\.hbs$/i,
|
|
47
|
+
loader: 'raw-loader'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
test: /\.html$/i,
|
|
51
|
+
loader: 'html-loader'
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
test: /\.ts$/i,
|
|
55
|
+
use: 'ts-loader',
|
|
56
|
+
exclude: /node_modules/
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
resolve: {
|
|
61
|
+
extensions: ['.ts', '.js'],
|
|
62
|
+
fallback: {
|
|
63
|
+
fs: false
|
|
64
|
+
},
|
|
65
|
+
plugins: [new TsconfigPathsPlugin()]
|
|
66
|
+
},
|
|
67
|
+
output: {
|
|
68
|
+
filename: 'handlebars-ui.js',
|
|
69
|
+
path: path.resolve(__dirname, 'dist'),
|
|
70
|
+
clean: true
|
|
71
|
+
},
|
|
72
|
+
devServer: {
|
|
73
|
+
static: './dist'
|
|
74
|
+
}
|
|
75
|
+
};
|