Skip to content

Commit 1fbdd2e

Browse files
[Feature] RTL FreeText Font Defaults - 11.8 (#11826)
(r11.8 → 11.8)
1 parent 4488be9 commit 1fbdd2e

File tree

7 files changed

+79
-0
lines changed

7 files changed

+79
-0
lines changed
823 KB
Binary file not shown.
823 KB
Binary file not shown.

src/apis/setLanguage.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,24 @@ import dayjs from 'dayjs';
1818
import languageRules from 'constants/languageRules';
1919
import fireEvent from 'helpers/fireEvent';
2020
import Events from 'constants/events';
21+
import getAvailableLanguages from './getAvailableLanguages';
22+
import textToolNames from 'constants/textToolNames';
23+
import localStorageManager from 'helpers/localStorageManager';
24+
import { getInstanceID } from 'helpers/getRootNode';
25+
import setToolStyles from 'helpers/setToolStyles';
2126

2227
let pendingLanguageTimeout;
2328
export default (store) => async (language) => {
2429
if (pendingLanguageTimeout) {
2530
clearTimeout(pendingLanguageTimeout);
2631
}
32+
33+
const availableLanguages = getAvailableLanguages();
34+
if (!availableLanguages.includes(language)) {
35+
console.warn(`Language with ISO code "${language}" is not supported.`);
36+
return;
37+
}
38+
2739
await new Promise((resolve) => {
2840
pendingLanguageTimeout = setTimeout(async () => {
2941
let languageObj = null;
@@ -49,6 +61,9 @@ export default (store) => async (language) => {
4961
const pendingLanguagePromise = i18next.changeLanguage(language);
5062
setDatePickerLocale(pendingLanguagePromise, language);
5163
await pendingLanguagePromise;
64+
65+
updateTextToolDefaults();
66+
5267
fireEvent(Events['LANGUAGE_CHANGED'], languageEventObject);
5368
}
5469
resolve();
@@ -73,3 +88,38 @@ const setDatePickerLocale = (i18nextPromise, language) => {
7388
});
7489
});
7590
};
91+
92+
const applyTextToolDirectionalDefaults = (toolName, directionSpecificStyles) => {
93+
const isRTL = i18next?.dir() === 'rtl';
94+
const rtlDefaults = directionSpecificStyles || {};
95+
96+
const font = isRTL ? rtlDefaults.Font || 'Noto Sans Arabic' : 'Helvetica';
97+
const textAlign = isRTL ? rtlDefaults.TextAlign || 'right' : 'left';
98+
99+
setToolStyles(toolName, 'Font', font);
100+
setToolStyles(toolName, 'TextAlign', textAlign);
101+
};
102+
103+
const updateTextToolDefaults = () => {
104+
const { ToolNames } = window.Core.Tools;
105+
106+
for (const toolKey of textToolNames) {
107+
const toolName = ToolNames[toolKey];
108+
let directionSpecificStyles = null;
109+
110+
if (localStorageManager.isLocalStorageEnabled()) {
111+
const instanceId = getInstanceID();
112+
directionSpecificStyles = JSON.parse(localStorageManager.getItemSynchronous(`${instanceId}-toolData-${toolName}-${i18next.dir()}`));
113+
}
114+
if (directionSpecificStyles && (directionSpecificStyles.Font || directionSpecificStyles.TextAlign)) {
115+
if (directionSpecificStyles.Font) {
116+
setToolStyles(toolName, 'Font', directionSpecificStyles.Font);
117+
}
118+
if (directionSpecificStyles.TextAlign) {
119+
setToolStyles(toolName, 'TextAlign', directionSpecificStyles.TextAlign);
120+
}
121+
} else {
122+
applyTextToolDirectionalDefaults(toolName);
123+
}
124+
}
125+
};

src/constants/textToolNames.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export default [
2+
'FREETEXT',
3+
'FREETEXT2',
4+
'FREETEXT3',
5+
'FREETEXT4',
6+
'CALLOUT',
7+
'CALLOUT2',
8+
'CALLOUT3',
9+
'CALLOUT4',
10+
'REDACTION',
11+
'REDACTION2',
12+
'REDACTION3',
13+
'REDACTION4',
14+
];

src/constants/webFonts.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default [
88
'Cousine',
99
'Liberation Serif',
1010
'Open Sans',
11+
'Noto Sans Arabic',
1112
'Roboto',
1213
'Roboto Mono',
1314
'Tinos',

src/event-listeners/onToolUpdated.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import core from 'core';
22
import actions from 'actions';
33
import localStorageManager from 'helpers/localStorageManager';
44
import { getInstanceID } from 'helpers/getRootNode';
5+
import i18next from 'i18next';
56

67
export default (dispatch) => (tool) => {
78
const toolName = tool.name;
@@ -26,6 +27,18 @@ const storeStyle = (toolName, toolStyles) => {
2627
try {
2728
const instanceId = getInstanceID();
2829
localStorageManager.setItemSynchronous(`${instanceId}-toolData-${toolName}`, JSON.stringify(toolStyles));
30+
if (toolStyles.Font || toolStyles.TextAlign) {
31+
const currentDir = i18next.dir();
32+
const key = `${instanceId}-toolData-${toolName}-${currentDir}`;
33+
const prevStyles = localStorageManager.getItemSynchronous(key);
34+
const newStyles = {
35+
Font: toolStyles.Font,
36+
TextAlign: toolStyles.TextAlign
37+
};
38+
if (!prevStyles || prevStyles.Font !== newStyles.Font || prevStyles.TextAlign !== newStyles.TextAlign) {
39+
localStorageManager.setItemSynchronous(key, JSON.stringify(newStyles));
40+
}
41+
}
2942
} catch (err) {
3043
console.warn(`localStorage could not be accessed. ${err.message}`);
3144
}

src/helpers/localStorageManager.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const WEBVIEWER_STORAGE_PATTERN = [
22
'wc--toolData',
33
'wc-viewer',
44
'webviewer',
5+
'default-toolData',
56
];
67

78
class LocalStorageManager {

0 commit comments

Comments
 (0)