@salesforcedevs/dw-components 1.3.366 → 1.3.377

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/dw-components",
3
- "version": "1.3.366",
3
+ "version": "1.3.377",
4
4
  "description": "Lightning web components for https://developer.salesforce.com",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -26,5 +26,5 @@
26
26
  "@types/setimmediate": "1.0.4",
27
27
  "setimmediate": "1.0.5"
28
28
  },
29
- "gitHead": "879600edad044c730d365d3737f72f9f5eaec399"
29
+ "gitHead": "e9a71ae9df89246f57650e112b3feb1894baa986"
30
30
  }
@@ -0,0 +1,78 @@
1
+ .language-selector {
2
+ height: 42px;
3
+ border-radius: 4px;
4
+ border: 1px solid var(--dx-g-language-picker-font-color);
5
+ padding-left: 16px;
6
+ padding-right: 16px;
7
+ background-color: var(--dx-g-language-picker-background-color);
8
+ display: flex;
9
+ justify-content: space-between;
10
+ align-items: center;
11
+ cursor: pointer;
12
+ }
13
+
14
+ .language-selector > span {
15
+ font-size: 16px;
16
+ line-height: 24px;
17
+ font-weight: 400;
18
+ color: var(--dx-g-language-picker-font-color);
19
+ user-select: none;
20
+ }
21
+
22
+ dx-icon {
23
+ --dx-c-icon-color: var(--dx-g-language-picker-font-color);
24
+
25
+ pointer-events: none;
26
+ }
27
+
28
+ .dropdown-options {
29
+ color: var(--dx-g-language-picker-font-color);
30
+ display: flex;
31
+ flex-direction: column;
32
+ height: 140px;
33
+ justify-content: space-between;
34
+ border-radius: 6px;
35
+ border: 1px solid var(--dx-g-language-picker-font-color);
36
+ background-color: var(--dx-g-language-picker-background-color);
37
+ }
38
+
39
+ .dropdown-options > div:first-child {
40
+ padding-top: 16px;
41
+ }
42
+
43
+ .dropdown-options > div {
44
+ padding-left: 16px;
45
+ height: 41px;
46
+ padding-top: 8px;
47
+ padding-bottom: 8px;
48
+ font-size: 16px;
49
+ line-height: 24px;
50
+ font-weight: 400;
51
+ user-select: none;
52
+ }
53
+
54
+ .option {
55
+ color: var(--dx-g-language-picker-option-color);
56
+ }
57
+
58
+ .option:not(.selected) {
59
+ padding-left: 40px;
60
+ }
61
+
62
+ .option:not(.selected):hover {
63
+ background-color: var(--dx-g-language-picker-option-hover-color);
64
+ cursor: pointer;
65
+ }
66
+
67
+ .selected {
68
+ font-weight: 700;
69
+ display: flex;
70
+ padding-left: 16px;
71
+ }
72
+
73
+ .selected dx-icon {
74
+ --dx-c-icon-color: var(--dx-g-language-picker-checkmark-color);
75
+
76
+ padding-top: 5px;
77
+ padding-right: 5px;
78
+ }
@@ -1,11 +1,36 @@
1
1
  <template>
2
- <dx-select
3
- lwc:if={visible}
4
- options={languages}
5
- onchange={handleLanguageChange}
6
- placement="bottom-end"
7
- value={selectedLanguage}
8
- disabled={noTranslationsAvailable}
9
- loading={loading}
10
- ></dx-select>
2
+ <dx-popover lwc:if={visible} width="140px">
3
+ <div class="language-selector" slot="control">
4
+ <span>{selectedLanguage}</span>
5
+ <dx-icon
6
+ sprite="general"
7
+ symbol="chevron-down"
8
+ size="medium"
9
+ ></dx-icon>
10
+ </div>
11
+ <div class="dropdown-options" slot="content">
12
+ <div>{placeholder}</div>
13
+ <template for:each={languages} for:item="option">
14
+ <template lwc:if={option.isSelected}>
15
+ <div class="option selected" key={option.value}>
16
+ <dx-icon
17
+ sprite="action"
18
+ symbol="approval"
19
+ size="medium"
20
+ ></dx-icon>
21
+ <span>{option.label}</span>
22
+ </div>
23
+ </template>
24
+ <template lwc:else>
25
+ <div
26
+ class="option"
27
+ key={option.value}
28
+ onclick={handleLanguageChange}
29
+ >
30
+ {option.label}
31
+ </div>
32
+ </template>
33
+ </template>
34
+ </div>
35
+ </dx-popover>
11
36
  </template>
@@ -1,6 +1,6 @@
1
1
  import { track as trackClick } from "dxUtils/analytics";
2
2
  import { api, LightningElement, track } from "lwc";
3
- import { SelectOption } from "typings/custom";
3
+ import { Option } from "typings/custom";
4
4
 
5
5
  const ANALYTICS_INFO = {
6
6
  element_title: "Select Language",
@@ -11,21 +11,28 @@ const language_local_names_map: any = {
11
11
  japanese: "日本語",
12
12
  english: "English"
13
13
  };
14
+ const DEFAULT = language_local_names_map.english;
14
15
 
15
- const normalizePostLink = (post: {
16
- acf: { language: string };
17
- link: string;
18
- }) => {
16
+ interface ACF {
17
+ language: string;
18
+ }
19
+
20
+ interface Post {
21
+ acf: ACF;
22
+ link?: string;
23
+ }
24
+
25
+ const normalizePostLink = (post: Post) => {
19
26
  switch (post.acf.language) {
20
27
  case "japanese":
21
- return post.link.replace("/blogs/", "/jpblogs/");
28
+ return post.link?.replace("/blogs/", "/jpblogs/");
22
29
  default:
23
30
  return post.link;
24
31
  }
25
32
  };
26
33
 
27
34
  export default class LanguageSelector extends LightningElement {
28
- @track languages = [] as SelectOption[];
35
+ @track languages: Option[] = [];
29
36
  selectedLanguage?: string;
30
37
  loading = true;
31
38
  @api postAcf!: string;
@@ -35,6 +42,7 @@ export default class LanguageSelector extends LightningElement {
35
42
 
36
43
  generateTranslationOptions = async () => {
37
44
  const acf = JSON.parse(this.postAcf);
45
+ this.selectedLanguage = this.getLanguageOrDefaultIfInvalid({ acf });
38
46
 
39
47
  try {
40
48
  const canonicalId = acf?.canonicalid;
@@ -47,25 +55,18 @@ export default class LanguageSelector extends LightningElement {
47
55
  )
48
56
  ).json();
49
57
 
50
- Object.values(alternatePosts).forEach(
51
- (post: { acf: { language: string }; link: string }) => {
52
- const localLanguageName =
53
- language_local_names_map[post.acf.language] ||
54
- language_local_names_map.english;
55
- this._languageMap[localLanguageName] =
56
- normalizePostLink(post);
57
- }
58
- );
58
+ Object.values(alternatePosts).forEach((post: Post) => {
59
+ const localLanguageName =
60
+ this.getLanguageOrDefaultIfInvalid(post);
61
+ this._languageMap[localLanguageName] = normalizePostLink(post);
62
+ });
59
63
 
60
64
  this.languages = Object.values(alternatePosts).map((post) => {
65
+ const language = this.getLanguageOrDefaultIfInvalid(post);
61
66
  return {
62
- value:
63
- language_local_names_map[post.acf.language] ||
64
- language_local_names_map.english,
65
- label:
66
- language_local_names_map[post.acf.language] ||
67
- language_local_names_map.english,
68
- disabled: false
67
+ id: language,
68
+ label: language,
69
+ isSelected: language === this.selectedLanguage
69
70
  };
70
71
  });
71
72
  } catch (e) {
@@ -73,12 +74,12 @@ export default class LanguageSelector extends LightningElement {
73
74
  } finally {
74
75
  this.loading = false;
75
76
  }
76
-
77
- this.selectedLanguage =
78
- language_local_names_map[acf?.language] ||
79
- language_local_names_map.english;
80
77
  };
81
78
 
79
+ private getLanguageOrDefaultIfInvalid(post: Post) {
80
+ return language_local_names_map[post.acf.language] || DEFAULT;
81
+ }
82
+
82
83
  connectedCallback() {
83
84
  this.generateTranslationOptions();
84
85
  }
@@ -87,8 +88,14 @@ export default class LanguageSelector extends LightningElement {
87
88
  return !this.loading && !this.noTranslationsAvailable;
88
89
  }
89
90
 
90
- handleLanguageChange(evt: CustomEvent): void {
91
- const selectedLanguage = evt.detail.value;
91
+ get placeholder() {
92
+ return this.selectedLanguage === language_local_names_map.english
93
+ ? "Language"
94
+ : "言語";
95
+ }
96
+
97
+ handleLanguageChange(evt: Event): void {
98
+ const selectedLanguage = evt.target.innerHTML;
92
99
  const url = this._languageMap[selectedLanguage];
93
100
  trackClick(this.template.activeElement!, "custEv_ctaButtonClick", {
94
101
  ...ANALYTICS_INFO,