mui-language-picker 2.1.4 → 2.1.5

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/README.md CHANGED
@@ -74,6 +74,8 @@ Output should be a Language Picker when entered opens a dialog
74
74
  | displayName\* | DisplayName | function to control display of name |
75
75
  | setInfo\* | (tag: LangTag) => void | callback to receive tag information |
76
76
  | disabled\* | boolean | true if control disabled |
77
+ | offline\* | boolean | true if picker in offline setting |
78
+ | required\* | boolean | true if language required (show *) |
77
79
  | t | ILanguagePickerStrings | localization strings (see below) |
78
80
 
79
81
  \* parameters marked with an asterisk are optional
@@ -116,6 +118,7 @@ export const languagePickerStrings_en = {
116
118
  'If you would like to change the language name enter the new name here.',
117
119
  newName: 'New Language Name',
118
120
  change: 'Change',
121
+ noFonts: 'No recommended fonts',
119
122
  } as ILanguagePickerStrings;
120
123
  ```
121
124
 
@@ -16,6 +16,8 @@ interface IProps extends IStateProps {
16
16
  setInfo?: (tag: LangTag) => void;
17
17
  setDir?: (rtl: boolean) => void;
18
18
  disabled?: boolean;
19
+ offline?: boolean;
20
+ required?: boolean;
19
21
  }
20
22
  export declare const LanguagePicker: (props: IProps) => React.JSX.Element;
21
23
  export default LanguagePicker;
@@ -10,12 +10,44 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
37
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
38
+ if (ar || !(i in from)) {
39
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
40
+ ar[i] = from[i];
41
+ }
42
+ }
43
+ return to.concat(ar || Array.prototype.slice.call(from));
44
+ };
13
45
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
46
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
47
  };
16
48
  Object.defineProperty(exports, "__esModule", { value: true });
17
49
  exports.LanguagePicker = void 0;
18
- var react_1 = __importDefault(require("react"));
50
+ var react_1 = __importStar(require("react"));
19
51
  var material_1 = require("@mui/material");
20
52
  var Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
21
53
  var BorderColor_1 = __importDefault(require("@mui/icons-material/BorderColor"));
@@ -28,7 +60,6 @@ var ChangeName_1 = __importDefault(require("./ChangeName"));
28
60
  var getDisplayName_1 = require("./getDisplayName");
29
61
  var rtlScripts_1 = __importDefault(require("./data/rtlScripts"));
30
62
  var MAXOPTIONS = 50;
31
- var menuWidth = { width: 200 };
32
63
  var StyledDialog = (0, material_1.styled)(material_1.Dialog)(function () { return ({
33
64
  '& .MuiDialog-paperScrollPaper': {
34
65
  marginBottom: 'auto',
@@ -37,7 +68,7 @@ var StyledDialog = (0, material_1.styled)(material_1.Dialog)(function () { retur
37
68
  }); });
38
69
  var LanguagePicker = function (props) {
39
70
  var _a;
40
- var disabled = props.disabled;
71
+ var disabled = props.disabled, offline = props.offline, required = props.required;
41
72
  var value = props.value, name = props.name, font = props.font, setCode = props.setCode, setName = props.setName, setFont = props.setFont, setInfo = props.setInfo, setDir = props.setDir, t = props.t;
42
73
  var displayName = props.displayName;
43
74
  var _b = react_1.default.useState(false), open = _b[0], setOpen = _b[1];
@@ -169,8 +200,10 @@ var LanguagePicker = function (props) {
169
200
  if (fontFamilyText) {
170
201
  var fontFamily_1 = JSON.parse(fontFamilyText);
171
202
  var familyId = fontFamily_1.defaultfamily[0];
172
- setCurFont(fontFamily_1.families[familyId].familyid);
173
- setFontOpts(Object.keys(fontFamily_1.families).map(function (f) { return fontFamily_1.families[f].familyid; }));
203
+ if (familyId && fontFamily_1.families[familyId]) {
204
+ setCurFont(fontFamily_1.families[familyId].familyid);
205
+ setFontOpts(Object.keys(fontFamily_1.families).map(function (f) { return fontFamily_1.families[f].familyid; }));
206
+ }
174
207
  }
175
208
  };
176
209
  var selectFont = function (tagP) {
@@ -193,6 +226,7 @@ var LanguagePicker = function (props) {
193
226
  else
194
227
  selectDefaultFont(key);
195
228
  };
229
+ var hasFonts = (0, react_1.useMemo)(function () { return fontOpts && fontOpts.length > 0; }, [fontOpts]);
196
230
  var handleNewName = function () {
197
231
  setNewName(true);
198
232
  };
@@ -349,7 +383,19 @@ var LanguagePicker = function (props) {
349
383
  }
350
384
  });
351
385
  }
352
- list.push.apply(list, result_1);
386
+ // put canonical name matches first
387
+ var canonical_1 = [];
388
+ var nonCanonical_1 = [];
389
+ var lcFirst_1 = firstWord.toLowerCase();
390
+ result_1.forEach(function (e) {
391
+ if ((e === null || e === void 0 ? void 0 : e.name.toLowerCase()) === lcFirst_1) {
392
+ canonical_1.push(e);
393
+ }
394
+ else {
395
+ nonCanonical_1.push(e);
396
+ }
397
+ });
398
+ list.push.apply(list, __spreadArray(__spreadArray([], canonical_1, false), nonCanonical_1, false));
353
399
  }
354
400
  }
355
401
  if (list.slice(0, MAXOPTIONS).length > 0) {
@@ -362,7 +408,7 @@ var LanguagePicker = function (props) {
362
408
  return react_1.default.createElement(react_1.default.Fragment, null);
363
409
  };
364
410
  return (react_1.default.createElement("div", { id: "LangBcp47" },
365
- react_1.default.createElement(material_1.TextField, { variant: "filled", margin: "dense", id: "lang-bcp47", label: t.language, required: true, style: { width: 300 }, value: value !== 'und' ? name + ' (' + value + ')' : '', onClick: handleClickOpen, onKeyDown: handleClickOpen, disabled: disabled ? disabled : false }),
411
+ react_1.default.createElement(material_1.TextField, { variant: "filled", margin: "dense", id: "lang-bcp47", label: t.language, required: required, style: { width: 300 }, value: value !== 'und' ? name + ' (' + value + ')' : '', onClick: handleClickOpen, onKeyDown: handleClickOpen, disabled: disabled ? disabled : false }),
366
412
  react_1.default.createElement(StyledDialog, { id: "LanguagePicker", open: open, onClose: handleCancel, "aria-labelledby": "form-dialog-title" },
367
413
  react_1.default.createElement(material_1.DialogTitle, { id: "form-dialog-title" }, t.selectLanguage),
368
414
  react_1.default.createElement(material_1.DialogContent, { dividers: true },
@@ -373,28 +419,25 @@ var LanguagePicker = function (props) {
373
419
  react_1.default.createElement(Clear_1.default, { color: "primary" })))),
374
420
  } }),
375
421
  optList(),
376
- react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.TextField, { id: "select-script", "data-testid": "select-script", select: true, sx: { width: 150, mx: 1 }, label: "".concat(t.script, " *"), value: defaultScript, onChange: handleScriptChange(tag), style: { width: 400 }, SelectProps: {
377
- MenuProps: __assign({ sx: menuWidth }),
378
- }, margin: "normal", variant: "filled" }, scriptList(tag)
422
+ react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.TextField, { id: "select-script", "data-testid": "select-script", select: true, sx: { mx: 1 }, fullWidth: true, label: "".concat(t.script, " *"), value: defaultScript, onChange: handleScriptChange(tag), margin: "normal", variant: "filled" }, scriptList(tag)
379
423
  .map(function (s) { return (react_1.default.createElement(material_1.MenuItem, { key: s, value: s }, langTags_1.scriptName.get(s) + ' - ' + s)); })
380
424
  .concat(scriptList(tag).includes(defaultScript)
381
425
  ? []
382
426
  : [
383
427
  react_1.default.createElement(material_1.MenuItem, { key: defaultScript, value: defaultScript }, defaultScript),
384
- ])), label: "" }),
385
- react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.TextField, { id: "select-font", "data-testid": "select-font", select: true, sx: { width: 300, mx: 1 }, label: "".concat(t.font, " *"), value: fontOpts.includes(curFont) ? curFont : '', onChange: addFontInfo, SelectProps: {
386
- MenuProps: __assign({ sx: menuWidth }),
387
- }, margin: "normal", variant: "filled" }, fontOpts.map(function (s) { return (react_1.default.createElement(material_1.MenuItem, { key: s, value: s }, (0, langTags_1.displayFamily)(s))); })), label: "" })),
428
+ ])), label: "", sx: { width: '100%' } }),
429
+ react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.TextField, { id: "select-font", "data-testid": "select-font", select: hasFonts, helperText: !hasFonts ? t.noFonts : undefined, sx: { mx: 1 }, fullWidth: true, label: "".concat(t.font).concat(hasFonts ? ' *' : ''), value: fontOpts.includes(curFont) ? curFont : '', onChange: addFontInfo, margin: "normal", variant: "filled" }, fontOpts.map(function (s) { return (react_1.default.createElement(material_1.MenuItem, { key: s, value: s }, (0, langTags_1.displayFamily)(s))); })), label: "", sx: { width: '100%' } })),
388
430
  react_1.default.createElement(material_1.DialogActions, null,
389
- react_1.default.createElement("a", { href: "https://www.w3.org/International/questions/qa-choosing-language-tags", target: "_blank", rel: "noopener noreferrer" },
390
- react_1.default.createElement(material_1.Typography, null, t.codeExplained)),
431
+ !offline && (react_1.default.createElement("a", { href: "https://www.w3.org/International/questions/qa-choosing-language-tags", target: "_blank", rel: "noopener noreferrer" },
432
+ react_1.default.createElement(material_1.Typography, null, t.codeExplained))),
391
433
  curName !== '' && (react_1.default.createElement(material_1.Tooltip, { title: (_a = t.changeName) !== null && _a !== void 0 ? _a : 'Change name' },
392
434
  react_1.default.createElement(material_1.IconButton, { color: "primary", size: "small", "data-testid": "change-name", onClick: handleNewName },
393
435
  react_1.default.createElement(BorderColor_1.default, { fontSize: "small" })))),
394
436
  react_1.default.createElement(GrowingSpacer_1.GrowingSpacer, null),
395
437
  react_1.default.createElement(material_1.Button, { onClick: handleCancel, color: "primary" },
396
438
  react_1.default.createElement(material_1.Typography, null, t.cancel)),
397
- react_1.default.createElement(material_1.Button, { onClick: handleSelect, color: "primary", disabled: tag === undefined },
439
+ react_1.default.createElement(material_1.Button, { onClick: handleSelect, color: "primary", disabled: required &&
440
+ (tag === undefined || (tag === null || tag === void 0 ? void 0 : tag.tag) === 'und' || defaultScript === '') },
398
441
  react_1.default.createElement(material_1.Typography, null, t.select)))),
399
442
  newName && (react_1.default.createElement(ChangeName_1.default, { isOpen: newName, onClose: handleCloseName, curName: curName, onNewName: handleSetName, t: t }))));
400
443
  };
@@ -78,14 +78,11 @@ jsonData.forEach(function (element, i) {
78
78
  var result = Array.from(elementTokens).sort(function (a, b) {
79
79
  return a[0].localeCompare(b[0]);
80
80
  });
81
- // sorts the matches in order by what field they are in and just keepts the index
81
+ // sorts the matches in order by what field they are in and just keeps the index
82
82
  result.forEach(function (r) {
83
83
  r[1].sort(function (a, b) { return a.kn - b.kn; });
84
84
  r[1] = r[1].map(function (e) { return e.i; });
85
85
  });
86
- // for (const idx of Array.from(Array(20)).map((_, i) => i)) {
87
- // console.log(result[idx]);
88
- // }
89
86
  var maxSet = new Set();
90
87
  result.forEach(function (r) {
91
88
  maxSet.add(r[1].length);
@@ -16,5 +16,6 @@ export interface ILanguagePickerStrings {
16
16
  nameInstruction?: string;
17
17
  newName?: string;
18
18
  change?: string;
19
+ noFonts?: string;
19
20
  }
20
21
  export declare const languagePickerStrings_en: ILanguagePickerStrings;
@@ -20,4 +20,5 @@ exports.languagePickerStrings_en = {
20
20
  nameInstruction: 'If you would like to change the language name enter the new name here.',
21
21
  newName: 'New Language Name',
22
22
  change: 'Change',
23
+ noFonts: 'No recommended fonts',
23
24
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mui-language-picker",
3
- "version": "2.1.4",
3
+ "version": "2.1.5",
4
4
  "description": "Material UI language picker",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",