@talxis/base-controls 1.2406.2

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 (352) hide show
  1. package/.env +1 -0
  2. package/.eslintrc +117 -0
  3. package/.npmgitignore +9 -0
  4. package/.vscode/settings.json +3 -0
  5. package/.yalcignore +2 -0
  6. package/README.md +18 -0
  7. package/azure-pipelines.yml +44 -0
  8. package/dist/Lookup-eb1505b3.js +1 -0
  9. package/dist/NumeralPCF-a609b7be.js +1 -0
  10. package/dist/components/DateTime/DateTime.d.ts +3 -0
  11. package/dist/components/DateTime/DateTime.js +1 -0
  12. package/dist/components/DateTime/components/Calendar.d.ts +12 -0
  13. package/dist/components/DateTime/hooks/useDateTime.d.ts +6 -0
  14. package/dist/components/DateTime/index.d.ts +2 -0
  15. package/dist/components/DateTime/interfaces.d.ts +31 -0
  16. package/dist/components/DateTime/styles.d.ts +34 -0
  17. package/dist/components/DateTime/translations.d.ts +3 -0
  18. package/dist/components/Decimal/Decimal.d.ts +3 -0
  19. package/dist/components/Decimal/Decimal.js +1 -0
  20. package/dist/components/Decimal/index.d.ts +2 -0
  21. package/dist/components/Decimal/interfaces.d.ts +13 -0
  22. package/dist/components/Duration/Duration.d.ts +3 -0
  23. package/dist/components/Duration/Duration.js +1 -0
  24. package/dist/components/Duration/index.d.ts +2 -0
  25. package/dist/components/Duration/interfaces.d.ts +31 -0
  26. package/dist/components/Duration/translations.d.ts +2 -0
  27. package/dist/components/Grid/Grid.d.ts +5 -0
  28. package/dist/components/Grid/Grid.js +10 -0
  29. package/dist/components/Grid/core/components/AgGrid/AgGrid.d.ts +2 -0
  30. package/dist/components/Grid/core/components/AgGrid/components/EmptyRecordsOverlay/EmptyRecords.d.ts +2 -0
  31. package/dist/components/Grid/core/components/AgGrid/components/EmptyRecordsOverlay/styles.d.ts +18 -0
  32. package/dist/components/Grid/core/components/AgGrid/components/LoadingOverlay/LoadingOverlay.d.ts +2 -0
  33. package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.d.ts +12 -0
  34. package/dist/components/Grid/core/components/AgGrid/model/AgGrid.d.ts +13 -0
  35. package/dist/components/Grid/core/components/AgGrid/styles.d.ts +69 -0
  36. package/dist/components/Grid/core/components/Cell/Commands/Commands.d.ts +7 -0
  37. package/dist/components/Grid/core/components/Cell/Commands/Icon.d.ts +7 -0
  38. package/dist/components/Grid/core/components/Cell/Commands/styles.d.ts +19 -0
  39. package/dist/components/Grid/core/components/Cell/Commands/useCommands.d.ts +5 -0
  40. package/dist/components/Grid/core/components/Cell/EditableCell/EditableCell.d.ts +10 -0
  41. package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.d.ts +11 -0
  42. package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyOptionSet/ReadOnlyOptionSet.d.ts +10 -0
  43. package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyOptionSet/styles.d.ts +22 -0
  44. package/dist/components/Grid/core/components/Cell/ReadOnlyCell/styles.d.ts +47 -0
  45. package/dist/components/Grid/core/components/ColumnHeader/ColumnHeader.d.ts +6 -0
  46. package/dist/components/Grid/core/components/ColumnHeader/components/GlobalCheckbox/GlobalCheckbox.d.ts +2 -0
  47. package/dist/components/Grid/core/components/ColumnHeader/components/GlobalCheckbox/styles.d.ts +13 -0
  48. package/dist/components/Grid/core/components/ColumnHeader/styles.d.ts +37 -0
  49. package/dist/components/Grid/core/components/Component/Component.d.ts +11 -0
  50. package/dist/components/Grid/core/components/Component/controller/useComponentController.d.ts +9 -0
  51. package/dist/components/Grid/core/components/Component/model/Component.d.ts +10 -0
  52. package/dist/components/Grid/core/components/Dialog/Constants.d.ts +2 -0
  53. package/dist/components/Grid/core/components/Dialog/Styles.d.ts +2 -0
  54. package/dist/components/Grid/core/components/Dialog/index.d.ts +4 -0
  55. package/dist/components/Grid/core/components/Save/Save.d.ts +2 -0
  56. package/dist/components/Grid/core/components/Save/components/ChangeEditor/ChangeEditor.d.ts +3 -0
  57. package/dist/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.d.ts +7 -0
  58. package/dist/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/styles.d.ts +48 -0
  59. package/dist/components/Grid/core/components/Save/components/ChangeEditor/styles.d.ts +31 -0
  60. package/dist/components/Grid/core/components/Save/hooks/useSave.d.ts +12 -0
  61. package/dist/components/Grid/core/components/Save/styles.d.ts +37 -0
  62. package/dist/components/Grid/core/controllers/useGridController.d.ts +9 -0
  63. package/dist/components/Grid/core/enums/ConditionOperator.d.ts +46 -0
  64. package/dist/components/Grid/core/enums/DataType.d.ts +24 -0
  65. package/dist/components/Grid/core/hooks/useGridInstance.d.ts +2 -0
  66. package/dist/components/Grid/core/hooks/useRefreshCallback.d.ts +2 -0
  67. package/dist/components/Grid/core/hooks/useRerender.d.ts +1 -0
  68. package/dist/components/Grid/core/interfaces/IGridColumn.d.ts +18 -0
  69. package/dist/components/Grid/core/interfaces/IGridContext.d.ts +4 -0
  70. package/dist/components/Grid/core/model/Grid.d.ts +51 -0
  71. package/dist/components/Grid/core/model/GridDependency.d.ts +13 -0
  72. package/dist/components/Grid/core/model/Metadata.d.ts +7 -0
  73. package/dist/components/Grid/core/services/RecordUpdateService/controllers/useRecordUpdateServiceController.d.ts +14 -0
  74. package/dist/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.d.ts +30 -0
  75. package/dist/components/Grid/filtering/components/FilterCallout/FilterCallout.d.ts +8 -0
  76. package/dist/components/Grid/filtering/components/FilterCallout/components/ConditionOperator/ConditionOperator.d.ts +7 -0
  77. package/dist/components/Grid/filtering/components/FilterCallout/components/ConditionValue/ConditionValue.d.ts +7 -0
  78. package/dist/components/Grid/filtering/components/FilterCallout/components/ConditionValue/model/ConditionComponentValue.d.ts +30 -0
  79. package/dist/components/Grid/filtering/components/FilterCallout/styles.d.ts +35 -0
  80. package/dist/components/Grid/filtering/constants.d.ts +5 -0
  81. package/dist/components/Grid/filtering/controller/useColumnFilterConditionController.d.ts +19 -0
  82. package/dist/components/Grid/filtering/model/Condition.d.ts +47 -0
  83. package/dist/components/Grid/filtering/model/Filtering.d.ts +11 -0
  84. package/dist/components/Grid/filtering/utils/FilteringUtilts.d.ts +34 -0
  85. package/dist/components/Grid/interfaces.d.ts +254 -0
  86. package/dist/components/Grid/paging/components/Paging/Paging.d.ts +2 -0
  87. package/dist/components/Grid/paging/components/Paging/styles.d.ts +35 -0
  88. package/dist/components/Grid/paging/controllers/usePagingController.d.ts +16 -0
  89. package/dist/components/Grid/paging/model/Paging.d.ts +15 -0
  90. package/dist/components/Grid/selection/controllers/useSelectionController.d.ts +11 -0
  91. package/dist/components/Grid/selection/model/Selection.d.ts +13 -0
  92. package/dist/components/Grid/sorting/Sorting.d.ts +9 -0
  93. package/dist/components/Grid/sorting/components/SortingContextualMenu/SortingContextualMenu.d.ts +8 -0
  94. package/dist/components/Grid/sorting/components/SortingContextualMenu/styles.d.ts +9 -0
  95. package/dist/components/Grid/sorting/controllers/useColumnSortingController.d.ts +8 -0
  96. package/dist/components/Grid/translations.d.ts +2 -0
  97. package/dist/components/Grid/validation/controllers/useRecordValidationController.d.ts +8 -0
  98. package/dist/components/Grid/validation/model/ColumnValidation.d.ts +11 -0
  99. package/dist/components/Lookup/Lookup.d.ts +3 -0
  100. package/dist/components/Lookup/Lookup.js +1 -0
  101. package/dist/components/Lookup/components/RecordCreator.d.ts +10 -0
  102. package/dist/components/Lookup/components/TargetSelector.d.ts +10 -0
  103. package/dist/components/Lookup/hooks/useFetchXml.d.ts +3 -0
  104. package/dist/components/Lookup/hooks/useLoadedEntities.d.ts +6 -0
  105. package/dist/components/Lookup/hooks/useLookup.d.ts +8 -0
  106. package/dist/components/Lookup/index.d.ts +2 -0
  107. package/dist/components/Lookup/interfaces.d.ts +52 -0
  108. package/dist/components/Lookup/lib.d.ts +1164 -0
  109. package/dist/components/Lookup/styles.d.ts +90 -0
  110. package/dist/components/Lookup/translations.d.ts +2 -0
  111. package/dist/components/MultiSelectOptionSet/MultiSelectOptionSet.d.ts +3 -0
  112. package/dist/components/MultiSelectOptionSet/MultiSelectOptionSet.js +1 -0
  113. package/dist/components/MultiSelectOptionSet/index.d.ts +2 -0
  114. package/dist/components/MultiSelectOptionSet/interfaces.d.ts +11 -0
  115. package/dist/components/OptionSet/OptionSet.d.ts +3 -0
  116. package/dist/components/OptionSet/OptionSet.js +1 -0
  117. package/dist/components/OptionSet/index.d.ts +2 -0
  118. package/dist/components/OptionSet/interfaces.d.ts +13 -0
  119. package/dist/components/TextField/TextField.d.ts +3 -0
  120. package/dist/components/TextField/TextField.js +1 -0
  121. package/dist/components/TextField/hooks/useTextField.d.ts +2 -0
  122. package/dist/components/TextField/index.d.ts +2 -0
  123. package/dist/components/TextField/interfaces.d.ts +15 -0
  124. package/dist/components/TwoOptions/TwoOptions.d.ts +3 -0
  125. package/dist/components/TwoOptions/TwoOptions.js +1 -0
  126. package/dist/components/TwoOptions/index.d.ts +2 -0
  127. package/dist/components/TwoOptions/interfaces.d.ts +13 -0
  128. package/dist/hooks/index.d.ts +1 -0
  129. package/dist/hooks/index.js +1 -0
  130. package/dist/hooks/useComponent.d.ts +7 -0
  131. package/dist/hooks/useComponent.js +1 -0
  132. package/dist/hooks/useFocusIn.d.ts +1 -0
  133. package/dist/hooks/useFocusIn.js +1 -0
  134. package/dist/hooks/useInputBasedComponent.d.ts +32 -0
  135. package/dist/hooks/useInputBasedComponent.js +1 -0
  136. package/dist/hooks/useMouseOver.d.ts +1 -0
  137. package/dist/hooks/useMouseOver.js +1 -0
  138. package/dist/index.d.ts +40 -0
  139. package/dist/interfaces/context.d.ts +20 -0
  140. package/dist/interfaces/index.d.ts +9 -0
  141. package/dist/interfaces/parameters.d.ts +23 -0
  142. package/dist/interfaces/property.d.ts +100 -0
  143. package/dist/types/index.d.ts +3 -0
  144. package/dist/utils/NumeralPCF.d.ts +6 -0
  145. package/examples/Currency/Currency/ControlManifest.Input.xml +53 -0
  146. package/examples/Currency/Currency/index.ts +66 -0
  147. package/examples/Currency/Currency.pcfproj +46 -0
  148. package/examples/Currency/package-lock.json +15900 -0
  149. package/examples/Currency/package.json +29 -0
  150. package/examples/Currency/pcfconfig.json +3 -0
  151. package/examples/Currency/tsconfig.json +7 -0
  152. package/examples/DateTime/DateTime/ControlManifest.Input.xml +58 -0
  153. package/examples/DateTime/DateTime/index.ts +69 -0
  154. package/examples/DateTime/DateTime.pcfproj +46 -0
  155. package/examples/DateTime/package-lock.json +15900 -0
  156. package/examples/DateTime/package.json +29 -0
  157. package/examples/DateTime/pcfconfig.json +3 -0
  158. package/examples/DateTime/tsconfig.json +7 -0
  159. package/examples/Decimal/Decimal/ControlManifest.Input.xml +66 -0
  160. package/examples/Decimal/Decimal/index.ts +66 -0
  161. package/examples/Decimal/Decimal.pcfproj +46 -0
  162. package/examples/Decimal/package-lock.json +15900 -0
  163. package/examples/Decimal/package.json +28 -0
  164. package/examples/Decimal/pcfconfig.json +3 -0
  165. package/examples/Decimal/tsconfig.json +7 -0
  166. package/examples/Duration/Duration/ControlManifest.Input.xml +53 -0
  167. package/examples/Duration/Duration/index.ts +66 -0
  168. package/examples/Duration/Duration.pcfproj +46 -0
  169. package/examples/Duration/package-lock.json +15900 -0
  170. package/examples/Duration/package.json +29 -0
  171. package/examples/Duration/pcfconfig.json +3 -0
  172. package/examples/Duration/tsconfig.json +7 -0
  173. package/examples/Grid/Grid/ControlManifest.Input.xml +28 -0
  174. package/examples/Grid/Grid/index.ts +100 -0
  175. package/examples/Grid/Grid.pcfproj +46 -0
  176. package/examples/Grid/package-lock.json +15901 -0
  177. package/examples/Grid/package.json +30 -0
  178. package/examples/Grid/pcfconfig.json +3 -0
  179. package/examples/Grid/tsconfig.json +7 -0
  180. package/examples/Lookup/Lookup/ControlManifest.Input.xml +51 -0
  181. package/examples/Lookup/Lookup/index.ts +90 -0
  182. package/examples/Lookup/Lookup.pcfproj +46 -0
  183. package/examples/Lookup/package-lock.json +15900 -0
  184. package/examples/Lookup/package.json +29 -0
  185. package/examples/Lookup/pcfconfig.json +3 -0
  186. package/examples/Lookup/tsconfig.json +8 -0
  187. package/examples/MultiSelectOptionSet/MultiSelectOptionSet/ControlManifest.Input.xml +53 -0
  188. package/examples/MultiSelectOptionSet/MultiSelectOptionSet/index.ts +86 -0
  189. package/examples/MultiSelectOptionSet/MultiSelectOptionSet.pcfproj +46 -0
  190. package/examples/MultiSelectOptionSet/package-lock.json +15900 -0
  191. package/examples/MultiSelectOptionSet/package.json +31 -0
  192. package/examples/MultiSelectOptionSet/pcfconfig.json +3 -0
  193. package/examples/MultiSelectOptionSet/tsconfig.json +7 -0
  194. package/examples/OptionSet/OptionSet/ControlManifest.Input.xml +53 -0
  195. package/examples/OptionSet/OptionSet/index.ts +70 -0
  196. package/examples/OptionSet/OptionSet.pcfproj +46 -0
  197. package/examples/OptionSet/package-lock.json +15900 -0
  198. package/examples/OptionSet/package.json +29 -0
  199. package/examples/OptionSet/pcfconfig.json +3 -0
  200. package/examples/OptionSet/tsconfig.json +7 -0
  201. package/examples/TwoOptions/TwoOptions/ControlManifest.Input.xml +53 -0
  202. package/examples/TwoOptions/TwoOptions/index.ts +69 -0
  203. package/examples/TwoOptions/TwoOptions.pcfproj +46 -0
  204. package/examples/TwoOptions/package-lock.json +15900 -0
  205. package/examples/TwoOptions/package.json +29 -0
  206. package/examples/TwoOptions/pcfconfig.json +3 -0
  207. package/examples/TwoOptions/tsconfig.json +7 -0
  208. package/package.json +94 -0
  209. package/public/index.html +43 -0
  210. package/public/manifest.json +25 -0
  211. package/rollup.config.js +44 -0
  212. package/src/components/DateTime/DateTime.tsx +97 -0
  213. package/src/components/DateTime/components/Calendar.tsx +80 -0
  214. package/src/components/DateTime/hooks/useDateTime.ts +144 -0
  215. package/src/components/DateTime/index.ts +2 -0
  216. package/src/components/DateTime/interfaces.ts +22 -0
  217. package/src/components/DateTime/styles.ts +37 -0
  218. package/src/components/DateTime/translations.ts +18 -0
  219. package/src/components/Decimal/Decimal.tsx +120 -0
  220. package/src/components/Decimal/index.ts +2 -0
  221. package/src/components/Decimal/interfaces.ts +20 -0
  222. package/src/components/Duration/Duration.tsx +143 -0
  223. package/src/components/Duration/index.ts +2 -0
  224. package/src/components/Duration/interfaces.ts +22 -0
  225. package/src/components/Duration/translations.ts +30 -0
  226. package/src/components/Grid/Grid.tsx +24 -0
  227. package/src/components/Grid/core/components/AgGrid/AgGrid.tsx +206 -0
  228. package/src/components/Grid/core/components/AgGrid/components/EmptyRecordsOverlay/EmptyRecords.tsx +16 -0
  229. package/src/components/Grid/core/components/AgGrid/components/EmptyRecordsOverlay/styles.ts +20 -0
  230. package/src/components/Grid/core/components/AgGrid/components/LoadingOverlay/LoadingOverlay.tsx +7 -0
  231. package/src/components/Grid/core/components/AgGrid/controllers/useAgGridController.ts +68 -0
  232. package/src/components/Grid/core/components/AgGrid/model/AgGrid.ts +100 -0
  233. package/src/components/Grid/core/components/AgGrid/styles.ts +72 -0
  234. package/src/components/Grid/core/components/Cell/Commands/Commands.tsx +32 -0
  235. package/src/components/Grid/core/components/Cell/Commands/Icon.tsx +17 -0
  236. package/src/components/Grid/core/components/Cell/Commands/styles.ts +21 -0
  237. package/src/components/Grid/core/components/Cell/Commands/useCommands.tsx +53 -0
  238. package/src/components/Grid/core/components/Cell/EditableCell/EditableCell.tsx +140 -0
  239. package/src/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.tsx +176 -0
  240. package/src/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyOptionSet/ReadOnlyOptionSet.tsx +67 -0
  241. package/src/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyOptionSet/styles.ts +24 -0
  242. package/src/components/Grid/core/components/Cell/ReadOnlyCell/styles.ts +56 -0
  243. package/src/components/Grid/core/components/ColumnHeader/ColumnHeader.tsx +71 -0
  244. package/src/components/Grid/core/components/ColumnHeader/components/GlobalCheckbox/GlobalCheckbox.tsx +31 -0
  245. package/src/components/Grid/core/components/ColumnHeader/components/GlobalCheckbox/styles.ts +16 -0
  246. package/src/components/Grid/core/components/ColumnHeader/styles.ts +40 -0
  247. package/src/components/Grid/core/components/Component/Component.tsx +59 -0
  248. package/src/components/Grid/core/components/Component/controller/useComponentController.ts +39 -0
  249. package/src/components/Grid/core/components/Component/model/Component.ts +251 -0
  250. package/src/components/Grid/core/components/Dialog/Constants.tsx +8 -0
  251. package/src/components/Grid/core/components/Dialog/Styles.tsx +61 -0
  252. package/src/components/Grid/core/components/Dialog/index.tsx +22 -0
  253. package/src/components/Grid/core/components/Dialog/interfaces/index.d.ts +7 -0
  254. package/src/components/Grid/core/components/Save/Save.tsx +74 -0
  255. package/src/components/Grid/core/components/Save/components/ChangeEditor/ChangeEditor.tsx +63 -0
  256. package/src/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.tsx +153 -0
  257. package/src/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/styles.ts +52 -0
  258. package/src/components/Grid/core/components/Save/components/ChangeEditor/styles.ts +34 -0
  259. package/src/components/Grid/core/components/Save/hooks/useSave.ts +59 -0
  260. package/src/components/Grid/core/components/Save/styles.ts +41 -0
  261. package/src/components/Grid/core/controllers/useGridController.ts +46 -0
  262. package/src/components/Grid/core/enums/ConditionOperator.ts +46 -0
  263. package/src/components/Grid/core/enums/DataType.ts +25 -0
  264. package/src/components/Grid/core/hooks/useGridInstance.ts +7 -0
  265. package/src/components/Grid/core/hooks/useRefreshCallback.ts +20 -0
  266. package/src/components/Grid/core/hooks/useRerender.ts +15 -0
  267. package/src/components/Grid/core/interfaces/IGridColumn.ts +19 -0
  268. package/src/components/Grid/core/interfaces/IGridContext.ts +7 -0
  269. package/src/components/Grid/core/model/Grid.ts +250 -0
  270. package/src/components/Grid/core/model/GridDependency.ts +34 -0
  271. package/src/components/Grid/core/model/Metadata.ts +20 -0
  272. package/src/components/Grid/core/services/RecordUpdateService/controllers/useRecordUpdateServiceController.ts +36 -0
  273. package/src/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.ts +222 -0
  274. package/src/components/Grid/filtering/components/FilterCallout/FilterCallout.tsx +83 -0
  275. package/src/components/Grid/filtering/components/FilterCallout/components/ConditionOperator/ConditionOperator.tsx +66 -0
  276. package/src/components/Grid/filtering/components/FilterCallout/components/ConditionValue/ConditionValue.tsx +48 -0
  277. package/src/components/Grid/filtering/components/FilterCallout/components/ConditionValue/model/ConditionComponentValue.ts +120 -0
  278. package/src/components/Grid/filtering/components/FilterCallout/styles.ts +37 -0
  279. package/src/components/Grid/filtering/constants.ts +48 -0
  280. package/src/components/Grid/filtering/controller/useColumnFilterConditionController.ts +63 -0
  281. package/src/components/Grid/filtering/model/Condition.ts +309 -0
  282. package/src/components/Grid/filtering/model/Filtering.ts +78 -0
  283. package/src/components/Grid/filtering/utils/FilteringUtilts.ts +190 -0
  284. package/src/components/Grid/interfaces.ts +109 -0
  285. package/src/components/Grid/paging/components/Paging/Paging.tsx +76 -0
  286. package/src/components/Grid/paging/components/Paging/styles.ts +38 -0
  287. package/src/components/Grid/paging/controllers/usePagingController.ts +34 -0
  288. package/src/components/Grid/paging/model/Paging.ts +49 -0
  289. package/src/components/Grid/selection/controllers/useSelectionController.ts +25 -0
  290. package/src/components/Grid/selection/model/Selection.ts +60 -0
  291. package/src/components/Grid/sorting/Sorting.ts +30 -0
  292. package/src/components/Grid/sorting/components/SortingContextualMenu/SortingContextualMenu.tsx +126 -0
  293. package/src/components/Grid/sorting/components/SortingContextualMenu/styles.ts +12 -0
  294. package/src/components/Grid/sorting/controllers/useColumnSortingController.ts +26 -0
  295. package/src/components/Grid/translations.ts +80 -0
  296. package/src/components/Grid/validation/controllers/useRecordValidationController.ts +31 -0
  297. package/src/components/Grid/validation/model/ColumnValidation.ts +81 -0
  298. package/src/components/Lookup/Lookup.tsx +199 -0
  299. package/src/components/Lookup/components/RecordCreator.tsx +53 -0
  300. package/src/components/Lookup/components/TargetSelector.tsx +43 -0
  301. package/src/components/Lookup/hooks/useFetchXml.ts +31 -0
  302. package/src/components/Lookup/hooks/useLoadedEntities.ts +23 -0
  303. package/src/components/Lookup/hooks/useLookup.ts +126 -0
  304. package/src/components/Lookup/index.ts +2 -0
  305. package/src/components/Lookup/interfaces.ts +45 -0
  306. package/src/components/Lookup/lib.ts +3110 -0
  307. package/src/components/Lookup/styles.ts +106 -0
  308. package/src/components/Lookup/translations.ts +28 -0
  309. package/src/components/MultiSelectOptionSet/MultiSelectOptionSet.tsx +83 -0
  310. package/src/components/MultiSelectOptionSet/index.ts +2 -0
  311. package/src/components/MultiSelectOptionSet/interfaces.ts +14 -0
  312. package/src/components/OptionSet/OptionSet.tsx +67 -0
  313. package/src/components/OptionSet/index.ts +2 -0
  314. package/src/components/OptionSet/interfaces.ts +17 -0
  315. package/src/components/TextField/TextField.tsx +58 -0
  316. package/src/components/TextField/hooks/useTextField.ts +42 -0
  317. package/src/components/TextField/index.ts +2 -0
  318. package/src/components/TextField/interfaces.ts +20 -0
  319. package/src/components/TwoOptions/TwoOptions.tsx +43 -0
  320. package/src/components/TwoOptions/index.ts +2 -0
  321. package/src/components/TwoOptions/interfaces.ts +17 -0
  322. package/src/hooks/index.ts +1 -0
  323. package/src/hooks/useComponent.ts +83 -0
  324. package/src/hooks/useFocusIn.ts +23 -0
  325. package/src/hooks/useInputBasedComponent.ts +71 -0
  326. package/src/hooks/useMouseOver.ts +23 -0
  327. package/src/index.tsx +12 -0
  328. package/src/interfaces/context.ts +21 -0
  329. package/src/interfaces/index.ts +12 -0
  330. package/src/interfaces/parameters.ts +26 -0
  331. package/src/interfaces/property.ts +111 -0
  332. package/src/sandbox/index.tsx +137 -0
  333. package/src/sandbox/mock/Context.ts +18 -0
  334. package/src/sandbox/mock/Formatting.ts +186 -0
  335. package/src/sandbox/mock/Mode.ts +25 -0
  336. package/src/sandbox/mock/UserSettings.ts +31 -0
  337. package/src/sandbox/mock/Utility.ts +14 -0
  338. package/src/sandbox/shared/durationList.tsx +24 -0
  339. package/src/sandbox/shared/multiSelectOptionList.tsx +5 -0
  340. package/src/sandbox/shared/optionList.tsx +5 -0
  341. package/src/stories/Introduction.stories.mdx +122 -0
  342. package/src/stories/assets/code-brackets.svg +1 -0
  343. package/src/stories/assets/colors.svg +1 -0
  344. package/src/stories/assets/comments.svg +1 -0
  345. package/src/stories/assets/direction.svg +1 -0
  346. package/src/stories/assets/flow.svg +1 -0
  347. package/src/stories/assets/plugin.svg +1 -0
  348. package/src/stories/assets/repo.svg +1 -0
  349. package/src/stories/assets/stackalt.svg +1 -0
  350. package/src/types/index.ts +3 -0
  351. package/src/utils/NumeralPCF.ts +62 -0
  352. package/tsconfig.json +28 -0
@@ -0,0 +1,71 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { IComponent, IOutputs, ITranslations } from "../interfaces/context";
3
+ import { useComponent } from "./useComponent";
4
+ import React from 'react';
5
+ import { IInputParameters } from "../interfaces/parameters";
6
+ import { StringProps } from "../types";
7
+
8
+ /**
9
+ * Description
10
+ * @param {any} value:any
11
+ * @returns {any}
12
+ */
13
+ interface IComponentOptions<TTranslations> {
14
+ defaultTranslations?: TTranslations,
15
+ /**
16
+ * Formatting function that will format the bound value every time a new one comes from the props.
17
+ */
18
+ formatter?: (value: any) => any,
19
+ valueExtractor?: (value: any) => any
20
+ }
21
+
22
+ /**
23
+ * Use when working with components that need to store value changes internally before triggering `notifyOutputChanged`.
24
+ * An example of this is a standard Decimal component - we do not want to trigger `notifyOutputChanged` on every value change,
25
+ * since this would trigger decimal validation on every keystroke which would result in a bad UX. In this case, the `notifyOutputChanged` should
26
+ * be triggered when the user looses focus on the component (`onBlur` event).
27
+ * @returns {[]} The hook returns an array with three props. First `value` prop is a value that will will always be in sync with the value that comes from the `value` parameter.
28
+ * Use this for displaying the up-to-date value to the user.
29
+ * Second prop contains the translations for this component.
30
+ *
31
+ * Third prop is a method that can be used to change the current value. The new value will get propagated to the `value` variable returned from this hook. This method wont propagate the value to the framework.
32
+ *
33
+ * The last prop is a method that will notify the framework that you wish to write changes.
34
+ * The method will notify the framework only if the provided output differs from the current inputs.
35
+ */
36
+
37
+ export const useInputBasedComponent = <TValue, TParameters extends IInputParameters, TOutputs extends IOutputs, TTranslations extends ITranslations>(name: string, props: IComponent<TParameters, TOutputs, TTranslations>, options?: IComponentOptions<TTranslations>): [
38
+ TValue,
39
+ Required<StringProps<TTranslations>>,
40
+ (value: TValue) => void,
41
+ (outputs: TOutputs) => void,
42
+ ] => {
43
+ const {formatter, valueExtractor} = {...options};
44
+ const rawValue = props.parameters.value.raw;
45
+ const [value, setValue] = useState<TValue>(formatter?.(rawValue) ?? rawValue);
46
+ const valueRef = useRef<TValue>(rawValue);
47
+ const [labels, onNotifyOutputChanged] = useComponent(name, props, options?.defaultTranslations);
48
+
49
+ useEffect(() => {
50
+ const formattedValue = formatter?.(rawValue);
51
+ setValue(formattedValue ?? rawValue);
52
+ //console.log(`Updating component ${name} with new value: ${formattedValue ?? rawValue}`);
53
+ }, [rawValue]);
54
+
55
+ useEffect(() => {
56
+ valueRef.current = value;
57
+ }, [value]);
58
+
59
+ useEffect(() => {
60
+ return () => {
61
+ if(props.parameters.NotifyOutputChangedOnUnmount?.raw === true) {
62
+ onNotifyOutputChanged({
63
+ value: valueExtractor?.(valueRef.current) ?? valueRef.current
64
+ } as any);
65
+ }
66
+ };
67
+ }, []);
68
+
69
+ return [value, labels, setValue, onNotifyOutputChanged];
70
+
71
+ };
@@ -0,0 +1,23 @@
1
+ import { useEffect, useState } from "react";
2
+
3
+ export const useMouseOver = (ref: React.RefObject<HTMLElement>): boolean => {
4
+ const [isMouseOver, setIsMouseOver] = useState<boolean>(false);
5
+
6
+ useEffect(() => {
7
+ const onMouseEnter = () => {
8
+ setIsMouseOver(true);
9
+ }
10
+ const onMouseLeave = () => {
11
+ setIsMouseOver(false);
12
+ }
13
+ ref.current?.addEventListener('mouseenter', onMouseEnter);
14
+ ref.current?.addEventListener('mouseleave', onMouseLeave);
15
+
16
+ return () => {
17
+ ref.current?.removeEventListener('mouseenter',onMouseEnter);
18
+ ref.current?.removeEventListener('mouseleave', onMouseLeave);
19
+ }
20
+ }, []);
21
+
22
+ return isMouseOver;
23
+ };
package/src/index.tsx ADDED
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import { Sandbox } from './sandbox';
4
+
5
+ ReactDOM.render(
6
+ <React.StrictMode>
7
+ <Sandbox />
8
+ </React.StrictMode>,
9
+ document.getElementById('root')
10
+ );
11
+
12
+ export * from './hooks';
@@ -0,0 +1,21 @@
1
+ export interface IOutputs {
2
+ [key: string]: any
3
+ }
4
+
5
+ export interface IComponent<TParameters, TOutputs, TTranslations> {
6
+ context: ComponentFramework.Context<TParameters>;
7
+ parameters: TParameters;
8
+ translations?: TTranslations;
9
+ state?: ComponentFramework.Dictionary;
10
+ /**
11
+ * Fires when the component changes the parameter value. It is usually fired directly after the change occurs in the value.
12
+ * Exceptions are input based component where it fires on the blur event.
13
+ */
14
+ onNotifyOutputChanged?: (outputs: TOutputs) => void;
15
+ }
16
+
17
+ export interface ITranslations {
18
+ [key: string]: {
19
+ [LCID: number]: string | string[]
20
+ } | undefined
21
+ }
@@ -0,0 +1,12 @@
1
+ import { IProperty } from './property';
2
+
3
+ export * from './context';
4
+ export * from './property';
5
+
6
+ export interface IOutputs {
7
+ [key: string]: any
8
+ }
9
+
10
+ export interface IParameters {
11
+ [key: string]: IProperty | undefined;
12
+ }
@@ -0,0 +1,26 @@
1
+ import { IProperty, ITwoOptionsProperty } from "./property";
2
+
3
+ export interface IParameters {
4
+ [key: string]: IProperty | undefined;
5
+ }
6
+
7
+ export interface IInputParameters extends IBaseParameters {
8
+ value: IProperty;
9
+ /**
10
+ * Tells the component to trigger `notifyOutputChanged` on it's unmount changes occured in bound parameter value.
11
+ * Should only be use in edge cases in input based components where the notifyOutputChanged cannot be called naturally via the blur event.
12
+ */
13
+ NotifyOutputChangedOnUnmount?: Omit<ITwoOptionsProperty, 'attributes'>;
14
+ EnableCopyButton?: Omit<ITwoOptionsProperty, 'attributes'>;
15
+ EnableDeleteButton?: Omit<ITwoOptionsProperty, 'attributes'>;
16
+ }
17
+
18
+ export interface IBaseParameters extends IParameters {
19
+ /** default `true` */
20
+ EnableBorder?: Omit<ITwoOptionsProperty, 'attributes'>;
21
+ /**
22
+ * Decides whether the input should get focus on first render.
23
+ */
24
+ AutoFocus?: Omit<ITwoOptionsProperty, 'attributes'>;
25
+ ForceDisable?: Omit<ITwoOptionsProperty, 'attributes'>;
26
+ }
@@ -0,0 +1,111 @@
1
+ import { IEntityColumn, IEntityRecord } from "../components/Grid/interfaces";
2
+
3
+ type ExcludedProps = Pick<ComponentFramework.PropertyTypes.Property, 'formatted'>;
4
+
5
+ export interface IProperty extends Omit<Partial<ComponentFramework.PropertyTypes.Property>, keyof ExcludedProps | 'attributes'> {
6
+ }
7
+
8
+ export interface IStringProperty extends IProperty, Partial<ComponentFramework.PropertyTypes.StringProperty> {
9
+ raw: string | null;
10
+ }
11
+
12
+ export interface ITwoOptionsProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.TwoOptionsProperty>, 'attributes'> {
13
+ raw: boolean,
14
+ attributes: Omit<Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.OptionSetMetadata>, 'DefaultValue'> & {
15
+ Options: [ComponentFramework.PropertyHelper.OptionMetadata, ComponentFramework.PropertyHelper.OptionMetadata]
16
+ };
17
+ }
18
+
19
+ export interface IDecimalNumberProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.DecimalNumberProperty>, 'attributes'> {
20
+ raw: number | null;
21
+ type: 'Whole.None' | 'Decimal' | 'Currency',
22
+ formatted?: string;
23
+ attributes?: Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.DecimalNumberMetadata>
24
+ }
25
+
26
+ export interface IWholeNumberProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.WholeNumberProperty>, 'attributes'> {
27
+ raw: number | null;
28
+ }
29
+
30
+ //@ts-ignore - IMEMode is mandatory, but no longer supported in modern browsers - https://learn.microsoft.com/en-us/power-apps/maker/data-platform/create-edit-field-portal
31
+ export interface IDateTimeProperty extends IProperty, Partial<ComponentFramework.PropertyTypes.DateTimeProperty> {
32
+ raw: Date | null,
33
+ attributes: Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.DateTimeMetadata> & {
34
+ Behavior: ComponentFramework.FormattingApi.Types.DateTimeFieldBehavior
35
+ Format: string;
36
+ };
37
+ }
38
+
39
+ export interface IOptionSetProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.OptionSetProperty>, 'attributes'> {
40
+ raw: number | null,
41
+ attributes: Omit<Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.OptionSetMetadata>, 'DefaultValue'> & {
42
+ Options: ComponentFramework.PropertyHelper.OptionMetadata[]
43
+ };
44
+ }
45
+
46
+ export interface ITwoOptionsProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.TwoOptionsProperty>, 'attributes'> {
47
+ raw: boolean,
48
+ attributes: Omit<Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.OptionSetMetadata>, 'DefaultValue'> & {
49
+ Options: [ComponentFramework.PropertyHelper.OptionMetadata, ComponentFramework.PropertyHelper.OptionMetadata]
50
+ };
51
+ }
52
+
53
+ export interface IMultiSelectOptionSetProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.MultiSelectOptionSetProperty>, 'attributes'> {
54
+ raw: number[] | null,
55
+ attributes: Omit<Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.OptionSetMetadata>, 'DefaultValue'> & {
56
+ Options: ComponentFramework.PropertyHelper.OptionMetadata[]
57
+ };
58
+ }
59
+
60
+ export interface ILookupProperty extends IProperty, Omit<Partial<ComponentFramework.PropertyTypes.LookupProperty>, 'attributes' | 'getViewId'> {
61
+ raw: ComponentFramework.LookupValue[];
62
+ attributes: Partial<ComponentFramework.PropertyHelper.FieldPropertyMetadata.LookupMetadata> & {
63
+ Targets: string[]
64
+ };
65
+ /**
66
+ * Returns the default lookup viewId. Works only for Microsoft PCF's
67
+ */
68
+ getDefaultViewId: (entityName: string) => string,
69
+ /**
70
+ * Gets all views for entity (including non-lookup ones).
71
+ */
72
+ getAllViews: (entityName: string) => Promise<{
73
+ isAvailableInOffline: boolean;
74
+ isDefault: boolean;
75
+ isPinned: boolean;
76
+ isUserView: boolean;
77
+ relatedEntityName: string;
78
+ viewId: string;
79
+ viewName: string;
80
+ fetchXml?: string;
81
+ }[]>
82
+ }
83
+
84
+ export interface IDatasetProperty extends IProperty, Omit<ComponentFramework.PropertyTypes.DataSet, 'error' | 'errorMessage'> {
85
+ columns: IEntityColumn[],
86
+ records: {
87
+ [id: string]: IEntityRecord;
88
+ }
89
+ paging: ComponentFramework.PropertyHelper.DataSetApi.Paging & {
90
+ pageNumber: number
91
+ }
92
+ retrieveRecordCommand: (recordIds: string[], specificCommands?: string[], filterByPriority?: boolean, useNestedFormat?: boolean, refreshAllRules?: boolean) => {
93
+ canExecute: boolean;
94
+ /**
95
+ * Seems to be always empty - buttons present in Flyout and SplitButton are put on first level (the array of buttons is flattened).
96
+ */
97
+ children: any[];
98
+ commandId: string;
99
+ commandButtonId: string;
100
+ controlType: any;
101
+ icon: string;
102
+ label: string;
103
+ shouldBeVisible: boolean;
104
+ tooltip: string;
105
+ /**
106
+ * Temp portal property
107
+ */
108
+ __isInline?: boolean;
109
+ execute: () => Promise<void>;
110
+ }[]
111
+ }
@@ -0,0 +1,137 @@
1
+ import { initializeIcons, Label, TagPicker } from "@fluentui/react";
2
+ import React, { useState } from "react";
3
+ import { Context } from "./mock/Context";
4
+ import { Decimal } from "../components/Decimal/Decimal";
5
+ import { OptionSet } from "../components/OptionSet";
6
+ import { IDecimalNumberProperty, IMultiSelectOptionSetProperty, IOptionSetProperty, ITwoOptionsProperty, IWholeNumberProperty } from "../interfaces";
7
+ import { options } from './shared/optionList';
8
+ import { multiSelectOptions } from './shared/multiSelectOptionList';
9
+ import { MultiSelectOptionSet } from "../components/MultiSelectOptionSet";
10
+ import { TwoOptions } from "../components/TwoOptions";
11
+ import { Duration } from "../components/Duration";
12
+ initializeIcons();
13
+
14
+ export const Sandbox: React.FC = () => {
15
+ //const [value, setValue] = useState<string | Date | undefined>("shit");
16
+ const [value, setValue] = useState<string | Date | undefined>(new Date('2016-08-04T17:14:00Z'));
17
+ const [decimalValue, setDecimalValue] = useState<number>();
18
+ const [selectedValue, setSelectedValue] = useState<number | null>();
19
+ const [selectedKeys, setSelectedKeys] = useState<number[] | undefined>();
20
+ const [twoOptionValue, setTwoOptionValue] = useState<number | undefined>();
21
+ const [duration, setDuration] = useState<number | undefined>();
22
+ const [isMounted, setIsMounted] = useState<boolean>(true);
23
+ const [test, setTest] = useState("");
24
+ const context = new Context();
25
+
26
+ return (
27
+ <>
28
+ <Label>Outside change</Label>
29
+ {/* <TalxisTextField value={value} onChange={(e, value) => setValue(value)} /> */}
30
+ <Decimal
31
+ context={context}
32
+ parameters={{
33
+ EnableBorder: { raw: true },
34
+ EnableCopyButton: { raw: false },
35
+ value: {
36
+ attributes: {
37
+ Precision: 2
38
+ },
39
+ raw: decimalValue ?? null
40
+ } as IDecimalNumberProperty,
41
+ }}
42
+ onNotifyOutputChanged={(outputs) => {
43
+ setDecimalValue(outputs.value);
44
+ }}
45
+ />
46
+ <Label>Component</Label>
47
+ <OptionSet
48
+ context={context}
49
+ parameters={{
50
+ EnableCopyButton: {
51
+ raw: true
52
+ },
53
+ EnableDeleteButton: {
54
+ raw: true
55
+ },
56
+ AutoFocus: {
57
+ raw: true
58
+ },
59
+ value: {
60
+ raw: selectedValue ?? null,
61
+ attributes: {
62
+ DefaultValue: -1,
63
+ Options: options
64
+ }
65
+ } as IOptionSetProperty
66
+ }}
67
+ onNotifyOutputChanged={(outputs) => {
68
+ setSelectedValue(outputs.value);
69
+ }} />
70
+
71
+ <Label>Component</Label>
72
+ <MultiSelectOptionSet
73
+ context={context}
74
+ parameters={{
75
+ value: {
76
+ raw: selectedKeys,
77
+ attributes: {
78
+ DefaultValue: -1,
79
+ Options: multiSelectOptions
80
+ }
81
+ } as IMultiSelectOptionSetProperty
82
+ }}
83
+ onNotifyOutputChanged={(outputs) => {
84
+ setSelectedKeys(outputs.value);
85
+ }}
86
+ />
87
+
88
+ <Label>Component</Label>
89
+ <TwoOptions
90
+ context={context}
91
+ parameters={{
92
+ value: {
93
+ raw: Boolean(twoOptionValue),
94
+ attributes: {
95
+ Options: [
96
+ {
97
+ Label: 'No',
98
+ Value: 0,
99
+ Color: ''
100
+ },
101
+ {
102
+ Label: 'Yes',
103
+ Value: 1,
104
+ Color: ''
105
+ }
106
+ ],
107
+ DisplayName: 'YesNoColumn'
108
+ }
109
+ } as ITwoOptionsProperty
110
+ }}
111
+ onNotifyOutputChanged={(outputs) => {
112
+ //setTwoOptionValue(outputs.value);
113
+ }}
114
+ />
115
+ <Label>Component</Label>
116
+ <Duration
117
+ context={context}
118
+ parameters={{
119
+ EnableCopyButton: {
120
+ raw: true
121
+ },
122
+ EnableDeleteButton: {
123
+ raw: true
124
+ },
125
+ AutoFocus: {
126
+ raw: false
127
+ },
128
+ value: {
129
+ raw: duration ?? null,
130
+ } as IWholeNumberProperty
131
+ }}
132
+ onNotifyOutputChanged={(outputs) => {
133
+ setDuration(outputs.value);
134
+ }} />
135
+ </>
136
+ );
137
+ };
@@ -0,0 +1,18 @@
1
+ import { Formatting } from "./Formatting";
2
+ import { Mode } from "./Mode";
3
+ import { UserSettings } from "./UserSettings";
4
+ import { Utility } from "./Utility";
5
+
6
+ export class Context implements Context {
7
+ mode: ComponentFramework.Mode;
8
+ userSettings: ComponentFramework.UserSettings;
9
+ formatting: ComponentFramework.Formatting;
10
+ utils: ComponentFramework.Utility;
11
+
12
+ constructor() {
13
+ this.mode = new Mode();
14
+ this.userSettings = new UserSettings();
15
+ this.formatting = new Formatting();
16
+ this.utils = new Utility();
17
+ }
18
+ }
@@ -0,0 +1,186 @@
1
+ import dayjs from "dayjs";
2
+
3
+ export class Formatting implements ComponentFramework.Formatting {
4
+
5
+ formatCurrency(value: number, precision: number = 2, symbol: string = '$'): string {
6
+ return symbol + value.toFixed(precision);
7
+ }
8
+
9
+ formatDecimal(value: number, precision: number = 2): string {
10
+ return value.toFixed(precision);
11
+ }
12
+
13
+ formatDateAsFilterStringInUTC(value: Date, includeTime: boolean = false): string {
14
+ const year = value.getUTCFullYear();
15
+ const month = (value.getUTCMonth() + 1).toString().padStart(2, '0');
16
+ const day = value.getUTCDate().toString().padStart(2, '0');
17
+ let formattedDate = `${year}-${month}-${day}`;
18
+ if (includeTime) {
19
+ const hours = value.getUTCHours().toString().padStart(2, '0');
20
+ const minutes = value.getUTCMinutes().toString().padStart(2, '0');
21
+ const seconds = value.getUTCSeconds().toString().padStart(2, '0');
22
+ formattedDate += ` ${hours}:${minutes}:${seconds}`;
23
+ }
24
+ return formattedDate;
25
+ }
26
+
27
+ formatDateLong(value: Date): string {
28
+ return value.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
29
+ }
30
+
31
+ formatDateLongAbbreviated(value: Date): string {
32
+ return value.toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' });
33
+ }
34
+
35
+ formatDateShort(value: Date, includeTime: boolean = false): string {
36
+ let options: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'short', day: 'numeric' };
37
+ if (includeTime) {
38
+ options = { ...options, hour: 'numeric', minute: 'numeric' };
39
+ }
40
+ return value.toLocaleDateString('en-US', options);
41
+ }
42
+
43
+ formatDateYearMonth(value: Date): string {
44
+ return value.toLocaleDateString('en-US', { year: 'numeric', month: 'long' });
45
+ }
46
+
47
+ formatInteger(value: number): string {
48
+ return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
49
+ }
50
+
51
+ formatLanguage(value: number): string {
52
+ // Assuming value corresponds to a language code and returns language name
53
+ return 'Language'; // Placeholder, replace with actual implementation
54
+ }
55
+
56
+ formatTime(value: Date, behavior: ComponentFramework.FormattingApi.Types.DateTimeFieldBehavior): string {
57
+ return dayjs(value).format('DD.MM.YYYY HH:mm')
58
+ // Implementation depends on behavior, e.g., 12-hour clock, 24-hour clock, etc.
59
+ return value.toLocaleTimeString('en-US');
60
+ }
61
+
62
+ getWeekOfYear(value: Date): number {
63
+ const startOfYear = new Date(value.getFullYear(), 0, 0);
64
+ const diff = value.getTime() - startOfYear.getTime();
65
+ const oneWeek = 1000 * 60 * 60 * 24 * 7;
66
+ return Math.floor(diff / oneWeek);
67
+ }
68
+
69
+ }
70
+
71
+ export class NumberFormattingInfo implements ComponentFramework.UserSettingApi.NumberFormattingInfo {
72
+ currencyDecimalDigits: number;
73
+ currencyDecimalSeparator: string;
74
+ currencyGroupSeparator: string;
75
+ currencyGroupSizes: number[];
76
+ currencyNegativePattern: number;
77
+ currencyPositivePattern: number;
78
+ currencySymbol: string;
79
+ nanSymbol: string;
80
+ nativeDigits: string[];
81
+ negativeInfinitySymbol: string;
82
+ negativeSign: string;
83
+ numberDecimalDigits: number;
84
+ numberDecimalSeparator: string;
85
+ numberGroupSeparator: string;
86
+ numberGroupSizes: number[];
87
+ numberNegativePattern: number;
88
+ perMilleSymbol: string;
89
+ percentDecimalDigits: number;
90
+ percentDecimalSeparator: string;
91
+ percentGroupSeparator: string;
92
+ percentGroupSizes: number[];
93
+ percentNegativePattern: number;
94
+ percentPositivePattern: number;
95
+ percentSymbol: string;
96
+ positiveInfinitySymbol: string;
97
+ positiveSign: string;
98
+
99
+ constructor() {
100
+ this.currencyDecimalDigits = 2;
101
+ this.currencyDecimalSeparator = '.';
102
+ this.currencyGroupSeparator = ',';
103
+ this.currencyGroupSizes = [3];
104
+ this.currencyNegativePattern = 1;
105
+ this.currencyPositivePattern = 0;
106
+ this.currencySymbol = '$';
107
+ this.nanSymbol = 'NaN';
108
+ this.nativeDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
109
+ this.negativeInfinitySymbol = '-Infinity';
110
+ this.negativeSign = '-';
111
+ this.numberDecimalDigits = 2;
112
+ this.numberDecimalSeparator = ',';
113
+ this.numberGroupSeparator = ' ';
114
+ this.numberGroupSizes = [3];
115
+ this.numberNegativePattern = 1;
116
+ this.perMilleSymbol = '%';
117
+ this.percentDecimalDigits = 2;
118
+ this.percentDecimalSeparator = '.';
119
+ this.percentGroupSeparator = ',';
120
+ this.percentGroupSizes = [3];
121
+ this.percentNegativePattern = 1;
122
+ this.percentPositivePattern = 1;
123
+ this.percentSymbol = '%';
124
+ this.positiveInfinitySymbol = 'Infinity';
125
+ this.positiveSign = '+';
126
+ }
127
+ }
128
+
129
+ export class DateFormattingInfo implements ComponentFramework.UserSettingApi.DateFormattingInfo {
130
+ amDesignator: string;
131
+ abbreviatedDayNames: string[];
132
+ abbreviatedMonthGenitiveNames: string[];
133
+ abbreviatedMonthNames: string[];
134
+ calendarWeekRule: number;
135
+ calendar: ComponentFramework.UserSettingApi.Calendar;
136
+ dateSeparator: string;
137
+ dayNames: string[];
138
+ firstDayOfWeek: ComponentFramework.UserSettingApi.Types.DayOfWeek;
139
+ fullDateTimePattern: string;
140
+ longDatePattern: string;
141
+ longTimePattern: string;
142
+ monthDayPattern: string;
143
+ monthGenitiveNames: string[];
144
+ monthNames: string[];
145
+ pmDesignator: string;
146
+ shortDatePattern: string;
147
+ shortTimePattern: string;
148
+ shortestDayNames: string[];
149
+ sortableDateTimePattern: string;
150
+ timeSeparator: string;
151
+ universalSortableDateTimePattern: string;
152
+ yearMonthPattern: string;
153
+
154
+ constructor() {
155
+ this.amDesignator = 'AM';
156
+ this.abbreviatedDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
157
+ this.abbreviatedMonthGenitiveNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
158
+ this.abbreviatedMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
159
+ this.calendarWeekRule = 0;
160
+ this.calendar = {
161
+ minSupportedDateTime: new Date(-62135568000000),
162
+ maxSupportedDateTime: new Date(253402300799999),
163
+ algorithmType: 1,
164
+ calendarType: 1,
165
+ twoDigitYearMax: 2029
166
+ }
167
+ this.dateSeparator = '.';
168
+ this.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
169
+ this.firstDayOfWeek = 0;
170
+ this.fullDateTimePattern = 'dddd, MMMM d, yyyy h:mm:ss tt';
171
+ this.longDatePattern = 'dddd, MMMM d, yyyy';
172
+ this.longTimePattern = 'h:mm:ss tt';
173
+ this.monthDayPattern = 'MMMM d';
174
+ this.monthGenitiveNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
175
+ this.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
176
+ this.pmDesignator = 'PM';
177
+ this.shortDatePattern = 'dd/MM/yyyy';
178
+ this.shortTimePattern = 'h:mm';
179
+ this.shortestDayNames = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
180
+ this.sortableDateTimePattern = 'yyyy-MM-ddTHH:mm:ss';
181
+ this.timeSeparator = ':';
182
+ this.universalSortableDateTimePattern = 'yyyy-MM-dd HH:mm:ssZ';
183
+ this.yearMonthPattern = 'MMMM yyyy';
184
+ }
185
+ }
186
+
@@ -0,0 +1,25 @@
1
+ export class Mode implements ComponentFramework.Mode {
2
+ allocatedHeight: number;
3
+ allocatedWidth: number;
4
+ isControlDisabled: boolean;
5
+ isVisible: boolean;
6
+ label: string;
7
+
8
+ constructor() {
9
+ this.allocatedHeight = 42;
10
+ this.allocatedWidth = 260;
11
+ this.isControlDisabled = false;
12
+ this.isVisible = true;
13
+ this.label = 'Label'
14
+ }
15
+ setControlState(state: ComponentFramework.Dictionary): boolean {
16
+ throw new Error("Method not implemented.");
17
+ }
18
+ setFullScreen(value: boolean): void {
19
+ throw new Error("Method not implemented.");
20
+ }
21
+ trackContainerResize(value: boolean): void {
22
+ throw new Error("Method not implemented.");
23
+ }
24
+
25
+ }
@@ -0,0 +1,31 @@
1
+ import { DateFormattingInfo, NumberFormattingInfo } from "./Formatting";
2
+
3
+ export class UserSettings implements ComponentFramework.UserSettings {
4
+ dateFormattingInfo: ComponentFramework.UserSettingApi.DateFormattingInfo;
5
+ isRTL: boolean;
6
+ languageId: number;
7
+ locale: string;
8
+ numberFormattingInfo: ComponentFramework.UserSettingApi.NumberFormattingInfo;
9
+ securityRoles: string[];
10
+ userId: string;
11
+ userName: string;
12
+
13
+ constructor() {
14
+ this.userName = 'Test User';
15
+ this.userId = '00000000-0000-0000-0000-000000000000';
16
+ this.securityRoles = [];
17
+ this.languageId = 1033;
18
+ this.isRTL = false;
19
+ this.locale = 'en-US'
20
+ this.numberFormattingInfo = new NumberFormattingInfo();
21
+ this.dateFormattingInfo = new DateFormattingInfo();
22
+ }
23
+
24
+ getTimeZoneOffsetMinutes(date?: Date | undefined): number {
25
+ // Sample implementation to get timezone offset in minutes
26
+ if (!date) {
27
+ date = new Date(); // If no date is provided, use the current date
28
+ }
29
+ return date.getTimezoneOffset(); // Return timezone offset in minutes
30
+ }
31
+ }