Skip to content

Commit 46ce1c3

Browse files
committed
Backport admin-ui changes of mike
1 parent 443b40c commit 46ce1c3

19 files changed

Lines changed: 846 additions & 268 deletions

File tree

File renamed without changes.

admin-ui/src/i18n/de.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1000,5 +1000,16 @@
10001000
"worker.successCount": null,
10011001
"workers": null,
10021002
"ordered": null,
1003-
"registered": null
1003+
"registered": null,
1004+
"all_works": null,
1005+
"click_to_copy": null,
1006+
"filter.options": null,
1007+
"message_status_processing": null,
1008+
"message_status_sending": null,
1009+
"message_status_sent": null,
1010+
"message_status_undeliverable": null,
1011+
"messages": null,
1012+
"no_retries": null,
1013+
"retry_remaining": null,
1014+
"all_workers": null
10041015
}

admin-ui/src/i18n/en.json

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"address_line_2": "Address line 2",
4646
"address_notice": "This information will be displayed publicly so be careful what you share.",
4747
"all": "All",
48+
"all_workers": "All Workers",
4849
"allocate_work": "Allocate Work",
4950
"already_got_a_user": "Already got a user?",
5051
"apply": "Apply",
@@ -132,6 +133,7 @@
132133
"children_count": "{count} children",
133134
"city": "City",
134135
"clear_history": "Clear History",
136+
"click_to_copy": "Click to copy ID",
135137
"close": "Close",
136138
"close_sidebar": "Close sidebar",
137139
"code": "Code",
@@ -167,7 +169,7 @@
167169
"contract-address-label": "Contract Address",
168170
"contract-standard": "Contract standard",
169171
"contract_address": "Contract Address",
170-
"copied": "Copied",
172+
"copied": "Copied!",
171173
"copilot": "Copilot",
172174
"copilot-into-message": "Hello! Please introduce yourself and explain what you can help me with in managing my Unchained Commerce store. Be friendly and informative about your current capabilities.",
173175
"copilot_welcome_description": "Your AI assistant is ready to help you manage your Unchained Commerce store.",
@@ -293,7 +295,6 @@
293295
"delivery_providers": "Delivery providers",
294296
"delivery_status": "Status",
295297
"description": "Description",
296-
"detail": "Detail",
297298
"dimensions": "Dimensions",
298299
"discount": "Discount",
299300
"discount_amount": "Discount Amount",
@@ -391,7 +392,7 @@
391392
"filter.active": "Active",
392393
"filter.created": "Created",
393394
"filter.inactive": "Inactive",
394-
"filter.noOptions": "No options",
395+
"filter.options": "Options",
395396
"filter.sortKey": "Sort",
396397
"filter.updated": "Updated",
397398
"filter_activated": "Filter activated!",
@@ -530,6 +531,11 @@
530531
"media_title": "Title:",
531532
"media_updated": "Media updated",
532533
"message": "Message",
534+
"message_status_processing": "Processing",
535+
"message_status_sending": "Sending",
536+
"message_status_sent": "Sent",
537+
"message_status_undeliverable": "Undeliverable",
538+
"messages": "Messages",
533539
"method": "Method",
534540
"mobile_phone": "Mobile phone",
535541
"name": "Name",
@@ -558,6 +564,7 @@
558564
"no_payload": "Payload",
559565
"no_price": "N/A",
560566
"no_result_found": "No result found",
567+
"no_retries": "No retries",
561568
"no_statistics_available": "No statistics available",
562569
"no_tag": "No Tag",
563570
"no_users_found": "No users found",
@@ -738,6 +745,7 @@
738745
"retry": "Retry Connection",
739746
"retry-work": "Retry",
740747
"retry_prompt": "Retry",
748+
"retry_remaining": "retry",
741749
"review": "Review",
742750
"review_data": "Review data",
743751
"review_deleted": "Review deleted successfully",
@@ -960,16 +968,13 @@
960968
"with_children": "With Children",
961969
"work_added_success": "Work added successfully!",
962970
"work_allocated_success": "Allocate work successfully!",
963-
"work_count_header": "{count} Work Items",
964971
"work_created": "Created",
965972
"work_deleted": "Work deleted successfully",
966973
"work_detail": "Work Detail",
967974
"work_detail_title": "Work {id}",
968975
"work_finished": "Finished",
969-
"work_header": "1 Work Item",
970976
"work_management_setting_list_header": "Work Management Settings",
971977
"work_original": "Original Work",
972-
"work_page_title": "{count, plural, one {# Work Item} other {# Work Items}}",
973978
"work_priority": "Priority",
974979
"work_queue": "Work queue",
975980
"work_queue_header": "Work queue",

admin-ui/src/lang/en.json

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@
138138
"all": {
139139
"defaultMessage": "All"
140140
},
141+
"all_workers": {
142+
"defaultMessage": "All Workers"
143+
},
141144
"allocate_work": {
142145
"defaultMessage": "Allocate Work"
143146
},
@@ -399,6 +402,9 @@
399402
"clear_history": {
400403
"defaultMessage": "Clear History"
401404
},
405+
"click_to_copy": {
406+
"defaultMessage": "Click to copy ID"
407+
},
402408
"close": {
403409
"defaultMessage": "Close"
404410
},
@@ -505,7 +511,7 @@
505511
"defaultMessage": "Contract Address"
506512
},
507513
"copied": {
508-
"defaultMessage": "Copied"
514+
"defaultMessage": "Copied!"
509515
},
510516
"copilot": {
511517
"defaultMessage": "Copilot"
@@ -882,9 +888,6 @@
882888
"description": {
883889
"defaultMessage": "Description"
884890
},
885-
"detail": {
886-
"defaultMessage": "Detail"
887-
},
888891
"dimensions": {
889892
"defaultMessage": "Dimensions"
890893
},
@@ -1176,8 +1179,8 @@
11761179
"filter.inactive": {
11771180
"defaultMessage": "Inactive"
11781181
},
1179-
"filter.noOptions": {
1180-
"defaultMessage": "No options"
1182+
"filter.options": {
1183+
"defaultMessage": "Options"
11811184
},
11821185
"filter.sortKey": {
11831186
"defaultMessage": "Sort"
@@ -1597,6 +1600,21 @@
15971600
"message": {
15981601
"defaultMessage": "Message"
15991602
},
1603+
"message_status_processing": {
1604+
"defaultMessage": "Processing"
1605+
},
1606+
"message_status_sending": {
1607+
"defaultMessage": "Sending"
1608+
},
1609+
"message_status_sent": {
1610+
"defaultMessage": "Sent"
1611+
},
1612+
"message_status_undeliverable": {
1613+
"defaultMessage": "Undeliverable"
1614+
},
1615+
"messages": {
1616+
"defaultMessage": "Messages"
1617+
},
16001618
"method": {
16011619
"defaultMessage": "Method"
16021620
},
@@ -1681,6 +1699,9 @@
16811699
"no_result_found": {
16821700
"defaultMessage": "No result found"
16831701
},
1702+
"no_retries": {
1703+
"defaultMessage": "No retries"
1704+
},
16841705
"no_statistics_available": {
16851706
"defaultMessage": "No statistics available"
16861707
},
@@ -2221,6 +2242,9 @@
22212242
"retry_prompt": {
22222243
"defaultMessage": "Retry"
22232244
},
2245+
"retry_remaining": {
2246+
"defaultMessage": "retry"
2247+
},
22242248
"review": {
22252249
"defaultMessage": "Review"
22262250
},
@@ -2887,9 +2911,6 @@
28872911
"work_allocated_success": {
28882912
"defaultMessage": "Allocate work successfully!"
28892913
},
2890-
"work_count_header": {
2891-
"defaultMessage": "{count} Work Items"
2892-
},
28932914
"work_created": {
28942915
"defaultMessage": "Created"
28952916
},
@@ -2905,18 +2926,12 @@
29052926
"work_finished": {
29062927
"defaultMessage": "Finished"
29072928
},
2908-
"work_header": {
2909-
"defaultMessage": "1 Work Item"
2910-
},
29112929
"work_management_setting_list_header": {
29122930
"defaultMessage": "Work Management Settings"
29132931
},
29142932
"work_original": {
29152933
"defaultMessage": "Original Work"
29162934
},
2917-
"work_page_title": {
2918-
"defaultMessage": "{count, plural, one {# Work Item} other {# Work Items}}"
2919-
},
29202935
"work_priority": {
29212936
"defaultMessage": "Priority"
29222937
},

admin-ui/src/modules/assortment/components/AssortmentTextForm.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ import useAuth from '../../Auth/useAuth';
1414
import FormWrapper from '../../common/components/FormWrapper';
1515
import MarkdownTextAreaField from '../../forms/components/MarkdownTextAreaField';
1616
import useApp from '../../common/hooks/useApp';
17+
import useShopInfo from '../../common/hooks/useShopInfo';
1718

1819
const AssortmentTextForm = ({ assortmentId }) => {
1920
const { formatMessage } = useIntl();
2021
const { hasRole } = useAuth();
21-
const { selectedLocale } = useApp();
22+
const { defaultLocale, shopInfo, loading: shopInfoLoading } = useShopInfo();
23+
const { selectedLocale, setSelectedLocale, languageDialectList } = useApp();
2224

2325
const { translatedAssortmentTexts, loading } = useTranslatedAssortmentTexts({
2426
assortmentId,
@@ -81,6 +83,40 @@ const AssortmentTextForm = ({ assortmentId }) => {
8183
}
8284
}, [translatedAssortmentTexts, selectedLocale, loading]);
8385

86+
useEffect(() => {
87+
if (shopInfo && translatedAssortmentTexts?.length) {
88+
if (
89+
translatedAssortmentTexts?.find(
90+
({ locale }) => locale === selectedLocale,
91+
)
92+
) {
93+
return;
94+
}
95+
if (
96+
defaultLocale &&
97+
translatedAssortmentTexts?.find(
98+
({ locale }) => locale === defaultLocale,
99+
)
100+
) {
101+
setSelectedLocale(defaultLocale);
102+
} else if (
103+
defaultLocale &&
104+
translatedAssortmentTexts?.find(
105+
({ locale }) => locale === defaultLocale.split('-')[0],
106+
)
107+
) {
108+
setSelectedLocale(defaultLocale.split('-')[0]);
109+
} else {
110+
const firstAvailableText = translatedAssortmentTexts?.find(
111+
({ locale }) =>
112+
locale &&
113+
languageDialectList?.find(({ isoCode }) => isoCode === locale),
114+
);
115+
setSelectedLocale(firstAvailableText.locale);
116+
}
117+
}
118+
}, [shopInfoLoading, translatedAssortmentTexts]);
119+
84120
return (
85121
<SelfDocumentingView
86122
documentationLabel={formatMessage({

admin-ui/src/modules/common/components/AppContext.tsx

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ import { useIntl } from 'react-intl';
33
import useLanguages from '../../language/hooks/useLanguages';
44
import useCountries from '../../country/hooks/useCountries';
55
import useShopInfo from '../hooks/useShopInfo';
6+
import useLocalStorage from '../hooks/useLocalStorage';
7+
8+
const isSupportedLocale = (locale) => {
9+
try {
10+
const dtf = new Intl.DateTimeFormat(locale);
11+
const resolved = dtf.resolvedOptions().locale;
12+
return resolved.toLowerCase() === locale.toLowerCase();
13+
} catch (e) {
14+
return false;
15+
}
16+
};
617

718
interface AppContextProps {
819
selectedLocale: string;
@@ -12,18 +23,20 @@ interface AppContextProps {
1223
}
1324

1425
const AppContext = createContext<AppContextProps | undefined>(undefined);
15-
1626
const createLanguageDialectList = (languages, countries) => {
1727
const result = [];
1828

1929
languages.forEach(({ _id: languageId, isoCode: baseIsoCode }) => {
2030
result.push({ _id: languageId, isoCode: baseIsoCode });
2131
countries.forEach(({ isoCode: countryIsoCode, _id: countryId }) => {
22-
const dialectIsoCode = `${baseIsoCode}-${countryIsoCode.toUpperCase()}`;
23-
result.push({
24-
_id: `${countryId}-${languageId}`,
25-
isoCode: dialectIsoCode,
26-
});
32+
const dialectIsoCode = [baseIsoCode, countryIsoCode.toUpperCase()].join(
33+
'-',
34+
);
35+
if (isSupportedLocale(dialectIsoCode))
36+
result.push({
37+
_id: `${countryId}-${languageId}`,
38+
isoCode: dialectIsoCode,
39+
});
2740
});
2841
});
2942

@@ -38,16 +51,29 @@ export const AppContextWrapper = ({
3851
onlyFull?: boolean;
3952
}) => {
4053
const { languages } = useLanguages();
54+
const { locale } = useIntl();
55+
const [storedLocale, setStoredLocale] = useLocalStorage(
56+
'selectedLocale',
57+
null,
58+
);
4159
const { shopInfo, loading: shopInfoLoading } = useShopInfo();
4260
const { countries } = useCountries();
43-
const { locale } = useIntl();
4461

4562
const [selectedLocale, setSelectedLocale] = useState<string>(locale);
63+
const setSelectedLocaleWrapper = (newLocale: string) => {
64+
setStoredLocale(newLocale);
65+
setSelectedLocale(newLocale);
66+
};
4667

4768
useEffect(() => {
69+
if (storedLocale) {
70+
setSelectedLocale(storedLocale);
71+
72+
return;
73+
}
4874
if (!shopInfoLoading) {
4975
const baseLanguage = `${shopInfo?.language?.isoCode}-${shopInfo?.country?.isoCode?.toUpperCase()}`;
50-
setSelectedLocale(baseLanguage);
76+
setSelectedLocaleWrapper(baseLanguage);
5177
}
5278
}, [shopInfo, shopInfoLoading, locale]);
5379

@@ -60,7 +86,7 @@ export const AppContextWrapper = ({
6086
<AppContext.Provider
6187
value={{
6288
selectedLocale,
63-
setSelectedLocale,
89+
setSelectedLocale: setSelectedLocaleWrapper,
6490
languageDialectList,
6591
isSystemReady,
6692
}}

admin-ui/src/modules/common/components/LocaleWrapper.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import useApp from '../hooks/useApp';
77

88
const LocaleWrapper = ({ children, onlyFull = false }) => {
99
const { languageDialectList, selectedLocale, setSelectedLocale } = useApp();
10-
11-
const { locale } = useIntl();
1210
const isInsideFormWrapper = useContext(FormWrapperContext);
1311

1412
const displayedLanguages = languageDialectList.filter(

admin-ui/src/modules/common/hooks/useShopInfo.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,15 @@ const useShopInfo = () => {
4545
>(ShopInfoQuery, {
4646
fetchPolicy: 'cache-first',
4747
});
48+
const { shopInfo } = data || {};
4849
return {
49-
shopInfo: data?.shopInfo,
50+
shopInfo,
51+
defaultLocale: [
52+
shopInfo?.language?.isoCode,
53+
shopInfo?.country?.isoCode?.toUpperCase(),
54+
]
55+
?.filter(Boolean)
56+
?.join('-'),
5057
loading,
5158
error,
5259
};

0 commit comments

Comments
 (0)