@uva-glass/component-library 3.54.3 → 3.55.1

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.
Files changed (74) hide show
  1. package/dist/{Lexical.prod-A4JuKqM3.js → Lexical.prod-o6Eq_uLx.js} +27 -27
  2. package/dist/{Lexical.prod-A4JuKqM3.js.map → Lexical.prod-o6Eq_uLx.js.map} +1 -1
  3. package/dist/{LexicalClipboard.prod-CoyZP29w.js → LexicalClipboard.prod-CnUrf2_p.js} +20 -20
  4. package/dist/{LexicalClipboard.prod-CoyZP29w.js.map → LexicalClipboard.prod-CnUrf2_p.js.map} +1 -1
  5. package/dist/{LexicalExtension.prod-DFPuTMk1.js → LexicalExtension.prod-CanXuzFO.js} +19 -19
  6. package/dist/{LexicalExtension.prod-DFPuTMk1.js.map → LexicalExtension.prod-CanXuzFO.js.map} +1 -1
  7. package/dist/{LexicalLink.prod-Dp06n3Hn.js → LexicalLink.prod-DAVbKER8.js} +4 -4
  8. package/dist/{LexicalLink.prod-Dp06n3Hn.js.map → LexicalLink.prod-DAVbKER8.js.map} +1 -1
  9. package/dist/{LexicalList.prod-D3TdO_Pq.js → LexicalList.prod-C6cknPBV.js} +4 -4
  10. package/dist/{LexicalList.prod-D3TdO_Pq.js.map → LexicalList.prod-C6cknPBV.js.map} +1 -1
  11. package/dist/{LexicalSelection.prod-BapitO0n.js → LexicalSelection.prod-B8GGrzJ3.js} +18 -18
  12. package/dist/{LexicalSelection.prod-BapitO0n.js.map → LexicalSelection.prod-B8GGrzJ3.js.map} +1 -1
  13. package/dist/{LexicalTable.prod-bzYpvqMi.js → LexicalTable.prod-upbwOtcE.js} +5 -5
  14. package/dist/{LexicalTable.prod-bzYpvqMi.js.map → LexicalTable.prod-upbwOtcE.js.map} +1 -1
  15. package/dist/{LexicalUtils.prod-CAsHFX57.js → LexicalUtils.prod-CF7x-KWm.js} +5 -5
  16. package/dist/{LexicalUtils.prod-CAsHFX57.js.map → LexicalUtils.prod-CF7x-KWm.js.map} +1 -1
  17. package/dist/RteEditor.module-CoTOIw5i.js +41 -0
  18. package/dist/RteEditor.module-CoTOIw5i.js.map +1 -0
  19. package/dist/{TableCellResizerPlugin-ffA1s2mD.js → TableCellResizerPlugin-qMtSAoKT.js} +4 -4
  20. package/dist/{TableCellResizerPlugin-ffA1s2mD.js.map → TableCellResizerPlugin-qMtSAoKT.js.map} +1 -1
  21. package/dist/{TablePlugin-CzmrXpxk.js → TablePlugin-BRZcXq73.js} +28 -28
  22. package/dist/{TablePlugin-CzmrXpxk.js.map → TablePlugin-BRZcXq73.js.map} +1 -1
  23. package/dist/assets/RteEditor.css +1 -1
  24. package/dist/components/CheckboxTree/CheckboxTree.js +1 -1
  25. package/dist/components/FormInput/FormInput.js +1 -1
  26. package/dist/components/Icon/icons/index.d.ts +24 -0
  27. package/dist/components/Icon/icons/index.js +207 -187
  28. package/dist/components/Icon/icons/index.js.map +1 -1
  29. package/dist/components/InputField/InputField.stories.js +1 -1
  30. package/dist/components/MultiSelect/MultiSelect.js +1 -1
  31. package/dist/components/MultiSelect/MultiSelect.stories.js +1 -1
  32. package/dist/components/MultiSelect/components/MultiSelectHeader.js +1 -1
  33. package/dist/components/MultiSelect/index.js +1 -1
  34. package/dist/components/PeriodSelector/PeriodSelector.js +1 -1
  35. package/dist/components/Periods/Periods.d.ts +1 -1
  36. package/dist/components/Periods/Periods.js.map +1 -1
  37. package/dist/components/ProgrammeCard/ProgrammeCard.stories.js +1 -1
  38. package/dist/components/RadioTabSelector/RadioTabSelector.js +1 -1
  39. package/dist/components/RteEditor/EditorHeader/EditorHeader.js +1 -1
  40. package/dist/components/RteEditor/Plugins/BlockFormatPlugin/BlockFormatPlugin.js +2 -2
  41. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js +108 -105
  42. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js.map +1 -1
  43. package/dist/components/RteEditor/Plugins/HistoryPlugin/HistoryPlugin.js +3 -3
  44. package/dist/components/RteEditor/Plugins/LinkPlugin/AddLinkForm/AddLinkFrom.js +1 -1
  45. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js +35 -31
  46. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js.map +1 -1
  47. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkPlugin.js +121 -118
  48. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkPlugin.js.map +1 -1
  49. package/dist/components/RteEditor/Plugins/LinkPlugin/helpers.js +1 -1
  50. package/dist/components/RteEditor/Plugins/ListPlugin/ListPlugin.js +12 -12
  51. package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/PasteHandlerPlugin.js +5 -5
  52. package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/TableCellResizerPlugin.js +4 -4
  53. package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/index.js +1 -1
  54. package/dist/components/RteEditor/Plugins/TablePlugin/AddTableFrom.js +1 -1
  55. package/dist/components/RteEditor/Plugins/TablePlugin/TablePlugin.js +5 -5
  56. package/dist/components/RteEditor/Plugins/TablePlugin/helpers.js +2 -2
  57. package/dist/components/RteEditor/Plugins/TablePlugin/index.js +1 -1
  58. package/dist/components/RteEditor/Plugins/ToolbarPlugin/ToolbarPlugin.js +70 -65
  59. package/dist/components/RteEditor/Plugins/ToolbarPlugin/ToolbarPlugin.js.map +1 -1
  60. package/dist/components/RteEditor/Plugins/index.js +2 -2
  61. package/dist/components/RteEditor/RteEditor.d.ts +4 -2
  62. package/dist/components/RteEditor/RteEditor.js +218 -215
  63. package/dist/components/RteEditor/RteEditor.js.map +1 -1
  64. package/dist/components/RteEditor/RteEditor.stories.js +23 -19
  65. package/dist/components/RteEditor/RteEditor.stories.js.map +1 -1
  66. package/dist/components/RteEditor/UvaTheme/UvaTheme.js +1 -1
  67. package/dist/components/RteEditor/helpers.js +4 -4
  68. package/dist/components/RteEditor/nodes/CourseCatalogueNode/CourseCatalogueNode.js +2 -2
  69. package/dist/components/RteEditor/nodes/TableWrapperNode/TableWrapperNode.js +3 -3
  70. package/dist/components/index.js +1 -1
  71. package/dist/index.js +1 -1
  72. package/package.json +18 -18
  73. package/dist/RteEditor.module-DaBh86FK.js +0 -41
  74. package/dist/RteEditor.module-DaBh86FK.js.map +0 -1
@@ -17,7 +17,7 @@ import "../GridRow/GridRow.js";
17
17
  import "../IconButton/IconButton.js";
18
18
  import "../Input/Input.js";
19
19
  import "react-router";
20
- import "../../TablePlugin-CzmrXpxk.js";
20
+ import "../../TablePlugin-BRZcXq73.js";
21
21
  import "../RteEditor/Providers/LanguageProvider.js";
22
22
  import "../RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js";
23
23
  import "../RteEditor/hooks/components/Flyout.js";
@@ -1,7 +1,7 @@
1
1
  import "react/jsx-runtime";
2
2
  import "../../clsx-OuTLNxxd.js";
3
3
  import "../../MultiSelectItem-BzBmsKof.js";
4
- import { M as p } from "../../TablePlugin-CzmrXpxk.js";
4
+ import { M as p } from "../../TablePlugin-BRZcXq73.js";
5
5
  export {
6
6
  p as MultiSelect
7
7
  };
@@ -1,7 +1,7 @@
1
1
  import { jsxs as S, jsx as r } from "react/jsx-runtime";
2
2
  import { f as d } from "../../index-B_q_4aBT.js";
3
3
  import { useState as p } from "react";
4
- import { M as e } from "../../TablePlugin-CzmrXpxk.js";
4
+ import { M as e } from "../../TablePlugin-BRZcXq73.js";
5
5
  import { Container as M } from "../../storyComponents/Container/Container.js";
6
6
  const C = `
7
7
  // MultiSelectHeader can be added optionally
@@ -16,7 +16,7 @@ import "../../IconButton/IconButton.js";
16
16
  import "../../Input/Input.js";
17
17
  import "../../InputField/InputField.js";
18
18
  import "react-router";
19
- import { a as C } from "../../../TablePlugin-CzmrXpxk.js";
19
+ import { a as C } from "../../../TablePlugin-BRZcXq73.js";
20
20
  import "../../RteEditor/Providers/LanguageProvider.js";
21
21
  import "../../RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js";
22
22
  import "../../RteEditor/hooks/components/Flyout.js";
@@ -1,4 +1,4 @@
1
- import { M as l } from "../../TablePlugin-CzmrXpxk.js";
1
+ import { M as l } from "../../TablePlugin-BRZcXq73.js";
2
2
  export {
3
3
  l as MultiSelect
4
4
  };
@@ -18,7 +18,7 @@ import "../Input/Input.js";
18
18
  import "../InputField/InputField.js";
19
19
  import { Label as I } from "../Label/Label.js";
20
20
  import "react-router";
21
- import "../../TablePlugin-CzmrXpxk.js";
21
+ import "../../TablePlugin-BRZcXq73.js";
22
22
  import "../RteEditor/Providers/LanguageProvider.js";
23
23
  import "../RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js";
24
24
  import "../RteEditor/hooks/components/Flyout.js";
@@ -13,7 +13,7 @@ export interface PeriodsProps {
13
13
  /** Indicates which periods are selected. */
14
14
  periods: Period[] | number[];
15
15
  /** Indicates the maximum number of periods to show in the selector. */
16
- maxPeriods?: 6 | 7;
16
+ maxPeriods?: 3 | 6 | 7;
17
17
  /** A object of translations for the tooltip. */
18
18
  tooltipTranslations?: TooltipTranslations;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Periods.js","sources":["../../../src/components/Periods/Periods.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useId } from 'react';\n\nimport styles from './Periods.module.css';\n\ninterface Period {\n id: string;\n number: number;\n semesterNumber: number;\n periodInSemester: number;\n}\n\ninterface TooltipTranslations {\n period: string;\n periods: string;\n and: string;\n}\n\nexport interface PeriodsProps {\n /** Indicates which periods are selected. */\n periods: Period[] | number[];\n /** Indicates the maximum number of periods to show in the selector. */\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxPeriods?: 6 | 7;\n /** A object of translations for the tooltip. */\n tooltipTranslations?: TooltipTranslations;\n}\n\nconst MAX_PERIODS = 6;\n\n/** Represents a component for a period indicator. */\nexport const Periods = ({ periods, tooltipTranslations, maxPeriods = MAX_PERIODS }: PeriodsProps) => {\n const maxPeriodsList = Array.from({ length: maxPeriods }, (_, index) => index + 1);\n const idPrefix = useId();\n\n const isArrayOfNumbers = periods.some((value) => {\n return typeof value === 'number';\n });\n\n const getTitles = (tooltipTranslations: TooltipTranslations): string => {\n const semesterPeriods: Record<number, number[]> = {};\n\n // Group periods by semester\n isArrayOfNumbers\n ? periods.forEach((period) => {\n if (typeof period === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n const groupKey = Math.ceil(period / 3); // Determine the semester (1, 2, or 3)\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n const mappedValue = ((period - 1) % 3) + 1; // Map period to semester\n\n if (!semesterPeriods[groupKey]) {\n semesterPeriods[groupKey] = [];\n }\n semesterPeriods[groupKey].push(mappedValue);\n }\n })\n : periods.forEach((period) => {\n const { semesterNumber, periodInSemester } = period as Period;\n\n if (!semesterPeriods[semesterNumber]) {\n semesterPeriods[semesterNumber] = [];\n }\n semesterPeriods[semesterNumber].push(periodInSemester);\n });\n\n // Build the title string\n const title = Object.keys(semesterPeriods).reduce((acc, semesterKey, index) => {\n const semesterNumber = Number(semesterKey);\n const periodsInSemester = semesterPeriods[semesterNumber];\n let periodTitle = '';\n\n // Determine if we need singular or plural form for \"period\"\n const blokLabel = periodsInSemester.length > 1 ? tooltipTranslations.periods : tooltipTranslations.period;\n\n // Build period sequence for the current semester\n if (periodsInSemester.length > 1) {\n const lastPeriod = periodsInSemester.pop();\n periodTitle = `Semester ${semesterNumber} ${blokLabel} ${periodsInSemester.join(', ')} ${tooltipTranslations.and} ${lastPeriod}`;\n } else {\n periodTitle = `Semester ${semesterNumber} ${blokLabel} ${periodsInSemester[0]}`;\n }\n\n // Add proper spacing and periods\n return `${acc}${index > 0 ? '. ' : ''}${periodTitle}`;\n }, '');\n\n return title.trim() + '.';\n };\n\n const isPeriodActive = (periodIndex: number): boolean => {\n if (isArrayOfNumbers) {\n return (periods as number[]).includes(periodIndex);\n } else {\n return periods.find((period) => (period as Period).number === periodIndex) ? true : false;\n }\n };\n\n return (\n <div className={styles['periods__container']} title={tooltipTranslations ? getTitles(tooltipTranslations) : ''}>\n {maxPeriodsList.map((periodIndex) => {\n return (\n <span\n className={clsx(\n styles['periods__item'],\n isPeriodActive(periodIndex) ? styles['periods__item--active'] : ''\n )}\n data-period-item\n key={`${idPrefix}-${periodIndex}`}\n />\n );\n })}\n </div>\n );\n};\n"],"names":["MAX_PERIODS","Periods","periods","tooltipTranslations","maxPeriods","maxPeriodsList","_","index","idPrefix","useId","isArrayOfNumbers","value","getTitles","semesterPeriods","period","groupKey","mappedValue","semesterNumber","periodInSemester","acc","semesterKey","periodsInSemester","periodTitle","blokLabel","lastPeriod","isPeriodActive","periodIndex","jsx","styles","clsx"],"mappings":";;;;;;;GA4BMA,IAAc,GAGPC,IAAU,CAAC,EAAE,SAAAC,GAAS,qBAAAC,GAAqB,YAAAC,IAAaJ,QAAgC;AACnG,QAAMK,IAAiB,MAAM,KAAK,EAAE,QAAQD,EAAA,GAAc,CAACE,GAAGC,MAAUA,IAAQ,CAAC,GAC3EC,IAAWC,EAAA,GAEXC,IAAmBR,EAAQ,KAAK,CAACS,MAC9B,OAAOA,KAAU,QACzB,GAEKC,IAAY,CAACT,MAAqD;AACtE,UAAMU,IAA4C,CAAA;AAGlD,WAAAH,IACIR,EAAQ,QAAQ,CAACY,MAAW;AAC1B,UAAI,OAAOA,KAAW,UAAU;AAE9B,cAAMC,IAAW,KAAK,KAAKD,IAAS,CAAC,GAE/BE,KAAgBF,IAAS,KAAK,IAAK;AAEzC,QAAKD,EAAgBE,CAAQ,MAC3BF,EAAgBE,CAAQ,IAAI,CAAA,IAE9BF,EAAgBE,CAAQ,EAAE,KAAKC,CAAW;AAAA,MAC5C;AAAA,IACF,CAAC,IACDd,EAAQ,QAAQ,CAACY,MAAW;AAC1B,YAAM,EAAE,gBAAAG,GAAgB,kBAAAC,EAAA,IAAqBJ;AAE7C,MAAKD,EAAgBI,CAAc,MACjCJ,EAAgBI,CAAc,IAAI,CAAA,IAEpCJ,EAAgBI,CAAc,EAAE,KAAKC,CAAgB;AAAA,IACvD,CAAC,GAGS,OAAO,KAAKL,CAAe,EAAE,OAAO,CAACM,GAAKC,GAAab,MAAU;AAC7E,YAAMU,IAAiB,OAAOG,CAAW,GACnCC,IAAoBR,EAAgBI,CAAc;AACxD,UAAIK,IAAc;AAGlB,YAAMC,IAAYF,EAAkB,SAAS,IAAIlB,EAAoB,UAAUA,EAAoB;AAGnG,UAAIkB,EAAkB,SAAS,GAAG;AAChC,cAAMG,IAAaH,EAAkB,IAAA;AACrC,QAAAC,IAAc,YAAYL,CAAc,IAAIM,CAAS,IAAIF,EAAkB,KAAK,IAAI,CAAC,IAAIlB,EAAoB,GAAG,IAAIqB,CAAU;AAAA,MAChI;AACE,QAAAF,IAAc,YAAYL,CAAc,IAAIM,CAAS,IAAIF,EAAkB,CAAC,CAAC;AAI/E,aAAO,GAAGF,CAAG,GAAGZ,IAAQ,IAAI,OAAO,EAAE,GAAGe,CAAW;AAAA,IACrD,GAAG,EAAE,EAEQ,SAAS;AAAA,EACxB,GAEMG,IAAiB,CAACC,MAClBhB,IACMR,EAAqB,SAASwB,CAAW,IAE1C,EAAAxB,EAAQ,KAAK,CAACY,MAAYA,EAAkB,WAAWY,CAAW;AAI7E,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAO,oBAAuB,OAAOzB,IAAsBS,EAAUT,CAAmB,IAAI,IACzG,UAAAE,EAAe,IAAI,CAACqB,MAEjB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWE;AAAA,QACTD,EAAO;AAAA,QACPH,EAAeC,CAAW,IAAIE,EAAO,uBAAuB,IAAI;AAAA,MAAA;AAAA,MAElE,oBAAgB;AAAA,IAAA;AAAA,IACX,GAAGpB,CAAQ,IAAIkB,CAAW;AAAA,EAAA,CAGpC,EAAA,CACH;AAEJ;"}
1
+ {"version":3,"file":"Periods.js","sources":["../../../src/components/Periods/Periods.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useId } from 'react';\n\nimport styles from './Periods.module.css';\n\ninterface Period {\n id: string;\n number: number;\n semesterNumber: number;\n periodInSemester: number;\n}\n\ninterface TooltipTranslations {\n period: string;\n periods: string;\n and: string;\n}\n\nexport interface PeriodsProps {\n /** Indicates which periods are selected. */\n periods: Period[] | number[];\n /** Indicates the maximum number of periods to show in the selector. */\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxPeriods?: 3 | 6 | 7;\n /** A object of translations for the tooltip. */\n tooltipTranslations?: TooltipTranslations;\n}\n\nconst MAX_PERIODS = 6;\n\n/** Represents a component for a period indicator. */\nexport const Periods = ({ periods, tooltipTranslations, maxPeriods = MAX_PERIODS }: PeriodsProps) => {\n const maxPeriodsList = Array.from({ length: maxPeriods }, (_, index) => index + 1);\n const idPrefix = useId();\n\n const isArrayOfNumbers = periods.some((value) => {\n return typeof value === 'number';\n });\n\n const getTitles = (tooltipTranslations: TooltipTranslations): string => {\n const semesterPeriods: Record<number, number[]> = {};\n\n // Group periods by semester\n isArrayOfNumbers\n ? periods.forEach((period) => {\n if (typeof period === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n const groupKey = Math.ceil(period / 3); // Determine the semester (1, 2, or 3)\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n const mappedValue = ((period - 1) % 3) + 1; // Map period to semester\n\n if (!semesterPeriods[groupKey]) {\n semesterPeriods[groupKey] = [];\n }\n semesterPeriods[groupKey].push(mappedValue);\n }\n })\n : periods.forEach((period) => {\n const { semesterNumber, periodInSemester } = period as Period;\n\n if (!semesterPeriods[semesterNumber]) {\n semesterPeriods[semesterNumber] = [];\n }\n semesterPeriods[semesterNumber].push(periodInSemester);\n });\n\n // Build the title string\n const title = Object.keys(semesterPeriods).reduce((acc, semesterKey, index) => {\n const semesterNumber = Number(semesterKey);\n const periodsInSemester = semesterPeriods[semesterNumber];\n let periodTitle = '';\n\n // Determine if we need singular or plural form for \"period\"\n const blokLabel = periodsInSemester.length > 1 ? tooltipTranslations.periods : tooltipTranslations.period;\n\n // Build period sequence for the current semester\n if (periodsInSemester.length > 1) {\n const lastPeriod = periodsInSemester.pop();\n periodTitle = `Semester ${semesterNumber} ${blokLabel} ${periodsInSemester.join(', ')} ${tooltipTranslations.and} ${lastPeriod}`;\n } else {\n periodTitle = `Semester ${semesterNumber} ${blokLabel} ${periodsInSemester[0]}`;\n }\n\n // Add proper spacing and periods\n return `${acc}${index > 0 ? '. ' : ''}${periodTitle}`;\n }, '');\n\n return title.trim() + '.';\n };\n\n const isPeriodActive = (periodIndex: number): boolean => {\n if (isArrayOfNumbers) {\n return (periods as number[]).includes(periodIndex);\n } else {\n return periods.find((period) => (period as Period).number === periodIndex) ? true : false;\n }\n };\n\n return (\n <div className={styles['periods__container']} title={tooltipTranslations ? getTitles(tooltipTranslations) : ''}>\n {maxPeriodsList.map((periodIndex) => {\n return (\n <span\n className={clsx(\n styles['periods__item'],\n isPeriodActive(periodIndex) ? styles['periods__item--active'] : ''\n )}\n data-period-item\n key={`${idPrefix}-${periodIndex}`}\n />\n );\n })}\n </div>\n );\n};\n"],"names":["MAX_PERIODS","Periods","periods","tooltipTranslations","maxPeriods","maxPeriodsList","_","index","idPrefix","useId","isArrayOfNumbers","value","getTitles","semesterPeriods","period","groupKey","mappedValue","semesterNumber","periodInSemester","acc","semesterKey","periodsInSemester","periodTitle","blokLabel","lastPeriod","isPeriodActive","periodIndex","jsx","styles","clsx"],"mappings":";;;;;;;GA4BMA,IAAc,GAGPC,IAAU,CAAC,EAAE,SAAAC,GAAS,qBAAAC,GAAqB,YAAAC,IAAaJ,QAAgC;AACnG,QAAMK,IAAiB,MAAM,KAAK,EAAE,QAAQD,EAAA,GAAc,CAACE,GAAGC,MAAUA,IAAQ,CAAC,GAC3EC,IAAWC,EAAA,GAEXC,IAAmBR,EAAQ,KAAK,CAACS,MAC9B,OAAOA,KAAU,QACzB,GAEKC,IAAY,CAACT,MAAqD;AACtE,UAAMU,IAA4C,CAAA;AAGlD,WAAAH,IACIR,EAAQ,QAAQ,CAACY,MAAW;AAC1B,UAAI,OAAOA,KAAW,UAAU;AAE9B,cAAMC,IAAW,KAAK,KAAKD,IAAS,CAAC,GAE/BE,KAAgBF,IAAS,KAAK,IAAK;AAEzC,QAAKD,EAAgBE,CAAQ,MAC3BF,EAAgBE,CAAQ,IAAI,CAAA,IAE9BF,EAAgBE,CAAQ,EAAE,KAAKC,CAAW;AAAA,MAC5C;AAAA,IACF,CAAC,IACDd,EAAQ,QAAQ,CAACY,MAAW;AAC1B,YAAM,EAAE,gBAAAG,GAAgB,kBAAAC,EAAA,IAAqBJ;AAE7C,MAAKD,EAAgBI,CAAc,MACjCJ,EAAgBI,CAAc,IAAI,CAAA,IAEpCJ,EAAgBI,CAAc,EAAE,KAAKC,CAAgB;AAAA,IACvD,CAAC,GAGS,OAAO,KAAKL,CAAe,EAAE,OAAO,CAACM,GAAKC,GAAab,MAAU;AAC7E,YAAMU,IAAiB,OAAOG,CAAW,GACnCC,IAAoBR,EAAgBI,CAAc;AACxD,UAAIK,IAAc;AAGlB,YAAMC,IAAYF,EAAkB,SAAS,IAAIlB,EAAoB,UAAUA,EAAoB;AAGnG,UAAIkB,EAAkB,SAAS,GAAG;AAChC,cAAMG,IAAaH,EAAkB,IAAA;AACrC,QAAAC,IAAc,YAAYL,CAAc,IAAIM,CAAS,IAAIF,EAAkB,KAAK,IAAI,CAAC,IAAIlB,EAAoB,GAAG,IAAIqB,CAAU;AAAA,MAChI;AACE,QAAAF,IAAc,YAAYL,CAAc,IAAIM,CAAS,IAAIF,EAAkB,CAAC,CAAC;AAI/E,aAAO,GAAGF,CAAG,GAAGZ,IAAQ,IAAI,OAAO,EAAE,GAAGe,CAAW;AAAA,IACrD,GAAG,EAAE,EAEQ,SAAS;AAAA,EACxB,GAEMG,IAAiB,CAACC,MAClBhB,IACMR,EAAqB,SAASwB,CAAW,IAE1C,EAAAxB,EAAQ,KAAK,CAACY,MAAYA,EAAkB,WAAWY,CAAW;AAI7E,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAO,oBAAuB,OAAOzB,IAAsBS,EAAUT,CAAmB,IAAI,IACzG,UAAAE,EAAe,IAAI,CAACqB,MAEjB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWE;AAAA,QACTD,EAAO;AAAA,QACPH,EAAeC,CAAW,IAAIE,EAAO,uBAAuB,IAAI;AAAA,MAAA;AAAA,MAElE,oBAAgB;AAAA,IAAA;AAAA,IACX,GAAGpB,CAAQ,IAAIkB,CAAW;AAAA,EAAA,CAGpC,EAAA,CACH;AAEJ;"}
@@ -18,7 +18,7 @@ import "../GridRow/GridRow.js";
18
18
  import "../IconButton/IconButton.js";
19
19
  import "../Input/Input.js";
20
20
  import "../InputField/InputField.js";
21
- import "../../TablePlugin-CzmrXpxk.js";
21
+ import "../../TablePlugin-BRZcXq73.js";
22
22
  import "../RteEditor/Providers/LanguageProvider.js";
23
23
  import "../RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js";
24
24
  import "../RteEditor/hooks/components/Flyout.js";
@@ -18,7 +18,7 @@ import "../IconButton/IconButton.js";
18
18
  import "../Input/Input.js";
19
19
  import "../InputField/InputField.js";
20
20
  import "react-router";
21
- import "../../TablePlugin-CzmrXpxk.js";
21
+ import "../../TablePlugin-BRZcXq73.js";
22
22
  import "../RteEditor/Providers/LanguageProvider.js";
23
23
  import "../RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js";
24
24
  import "../RteEditor/hooks/components/Flyout.js";
@@ -15,7 +15,7 @@ import "../../IconButton/IconButton.js";
15
15
  import "../../Input/Input.js";
16
16
  import "../../InputField/InputField.js";
17
17
  import "react-router";
18
- import "../../../TablePlugin-CzmrXpxk.js";
18
+ import "../../../TablePlugin-BRZcXq73.js";
19
19
  import "../Providers/LanguageProvider.js";
20
20
  import "../Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js";
21
21
  import "../hooks/components/Flyout.js";
@@ -1,10 +1,10 @@
1
1
  import { jsx as s } from "react/jsx-runtime";
2
2
  import { o as u } from "../../../../LexicalComposerContext.prod-DOyoZx0P.js";
3
3
  import { c as f } from "../../../../clsx-OuTLNxxd.js";
4
- import { $ as _, w as p, a8 as h } from "../../../../Lexical.prod-A4JuKqM3.js";
4
+ import { $ as _, w as p, a8 as h } from "../../../../Lexical.prod-o6Eq_uLx.js";
5
5
  import { useState as l, useEffect as k } from "react";
6
6
  import { Icon as I } from "../../../Icon/Icon.js";
7
- import { s as a } from "../../../../RteEditor.module-DaBh86FK.js";
7
+ import { s as a } from "../../../../RteEditor.module-CoTOIw5i.js";
8
8
  import { useTranslation as B } from "../../hooks/useTranslation.js";
9
9
  const C = {
10
10
  bold: "Bold",
@@ -1,89 +1,88 @@
1
- import { jsx as y, jsxs as O } from "react/jsx-runtime";
2
- import { useState as k, useRef as L, useEffect as E } from "react";
1
+ import { jsx as y, jsxs as U } from "react/jsx-runtime";
2
+ import { useState as k, useRef as _, useEffect as x } from "react";
3
3
  import { c as z } from "../../../../clsx-OuTLNxxd.js";
4
- import { o as q } from "../../../../LexicalComposerContext.prod-DOyoZx0P.js";
5
- import { aO as I, ap as P, $ as T, w as x, y as U, p as S, aP as X, H as Y, ag as Z, m as ee } from "../../../../Lexical.prod-A4JuKqM3.js";
6
- import { v } from "../../../../LexicalUtils.prod-CAsHFX57.js";
7
- import { AddCatalogueLinkForm as te } from "./AddCatalogueLinkForm/AddCatalogueLinkForm.js";
8
- import { s as l } from "../../../../RteEditor.module-DaBh86FK.js";
9
- import { useTranslation as oe } from "../../hooks/useTranslation.js";
10
- import { CourseCatalogueNode as b, $getLinkTypeFromNode as H, REMOVE_COURSE_CATALOGUE_LINK as re, INSERT_COURSE_CATALOGUE_LINK as ne } from "../../nodes/CourseCatalogueNode/CourseCatalogueNode.js";
11
- import { useOnClickOutside as se } from "../../../hooks/useOnClickOutside.js";
12
- import { setScrollableContainers as F, removeScrollableContainers as ae } from "../../helpers.js";
13
- const ke = ({
14
- onSearch: A,
15
- searchResponse: $,
16
- parentScrollPosition: j
4
+ import { o as X } from "../../../../LexicalComposerContext.prod-DOyoZx0P.js";
5
+ import { ap as S, aq as H, $ as A, w as E, y as P, p as D, aP as Y, H as F, e as Z, ag as ee, m as te } from "../../../../Lexical.prod-o6Eq_uLx.js";
6
+ import { v as K } from "../../../../LexicalUtils.prod-CF7x-KWm.js";
7
+ import { AddCatalogueLinkForm as oe } from "./AddCatalogueLinkForm/AddCatalogueLinkForm.js";
8
+ import { s as c } from "../../../../RteEditor.module-CoTOIw5i.js";
9
+ import { useTranslation as re } from "../../hooks/useTranslation.js";
10
+ import { CourseCatalogueNode as b, $getLinkTypeFromNode as $, REMOVE_COURSE_CATALOGUE_LINK as se, INSERT_COURSE_CATALOGUE_LINK as ne } from "../../nodes/CourseCatalogueNode/CourseCatalogueNode.js";
11
+ import { useOnClickOutside as ae } from "../../../hooks/useOnClickOutside.js";
12
+ const Ce = ({
13
+ onSearch: R,
14
+ searchResponse: j,
15
+ parentScrollPosition: G
17
16
  }) => {
18
- const [s] = q(), m = oe(), [G, _] = k(!1), [M, w] = k(!1), D = L(null), K = L(null), R = L(null), [d, h] = k(null), [B, V] = k("course"), W = L(d !== null), C = (c) => {
19
- V(c);
20
- const r = c === "course" ? D.current?.getBoundingClientRect() : K.current?.getBoundingClientRect();
21
- r && h({ top: r.bottom, left: r.left });
22
- }, p = () => {
23
- A("", B), h(null);
17
+ const [s] = X(), f = re(), [M, h] = k(!1), [V, L] = k(!1), B = _(null), w = _(null), O = _(null), [m, N] = k(null), [v, W] = k("course"), q = _(m !== null), C = (n) => {
18
+ W(n);
19
+ const l = n === "course" ? B.current?.getBoundingClientRect() : w.current?.getBoundingClientRect();
20
+ l && N({ top: l.bottom, left: l.left });
21
+ }, d = () => {
22
+ R("", v), N(null);
24
23
  };
25
- return E(() => {
26
- const c = s.registerCommand(
27
- I,
24
+ x(() => {
25
+ const n = s.registerCommand(
26
+ S,
28
27
  (e) => e.ctrlKey && e.shiftKey && e.altKey && e.key === "C" ? (e.preventDefault(), C("course"), !0) : e.ctrlKey && e.shiftKey && e.altKey && e.key === "P" ? (e.preventDefault(), C("programme"), !0) : !1,
29
- P
30
- ), r = s.registerUpdateListener(({ editorState: e }) => {
28
+ H
29
+ ), l = s.registerUpdateListener(({ editorState: e }) => {
31
30
  e.read(() => {
32
- const n = T();
33
- if (x(n)) {
34
- const t = n.anchor.getNode(), a = n.anchor.offset;
35
- if (U(t) && a === t.getTextContentSize() && t.getNextSibling() instanceof b) {
31
+ const r = A();
32
+ if (E(r)) {
33
+ const t = r.anchor.getNode(), a = r.anchor.offset;
34
+ if (P(t) && a === t.getTextContentSize() && t.getNextSibling() instanceof b) {
36
35
  const o = t.getNextSibling();
37
36
  if (o) {
38
- const g = H(o);
39
- _(g === "course"), w(g === "programme");
37
+ const g = $(o);
38
+ h(g === "course"), L(g === "programme");
40
39
  return;
41
40
  }
42
41
  }
43
- const i = v(t, b);
42
+ const i = K(t, b);
44
43
  if (i) {
45
- const o = H(i);
46
- _(o === "course"), w(o === "programme");
44
+ const o = $(i);
45
+ h(o === "course"), L(o === "programme");
47
46
  return;
48
47
  }
49
- _(!1), w(!1);
48
+ h(!1), L(!1);
50
49
  }
51
50
  });
52
- }), u = (e) => {
53
- const n = Z(), t = e.getTextContentSize();
54
- n.setTextNodeRange(e, t, e, t), ee(n);
55
- }, N = (e, n) => U(e) && n === e.getTextContentSize() && e.getNextSibling() instanceof b, J = s.registerCommand(
56
- I,
51
+ }), p = (e) => {
52
+ const r = ee(), t = e.getTextContentSize();
53
+ r.setTextNodeRange(e, t, e, t), te(r);
54
+ }, T = (e, r) => P(e) && r === e.getTextContentSize() && e.getNextSibling() instanceof b, J = s.registerCommand(
55
+ S,
57
56
  (e) => {
58
- const n = T();
59
- if (x(n)) {
60
- const t = e.key, a = n.anchor.getNode(), i = n.anchor.offset;
61
- let o = v(a, b);
62
- if (N(a, i) && (o = a.getNextSibling()), !o)
57
+ const r = A();
58
+ if (E(r)) {
59
+ const t = e.key, a = r.anchor.getNode(), i = r.anchor.offset;
60
+ let o = K(a, b);
61
+ if (T(a, i) && (o = a.getNextSibling()), !o)
63
62
  return !1;
64
63
  const g = o?.getTextContentSize();
65
64
  if (o && e.key === "Enter")
66
65
  return e.preventDefault(), s.update(() => {
67
- if (N(a, i)) {
68
- const f = S(`
66
+ if (T(a, i)) {
67
+ const u = D(`
69
68
  `);
70
- o.insertBefore(f);
69
+ o.insertBefore(u);
71
70
  }
72
71
  if (i === g) {
73
- const f = S(`
72
+ const u = D(`
74
73
  `);
75
- o.insertAfter(f), u(f);
74
+ o.insertAfter(u), p(u);
76
75
  }
77
76
  }), !0;
78
77
  if (o && (t === " " || e.code === "Space"))
79
78
  return e.preventDefault(), s.update(() => {
80
- const f = S(" ");
81
- N(a, i) && (o.insertBefore(f), u(f)), i === g && (o.insertAfter(f), u(f));
79
+ const u = D(" ");
80
+ T(a, i) && (o.insertBefore(u), p(u)), i === g && (o.insertAfter(u), p(u));
82
81
  }), !0;
83
82
  if (o && (t === "Backspace" || t === "Delete"))
84
83
  return e.preventDefault(), s.update(
85
84
  () => {
86
- s.dispatchCommand(re, void 0);
85
+ s.dispatchCommand(se, void 0);
87
86
  },
88
87
  { discrete: !0 }
89
88
  ), !0;
@@ -92,13 +91,13 @@ const ke = ({
92
91
  }
93
92
  return !1;
94
93
  },
95
- P
94
+ H
96
95
  ), Q = s.registerCommand(
97
- X,
96
+ Y,
98
97
  (e) => {
99
- const n = T();
100
- if (x(n)) {
101
- const t = n.anchor.getNode(), a = v(t, b);
98
+ const r = A();
99
+ if (E(r)) {
100
+ const t = r.anchor.getNode(), a = K(t, b);
102
101
  if (a) {
103
102
  e.preventDefault();
104
103
  const i = s.getElementByKey(a.getKey());
@@ -107,78 +106,82 @@ const ke = ({
107
106
  }
108
107
  return !1;
109
108
  },
110
- Y
109
+ F
111
110
  );
112
111
  return () => {
113
- c(), r(), J(), Q();
112
+ n(), l(), J(), Q();
114
113
  };
115
- }, [s]), se(R, () => h(null)), E(() => {
116
- const c = (u) => (F(r), u.key === "Escape" && W.current && (u.preventDefault(), u.stopPropagation(), p()), !0);
117
- window.addEventListener("keydown", c, { capture: !0 });
118
- const r = () => {
119
- p();
120
- };
121
- return F(r), window.addEventListener("scroll", r), window.addEventListener("resize", r), () => {
122
- window.removeEventListener("keydown", c), window.removeEventListener("scroll", r), window.removeEventListener("resize", r), ae(r);
123
- };
124
- }, []), E(() => {
125
- d && p();
126
- }, [j]), /* @__PURE__ */ y("div", { className: l["editor__toolbar-button-group"], children: /* @__PURE__ */ O("div", { className: l["editor__toolbar-button-flyoutwrapper"], children: [
127
- /* @__PURE__ */ O("div", { className: l["editor__toolbar-button-group--text"], children: [
114
+ }, [s]), ae(O, () => N(null));
115
+ const I = () => {
116
+ d();
117
+ };
118
+ return x(() => Z(
119
+ s.registerCommand(
120
+ S,
121
+ (n) => n.key === "Escape" && q.current ? (n.preventDefault(), d(), !0) : !1,
122
+ F
123
+ ),
124
+ s.registerRootListener((n, l) => {
125
+ l && l.removeEventListener("scroll", I), n && n.addEventListener("scroll", I);
126
+ })
127
+ ), [s]), x(() => {
128
+ m && d();
129
+ }, [G]), /* @__PURE__ */ y("div", { className: c["editor__toolbar-button-group"], children: /* @__PURE__ */ U("div", { className: c["editor__toolbar-button-flyoutwrapper"], children: [
130
+ /* @__PURE__ */ U("div", { className: c["editor__toolbar-button-group--text"], children: [
128
131
  /* @__PURE__ */ y(
129
132
  "button",
130
133
  {
131
134
  onClick: () => C("course"),
132
- title: m.cataloguelinks.courseTooltip,
135
+ title: f.cataloguelinks.courseTooltip,
133
136
  className: z(
134
- l["editor__toolbar-button"],
135
- l["editor__toolbar-button--text"],
136
- G && l["editor__toolbar-button--active"]
137
+ c["editor__toolbar-button"],
138
+ c["editor__toolbar-button--text"],
139
+ M && c["editor__toolbar-button--active"]
137
140
  ),
138
- "aria-label": m.aria.labels.courselink,
139
- "aria-keyshortcuts": m.aria.keyshortcuts.courselink,
141
+ "aria-label": f.aria.labels.courselink,
142
+ "aria-keyshortcuts": f.aria.keyshortcuts.courselink,
140
143
  type: "button",
141
- ref: D,
142
- children: m.cataloguelinks.courseButtonLabel
144
+ ref: B,
145
+ children: f.cataloguelinks.courseButtonLabel
143
146
  }
144
147
  ),
145
148
  /* @__PURE__ */ y(
146
149
  "button",
147
150
  {
148
151
  onClick: () => C("programme"),
149
- title: m.cataloguelinks.programmeTooltip,
152
+ title: f.cataloguelinks.programmeTooltip,
150
153
  className: z(
151
- l["editor__toolbar-button"],
152
- l["editor__toolbar-button--text"],
153
- M && l["editor__toolbar-button--active"]
154
+ c["editor__toolbar-button"],
155
+ c["editor__toolbar-button--text"],
156
+ V && c["editor__toolbar-button--active"]
154
157
  ),
155
- "aria-label": m.aria.labels.programmelink,
156
- "aria-keyshortcuts": m.aria.keyshortcuts.programmelink,
158
+ "aria-label": f.aria.labels.programmelink,
159
+ "aria-keyshortcuts": f.aria.keyshortcuts.programmelink,
157
160
  type: "button",
158
- ref: K,
159
- children: m.cataloguelinks.programmeButtonLabel
161
+ ref: w,
162
+ children: f.cataloguelinks.programmeButtonLabel
160
163
  }
161
164
  )
162
165
  ] }),
163
- d && /* @__PURE__ */ y(
166
+ m && /* @__PURE__ */ y(
164
167
  "div",
165
168
  {
166
- className: l["editor__toolbar-flyout-wrapper"],
167
- style: { top: d.top, left: d.left },
168
- ref: R,
169
+ className: c["editor__toolbar-flyout-wrapper"],
170
+ style: { top: m.top, left: m.left },
171
+ ref: O,
169
172
  children: /* @__PURE__ */ y(
170
- te,
173
+ oe,
171
174
  {
172
- linkType: B,
173
- onCloseHandler: p,
174
- onSearchHandler: A,
175
- searchResponse: $,
176
- onSelect: (c, r, u) => {
175
+ linkType: v,
176
+ onCloseHandler: d,
177
+ onSearchHandler: R,
178
+ searchResponse: j,
179
+ onSelect: (n, l, p) => {
177
180
  s.dispatchCommand(ne, {
178
- linkType: u,
179
- code: c,
180
- label: r
181
- }), p();
181
+ linkType: p,
182
+ code: n,
183
+ label: l
184
+ }), d();
182
185
  }
183
186
  }
184
187
  )
@@ -187,6 +190,6 @@ const ke = ({
187
190
  ] }) });
188
191
  };
189
192
  export {
190
- ke as CourseCataloguePlugin
193
+ Ce as CourseCataloguePlugin
191
194
  };
192
195
  //# sourceMappingURL=CourseCataloguePlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CourseCataloguePlugin.js","sources":["../../../../../src/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n COPY_COMMAND,\r\n KEY_DOWN_COMMAND,\r\n} from 'lexical';\r\nimport { $getNearestNodeOfType } from '@lexical/utils';\r\n\r\nimport type { RefObject } from 'react';\r\nimport type { LexicalNode, TextNode } from 'lexical';\r\nimport type { SearchResponse } from './AddCatalogueLinkForm';\r\n\r\nimport { AddCatalogueLinkForm } from './AddCatalogueLinkForm';\r\n\r\nimport styles from 'components/RteEditor/RteEditor.module.css';\r\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\r\nimport {\r\n $getLinkTypeFromNode,\r\n CourseCatalogueNode,\r\n INSERT_COURSE_CATALOGUE_LINK,\r\n REMOVE_COURSE_CATALOGUE_LINK,\r\n} from 'components/RteEditor/nodes/CourseCatalogueNode';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\nimport { removeScrollableContainers, setScrollableContainers } from 'components/RteEditor/helpers';\r\n\r\ninterface CourseCataloguePluginProps {\r\n onSearch: (query: string, linkType: 'course' | 'programme') => void;\r\n searchResponse: SearchResponse;\r\n parentScrollPosition: number;\r\n}\r\n\r\nexport const CourseCataloguePlugin = ({\r\n onSearch,\r\n searchResponse,\r\n parentScrollPosition,\r\n}: CourseCataloguePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const t = useTranslation();\r\n const [courseIsActive, setCourseIsActive] = useState(false);\r\n const [programmeIsActive, setProgrammeIsActive] = useState(false);\r\n const courseButtonRef = useRef<HTMLButtonElement>(null);\r\n const programmeButtonRef = useRef<HTMLButtonElement>(null);\r\n const flyoutRef = useRef<HTMLDivElement>(null);\r\n const [flyoutPosition, setFlyoutPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [type, setType] = useState<'course' | 'programme'>('course');\r\n const isVisibleRef = useRef(flyoutPosition !== null);\r\n\r\n const openFlyout = (type: 'course' | 'programme') => {\r\n setType(type);\r\n const rect =\r\n type === 'course'\r\n ? courseButtonRef.current?.getBoundingClientRect()\r\n : programmeButtonRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n setFlyoutPosition({ top: rect.bottom, left: rect.left });\r\n }\r\n };\r\n\r\n const closeFlyout = () => {\r\n onSearch('', type);\r\n setFlyoutPosition(null);\r\n };\r\n\r\n useEffect(() => {\r\n const removeKeyboardShortcut = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'C') {\r\n event.preventDefault();\r\n openFlyout('course');\r\n return true;\r\n }\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'P') {\r\n event.preventDefault();\r\n openFlyout('programme');\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n\r\n if (\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode\r\n ) {\r\n // Cursor staat aan het begin van de link!\r\n const courseCatalogueLink = anchorNode.getNextSibling();\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n }\r\n\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n setCourseIsActive(false);\r\n setProgrammeIsActive(false);\r\n }\r\n });\r\n });\r\n\r\n const moveToEndOfWhiteSpace = (whiteSpace: TextNode) => {\r\n const selection = $createRangeSelection();\r\n const endOffset = whiteSpace.getTextContentSize();\r\n selection.setTextNodeRange(whiteSpace, endOffset, whiteSpace, endOffset);\r\n $setSelection(selection);\r\n };\r\n\r\n const isCursorBeforeLink = (anchorNode: LexicalNode, offset: number) =>\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode;\r\n\r\n const removeUnEditable = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const key = event.key;\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n let courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n\r\n // Detect if cursor is right before the link\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink = anchorNode.getNextSibling();\r\n }\r\n\r\n if (!courseCatalogueLink) {\r\n return false;\r\n }\r\n\r\n const nodeLength = courseCatalogueLink?.getTextContentSize();\r\n\r\n // Prevent Enter if in the middle of the link, allow only at start or end\r\n if (courseCatalogueLink && event.key === 'Enter') {\r\n event.preventDefault();\r\n editor.update(() => {\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertBefore(brNode);\r\n }\r\n if (offset === nodeLength) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertAfter(brNode);\r\n moveToEndOfWhiteSpace(brNode);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Allow add space before or after the link\r\n if (courseCatalogueLink && (key === ' ' || event.code === 'Space')) {\r\n event.preventDefault();\r\n editor.update(() => {\r\n const spaceToAdd = $createTextNode(' ');\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink.insertBefore(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n if (offset === nodeLength) {\r\n courseCatalogueLink.insertAfter(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Delete link if selected and Backspace or Del is pressed\r\n if (courseCatalogueLink && (key === 'Backspace' || key === 'Delete')) {\r\n event.preventDefault();\r\n editor.update(\r\n () => {\r\n editor.dispatchCommand(REMOVE_COURSE_CATALOGUE_LINK, undefined);\r\n },\r\n { discrete: true }\r\n );\r\n return true;\r\n }\r\n\r\n // Allow Home, End and Arrow navigation\r\n if (\r\n courseCatalogueLink &&\r\n key !== 'ArrowLeft' &&\r\n key !== 'ArrowRight' &&\r\n key !== 'ArrowUp' &&\r\n key !== 'ArrowDown' &&\r\n key !== 'Home' &&\r\n key !== 'End' &&\r\n !(event.ctrlKey && (key.toLowerCase() === 'z' || key.toLowerCase() === 'y')) &&\r\n !(event.ctrlKey && key.toLowerCase() === 'c')\r\n ) {\r\n event.preventDefault();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeCopy = editor.registerCommand(\r\n COPY_COMMAND,\r\n (event: ClipboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n event.preventDefault();\r\n const domElement = editor.getElementByKey(courseCatalogueLink.getKey());\r\n if (domElement) {\r\n event.clipboardData?.setData('text/html', domElement.outerHTML);\r\n event.clipboardData?.setData('text/plain', courseCatalogueLink.getTextContent());\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n );\r\n return () => {\r\n removeKeyboardShortcut();\r\n removeStatusListener();\r\n removeUnEditable();\r\n removeCopy();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, () => setFlyoutPosition(null));\r\n\r\n useEffect(() => {\r\n const removeKeydown = (event: KeyboardEvent): boolean => {\r\n setScrollableContainers(handleResizeScroll);\r\n\r\n if (event.key === 'Escape' && isVisibleRef.current) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n closeFlyout();\r\n }\r\n return true;\r\n };\r\n\r\n window.addEventListener('keydown', removeKeydown, { capture: true });\r\n\r\n const handleResizeScroll = () => {\r\n closeFlyout();\r\n };\r\n\r\n setScrollableContainers(handleResizeScroll);\r\n\r\n window.addEventListener('scroll', handleResizeScroll);\r\n window.addEventListener('resize', handleResizeScroll);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', removeKeydown);\r\n window.removeEventListener('scroll', handleResizeScroll);\r\n window.removeEventListener('resize', handleResizeScroll);\r\n removeScrollableContainers(handleResizeScroll);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (flyoutPosition) {\r\n closeFlyout();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [parentScrollPosition]);\r\n\r\n return (\r\n <div className={styles['editor__toolbar-button-group']}>\r\n <div className={styles['editor__toolbar-button-flyoutwrapper']}>\r\n <div className={styles['editor__toolbar-button-group--text']}>\r\n <button\r\n onClick={() => openFlyout('course')}\r\n title={t.cataloguelinks.courseTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n courseIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.courselink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.courselink}\r\n type=\"button\"\r\n ref={courseButtonRef}\r\n >\r\n {t.cataloguelinks.courseButtonLabel}\r\n </button>\r\n <button\r\n onClick={() => openFlyout('programme')}\r\n title={t.cataloguelinks.programmeTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n programmeIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.programmelink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.programmelink}\r\n type=\"button\"\r\n ref={programmeButtonRef}\r\n >\r\n {t.cataloguelinks.programmeButtonLabel}\r\n </button>\r\n </div>\r\n {flyoutPosition && (\r\n <div\r\n className={styles['editor__toolbar-flyout-wrapper']}\r\n style={{ top: flyoutPosition.top, left: flyoutPosition.left }}\r\n ref={flyoutRef}\r\n >\r\n <AddCatalogueLinkForm\r\n linkType={type}\r\n onCloseHandler={closeFlyout}\r\n onSearchHandler={onSearch}\r\n searchResponse={searchResponse}\r\n onSelect={(code, label, linkType) => {\r\n editor.dispatchCommand(INSERT_COURSE_CATALOGUE_LINK, {\r\n linkType,\r\n code,\r\n label,\r\n });\r\n closeFlyout();\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["CourseCataloguePlugin","onSearch","searchResponse","parentScrollPosition","editor","useLexicalComposerContext","t","useTranslation","courseIsActive","setCourseIsActive","useState","programmeIsActive","setProgrammeIsActive","courseButtonRef","useRef","programmeButtonRef","flyoutRef","flyoutPosition","setFlyoutPosition","type","setType","isVisibleRef","openFlyout","rect","closeFlyout","useEffect","removeKeyboardShortcut","KEY_DOWN_COMMAND","event","COMMAND_PRIORITY_CRITICAL","removeStatusListener","editorState","selection","$getSelection","$isRangeSelection","anchorNode","offset","$isTextNode","CourseCatalogueNode","courseCatalogueLink","linkType","$getLinkTypeFromNode","$getNearestNodeOfType","moveToEndOfWhiteSpace","whiteSpace","$createRangeSelection","endOffset","$setSelection","isCursorBeforeLink","removeUnEditable","key","nodeLength","brNode","$createTextNode","spaceToAdd","REMOVE_COURSE_CATALOGUE_LINK","removeCopy","COPY_COMMAND","domElement","COMMAND_PRIORITY_LOW","useOnClickOutside","removeKeydown","setScrollableContainers","handleResizeScroll","removeScrollableContainers","jsx","styles","jsxs","clsx","AddCatalogueLinkForm","code","label","INSERT_COURSE_CATALOGUE_LINK"],"mappings":";;;;;;;;;;;;AAwCO,MAAMA,KAAwB,CAAC;AAAA,EACpC,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,sBAAAC;AACF,MAAkC;AAChC,QAAM,CAACC,CAAM,IAAIC,EAAA,GACXC,IAAIC,GAAA,GACJ,CAACC,GAAgBC,CAAiB,IAAIC,EAAS,EAAK,GACpD,CAACC,GAAmBC,CAAoB,IAAIF,EAAS,EAAK,GAC1DG,IAAkBC,EAA0B,IAAI,GAChDC,IAAqBD,EAA0B,IAAI,GACnDE,IAAYF,EAAuB,IAAI,GACvC,CAACG,GAAgBC,CAAiB,IAAIR,EAA+C,IAAI,GACzF,CAACS,GAAMC,CAAO,IAAIV,EAAiC,QAAQ,GAC3DW,IAAeP,EAAOG,MAAmB,IAAI,GAE7CK,IAAa,CAACH,MAAiC;AACnD,IAAAC,EAAQD,CAAI;AACZ,UAAMI,IACJJ,MAAS,WACLN,EAAgB,SAAS,0BACzBE,EAAmB,SAAS,sBAAA;AAClC,IAAIQ,KACFL,EAAkB,EAAE,KAAKK,EAAK,QAAQ,MAAMA,EAAK,MAAM;AAAA,EAE3D,GAEMC,IAAc,MAAM;AACxB,IAAAvB,EAAS,IAAIkB,CAAI,GACjBD,EAAkB,IAAI;AAAA,EACxB;AAEA,SAAAO,EAAU,MAAM;AACd,UAAMC,IAAyBtB,EAAO;AAAA,MACpCuB;AAAAA,MACA,CAACC,MACKA,EAAM,WAAWA,EAAM,YAAYA,EAAM,UAAUA,EAAM,QAAQ,OACnEA,EAAM,eAAA,GACNN,EAAW,QAAQ,GACZ,MAELM,EAAM,WAAWA,EAAM,YAAYA,EAAM,UAAUA,EAAM,QAAQ,OACnEA,EAAM,eAAA,GACNN,EAAW,WAAW,GACf,MAEF;AAAA,MAETO;AAAAA,IAAA,GAGIC,IAAuB1B,EAAO,uBAAuB,CAAC,EAAE,aAAA2B,QAAkB;AAC9E,MAAAA,EAAY,KAAK,MAAM;AACrB,cAAMC,IAAYC,EAAA;AAClB,YAAIC,EAAkBF,CAAS,GAAG;AAChC,gBAAMG,IAAaH,EAAU,OAAO,QAAA,GAC9BI,IAASJ,EAAU,OAAO;AAEhC,cACEK,EAAYF,CAAU,KACtBC,MAAWD,EAAW,wBACtBA,EAAW,eAAA,aAA4BG,GACvC;AAEA,kBAAMC,IAAsBJ,EAAW,eAAA;AACvC,gBAAII,GAAqB;AACvB,oBAAMC,IAAWC,EAAqBF,CAAmB;AACzD,cAAA9B,EAAkB+B,MAAa,QAAQ,GACvC5B,EAAqB4B,MAAa,WAAW;AAC7C;AAAA,YACF;AAAA,UACF;AAEA,gBAAMD,IAAsBG,EAAsBP,GAAYG,CAAmB;AACjF,cAAIC,GAAqB;AACvB,kBAAMC,IAAWC,EAAqBF,CAAmB;AACzD,YAAA9B,EAAkB+B,MAAa,QAAQ,GACvC5B,EAAqB4B,MAAa,WAAW;AAC7C;AAAA,UACF;AACA,UAAA/B,EAAkB,EAAK,GACvBG,EAAqB,EAAK;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH,CAAC,GAEK+B,IAAwB,CAACC,MAAyB;AACtD,YAAMZ,IAAYa,EAAA,GACZC,IAAYF,EAAW,mBAAA;AAC7B,MAAAZ,EAAU,iBAAiBY,GAAYE,GAAWF,GAAYE,CAAS,GACvEC,GAAcf,CAAS;AAAA,IACzB,GAEMgB,IAAqB,CAACb,GAAyBC,MACnDC,EAAYF,CAAU,KACtBC,MAAWD,EAAW,mBAAA,KACtBA,EAAW,4BAA4BG,GAEnCW,IAAmB7C,EAAO;AAAA,MAC9BuB;AAAAA,MACA,CAACC,MAAyB;AACxB,cAAMI,IAAYC,EAAA;AAClB,YAAIC,EAAkBF,CAAS,GAAG;AAChC,gBAAMkB,IAAMtB,EAAM,KACZO,IAAaH,EAAU,OAAO,QAAA,GAC9BI,IAASJ,EAAU,OAAO;AAChC,cAAIO,IAAsBG,EAAsBP,GAAYG,CAAmB;AAO/E,cAJIU,EAAmBb,GAAYC,CAAM,MACvCG,IAAsBJ,EAAW,eAAA,IAG/B,CAACI;AACH,mBAAO;AAGT,gBAAMY,IAAaZ,GAAqB,mBAAA;AAGxC,cAAIA,KAAuBX,EAAM,QAAQ;AACvC,mBAAAA,EAAM,eAAA,GACNxB,EAAO,OAAO,MAAM;AAClB,kBAAI4C,EAAmBb,GAAYC,CAAM,GAAG;AAC1C,sBAAMgB,IAASC,EAAgB;AAAA,CAAI;AACnC,gBAAAd,EAAoB,aAAaa,CAAM;AAAA,cACzC;AACA,kBAAIhB,MAAWe,GAAY;AACzB,sBAAMC,IAASC,EAAgB;AAAA,CAAI;AACnC,gBAAAd,EAAoB,YAAYa,CAAM,GACtCT,EAAsBS,CAAM;AAAA,cAC9B;AAAA,YACF,CAAC,GACM;AAIT,cAAIb,MAAwBW,MAAQ,OAAOtB,EAAM,SAAS;AACxD,mBAAAA,EAAM,eAAA,GACNxB,EAAO,OAAO,MAAM;AAClB,oBAAMkD,IAAaD,EAAgB,GAAG;AACtC,cAAIL,EAAmBb,GAAYC,CAAM,MACvCG,EAAoB,aAAae,CAAU,GAC3CX,EAAsBW,CAAU,IAE9BlB,MAAWe,MACbZ,EAAoB,YAAYe,CAAU,GAC1CX,EAAsBW,CAAU;AAAA,YAEpC,CAAC,GACM;AAIT,cAAIf,MAAwBW,MAAQ,eAAeA,MAAQ;AACzD,mBAAAtB,EAAM,eAAA,GACNxB,EAAO;AAAA,cACL,MAAM;AACJ,gBAAAA,EAAO,gBAAgBmD,IAA8B,MAAS;AAAA,cAChE;AAAA,cACA,EAAE,UAAU,GAAA;AAAA,YAAK,GAEZ;AAIT,cACEhB,KACAW,MAAQ,eACRA,MAAQ,gBACRA,MAAQ,aACRA,MAAQ,eACRA,MAAQ,UACRA,MAAQ,SACR,EAAEtB,EAAM,YAAYsB,EAAI,YAAA,MAAkB,OAAOA,EAAI,YAAA,MAAkB,SACvE,EAAEtB,EAAM,WAAWsB,EAAI,YAAA,MAAkB;AAEzC,mBAAAtB,EAAM,eAAA,GACC;AAAA,QAEX;AACA,eAAO;AAAA,MACT;AAAA,MACAC;AAAAA,IAAA,GAGI2B,IAAapD,EAAO;AAAA,MACxBqD;AAAAA,MACA,CAAC7B,MAA0B;AACzB,cAAMI,IAAYC,EAAA;AAClB,YAAIC,EAAkBF,CAAS,GAAG;AAChC,gBAAMG,IAAaH,EAAU,OAAO,QAAA,GAC9BO,IAAsBG,EAAsBP,GAAYG,CAAmB;AACjF,cAAIC,GAAqB;AACvB,YAAAX,EAAM,eAAA;AACN,kBAAM8B,IAAatD,EAAO,gBAAgBmC,EAAoB,QAAQ;AACtE,mBAAImB,MACF9B,EAAM,eAAe,QAAQ,aAAa8B,EAAW,SAAS,GAC9D9B,EAAM,eAAe,QAAQ,cAAcW,EAAoB,gBAAgB,IAE1E;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACAoB;AAAAA,IAAA;AAEF,WAAO,MAAM;AACX,MAAAjC,EAAA,GACAI,EAAA,GACAmB,EAAA,GACAO,EAAA;AAAA,IACF;AAAA,EAEF,GAAG,CAACpD,CAAM,CAAC,GAEXwD,GAAkB5C,GAAqC,MAAME,EAAkB,IAAI,CAAC,GAEpFO,EAAU,MAAM;AACd,UAAMoC,IAAgB,CAACjC,OACrBkC,EAAwBC,CAAkB,GAEtCnC,EAAM,QAAQ,YAAYP,EAAa,YACzCO,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNJ,EAAA,IAEK;AAGT,WAAO,iBAAiB,WAAWqC,GAAe,EAAE,SAAS,IAAM;AAEnE,UAAME,IAAqB,MAAM;AAC/B,MAAAvC,EAAA;AAAA,IACF;AAEA,WAAAsC,EAAwBC,CAAkB,GAE1C,OAAO,iBAAiB,UAAUA,CAAkB,GACpD,OAAO,iBAAiB,UAAUA,CAAkB,GAE7C,MAAM;AACX,aAAO,oBAAoB,WAAWF,CAAa,GACnD,OAAO,oBAAoB,UAAUE,CAAkB,GACvD,OAAO,oBAAoB,UAAUA,CAAkB,GACvDC,GAA2BD,CAAkB;AAAA,IAC/C;AAAA,EAEF,GAAG,CAAA,CAAE,GAELtC,EAAU,MAAM;AACd,IAAIR,KACFO,EAAA;AAAA,EAGJ,GAAG,CAACrB,CAAoB,CAAC,GAGvB,gBAAA8D,EAAC,OAAA,EAAI,WAAWC,EAAO,8BAA8B,GACnD,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,sCAAsC,GAC3D,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,oCAAoC,GACzD,UAAA;AAAA,MAAA,gBAAAD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM3C,EAAW,QAAQ;AAAA,UAClC,OAAOhB,EAAE,eAAe;AAAA,UACxB,WAAW8D;AAAA,YACTF,EAAO,wBAAwB;AAAA,YAC/BA,EAAO,8BAA8B;AAAA,YACrC1D,KAAkB0D,EAAO,gCAAgC;AAAA,UAAA;AAAA,UAE3D,cAAY5D,EAAE,KAAK,OAAO;AAAA,UAC1B,qBAAmBA,EAAE,KAAK,aAAa;AAAA,UACvC,MAAK;AAAA,UACL,KAAKO;AAAA,UAEJ,YAAE,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,MAEpB,gBAAAoD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM3C,EAAW,WAAW;AAAA,UACrC,OAAOhB,EAAE,eAAe;AAAA,UACxB,WAAW8D;AAAA,YACTF,EAAO,wBAAwB;AAAA,YAC/BA,EAAO,8BAA8B;AAAA,YACrCvD,KAAqBuD,EAAO,gCAAgC;AAAA,UAAA;AAAA,UAE9D,cAAY5D,EAAE,KAAK,OAAO;AAAA,UAC1B,qBAAmBA,EAAE,KAAK,aAAa;AAAA,UACvC,MAAK;AAAA,UACL,KAAKS;AAAA,UAEJ,YAAE,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACpB,GACF;AAAA,IACCE,KACC,gBAAAgD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAO,gCAAgC;AAAA,QAClD,OAAO,EAAE,KAAKjD,EAAe,KAAK,MAAMA,EAAe,KAAA;AAAA,QACvD,KAAKD;AAAA,QAEL,UAAA,gBAAAiD;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,UAAUlD;AAAA,YACV,gBAAgBK;AAAA,YAChB,iBAAiBvB;AAAA,YACjB,gBAAAC;AAAA,YACA,UAAU,CAACoE,GAAMC,GAAO/B,MAAa;AACnC,cAAApC,EAAO,gBAAgBoE,IAA8B;AAAA,gBACnD,UAAAhC;AAAA,gBACA,MAAA8B;AAAA,gBACA,OAAAC;AAAA,cAAA,CACD,GACD/C,EAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF,EAAA,CAEJ,EAAA,CACF;AAEJ;"}
1
+ {"version":3,"file":"CourseCataloguePlugin.js","sources":["../../../../../src/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n COPY_COMMAND,\r\n KEY_DOWN_COMMAND,\r\n mergeRegister,\r\n} from 'lexical';\r\nimport { $getNearestNodeOfType } from '@lexical/utils';\r\n\r\nimport type { RefObject } from 'react';\r\nimport type { LexicalNode, TextNode } from 'lexical';\r\nimport type { SearchResponse } from './AddCatalogueLinkForm';\r\n\r\nimport { AddCatalogueLinkForm } from './AddCatalogueLinkForm';\r\n\r\nimport styles from 'components/RteEditor/RteEditor.module.css';\r\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\r\nimport {\r\n $getLinkTypeFromNode,\r\n CourseCatalogueNode,\r\n INSERT_COURSE_CATALOGUE_LINK,\r\n REMOVE_COURSE_CATALOGUE_LINK,\r\n} from 'components/RteEditor/nodes/CourseCatalogueNode';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\n\r\ninterface CourseCataloguePluginProps {\r\n onSearch: (query: string, linkType: 'course' | 'programme') => void;\r\n searchResponse: SearchResponse;\r\n parentScrollPosition: number;\r\n}\r\n\r\nexport const CourseCataloguePlugin = ({\r\n onSearch,\r\n searchResponse,\r\n parentScrollPosition,\r\n}: CourseCataloguePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const t = useTranslation();\r\n const [courseIsActive, setCourseIsActive] = useState(false);\r\n const [programmeIsActive, setProgrammeIsActive] = useState(false);\r\n const courseButtonRef = useRef<HTMLButtonElement>(null);\r\n const programmeButtonRef = useRef<HTMLButtonElement>(null);\r\n const flyoutRef = useRef<HTMLDivElement>(null);\r\n const [flyoutPosition, setFlyoutPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [type, setType] = useState<'course' | 'programme'>('course');\r\n const isVisibleRef = useRef(flyoutPosition !== null);\r\n\r\n const openFlyout = (type: 'course' | 'programme') => {\r\n setType(type);\r\n const rect =\r\n type === 'course'\r\n ? courseButtonRef.current?.getBoundingClientRect()\r\n : programmeButtonRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n setFlyoutPosition({ top: rect.bottom, left: rect.left });\r\n }\r\n };\r\n\r\n const closeFlyout = () => {\r\n onSearch('', type);\r\n setFlyoutPosition(null);\r\n };\r\n\r\n useEffect(() => {\r\n const removeKeyboardShortcut = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'C') {\r\n event.preventDefault();\r\n openFlyout('course');\r\n return true;\r\n }\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'P') {\r\n event.preventDefault();\r\n openFlyout('programme');\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n\r\n if (\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode\r\n ) {\r\n // Cursor staat aan het begin van de link!\r\n const courseCatalogueLink = anchorNode.getNextSibling();\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n }\r\n\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n setCourseIsActive(false);\r\n setProgrammeIsActive(false);\r\n }\r\n });\r\n });\r\n\r\n const moveToEndOfWhiteSpace = (whiteSpace: TextNode) => {\r\n const selection = $createRangeSelection();\r\n const endOffset = whiteSpace.getTextContentSize();\r\n selection.setTextNodeRange(whiteSpace, endOffset, whiteSpace, endOffset);\r\n $setSelection(selection);\r\n };\r\n\r\n const isCursorBeforeLink = (anchorNode: LexicalNode, offset: number) =>\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode;\r\n\r\n const removeUnEditable = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const key = event.key;\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n let courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n\r\n // Detect if cursor is right before the link\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink = anchorNode.getNextSibling();\r\n }\r\n\r\n if (!courseCatalogueLink) {\r\n return false;\r\n }\r\n\r\n const nodeLength = courseCatalogueLink?.getTextContentSize();\r\n\r\n // Prevent Enter if in the middle of the link, allow only at start or end\r\n if (courseCatalogueLink && event.key === 'Enter') {\r\n event.preventDefault();\r\n editor.update(() => {\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertBefore(brNode);\r\n }\r\n if (offset === nodeLength) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertAfter(brNode);\r\n moveToEndOfWhiteSpace(brNode);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Allow add space before or after the link\r\n if (courseCatalogueLink && (key === ' ' || event.code === 'Space')) {\r\n event.preventDefault();\r\n editor.update(() => {\r\n const spaceToAdd = $createTextNode(' ');\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink.insertBefore(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n if (offset === nodeLength) {\r\n courseCatalogueLink.insertAfter(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Delete link if selected and Backspace or Del is pressed\r\n if (courseCatalogueLink && (key === 'Backspace' || key === 'Delete')) {\r\n event.preventDefault();\r\n editor.update(\r\n () => {\r\n editor.dispatchCommand(REMOVE_COURSE_CATALOGUE_LINK, undefined);\r\n },\r\n { discrete: true }\r\n );\r\n return true;\r\n }\r\n\r\n // Allow Home, End and Arrow navigation\r\n if (\r\n courseCatalogueLink &&\r\n key !== 'ArrowLeft' &&\r\n key !== 'ArrowRight' &&\r\n key !== 'ArrowUp' &&\r\n key !== 'ArrowDown' &&\r\n key !== 'Home' &&\r\n key !== 'End' &&\r\n !(event.ctrlKey && (key.toLowerCase() === 'z' || key.toLowerCase() === 'y')) &&\r\n !(event.ctrlKey && key.toLowerCase() === 'c')\r\n ) {\r\n event.preventDefault();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeCopy = editor.registerCommand(\r\n COPY_COMMAND,\r\n (event: ClipboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n event.preventDefault();\r\n const domElement = editor.getElementByKey(courseCatalogueLink.getKey());\r\n if (domElement) {\r\n event.clipboardData?.setData('text/html', domElement.outerHTML);\r\n event.clipboardData?.setData('text/plain', courseCatalogueLink.getTextContent());\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n );\r\n return () => {\r\n removeKeyboardShortcut();\r\n removeStatusListener();\r\n removeUnEditable();\r\n removeCopy();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, () => setFlyoutPosition(null));\r\n\r\n const handleOnScroll = () => {\r\n closeFlyout();\r\n };\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && isVisibleRef.current) {\r\n event.preventDefault();\r\n closeFlyout();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('scroll', handleOnScroll);\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.addEventListener('scroll', handleOnScroll);\r\n }\r\n })\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (flyoutPosition) {\r\n closeFlyout();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [parentScrollPosition]);\r\n\r\n return (\r\n <div className={styles['editor__toolbar-button-group']}>\r\n <div className={styles['editor__toolbar-button-flyoutwrapper']}>\r\n <div className={styles['editor__toolbar-button-group--text']}>\r\n <button\r\n onClick={() => openFlyout('course')}\r\n title={t.cataloguelinks.courseTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n courseIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.courselink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.courselink}\r\n type=\"button\"\r\n ref={courseButtonRef}\r\n >\r\n {t.cataloguelinks.courseButtonLabel}\r\n </button>\r\n <button\r\n onClick={() => openFlyout('programme')}\r\n title={t.cataloguelinks.programmeTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n programmeIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.programmelink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.programmelink}\r\n type=\"button\"\r\n ref={programmeButtonRef}\r\n >\r\n {t.cataloguelinks.programmeButtonLabel}\r\n </button>\r\n </div>\r\n {flyoutPosition && (\r\n <div\r\n className={styles['editor__toolbar-flyout-wrapper']}\r\n style={{ top: flyoutPosition.top, left: flyoutPosition.left }}\r\n ref={flyoutRef}\r\n >\r\n <AddCatalogueLinkForm\r\n linkType={type}\r\n onCloseHandler={closeFlyout}\r\n onSearchHandler={onSearch}\r\n searchResponse={searchResponse}\r\n onSelect={(code, label, linkType) => {\r\n editor.dispatchCommand(INSERT_COURSE_CATALOGUE_LINK, {\r\n linkType,\r\n code,\r\n label,\r\n });\r\n closeFlyout();\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["CourseCataloguePlugin","onSearch","searchResponse","parentScrollPosition","editor","useLexicalComposerContext","t","useTranslation","courseIsActive","setCourseIsActive","useState","programmeIsActive","setProgrammeIsActive","courseButtonRef","useRef","programmeButtonRef","flyoutRef","flyoutPosition","setFlyoutPosition","type","setType","isVisibleRef","openFlyout","rect","closeFlyout","useEffect","removeKeyboardShortcut","KEY_DOWN_COMMAND","event","COMMAND_PRIORITY_CRITICAL","removeStatusListener","editorState","selection","$getSelection","$isRangeSelection","anchorNode","offset","$isTextNode","CourseCatalogueNode","courseCatalogueLink","linkType","$getLinkTypeFromNode","$getNearestNodeOfType","moveToEndOfWhiteSpace","whiteSpace","$createRangeSelection","endOffset","$setSelection","isCursorBeforeLink","removeUnEditable","key","nodeLength","brNode","$createTextNode","spaceToAdd","REMOVE_COURSE_CATALOGUE_LINK","removeCopy","COPY_COMMAND","domElement","COMMAND_PRIORITY_LOW","useOnClickOutside","handleOnScroll","mergeRegister","rootElement","prevRootElement","jsx","styles","jsxs","clsx","AddCatalogueLinkForm","code","label","INSERT_COURSE_CATALOGUE_LINK"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as f, jsx as i } from "react/jsx-runtime";
2
2
  import { c as e } from "../../../../clsx-OuTLNxxd.js";
3
3
  import { o as h } from "../../../../LexicalComposerContext.prod-DOyoZx0P.js";
4
- import { aQ as _, aR as C, aS as y, aT as k } from "../../../../Lexical.prod-A4JuKqM3.js";
4
+ import { aQ as _, aR as C, aS as y, aT as k } from "../../../../Lexical.prod-o6Eq_uLx.js";
5
5
  import { useState as m, useEffect as s } from "react";
6
6
  import "../../../Accordion/Accordion.js";
7
7
  import { Icon as n } from "../../../Icon/Icon.js";
@@ -18,8 +18,8 @@ import "../../../IconButton/IconButton.js";
18
18
  import "../../../Input/Input.js";
19
19
  import "../../../InputField/InputField.js";
20
20
  import "react-router";
21
- import "../../../../TablePlugin-CzmrXpxk.js";
22
- import { s as r } from "../../../../RteEditor.module-DaBh86FK.js";
21
+ import "../../../../TablePlugin-BRZcXq73.js";
22
+ import { s as r } from "../../../../RteEditor.module-CoTOIw5i.js";
23
23
  import { useTranslation as x } from "../../hooks/useTranslation.js";
24
24
  import "../../Providers/LanguageProvider.js";
25
25
  import "../LinkPlugin/LinkContextMenu/LinkContextMenu.js";
@@ -1,6 +1,6 @@
1
1
  import "react/jsx-runtime";
2
2
  import "react";
3
- import { A as I } from "../../../../../TablePlugin-CzmrXpxk.js";
3
+ import { A as I } from "../../../../../TablePlugin-BRZcXq73.js";
4
4
  import "../helpers.js";
5
5
  import "../../../../Accordion/Accordion.js";
6
6
  import "../../../../Icon/Icon.js";