SelectCase.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. import { useIntl } from "react-intl";
  2. import { Cascader } from "antd";
  3. import { useEffect, useState } from "react";
  4. interface CascaderOption {
  5. value: string | number;
  6. label: string;
  7. children?: CascaderOption[];
  8. }
  9. interface IWidget {
  10. value?: string | null;
  11. readonly?: boolean;
  12. onCaseChange?: Function;
  13. }
  14. const SelectCaseWidget = ({
  15. value,
  16. readonly = false,
  17. onCaseChange,
  18. }: IWidget) => {
  19. const intl = useIntl();
  20. const [currValue, setCurrValue] = useState<(string | number)[]>();
  21. useEffect(() => {
  22. if (typeof value === "string") {
  23. const arrValue = value
  24. ?.replaceAll("#", "$")
  25. .replaceAll(":", ".$.")
  26. .split("$")
  27. .map((item) => item.replaceAll(".", ""));
  28. setCurrValue(arrValue);
  29. }
  30. }, [value]);
  31. const case8 = [
  32. {
  33. value: "nom",
  34. label: intl.formatMessage({ id: "dict.fields.type.nom.label" }),
  35. },
  36. {
  37. value: "acc",
  38. label: intl.formatMessage({ id: "dict.fields.type.acc.label" }),
  39. },
  40. {
  41. value: "gen",
  42. label: intl.formatMessage({ id: "dict.fields.type.gen.label" }),
  43. },
  44. {
  45. value: "dat",
  46. label: intl.formatMessage({ id: "dict.fields.type.dat.label" }),
  47. },
  48. {
  49. value: "inst",
  50. label: intl.formatMessage({ id: "dict.fields.type.inst.label" }),
  51. },
  52. {
  53. value: "abl",
  54. label: intl.formatMessage({ id: "dict.fields.type.abl.label" }),
  55. },
  56. {
  57. value: "loc",
  58. label: intl.formatMessage({ id: "dict.fields.type.loc.label" }),
  59. },
  60. {
  61. value: "voc",
  62. label: intl.formatMessage({ id: "dict.fields.type.voc.label" }),
  63. },
  64. {
  65. value: "?",
  66. label: intl.formatMessage({ id: "dict.fields.type.?.label" }),
  67. },
  68. ];
  69. const case2 = [
  70. {
  71. value: "sg",
  72. label: intl.formatMessage({ id: "dict.fields.type.sg.label" }),
  73. children: case8,
  74. },
  75. {
  76. value: "pl",
  77. label: intl.formatMessage({ id: "dict.fields.type.pl.label" }),
  78. children: case8,
  79. },
  80. {
  81. value: "?",
  82. label: intl.formatMessage({ id: "dict.fields.type.?.label" }),
  83. },
  84. ];
  85. const case3 = [
  86. {
  87. value: "m",
  88. label: intl.formatMessage({ id: "dict.fields.type.m.label" }),
  89. children: case2,
  90. },
  91. {
  92. value: "nt",
  93. label: intl.formatMessage({ id: "dict.fields.type.nt.label" }),
  94. children: case2,
  95. },
  96. {
  97. value: "f",
  98. label: intl.formatMessage({ id: "dict.fields.type.f.label" }),
  99. children: case2,
  100. },
  101. ];
  102. const case3_ti = [
  103. ...case3,
  104. {
  105. value: "base",
  106. label: intl.formatMessage({ id: "dict.fields.type.base.label" }),
  107. children: [
  108. {
  109. value: "base",
  110. label: intl.formatMessage({ id: "dict.fields.type.base.label" }),
  111. },
  112. {
  113. value: "prp",
  114. label: intl.formatMessage({ id: "dict.fields.type.prp.label" }),
  115. },
  116. {
  117. value: "pp",
  118. label: intl.formatMessage({ id: "dict.fields.type.pp.label" }),
  119. },
  120. {
  121. value: "fpp",
  122. label: intl.formatMessage({ id: "dict.fields.type.fpp.label" }),
  123. },
  124. ],
  125. },
  126. ];
  127. const case3_pron = [
  128. ...case3,
  129. {
  130. value: "1p",
  131. label: intl.formatMessage({ id: "dict.fields.type.1p.label" }),
  132. children: case2,
  133. },
  134. {
  135. value: "2p",
  136. label: intl.formatMessage({ id: "dict.fields.type.2p.label" }),
  137. children: case2,
  138. },
  139. {
  140. value: "3p",
  141. label: intl.formatMessage({ id: "dict.fields.type.3p.label" }),
  142. children: case2,
  143. },
  144. {
  145. value: "base",
  146. label: intl.formatMessage({ id: "dict.fields.type.base.label" }),
  147. },
  148. ];
  149. const case3_n = [
  150. ...case3,
  151. {
  152. value: "base",
  153. label: intl.formatMessage({ id: "dict.fields.type.base.label" }),
  154. children: [
  155. {
  156. value: "m",
  157. label: intl.formatMessage({ id: "dict.fields.type.m.label" }),
  158. },
  159. {
  160. value: "nt",
  161. label: intl.formatMessage({ id: "dict.fields.type.nt.label" }),
  162. },
  163. {
  164. value: "f",
  165. label: intl.formatMessage({ id: "dict.fields.type.f.label" }),
  166. },
  167. ],
  168. },
  169. ];
  170. const case3_num = [
  171. ...case3,
  172. {
  173. value: "base",
  174. label: intl.formatMessage({ id: "dict.fields.type.base.label" }),
  175. },
  176. ];
  177. const caseVerb3 = [
  178. {
  179. value: "pres",
  180. label: intl.formatMessage({ id: "dict.fields.type.pres.label" }),
  181. },
  182. {
  183. value: "aor",
  184. label: intl.formatMessage({ id: "dict.fields.type.aor.label" }),
  185. },
  186. {
  187. value: "fut",
  188. label: intl.formatMessage({ id: "dict.fields.type.fut.label" }),
  189. },
  190. {
  191. value: "pf",
  192. label: intl.formatMessage({ id: "dict.fields.type.pf.label" }),
  193. },
  194. {
  195. value: "imp",
  196. label: intl.formatMessage({ id: "dict.fields.type.imp.label" }),
  197. },
  198. {
  199. value: "cond",
  200. label: intl.formatMessage({ id: "dict.fields.type.cond.label" }),
  201. },
  202. {
  203. value: "opt",
  204. label: intl.formatMessage({ id: "dict.fields.type.opt.label" }),
  205. },
  206. ];
  207. const caseVerb2 = [
  208. {
  209. value: "sg",
  210. label: intl.formatMessage({ id: "dict.fields.type.sg.label" }),
  211. children: caseVerb3,
  212. },
  213. {
  214. value: "pl",
  215. label: intl.formatMessage({ id: "dict.fields.type.pl.label" }),
  216. children: caseVerb3,
  217. },
  218. ];
  219. const caseVerbInd = [
  220. {
  221. value: "abs",
  222. label: intl.formatMessage({ id: "dict.fields.type.abs.label" }),
  223. },
  224. {
  225. value: "ger",
  226. label: intl.formatMessage({ id: "dict.fields.type.ger.label" }),
  227. },
  228. {
  229. value: "inf",
  230. label: intl.formatMessage({ id: "dict.fields.type.inf.label" }),
  231. },
  232. ];
  233. const caseInd = [
  234. {
  235. value: "ind",
  236. label: intl.formatMessage({ id: "dict.fields.type.ind.label" }),
  237. },
  238. {
  239. value: "adv",
  240. label: intl.formatMessage({ id: "dict.fields.type.adv.label" }),
  241. },
  242. {
  243. value: "conj",
  244. label: intl.formatMessage({ id: "dict.fields.type.conj.label" }),
  245. },
  246. {
  247. value: "interj",
  248. label: intl.formatMessage({ id: "dict.fields.type.interj.label" }),
  249. },
  250. ];
  251. const caseOthers = [
  252. {
  253. value: "pre",
  254. label: intl.formatMessage({ id: "dict.fields.type.pre.label" }),
  255. },
  256. {
  257. value: "suf",
  258. label: intl.formatMessage({ id: "dict.fields.type.suf.label" }),
  259. },
  260. {
  261. value: "end",
  262. label: intl.formatMessage({ id: "dict.fields.type.end.label" }),
  263. },
  264. {
  265. value: "part",
  266. label: intl.formatMessage({ id: "dict.fields.type.part.label" }),
  267. },
  268. {
  269. value: "note",
  270. label: intl.formatMessage({ id: "dict.fields.type.note.label" }),
  271. },
  272. ];
  273. const caseVerb1 = [
  274. {
  275. value: "1p",
  276. label: intl.formatMessage({ id: "dict.fields.type.1p.label" }),
  277. children: caseVerb2,
  278. },
  279. {
  280. value: "2p",
  281. label: intl.formatMessage({ id: "dict.fields.type.2p.label" }),
  282. children: caseVerb2,
  283. },
  284. {
  285. value: "3p",
  286. label: intl.formatMessage({ id: "dict.fields.type.3p.label" }),
  287. children: caseVerb2,
  288. },
  289. {
  290. value: "ind",
  291. label: intl.formatMessage({ id: "dict.fields.type.ind.label" }),
  292. children: caseVerbInd,
  293. },
  294. {
  295. value: "base",
  296. label: intl.formatMessage({ id: "dict.fields.type.base.label" }),
  297. },
  298. ];
  299. const options: CascaderOption[] = [
  300. {
  301. value: "n",
  302. label: intl.formatMessage({ id: "dict.fields.type.n.label" }),
  303. children: case3_n,
  304. },
  305. {
  306. value: "ti",
  307. label: intl.formatMessage({ id: "dict.fields.type.ti.label" }),
  308. children: case3_ti,
  309. },
  310. {
  311. value: "v",
  312. label: intl.formatMessage({ id: "dict.fields.type.v.label" }),
  313. children: caseVerb1,
  314. },
  315. {
  316. value: "ind",
  317. label: intl.formatMessage({ id: "dict.fields.type.ind.label" }),
  318. children: caseInd,
  319. },
  320. {
  321. value: "pron",
  322. label: intl.formatMessage({ id: "dict.fields.type.pron.label" }),
  323. children: case3_pron,
  324. },
  325. {
  326. value: "num",
  327. label: intl.formatMessage({ id: "dict.fields.type.num.label" }),
  328. children: case3_num,
  329. },
  330. {
  331. value: "un",
  332. label: intl.formatMessage({ id: "dict.fields.type.un.label" }),
  333. },
  334. {
  335. value: "adj",
  336. label: intl.formatMessage({ id: "dict.fields.type.adj.label" }),
  337. children: case3_ti,
  338. },
  339. {
  340. value: "others",
  341. label: intl.formatMessage({ id: "dict.fields.type.others.label" }),
  342. children: caseOthers,
  343. },
  344. ];
  345. return (
  346. <Cascader
  347. disabled={readonly}
  348. value={currValue}
  349. options={options}
  350. placeholder="Please select case"
  351. onChange={(value?: (string | number)[]) => {
  352. console.log("case changed", value);
  353. if (typeof value === "undefined") {
  354. if (typeof onCaseChange !== "undefined") {
  355. onCaseChange("");
  356. }
  357. return;
  358. }
  359. let newValue: (string | number)[];
  360. if (
  361. value.length > 1 &&
  362. value[value.length - 1] === value[value.length - 2]
  363. ) {
  364. newValue = value.slice(0, -1);
  365. } else {
  366. newValue = value;
  367. }
  368. setCurrValue(newValue);
  369. if (typeof onCaseChange !== "undefined") {
  370. let output = newValue.map((item) => `.${item}.`).join("$");
  371. output = output.replace(".$.base", ":base").replace(".$.ind", ":ind");
  372. if (output.indexOf("$") > 0) {
  373. output =
  374. output.substring(0, output.indexOf("$")) +
  375. "#" +
  376. output.substring(output.indexOf("$") + 1);
  377. } else {
  378. output += "#";
  379. }
  380. onCaseChange(output);
  381. }
  382. }}
  383. />
  384. );
  385. };
  386. export default SelectCaseWidget;