@salesforcedevs/dx-components 0.43.3-tree-selected-scroll-9 → 0.45.0-alpha1

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/dx-components",
3
- "version": "0.43.3-tree-selected-scroll-9",
3
+ "version": "0.45.0-alpha1",
4
4
  "description": "DX Lightning web components",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -16,27 +16,15 @@
16
16
  display: flex;
17
17
  }
18
18
 
19
- .filter-checkbox-group,
20
- .filter-button::part(container) {
21
- --dx-c-checkbox-text-transform: capitalize;
22
-
23
- text-transform: var(--dx-c-checkbox-text-transform);
24
- }
25
-
26
19
  .docs-action-bar .filters-container > *:not(:first-child),
27
- .docs-search-input {
20
+ dx-search-input {
28
21
  margin-left: var(--dx-g-spacing-sm);
29
22
  }
30
23
 
31
- .docs-search-input {
24
+ dx-search-input {
32
25
  --dx-c-input-width: 285px;
33
26
  }
34
27
 
35
- .docs-card {
36
- --dx-c-body-max-lines: 4;
37
- --dx-c-heading-max-lines: 2;
38
- }
39
-
40
28
  .pagination-container {
41
29
  max-width: fit-content;
42
30
  max-width: -moz-fit-content;
@@ -56,7 +44,7 @@
56
44
  padding: 0;
57
45
  }
58
46
 
59
- .docs-search-input {
47
+ dx-search-input {
60
48
  --dx-c-input-width: 100%;
61
49
 
62
50
  width: 100%;
@@ -0,0 +1,67 @@
1
+ <template>
2
+ <div class="card-grid">
3
+ <div class="docs-action-bar">
4
+ <div class="records-container">
5
+ <span if:true={endingRecord}>
6
+ Showing { startingRecord } to { endingRecord } of {
7
+ cards.length }
8
+ </span>
9
+ </div>
10
+ <div class="filters-container">
11
+ <slot name="filters"></slot>
12
+ </div>
13
+ <dx-input
14
+ size="small"
15
+ placeholder="Search..."
16
+ icon-symbol="search"
17
+ shortcut-key="j"
18
+ class="docs-search-input"
19
+ onchange={onSearchChange}
20
+ value={value}
21
+ ></dx-input>
22
+ </div>
23
+ <dx-grid columns="four">
24
+ <template for:each={currentPageCards} for:item="card">
25
+ <dx-card-docs
26
+ key={card.title}
27
+ body={card.body}
28
+ href={card.href}
29
+ img-alt={card.imgAlt}
30
+ img-src={card.imgSrc}
31
+ label={card.label}
32
+ title={card.title}
33
+ target={card.target}
34
+ show-mobile-img={card.showMobileImg}
35
+ >
36
+ <template
37
+ if:true={card.links}
38
+ for:each={card.links}
39
+ for:item="link"
40
+ >
41
+ <dx-button
42
+ key={link.title}
43
+ href={link.href}
44
+ variant="inline"
45
+ >
46
+ { link.title }
47
+ </dx-button>
48
+ </template>
49
+ </dx-card-docs>
50
+ </template>
51
+ </dx-grid>
52
+ <div class="pagination-container" if:false={showEmptyState}>
53
+ <dx-pagination
54
+ current-page={page}
55
+ total-pages={totalPages}
56
+ pages-to-show="5"
57
+ onpagechange={goToPage}
58
+ if:false={hidePagination}
59
+ ></dx-pagination>
60
+ </div>
61
+ </div>
62
+ <dx-empty-state
63
+ title="Beep boop. That did not compute."
64
+ subtitle={emptyStateSubtitle}
65
+ if:true={showEmptyState}
66
+ ></dx-empty-state>
67
+ </template>
@@ -0,0 +1,73 @@
1
+ import { LightningElement, api, track } from "lwc";
2
+ import { toJson } from "utils/normalizers";
3
+ import { DocsCard } from "typings/custom";
4
+
5
+ export default class CardGridDocs extends LightningElement {
6
+ @api pageSize = 24;
7
+ @api
8
+ get cards(): DocsCard[] {
9
+ return this.value
10
+ ? this._cards.filter((card: DocsCard) =>
11
+ Object.values(card).some(
12
+ (val) =>
13
+ typeof val === "string" &&
14
+ val.includes(this.value || "")
15
+ )
16
+ )
17
+ : this._cards;
18
+ }
19
+ set cards(value) {
20
+ this._cards = toJson(value);
21
+ }
22
+
23
+ private page: number = 1;
24
+ private _cards: DocsCard[] = [];
25
+ @track
26
+ private value?: string;
27
+
28
+ private get currentPageCards() {
29
+ return this.cards.slice(this.startingRecord - 1, this.endingRecord);
30
+ }
31
+
32
+ private get startingRecord() {
33
+ return this.page === 1
34
+ ? this.page
35
+ : (this.page - 1) * this.pageSize + 1;
36
+ }
37
+
38
+ private get endingRecord() {
39
+ const defaultEndingRecord = this.pageSize * this.page;
40
+ return defaultEndingRecord > this.cards.length
41
+ ? this.cards.length
42
+ : defaultEndingRecord;
43
+ }
44
+
45
+ private get totalPages() {
46
+ return Math.ceil(this.cards.length / this.pageSize);
47
+ }
48
+
49
+ private get hidePagination() {
50
+ return this.totalPages < 2;
51
+ }
52
+
53
+ private get emptyStateSubtitle() {
54
+ return "No results" + (this.value !== "" ? ` for "${this.value}"` : "");
55
+ }
56
+
57
+ private get showEmptyState() {
58
+ return !this.cards.length;
59
+ }
60
+
61
+ private onSearchChange(e: InputEvent): void {
62
+ const detail = `${e.detail}`;
63
+ this.value = detail === "" ? undefined : detail;
64
+
65
+ if (this.startingRecord > this.cards.length) {
66
+ this.page = 1;
67
+ }
68
+ }
69
+
70
+ private goToPage(e: CustomEvent) {
71
+ this.page = e.detail;
72
+ }
73
+ }
@@ -31,11 +31,16 @@ export default class DropdownOption extends LightningElement {
31
31
  const navSubHeading =
32
32
  (this.navItemLabel ? this.option.label : undefined) || undefined;
33
33
 
34
- const payload = {
34
+ const payload: any = {
35
35
  navHeading,
36
36
  navSubHeading,
37
37
  clickText: this.keyValue || undefined,
38
- pageLocation: window.location.pathname || undefined
38
+ pageLocation: window.location.pathname || undefined,
39
+ elementType: "dropdown",
40
+ destinationType: "internal",
41
+ ctaClick: true,
42
+ itemTitle: this.option.label || undefined,
43
+ clickUrl: e.target?.href || undefined
39
44
  };
40
45
 
41
46
  if (this.analyticsEvent && e.currentTarget) {
@@ -67,6 +67,8 @@ export default class Grid extends LightningElement {
67
67
  }
68
68
 
69
69
  onSlotChange(e: Event) {
70
- this._itemCount = (e.target as LightningSlotElement).assignedElements().length;
70
+ this._itemCount = (
71
+ e.target as LightningSlotElement
72
+ ).assignedElements().length;
71
73
  }
72
74
  }
@@ -93,12 +93,15 @@ export default class Pagination extends LightningElement {
93
93
  const page = this.calculatePage(e);
94
94
  const clickType = this.getPaginationClickType(e);
95
95
 
96
+ const clickText =
97
+ clickType === PaginationClickType.Number
98
+ ? page
99
+ : (e.target as HTMLElement).dataset.partId;
100
+
96
101
  track(e.currentTarget!, "custEv_pagination", {
97
102
  ...ANALYTICS_INFO,
98
- clickText:
99
- clickType === PaginationClickType.Number
100
- ? page
101
- : (e.target as HTMLElement).dataset.partId
103
+ clickText,
104
+ itemTitle: clickText
102
105
  });
103
106
 
104
107
  this.dispatchEvent(new CustomEvent("pagechange", { detail: page }));
@@ -1,46 +0,0 @@
1
- <template>
2
- <div class="card-grid">
3
- <div class="docs-action-bar">
4
- <div class="records-container">
5
- <span if:true={endingRecord}>
6
- Showing { startingRecord } to { endingRecord } of {
7
- cards.length }
8
- </span>
9
- </div>
10
- <div class="filters-container">
11
- <slot name="filters"></slot>
12
- </div>
13
- <dx-input
14
- size="small"
15
- placeholder="Search..."
16
- icon-symbol="search"
17
- shortcut-key="j"
18
- class="docs-search-input"
19
- onchange={handleSearchChange}
20
- value={searchTerm}
21
- ></dx-input>
22
- </div>
23
- <dx-grid
24
- columns={tileColumns}
25
- if:false={showEmptyState}
26
- class="card-container"
27
- ></dx-grid>
28
- <div style="display: none">
29
- <slot name="cards" onslotchange={onSlotChange}></slot>
30
- </div>
31
- <div class="pagination-container" if:false={showEmptyState}>
32
- <dx-pagination
33
- current-page={page}
34
- total-pages={totalPages}
35
- pages-to-show={pagesToShow}
36
- onpagechange={goToPage}
37
- if:false={hidePagination}
38
- ></dx-pagination>
39
- </div>
40
- </div>
41
- <dx-empty-state
42
- title="Beep boop. That did not compute."
43
- subtitle={emptyStateSubtitle}
44
- if:true={showEmptyState}
45
- ></dx-empty-state>
46
- </template>
@@ -1,140 +0,0 @@
1
- import { LightningElement, api } from "lwc";
2
-
3
- export default class CardGrid extends LightningElement {
4
- @api pageSize = 24;
5
- @api searchDebounce = 500;
6
- page = 1;
7
-
8
- private searchTerm = "";
9
- private matchDesktop!: MediaQueryList;
10
- private matchMobile!: MediaQueryList;
11
- private matchMobileSmall!: MediaQueryList;
12
- private deviceType: "desktop" | "mobile" | "mobile-small" = "desktop";
13
- private searchTimeout?: number;
14
- private cards: any[] = [];
15
-
16
- private get startingRecord() {
17
- return this.page === 1
18
- ? this.page
19
- : (this.page - 1) * this.pageSize + 1;
20
- }
21
-
22
- private get endingRecord() {
23
- const defaultEndingRecord = this.pageSize * this.page;
24
- return defaultEndingRecord > this.cards.length
25
- ? this.cards.length
26
- : defaultEndingRecord;
27
- }
28
-
29
- private get totalPages() {
30
- return Math.ceil(this.cards.length / this.pageSize);
31
- }
32
-
33
- private get hidePagination() {
34
- return this.totalPages < 2;
35
- }
36
-
37
- private get emptyStateSubtitle() {
38
- return (
39
- "No results" +
40
- (this.searchTerm !== "" ? ` for "${this.searchTerm}"` : "")
41
- );
42
- }
43
-
44
- private get showEmptyState() {
45
- return !this.cards.length;
46
- }
47
-
48
- private get tileColumns() {
49
- return this.deviceType === "desktop" ? "three" : "two";
50
- }
51
-
52
- private get pagesToShow() {
53
- return this.deviceType === "mobile-small" ? 3 : 5;
54
- }
55
-
56
- connectedCallback(): void {
57
- this.matchDesktop = window.matchMedia("(min-width: 1024px)");
58
- this.matchDesktop.addEventListener("change", this.handleDesktopView);
59
-
60
- this.matchMobile = window.matchMedia(
61
- "(min-width: 401px) and (max-width: 1023px)"
62
- );
63
- this.matchMobile.addEventListener("change", this.handleMobileView);
64
-
65
- this.matchMobileSmall = window.matchMedia("(max-width: 340px)");
66
- this.matchMobileSmall.addEventListener(
67
- "change",
68
- this.handleMobileSmallView
69
- );
70
-
71
- if (this.matchMobile.matches) {
72
- this.deviceType = "mobile";
73
- }
74
- if (this.matchMobileSmall.matches) {
75
- this.deviceType = "mobile-small";
76
- }
77
- }
78
-
79
- disconnectedCallback(): void {
80
- this.matchDesktop.removeEventListener("change", this.handleDesktopView);
81
- this.matchMobile.removeEventListener("change", this.handleMobileView);
82
- this.matchMobileSmall.removeEventListener(
83
- "change",
84
- this.handleMobileSmallView
85
- );
86
- }
87
-
88
- renderedCallback(): void {
89
- this.displayCurrentPage();
90
- }
91
-
92
- onSlotChange() {
93
- const slots = Array.from(
94
- this.template.querySelectorAll("slot")
95
- ) as HTMLSlotElement[];
96
- this.cards = Array.from(slots[1].assignedElements()[0].children);
97
- }
98
-
99
- handleDesktopView = (e: MediaQueryListEvent | MediaQueryList) => {
100
- if (e.matches) {
101
- this.deviceType = "desktop";
102
- }
103
- };
104
-
105
- handleMobileView = (e: MediaQueryListEvent | MediaQueryList) => {
106
- if (e.matches) {
107
- this.deviceType = "mobile";
108
- }
109
- };
110
-
111
- handleMobileSmallView = (e: MediaQueryListEvent | MediaQueryList) => {
112
- if (e.matches) {
113
- this.deviceType = "mobile-small";
114
- }
115
- };
116
-
117
- handleSearchChange(event: InputEvent): void {
118
- window.clearTimeout(this.searchTimeout);
119
- this.searchTimeout = window.setTimeout(() => {
120
- this.dispatchEvent(
121
- new CustomEvent("searchchange", { detail: event.detail })
122
- );
123
- }, this.searchDebounce);
124
- }
125
-
126
- goToPage(e: CustomEvent) {
127
- this.page = e.detail;
128
- this.displayCurrentPage();
129
- }
130
-
131
- displayCurrentPage() {
132
- const cardContainer = this.template.querySelector(".card-container");
133
- if (cardContainer) {
134
- cardContainer.innerHTML = "";
135
- this.cards
136
- .slice(this.startingRecord - 1, this.endingRecord)
137
- .map((node) => cardContainer?.appendChild(node));
138
- }
139
- }
140
- }