namirasoft-site-react 1.5.27 → 1.5.29

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 (365) hide show
  1. package/.dockerignore +86 -86
  2. package/.env.template +10 -10
  3. package/Dockerfile +18 -18
  4. package/SKILL.md +307 -307
  5. package/config-overrides.js +72 -72
  6. package/dist/App.css +33 -33
  7. package/dist/App.js +3 -25
  8. package/dist/App.js.map +1 -1
  9. package/dist/components/NSBanner.module.css +47 -47
  10. package/dist/components/NSBarAction.module.css +91 -91
  11. package/dist/components/NSBarAlert.module.css +79 -79
  12. package/dist/components/NSBarNotification.module.css +34 -34
  13. package/dist/components/NSBarTitle.module.css +9 -9
  14. package/dist/components/NSBox.module.css +87 -87
  15. package/dist/components/NSBoxBaseCombo.module.css +24 -24
  16. package/dist/components/NSBoxBoolean.js +1 -1
  17. package/dist/components/NSBoxBoolean.js.map +1 -1
  18. package/dist/components/NSBoxBoolean.module.css +73 -73
  19. package/dist/components/NSBoxDate.module.css +4 -4
  20. package/dist/components/NSBoxDateRangeBase.module.css +73 -73
  21. package/dist/components/NSBoxDateTime.module.css +4 -4
  22. package/dist/components/NSBoxDuration.module.css +4 -4
  23. package/dist/components/NSBoxFile.module.css +10 -10
  24. package/dist/components/NSBoxInteger.module.css +16 -16
  25. package/dist/components/NSBoxOptions.module.css +53 -53
  26. package/dist/components/NSBoxPhone.module.css +35 -35
  27. package/dist/components/NSBoxRadio.module.css +33 -33
  28. package/dist/components/NSBoxSchemaBase.module.css +17 -17
  29. package/dist/components/NSBoxSchemaVariable.module.css +16 -16
  30. package/dist/components/NSBoxTextArea.module.css +12 -12
  31. package/dist/components/NSBoxTime.module.css +4 -4
  32. package/dist/components/NSButton.module.css +57 -57
  33. package/dist/components/NSButtonBlue.module.css +4 -4
  34. package/dist/components/NSButtonGreen.module.css +4 -4
  35. package/dist/components/NSButtonRed.module.css +4 -4
  36. package/dist/components/NSCard.module.css +113 -113
  37. package/dist/components/NSCardScreenshot.module.css +41 -41
  38. package/dist/components/NSColumn.module.css +16 -16
  39. package/dist/components/NSCopyBox.module.css +39 -39
  40. package/dist/components/NSDialog.module.css +105 -105
  41. package/dist/components/NSDialogPageSelection.module.css +103 -103
  42. package/dist/components/NSDownTimer.module.css +55 -55
  43. package/dist/components/NSDownload.module.css +46 -46
  44. package/dist/components/NSElectronicCard.module.css +60 -60
  45. package/dist/components/NSEntityCardBackground.module.css +27 -27
  46. package/dist/components/NSFilterBox.module.css +27 -27
  47. package/dist/components/NSFilterBoxItems.module.css +15 -15
  48. package/dist/components/NSFilterItem.module.css +24 -24
  49. package/dist/components/NSFooter.module.css +140 -140
  50. package/dist/components/NSGauge.module.css +67 -67
  51. package/dist/components/NSGaugeDate.module.css +57 -57
  52. package/dist/components/NSGaugeNumber.module.css +66 -66
  53. package/dist/components/NSHeader.module.css +316 -316
  54. package/dist/components/NSHeaderScreenshot.module.css +35 -35
  55. package/dist/components/NSLabel.module.css +25 -25
  56. package/dist/components/NSLabelErrorNotifier.module.css +2 -2
  57. package/dist/components/NSLabelSensitive.module.css +9 -9
  58. package/dist/components/NSLayout.module.css +22 -22
  59. package/dist/components/NSLine.module.css +15 -15
  60. package/dist/components/NSLineText.module.css +38 -38
  61. package/dist/components/NSLink.module.css +36 -36
  62. package/dist/components/NSListGrouped.module.css +69 -69
  63. package/dist/components/NSLoading.module.css +10 -10
  64. package/dist/components/NSMegaMenu.module.css +133 -133
  65. package/dist/components/NSMenuAction.module.css +88 -88
  66. package/dist/components/NSMenuButton.module.css +44 -44
  67. package/dist/components/NSNoData.module.css +11 -11
  68. package/dist/components/NSPagination.module.css +94 -94
  69. package/dist/components/NSPanel.module.css +28 -28
  70. package/dist/components/NSPanelAccordion.module.css +4 -4
  71. package/dist/components/NSProductSearch.module.css +73 -73
  72. package/dist/components/NSProgressBar.module.css +38 -38
  73. package/dist/components/NSRange.module.css +66 -66
  74. package/dist/components/NSReorderDialog.d.ts +3 -0
  75. package/dist/components/NSReorderDialog.js +10 -4
  76. package/dist/components/NSReorderDialog.js.map +1 -1
  77. package/dist/components/NSReorderDialog.module.css +53 -49
  78. package/dist/components/NSRow.module.css +17 -17
  79. package/dist/components/NSSection.module.css +4 -4
  80. package/dist/components/NSSectionCards.module.css +38 -38
  81. package/dist/components/NSSectionTiles.module.css +10 -10
  82. package/dist/components/NSSplitter.d.ts +3 -0
  83. package/dist/components/NSSplitter.js +25 -2
  84. package/dist/components/NSSplitter.js.map +1 -1
  85. package/dist/components/NSSplitter.module.css +59 -59
  86. package/dist/components/NSTabPage.module.css +59 -59
  87. package/dist/components/NSTable.js +23 -23
  88. package/dist/components/NSTable.module.css +376 -374
  89. package/dist/components/NSTableChart.module.css +119 -119
  90. package/dist/components/NSTile.module.css +76 -76
  91. package/dist/components/NSTimelineMonthly.module.css +71 -71
  92. package/dist/components/NSTitle.module.css +15 -15
  93. package/dist/index.css +5 -5
  94. package/dist/pages/NSImplementing.module.css +35 -35
  95. package/dist/pages/NSNotFoundPage.module.css +18 -18
  96. package/dist/pages/NSUpdating.module.css +35 -35
  97. package/package.json +86 -86
  98. package/public/index.html +38 -38
  99. package/src/App.css +33 -33
  100. package/src/App.tsx +850 -870
  101. package/src/BrowserDetector.ts +109 -109
  102. package/src/Color.tsx +10 -10
  103. package/src/CopyToClipboard.ts +6 -6
  104. package/src/EncryptionOperation.ts +98 -98
  105. package/src/KeyOperation.ts +109 -109
  106. package/src/LinkOperation.ts +101 -101
  107. package/src/NSBoxBuilder.tsx +922 -922
  108. package/src/ProductCacheService.ts +36 -36
  109. package/src/Validator.ts +199 -199
  110. package/src/components/INSBox.tsx +7 -7
  111. package/src/components/NSBanner.module.css +47 -47
  112. package/src/components/NSBanner.tsx +80 -80
  113. package/src/components/NSBarAction.module.css +91 -91
  114. package/src/components/NSBarAction.tsx +95 -95
  115. package/src/components/NSBarAlert.module.css +79 -79
  116. package/src/components/NSBarAlert.tsx +35 -35
  117. package/src/components/NSBarNotification.module.css +34 -34
  118. package/src/components/NSBarNotification.tsx +89 -89
  119. package/src/components/NSBarTitle.module.css +9 -9
  120. package/src/components/NSBarTitle.tsx +23 -23
  121. package/src/components/NSBox.module.css +87 -87
  122. package/src/components/NSBox.tsx +19 -19
  123. package/src/components/NSBoxBaseCombo.module.css +24 -24
  124. package/src/components/NSBoxBaseCombo.tsx +501 -501
  125. package/src/components/NSBoxBaseLayout.tsx +163 -163
  126. package/src/components/NSBoxBaseLayoutRecursive.tsx +59 -59
  127. package/src/components/NSBoxBoolean.module.css +73 -73
  128. package/src/components/NSBoxBoolean.tsx +151 -152
  129. package/src/components/NSBoxBooleans.tsx +181 -181
  130. package/src/components/NSBoxColor.tsx +107 -107
  131. package/src/components/NSBoxCombo.tsx +95 -95
  132. package/src/components/NSBoxDate.module.css +4 -4
  133. package/src/components/NSBoxDate.tsx +144 -144
  134. package/src/components/NSBoxDateRange.tsx +88 -88
  135. package/src/components/NSBoxDateRangeBase.module.css +73 -73
  136. package/src/components/NSBoxDateRangeBase.tsx +236 -236
  137. package/src/components/NSBoxDateTime.module.css +4 -4
  138. package/src/components/NSBoxDateTime.tsx +136 -136
  139. package/src/components/NSBoxDateTimeRange.tsx +66 -66
  140. package/src/components/NSBoxDouble.tsx +110 -110
  141. package/src/components/NSBoxDuration.module.css +4 -4
  142. package/src/components/NSBoxDuration.tsx +107 -107
  143. package/src/components/NSBoxDynamic.tsx +73 -73
  144. package/src/components/NSBoxDynamics.tsx +68 -68
  145. package/src/components/NSBoxEmail.tsx +117 -117
  146. package/src/components/NSBoxEntity.tsx +180 -180
  147. package/src/components/NSBoxEnum.tsx +113 -113
  148. package/src/components/NSBoxFile.module.css +10 -10
  149. package/src/components/NSBoxFile.tsx +106 -106
  150. package/src/components/NSBoxFilePath.tsx +106 -106
  151. package/src/components/NSBoxFont.tsx +107 -107
  152. package/src/components/NSBoxIPV4.tsx +107 -107
  153. package/src/components/NSBoxIPV4Range.tsx +107 -107
  154. package/src/components/NSBoxIPV6.tsx +104 -104
  155. package/src/components/NSBoxIPV6Range.tsx +107 -107
  156. package/src/components/NSBoxInteger.module.css +16 -16
  157. package/src/components/NSBoxInteger.tsx +126 -126
  158. package/src/components/NSBoxMoney.tsx +115 -115
  159. package/src/components/NSBoxOptions.module.css +53 -53
  160. package/src/components/NSBoxOptions.tsx +182 -182
  161. package/src/components/NSBoxPhone.module.css +35 -35
  162. package/src/components/NSBoxPhone.tsx +120 -120
  163. package/src/components/NSBoxRadio.module.css +33 -33
  164. package/src/components/NSBoxRadio.tsx +104 -104
  165. package/src/components/NSBoxSchemaBase.module.css +17 -17
  166. package/src/components/NSBoxSchemaBase.tsx +562 -562
  167. package/src/components/NSBoxSchemaVariable.module.css +16 -16
  168. package/src/components/NSBoxSchemaVariable.tsx +262 -262
  169. package/src/components/NSBoxSearch.tsx +112 -112
  170. package/src/components/NSBoxSensitive.tsx +133 -133
  171. package/src/components/NSBoxString.tsx +106 -106
  172. package/src/components/NSBoxTextArea.module.css +12 -12
  173. package/src/components/NSBoxTextArea.tsx +136 -136
  174. package/src/components/NSBoxTime.module.css +4 -4
  175. package/src/components/NSBoxTime.tsx +106 -106
  176. package/src/components/NSBoxTimeRange.tsx +220 -220
  177. package/src/components/NSBoxTimeZone.tsx +122 -122
  178. package/src/components/NSBoxURL.tsx +117 -117
  179. package/src/components/NSBoxVersion.tsx +107 -107
  180. package/src/components/NSButton.module.css +57 -57
  181. package/src/components/NSButton.tsx +74 -74
  182. package/src/components/NSButtonBlue.module.css +4 -4
  183. package/src/components/NSButtonBlue.tsx +29 -29
  184. package/src/components/NSButtonGreen.module.css +4 -4
  185. package/src/components/NSButtonGreen.tsx +29 -29
  186. package/src/components/NSButtonRed.module.css +4 -4
  187. package/src/components/NSButtonRed.tsx +29 -29
  188. package/src/components/NSCard.module.css +113 -113
  189. package/src/components/NSCard.tsx +67 -67
  190. package/src/components/NSCardScreenshot.module.css +41 -41
  191. package/src/components/NSCardScreenshot.tsx +31 -31
  192. package/src/components/NSChartBar.tsx +134 -134
  193. package/src/components/NSChartDoughnut.tsx +114 -114
  194. package/src/components/NSChartLine.tsx +110 -110
  195. package/src/components/NSChartPie.tsx +105 -105
  196. package/src/components/NSChartRange.tsx +14 -14
  197. package/src/components/NSColumn.module.css +16 -16
  198. package/src/components/NSColumn.tsx +24 -24
  199. package/src/components/NSCopy.tsx +95 -95
  200. package/src/components/NSCopyBox.module.css +39 -39
  201. package/src/components/NSCopyBox.tsx +53 -53
  202. package/src/components/NSDialog.module.css +105 -105
  203. package/src/components/NSDialog.tsx +72 -72
  204. package/src/components/NSDialogBox.tsx +38 -38
  205. package/src/components/NSDialogBoxDate.tsx +28 -28
  206. package/src/components/NSDialogBoxDateTime.tsx +28 -28
  207. package/src/components/NSDialogBoxPhone.tsx +28 -28
  208. package/src/components/NSDialogBoxString.tsx +28 -28
  209. package/src/components/NSDialogDelete.tsx +36 -36
  210. package/src/components/NSDialogInfo.tsx +49 -49
  211. package/src/components/NSDialogPageSelection.module.css +103 -103
  212. package/src/components/NSDialogPageSelection.tsx +233 -233
  213. package/src/components/NSDownTimer.module.css +55 -55
  214. package/src/components/NSDownTimer.tsx +91 -91
  215. package/src/components/NSDownload.module.css +46 -46
  216. package/src/components/NSDownload.tsx +69 -69
  217. package/src/components/NSElectronicCard.module.css +60 -60
  218. package/src/components/NSElectronicCard.tsx +46 -46
  219. package/src/components/NSEntityCardBackground.module.css +27 -27
  220. package/src/components/NSEntityCardBackground.tsx +36 -36
  221. package/src/components/NSFilterBox.module.css +27 -27
  222. package/src/components/NSFilterBox.tsx +477 -477
  223. package/src/components/NSFilterBoxItems.module.css +15 -15
  224. package/src/components/NSFilterBoxItems.tsx +52 -52
  225. package/src/components/NSFilterItem.module.css +24 -24
  226. package/src/components/NSFilterItem.tsx +27 -27
  227. package/src/components/NSFooter.module.css +140 -140
  228. package/src/components/NSFooter.tsx +321 -321
  229. package/src/components/NSGauge.module.css +67 -67
  230. package/src/components/NSGauge.tsx +52 -52
  231. package/src/components/NSGaugeDate.module.css +57 -57
  232. package/src/components/NSGaugeDate.tsx +125 -125
  233. package/src/components/NSGaugeNumber.module.css +66 -66
  234. package/src/components/NSGaugeNumber.tsx +93 -93
  235. package/src/components/NSHeader.module.css +316 -316
  236. package/src/components/NSHeader.tsx +337 -337
  237. package/src/components/NSHeaderScreenshot.module.css +35 -35
  238. package/src/components/NSHeaderScreenshot.tsx +39 -39
  239. package/src/components/NSID.tsx +178 -178
  240. package/src/components/NSInfo.tsx +50 -50
  241. package/src/components/NSLabel.module.css +25 -25
  242. package/src/components/NSLabel.tsx +47 -47
  243. package/src/components/NSLabelErrorNotifier.module.css +2 -2
  244. package/src/components/NSLabelErrorNotifier.tsx +35 -35
  245. package/src/components/NSLabelSensitive.module.css +9 -9
  246. package/src/components/NSLabelSensitive.tsx +101 -101
  247. package/src/components/NSLayout.module.css +22 -22
  248. package/src/components/NSLayout.tsx +143 -143
  249. package/src/components/NSLine.module.css +15 -15
  250. package/src/components/NSLine.tsx +13 -13
  251. package/src/components/NSLineText.module.css +38 -38
  252. package/src/components/NSLineText.tsx +17 -17
  253. package/src/components/NSLink.module.css +36 -36
  254. package/src/components/NSLink.tsx +26 -26
  255. package/src/components/NSLinkBlue.tsx +22 -22
  256. package/src/components/NSLinkGreen.tsx +13 -13
  257. package/src/components/NSLinkRed.tsx +13 -13
  258. package/src/components/NSListGrouped.module.css +69 -69
  259. package/src/components/NSListGrouped.tsx +106 -106
  260. package/src/components/NSListProduct.tsx +78 -78
  261. package/src/components/NSLoading.module.css +10 -10
  262. package/src/components/NSLoading.tsx +43 -43
  263. package/src/components/NSMegaMenu.module.css +133 -133
  264. package/src/components/NSMegaMenu.tsx +188 -188
  265. package/src/components/NSMenuAction.module.css +88 -88
  266. package/src/components/NSMenuAction.tsx +106 -106
  267. package/src/components/NSMenuButton.module.css +44 -44
  268. package/src/components/NSMenuButton.tsx +198 -198
  269. package/src/components/NSNoData.module.css +11 -11
  270. package/src/components/NSNoData.tsx +24 -24
  271. package/src/components/NSPagination.module.css +94 -94
  272. package/src/components/NSPagination.tsx +182 -182
  273. package/src/components/NSPanel.module.css +28 -28
  274. package/src/components/NSPanel.tsx +26 -26
  275. package/src/components/NSPanelAccordion.module.css +4 -4
  276. package/src/components/NSPanelAccordion.tsx +51 -51
  277. package/src/components/NSProductSearch.module.css +73 -73
  278. package/src/components/NSProductSearch.tsx +193 -193
  279. package/src/components/NSProgressBar.module.css +38 -38
  280. package/src/components/NSProgressBar.tsx +29 -29
  281. package/src/components/NSRange.module.css +66 -66
  282. package/src/components/NSRange.tsx +83 -83
  283. package/src/components/NSReorderDialog.module.css +53 -49
  284. package/src/components/NSReorderDialog.tsx +203 -184
  285. package/src/components/NSRepeater.tsx +327 -327
  286. package/src/components/NSRepeaterNSBoxSchemaVariable.tsx +96 -96
  287. package/src/components/NSRepeaterNSTag.tsx +86 -86
  288. package/src/components/NSRow.module.css +17 -17
  289. package/src/components/NSRow.tsx +24 -24
  290. package/src/components/NSSection.module.css +4 -4
  291. package/src/components/NSSection.tsx +26 -26
  292. package/src/components/NSSectionCards.module.css +38 -38
  293. package/src/components/NSSectionCards.tsx +51 -51
  294. package/src/components/NSSectionTiles.module.css +10 -10
  295. package/src/components/NSSectionTiles.tsx +25 -25
  296. package/src/components/NSSectionTitle.tsx +19 -19
  297. package/src/components/NSSortDialog.tsx +124 -124
  298. package/src/components/NSSpace.tsx +28 -28
  299. package/src/components/NSSplitter.module.css +59 -59
  300. package/src/components/NSSplitter.tsx +244 -211
  301. package/src/components/NSTabPage.module.css +59 -59
  302. package/src/components/NSTabPage.tsx +122 -122
  303. package/src/components/NSTable.module.css +376 -374
  304. package/src/components/NSTable.tsx +1451 -1451
  305. package/src/components/NSTableChart.module.css +119 -119
  306. package/src/components/NSTableChart.tsx +732 -732
  307. package/src/components/NSTag.tsx +74 -74
  308. package/src/components/NSTile.module.css +76 -76
  309. package/src/components/NSTile.tsx +27 -27
  310. package/src/components/NSTimelineMonthly.module.css +71 -71
  311. package/src/components/NSTimelineMonthly.tsx +44 -44
  312. package/src/components/NSTitle.module.css +15 -15
  313. package/src/components/NSTitle.tsx +19 -19
  314. package/src/css.d.ts +13 -13
  315. package/src/formatter/BackColorFormatter.tsx +23 -23
  316. package/src/formatter/BaseColumnFormatter.ts +86 -86
  317. package/src/formatter/BaseURLImageFormatter.tsx +37 -37
  318. package/src/formatter/BooleanFormatter.ts +26 -26
  319. package/src/formatter/BytesFormatter.tsx +19 -19
  320. package/src/formatter/DateFormatter.ts +26 -26
  321. package/src/formatter/DateTimeFormatter.ts +26 -26
  322. package/src/formatter/DurationFormatter.ts +17 -17
  323. package/src/formatter/EmailFormatter.tsx +25 -25
  324. package/src/formatter/EnumFormatter.ts +17 -17
  325. package/src/formatter/FloatFormatter.ts +27 -27
  326. package/src/formatter/ForeColorFormatter.tsx +24 -24
  327. package/src/formatter/IDFormatter.tsx +58 -58
  328. package/src/formatter/IPFormatter.ts +39 -39
  329. package/src/formatter/IntegerFormatter.ts +27 -27
  330. package/src/formatter/JsonFormatter.tsx +75 -75
  331. package/src/formatter/MoneyFormatter.ts +39 -39
  332. package/src/formatter/PercentFormatter.tsx +43 -43
  333. package/src/formatter/PhoneFormatter.tsx +25 -25
  334. package/src/formatter/SensitiveFormatter.tsx +40 -40
  335. package/src/formatter/StringFormatter.tsx +49 -49
  336. package/src/formatter/TimeFormatter.ts +25 -25
  337. package/src/formatter/URLFormatter.tsx +28 -28
  338. package/src/formatter/UnknowFormatter.ts +22 -22
  339. package/src/index.css +5 -5
  340. package/src/index.tsx +7 -7
  341. package/src/main.ts +263 -263
  342. package/src/pages/NSImplementing.module.css +35 -35
  343. package/src/pages/NSImplementing.tsx +32 -32
  344. package/src/pages/NSNotFoundPage.module.css +18 -18
  345. package/src/pages/NSNotFoundPage.tsx +14 -14
  346. package/src/pages/NSUpdating.module.css +35 -35
  347. package/src/pages/NSUpdating.tsx +32 -32
  348. package/src/props/IBackgroundProps.ts +5 -5
  349. package/src/props/IBaseComponentProps.ts +8 -8
  350. package/src/props/IHeaderIconProps.ts +10 -10
  351. package/src/props/IHeaderLeftProps.ts +6 -6
  352. package/src/props/IHeaderRightProps.ts +8 -8
  353. package/src/props/IImageProps.ts +4 -4
  354. package/src/props/ILinkProps.ts +4 -4
  355. package/src/props/IValidationNumberProps.ts +4 -4
  356. package/src/props/IValidationPrecisionProps.ts +3 -3
  357. package/src/props/IValidationProps.ts +9 -9
  358. package/src/props/IValidationRegexProps.ts +4 -4
  359. package/src/props/IValidationStringProps.ts +4 -4
  360. package/src/routing/NSNotifier.ts +114 -114
  361. package/src/routing/NSRouterMaker.tsx +28 -28
  362. package/tsconfig.json +43 -43
  363. package/dist/components/NSListMenu.d.ts +0 -9
  364. package/dist/components/NSListMenu.js +0 -135
  365. package/dist/components/NSListMenu.js.map +0 -1
@@ -1,237 +1,237 @@
1
- "use client";
2
-
3
- import type { Dayjs } from 'dayjs';
4
- import dayjs from 'dayjs';
5
- import { TimeOperation } from 'namirasoft-core';
6
- import { Component, createRef } from 'react';
7
- import { IBaseComponentProps } from '../props/IBaseComponentProps';
8
- import { IValidationProps } from '../props/IValidationProps';
9
- import { INSBox } from './INSBox';
10
- import { INSBoxBaseLayoutProps, NSBoxBaseLayout } from './NSBoxBaseLayout';
11
- import Styles from './NSBoxDateRangeBase.module.css';
12
- import { safeMenuMenuItem } from './NSMenuButton';
13
-
14
- export interface NSBoxDateRangeValue
15
- {
16
- from: Date;
17
- to: Date;
18
- }
19
-
20
- export interface NSBoxDateRangeStringValue
21
- {
22
- from: string;
23
- to: string;
24
- }
25
-
26
- export interface NSBoxDateRangePreset
27
- {
28
- shortName: string;
29
- title?: string;
30
- getFrom: () => Date;
31
- getTo: () => Date;
32
- }
33
-
34
- export interface NSBoxDateRangeBaseProps<TBox> extends IBaseComponentProps, IValidationProps, INSBoxBaseLayoutProps<TBox, NSBoxDateRangeValue>
35
- {
36
- minDate?: Date;
37
- maxDate?: Date;
38
- preset?: boolean;
39
- presets?: NSBoxDateRangePreset[];
40
- }
41
-
42
- export interface NSBoxDateRangeBaseState
43
- {
44
- value: NSBoxDateRangeValue | null;
45
- }
46
-
47
- export abstract class NSBoxDateRangeBase<TProps extends NSBoxDateRangeBaseProps<any>>
48
- extends Component<TProps, NSBoxDateRangeBaseState> implements INSBox
49
- {
50
- NSBoxBaseLayout_Main = createRef<NSBoxBaseLayout>();
51
-
52
- constructor(props: TProps)
53
- {
54
- super(props);
55
- this.state = { value: props.defaultValue ?? null };
56
- this.isEmpty = this.isEmpty.bind(this);
57
- this.getError = this.getError.bind(this);
58
- this.getValue = this.getValue.bind(this);
59
- this.setValue = this.setValue.bind(this);
60
- this.getValueString = this.getValueString.bind(this);
61
- this.setValueString = this.setValueString.bind(this);
62
- }
63
-
64
- isEmpty(value: NSBoxDateRangeValue): boolean
65
- {
66
- return !value || !value.from || !value.to;
67
- }
68
-
69
- abstract getError(): string | null;
70
-
71
- getValue(checkError: boolean = true): NSBoxDateRangeValue | null
72
- {
73
- if (this.props.nullable)
74
- if (this.NSBoxBaseLayout_Main.current?.isNull())
75
- return null;
76
- return NSBoxBaseLayout.checkGetValue(this, checkError, () => this.state.value);
77
- }
78
-
79
- setValue(value: NSBoxDateRangeValue | null, callback?: () => void): void
80
- {
81
- if (this.props.nullable)
82
- this.NSBoxBaseLayout_Main.current?.setNull(value == null);
83
- this.setState({ value }, () =>
84
- {
85
- this.props.onChanged?.(this);
86
- callback?.();
87
- });
88
- }
89
-
90
- getValueString(checkError: boolean = true): NSBoxDateRangeStringValue | null
91
- {
92
- const value = this.getValue(checkError);
93
- if (value?.from && value?.to)
94
- try
95
- {
96
- const fmt = this.getStringFormat();
97
- return { from: TimeOperation.format(value.from, fmt), to: TimeOperation.format(value.to, fmt) };
98
- }
99
- catch { }
100
- return null;
101
- }
102
-
103
- setValueString(value: NSBoxDateRangeStringValue | null, callback?: () => void): void
104
- {
105
- if (!value || !value.from || !value.to)
106
- {
107
- this.setValue(null, callback);
108
- return;
109
- }
110
- const fmt = this.getStringFormat();
111
- const from = dayjs(value.from, fmt).toDate();
112
- const to = dayjs(value.to, fmt).toDate();
113
- if (!isNaN(from.getTime()) && !isNaN(to.getTime()))
114
- this.setValue({ from, to }, callback);
115
- else
116
- this.setValue(null, callback);
117
- }
118
-
119
- setDisabled(disabled: boolean): void
120
- {
121
- this.NSBoxBaseLayout_Main.current?.setDisabled(disabled);
122
- }
123
-
124
- protected abstract getFormat(): string;
125
- protected getStringFormat(): string { return this.getFormat(); }
126
- protected abstract getBuiltinPresets(): { label: string; title: string; from: Date; to: Date }[];
127
- protected abstract renderPicker(): React.ReactNode;
128
-
129
- protected normalizeValue(value: NSBoxDateRangeValue): NSBoxDateRangeValue { return value; }
130
-
131
- protected toDayjsValue(): [Dayjs, Dayjs] | null
132
- {
133
- const { value } = this.state;
134
- if (!value?.from || !value?.to)
135
- return null;
136
- return [dayjs(value.from), dayjs(value.to)];
137
- }
138
-
139
- private isInRange(from: Date, to: Date): boolean
140
- {
141
- const { minDate, maxDate } = this.props;
142
- if (minDate && from < minDate) return false;
143
- if (maxDate && to > maxDate) return false;
144
- return true;
145
- }
146
-
147
- private renderPresets(): React.ReactNode
148
- {
149
- const { preset, presets: customPresets } = this.props;
150
-
151
- const builtinPresets = preset
152
- ? this.getBuiltinPresets().filter(p => this.isInRange(p.from, p.to))
153
- : [];
154
-
155
- const resolvedCustom = (customPresets ?? [])
156
- .map(p => ({
157
- shortName: p.shortName,
158
- title: p.title,
159
- from: p.getFrom(),
160
- to: p.getTo(),
161
- }))
162
- .filter(p => this.isInRange(p.from, p.to));
163
-
164
- const showDivider = builtinPresets.length > 0 && resolvedCustom.length > 0;
165
-
166
- return (
167
- <div className={Styles.ns_preset_container}>
168
- {builtinPresets.map(p =>
169
- {
170
- const norm = this.normalizeValue({ from: p.from, to: p.to });
171
- const isActive = this.state.value?.from.getTime() === norm.from.getTime()
172
- && this.state.value?.to.getTime() === norm.to.getTime();
173
- return (
174
- <button
175
- key={p.label}
176
- type="button"
177
- title={p.title}
178
- className={`${Styles.ns_preset_btn} ${isActive ? Styles.ns_preset_btn_active : ''}`}
179
- onClick={() => this.setValue({ from: p.from, to: p.to })}
180
- >
181
- {p.label}
182
- </button>
183
- );
184
- })}
185
- {showDivider && <div className={Styles.ns_preset_divider} />}
186
- {resolvedCustom.map(p =>
187
- {
188
- const norm = this.normalizeValue({ from: p.from, to: p.to });
189
- const isActive = this.state.value?.from.getTime() === norm.from.getTime()
190
- && this.state.value?.to.getTime() === norm.to.getTime();
191
- return (
192
- <button
193
- key={p.shortName}
194
- type="button"
195
- title={p.title}
196
- className={`${Styles.ns_preset_btn} ${isActive ? Styles.ns_preset_btn_active : ''}`}
197
- onClick={() => this.setValue({ from: p.from, to: p.to })}
198
- >
199
- {p.shortName}
200
- </button>
201
- );
202
- })}
203
- </div>
204
- );
205
- }
206
-
207
- override render()
208
- {
209
- const fmt = this.getFormat();
210
- let menu = safeMenuMenuItem(this.props, () => { });
211
- if (!menu.builtin.copy)
212
- menu.builtin.copy = {
213
- enabled: true,
214
- getValue: () => this.state.value
215
- ? `${TimeOperation.format(this.state.value.from, fmt)} to ${TimeOperation.format(this.state.value.to, fmt)}`
216
- : '',
217
- };
218
-
219
- const showPresets = this.props.preset || (this.props.presets && this.props.presets.length > 0);
220
-
221
- return (
222
- <NSBoxBaseLayout
223
- ref={this.NSBoxBaseLayout_Main}
224
- {...this.props}
225
- menu={menu}
226
- getValue={() => this.state.value
227
- ? `${TimeOperation.format(this.state.value.from, fmt)} - ${TimeOperation.format(this.state.value.to, fmt)}`
228
- : null}
229
- >
230
- <div className={Styles.ns_wrapper}>
231
- {this.renderPicker()}
232
- </div>
233
- {showPresets && this.renderPresets()}
234
- </NSBoxBaseLayout>
235
- );
236
- }
1
+ "use client";
2
+
3
+ import type { Dayjs } from 'dayjs';
4
+ import dayjs from 'dayjs';
5
+ import { TimeOperation } from 'namirasoft-core';
6
+ import { Component, createRef } from 'react';
7
+ import { IBaseComponentProps } from '../props/IBaseComponentProps';
8
+ import { IValidationProps } from '../props/IValidationProps';
9
+ import { INSBox } from './INSBox';
10
+ import { INSBoxBaseLayoutProps, NSBoxBaseLayout } from './NSBoxBaseLayout';
11
+ import Styles from './NSBoxDateRangeBase.module.css';
12
+ import { safeMenuMenuItem } from './NSMenuButton';
13
+
14
+ export interface NSBoxDateRangeValue
15
+ {
16
+ from: Date;
17
+ to: Date;
18
+ }
19
+
20
+ export interface NSBoxDateRangeStringValue
21
+ {
22
+ from: string;
23
+ to: string;
24
+ }
25
+
26
+ export interface NSBoxDateRangePreset
27
+ {
28
+ shortName: string;
29
+ title?: string;
30
+ getFrom: () => Date;
31
+ getTo: () => Date;
32
+ }
33
+
34
+ export interface NSBoxDateRangeBaseProps<TBox> extends IBaseComponentProps, IValidationProps, INSBoxBaseLayoutProps<TBox, NSBoxDateRangeValue>
35
+ {
36
+ minDate?: Date;
37
+ maxDate?: Date;
38
+ preset?: boolean;
39
+ presets?: NSBoxDateRangePreset[];
40
+ }
41
+
42
+ export interface NSBoxDateRangeBaseState
43
+ {
44
+ value: NSBoxDateRangeValue | null;
45
+ }
46
+
47
+ export abstract class NSBoxDateRangeBase<TProps extends NSBoxDateRangeBaseProps<any>>
48
+ extends Component<TProps, NSBoxDateRangeBaseState> implements INSBox
49
+ {
50
+ NSBoxBaseLayout_Main = createRef<NSBoxBaseLayout>();
51
+
52
+ constructor(props: TProps)
53
+ {
54
+ super(props);
55
+ this.state = { value: props.defaultValue ?? null };
56
+ this.isEmpty = this.isEmpty.bind(this);
57
+ this.getError = this.getError.bind(this);
58
+ this.getValue = this.getValue.bind(this);
59
+ this.setValue = this.setValue.bind(this);
60
+ this.getValueString = this.getValueString.bind(this);
61
+ this.setValueString = this.setValueString.bind(this);
62
+ }
63
+
64
+ isEmpty(value: NSBoxDateRangeValue): boolean
65
+ {
66
+ return !value || !value.from || !value.to;
67
+ }
68
+
69
+ abstract getError(): string | null;
70
+
71
+ getValue(checkError: boolean = true): NSBoxDateRangeValue | null
72
+ {
73
+ if (this.props.nullable)
74
+ if (this.NSBoxBaseLayout_Main.current?.isNull())
75
+ return null;
76
+ return NSBoxBaseLayout.checkGetValue(this, checkError, () => this.state.value);
77
+ }
78
+
79
+ setValue(value: NSBoxDateRangeValue | null, callback?: () => void): void
80
+ {
81
+ if (this.props.nullable)
82
+ this.NSBoxBaseLayout_Main.current?.setNull(value == null);
83
+ this.setState({ value }, () =>
84
+ {
85
+ this.props.onChanged?.(this);
86
+ callback?.();
87
+ });
88
+ }
89
+
90
+ getValueString(checkError: boolean = true): NSBoxDateRangeStringValue | null
91
+ {
92
+ const value = this.getValue(checkError);
93
+ if (value?.from && value?.to)
94
+ try
95
+ {
96
+ const fmt = this.getStringFormat();
97
+ return { from: TimeOperation.format(value.from, fmt), to: TimeOperation.format(value.to, fmt) };
98
+ }
99
+ catch { }
100
+ return null;
101
+ }
102
+
103
+ setValueString(value: NSBoxDateRangeStringValue | null, callback?: () => void): void
104
+ {
105
+ if (!value || !value.from || !value.to)
106
+ {
107
+ this.setValue(null, callback);
108
+ return;
109
+ }
110
+ const fmt = this.getStringFormat();
111
+ const from = dayjs(value.from, fmt).toDate();
112
+ const to = dayjs(value.to, fmt).toDate();
113
+ if (!isNaN(from.getTime()) && !isNaN(to.getTime()))
114
+ this.setValue({ from, to }, callback);
115
+ else
116
+ this.setValue(null, callback);
117
+ }
118
+
119
+ setDisabled(disabled: boolean): void
120
+ {
121
+ this.NSBoxBaseLayout_Main.current?.setDisabled(disabled);
122
+ }
123
+
124
+ protected abstract getFormat(): string;
125
+ protected getStringFormat(): string { return this.getFormat(); }
126
+ protected abstract getBuiltinPresets(): { label: string; title: string; from: Date; to: Date }[];
127
+ protected abstract renderPicker(): React.ReactNode;
128
+
129
+ protected normalizeValue(value: NSBoxDateRangeValue): NSBoxDateRangeValue { return value; }
130
+
131
+ protected toDayjsValue(): [Dayjs, Dayjs] | null
132
+ {
133
+ const { value } = this.state;
134
+ if (!value?.from || !value?.to)
135
+ return null;
136
+ return [dayjs(value.from), dayjs(value.to)];
137
+ }
138
+
139
+ private isInRange(from: Date, to: Date): boolean
140
+ {
141
+ const { minDate, maxDate } = this.props;
142
+ if (minDate && from < minDate) return false;
143
+ if (maxDate && to > maxDate) return false;
144
+ return true;
145
+ }
146
+
147
+ private renderPresets(): React.ReactNode
148
+ {
149
+ const { preset, presets: customPresets } = this.props;
150
+
151
+ const builtinPresets = preset
152
+ ? this.getBuiltinPresets().filter(p => this.isInRange(p.from, p.to))
153
+ : [];
154
+
155
+ const resolvedCustom = (customPresets ?? [])
156
+ .map(p => ({
157
+ shortName: p.shortName,
158
+ title: p.title,
159
+ from: p.getFrom(),
160
+ to: p.getTo(),
161
+ }))
162
+ .filter(p => this.isInRange(p.from, p.to));
163
+
164
+ const showDivider = builtinPresets.length > 0 && resolvedCustom.length > 0;
165
+
166
+ return (
167
+ <div className={Styles.ns_preset_container}>
168
+ {builtinPresets.map(p =>
169
+ {
170
+ const norm = this.normalizeValue({ from: p.from, to: p.to });
171
+ const isActive = this.state.value?.from.getTime() === norm.from.getTime()
172
+ && this.state.value?.to.getTime() === norm.to.getTime();
173
+ return (
174
+ <button
175
+ key={p.label}
176
+ type="button"
177
+ title={p.title}
178
+ className={`${Styles.ns_preset_btn} ${isActive ? Styles.ns_preset_btn_active : ''}`}
179
+ onClick={() => this.setValue({ from: p.from, to: p.to })}
180
+ >
181
+ {p.label}
182
+ </button>
183
+ );
184
+ })}
185
+ {showDivider && <div className={Styles.ns_preset_divider} />}
186
+ {resolvedCustom.map(p =>
187
+ {
188
+ const norm = this.normalizeValue({ from: p.from, to: p.to });
189
+ const isActive = this.state.value?.from.getTime() === norm.from.getTime()
190
+ && this.state.value?.to.getTime() === norm.to.getTime();
191
+ return (
192
+ <button
193
+ key={p.shortName}
194
+ type="button"
195
+ title={p.title}
196
+ className={`${Styles.ns_preset_btn} ${isActive ? Styles.ns_preset_btn_active : ''}`}
197
+ onClick={() => this.setValue({ from: p.from, to: p.to })}
198
+ >
199
+ {p.shortName}
200
+ </button>
201
+ );
202
+ })}
203
+ </div>
204
+ );
205
+ }
206
+
207
+ override render()
208
+ {
209
+ const fmt = this.getFormat();
210
+ let menu = safeMenuMenuItem(this.props, () => { });
211
+ if (!menu.builtin.copy)
212
+ menu.builtin.copy = {
213
+ enabled: true,
214
+ getValue: () => this.state.value
215
+ ? `${TimeOperation.format(this.state.value.from, fmt)} to ${TimeOperation.format(this.state.value.to, fmt)}`
216
+ : '',
217
+ };
218
+
219
+ const showPresets = this.props.preset || (this.props.presets && this.props.presets.length > 0);
220
+
221
+ return (
222
+ <NSBoxBaseLayout
223
+ ref={this.NSBoxBaseLayout_Main}
224
+ {...this.props}
225
+ menu={menu}
226
+ getValue={() => this.state.value
227
+ ? `${TimeOperation.format(this.state.value.from, fmt)} - ${TimeOperation.format(this.state.value.to, fmt)}`
228
+ : null}
229
+ >
230
+ <div className={Styles.ns_wrapper}>
231
+ {this.renderPicker()}
232
+ </div>
233
+ {showPresets && this.renderPresets()}
234
+ </NSBoxBaseLayout>
235
+ );
236
+ }
237
237
  }
@@ -1,5 +1,5 @@
1
- input[type="datetime-local"]::-webkit-calendar-picker-indicator {
2
- cursor: pointer;
3
- opacity: 0;
4
- padding-right: 0px;
1
+ input[type="datetime-local"]::-webkit-calendar-picker-indicator {
2
+ cursor: pointer;
3
+ opacity: 0;
4
+ padding-right: 0px;
5
5
  }