namirasoft-site-react 1.4.0 → 1.4.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 (303) hide show
  1. package/.dockerignore +86 -86
  2. package/.env.template +7 -7
  3. package/Dockerfile +18 -18
  4. package/config-overrides.js +70 -70
  5. package/dist/App.css +17 -0
  6. package/dist/Validator.js.map +1 -1
  7. package/dist/components/NSAccordion.js.map +1 -1
  8. package/dist/components/NSAccordion.module.css +4 -4
  9. package/dist/components/NSActionMenu.js +2 -2
  10. package/dist/components/NSActionMenu.js.map +1 -1
  11. package/dist/components/NSActionMenu.module.css +75 -75
  12. package/dist/components/NSAssistantButton.module.css +130 -130
  13. package/dist/components/NSBarAction.module.css +87 -87
  14. package/dist/components/NSBarHeroBanner.module.css +42 -42
  15. package/dist/components/NSBarNotification.js.map +1 -1
  16. package/dist/components/NSBarNotification.module.css +34 -34
  17. package/dist/components/NSBarTitle.module.css +9 -9
  18. package/dist/components/NSBox.module.css +124 -124
  19. package/dist/components/NSBoxBoolean.js.map +1 -1
  20. package/dist/components/NSBoxBoolean.module.css +74 -74
  21. package/dist/components/NSBoxCombo.js.map +1 -1
  22. package/dist/components/NSBoxCombo.module.css +6 -6
  23. package/dist/components/NSBoxDate.js.map +1 -1
  24. package/dist/components/NSBoxDate.module.css +42 -42
  25. package/dist/components/NSBoxDateTime.js.map +1 -1
  26. package/dist/components/NSBoxDateTime.module.css +43 -43
  27. package/dist/components/NSBoxDouble.js.map +1 -1
  28. package/dist/components/NSBoxDuration.js.map +1 -1
  29. package/dist/components/NSBoxEmail.js.map +1 -1
  30. package/dist/components/NSBoxEntity.js.map +1 -1
  31. package/dist/components/NSBoxEntity.module.css +25 -25
  32. package/dist/components/NSBoxErrorNotifier.module.css +2 -2
  33. package/dist/components/NSBoxFile.js.map +1 -1
  34. package/dist/components/NSBoxFile.module.css +4 -4
  35. package/dist/components/NSBoxIPV4.js.map +1 -1
  36. package/dist/components/NSBoxIPV6.js.map +1 -1
  37. package/dist/components/NSBoxInteger.js.map +1 -1
  38. package/dist/components/NSBoxLabel.module.css +12 -12
  39. package/dist/components/NSBoxPassword.js.map +1 -1
  40. package/dist/components/NSBoxPhone.js.map +1 -1
  41. package/dist/components/NSBoxPrice.js.map +1 -1
  42. package/dist/components/NSBoxRadio.js.map +1 -1
  43. package/dist/components/NSBoxRadio.module.css +65 -65
  44. package/dist/components/NSBoxSearch.js.map +1 -1
  45. package/dist/components/NSBoxString.js.map +1 -1
  46. package/dist/components/NSBoxTextArea.js.map +1 -1
  47. package/dist/components/NSBoxTextArea.module.css +78 -78
  48. package/dist/components/NSBoxTime.js.map +1 -1
  49. package/dist/components/NSButton.d.ts +1 -0
  50. package/dist/components/NSButton.module.css +28 -28
  51. package/dist/components/NSButtonBlue.module.css +4 -4
  52. package/dist/components/NSButtonGreen.module.css +4 -4
  53. package/dist/components/NSButtonRed.module.css +4 -4
  54. package/dist/components/NSCard.module.css +108 -108
  55. package/dist/components/NSCardScreenshot.module.css +41 -41
  56. package/dist/components/NSChartColumn.module.css +7 -7
  57. package/dist/components/NSChartTable.module.css +21 -21
  58. package/dist/components/NSCopyToClipboard.js.map +1 -1
  59. package/dist/components/NSCopyToClipboard.module.css +39 -39
  60. package/dist/components/NSDialog.module.css +72 -72
  61. package/dist/components/NSDownTimer.js.map +1 -1
  62. package/dist/components/NSDownTimer.module.css +62 -62
  63. package/dist/components/NSDownload.js.map +1 -1
  64. package/dist/components/NSDownload.module.css +46 -46
  65. package/dist/components/NSElectronicCard.js.map +1 -1
  66. package/dist/components/NSElectronicCard.module.css +60 -60
  67. package/dist/components/NSEntityBar.module.css +77 -77
  68. package/dist/components/NSEntityCardBackground.module.css +27 -27
  69. package/dist/components/NSFilterBox.js.map +1 -1
  70. package/dist/components/NSFilterBox.module.css +47 -47
  71. package/dist/components/NSFilterBoxDialog.module.css +36 -36
  72. package/dist/components/NSFilterItem.module.css +23 -23
  73. package/dist/components/NSFooter.js.map +1 -1
  74. package/dist/components/NSFooter.module.css +123 -123
  75. package/dist/components/NSGroupedList.js.map +1 -1
  76. package/dist/components/NSGroupedList.module.css +72 -72
  77. package/dist/components/NSHeader.js.map +1 -1
  78. package/dist/components/NSHeader.module.css +286 -286
  79. package/dist/components/NSHeaderScreenshot.module.css +35 -35
  80. package/dist/components/NSInfoDialog.d.ts +1 -0
  81. package/dist/components/NSLayout.js.map +1 -1
  82. package/dist/components/NSLayout.module.css +13 -13
  83. package/dist/components/NSLine.module.css +12 -12
  84. package/dist/components/NSLink.module.css +36 -36
  85. package/dist/components/NSLoading.module.css +29 -29
  86. package/dist/components/NSNoData.module.css +8 -8
  87. package/dist/components/NSPageSelectionModal.js.map +1 -1
  88. package/dist/components/NSPageSelectionModal.module.css +102 -102
  89. package/dist/components/NSPagination.js.map +1 -1
  90. package/dist/components/NSPagination.module.css +101 -101
  91. package/dist/components/NSPanel.module.css +46 -46
  92. package/dist/components/NSRadioButton.d.ts +25 -0
  93. package/dist/components/NSRadioButton.js +49 -0
  94. package/dist/components/NSRadioButton.js.map +1 -0
  95. package/dist/components/NSRange.module.css +66 -66
  96. package/dist/components/NSRepeater.js.map +1 -1
  97. package/dist/components/NSSection.module.css +10 -10
  98. package/dist/components/NSSectionBars.module.css +10 -10
  99. package/dist/components/NSSectionCards.module.css +38 -38
  100. package/dist/components/NSTabPage.module.css +59 -59
  101. package/dist/components/NSTable.js +2 -2
  102. package/dist/components/NSTable.js.map +1 -1
  103. package/dist/components/NSTable.module.css +289 -289
  104. package/dist/components/NSTag.module.css +52 -52
  105. package/dist/components/NSTimeTable.module.css +6 -6
  106. package/dist/components/NSTimelineMonthly.module.css +71 -71
  107. package/dist/components/NSTitle.module.css +15 -15
  108. package/dist/formatter/DateFormatter.js.map +1 -1
  109. package/dist/formatter/DateTimeFormatter.js.map +1 -1
  110. package/dist/formatter/TimeFormatter.js.map +1 -1
  111. package/dist/index.css +6 -0
  112. package/dist/pages/NSNotFoundPage.module.css +18 -18
  113. package/dist/pages/NSUpdating.module.css +35 -35
  114. package/dist/routing/NSRouterMaker.d.ts +1 -0
  115. package/dist/routing/Notifier.d.ts +1 -0
  116. package/dist/routing/Notifier.js.map +1 -1
  117. package/package.json +72 -72
  118. package/public/index.html +38 -38
  119. package/src/App.css +16 -16
  120. package/src/App.tsx +184 -184
  121. package/src/Color.tsx +10 -10
  122. package/src/CopyToClipboard.ts +6 -6
  123. package/src/Validator.ts +117 -117
  124. package/src/components/NSAccordion.module.css +4 -4
  125. package/src/components/NSAccordion.tsx +51 -51
  126. package/src/components/NSActionMenu.module.css +75 -75
  127. package/src/components/NSActionMenu.tsx +89 -89
  128. package/src/components/NSAssistantButton.module.css +130 -130
  129. package/src/components/NSAssistantButton.tsx +70 -70
  130. package/src/components/NSBarAction.module.css +87 -87
  131. package/src/components/NSBarAction.tsx +92 -92
  132. package/src/components/NSBarHeroBanner.module.css +42 -42
  133. package/src/components/NSBarHeroBanner.tsx +61 -61
  134. package/src/components/NSBarNotification.module.css +34 -34
  135. package/src/components/NSBarNotification.tsx +85 -85
  136. package/src/components/NSBarTitle.module.css +9 -9
  137. package/src/components/NSBarTitle.tsx +28 -28
  138. package/src/components/NSBox.module.css +124 -124
  139. package/src/components/NSBoxBoolean.module.css +74 -74
  140. package/src/components/NSBoxBoolean.tsx +108 -108
  141. package/src/components/NSBoxCombo.module.css +6 -6
  142. package/src/components/NSBoxCombo.tsx +135 -135
  143. package/src/components/NSBoxDate.module.css +42 -42
  144. package/src/components/NSBoxDate.tsx +86 -86
  145. package/src/components/NSBoxDateTime.module.css +43 -43
  146. package/src/components/NSBoxDateTime.tsx +87 -87
  147. package/src/components/NSBoxDouble.tsx +90 -90
  148. package/src/components/NSBoxDuration.tsx +90 -90
  149. package/src/components/NSBoxEmail.tsx +103 -103
  150. package/src/components/NSBoxEntity.module.css +25 -25
  151. package/src/components/NSBoxEntity.tsx +181 -181
  152. package/src/components/NSBoxEnum.tsx +56 -56
  153. package/src/components/NSBoxErrorNotifier.module.css +2 -2
  154. package/src/components/NSBoxErrorNotifier.tsx +32 -32
  155. package/src/components/NSBoxFile.module.css +4 -4
  156. package/src/components/NSBoxFile.tsx +124 -124
  157. package/src/components/NSBoxIPV4.tsx +95 -95
  158. package/src/components/NSBoxIPV6.tsx +92 -92
  159. package/src/components/NSBoxInteger.tsx +88 -88
  160. package/src/components/NSBoxLabel.module.css +12 -12
  161. package/src/components/NSBoxLabel.tsx +29 -29
  162. package/src/components/NSBoxPassword.tsx +88 -88
  163. package/src/components/NSBoxPhone.tsx +90 -90
  164. package/src/components/NSBoxPrice.tsx +90 -90
  165. package/src/components/NSBoxRadio.module.css +65 -65
  166. package/src/components/NSBoxRadio.tsx +105 -105
  167. package/src/components/NSBoxSearch.tsx +105 -105
  168. package/src/components/NSBoxString.tsx +104 -104
  169. package/src/components/NSBoxTextArea.module.css +78 -78
  170. package/src/components/NSBoxTextArea.tsx +110 -110
  171. package/src/components/NSBoxTime.tsx +90 -90
  172. package/src/components/NSButton.module.css +28 -28
  173. package/src/components/NSButton.tsx +23 -23
  174. package/src/components/NSButtonBlue.module.css +4 -4
  175. package/src/components/NSButtonBlue.tsx +11 -11
  176. package/src/components/NSButtonGreen.module.css +4 -4
  177. package/src/components/NSButtonGreen.tsx +10 -10
  178. package/src/components/NSButtonRed.module.css +4 -4
  179. package/src/components/NSButtonRed.tsx +10 -10
  180. package/src/components/NSCard.module.css +108 -108
  181. package/src/components/NSCard.tsx +71 -71
  182. package/src/components/NSCardScreenshot.module.css +41 -41
  183. package/src/components/NSCardScreenshot.tsx +31 -31
  184. package/src/components/NSChartColumn.module.css +7 -7
  185. package/src/components/NSChartColumn.tsx +106 -106
  186. package/src/components/NSChartPie.tsx +104 -104
  187. package/src/components/NSChartRange.tsx +16 -16
  188. package/src/components/NSChartTable.module.css +21 -21
  189. package/src/components/NSChartTable.tsx +94 -94
  190. package/src/components/NSCopyToClipboard.module.css +39 -39
  191. package/src/components/NSCopyToClipboard.tsx +38 -38
  192. package/src/components/NSDeleteDialog.tsx +26 -26
  193. package/src/components/NSDialog.module.css +72 -72
  194. package/src/components/NSDialog.tsx +46 -46
  195. package/src/components/NSDownTimer.module.css +62 -62
  196. package/src/components/NSDownTimer.tsx +77 -77
  197. package/src/components/NSDownload.module.css +46 -46
  198. package/src/components/NSDownload.tsx +62 -62
  199. package/src/components/NSElectronicCard.module.css +60 -60
  200. package/src/components/NSElectronicCard.tsx +45 -45
  201. package/src/components/NSEntityBar.module.css +77 -77
  202. package/src/components/NSEntityBar.tsx +27 -27
  203. package/src/components/NSEntityCardBackground.module.css +27 -27
  204. package/src/components/NSEntityCardBackground.tsx +34 -34
  205. package/src/components/NSFilterBox.module.css +47 -47
  206. package/src/components/NSFilterBox.tsx +352 -352
  207. package/src/components/NSFilterBoxDialog.module.css +36 -36
  208. package/src/components/NSFilterBoxDialog.tsx +74 -74
  209. package/src/components/NSFilterItem.module.css +23 -23
  210. package/src/components/NSFilterItem.tsx +73 -73
  211. package/src/components/NSFooter.module.css +123 -123
  212. package/src/components/NSFooter.tsx +200 -200
  213. package/src/components/NSGroupedList.module.css +72 -72
  214. package/src/components/NSGroupedList.tsx +107 -107
  215. package/src/components/NSHeader.module.css +286 -286
  216. package/src/components/NSHeader.tsx +243 -243
  217. package/src/components/NSHeaderScreenshot.module.css +35 -35
  218. package/src/components/NSHeaderScreenshot.tsx +38 -38
  219. package/src/components/NSInfoDialog.tsx +36 -36
  220. package/src/components/NSLayout.module.css +13 -13
  221. package/src/components/NSLayout.tsx +90 -90
  222. package/src/components/NSLine.module.css +12 -12
  223. package/src/components/NSLine.tsx +15 -15
  224. package/src/components/NSLink.module.css +36 -36
  225. package/src/components/NSLink.tsx +25 -25
  226. package/src/components/NSLinkBlue.tsx +20 -20
  227. package/src/components/NSLinkGreen.tsx +5 -5
  228. package/src/components/NSLinkRed.tsx +5 -5
  229. package/src/components/NSLoading.module.css +29 -29
  230. package/src/components/NSLoading.tsx +19 -19
  231. package/src/components/NSNoData.module.css +8 -8
  232. package/src/components/NSNoData.tsx +24 -24
  233. package/src/components/NSPageSelectionModal.module.css +102 -102
  234. package/src/components/NSPageSelectionModal.tsx +226 -226
  235. package/src/components/NSPagination.module.css +101 -101
  236. package/src/components/NSPagination.tsx +189 -189
  237. package/src/components/NSPanel.module.css +46 -46
  238. package/src/components/NSPanel.tsx +19 -19
  239. package/src/components/NSProductList.tsx +43 -43
  240. package/src/components/NSRange.module.css +66 -66
  241. package/src/components/NSRange.tsx +82 -82
  242. package/src/components/NSRepeater.tsx +175 -175
  243. package/src/components/NSSection.module.css +10 -10
  244. package/src/components/NSSection.tsx +23 -23
  245. package/src/components/NSSectionBars.module.css +10 -10
  246. package/src/components/NSSectionBars.tsx +25 -25
  247. package/src/components/NSSectionCards.module.css +38 -38
  248. package/src/components/NSSectionCards.tsx +51 -51
  249. package/src/components/NSSectionTitle.tsx +21 -21
  250. package/src/components/NSSpace.tsx +28 -28
  251. package/src/components/NSTabPage.module.css +59 -59
  252. package/src/components/NSTabPage.tsx +53 -53
  253. package/src/components/NSTable.module.css +289 -289
  254. package/src/components/NSTable.tsx +422 -422
  255. package/src/components/NSTag.module.css +52 -52
  256. package/src/components/NSTag.tsx +73 -73
  257. package/src/components/NSTimeTable.module.css +6 -6
  258. package/src/components/NSTimeTable.tsx +49 -49
  259. package/src/components/NSTimelineMonthly.module.css +71 -71
  260. package/src/components/NSTimelineMonthly.tsx +42 -42
  261. package/src/components/NSTitle.module.css +15 -15
  262. package/src/components/NSTitle.tsx +19 -19
  263. package/src/formatter/BackColorFormatter.tsx +20 -20
  264. package/src/formatter/BaseColumnFormatter.ts +14 -14
  265. package/src/formatter/BooleanFormatter.ts +20 -20
  266. package/src/formatter/DateFormatter.ts +15 -15
  267. package/src/formatter/DateTimeFormatter.ts +15 -15
  268. package/src/formatter/DurationFormatter.ts +8 -8
  269. package/src/formatter/EmailFormatter.ts +8 -8
  270. package/src/formatter/EnumFormatter.ts +8 -8
  271. package/src/formatter/FloatFormatter.ts +8 -8
  272. package/src/formatter/ForeColorFormatter.tsx +20 -20
  273. package/src/formatter/ForeignIDFormatter.ts +8 -8
  274. package/src/formatter/IDFormatter.ts +8 -8
  275. package/src/formatter/IPFormatter.ts +8 -8
  276. package/src/formatter/IntegerFormatter.ts +8 -8
  277. package/src/formatter/JsonFormatter.ts +8 -8
  278. package/src/formatter/MoneyFormatter.ts +8 -8
  279. package/src/formatter/PhoneFormatter.ts +8 -8
  280. package/src/formatter/StringFormatter.ts +8 -8
  281. package/src/formatter/TimeFormatter.ts +16 -16
  282. package/src/formatter/UnknowFormatter.ts +8 -8
  283. package/src/index.tsx +7 -7
  284. package/src/main.ts +114 -114
  285. package/src/pages/NSNotFoundPage.module.css +18 -18
  286. package/src/pages/NSNotFoundPage.tsx +11 -11
  287. package/src/pages/NSUpdating.module.css +35 -35
  288. package/src/pages/NSUpdating.tsx +32 -32
  289. package/src/props/IBaseComponentProps.ts +8 -8
  290. package/src/props/IHeaderIconProps.ts +10 -10
  291. package/src/props/IHeaderProps.ts +7 -7
  292. package/src/props/IImageProps.ts +4 -4
  293. package/src/props/ILinkProps.ts +5 -5
  294. package/src/props/IValidationNumberProps.ts +4 -4
  295. package/src/props/IValidationProps.ts +7 -7
  296. package/src/props/IValidationRegexProps.ts +4 -4
  297. package/src/props/IValidationStringProps.ts +4 -4
  298. package/src/routing/INSRouterMaker.ts +6 -6
  299. package/src/routing/INSRouterProps.ts +5 -5
  300. package/src/routing/INSRouterState.ts +5 -5
  301. package/src/routing/NSRouterMaker.tsx +33 -33
  302. package/src/routing/Notifier.ts +79 -79
  303. package/tsconfig.json +43 -43
@@ -1,201 +1,201 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import Styles from "./NSFooter.module.css";
5
- import { NamirasoftAPILinkServer, FilterLinkFullRow } from 'namirasoft-api-link';
6
- import { IBaseComponentProps } from "../props/IBaseComponentProps";
7
- import { IStorageLocal, CacheService } from "namirasoft-core";
8
- import { PackageService } from "namirasoft-core";
9
- import { EnvService } from 'namirasoft-core'
10
-
11
- export interface INSFooterProps extends IBaseComponentProps
12
- {
13
- scope: string;
14
- name: string;
15
- logo: string;
16
- isLoggedIn: () => boolean;
17
- }
18
-
19
- export interface NSFooterState
20
- {
21
- filters: FilterLinkFullRow[];
22
- selected: FilterLinkFullRow | null;
23
- }
24
-
25
- export class NSFooter extends React.Component<INSFooterProps, NSFooterState>
26
- {
27
- private cache: CacheService<{
28
- rows: FilterLinkFullRow[];
29
- count: number;
30
- }>;
31
- constructor(props: INSFooterProps)
32
- {
33
- super(props);
34
- this.state = {
35
- filters: [],
36
- selected: null
37
- };
38
- this.hasChild = this.hasChild.bind(this);
39
- this.render_menu = this.render_menu.bind(this);
40
- this.render_menuItem = this.render_menuItem.bind(this);
41
- this.cache = new CacheService<{
42
- rows: FilterLinkFullRow[];
43
- count: number;
44
- }>("ns-footer", 720, new IStorageLocal(), async () =>
45
- {
46
- let REACT_APP_BASE_URL_API_LINK = new EnvService("REACT_APP_BASE_URL_API_LINK", true).getString();
47
- let server = new NamirasoftAPILinkServer(REACT_APP_BASE_URL_API_LINK, console.error);
48
- return server.filter.ListFilterLinks(this.props.scope, this.props.name, null, null, null);
49
- }, () => { });
50
- }
51
- override componentDidMount(): void
52
- {
53
- this.cache.get().then(filters =>
54
- {
55
- this.setState({ filters: filters.rows });
56
- }).catch(() => { });
57
- }
58
- private getFilters(): FilterLinkFullRow[]
59
- {
60
- let loggedin = this.props.isLoggedIn();
61
- let ans = this.state.filters?.filter(f =>
62
- {
63
- if (f.link)
64
- {
65
- if (loggedin)
66
- return f.link.private;
67
- return f.link.public;
68
- }
69
- return true;
70
- }) ?? [];
71
-
72
- while (true)
73
- {
74
- let old_length = ans.length;
75
- let old = ans;
76
- ans = ans.filter(f =>
77
- {
78
- if (f.link?.url)
79
- return true;
80
- return old.filter(x => x.parent_id === f.id).length > 0;
81
- });
82
- let new_length = ans.length;
83
- if (old_length === new_length)
84
- break;
85
- }
86
-
87
- return ans;
88
- }
89
- private hasChild(id: number): boolean
90
- {
91
- return this.getFilters().filter(f => f.parent_id === id).length > 0;
92
- }
93
- override render()
94
- {
95
- return (
96
- <footer id={this.props.id}
97
- className={`${Styles.ns_footer} ${this.props.classList?.join(" ")}`}
98
- style={this.props.style}
99
- >
100
- <div className={`container ${Styles.ns_package_footer}`}>
101
- <div className={`${Styles.ns_footer_parent_items}`}>
102
- <div className={`${Styles.ns_footer_project_logo_tablet}`}>
103
- <a href="/">
104
- <img src={this.props.logo} alt='Logo' width={80} height={80} />
105
- </a>
106
- </div>
107
- <div className={`${Styles.ns_footer_menu_container}`}>
108
- {this.render_menu(0, null)}
109
- </div>
110
- <div className={`${Styles.ns_footer_namira_logo_tablet}`}>
111
- <div className="d-flex flex-row gap-3">
112
- <a href="https://namirasoft.com/"><img src="https://static.namirasoft.com/image/namirasoft/site/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
113
- <a href="/"><img src="https://static.namirasoft.com/image/namirasoft/account/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
114
- </div>
115
- <div className="d-flex flex-row gap-1 w-100 justify-content-center align-items-center">
116
- <a style={{ cursor: "pointer" }} href="https://ca.linkedin.com/company/namira-software-corporation" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/linkedin/white.svg" alt="Communicate with Namirasoft Via LinkedIn" width={24} height={24} /></a>
117
- <a href="https://instagram.com/namira.software.corporation?igshid=MzRlODBiNWFlZA==" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/instagram/white.svg" alt="Communicate with Namirasoft Via Instagram" width={24} height={24} /></a>
118
- <a href="mailto:accounts@namirasoft.com" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/email/white.svg" alt="Communicate with Namirasoft Via Email" width={24} height={24} /></a>
119
- <a href="https://www.google.com/maps/place//@49.2781041,-123.1354814,14z/data=!4m2!3m1!1s0x0:0x18f70365c7a2f0fa?entry=s&sa=X" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/location/white.svg" alt="Communicate with Namirasoft in Person" width={24} height={24} /></a>
120
- </div>
121
- <div className={`${Styles.ns_footer_copyright}`}> Version: {PackageService.MainJson?.version} </div>
122
- </div>
123
- </div>
124
- <div className={`${Styles.ns_footer_logos_mobile}`}>
125
- <div className="d-flex flex-column gap-4">
126
- <div className="d-flex flex-row gap-3">
127
- <a href="https://namirasoft.com/"><img src="https://static.namirasoft.com/image/namirasoft/site/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
128
- <a href="/"><img src="https://static.namirasoft.com/image/namirasoft/account/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
129
- </div>
130
- <div className="d-flex flex-row gap-1 w-100 justify-content-center align-items-center">
131
- <a href="https://ca.linkedin.com/company/namira-software-corporation" target="_blank" rel="noreferrer" ><img src="https://static.namirasoft.com/image/concept/social/linkedin/white.svg" alt="Communicate with Namirasoft Via LinkedIn" width={24} height={24} /></a>
132
- <a href="https://instagram.com/namira.software.corporation?igshid=MzRlODBiNWFlZA==" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/instagram/white.svg" alt="Communicate with Namirasoft Via Instagram" width={24} height={24} /></a>
133
- <a href="mailto:accounts@namirasoft.com" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/email/white.svg" alt="Communicate with Namirasoft Via Email" width={24} height={24} /></a>
134
- <a href="https://www.google.com/maps/place//@49.2781041,-123.1354814,14z/data=!4m2!3m1!1s0x0:0x18f70365c7a2f0fa?entry=s&sa=X" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/location/white.svg" alt="Communicate with Namirasoft in Person" width={24} height={24} /></a>
135
- </div>
136
- <div className={`${Styles.ns_footer_copyright}`}> Version: {PackageService.MainJson?.version} </div>
137
- </div>
138
- </div>
139
- <div className={`${Styles.ns_footer_copyright}`}>
140
- <span> ©Copyright 2010 - {new Date().getFullYear()} </span>{" "}
141
- <a href="https://namirasoft.com/" target="_blank" rel="noreferrer"> Namira Software Corporation</a>. {" "}
142
- <span > All rights reserved. </span>
143
- </div>
144
- </div>
145
- </footer >
146
- );
147
- }
148
- private render_menu(level: number, parent_id: number | null)
149
- {
150
- let fs: FilterLinkFullRow[] = this.getFilters().filter(f => f.parent_id === parent_id);
151
- return (
152
- <>
153
- {
154
- (fs?.map(f => this.render_menuItem(level, f)))
155
- }
156
- </>
157
- );
158
- }
159
- private render_menuItem(level: number, filter: FilterLinkFullRow)
160
- {
161
- if (this.hasChild(filter.id))
162
- {
163
- return (
164
- <ul key={filter.id}
165
- id={`dropdown_parent${filter.id}`}>
166
- <span className={Styles.ns_footer_list_title}> {filter.name} </span>
167
- {this.render_menu(1, filter.id)}
168
- </ul>
169
- );
170
- }
171
- else if (level === 0)
172
- {
173
- return (
174
- <ul
175
- key={filter.id}
176
- id={`dropdown_parent${filter.id}`}>
177
- {filter.name}
178
- </ul>
179
- );
180
- }
181
- else
182
- {
183
- let href = filter.link?.url;
184
- if (process.env.REACT_APP_STANDALONE)
185
- if (href)
186
- {
187
- let url = new URL(href);
188
- url.host = window.location.host;
189
- url.protocol = window.location.protocol;
190
- href = url.toString();
191
- }
192
- return (
193
- <li key={filter.id} className="mb-2">
194
- <a href={href}>
195
- {filter.name}
196
- </a>
197
- </li>
198
- );
199
- }
200
- }
1
+ "use client";
2
+
3
+ import React from "react";
4
+ import Styles from "./NSFooter.module.css";
5
+ import { NamirasoftAPILinkServer, FilterLinkFullRow } from 'namirasoft-api-link';
6
+ import { IBaseComponentProps } from "../props/IBaseComponentProps";
7
+ import { IStorageLocal, CacheService } from "namirasoft-core";
8
+ import { PackageService } from "namirasoft-core";
9
+ import { EnvService } from 'namirasoft-core'
10
+
11
+ export interface INSFooterProps extends IBaseComponentProps
12
+ {
13
+ scope: string;
14
+ name: string;
15
+ logo: string;
16
+ isLoggedIn: () => boolean;
17
+ }
18
+
19
+ export interface NSFooterState
20
+ {
21
+ filters: FilterLinkFullRow[];
22
+ selected: FilterLinkFullRow | null;
23
+ }
24
+
25
+ export class NSFooter extends React.Component<INSFooterProps, NSFooterState>
26
+ {
27
+ private cache: CacheService<{
28
+ rows: FilterLinkFullRow[];
29
+ count: number;
30
+ }>;
31
+ constructor(props: INSFooterProps)
32
+ {
33
+ super(props);
34
+ this.state = {
35
+ filters: [],
36
+ selected: null
37
+ };
38
+ this.hasChild = this.hasChild.bind(this);
39
+ this.render_menu = this.render_menu.bind(this);
40
+ this.render_menuItem = this.render_menuItem.bind(this);
41
+ this.cache = new CacheService<{
42
+ rows: FilterLinkFullRow[];
43
+ count: number;
44
+ }>("ns-footer", 720, new IStorageLocal(), async () =>
45
+ {
46
+ let REACT_APP_BASE_URL_API_LINK = new EnvService("REACT_APP_BASE_URL_API_LINK", true).getString();
47
+ let server = new NamirasoftAPILinkServer(REACT_APP_BASE_URL_API_LINK, console.error);
48
+ return server.filter.ListFilterLinks(this.props.scope, this.props.name, null, null, null);
49
+ }, () => { });
50
+ }
51
+ override componentDidMount(): void
52
+ {
53
+ this.cache.get().then(filters =>
54
+ {
55
+ this.setState({ filters: filters.rows });
56
+ }).catch(() => { });
57
+ }
58
+ private getFilters(): FilterLinkFullRow[]
59
+ {
60
+ let loggedin = this.props.isLoggedIn();
61
+ let ans = this.state.filters?.filter(f =>
62
+ {
63
+ if (f.link)
64
+ {
65
+ if (loggedin)
66
+ return f.link.private;
67
+ return f.link.public;
68
+ }
69
+ return true;
70
+ }) ?? [];
71
+
72
+ while (true)
73
+ {
74
+ let old_length = ans.length;
75
+ let old = ans;
76
+ ans = ans.filter(f =>
77
+ {
78
+ if (f.link?.url)
79
+ return true;
80
+ return old.filter(x => x.parent_id === f.id).length > 0;
81
+ });
82
+ let new_length = ans.length;
83
+ if (old_length === new_length)
84
+ break;
85
+ }
86
+
87
+ return ans;
88
+ }
89
+ private hasChild(id: number): boolean
90
+ {
91
+ return this.getFilters().filter(f => f.parent_id === id).length > 0;
92
+ }
93
+ override render()
94
+ {
95
+ return (
96
+ <footer id={this.props.id}
97
+ className={`${Styles.ns_footer} ${this.props.classList?.join(" ")}`}
98
+ style={this.props.style}
99
+ >
100
+ <div className={`container ${Styles.ns_package_footer}`}>
101
+ <div className={`${Styles.ns_footer_parent_items}`}>
102
+ <div className={`${Styles.ns_footer_project_logo_tablet}`}>
103
+ <a href="/">
104
+ <img src={this.props.logo} alt='Logo' width={80} height={80} />
105
+ </a>
106
+ </div>
107
+ <div className={`${Styles.ns_footer_menu_container}`}>
108
+ {this.render_menu(0, null)}
109
+ </div>
110
+ <div className={`${Styles.ns_footer_namira_logo_tablet}`}>
111
+ <div className="d-flex flex-row gap-3">
112
+ <a href="https://namirasoft.com/"><img src="https://static.namirasoft.com/image/namirasoft/site/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
113
+ <a href="/"><img src="https://static.namirasoft.com/image/namirasoft/account/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
114
+ </div>
115
+ <div className="d-flex flex-row gap-1 w-100 justify-content-center align-items-center">
116
+ <a style={{ cursor: "pointer" }} href="https://ca.linkedin.com/company/namira-software-corporation" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/linkedin/white.svg" alt="Communicate with Namirasoft Via LinkedIn" width={24} height={24} /></a>
117
+ <a href="https://instagram.com/namira.software.corporation?igshid=MzRlODBiNWFlZA==" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/instagram/white.svg" alt="Communicate with Namirasoft Via Instagram" width={24} height={24} /></a>
118
+ <a href="mailto:accounts@namirasoft.com" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/email/white.svg" alt="Communicate with Namirasoft Via Email" width={24} height={24} /></a>
119
+ <a href="https://www.google.com/maps/place//@49.2781041,-123.1354814,14z/data=!4m2!3m1!1s0x0:0x18f70365c7a2f0fa?entry=s&sa=X" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/location/white.svg" alt="Communicate with Namirasoft in Person" width={24} height={24} /></a>
120
+ </div>
121
+ <div className={`${Styles.ns_footer_copyright}`}> Version: {PackageService.MainJson?.version} </div>
122
+ </div>
123
+ </div>
124
+ <div className={`${Styles.ns_footer_logos_mobile}`}>
125
+ <div className="d-flex flex-column gap-4">
126
+ <div className="d-flex flex-row gap-3">
127
+ <a href="https://namirasoft.com/"><img src="https://static.namirasoft.com/image/namirasoft/site/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
128
+ <a href="/"><img src="https://static.namirasoft.com/image/namirasoft/account/logo/circle.png" alt='Namira Software Corporation Logo' width={48} height={48} /></a>
129
+ </div>
130
+ <div className="d-flex flex-row gap-1 w-100 justify-content-center align-items-center">
131
+ <a href="https://ca.linkedin.com/company/namira-software-corporation" target="_blank" rel="noreferrer" ><img src="https://static.namirasoft.com/image/concept/social/linkedin/white.svg" alt="Communicate with Namirasoft Via LinkedIn" width={24} height={24} /></a>
132
+ <a href="https://instagram.com/namira.software.corporation?igshid=MzRlODBiNWFlZA==" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/instagram/white.svg" alt="Communicate with Namirasoft Via Instagram" width={24} height={24} /></a>
133
+ <a href="mailto:accounts@namirasoft.com" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/email/white.svg" alt="Communicate with Namirasoft Via Email" width={24} height={24} /></a>
134
+ <a href="https://www.google.com/maps/place//@49.2781041,-123.1354814,14z/data=!4m2!3m1!1s0x0:0x18f70365c7a2f0fa?entry=s&sa=X" target="_blank" rel="noreferrer"><img src="https://static.namirasoft.com/image/concept/social/location/white.svg" alt="Communicate with Namirasoft in Person" width={24} height={24} /></a>
135
+ </div>
136
+ <div className={`${Styles.ns_footer_copyright}`}> Version: {PackageService.MainJson?.version} </div>
137
+ </div>
138
+ </div>
139
+ <div className={`${Styles.ns_footer_copyright}`}>
140
+ <span> ©Copyright 2010 - {new Date().getFullYear()} </span>{" "}
141
+ <a href="https://namirasoft.com/" target="_blank" rel="noreferrer"> Namira Software Corporation</a>. {" "}
142
+ <span > All rights reserved. </span>
143
+ </div>
144
+ </div>
145
+ </footer >
146
+ );
147
+ }
148
+ private render_menu(level: number, parent_id: number | null)
149
+ {
150
+ let fs: FilterLinkFullRow[] = this.getFilters().filter(f => f.parent_id === parent_id);
151
+ return (
152
+ <>
153
+ {
154
+ (fs?.map(f => this.render_menuItem(level, f)))
155
+ }
156
+ </>
157
+ );
158
+ }
159
+ private render_menuItem(level: number, filter: FilterLinkFullRow)
160
+ {
161
+ if (this.hasChild(filter.id))
162
+ {
163
+ return (
164
+ <ul key={filter.id}
165
+ id={`dropdown_parent${filter.id}`}>
166
+ <span className={Styles.ns_footer_list_title}> {filter.name} </span>
167
+ {this.render_menu(1, filter.id)}
168
+ </ul>
169
+ );
170
+ }
171
+ else if (level === 0)
172
+ {
173
+ return (
174
+ <ul
175
+ key={filter.id}
176
+ id={`dropdown_parent${filter.id}`}>
177
+ {filter.name}
178
+ </ul>
179
+ );
180
+ }
181
+ else
182
+ {
183
+ let href = filter.link?.url;
184
+ if (process.env.REACT_APP_STANDALONE)
185
+ if (href)
186
+ {
187
+ let url = new URL(href);
188
+ url.host = window.location.host;
189
+ url.protocol = window.location.protocol;
190
+ href = url.toString();
191
+ }
192
+ return (
193
+ <li key={filter.id} className="mb-2">
194
+ <a href={href}>
195
+ {filter.name}
196
+ </a>
197
+ </li>
198
+ );
199
+ }
200
+ }
201
201
  }
@@ -1,73 +1,73 @@
1
- .ns_group_list_parent {
2
- width: 100%;
3
- max-width: 560px;
4
- border-radius: 8px;
5
- border: solid 1px #B2BBD9;
6
- background-color: #fff;
7
- padding-bottom: 16px;
8
- height: 360px;
9
- overflow: auto;
10
- position: absolute;
11
- z-index: 10;
12
- margin-top: 50px;
13
- }
14
-
15
- .ns_group_list_parent::-webkit-scrollbar {
16
- width: 1rem;
17
- }
18
-
19
- .ns_group_list_parent::-webkit-scrollbar-track {
20
- box-shadow: inset 0 0 6px #E8EBF6;
21
- }
22
-
23
- .ns_group_list_parent::-webkit-scrollbar-thumb {
24
- background-color: #A1A4B0;
25
- border-radius: 8px;
26
- }
27
-
28
- .ns_group_list {
29
- list-style-type: none;
30
- color: #141B5C;
31
- padding: 0;
32
- margin: 0;
33
- display: flex;
34
- flex-direction: column;
35
- align-items: flex-start;
36
- justify-content: flex-start;
37
- font-size: 16px;
38
- font-weight: 700;
39
- width: 100%;
40
- }
41
-
42
- .ns_group_category {
43
- border-bottom: solid 1px currentColor;
44
- width: 100%;
45
- display: flex;
46
- justify-content: space-between;
47
- padding: 10px 8px;
48
- }
49
-
50
- .ns_group_list li {
51
- width: 100%;
52
- }
53
-
54
- .ns_group_item {
55
- cursor: pointer;
56
- padding: 6px 0 6px 24px;
57
- font-size: 16px;
58
- font-weight: 300;
59
- color: #141B5C;
60
- border-bottom: solid 1px currentColor;
61
- width: 100%;
62
- display: inline-block;
63
- transition: all 0.1s;
64
- }
65
-
66
- .ns_group_item:hover {
67
- background-color: #B2BBD9;
68
- font-weight: 700;
69
- }
70
-
71
- .ns_block {
72
- display: block;
1
+ .ns_group_list_parent {
2
+ width: 100%;
3
+ max-width: 560px;
4
+ border-radius: 8px;
5
+ border: solid 1px #B2BBD9;
6
+ background-color: #fff;
7
+ padding-bottom: 16px;
8
+ height: 360px;
9
+ overflow: auto;
10
+ position: absolute;
11
+ z-index: 10;
12
+ margin-top: 50px;
13
+ }
14
+
15
+ .ns_group_list_parent::-webkit-scrollbar {
16
+ width: 1rem;
17
+ }
18
+
19
+ .ns_group_list_parent::-webkit-scrollbar-track {
20
+ box-shadow: inset 0 0 6px #E8EBF6;
21
+ }
22
+
23
+ .ns_group_list_parent::-webkit-scrollbar-thumb {
24
+ background-color: #A1A4B0;
25
+ border-radius: 8px;
26
+ }
27
+
28
+ .ns_group_list {
29
+ list-style-type: none;
30
+ color: #141B5C;
31
+ padding: 0;
32
+ margin: 0;
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: flex-start;
36
+ justify-content: flex-start;
37
+ font-size: 16px;
38
+ font-weight: 700;
39
+ width: 100%;
40
+ }
41
+
42
+ .ns_group_category {
43
+ border-bottom: solid 1px currentColor;
44
+ width: 100%;
45
+ display: flex;
46
+ justify-content: space-between;
47
+ padding: 10px 8px;
48
+ }
49
+
50
+ .ns_group_list li {
51
+ width: 100%;
52
+ }
53
+
54
+ .ns_group_item {
55
+ cursor: pointer;
56
+ padding: 6px 0 6px 24px;
57
+ font-size: 16px;
58
+ font-weight: 300;
59
+ color: #141B5C;
60
+ border-bottom: solid 1px currentColor;
61
+ width: 100%;
62
+ display: inline-block;
63
+ transition: all 0.1s;
64
+ }
65
+
66
+ .ns_group_item:hover {
67
+ background-color: #B2BBD9;
68
+ font-weight: 700;
69
+ }
70
+
71
+ .ns_block {
72
+ display: block;
73
73
  }