@pushwoosh/smart-components-kit 1.24.0 → 1.25.0
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/LanguagesSelector/LanguagesSelectForm.d.ts +1 -5
- package/LanguagesSelector/LanguagesSelectForm.js +57 -48
- package/LanguagesSelector/polyglot/messages_ar.js +3 -2
- package/LanguagesSelector/polyglot/messages_bn.js +3 -2
- package/LanguagesSelector/polyglot/messages_de.js +3 -2
- package/LanguagesSelector/polyglot/messages_en.js +3 -2
- package/LanguagesSelector/polyglot/messages_es.js +3 -2
- package/LanguagesSelector/polyglot/messages_fr.js +3 -2
- package/LanguagesSelector/polyglot/messages_he.js +3 -2
- package/LanguagesSelector/polyglot/messages_hi.js +3 -2
- package/LanguagesSelector/polyglot/messages_ja.js +3 -2
- package/LanguagesSelector/polyglot/messages_ko.js +3 -2
- package/LanguagesSelector/polyglot/messages_pt.js +3 -2
- package/LanguagesSelector/polyglot/messages_ru.js +3 -2
- package/LanguagesSelector/polyglot/messages_th.js +3 -2
- package/LanguagesSelector/polyglot/messages_zh.js +3 -2
- package/LanguagesSelector/polyglot/types.d.ts +7 -2
- package/LanguagesSelector/styles.d.ts +3 -0
- package/LanguagesSelector/styles.js +5 -1
- package/LanguagesSelector/utils.d.ts +10 -0
- package/LanguagesSelector/utils.js +10 -0
- package/package.json +1 -1
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { type FC } from 'react';
|
|
2
2
|
import { type LanguageAudience } from './platforms';
|
|
3
|
-
type LanguageItem
|
|
4
|
-
code: string;
|
|
5
|
-
name: string;
|
|
6
|
-
subscribers: number;
|
|
7
|
-
};
|
|
3
|
+
import { type LanguageItem } from './utils';
|
|
8
4
|
type LanguagesSelectProps = {
|
|
9
5
|
allLanguageItems: LanguageItem[];
|
|
10
6
|
langs: string[];
|
|
@@ -5,8 +5,9 @@ import { Color } from '@pushwoosh/kit-constants';
|
|
|
5
5
|
import { Columns, Horizontal, Vertical } from '@pushwoosh/kit-helpers';
|
|
6
6
|
import { Text } from '@pushwoosh/kit-typography';
|
|
7
7
|
import { useLang } from './polyglot';
|
|
8
|
-
import { ActionButton } from './styles';
|
|
9
|
-
import { fetchLastSelection, useGetLangName } from './utils';
|
|
8
|
+
import { ActionButton, HiddenMatchesHint } from './styles';
|
|
9
|
+
import { fetchLastSelection, splitLanguageMatches, useGetLangName } from './utils';
|
|
10
|
+
const HIDDEN_MATCHES_PREVIEW = 5;
|
|
10
11
|
const AUDIENCE_HINT_MESSAGE = {
|
|
11
12
|
email: 'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL',
|
|
12
13
|
sms: 'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS',
|
|
@@ -27,16 +28,11 @@ export const LanguagesSelectForm = ({
|
|
|
27
28
|
const getLangName = useGetLangName(systemLanguage);
|
|
28
29
|
const [lastSelection] = useState(fetchLastSelection);
|
|
29
30
|
const [search, setSearch] = useState('');
|
|
30
|
-
const [
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
return languageItems.filter(item => {
|
|
37
|
-
return item.name.toLowerCase().includes(search.toLowerCase());
|
|
38
|
-
});
|
|
39
|
-
}, [allLanguageItems, search, showAllLanguages, langs]);
|
|
31
|
+
const [includeWithoutDevices, setIncludeWithoutDevices] = useState(false);
|
|
32
|
+
const {
|
|
33
|
+
visible: filteredLanguages,
|
|
34
|
+
hidden: hiddenMatches
|
|
35
|
+
} = useMemo(() => splitLanguageMatches(allLanguageItems, langs, search, includeWithoutDevices), [allLanguageItems, langs, search, includeWithoutDevices]);
|
|
40
36
|
return _jsxs(Vertical, {
|
|
41
37
|
"$gap": 8,
|
|
42
38
|
children: [_jsx(Text, {
|
|
@@ -54,6 +50,7 @@ export const LanguagesSelectForm = ({
|
|
|
54
50
|
})
|
|
55
51
|
}), _jsxs(Horizontal, {
|
|
56
52
|
"$justifyContent": "space-between",
|
|
53
|
+
"$alignItems": "center",
|
|
57
54
|
children: [_jsxs(Horizontal, {
|
|
58
55
|
"$gap": 16,
|
|
59
56
|
"$justifyContent": "start",
|
|
@@ -71,47 +68,59 @@ export const LanguagesSelectForm = ({
|
|
|
71
68
|
children: lang({
|
|
72
69
|
message: 'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL'
|
|
73
70
|
})
|
|
71
|
+
}), lastSelection.length > 0 && _jsx(ActionButton, {
|
|
72
|
+
onClick: () => {
|
|
73
|
+
onChange(lastSelection);
|
|
74
|
+
},
|
|
75
|
+
children: lang({
|
|
76
|
+
message: 'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST'
|
|
77
|
+
})
|
|
74
78
|
})]
|
|
75
|
-
}),
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
message: 'SMART.LANGUAGES_SELECTOR.
|
|
79
|
+
}), _jsx(Checkbox, {
|
|
80
|
+
name: "includeWithoutDevices",
|
|
81
|
+
isChecked: includeWithoutDevices,
|
|
82
|
+
onChange: setIncludeWithoutDevices,
|
|
83
|
+
label: lang({
|
|
84
|
+
message: 'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES'
|
|
81
85
|
})
|
|
82
86
|
})]
|
|
83
|
-
}), _jsxs(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"$
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
},
|
|
99
|
-
label: lang({
|
|
100
|
-
message: 'SMART.LANGUAGES_SELECTOR.CHECKBOX_LABEL',
|
|
101
|
-
name: getLangName(item.code),
|
|
102
|
-
subscribers: item.subscribers
|
|
103
|
-
})
|
|
104
|
-
}, item.code))
|
|
105
|
-
}), _jsx("div", {
|
|
106
|
-
children: _jsx(ActionButton, {
|
|
107
|
-
onClick: () => setShowAllLanguages(x => !x),
|
|
108
|
-
children: showAllLanguages ? lang({
|
|
109
|
-
message: 'SMART.LANGUAGES_SELECTOR.ACTION.SHOW_WITH_SUBSCRIBERS'
|
|
110
|
-
}) : lang({
|
|
111
|
-
message: 'SMART.LANGUAGES_SELECTOR.ACTION.SHOW_ALL'
|
|
112
|
-
})
|
|
87
|
+
}), hiddenMatches.length > 0 && _jsxs(HiddenMatchesHint, {
|
|
88
|
+
children: [_jsxs(Text, {
|
|
89
|
+
"$variant": "footnote",
|
|
90
|
+
"$color": Color.MAIN,
|
|
91
|
+
children: [filteredLanguages.length === 0 && `${lang({
|
|
92
|
+
message: 'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES',
|
|
93
|
+
search: search.trim()
|
|
94
|
+
})} `, lang({
|
|
95
|
+
message: 'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST',
|
|
96
|
+
names: hiddenMatches.slice(0, HIDDEN_MATCHES_PREVIEW).map(item => item.name).join(', ') + (hiddenMatches.length > HIDDEN_MATCHES_PREVIEW ? ', …' : '')
|
|
97
|
+
})]
|
|
98
|
+
}), _jsx(ActionButton, {
|
|
99
|
+
onClick: () => setIncludeWithoutDevices(true),
|
|
100
|
+
children: lang({
|
|
101
|
+
message: 'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES'
|
|
113
102
|
})
|
|
114
103
|
})]
|
|
104
|
+
}), _jsx(Columns, {
|
|
105
|
+
"$sizes": 3,
|
|
106
|
+
"$gap": 8,
|
|
107
|
+
children: filteredLanguages.map(item => _jsx(Checkbox, {
|
|
108
|
+
name: "languages",
|
|
109
|
+
value: item.code,
|
|
110
|
+
isChecked: langs.includes(item.code),
|
|
111
|
+
onChange: isChecked => {
|
|
112
|
+
if (isChecked) {
|
|
113
|
+
onChange([...langs, item.code]);
|
|
114
|
+
} else {
|
|
115
|
+
onChange(langs.filter(code => code !== item.code));
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
label: lang({
|
|
119
|
+
message: 'SMART.LANGUAGES_SELECTOR.CHECKBOX_LABEL',
|
|
120
|
+
name: getLangName(item.code),
|
|
121
|
+
subscribers: item.subscribers
|
|
122
|
+
})
|
|
123
|
+
}, item.code))
|
|
115
124
|
})]
|
|
116
125
|
});
|
|
117
126
|
};
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'تحديد الكل',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'إلغاء تحديد الكل',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'إعادة استخدام التحديد الأخير',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'تضمين اللغات التي لا توجد بها أجهزة',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'لا توجد لغات بها أجهزة تطابق "{{search}}".',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'لغات بلا أجهزة تطابق البحث: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'تمثل الأرقام جهات اتصال البريد الإلكتروني التي يحتوي وسم Language لديها على هذه القيمة.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'تمثل الأرقام جهات اتصال SMS التي يحتوي وسم Language لديها على هذه القيمة.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'تمثل الأرقام جهات اتصال LINE التي يحتوي وسم Language لديها على هذه القيمة.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'সব নির্বাচন',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'সব অনির্বাচন',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'শেষ নির্বাচন পুনরায় ব্যবহার',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'ডিভাইস নেই এমন ভাষাগুলিও দেখান',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'ডিভাইস আছে এমন কোনো ভাষা “{{search}}”-এর সাথে মেলে না।',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'মিলে যাওয়া ডিভাইসবিহীন ভাষা: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'সংখ্যাগুলো হলো সেই ইমেল কন্টাক্ট, যাদের Language Tag-এ এই মান রয়েছে।',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'সংখ্যাগুলো হলো সেই SMS কন্টাক্ট, যাদের Language Tag-এ এই মান রয়েছে।',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'সংখ্যাগুলো হলো সেই LINE কন্টাক্ট, যাদের Language Tag-এ এই মান রয়েছে।',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'alle auswählen',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'alle abwählen',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'letzte Auswahl übernehmen',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'Sprachen ohne Geräte einbeziehen',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'Keine Sprachen mit Geräten passen zu „{{search}}“.',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'Passende Sprachen ohne Geräte: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'Zahlen sind E-Mail-Kontakte, deren Language-Tag diesen Wert hat.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'Zahlen sind SMS-Kontakte, deren Language-Tag diesen Wert hat.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'Zahlen sind LINE-Kontakte, deren Language-Tag diesen Wert hat.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'select all',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'deselect all',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'reuse last selection',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'Include languages without devices',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'No languages with devices match “{{search}}”.',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'Languages without devices that match: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'Numbers are email contacts whose Language tag holds this value.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'Numbers are SMS contacts whose Language tag holds this value.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'Numbers are LINE contacts whose Language tag holds this value.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'seleccionar todo',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'deseleccionar todo',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'reutilizar la última selección',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'Incluir idiomas sin dispositivos',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'Ningún idioma con dispositivos coincide con «{{search}}».',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'Idiomas sin dispositivos que coinciden: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'Los números son contactos de correo electrónico cuya etiqueta Language tiene este valor.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'Los números son contactos de SMS cuya etiqueta Language tiene este valor.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'Los números son contactos de LINE cuya etiqueta Language tiene este valor.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'tout sélectionner',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'tout désélectionner',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'réutiliser la dernière sélection',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'Inclure les langues sans appareils',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'Aucune langue avec des appareils ne correspond à « {{search}} ».',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'Langues sans appareils correspondantes : {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'Les nombres correspondent aux contacts e-mail dont le tag Language a cette valeur.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'Les nombres correspondent aux contacts SMS dont le tag Language a cette valeur.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'Les nombres correspondent aux contacts LINE dont le tag Language a cette valeur.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'בחר הכול',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'בטל בחירת הכול',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'השתמש בבחירה האחרונה',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'לכלול שפות ללא מכשירים',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'אין שפות עם מכשירים שתואמות ל-"{{search}}".',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'שפות ללא מכשירים שתואמות: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'המספרים הם אנשי קשר באימייל שתגית Language שלהם מכילה ערך זה.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'המספרים הם אנשי קשר ב-SMS שתגית Language שלהם מכילה ערך זה.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'המספרים הם אנשי קשר ב-LINE שתגית Language שלהם מכילה ערך זה.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'सभी चुनें',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'सभी अचयनित करें',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'पिछला चयन दोबारा उपयोग करें',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'बिना डिवाइस वाली भाषाएँ भी शामिल करें',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'डिवाइस वाली कोई भाषा “{{search}}” से मेल नहीं खाती।',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'मेल खाने वाली बिना डिवाइस की भाषाएँ: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'संख्याएँ उन ईमेल संपर्कों की हैं जिनके Language Tag में यह मान है।',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'संख्याएँ उन SMS संपर्कों की हैं जिनके Language Tag में यह मान है।',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'संख्याएँ उन LINE संपर्कों की हैं जिनके Language Tag में यह मान है।',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'すべて選択',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'すべて解除',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': '前回の選択を再利用',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'デバイスのない言語も含める',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': '「{{search}}」に一致するデバイスのある言語はありません。',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': '一致するデバイスのない言語: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': '数値は、Language タグがこの値のメール連絡先の数です。',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': '数値は、Language タグがこの値のSMS 連絡先の数です。',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': '数値は、Language タグがこの値のLINE 連絡先の数です。',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': '모두 선택',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': '모두 선택 해제',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': '마지막 선택 재사용',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': '기기가 없는 언어 포함',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': '“{{search}}”와(과) 일치하는 기기 보유 언어가 없습니다.',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': '일치하는 기기 없는 언어: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': '숫자는 Language Tag 값이 이 값인 이메일 연락처 수입니다.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': '숫자는 Language Tag 값이 이 값인 SMS 연락처 수입니다.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': '숫자는 Language Tag 값이 이 값인 LINE 연락처 수입니다.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'selecionar tudo',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'desmarcar tudo',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'reutilizar a última seleção',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'Incluir idiomas sem dispositivos',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'Nenhum idioma com dispositivos corresponde a “{{search}}”.',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'Idiomas sem dispositivos correspondentes: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'Os números são contatos de e-mail cuja tag Language tem este valor.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'Os números são contatos de SMS cuja tag Language tem este valor.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'Os números são contatos do LINE cuja tag Language tem este valor.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'выбрать все',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'снять все',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'повторить прошлый выбор',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'Включить языки без устройств',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'Среди языков с устройствами нет совпадений с «{{search}}».',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'Совпадают языки без устройств: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'Числа — email-контакты, у которых тег Language равен этому значению.',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'Числа — SMS-контакты, у которых тег Language равен этому значению.',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'Числа — контакты LINE, у которых тег Language равен этому значению.',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': 'เลือกทั้งหมด',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': 'ยกเลิกการเลือกทั้งหมด',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': 'ใช้การเลือกล่าสุดอีกครั้ง',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': 'รวมภาษาที่ไม่มีอุปกรณ์',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': 'ไม่มีภาษาที่มีอุปกรณ์ตรงกับ “{{search}}”',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': 'ภาษาที่ไม่มีอุปกรณ์ซึ่งตรงกัน: {{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': 'ตัวเลขคือจำนวนผู้ติดต่ออีเมล ที่ Tag Language มีค่านี้',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': 'ตัวเลขคือจำนวนผู้ติดต่อ SMS ที่ Tag Language มีค่านี้',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': 'ตัวเลขคือจำนวนผู้ติดต่อ LINE ที่ Tag Language มีค่านี้',
|
|
@@ -6,8 +6,9 @@ export const messages = {
|
|
|
6
6
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': '全选',
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': '取消全选',
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': '沿用上次选择',
|
|
9
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
9
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': '包含没有设备的语言',
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': '没有含设备的语言与“{{search}}”匹配。',
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': '匹配的无设备语言:{{names}}',
|
|
11
12
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': '数字表示 Language 标签为此值的电子邮件联系人。',
|
|
12
13
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': '数字表示 Language 标签为此值的SMS 联系人。',
|
|
13
14
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': '数字表示 Language 标签为此值的LINE 联系人。',
|
|
@@ -7,8 +7,13 @@ export type LanguagesSelectorMessages = {
|
|
|
7
7
|
'SMART.LANGUAGES_SELECTOR.ACTION.SELECT_ALL': NoParams;
|
|
8
8
|
'SMART.LANGUAGES_SELECTOR.ACTION.DESELECT_ALL': NoParams;
|
|
9
9
|
'SMART.LANGUAGES_SELECTOR.ACTION.REUSE_LAST': NoParams;
|
|
10
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
11
|
-
'SMART.LANGUAGES_SELECTOR.
|
|
10
|
+
'SMART.LANGUAGES_SELECTOR.INCLUDE_WITHOUT_DEVICES': NoParams;
|
|
11
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.NONE_WITH_DEVICES': {
|
|
12
|
+
search: string;
|
|
13
|
+
};
|
|
14
|
+
'SMART.LANGUAGES_SELECTOR.HIDDEN_MATCHES.LIST': {
|
|
15
|
+
names: string;
|
|
16
|
+
};
|
|
12
17
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.EMAIL': NoParams;
|
|
13
18
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.SMS': NoParams;
|
|
14
19
|
'SMART.LANGUAGES_SELECTOR.AUDIENCE_HINT.LINE': NoParams;
|
|
@@ -47,3 +47,6 @@ export declare const ButtonGroup: import("styled-components/dist/types").IStyled
|
|
|
47
47
|
export declare const ActionButton: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "style"> & {
|
|
48
48
|
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
49
49
|
}> & string;
|
|
50
|
+
export declare const HiddenMatchesHint: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
51
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
52
|
+
}> & string;
|
|
@@ -8,4 +8,8 @@ export const ButtonGroup = styled(Horizontal).withConfig({
|
|
|
8
8
|
export const ActionButton = styled.button.withConfig({
|
|
9
9
|
displayName: "ActionButton",
|
|
10
10
|
componentId: "sc-1damw8z-1"
|
|
11
|
-
})(["display:grid;grid-auto-flow:column;align-items:center;gap:4px;text-transform:uppercase;color:", ";background-color:transparent;height:16px;padding:0;border:none;font-size:12px;font-style:normal;font-weight:500;line-height:16px;transition:box-shadow 0.5s;cursor:pointer;&:hover{color:", ";}&:active{box-shadow:inset 0 0 0 2em ", ";}"], Color.SOFT, Color.SOFT_HOVER, Color.SOFT_LIGHT);
|
|
11
|
+
})(["display:grid;grid-auto-flow:column;align-items:center;gap:4px;text-transform:uppercase;color:", ";background-color:transparent;height:16px;padding:0;border:none;font-size:12px;font-style:normal;font-weight:500;line-height:16px;transition:box-shadow 0.5s;cursor:pointer;&:hover{color:", ";}&:active{box-shadow:inset 0 0 0 2em ", ";}"], Color.SOFT, Color.SOFT_HOVER, Color.SOFT_LIGHT);
|
|
12
|
+
export const HiddenMatchesHint = styled.div.withConfig({
|
|
13
|
+
displayName: "HiddenMatchesHint",
|
|
14
|
+
componentId: "sc-1damw8z-2"
|
|
15
|
+
})(["display:grid;justify-items:start;gap:8px;padding:12px;border-radius:4px;background-color:", ";"], Color.FROZEN);
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
export type LanguageItem = {
|
|
2
|
+
code: string;
|
|
3
|
+
name: string;
|
|
4
|
+
subscribers: number;
|
|
5
|
+
};
|
|
6
|
+
/** Splits languages into the visible list and the search matches hidden only because they have no devices. */
|
|
7
|
+
export declare function splitLanguageMatches(items: LanguageItem[], selected: string[], search: string, includeWithoutDevices: boolean): {
|
|
8
|
+
visible: LanguageItem[];
|
|
9
|
+
hidden: LanguageItem[];
|
|
10
|
+
};
|
|
1
11
|
/**
|
|
2
12
|
* Normalizes a language code to its canonical form (e.g. `zh-hant` -> `zh-Hant`).
|
|
3
13
|
* Canonicalization (rather than lowercasing) keeps codes in the same form that
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
import { languages } from '@pushwoosh/kit-constants';
|
|
3
3
|
import { LAST_SELECTION_KEY } from './constants';
|
|
4
|
+
/** Splits languages into the visible list and the search matches hidden only because they have no devices. */
|
|
5
|
+
export function splitLanguageMatches(items, selected, search, includeWithoutDevices) {
|
|
6
|
+
const query = search.trim().toLowerCase();
|
|
7
|
+
const matches = item => !query || item.name.toLowerCase().includes(query) || item.code.toLowerCase() === query;
|
|
8
|
+
const shown = item => includeWithoutDevices || item.subscribers > 0 || selected.includes(item.code);
|
|
9
|
+
return {
|
|
10
|
+
visible: items.filter(item => shown(item) && matches(item)),
|
|
11
|
+
hidden: query ? items.filter(item => !shown(item) && matches(item)) : []
|
|
12
|
+
};
|
|
13
|
+
}
|
|
4
14
|
/**
|
|
5
15
|
* Normalizes a language code to its canonical form (e.g. `zh-hant` -> `zh-Hant`).
|
|
6
16
|
* Canonicalization (rather than lowercasing) keeps codes in the same form that
|