@salesforcedevs/docs-components 1.3.13 → 1.3.18

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforcedevs/docs-components",
3
- "version": "1.3.13",
3
+ "version": "1.3.18",
4
4
  "description": "Docs Lightning web components for DSC",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
@@ -24,5 +24,5 @@
24
24
  "@types/lodash.orderby": "^4.6.7",
25
25
  "@types/lodash.uniqby": "^4.7.7"
26
26
  },
27
- "gitHead": "94b6a0ecb51f4bc853ec3083419de8256db2bd6a"
27
+ "gitHead": "a45e1a97eefa6646c36a6fa5d24ad6c10a775d04"
28
28
  }
@@ -17,11 +17,9 @@ const CONSTANTS = {
17
17
  dropdownWidth: 32
18
18
  };
19
19
 
20
- export const ANALYTICS_EVENT_NAME = "custEv_breadcrumbClick";
20
+ export const ANALYTICS_EVENT_NAME = "custEv_breadcrumbNavClick";
21
21
  export const ANALYTICS_BASE_PAYLOAD = {
22
- elementType: "breadcrumb",
23
- locationOnPage: "breadcrumb",
24
- ctaClick: true
22
+ navType: "breadcrumb"
25
23
  };
26
24
 
27
25
  export default class Breadcrumbs extends LightningElement {
@@ -111,7 +109,7 @@ export default class Breadcrumbs extends LightningElement {
111
109
  private get analyticsBasePayload() {
112
110
  return {
113
111
  ...ANALYTICS_BASE_PAYLOAD,
114
- itemTitle: this.breadcrumbs.map((crumb) => crumb.label).join("/")
112
+ navItem: this.breadcrumbs.map((crumb) => crumb.label).join("/")
115
113
  };
116
114
  }
117
115
 
@@ -6,6 +6,7 @@
6
6
  trees={sidebarContent}
7
7
  value={sidebarValue}
8
8
  header={sidebarHeader}
9
+ onsidebarclick={onSidebarClick}
9
10
  >
10
11
  <slot name="sidebar-header" slot="header"></slot>
11
12
  </dx-sidebar-old>
@@ -20,6 +21,7 @@
20
21
  coveo-public-access-token={coveoPublicAccessToken}
21
22
  coveo-search-hub={coveoSearchHub}
22
23
  coveo-advanced-query-config={coveoAdvancedQueryConfig}
24
+ onsidebarclick={onSidebarClick}
23
25
  >
24
26
  <slot name="sidebar-header" slot="header"></slot>
25
27
  </dx-sidebar>
@@ -3,6 +3,7 @@ import { closest } from "kagekiri";
3
3
  import { toJson } from "dxUtils/normalizers";
4
4
  import { highlightTerms } from "dxUtils/highlight";
5
5
  import { SearchSyncer } from "docUtils/SearchSyncer";
6
+ import { track as sendGtm } from "dxUtils/analytics";
6
7
 
7
8
  type AnchorMap = { [key: string]: { intersect: boolean; id: string } };
8
9
 
@@ -101,6 +102,12 @@ export default class ContentLayout extends LightningElement {
101
102
  private observerTimerId = null;
102
103
  private didScrollToSelectedHash = false;
103
104
  private _scrollInterval = 0;
105
+ private scrollPosition = 0;
106
+
107
+ private scrolledTwentyFivePercent = false;
108
+ private scrolledFiftyPercent = false;
109
+ private scrolledSevenFivePercent = false;
110
+ private scrolledOneHundredPercent = false;
104
111
 
105
112
  get showToc(): boolean {
106
113
  return this.tocOptions && this.tocOptions.length > 0;
@@ -137,6 +144,11 @@ export default class ContentLayout extends LightningElement {
137
144
  this._scrollInterval = window.setInterval(() => {
138
145
  this.saveScroll();
139
146
  }, 1000);
147
+
148
+ document.addEventListener(
149
+ "scroll",
150
+ this.scrollThresholdHandler.bind(this)
151
+ );
140
152
  }
141
153
 
142
154
  renderedCallback(): void {
@@ -165,6 +177,8 @@ export default class ContentLayout extends LightningElement {
165
177
  this.clearRenderObserverTimer();
166
178
 
167
179
  window.clearInterval(this._scrollInterval);
180
+
181
+ document.removeEventListener("scroll", this.scrollThresholdHandler);
168
182
  }
169
183
 
170
184
  saveScroll() {
@@ -224,6 +238,48 @@ export default class ContentLayout extends LightningElement {
224
238
  }
225
239
  };
226
240
 
241
+ onSidebarClick() {
242
+ this.resetScrollThreshold();
243
+ }
244
+
245
+ sendGtmScrollThresholdEvent(threshold: "25" | "50" | "75" | "100") {
246
+ sendGtm(document.body, "custEv_scroll", {
247
+ scrollDepth: threshold
248
+ });
249
+ }
250
+
251
+ resetScrollThreshold() {
252
+ this.scrolledTwentyFivePercent = false;
253
+ this.scrolledFiftyPercent = false;
254
+ this.scrolledSevenFivePercent = false;
255
+ this.scrolledOneHundredPercent = false;
256
+ }
257
+
258
+ scrollThresholdHandler() {
259
+ this.scrollPosition =
260
+ ((document.documentElement.scrollTop + document.body.scrollTop) /
261
+ (document.documentElement.scrollHeight -
262
+ document.documentElement.clientHeight)) *
263
+ 100;
264
+
265
+ if (this.scrollPosition > 25 && !this.scrolledTwentyFivePercent) {
266
+ this.scrolledTwentyFivePercent = true;
267
+ this.sendGtmScrollThresholdEvent("25");
268
+ } else if (this.scrollPosition > 50 && !this.scrolledFiftyPercent) {
269
+ this.scrolledFiftyPercent = true;
270
+ this.sendGtmScrollThresholdEvent("50");
271
+ } else if (this.scrollPosition > 75 && !this.scrolledSevenFivePercent) {
272
+ this.scrolledSevenFivePercent = true;
273
+ this.sendGtmScrollThresholdEvent("75");
274
+ } else if (
275
+ this.scrollPosition === 100 &&
276
+ !this.scrolledOneHundredPercent
277
+ ) {
278
+ this.scrolledOneHundredPercent = true;
279
+ this.sendGtmScrollThresholdEvent("100");
280
+ }
281
+ }
282
+
227
283
  onSlotChange(event: Event): void {
228
284
  const slotElements = (
229
285
  event.target as HTMLSlotElement
@@ -235,6 +291,28 @@ export default class ContentLayout extends LightningElement {
235
291
  slotContentElement.ownerDocument?.getElementsByTagName(
236
292
  TOC_HEADER_TAG
237
293
  );
294
+
295
+ const docContentEl = slotElements.find(
296
+ (el) => el.tagName === "DOC-CONTENT"
297
+ );
298
+ const topicTitleEl =
299
+ docContentEl?.shadowRoot?.getElementById("topic-title");
300
+ const anchorElements =
301
+ docContentEl?.shadowRoot?.querySelectorAll("a[href]");
302
+
303
+ // Attach click listeners to all anchor elements for analytics
304
+ anchorElements?.forEach((anchorElement) => {
305
+ anchorElement.addEventListener("click", () => {
306
+ sendGtm(anchorElement, "custEv_docContentClick", {
307
+ clickText: anchorElement.textContent,
308
+ clickUrl: anchorElement.getAttribute("href"),
309
+ elementType: "link",
310
+ locationOnPage: "docContent",
311
+ itemTitle: topicTitleEl?.textContent
312
+ });
313
+ });
314
+ });
315
+
238
316
  for (const headingElement of headingElements) {
239
317
  // Sometimes elements hash is not being set when slot content is wrapped with div
240
318
  headingElement.hash = headingElement.attributes.hash?.nodeValue;
@@ -2,6 +2,10 @@
2
2
  <dx-brand-theme-provider brand={brand}>
3
3
  <header class={className}>
4
4
  <dx-skip-nav-link></dx-skip-nav-link>
5
+ <dx-banner
6
+ if:true={showBanner}
7
+ banner-markup={bannerMarkup}
8
+ ></dx-banner>
5
9
  <div class="header_l1">
6
10
  <div if:true={showMenuButton} class="nav_menu-ctas">
7
11
  <dx-button