@cundi/refine-xaf 1.0.3 → 1.0.4

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/dist/index.js CHANGED
@@ -60,6 +60,7 @@ __export(index_exports, {
60
60
  httpClient: () => httpClient,
61
61
  keycloakService: () => keycloakService,
62
62
  parseJwt: () => parseJwt,
63
+ refineXafTranslations: () => refineXafTranslations,
63
64
  useColorMode: () => useColorMode,
64
65
  useModelTypes: () => useModelTypes,
65
66
  validatePasswordStrength: () => validatePasswordStrength
@@ -785,6 +786,202 @@ var validatePasswordStrength = (password) => {
785
786
  return { isValid: true, message: "Password is strong" };
786
787
  };
787
788
 
789
+ // src/i18n/index.ts
790
+ var en = {
791
+ pages: {
792
+ login: {
793
+ title: "Sign in to your account",
794
+ buttons: {
795
+ submit: "Sign in"
796
+ }
797
+ }
798
+ },
799
+ buttons: {
800
+ create: "Create",
801
+ edit: "Edit",
802
+ delete: "Delete",
803
+ save: "Save",
804
+ cancel: "Cancel",
805
+ refresh: "Refresh",
806
+ list: "List",
807
+ logout: "Logout"
808
+ },
809
+ actions: {
810
+ create: "Create",
811
+ edit: "Edit",
812
+ show: "Show",
813
+ list: "List",
814
+ delete: "Delete"
815
+ },
816
+ components: {
817
+ header: {
818
+ theme: {
819
+ light: "Light Mode",
820
+ dark: "Dark Mode"
821
+ },
822
+ language: {
823
+ en: "English",
824
+ "zh-TW": "Traditional Chinese"
825
+ },
826
+ menu: {
827
+ changePhoto: "Change Photo",
828
+ manageAccount: "Manage Account in Keycloak",
829
+ changePassword: "Change Password",
830
+ logout: "Logout"
831
+ }
832
+ },
833
+ base64Upload: {
834
+ upload: "Upload"
835
+ },
836
+ relatedList: {
837
+ addDetail: "Add Detail",
838
+ actions: "Actions",
839
+ manageDetail: "Manage Detail",
840
+ deleteConfirm: "Are you sure you want to delete this detail?"
841
+ },
842
+ smartList: {
843
+ search: "Search...",
844
+ refresh: "Refresh",
845
+ columns: "Columns",
846
+ selectColumns: "Select Columns",
847
+ reset: "Reset"
848
+ },
849
+ tiptapEditor: {
850
+ placeholder: "Write something...",
851
+ textColor: "Text Color",
852
+ highlight: "Highlight",
853
+ insertTable: "Insert Table",
854
+ deleteTable: "Delete Table",
855
+ emoji: "Emoji",
856
+ addRowBefore: "Add Row Before",
857
+ addRowAfter: "Add Row After",
858
+ deleteRow: "Delete Row",
859
+ addColumnBefore: "Add Column Before",
860
+ addColumnAfter: "Add Column After",
861
+ deleteColumn: "Delete Column",
862
+ math: "Math (LaTeX)",
863
+ youtube: "YouTube",
864
+ enterYoutubeUrl: "Enter YouTube URL"
865
+ }
866
+ },
867
+ common: {
868
+ actions: {
869
+ create: "Create",
870
+ edit: "Edit",
871
+ delete: "Delete",
872
+ save: "Save",
873
+ cancel: "Cancel"
874
+ }
875
+ },
876
+ sider: {
877
+ dashboard: "Dashboard",
878
+ dataTypeExamples: "Data Type Examples",
879
+ tiptapExamples: "Tiptap Examples",
880
+ users: "Users",
881
+ roles: "Roles",
882
+ settings: "Settings"
883
+ }
884
+ };
885
+ var zhTW = {
886
+ pages: {
887
+ login: {
888
+ title: "\u767B\u5165\u60A8\u7684\u5E33\u6236",
889
+ buttons: {
890
+ submit: "\u767B\u5165"
891
+ }
892
+ }
893
+ },
894
+ buttons: {
895
+ create: "\u65B0\u589E",
896
+ edit: "\u7DE8\u8F2F",
897
+ delete: "\u522A\u9664",
898
+ save: "\u5132\u5B58",
899
+ cancel: "\u53D6\u6D88",
900
+ refresh: "\u91CD\u65B0\u6574\u7406",
901
+ list: "\u5217\u8868",
902
+ logout: "\u767B\u51FA"
903
+ },
904
+ actions: {
905
+ create: "\u65B0\u589E",
906
+ edit: "\u7DE8\u8F2F",
907
+ show: "\u986F\u793A",
908
+ list: "\u5217\u8868",
909
+ delete: "\u522A\u9664"
910
+ },
911
+ components: {
912
+ header: {
913
+ theme: {
914
+ light: "\u5207\u63DB\u70BA\u4EAE\u8272\u6A21\u5F0F",
915
+ dark: "\u5207\u63DB\u70BA\u6697\u8272\u6A21\u5F0F"
916
+ },
917
+ language: {
918
+ en: "English",
919
+ "zh-TW": "\u7E41\u9AD4\u4E2D\u6587"
920
+ },
921
+ menu: {
922
+ changePhoto: "\u66F4\u63DB\u982D\u50CF",
923
+ manageAccount: "\u5728 Keycloak \u7BA1\u7406\u5E33\u865F",
924
+ changePassword: "\u8B8A\u66F4\u5BC6\u78BC",
925
+ logout: "\u767B\u51FA"
926
+ }
927
+ },
928
+ base64Upload: {
929
+ upload: "\u4E0A\u50B3"
930
+ },
931
+ relatedList: {
932
+ addDetail: "\u65B0\u589E\u660E\u7D30",
933
+ actions: "\u64CD\u4F5C",
934
+ manageDetail: "\u7BA1\u7406\u660E\u7D30",
935
+ deleteConfirm: "\u60A8\u78BA\u5B9A\u8981\u522A\u9664\u6B64\u9805\u76EE\u55CE\uFF1F"
936
+ },
937
+ smartList: {
938
+ search: "\u641C\u5C0B...",
939
+ refresh: "\u91CD\u65B0\u6574\u7406",
940
+ columns: "\u6B04\u4F4D",
941
+ selectColumns: "\u9078\u64C7\u6B04\u4F4D",
942
+ reset: "\u91CD\u7F6E"
943
+ },
944
+ tiptapEditor: {
945
+ placeholder: "\u8F38\u5165\u5167\u5BB9...",
946
+ textColor: "\u6587\u5B57\u984F\u8272",
947
+ highlight: "\u87A2\u5149\u7B46",
948
+ insertTable: "\u63D2\u5165\u8868\u683C",
949
+ deleteTable: "\u522A\u9664\u8868\u683C",
950
+ emoji: "\u8868\u60C5\u7B26\u865F",
951
+ addRowBefore: "\u5728\u4E0A\u65B9\u63D2\u5165\u5217",
952
+ addRowAfter: "\u5728\u4E0B\u65B9\u63D2\u5165\u5217",
953
+ deleteRow: "\u522A\u9664\u5217",
954
+ addColumnBefore: "\u5728\u5DE6\u65B9\u63D2\u5165\u6B04",
955
+ addColumnAfter: "\u5728\u53F3\u65B9\u63D2\u5165\u6B04",
956
+ deleteColumn: "\u522A\u9664\u6B04",
957
+ math: "\u6578\u5B78\u516C\u5F0F (LaTeX)",
958
+ youtube: "YouTube \u5F71\u7247",
959
+ enterYoutubeUrl: "\u8F38\u5165 YouTube \u7DB2\u5740"
960
+ }
961
+ },
962
+ common: {
963
+ actions: {
964
+ create: "\u65B0\u589E",
965
+ edit: "\u7DE8\u8F2F",
966
+ delete: "\u522A\u9664",
967
+ save: "\u5132\u5B58",
968
+ cancel: "\u53D6\u6D88"
969
+ }
970
+ },
971
+ sider: {
972
+ dashboard: "\u5100\u8868\u677F",
973
+ dataTypeExamples: "\u8CC7\u6599\u985E\u578B\u7BC4\u4F8B",
974
+ tiptapExamples: "Tiptap \u7BC4\u4F8B",
975
+ users: "\u4F7F\u7528\u8005",
976
+ roles: "\u89D2\u8272",
977
+ settings: "\u8A2D\u5B9A"
978
+ }
979
+ };
980
+ var refineXafTranslations = {
981
+ en,
982
+ "zh-TW": zhTW
983
+ };
984
+
788
985
  // src/components/Header.tsx
789
986
  var import_react3 = __toESM(require("react"));
790
987
  var import_core = require("@refinedev/core");
@@ -851,7 +1048,9 @@ var useColorMode = () => {
851
1048
  // src/components/Base64Upload.tsx
852
1049
  var import_react2 = __toESM(require("react"));
853
1050
  var import_lib2 = require("antd/lib");
1051
+ var import_react_i18next = require("react-i18next");
854
1052
  var Base64Upload = ({ value, onChange }) => {
1053
+ const { t } = (0, import_react_i18next.useTranslation)();
855
1054
  return /* @__PURE__ */ import_react2.default.createElement(
856
1055
  import_lib2.Upload,
857
1056
  {
@@ -869,11 +1068,12 @@ var Base64Upload = ({ value, onChange }) => {
869
1068
  return false;
870
1069
  }
871
1070
  },
872
- value ? /* @__PURE__ */ import_react2.default.createElement("img", { src: `data:image/png;base64,${value}`, alt: "avatar", style: { width: "100%" } }) : /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("div", { style: { marginTop: 8 } }, "Upload"))
1071
+ value ? /* @__PURE__ */ import_react2.default.createElement("img", { src: `data:image/png;base64,${value}`, alt: "avatar", style: { width: "100%" } }) : /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("div", { style: { marginTop: 8 } }, t("components.base64Upload.upload", "Upload")))
873
1072
  );
874
1073
  };
875
1074
 
876
1075
  // src/components/Header.tsx
1076
+ var import_react_i18next2 = require("react-i18next");
877
1077
  var import_meta3 = {};
878
1078
  var { Text } = import_lib3.Typography;
879
1079
  var { useToken } = import_lib3.theme;
@@ -884,6 +1084,11 @@ var Header = () => {
884
1084
  const { mode, setMode } = useColorMode();
885
1085
  const { token } = useToken();
886
1086
  const invalidate = (0, import_core.useInvalidate)();
1087
+ const { t: translate, i18n } = (0, import_react_i18next2.useTranslation)();
1088
+ const currentLocale = i18n.language;
1089
+ const handleLanguageChange = (lang) => {
1090
+ i18n.changeLanguage(lang);
1091
+ };
887
1092
  const [authProvider2, setAuthProvider] = (0, import_react3.useState)(null);
888
1093
  (0, import_react3.useEffect)(() => {
889
1094
  if (user) {
@@ -954,7 +1159,7 @@ var Header = () => {
954
1159
  },
955
1160
  {
956
1161
  key: "change-photo",
957
- label: "Change Photo",
1162
+ label: translate("components.header.menu.changePhoto", "Change Photo"),
958
1163
  icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.CameraOutlined, null),
959
1164
  onClick: () => {
960
1165
  photoForm.setFieldsValue({ Photo: user?.avatar?.replace("data:image/png;base64,", "") });
@@ -963,7 +1168,7 @@ var Header = () => {
963
1168
  },
964
1169
  {
965
1170
  key: "change-password",
966
- label: authProvider2 === "keycloak" ? "Manage Account in Keycloak" : "Change Password",
1171
+ label: authProvider2 === "keycloak" ? translate("components.header.menu.manageAccount", "Manage Account in Keycloak") : translate("components.header.menu.changePassword", "Change Password"),
967
1172
  icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.LockOutlined, null),
968
1173
  onClick: () => {
969
1174
  if (authProvider2 === "keycloak") {
@@ -982,13 +1187,13 @@ var Header = () => {
982
1187
  },
983
1188
  {
984
1189
  key: "theme",
985
- label: mode === "light" ? "Dark Theme" : "Light Theme",
1190
+ label: mode === "light" ? translate("components.header.theme.dark", "Dark Theme") : translate("components.header.theme.light", "Light Theme"),
986
1191
  icon: mode === "light" ? /* @__PURE__ */ import_react3.default.createElement(import_icons.MoonOutlined, null) : /* @__PURE__ */ import_react3.default.createElement(import_icons.SunOutlined, null),
987
1192
  onClick: () => setMode(mode === "light" ? "dark" : "light")
988
1193
  },
989
1194
  {
990
1195
  key: "logout",
991
- label: "Logout",
1196
+ label: translate("components.header.menu.logout", "Logout"),
992
1197
  icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.LogoutOutlined, null),
993
1198
  onClick: () => logout()
994
1199
  }
@@ -1008,7 +1213,29 @@ var Header = () => {
1008
1213
  zIndex: 1
1009
1214
  }
1010
1215
  },
1011
- /* @__PURE__ */ import_react3.default.createElement(import_lib3.Space, null, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Dropdown, { menu: { items: menuItems }, trigger: ["click"] }, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Button, { type: "text", style: { height: 48 } }, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Space, null, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Avatar, { src: user?.avatar, alt: user?.name, icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.UserOutlined, null) }), /* @__PURE__ */ import_react3.default.createElement(Text, null, user?.name), /* @__PURE__ */ import_react3.default.createElement(import_icons.DownOutlined, { style: { fontSize: 12 } }))))),
1216
+ /* @__PURE__ */ import_react3.default.createElement(import_lib3.Space, null, /* @__PURE__ */ import_react3.default.createElement(
1217
+ import_lib3.Dropdown,
1218
+ {
1219
+ menu: {
1220
+ items: [
1221
+ {
1222
+ key: "en",
1223
+ label: translate("components.header.language.en", "English"),
1224
+ onClick: () => handleLanguageChange("en"),
1225
+ disabled: currentLocale === "en"
1226
+ },
1227
+ {
1228
+ key: "zh-TW",
1229
+ label: translate("components.header.language.zh-TW", "\u7E41\u9AD4\u4E2D\u6587"),
1230
+ onClick: () => handleLanguageChange("zh-TW"),
1231
+ disabled: currentLocale === "zh-TW"
1232
+ }
1233
+ ]
1234
+ },
1235
+ trigger: ["click"]
1236
+ },
1237
+ /* @__PURE__ */ import_react3.default.createElement(import_lib3.Button, { type: "text", icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.GlobalOutlined, null) }, currentLocale === "zh-TW" ? "\u7E41\u9AD4\u4E2D\u6587" : "English", " ", /* @__PURE__ */ import_react3.default.createElement(import_icons.DownOutlined, null))
1238
+ ), /* @__PURE__ */ import_react3.default.createElement(import_lib3.Dropdown, { menu: { items: menuItems }, trigger: ["click"] }, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Button, { type: "text", style: { height: 48 } }, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Space, null, /* @__PURE__ */ import_react3.default.createElement(import_lib3.Avatar, { src: user?.avatar, alt: user?.name, icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.UserOutlined, null) }), /* @__PURE__ */ import_react3.default.createElement(Text, null, user?.name), /* @__PURE__ */ import_react3.default.createElement(import_icons.DownOutlined, { style: { fontSize: 12 } }))))),
1012
1239
  /* @__PURE__ */ import_react3.default.createElement(
1013
1240
  import_lib3.Modal,
1014
1241
  {
@@ -1048,11 +1275,13 @@ var import_react4 = __toESM(require("react"));
1048
1275
  var import_antd2 = require("@refinedev/antd");
1049
1276
  var import_lib4 = require("antd/lib");
1050
1277
  var import_icons2 = require("@ant-design/icons");
1278
+ var import_react_i18next3 = require("react-i18next");
1051
1279
  var SmartList = ({
1052
1280
  children,
1053
1281
  resource,
1054
1282
  searchFields
1055
1283
  }) => {
1284
+ const { t } = (0, import_react_i18next3.useTranslation)();
1056
1285
  const { tableProps, searchFormProps, tableQuery, setFilters } = (0, import_antd2.useTable)({
1057
1286
  resource,
1058
1287
  syncWithLocation: true,
@@ -1123,7 +1352,7 @@ var SmartList = ({
1123
1352
  setVisibleColumns(defaultVisible);
1124
1353
  localStorage.removeItem(`table-columns-${resource}`);
1125
1354
  };
1126
- const content = /* @__PURE__ */ import_react4.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "8px" } }, /* @__PURE__ */ import_react4.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: "4px" } }, /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontWeight: 500 } }, "Select Columns"), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { size: "small", type: "link", onClick: handleResetColumns, style: { padding: 0 } }, "Reset")), columns.filter((col) => col.dataIndex !== "actions").map((col) => /* @__PURE__ */ import_react4.default.createElement(
1355
+ const content = /* @__PURE__ */ import_react4.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "8px" } }, /* @__PURE__ */ import_react4.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: "4px" } }, /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontWeight: 500 } }, t("components.smartList.selectColumns", "Select Columns")), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { size: "small", type: "link", onClick: handleResetColumns, style: { padding: 0 } }, t("components.smartList.reset", "Reset"))), columns.filter((col) => col.dataIndex !== "actions").map((col) => /* @__PURE__ */ import_react4.default.createElement(
1127
1356
  import_lib4.Checkbox,
1128
1357
  {
1129
1358
  key: col.key,
@@ -1144,7 +1373,7 @@ var SmartList = ({
1144
1373
  return /* @__PURE__ */ import_react4.default.createElement(import_antd2.List, null, /* @__PURE__ */ import_react4.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: 20 } }, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Form, { ...searchFormProps, layout: "inline" }, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Form.Item, { name: "search" }, /* @__PURE__ */ import_react4.default.createElement(
1145
1374
  import_lib4.Input,
1146
1375
  {
1147
- placeholder: "Search...",
1376
+ placeholder: t("components.smartList.search", "Search..."),
1148
1377
  style: { width: 300 },
1149
1378
  allowClear: true,
1150
1379
  suffix: /* @__PURE__ */ import_react4.default.createElement(
@@ -1173,7 +1402,7 @@ var SmartList = ({
1173
1402
  }
1174
1403
  }
1175
1404
  }
1176
- ))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Space, null, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.ReloadOutlined, null), onClick: () => tableQuery?.refetch() }, "Refresh"), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Popover, { content, title: "Columns", trigger: "click", placement: "bottomRight" }, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.SettingOutlined, null) }, "Columns")))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Table, { ...tableProps, rowKey: "Oid" }, filteredChildren));
1405
+ ))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Space, null, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.ReloadOutlined, null), onClick: () => tableQuery?.refetch() }, t("components.smartList.refresh", "Refresh")), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Popover, { content, title: t("components.smartList.columns", "Columns"), trigger: "click", placement: "bottomRight" }, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.SettingOutlined, null) }, t("components.smartList.columns", "Columns"))))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Table, { ...tableProps, rowKey: "Oid" }, filteredChildren));
1177
1406
  };
1178
1407
 
1179
1408
  // src/components/RelatedList.tsx
@@ -1182,6 +1411,7 @@ var import_lib5 = require("antd/lib");
1182
1411
  var import_icons3 = require("@ant-design/icons");
1183
1412
  var import_antd3 = require("@refinedev/antd");
1184
1413
  var import_core2 = require("@refinedev/core");
1414
+ var import_react_i18next4 = require("react-i18next");
1185
1415
  var DetailModal = ({
1186
1416
  modalForm,
1187
1417
  mode,
@@ -1227,9 +1457,12 @@ var RelatedList = ({
1227
1457
  dataSource,
1228
1458
  onMutationSuccess,
1229
1459
  FormFields,
1230
- modalTitle = "Manage Detail",
1460
+ modalTitle,
1231
1461
  children
1232
1462
  }) => {
1463
+ const { t } = (0, import_react_i18next4.useTranslation)();
1464
+ const defaultTitle = t("components.relatedList.manageDetail", "Manage Detail");
1465
+ const finalModalTitle = modalTitle || defaultTitle;
1233
1466
  const createModalForm = (0, import_antd3.useModalForm)({
1234
1467
  resource,
1235
1468
  action: "create",
@@ -1244,7 +1477,7 @@ var RelatedList = ({
1244
1477
  });
1245
1478
  const { mutate: deleteMutate } = (0, import_core2.useDelete)();
1246
1479
  const handleDelete = (id) => {
1247
- if (confirm("Are you sure you want to delete this detail?")) {
1480
+ if (confirm(t("components.relatedList.deleteConfirm", "Are you sure you want to delete this detail?"))) {
1248
1481
  deleteMutate({
1249
1482
  resource,
1250
1483
  id,
@@ -1263,7 +1496,7 @@ var RelatedList = ({
1263
1496
  disabled: !masterId,
1264
1497
  "data-testid": "add-detail-btn"
1265
1498
  },
1266
- "Add Detail"
1499
+ t("components.relatedList.addDetail", "Add Detail")
1267
1500
  )), /* @__PURE__ */ import_react5.default.createElement(
1268
1501
  import_lib5.Table,
1269
1502
  {
@@ -1277,7 +1510,7 @@ var RelatedList = ({
1277
1510
  /* @__PURE__ */ import_react5.default.createElement(
1278
1511
  import_lib5.Table.Column,
1279
1512
  {
1280
- title: "Actions",
1513
+ title: t("components.relatedList.actions", "Actions"),
1281
1514
  key: "actions",
1282
1515
  width: 120,
1283
1516
  render: (_, record) => /* @__PURE__ */ import_react5.default.createElement(import_lib5.Space, null, /* @__PURE__ */ import_react5.default.createElement(
@@ -1303,7 +1536,7 @@ var RelatedList = ({
1303
1536
  {
1304
1537
  modalForm: createModalForm,
1305
1538
  mode: "create",
1306
- modalTitle,
1539
+ modalTitle: finalModalTitle,
1307
1540
  FormFields,
1308
1541
  masterField,
1309
1542
  masterId
@@ -1313,7 +1546,7 @@ var RelatedList = ({
1313
1546
  {
1314
1547
  modalForm: editModalForm,
1315
1548
  mode: "edit",
1316
- modalTitle,
1549
+ modalTitle: finalModalTitle,
1317
1550
  FormFields,
1318
1551
  masterField,
1319
1552
  masterId
@@ -1323,6 +1556,7 @@ var RelatedList = ({
1323
1556
 
1324
1557
  // src/components/TiptapEditor.tsx
1325
1558
  var import_react6 = __toESM(require("react"));
1559
+ var import_react_i18next5 = require("react-i18next");
1326
1560
  var import_react7 = require("@tiptap/react");
1327
1561
  var import_starter_kit = __toESM(require("@tiptap/starter-kit"));
1328
1562
  var import_extension_image = __toESM(require("@tiptap/extension-image"));
@@ -18547,6 +18781,7 @@ var import_lib6 = require("antd/lib");
18547
18781
  var import_icons4 = require("@ant-design/icons");
18548
18782
  var TiptapEditor = ({ value, onChange, disabled }) => {
18549
18783
  const { token } = import_lib6.theme.useToken();
18784
+ const { t } = (0, import_react_i18next5.useTranslation)();
18550
18785
  const editor = (0, import_react7.useEditor)({
18551
18786
  extensions: [
18552
18787
  import_starter_kit.default,
@@ -18577,7 +18812,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18577
18812
  TextStyle,
18578
18813
  Color,
18579
18814
  index_default.configure({
18580
- placeholder: "Write something..."
18815
+ placeholder: t("components.tiptapEditor.placeholder", "Write something...")
18581
18816
  })
18582
18817
  ],
18583
18818
  content: value,
@@ -18662,7 +18897,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18662
18897
  onClick: () => editor.chain().focus().toggleHighlight().run(),
18663
18898
  disabled,
18664
18899
  size: "small",
18665
- title: "Highlight"
18900
+ title: t("components.tiptapEditor.highlight", "Highlight")
18666
18901
  }
18667
18902
  ), /* @__PURE__ */ import_react6.default.createElement(
18668
18903
  import_lib6.ColorPicker,
@@ -18680,7 +18915,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18680
18915
  icon: /* @__PURE__ */ import_react6.default.createElement(import_icons4.FontColorsOutlined, { style: { color: editor.getAttributes("textStyle").color } }),
18681
18916
  disabled,
18682
18917
  size: "small",
18683
- title: "Text Color"
18918
+ title: t("components.tiptapEditor.textColor", "Text Color")
18684
18919
  }
18685
18920
  )
18686
18921
  ), /* @__PURE__ */ import_react6.default.createElement(
@@ -18745,7 +18980,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18745
18980
  onClick: () => editor.chain().focus().toggleMath().run(),
18746
18981
  disabled,
18747
18982
  size: "small",
18748
- title: "Math (LaTeX)"
18983
+ title: t("components.tiptapEditor.math", "Math (LaTeX)")
18749
18984
  }
18750
18985
  ), /* @__PURE__ */ import_react6.default.createElement(
18751
18986
  import_lib6.Button,
@@ -18753,14 +18988,14 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18753
18988
  type: editor.isActive("youtube") ? "primary" : "text",
18754
18989
  icon: /* @__PURE__ */ import_react6.default.createElement(import_icons4.YoutubeOutlined, null),
18755
18990
  onClick: () => {
18756
- const url = window.prompt("Enter YouTube URL");
18991
+ const url = window.prompt(t("components.tiptapEditor.enterYoutubeUrl", "Enter YouTube URL"));
18757
18992
  if (url) {
18758
18993
  editor.commands.setYoutubeVideo({ src: url });
18759
18994
  }
18760
18995
  },
18761
18996
  disabled,
18762
18997
  size: "small",
18763
- title: "YouTube"
18998
+ title: t("components.tiptapEditor.youtube", "YouTube")
18764
18999
  }
18765
19000
  ), /* @__PURE__ */ import_react6.default.createElement(
18766
19001
  import_lib6.Button,
@@ -18770,7 +19005,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18770
19005
  onClick: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),
18771
19006
  disabled,
18772
19007
  size: "small",
18773
- title: "Insert Table"
19008
+ title: t("components.tiptapEditor.insertTable", "Insert Table")
18774
19009
  }
18775
19010
  ), /* @__PURE__ */ import_react6.default.createElement(
18776
19011
  import_lib6.Button,
@@ -18780,7 +19015,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18780
19015
  onClick: () => editor.chain().focus().deleteTable().run(),
18781
19016
  disabled: !editor.can().deleteTable() || disabled,
18782
19017
  size: "small",
18783
- title: "Delete Table"
19018
+ title: t("components.tiptapEditor.deleteTable", "Delete Table")
18784
19019
  }
18785
19020
  ), /* @__PURE__ */ import_react6.default.createElement(
18786
19021
  import_lib6.Popover,
@@ -18805,7 +19040,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18805
19040
  icon: /* @__PURE__ */ import_react6.default.createElement(import_icons4.SmileOutlined, null),
18806
19041
  disabled,
18807
19042
  size: "small",
18808
- title: "Emoji"
19043
+ title: t("components.tiptapEditor.emoji", "Emoji")
18809
19044
  }
18810
19045
  )
18811
19046
  ), editor.isActive("table") && /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, /* @__PURE__ */ import_react6.default.createElement(
@@ -18816,7 +19051,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18816
19051
  onClick: () => editor.chain().focus().addRowBefore().run(),
18817
19052
  disabled,
18818
19053
  size: "small",
18819
- title: "Add Row Before"
19054
+ title: t("components.tiptapEditor.addRowBefore", "Add Row Before")
18820
19055
  }
18821
19056
  ), /* @__PURE__ */ import_react6.default.createElement(
18822
19057
  import_lib6.Button,
@@ -18826,7 +19061,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18826
19061
  onClick: () => editor.chain().focus().addRowAfter().run(),
18827
19062
  disabled,
18828
19063
  size: "small",
18829
- title: "Add Row After"
19064
+ title: t("components.tiptapEditor.addRowAfter", "Add Row After")
18830
19065
  }
18831
19066
  ), /* @__PURE__ */ import_react6.default.createElement(
18832
19067
  import_lib6.Button,
@@ -18836,7 +19071,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18836
19071
  onClick: () => editor.chain().focus().deleteRow().run(),
18837
19072
  disabled: !editor.can().deleteRow() || disabled,
18838
19073
  size: "small",
18839
- title: "Delete Row"
19074
+ title: t("components.tiptapEditor.deleteRow", "Delete Row")
18840
19075
  }
18841
19076
  ), /* @__PURE__ */ import_react6.default.createElement(
18842
19077
  import_lib6.Button,
@@ -18846,7 +19081,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18846
19081
  onClick: () => editor.chain().focus().addColumnBefore().run(),
18847
19082
  disabled,
18848
19083
  size: "small",
18849
- title: "Add Column Before"
19084
+ title: t("components.tiptapEditor.addColumnBefore", "Add Column Before")
18850
19085
  }
18851
19086
  ), /* @__PURE__ */ import_react6.default.createElement(
18852
19087
  import_lib6.Button,
@@ -18856,7 +19091,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18856
19091
  onClick: () => editor.chain().focus().addColumnAfter().run(),
18857
19092
  disabled,
18858
19093
  size: "small",
18859
- title: "Add Column After"
19094
+ title: t("components.tiptapEditor.addColumnAfter", "Add Column After")
18860
19095
  }
18861
19096
  ), /* @__PURE__ */ import_react6.default.createElement(
18862
19097
  import_lib6.Button,
@@ -18866,7 +19101,7 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
18866
19101
  onClick: () => editor.chain().focus().deleteColumn().run(),
18867
19102
  disabled: !editor.can().deleteColumn() || disabled,
18868
19103
  size: "small",
18869
- title: "Delete Column"
19104
+ title: t("components.tiptapEditor.deleteColumn", "Delete Column")
18870
19105
  }
18871
19106
  ))), /* @__PURE__ */ import_react6.default.createElement(import_lib6.Space, { style: { marginLeft: "auto" } }, /* @__PURE__ */ import_react6.default.createElement(
18872
19107
  import_lib6.Button,
@@ -19800,6 +20035,7 @@ var RoleEdit = () => {
19800
20035
  httpClient,
19801
20036
  keycloakService,
19802
20037
  parseJwt,
20038
+ refineXafTranslations,
19803
20039
  useColorMode,
19804
20040
  useModelTypes,
19805
20041
  validatePasswordStrength