@salesforcedevs/docs-components 1.3.209-alpha.10 → 1.3.209-alpha2

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/lwc.config.json CHANGED
@@ -18,6 +18,8 @@
18
18
  "doc/overview",
19
19
  "doc/phase",
20
20
  "doc/xmlContent",
21
+ "doc/atlasContent",
22
+ "doc/zoominContent",
21
23
  "docUtils/utils"
22
24
  ]
23
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforcedevs/docs-components",
3
- "version": "1.3.209-alpha.10",
3
+ "version": "1.3.209-alpha2",
4
4
  "description": "Docs Lightning web components for DSC",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
@@ -13,6 +13,7 @@
13
13
  "dependencies": {
14
14
  "@api-components/amf-helper-mixin": "^4.5.17",
15
15
  "classnames": "^2.2.6",
16
+ "jsonwebtoken": "^9.0.2",
16
17
  "kagekiri": "^1.4.1",
17
18
  "lodash.orderby": "^4.6.0",
18
19
  "lodash.uniqby": "^4.7.0",
@@ -21,6 +22,7 @@
21
22
  },
22
23
  "devDependencies": {
23
24
  "@types/classnames": "^2.2.10",
25
+ "@types/jsonwebtoken": "^9.0.5",
24
26
  "@types/lodash.orderby": "^4.6.7",
25
27
  "@types/lodash.uniqby": "^4.7.7"
26
28
  },
@@ -0,0 +1,52 @@
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: calc(
8
+ var(--dx-g-global-header-height) +
9
+ var(--dx-g-doc-header-main-nav-height)
10
+ );
11
+ --dx-c-sidebar-height: calc(
12
+ 100vh -
13
+ calc(
14
+ var(--dx-g-global-header-height) +
15
+ var(--dx-g-doc-header-main-nav-height)
16
+ )
17
+ );
18
+ }
19
+
20
+ doc-breadcrumbs {
21
+ --dx-c-popover-z-index: 5;
22
+
23
+ display: block;
24
+ margin-bottom: var(--dx-g-spacing-md);
25
+ }
26
+
27
+ dx-dropdown {
28
+ --dx-c-dropdown-option-font-size: var(--dx-g-text-sm);
29
+ }
30
+
31
+ dx-dropdown > dx-button {
32
+ --dx-c-button-primary-color: var(--button-primary-color);
33
+ --dx-c-button-primary-color-hover: var(--button-primary-color-hover);
34
+ --border-color: var(--button-primary-color);
35
+
36
+ border-bottom: 1px dashed var(--border-color);
37
+ }
38
+
39
+ dx-dropdown > dx-button:hover {
40
+ --border-color: var(--button-primary-color-hover);
41
+ }
42
+
43
+ .document-pickers {
44
+ margin-left: auto;
45
+ margin-right: var(--dx-g-spacing-sm);
46
+ }
47
+
48
+ doc-phase {
49
+ --doc-c-phase-top: calc(
50
+ var(--dx-g-global-header-height) + var(--dx-g-doc-header-height)
51
+ );
52
+ }
@@ -0,0 +1,48 @@
1
+ <template>
2
+ <doc-content-layout
3
+ if:true={loaded}
4
+ coveo-organization-id={coveoOrganizationId}
5
+ coveo-public-access-token={coveoPublicAccessToken}
6
+ coveo-analytics-token={coveoAnalyticsToken}
7
+ coveo-search-hub={coveoSearchHub}
8
+ coveo-advanced-query-config={coveoAdvancedQueryConfig}
9
+ sidebar-header="Pages"
10
+ sidebar-content={sidebarContent}
11
+ sidebar-value={sidebarValue}
12
+ onselect={handleSelect}
13
+ use-old-sidebar={useOldSidebar}
14
+ >
15
+ <doc-phase
16
+ slot="version-banner"
17
+ if:true={showVersionBanner}
18
+ doc-phase-info={oldVersionInfo}
19
+ icon-name="warning"
20
+ dismissible="true"
21
+ ondismissphase={handleDismissVersionBanner}
22
+ ></doc-phase>
23
+ <div slot="sidebar-header" class="document-pickers">
24
+ <dx-dropdown
25
+ data-type="version"
26
+ analytics-event="custEv_ctaLinkClick"
27
+ analytics-payload={ANALYTICS_PAYLOAD}
28
+ options={versionOptions}
29
+ value={version.id}
30
+ width="290px"
31
+ >
32
+ <dx-button variant="inline" disabled={disableVersion}>
33
+ {version.releaseVersion}
34
+ </dx-button>
35
+ </dx-dropdown>
36
+ </div>
37
+ <doc-breadcrumbs
38
+ if:true={showBreadcrumbs}
39
+ breadcrumbs={breadcrumbs}
40
+ pixel-per-character={breadcrumbPixelPerCharacter}
41
+ ></doc-breadcrumbs>
42
+ <doc-content
43
+ docs-data={docContent}
44
+ page-reference={pageReference}
45
+ onnavclick={handleNavClick}
46
+ ></doc-content>
47
+ </doc-content-layout>
48
+ </template>
@@ -0,0 +1,111 @@
1
+ import { BaseContentElement } from "docBaseElements/baseContentElement";
2
+
3
+ import { HistoryState, PageReference } from "../xmlContent/types";
4
+
5
+ export default class xmlContentElement extends BaseContentElement {
6
+ getReferenceFromUrl(): PageReference {
7
+ const [page, docId, deliverable, contentDocumentId] =
8
+ window.location.pathname.substr(1).split("/");
9
+
10
+ const { origin: domain, hash, search } = window.location;
11
+
12
+ return {
13
+ contentDocumentId,
14
+ deliverable,
15
+ docId,
16
+ domain,
17
+ hash,
18
+ page,
19
+ search
20
+ };
21
+ }
22
+
23
+ async fetchDocument(): Promise<void> {
24
+ this.setState({
25
+ isFetchingDocument: true
26
+ });
27
+ const data = await this.contentProvider!.fetchDocumentData(
28
+ this.pageReference.docId!
29
+ );
30
+
31
+ // This could be a 404 scenario.
32
+ if (!data) {
33
+ this.setState({
34
+ isFetchingDocument: false
35
+ });
36
+ return;
37
+ }
38
+
39
+ this.docTitle = data.docTitle;
40
+ this.tocMap = data.tocMap;
41
+ this.sidebarContent = data.toc;
42
+ this.version = data.version;
43
+ this.language = data.language;
44
+ this.availableLanguages = data.availableLanguages;
45
+ this.availableVersions = data.availableVersions;
46
+ this.pdfUrl = data.pdfUrl;
47
+
48
+ this.updateHeader();
49
+
50
+ this.buildBreadcrumbs();
51
+
52
+ if (this.pageReference.deliverable !== data.deliverable) {
53
+ this.pageReference.deliverable = data.deliverable;
54
+ this.updateUrl(HistoryState.REPLACE_STATE);
55
+ }
56
+
57
+ if (this.oldVersionInfo) {
58
+ this.showVersionBanner = true;
59
+ }
60
+
61
+ if (
62
+ this.pageReference?.contentDocumentId?.replace(/\.htm$/, "") !==
63
+ data.id
64
+ ) {
65
+ try {
66
+ await this.fetchContent();
67
+ this.setState({
68
+ isFetchingDocument: false
69
+ });
70
+ return;
71
+ } catch (error) {
72
+ this.pageReference.contentDocumentId = `${data.id}.htm`;
73
+ this.pageReference.hash = "";
74
+ this.pageReference.search = "";
75
+ this.updateUrl(HistoryState.REPLACE_STATE);
76
+ }
77
+ }
78
+
79
+ this.docContent = data.content;
80
+ this.addMetatags();
81
+ this.setState({
82
+ isFetchingDocument: false
83
+ });
84
+ }
85
+
86
+ async fetchContent(): Promise<void> {
87
+ this.setState({
88
+ isFetchingContent: true
89
+ });
90
+ const data = await this.contentProvider!.fetchContent(
91
+ this.pageReference.deliverable!,
92
+ this.pageReference.contentDocumentId!,
93
+ {
94
+ language: this.language!.id,
95
+ version: this.version!.id
96
+ }
97
+ );
98
+
99
+ if (data) {
100
+ this.docContent = data.content;
101
+ this.addMetatags();
102
+
103
+ if (!this.pageReference.hash) {
104
+ document.body.scrollIntoView();
105
+ }
106
+ }
107
+ this.setState({
108
+ isFetchingContent: false
109
+ });
110
+ }
111
+ }
@@ -207,9 +207,9 @@ export default class ContentLayout extends LightningElement {
207
207
  ".sticky-doc-header"
208
208
  ) as HTMLElement;
209
209
 
210
- const docPhaseEl = (
211
- this.template.querySelector("[name=doc-phase]")! as any
212
- ).assignedElements()[0] as HTMLSlotElement;
210
+ const docPhaseEl = (this.template.querySelector(
211
+ "[name=doc-phase]"
212
+ )! as any).assignedElements()[0] as HTMLSlotElement;
213
213
 
214
214
  if (!sidebarEl || !globalNavEl || !contextNavEl || !docHeaderEl) {
215
215
  console.warn("One or more required elements are missing.");
@@ -259,8 +259,9 @@ export default class ContentLayout extends LightningElement {
259
259
  });
260
260
 
261
261
  // Adjust right nav bar position when doc phase is present
262
- const rightNavBarEl =
263
- this.template.querySelector(".right-nav-bar");
262
+ const rightNavBarEl = this.template.querySelector(
263
+ ".right-nav-bar"
264
+ );
264
265
 
265
266
  if (rightNavBarEl) {
266
267
  rightNavBarEl.style.top = `${
@@ -322,17 +323,14 @@ export default class ContentLayout extends LightningElement {
322
323
  };
323
324
 
324
325
  onSlotChange(event: Event): void {
325
- const slotElements = (
326
- event.target as HTMLSlotElement
327
- ).assignedElements();
326
+ const slotElements = (event.target as HTMLSlotElement).assignedElements();
328
327
 
329
328
  if (slotElements.length) {
330
329
  this.contentLoaded = true;
331
330
  const slotContentElement = slotElements[0];
332
- const headingElements =
333
- slotContentElement.ownerDocument?.getElementsByTagName(
334
- TOC_HEADER_TAG
335
- );
331
+ const headingElements = slotContentElement.ownerDocument?.getElementsByTagName(
332
+ TOC_HEADER_TAG
333
+ );
336
334
 
337
335
  for (const headingElement of headingElements as any) {
338
336
  // Sometimes elements hash is not being set when slot content is wrapped with div
@@ -392,9 +390,9 @@ export default class ContentLayout extends LightningElement {
392
390
  globalNavEl?.offsetHeight +
393
391
  contextNavEl?.offsetHeight;
394
392
 
395
- const docPhaseEl = (
396
- this.template.querySelector("[name=doc-phase]")! as any
397
- ).assignedElements()[0] as HTMLSlotElement;
393
+ const docPhaseEl = (this.template.querySelector(
394
+ "[name=doc-phase]"
395
+ )! as any).assignedElements()[0] as HTMLSlotElement;
398
396
 
399
397
  const offset = docPhaseEl
400
398
  ? headerHeight + docPhaseEl.offsetHeight
@@ -77,6 +77,16 @@ export type ApiNavItem = {
77
77
  id: string;
78
78
  };
79
79
 
80
+ export type ZoominApiNavItem = {
81
+ bundle_id: string;
82
+ childEntries: Array<ZoominApiNavItem>;
83
+ id: string;
84
+ nav_path: string;
85
+ outputclasses: Array<string>;
86
+ title: string;
87
+ url: string;
88
+ };
89
+
80
90
  export type ApiDocData = {
81
91
  available_languages: Array<ApiDocLanguage>;
82
92
  available_versions: Array<ApiDocVersion>;
@@ -115,3 +125,99 @@ export type ContentApiOptions = {
115
125
  };
116
126
 
117
127
  export type TocMap = { [key: string]: TreeNode };
128
+
129
+ // ZOOMIN TYPES - START
130
+
131
+ export type ZoominTocNode = {
132
+ id: string;
133
+ bundle_id: string;
134
+ childEntries?: Array<ZoominTocNode> | [];
135
+ nav_path: string;
136
+ outputclasses: Array<string>;
137
+ title: string;
138
+ url: string;
139
+ parent?: ZoominTocNode;
140
+ isExpanded?: boolean;
141
+ };
142
+ interface Attachment {
143
+ all_attachments: null;
144
+ topic_attachments: any[];
145
+ }
146
+
147
+ interface Dates {
148
+ "Added on": string;
149
+ "Created on": string;
150
+ "Initial upload": string;
151
+ "Updated on": string;
152
+ }
153
+
154
+ interface Label {
155
+ aliases: any[];
156
+ hidden: boolean;
157
+ isSubjectHead: boolean;
158
+ key: string;
159
+ navtitle: string;
160
+ outputclasses: any[];
161
+ subjectHeadId: string;
162
+ subjectheadNavtitle: string;
163
+ visibility: string;
164
+ }
165
+
166
+ interface Metadata {
167
+ description: string;
168
+ "mini-toc": string;
169
+ outputclasses: string;
170
+ }
171
+
172
+ interface ReadTimeData {
173
+ char_count: number;
174
+ img_count: number;
175
+ read_time: number;
176
+ video_links: string[];
177
+ word_count: number;
178
+ }
179
+
180
+ interface TopicCluster {
181
+ clustered_by: { enabled: boolean; type: string };
182
+ clustered_labels: any[];
183
+ clustered_topics: any[];
184
+ clustering_title: string;
185
+ }
186
+
187
+ export type ZoominDocContent = {
188
+ attachments: Attachment;
189
+ available_languages: string[];
190
+ breadcrumbs: any[];
191
+ breadcrumbs_html: string;
192
+ bundle_id: string;
193
+ bundle_landing_page: string;
194
+ bundle_subtitle: null;
195
+ bundle_title: string;
196
+ dates: Dates;
197
+ dislike_url: string;
198
+ dislikes: number;
199
+ es_archived_content: boolean;
200
+ is_in_fav: boolean;
201
+ is_liked: null;
202
+ is_watched: boolean;
203
+ keywords: string[];
204
+ labels: Label[];
205
+ labels_text: string;
206
+ like_url: string;
207
+ likes: number;
208
+ metadata: Metadata;
209
+ page_id: string;
210
+ page_key: number;
211
+ preprocessed_PDF: null;
212
+ rating: null;
213
+ read_time_data: ReadTimeData;
214
+ related_links: any[];
215
+ title: string;
216
+ topic_cluster: TopicCluster;
217
+ topic_html: string;
218
+ topic_language: string;
219
+ views: number;
220
+ your_rating: null;
221
+ };
222
+
223
+ // ZOOMIN TYPES - End
@@ -87,9 +87,7 @@ export class FetchContent {
87
87
  return json;
88
88
  }
89
89
 
90
- private normalizeToc(
91
- apiToc: Array<ApiNavItem>
92
- ): {
90
+ private normalizeToc(apiToc: Array<ApiNavItem>): {
93
91
  tocMap: { [key: string]: TreeNode };
94
92
  normalizedToc: Array<TreeNode>;
95
93
  } {