@salesforcedevs/docs-components 0.0.7 → 0.0.9-edit

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.
Files changed (141) hide show
  1. package/lwc.config.json +25 -2
  2. package/package.json +17 -6
  3. package/src/modules/README.md +41 -0
  4. package/src/modules/doc/amfModelParser/amfModelParser.ts +674 -0
  5. package/src/modules/doc/amfReference/amfReference.css +25 -0
  6. package/src/modules/doc/amfReference/amfReference.html +60 -0
  7. package/src/modules/doc/amfReference/amfReference.ts +1494 -0
  8. package/src/modules/doc/amfReference/constants.ts +76 -0
  9. package/src/modules/doc/amfReference/types.ts +125 -0
  10. package/src/modules/doc/amfTopic/amfTopic.css +21 -0
  11. package/src/modules/doc/amfTopic/amfTopic.html +3 -0
  12. package/src/modules/doc/amfTopic/amfTopic.ts +111 -0
  13. package/src/modules/doc/amfTopic/types.ts +56 -0
  14. package/src/modules/doc/amfTopic/utils.ts +136 -0
  15. package/src/modules/doc/breadcrumbItem/breadcrumbItem.css +51 -0
  16. package/src/modules/doc/breadcrumbItem/breadcrumbItem.html +5 -0
  17. package/src/modules/doc/breadcrumbItem/breadcrumbItem.ts +71 -0
  18. package/src/modules/doc/breadcrumbs/breadcrumbs.css +27 -0
  19. package/src/modules/doc/breadcrumbs/breadcrumbs.html +58 -0
  20. package/src/modules/doc/breadcrumbs/breadcrumbs.ts +183 -0
  21. package/src/modules/doc/chat/README.md +179 -0
  22. package/src/modules/doc/chat/chat.css +821 -0
  23. package/src/modules/doc/chat/chat.html +241 -0
  24. package/src/modules/doc/chat/chat.ts +586 -0
  25. package/src/modules/doc/componentPlayground/componentPlayground.css +22 -0
  26. package/src/modules/doc/componentPlayground/componentPlayground.html +20 -0
  27. package/src/modules/doc/componentPlayground/componentPlayground.ts +29 -0
  28. package/src/modules/doc/content/content.css +249 -87
  29. package/src/modules/doc/content/content.html +3 -2
  30. package/src/modules/doc/content/content.ts +272 -152
  31. package/src/modules/doc/contentCallout/contentCallout.css +25 -26
  32. package/src/modules/doc/contentCallout/contentCallout.html +13 -4
  33. package/src/modules/doc/contentCallout/contentCallout.ts +21 -10
  34. package/src/modules/doc/contentLayout/contentLayout.css +1 -0
  35. package/src/modules/doc/contentLayout/contentLayout.html +68 -0
  36. package/src/modules/doc/contentLayout/contentLayout.ts +531 -0
  37. package/src/modules/doc/contentMedia/contentMedia.css +49 -0
  38. package/src/modules/doc/contentMedia/contentMedia.html +23 -0
  39. package/src/modules/doc/contentMedia/contentMedia.ts +34 -0
  40. package/src/modules/doc/doDont/doDont.css +47 -0
  41. package/src/modules/doc/doDont/doDont.html +27 -0
  42. package/src/modules/doc/doDont/doDont.ts +17 -0
  43. package/src/modules/doc/editFile/editFile.css +511 -0
  44. package/src/modules/doc/editFile/editFile.html +163 -0
  45. package/src/modules/doc/editFile/editFile.ts +238 -0
  46. package/src/modules/doc/header/header.css +132 -0
  47. package/src/modules/doc/header/header.html +55 -0
  48. package/src/modules/doc/header/header.ts +120 -0
  49. package/src/modules/doc/heading/heading.css +33 -0
  50. package/src/modules/doc/heading/heading.html +14 -0
  51. package/src/modules/doc/heading/heading.ts +67 -0
  52. package/src/modules/doc/headingAnchor/headingAnchor.css +33 -0
  53. package/src/modules/doc/headingAnchor/headingAnchor.html +19 -0
  54. package/src/modules/doc/headingAnchor/headingAnchor.ts +43 -0
  55. package/src/modules/doc/headingContent/headingContent.css +53 -0
  56. package/src/modules/doc/headingContent/headingContent.html +13 -0
  57. package/src/modules/doc/headingContent/headingContent.ts +30 -0
  58. package/src/modules/doc/lwcContentLayout/lwcContentLayout.css +1 -0
  59. package/src/modules/doc/lwcContentLayout/lwcContentLayout.html +68 -0
  60. package/src/modules/doc/lwcContentLayout/lwcContentLayout.ts +168 -0
  61. package/src/modules/doc/nav/nav.css +4 -2
  62. package/src/modules/doc/nav/nav.ts +1 -1
  63. package/src/modules/doc/overview/overview.css +40 -0
  64. package/src/modules/doc/overview/overview.html +34 -0
  65. package/src/modules/doc/overview/overview.ts +12 -0
  66. package/src/modules/doc/phase/phase.css +70 -0
  67. package/src/modules/doc/phase/phase.html +38 -0
  68. package/src/modules/doc/phase/phase.ts +93 -0
  69. package/src/modules/doc/specificationContent/specificationContent.css +36 -0
  70. package/src/modules/doc/specificationContent/specificationContent.html +171 -0
  71. package/src/modules/doc/specificationContent/specificationContent.ts +127 -0
  72. package/src/modules/doc/sprigSurvey/sprigSurvey.html +20 -0
  73. package/src/modules/doc/sprigSurvey/sprigSurvey.scoped.css +16 -0
  74. package/src/modules/doc/sprigSurvey/sprigSurvey.ts +16 -0
  75. package/src/modules/doc/toc/toc.html +11 -6
  76. package/src/modules/doc/toc/toc.ts +1 -1
  77. package/src/modules/doc/toolbar/toolbar.html +8 -1
  78. package/src/modules/doc/versionPicker/versionPicker.css +64 -0
  79. package/src/modules/doc/versionPicker/versionPicker.html +38 -0
  80. package/src/modules/doc/versionPicker/versionPicker.ts +65 -0
  81. package/src/modules/doc/xmlContent/types.ts +120 -0
  82. package/src/modules/doc/xmlContent/utils.ts +163 -0
  83. package/src/modules/doc/xmlContent/xmlContent.css +54 -0
  84. package/src/modules/doc/xmlContent/xmlContent.html +52 -0
  85. package/src/modules/doc/xmlContent/xmlContent.ts +792 -0
  86. package/src/modules/docHelpers/amfStyle/amfStyle.css +355 -0
  87. package/src/modules/docHelpers/contentLayoutStyle/contentLayoutStyle.css +131 -0
  88. package/src/modules/docHelpers/imgStyle/imgStyle.css +59 -0
  89. package/src/modules/docHelpers/status/status.css +22 -0
  90. package/src/modules/docUtils/searchSyncer/searchSyncer.ts +86 -0
  91. package/src/modules/docUtils/utils/__mocks__/coveo.analytics.ts +16 -0
  92. package/src/modules/docUtils/utils/coveo.analytics.d.ts +10 -0
  93. package/src/modules/docUtils/utils/utils.ts +32 -0
  94. package/src/modules/doc/container/__benchmarks__/container.benchmark.js +0 -43
  95. package/src/modules/doc/container/__mocks__/mockAvailableLanguages.js +0 -8
  96. package/src/modules/doc/container/__mocks__/mockAvailableVersions.js +0 -122
  97. package/src/modules/doc/container/__mocks__/mockContentFetchResponse.json +0 -5
  98. package/src/modules/doc/container/__mocks__/mockDocContent.js +0 -29
  99. package/src/modules/doc/container/__mocks__/mockNavigationFetchResponse.json +0 -4061
  100. package/src/modules/doc/container/__mocks__/mockPageReference.js +0 -8
  101. package/src/modules/doc/container/__mocks__/mockPdfUrl.js +0 -1
  102. package/src/modules/doc/container/__mocks__/mockSelectedLanguage.js +0 -8
  103. package/src/modules/doc/container/__mocks__/mockSelectedVersion.js +0 -8
  104. package/src/modules/doc/container/__mocks__/mockToc.js +0 -146
  105. package/src/modules/doc/container/__tests__/container.test.ts +0 -82
  106. package/src/modules/doc/container/container.css +0 -34
  107. package/src/modules/doc/container/container.html +0 -23
  108. package/src/modules/doc/container/container.stories.ts +0 -18
  109. package/src/modules/doc/container/container.ts +0 -356
  110. package/src/modules/doc/content/__tests__/content.test.ts +0 -30
  111. package/src/modules/doc/content/__tests__/mockDocContent.ts +0 -29
  112. package/src/modules/doc/content/__tests__/mockPageReference.ts +0 -8
  113. package/src/modules/doc/contentCallout/__tests__/contentCallout.test.ts +0 -80
  114. package/src/modules/doc/contentCallout/__tests__/mockProps.ts +0 -14
  115. package/src/modules/doc/contentCallout/contentCallout.stories.ts +0 -29
  116. package/src/modules/doc/landing/__tests__/landing.test.ts +0 -32
  117. package/src/modules/doc/landing/__tests__/mockFetch.json +0 -370
  118. package/src/modules/doc/landing/landing.css +0 -66
  119. package/src/modules/doc/landing/landing.html +0 -109
  120. package/src/modules/doc/landing/landing.stories.ts +0 -10
  121. package/src/modules/doc/landing/landing.ts +0 -225
  122. package/src/modules/doc/nav/__tests__/mockAvailableLanguages.ts +0 -8
  123. package/src/modules/doc/nav/__tests__/mockAvailableVersions.ts +0 -122
  124. package/src/modules/doc/nav/__tests__/mockPageReference.ts +0 -8
  125. package/src/modules/doc/nav/__tests__/mockPdfUrl.ts +0 -1
  126. package/src/modules/doc/nav/__tests__/mockSelectedLanguage.ts +0 -8
  127. package/src/modules/doc/nav/__tests__/mockSelectedVersion.ts +0 -8
  128. package/src/modules/doc/nav/__tests__/mockToc.ts +0 -146
  129. package/src/modules/doc/nav/__tests__/nav.test.ts +0 -62
  130. package/src/modules/doc/search/__tests__/search.test.ts +0 -20
  131. package/src/modules/doc/search/search.html +0 -1
  132. package/src/modules/doc/search/search.ts +0 -3
  133. package/src/modules/doc/toc/__tests__/mockPageReference.ts +0 -8
  134. package/src/modules/doc/toc/__tests__/mockToc.ts +0 -146
  135. package/src/modules/doc/toc/__tests__/toc.test.ts +0 -29
  136. package/src/modules/doc/toolbar/__tests__/mockAvailableLanguages.ts +0 -8
  137. package/src/modules/doc/toolbar/__tests__/mockAvailableVersions.ts +0 -122
  138. package/src/modules/doc/toolbar/__tests__/mockPdfUrl.ts +0 -1
  139. package/src/modules/doc/toolbar/__tests__/mockSelectedLanguage.ts +0 -8
  140. package/src/modules/doc/toolbar/__tests__/mockSelectedVersion.ts +0 -8
  141. package/src/modules/doc/toolbar/__tests__/toolbar.test.ts +0 -44
@@ -11,10 +11,11 @@
11
11
  data-id={child1.id}
12
12
  class="nav1"
13
13
  onclick={handleNavClick}
14
- >{child1.text}</a
15
14
  >
15
+ {child1.text}
16
+ </a>
16
17
  </template>
17
- <template if:false={child1.a_attr}> {child1.text} </template>
18
+ <template if:false={child1.a_attr}>{child1.text}</template>
18
19
  </li>
19
20
  <template if:true={child1.children}>
20
21
  <ul key={child1.id}>
@@ -26,8 +27,9 @@
26
27
  data-id={child2.id}
27
28
  class="nav1"
28
29
  onclick={handleNavClick}
29
- >{child2.text}</a
30
30
  >
31
+ {child2.text}
32
+ </a>
31
33
  </template>
32
34
  <template if:false={child2.a_attr}>
33
35
  {child2.text}
@@ -46,8 +48,9 @@
46
48
  data-id={child3.id}
47
49
  class="nav1"
48
50
  onclick={handleNavClick}
49
- >{child3.text}</a
50
51
  >
52
+ {child3.text}
53
+ </a>
51
54
  </template>
52
55
  <template if:false={child3.a_attr}>
53
56
  {child3.text}
@@ -68,8 +71,9 @@
68
71
  data-id={child4.id}
69
72
  class="nav1"
70
73
  onclick={handleNavClick}
71
- >{child4.text}</a
72
74
  >
75
+ {child4.text}
76
+ </a>
73
77
  </template>
74
78
  <template
75
79
  if:false={child4.a_attr}
@@ -94,8 +98,9 @@
94
98
  data-id={child5.id}
95
99
  class="nav1"
96
100
  onclick={handleNavClick}
97
- >{child5.text}</a
98
101
  >
102
+ {child5.text}
103
+ </a>
99
104
  </template>
100
105
  <template
101
106
  if:false={child5.a_attr}
@@ -11,7 +11,7 @@ export default class Toc extends LightningElement {
11
11
  const newPageReference = { ...this.pageReference };
12
12
  // When moving to the new navigation component
13
13
  //const target = event.detail.name.split('-')
14
- const target = event.currentTarget.dataset.id.split("-");
14
+ const target = (event.currentTarget as any).dataset.id.split("-");
15
15
  newPageReference.contentDocumentId = target[0] + ".htm";
16
16
  newPageReference.hash = target[1];
17
17
  this.dispatchEvent(
@@ -22,6 +22,13 @@
22
22
  </option>
23
23
  </template>
24
24
  </select>
25
- <a class="doc-toolbar-item" href={pdfUrl} target="_blank">PDF</a>
25
+ <a
26
+ class="doc-toolbar-item"
27
+ href={pdfUrl}
28
+ target="_blank"
29
+ rel="noopener"
30
+ >
31
+ PDF
32
+ </a>
26
33
  </div>
27
34
  </template>
@@ -0,0 +1,64 @@
1
+ @import "dxHelpers/reset";
2
+
3
+ /* NOTE: doc-version-picker-width width variable is used by both dx-button and dx-dropdown to maintain a consistent width. */
4
+ :host {
5
+ --dx-c-dropdown-option-font-weight: normal;
6
+ --dx-c-dropdown-option-label-color: var(--dx-g-gray-10);
7
+ --popover-container-open-transform: translateY(4px);
8
+ }
9
+
10
+ .version-picker-container {
11
+ padding: 8px var(--dx-g-spacing-lg) 8px
12
+ var(--dx-g-global-header-padding-horizontal);
13
+ border-top: 1px solid var(--dx-g-gray-90);
14
+ border-bottom: 1px solid var(--dx-g-gray-90);
15
+ }
16
+
17
+ .version-picker-button {
18
+ display: flex;
19
+ width: var(--doc-version-picker-width, 296px);
20
+ }
21
+
22
+ .version-picker-button:hover,
23
+ .version-picker-button:active,
24
+ .version-picker-button:focus {
25
+ --dx-c-button-secondary-color-hover: var(--dx-g-cloud-blue-vibrant-95);
26
+ --dx-c-button-primary-color: var(--dx-g-blue-vibrant-40);
27
+ }
28
+
29
+ /**
30
+ * NOTE: This CSS ensures the span inside the button stays within the parent's width, avoiding overflow.
31
+ * Not keeping this in common component to ensure that existing functionality works as it is.
32
+ */
33
+ dx-button::part(content) {
34
+ width: inherit;
35
+ overflow: hidden;
36
+ }
37
+
38
+ .selected-version {
39
+ display: flex;
40
+ flex-direction: row;
41
+ align-items: center;
42
+ }
43
+
44
+ .selected-version-label {
45
+ flex: 1;
46
+ overflow: hidden;
47
+ text-align: left;
48
+ text-overflow: ellipsis;
49
+ white-space: nowrap;
50
+ }
51
+
52
+ dx-type-badge.latest-badge {
53
+ --dx-c-type-badge-color: var(--dx-g-green-vibrant-40);
54
+ --dx-c-type-badge-background: var(--dx-g-green-vibrant-95);
55
+
56
+ margin-left: var(--dx-g-spacing-sm);
57
+ }
58
+
59
+ dx-type-badge.not-latest-badge {
60
+ --dx-c-type-badge-color: var(--dx-g-red-vibrant-40);
61
+ --dx-c-type-badge-background: var(--dx-g-red-vibrant-95);
62
+
63
+ margin-left: var(--dx-g-spacing-sm);
64
+ }
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <div lwc:if={showVersionPicker} class="version-picker-container">
3
+ <dx-dropdown
4
+ options={versions}
5
+ value={selectedVersion.id}
6
+ width="var(--doc-version-picker-width)"
7
+ onchange={onVersionChange}
8
+ >
9
+ <dx-button
10
+ class="version-picker-button"
11
+ variant="tertiary"
12
+ size="small"
13
+ icon-symbol="chevrondown"
14
+ icon-size="medium"
15
+ >
16
+ <div class="selected-version">
17
+ <p class="selected-version-label">
18
+ {selectedVersion.label}
19
+ </p>
20
+ <template lwc:if={showLatestTag}>
21
+ <dx-type-badge
22
+ class="latest-badge"
23
+ lwc:if={latestVersion}
24
+ value="Latest"
25
+ size="small"
26
+ ></dx-type-badge>
27
+ <dx-type-badge
28
+ class="not-latest-badge"
29
+ lwc:else
30
+ value="Not Latest"
31
+ size="small"
32
+ ></dx-type-badge>
33
+ </template>
34
+ </div>
35
+ </dx-button>
36
+ </dx-dropdown>
37
+ </div>
38
+ </template>
@@ -0,0 +1,65 @@
1
+ import { LightningElement, api, track } from "lwc";
2
+
3
+ import { AnalyticsPayload, OptionWithNested } from "typings/custom";
4
+
5
+ import { toJson, normalizeBoolean } from "dxUtils/normalizers";
6
+
7
+ export default class VersionPicker extends LightningElement {
8
+ @api analyticsEvent?: string;
9
+ @api analyticsPayload?: AnalyticsPayload;
10
+
11
+ @track private _versions!: OptionWithNested[];
12
+ private _selectedVersion?: OptionWithNested;
13
+ private _latestVersion: boolean = false;
14
+ private _hideBadge: boolean = false;
15
+
16
+ @api
17
+ get versions() {
18
+ return this._versions;
19
+ }
20
+
21
+ set versions(value: OptionWithNested[]) {
22
+ this._versions = toJson(value);
23
+ }
24
+
25
+ @api
26
+ get selectedVersion(): OptionWithNested | undefined {
27
+ return this._selectedVersion || this.versions[0];
28
+ }
29
+
30
+ set selectedVersion(value: OptionWithNested) {
31
+ if (value) {
32
+ this._selectedVersion = toJson(value);
33
+ }
34
+ }
35
+
36
+ @api
37
+ get latestVersion() {
38
+ return this._latestVersion;
39
+ }
40
+
41
+ set latestVersion(value) {
42
+ this._latestVersion = normalizeBoolean(value);
43
+ }
44
+
45
+ @api
46
+ get hideBadge() {
47
+ return this._hideBadge;
48
+ }
49
+
50
+ set hideBadge(value) {
51
+ this._hideBadge = normalizeBoolean(value);
52
+ }
53
+
54
+ private get showVersionPicker() {
55
+ return this._versions && this._versions.length !== 0;
56
+ }
57
+
58
+ private get showLatestTag(): boolean {
59
+ return !this.hideBadge;
60
+ }
61
+
62
+ private onVersionChange(e: CustomEvent) {
63
+ this.dispatchEvent(new CustomEvent("change", { detail: e.detail }));
64
+ }
65
+ }
@@ -0,0 +1,120 @@
1
+ export type CoveoAdvancedQueryXMLConfig = {
2
+ locale?: string;
3
+ version?: string;
4
+ topicid?: string;
5
+ };
6
+
7
+ export type PageReference = {
8
+ domain?: string;
9
+ page?: string;
10
+ docId?: string;
11
+ deliverable?: string;
12
+ contentDocumentId?: string;
13
+ hash?: string;
14
+ search?: string;
15
+ };
16
+
17
+ export enum HistoryState {
18
+ PUSH_STATE = "pushState",
19
+ REPLACE_STATE = "replaceState"
20
+ }
21
+
22
+ export type TreeNode = {
23
+ label: string;
24
+ name: string;
25
+ children?: Array<TreeNode>;
26
+ isExpanded?: boolean;
27
+ parent?: TreeNode;
28
+ };
29
+
30
+ type DropdownOption = {
31
+ id: string;
32
+ label: string;
33
+ };
34
+
35
+ export type DocVersion = DropdownOption & {
36
+ releaseVersion: string;
37
+ url: string;
38
+ link?: {
39
+ href: string;
40
+ };
41
+ };
42
+
43
+ export type DocLanguage = DropdownOption & {
44
+ code: string;
45
+ url: string;
46
+ };
47
+
48
+ export type ApiDocVersion = {
49
+ version_text: string;
50
+ release_version: string;
51
+ doc_version: string;
52
+ version_url: string;
53
+ };
54
+
55
+ export type ApiDocLanguage = {
56
+ code: string;
57
+ label: string;
58
+ locale: string;
59
+ url: string;
60
+ };
61
+
62
+ export interface Header extends Element {
63
+ subtitle: string;
64
+ headerHref: string;
65
+ }
66
+
67
+ export type SiderbarFooter = {
68
+ bailHref: string;
69
+ bailLabel: string;
70
+ languages: Array<DocLanguage>;
71
+ language?: string;
72
+ };
73
+
74
+ export type ApiNavItem = {
75
+ children: Array<ApiNavItem>;
76
+ text: string;
77
+ a_attr: {
78
+ href: string;
79
+ };
80
+ id: string;
81
+ };
82
+
83
+ export type ApiDocData = {
84
+ available_languages: Array<ApiDocLanguage>;
85
+ available_versions: Array<ApiDocVersion>;
86
+ content: string;
87
+ content_document_id: string;
88
+ deliverable: string;
89
+ doc_title: string;
90
+ language: ApiDocLanguage;
91
+ title: string;
92
+ toc: Array<ApiNavItem>;
93
+ version: ApiDocVersion;
94
+ pdf_url: string;
95
+ };
96
+
97
+ export type ContentData = {
98
+ content: string;
99
+ id: string;
100
+ title: string;
101
+ };
102
+
103
+ export type DocumentData = ContentData & {
104
+ availableLanguages: Array<DocLanguage>;
105
+ availableVersions: Array<DocVersion>;
106
+ deliverable: string;
107
+ docTitle: string;
108
+ language: DocLanguage;
109
+ toc: Array<TreeNode>;
110
+ tocMap: { [key: string]: TreeNode };
111
+ version: DocVersion;
112
+ pdfUrl: string;
113
+ };
114
+
115
+ export type ContentApiOptions = {
116
+ version: string;
117
+ language: string;
118
+ };
119
+
120
+ export type TocMap = { [key: string]: TreeNode };
@@ -0,0 +1,163 @@
1
+ import {
2
+ ApiDocData,
3
+ ApiDocLanguage,
4
+ ApiDocVersion,
5
+ ApiNavItem,
6
+ ContentApiOptions,
7
+ ContentData,
8
+ DocumentData,
9
+ DocLanguage,
10
+ DocVersion,
11
+ TreeNode,
12
+ TocMap
13
+ } from "./types";
14
+ import { Language } from "typings/custom";
15
+ import { getLanguageDisplayTextById } from "dxUtils/language";
16
+
17
+ export class FetchContent {
18
+ private apiDomain: string;
19
+ private languages: Array<Language> = [];
20
+
21
+ constructor(apiDomain: string, languages: Array<Language>) {
22
+ this.apiDomain = apiDomain;
23
+ this.languages = languages;
24
+ }
25
+
26
+ async fetchDocumentData(docId: string): Promise<DocumentData | null> {
27
+ try {
28
+ const {
29
+ available_languages,
30
+ available_versions,
31
+ toc,
32
+ content,
33
+ version,
34
+ language,
35
+ content_document_id,
36
+ title,
37
+ doc_title,
38
+ pdf_url,
39
+ deliverable
40
+ } = await this.fetchResource<ApiDocData>(
41
+ `${this.apiDomain}/docs/get_document/${docId}`
42
+ );
43
+
44
+ const { normalizedToc, tocMap } = this.normalizeToc(toc);
45
+ return {
46
+ availableLanguages:
47
+ available_languages &&
48
+ available_languages.map(this.normalizeLanguage.bind(this)),
49
+ availableVersions:
50
+ available_versions &&
51
+ available_versions.map(this.normalizeVersion.bind(this)),
52
+ content,
53
+ version: this.normalizeVersion(version),
54
+ id: content_document_id,
55
+ language: this.normalizeLanguage(language),
56
+ title,
57
+ toc: normalizedToc,
58
+ tocMap,
59
+ docTitle: doc_title,
60
+ pdfUrl: pdf_url,
61
+ deliverable
62
+ };
63
+ } catch (error) {
64
+ console.log(error);
65
+ return null;
66
+ }
67
+ }
68
+
69
+ fetchContent(
70
+ deliverable: string,
71
+ contentId: string,
72
+ options: ContentApiOptions
73
+ ): Promise<ContentData> {
74
+ return this.fetchResource<ContentData>(
75
+ `${this.apiDomain}/docs/get_document_content/${deliverable}/${contentId}/${options.language}/${options.version}`
76
+ );
77
+ }
78
+
79
+ private async fetchResource<T>(url: string): Promise<T> {
80
+ const response = await fetch(url);
81
+ if (!response.ok) {
82
+ throw new Error(response.statusText);
83
+ }
84
+
85
+ const json = await response.json();
86
+
87
+ return json;
88
+ }
89
+
90
+ private normalizeToc(
91
+ apiToc: Array<ApiNavItem>
92
+ ): {
93
+ tocMap: { [key: string]: TreeNode };
94
+ normalizedToc: Array<TreeNode>;
95
+ } {
96
+ const tocMap = {};
97
+ const normalizedToc =
98
+ apiToc &&
99
+ apiToc.map((navItem) => this.normalizeNavItem(navItem, tocMap));
100
+
101
+ return { normalizedToc, tocMap };
102
+ }
103
+
104
+ private normalizeNavItem(
105
+ navItem: ApiNavItem,
106
+ tocMap: TocMap,
107
+ parentNavItem?: TreeNode
108
+ ): TreeNode {
109
+ const name = this.calculateNavItemName(navItem, tocMap);
110
+ const node: TreeNode = {
111
+ label: navItem.text,
112
+ name,
113
+ parent: parentNavItem
114
+ };
115
+
116
+ if (name) {
117
+ tocMap[name] = node;
118
+ }
119
+ node.children = navItem.children?.map((child) =>
120
+ this.normalizeNavItem(child, tocMap, node)
121
+ );
122
+ return node;
123
+ }
124
+
125
+ private calculateNavItemName(navItem: ApiNavItem, tocMap: TocMap): string {
126
+ let href = navItem.a_attr?.href || "";
127
+ if (href.includes("#")) {
128
+ const [pathUrl] = href.split("#");
129
+ href = pathUrl in tocMap ? href : pathUrl;
130
+ }
131
+ return href || navItem.id;
132
+ }
133
+
134
+ private normalizeVersion(version: ApiDocVersion): DocVersion {
135
+ return (
136
+ version && {
137
+ label: version.version_text,
138
+ releaseVersion:
139
+ version.release_version &&
140
+ !version.release_version.startsWith("v")
141
+ ? `v${version.release_version}`
142
+ : version.release_version,
143
+ id: version.doc_version,
144
+ url: version.version_url
145
+ }
146
+ );
147
+ }
148
+
149
+ private normalizeLanguage(language: ApiDocLanguage): DocLanguage {
150
+ return (
151
+ language && {
152
+ label:
153
+ getLanguageDisplayTextById(
154
+ this.languages,
155
+ language.locale
156
+ ) || language.label,
157
+ id: language.locale,
158
+ code: language.code,
159
+ url: language.url
160
+ }
161
+ );
162
+ }
163
+ }
@@ -0,0 +1,54 @@
1
+ :host {
2
+ --button-primary-color: var(--dx-g-blue-vibrant-50);
3
+ --button-primary-color-hover: var(--dx-g-blue-vibrant-40);
4
+ }
5
+
6
+ doc-content-layout {
7
+ --dx-c-content-sidebar-sticky-top: var(--dx-g-global-header-height);
8
+ --dx-c-sidebar-height: calc(100vh - var(--dx-g-global-header-height));
9
+ }
10
+
11
+ doc-breadcrumbs {
12
+ --dx-c-popover-z-index: 5;
13
+
14
+ display: block;
15
+ margin-bottom: var(--dx-g-spacing-md);
16
+ }
17
+
18
+ dx-dropdown {
19
+ --dx-c-dropdown-option-font-size: var(--dx-g-text-sm);
20
+ }
21
+
22
+ dx-dropdown > dx-button {
23
+ --dx-c-button-primary-color: var(--button-primary-color);
24
+ --dx-c-button-primary-color-hover: var(--button-primary-color-hover);
25
+ --border-color: var(--button-primary-color);
26
+
27
+ border-bottom: 1px dashed var(--border-color);
28
+ }
29
+
30
+ dx-dropdown > dx-button:hover {
31
+ --border-color: var(--button-primary-color-hover);
32
+ }
33
+
34
+ doc-phase {
35
+ --doc-c-phase-top: var(--dx-g-global-header-height);
36
+ }
37
+
38
+ @media screen and (max-width: 768px) {
39
+ doc-content-layout {
40
+ --dx-g-doc-header-main-nav-height: 41px;
41
+ --dx-g-doc-header-height: calc(
42
+ var(--dx-g-doc-header-main-nav-height) + 40px
43
+ );
44
+ --dx-c-content-sidebar-sticky-top: calc(
45
+ var(--dx-g-global-header-height) + var(--dx-g-doc-header-height)
46
+ );
47
+ }
48
+
49
+ doc-phase {
50
+ --doc-c-phase-top: calc(
51
+ var(--dx-g-global-header-height) + var(--dx-g-doc-header-height)
52
+ );
53
+ }
54
+ }
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <doc-content-layout
3
+ lwc:if={loaded}
4
+ lwc:ref="docContentLayout"
5
+ coveo-organization-id={coveoOrganizationId}
6
+ coveo-public-access-token={coveoPublicAccessToken}
7
+ coveo-analytics-token={coveoAnalyticsToken}
8
+ coveo-search-hub={coveoSearchHub}
9
+ coveo-advanced-query-config={coveoAdvancedQueryConfig}
10
+ sidebar-header={docTitle}
11
+ sidebar-content={sidebarContent}
12
+ sidebar-value={sidebarValue}
13
+ onselect={handleSelect}
14
+ use-old-sidebar={useOldSidebar}
15
+ onlangchange={handleLanguageChange}
16
+ languages={sidebarFooterContent.languages}
17
+ language={sidebarFooterContent.language}
18
+ bail-href={sidebarFooterContent.bailHref}
19
+ bail-label={sidebarFooterContent.bailLabel}
20
+ show-footer={enableFooter}
21
+ >
22
+ <doc-phase
23
+ slot="version-banner"
24
+ lwc:if={showVersionBanner}
25
+ doc-phase-info={oldVersionInfo}
26
+ icon-name="warning"
27
+ dismissible="true"
28
+ ondismissphase={handleDismissVersionBanner}
29
+ ></doc-phase>
30
+ <div lwc:if={showVersionPicker} slot="sidebar-header">
31
+ <doc-version-picker
32
+ data-type="version"
33
+ analytics-event="custEv_ctaLinkClick"
34
+ analytics-payload={ANALYTICS_PAYLOAD}
35
+ versions={versionOptions}
36
+ selected-version={version}
37
+ latest-version={latestVersion}
38
+ hide-badge={previewVersion}
39
+ ></doc-version-picker>
40
+ </div>
41
+ <doc-breadcrumbs
42
+ lwc:if={showBreadcrumbs}
43
+ breadcrumbs={breadcrumbs}
44
+ pixel-per-character={breadcrumbPixelPerCharacter}
45
+ ></doc-breadcrumbs>
46
+ <doc-content
47
+ docs-data={docContent}
48
+ page-reference={pageReference}
49
+ onnavclick={handleNavClick}
50
+ ></doc-content>
51
+ </doc-content-layout>
52
+ </template>