@gnar-engine/cli 1.0.3 → 1.0.5

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 (259) hide show
  1. package/bootstrap/deploy.localdev.yml +44 -30
  2. package/bootstrap/secrets.localdev.yml +20 -14
  3. package/bootstrap/services/control/src/config.js +4 -0
  4. package/bootstrap/services/{agent → page}/Dockerfile +3 -3
  5. package/bootstrap/services/page/package.json +16 -0
  6. package/bootstrap/services/page/src/app.js +50 -0
  7. package/bootstrap/services/page/src/commands/block.handler.js +94 -0
  8. package/bootstrap/services/page/src/commands/page.handler.js +167 -0
  9. package/bootstrap/services/page/src/config.js +62 -0
  10. package/bootstrap/services/page/src/controllers/block.http.controller.js +87 -0
  11. package/bootstrap/services/page/src/controllers/message.controller.js +51 -0
  12. package/bootstrap/services/page/src/controllers/page.http.controller.js +89 -0
  13. package/bootstrap/services/page/src/policies/block.policy.js +50 -0
  14. package/bootstrap/services/page/src/policies/page.policy.js +49 -0
  15. package/bootstrap/services/page/src/schema/page.schema.js +139 -0
  16. package/bootstrap/services/page/src/services/block.service.js +83 -0
  17. package/bootstrap/services/page/src/services/page.service.js +83 -0
  18. package/bootstrap/services/portal/Dockerfile +7 -10
  19. package/bootstrap/services/portal/README.md +66 -15
  20. package/bootstrap/services/portal/index.html +13 -0
  21. package/bootstrap/services/portal/nginx.conf +5 -12
  22. package/bootstrap/services/portal/package.json +27 -53
  23. package/bootstrap/services/portal/public/vite.svg +1 -0
  24. package/bootstrap/services/portal/react-router.config.js +7 -0
  25. package/bootstrap/services/portal/src/App.jsx +16 -0
  26. package/bootstrap/services/portal/src/assets/gnar-engine-white-logo.svg +9 -0
  27. package/bootstrap/services/portal/src/assets/icon-agent.svg +6 -0
  28. package/bootstrap/services/portal/src/assets/icon-cog.svg +4 -0
  29. package/bootstrap/services/portal/src/assets/icon-delete.svg +3 -0
  30. package/bootstrap/services/portal/src/assets/icon-home.svg +3 -0
  31. package/bootstrap/services/portal/src/assets/icon-padlock.svg +3 -0
  32. package/bootstrap/services/portal/src/assets/icon-page.svg +6 -0
  33. package/bootstrap/services/portal/src/assets/icon-reports.svg +3 -0
  34. package/bootstrap/services/portal/src/assets/icon-user.svg +3 -0
  35. package/bootstrap/services/portal/src/assets/icon-users.svg +3 -0
  36. package/bootstrap/services/portal/src/assets/login-green-rad-back-1.jpg +0 -0
  37. package/bootstrap/services/portal/src/assets/react.svg +1 -0
  38. package/bootstrap/services/portal/src/components/CrudList/CrudList.jsx +85 -0
  39. package/bootstrap/services/portal/src/components/CrudList/CrudList.less +59 -0
  40. package/bootstrap/services/portal/src/{ui/customSelect → components/CustomSelect}/CustomSelect.jsx +21 -3
  41. package/bootstrap/services/portal/src/components/LoginForm/LoginForm.jsx +58 -0
  42. package/bootstrap/services/portal/src/components/PageBlockSwitch/PageBlockSwitch.jsx +129 -0
  43. package/bootstrap/services/portal/src/components/Sidebar/Sidebar.jsx +33 -0
  44. package/bootstrap/services/portal/src/components/Sidebar/Sidebar.less +37 -0
  45. package/bootstrap/services/portal/src/components/Topbar/Topbar.jsx +19 -0
  46. package/bootstrap/services/portal/src/components/Topbar/Topbar.less +22 -0
  47. package/bootstrap/services/portal/src/components/UserInfo/UserInfo.jsx +33 -0
  48. package/bootstrap/services/portal/src/components/UserInfo/UserInfo.less +21 -0
  49. package/bootstrap/services/portal/src/css/style.css +446 -742
  50. package/bootstrap/services/portal/src/data/pages.data.js +10 -0
  51. package/bootstrap/services/portal/src/elements/CustomSelect/CustomSelect.jsx +65 -0
  52. package/bootstrap/services/portal/src/{ui/customSelect/customSelect.less → elements/CustomSelect/CustomSelect.less} +17 -7
  53. package/bootstrap/services/portal/src/elements/ImageInput/ImageInput.jsx +115 -0
  54. package/bootstrap/services/portal/src/elements/ImageInput/ImageInput.less +43 -0
  55. package/bootstrap/services/portal/src/elements/ImageMultiInput/ImageMultiInput.jsx +124 -0
  56. package/bootstrap/services/portal/src/elements/ImageMultiInput/ImageMultiInput.less +0 -0
  57. package/bootstrap/services/portal/src/elements/Repeater/Repeater.jsx +52 -0
  58. package/bootstrap/services/portal/src/elements/Repeater/Repeater.less +70 -0
  59. package/bootstrap/services/portal/src/elements/RichTextInput/RichTextInput.jsx +18 -0
  60. package/bootstrap/services/portal/src/elements/RichTextInput/RichTextInput.less +37 -0
  61. package/bootstrap/services/portal/src/elements/SaveButton/SaveButton.jsx +45 -0
  62. package/bootstrap/services/portal/src/elements/SelectRepeater/SelectRepeater.jsx +63 -0
  63. package/bootstrap/services/portal/src/elements/SelectRepeater/SelectRepeater.less +23 -0
  64. package/bootstrap/services/portal/src/elements/TextInput/TextInput.jsx +17 -0
  65. package/bootstrap/services/portal/src/layouts/Card/Card.jsx +15 -0
  66. package/bootstrap/services/portal/src/layouts/PortalLayout/PortalLayout.jsx +29 -0
  67. package/bootstrap/services/portal/src/layouts/PortalLayout/PortalLayout.less +49 -0
  68. package/bootstrap/services/portal/src/main.jsx +51 -0
  69. package/bootstrap/services/portal/src/pages/BlockSinglePage/BlockSinglePage.jsx +277 -0
  70. package/bootstrap/services/portal/src/pages/BlocksPage/BlocksPage.jsx +23 -0
  71. package/bootstrap/services/portal/src/pages/DashboardPage/DashboardPage.jsx +11 -0
  72. package/bootstrap/services/portal/src/pages/DashboardPage/DashboardPage.less +0 -0
  73. package/bootstrap/services/portal/src/pages/LoginPage/LoginPage.jsx +21 -0
  74. package/bootstrap/services/portal/src/pages/LoginPage/LoginPage.less +51 -0
  75. package/bootstrap/services/portal/src/pages/PageSinglePage/PageSinglePage.jsx +338 -0
  76. package/bootstrap/services/portal/src/pages/PagesPage/PagesPage.jsx +23 -0
  77. package/bootstrap/services/portal/src/pages/UserSinglePage/UserSinglePage.jsx +9 -0
  78. package/bootstrap/services/portal/src/pages/UserSinglePage/UserSinglePage.less +0 -0
  79. package/bootstrap/services/portal/src/pages/UsersPage/UsersPage.jsx +25 -0
  80. package/bootstrap/services/portal/src/pages/UsersPage/UsersPage.less +0 -0
  81. package/bootstrap/services/portal/src/services/block.js +28 -0
  82. package/bootstrap/services/portal/src/services/client.js +67 -0
  83. package/bootstrap/services/portal/src/services/gravatar.js +14 -0
  84. package/bootstrap/services/portal/src/services/page.js +28 -0
  85. package/bootstrap/services/portal/src/services/storage.js +62 -0
  86. package/bootstrap/services/portal/src/services/user.js +41 -0
  87. package/bootstrap/services/portal/src/slices/authSlice.js +44 -14
  88. package/bootstrap/services/portal/src/store/configureStore.js +1 -3
  89. package/bootstrap/services/portal/src/style/cards.less +57 -0
  90. package/bootstrap/services/portal/src/{styles → style}/global.less +90 -45
  91. package/bootstrap/services/portal/src/style/icons.less +21 -0
  92. package/bootstrap/services/portal/src/style/inputs.less +52 -0
  93. package/bootstrap/services/portal/src/style/main.less +28 -0
  94. package/bootstrap/services/portal/src/utils/utils.js +9 -0
  95. package/bootstrap/services/portal/vite.config.js +12 -0
  96. package/bootstrap/services/user/Dockerfile +1 -1
  97. package/bootstrap/services/user/src/app.js +6 -1
  98. package/bootstrap/services/user/src/commands/user.handler.js +0 -3
  99. package/bootstrap/services/user/src/config.js +5 -1
  100. package/bootstrap/services/user/src/policies/user.policy.js +3 -1
  101. package/bootstrap/services/user/src/tests/commands/user.test.js +22 -0
  102. package/install-from-clone.sh +30 -0
  103. package/package.json +1 -1
  104. package/src/cli.js +8 -0
  105. package/src/config.js +2 -1
  106. package/src/dev/commands.js +10 -2
  107. package/src/dev/dev.service.js +167 -52
  108. package/src/provisioner/Dockerfile +27 -0
  109. package/src/provisioner/package.json +19 -0
  110. package/src/provisioner/src/app.js +56 -0
  111. package/src/provisioner/src/services/mongodb.js +58 -0
  112. package/src/provisioner/src/services/mysql.js +51 -0
  113. package/src/provisioner/src/services/secrets.js +84 -0
  114. package/src/scaffolder/commands.js +12 -5
  115. package/src/scaffolder/scaffolder.handler.js +256 -58
  116. package/templates/service/Dockerfile.hbs +4 -1
  117. package/templates/service/package.json.hbs +14 -16
  118. package/templates/service/src/app.js.hbs +53 -0
  119. package/templates/service/{commands → src/commands}/{{serviceName}}.handler.js.hbs +2 -3
  120. package/templates/service/src/mongodb.config.js.hbs +49 -0
  121. package/templates/service/{config.js.hbs → src/mysql.config.js.hbs} +10 -0
  122. package/{bootstrap/services/agent/src/schema/Agent.schema.js → templates/service/src/schema/{{serviceName}}.schema.js.hbs} +3 -3
  123. package/templates/service/src/services/mongodb.{{serviceName}}.service.js.hbs +70 -0
  124. package/bootstrap/services/agent/notes.md +0 -28
  125. package/bootstrap/services/agent/package.json +0 -16
  126. package/bootstrap/services/agent/src/app.js +0 -52
  127. package/bootstrap/services/agent/src/commands/agent.handler.js +0 -104
  128. package/bootstrap/services/agent/src/config.js +0 -52
  129. package/bootstrap/services/agent/src/controllers/http.controller.js +0 -44
  130. package/bootstrap/services/agent/src/controllers/message.controller.js +0 -51
  131. package/bootstrap/services/agent/src/db/migrations/01-init.js +0 -50
  132. package/bootstrap/services/agent/src/db/migrations/02-agent-service-init.js +0 -36
  133. package/bootstrap/services/agent/src/policies/agent.policy.js +0 -13
  134. package/bootstrap/services/agent/src/services/agent.service.js +0 -259
  135. package/bootstrap/services/agent/src/services/chatgpt.service.js +0 -46
  136. package/bootstrap/services/agent/src/services/manifest.service.js +0 -21
  137. package/bootstrap/services/portal/Dockerfile.remote +0 -40
  138. package/bootstrap/services/portal/public/favicon.ico +0 -0
  139. package/bootstrap/services/portal/public/gnar-white.png +0 -0
  140. package/bootstrap/services/portal/public/gnarengine-logo-black.png +0 -0
  141. package/bootstrap/services/portal/public/index.html +0 -43
  142. package/bootstrap/services/portal/public/logo192.png +0 -0
  143. package/bootstrap/services/portal/public/logo512.png +0 -0
  144. package/bootstrap/services/portal/public/manifest.json +0 -25
  145. package/bootstrap/services/portal/public/robots.txt +0 -3
  146. package/bootstrap/services/portal/src/App.js +0 -56
  147. package/bootstrap/services/portal/src/assets/Logo_Anchord_Black.svg +0 -1
  148. package/bootstrap/services/portal/src/assets/Logo_Anchord_Black_Green.svg +0 -1
  149. package/bootstrap/services/portal/src/assets/Logo_Anchord_White_Green.svg +0 -1
  150. package/bootstrap/services/portal/src/assets/activity.svg +0 -3
  151. package/bootstrap/services/portal/src/assets/arrow.svg +0 -3
  152. package/bootstrap/services/portal/src/assets/bin-white.svg +0 -3
  153. package/bootstrap/services/portal/src/assets/bin.svg +0 -3
  154. package/bootstrap/services/portal/src/assets/check.svg +0 -3
  155. package/bootstrap/services/portal/src/assets/chevron.svg +0 -3
  156. package/bootstrap/services/portal/src/assets/contact.svg +0 -3
  157. package/bootstrap/services/portal/src/assets/dots-vertical.svg +0 -5
  158. package/bootstrap/services/portal/src/assets/eye-off.svg +0 -3
  159. package/bootstrap/services/portal/src/assets/eye.svg +0 -4
  160. package/bootstrap/services/portal/src/assets/gnar-engine-black.svg +0 -47
  161. package/bootstrap/services/portal/src/assets/gnar-engine-white.svg +0 -47
  162. package/bootstrap/services/portal/src/assets/gnar_engine.svg +0 -3
  163. package/bootstrap/services/portal/src/assets/gnarengine-logo-black.png +0 -0
  164. package/bootstrap/services/portal/src/assets/home.svg +0 -3
  165. package/bootstrap/services/portal/src/assets/link.svg +0 -3
  166. package/bootstrap/services/portal/src/assets/lock.svg +0 -3
  167. package/bootstrap/services/portal/src/assets/package.svg +0 -4
  168. package/bootstrap/services/portal/src/assets/raffle.svg +0 -3
  169. package/bootstrap/services/portal/src/assets/settings.svg +0 -4
  170. package/bootstrap/services/portal/src/assets/shopping-bag.svg +0 -3
  171. package/bootstrap/services/portal/src/assets/user-black.svg +0 -3
  172. package/bootstrap/services/portal/src/assets/user.svg +0 -3
  173. package/bootstrap/services/portal/src/assets/users.svg +0 -3
  174. package/bootstrap/services/portal/src/assets/wallet.svg +0 -3
  175. package/bootstrap/services/portal/src/data/data.js +0 -70
  176. package/bootstrap/services/portal/src/features/attributeFormRow/AttributeFormRow.jsx +0 -32
  177. package/bootstrap/services/portal/src/features/billingShipping/BillingShipping.jsx +0 -160
  178. package/bootstrap/services/portal/src/features/crud/crudEdit.less +0 -230
  179. package/bootstrap/services/portal/src/features/crud/crudList.less +0 -134
  180. package/bootstrap/services/portal/src/features/crud/crudPage.less +0 -31
  181. package/bootstrap/services/portal/src/features/crudContact/CrudContactList.jsx +0 -108
  182. package/bootstrap/services/portal/src/features/crudContact/CrudContactSingle.jsx +0 -243
  183. package/bootstrap/services/portal/src/features/crudOrder/CrudOrderList.jsx +0 -109
  184. package/bootstrap/services/portal/src/features/crudOrder/CrudOrderSingle.jsx +0 -315
  185. package/bootstrap/services/portal/src/features/crudProducts/CrudProductList.jsx +0 -104
  186. package/bootstrap/services/portal/src/features/crudProducts/CrudProductSingle.jsx +0 -388
  187. package/bootstrap/services/portal/src/features/crudRaffles/CrudRafflesList.jsx +0 -104
  188. package/bootstrap/services/portal/src/features/crudRaffles/CrudRafflesSingle.jsx +0 -208
  189. package/bootstrap/services/portal/src/features/crudSubscription/CrudSubscriptionList.jsx +0 -110
  190. package/bootstrap/services/portal/src/features/crudSubscription/CrudSubscriptionSingle.jsx +0 -261
  191. package/bootstrap/services/portal/src/features/crudUser/CrudUserList.jsx +0 -107
  192. package/bootstrap/services/portal/src/features/crudUser/CrudUserSingle.jsx +0 -402
  193. package/bootstrap/services/portal/src/features/inventoryFormRow/InventoryFormRow.jsx +0 -30
  194. package/bootstrap/services/portal/src/features/lineItems/LineItems.jsx +0 -113
  195. package/bootstrap/services/portal/src/features/loginForm/LoginForm.jsx +0 -56
  196. package/bootstrap/services/portal/src/features/loginForm/loginForm.less +0 -56
  197. package/bootstrap/services/portal/src/features/notes/Notes.jsx +0 -18
  198. package/bootstrap/services/portal/src/features/passwordReset/PasswordResetForm.jsx +0 -96
  199. package/bootstrap/services/portal/src/features/passwordReset/PasswordResetRequestForm.jsx +0 -74
  200. package/bootstrap/services/portal/src/features/priceFormRow/PriceFormRow.jsx +0 -102
  201. package/bootstrap/services/portal/src/features/priceFormRow/priceFormRow.less +0 -24
  202. package/bootstrap/services/portal/src/features/raffleEntriesList/RaffleEntriesList.jsx +0 -99
  203. package/bootstrap/services/portal/src/features/raffleProductFormRow/RaffleProductFormRow.jsx +0 -46
  204. package/bootstrap/services/portal/src/features/sidebar/Sidebar.jsx +0 -64
  205. package/bootstrap/services/portal/src/features/sidebar/sidebar.less +0 -49
  206. package/bootstrap/services/portal/src/features/skus/Skus.jsx +0 -109
  207. package/bootstrap/services/portal/src/features/subscriptionSchedule/SubscriptionSchedule.jsx +0 -44
  208. package/bootstrap/services/portal/src/features/taxonomyFormRow/TaxonomyFormRow.jsx +0 -32
  209. package/bootstrap/services/portal/src/features/user/User.jsx +0 -54
  210. package/bootstrap/services/portal/src/features/user/user.less +0 -57
  211. package/bootstrap/services/portal/src/includes/utilities.js +0 -259
  212. package/bootstrap/services/portal/src/index.js +0 -14
  213. package/bootstrap/services/portal/src/layouts/CrudLayout.jsx +0 -50
  214. package/bootstrap/services/portal/src/layouts/LoginLayout.jsx +0 -17
  215. package/bootstrap/services/portal/src/layouts/PortalLayout.jsx +0 -48
  216. package/bootstrap/services/portal/src/layouts/loginLayout.less +0 -33
  217. package/bootstrap/services/portal/src/layouts/portalLayout.less +0 -67
  218. package/bootstrap/services/portal/src/pages/contacts/Contacts.jsx +0 -199
  219. package/bootstrap/services/portal/src/pages/dashboard/Dashboard.jsx +0 -17
  220. package/bootstrap/services/portal/src/pages/integrations/Integrations.jsx +0 -10
  221. package/bootstrap/services/portal/src/pages/login/Login.jsx +0 -15
  222. package/bootstrap/services/portal/src/pages/login/login.less +0 -10
  223. package/bootstrap/services/portal/src/pages/orders/Orders.jsx +0 -199
  224. package/bootstrap/services/portal/src/pages/passwordReset/PasswordResetPage.jsx +0 -15
  225. package/bootstrap/services/portal/src/pages/passwordResetRequest/PasswordResetRequestPage.jsx +0 -15
  226. package/bootstrap/services/portal/src/pages/payments/Payments.jsx +0 -10
  227. package/bootstrap/services/portal/src/pages/portal/Portal.jsx +0 -43
  228. package/bootstrap/services/portal/src/pages/products/Products.jsx +0 -212
  229. package/bootstrap/services/portal/src/pages/raffleEntries/RaffleEntries.jsx +0 -124
  230. package/bootstrap/services/portal/src/pages/raffles/Raffles.jsx +0 -186
  231. package/bootstrap/services/portal/src/pages/reports/Reports.jsx +0 -10
  232. package/bootstrap/services/portal/src/pages/settings/Settings.jsx +0 -10
  233. package/bootstrap/services/portal/src/pages/subscriptions/Subscriptions.jsx +0 -199
  234. package/bootstrap/services/portal/src/pages/users/Users.jsx +0 -193
  235. package/bootstrap/services/portal/src/pages/users/users.less +0 -25
  236. package/bootstrap/services/portal/src/styles/inputs.less +0 -157
  237. package/bootstrap/services/portal/src/styles/main.less +0 -26
  238. package/bootstrap/services/portal/src/ui/collapsible/Collapsible.jsx +0 -97
  239. package/bootstrap/services/portal/src/ui/collapsible/collapsible.less +0 -23
  240. package/bootstrap/services/portal/src/ui/customCheckbox/CustomCheckbox.jsx +0 -17
  241. package/bootstrap/services/portal/src/ui/customCheckbox/customCheckbox.less +0 -42
  242. package/bootstrap/services/portal/src/ui/customMultiSelect/CustomMultiSelect.jsx +0 -63
  243. package/bootstrap/services/portal/src/ui/customMultiSelect/CustomMultiSelectPeriod.jsx +0 -63
  244. package/bootstrap/services/portal/src/ui/goBack/GoBack.jsx +0 -19
  245. package/bootstrap/services/portal/src/ui/loader/Loader.jsx +0 -12
  246. package/bootstrap/services/portal/src/ui/pagination/Pagination.jsx +0 -23
  247. package/bootstrap/services/portal/src/ui/repeater/Repeater.jsx +0 -29
  248. package/bootstrap/services/portal/src/ui/saveButton/SaveButton.jsx +0 -69
  249. package/bootstrap/services/user/src/db/seeders/development/02-portal-admin-user.js +0 -27
  250. package/bootstrap/services/user/src/tests/user.test.js +0 -126
  251. package/templates/service/app.js.hbs +0 -38
  252. package/templates/service/schema/{{serviceName}}.schema.js.hbs +0 -14
  253. /package/bootstrap/services/portal/src/{ui/saveButton/saveButton.less → components/CustomSelect/CustomSelect.less} +0 -0
  254. /package/templates/service/{controllers → src/controllers}/http.controller.js.hbs +0 -0
  255. /package/templates/service/{controllers → src/controllers}/message.controller.js.hbs +0 -0
  256. /package/templates/service/{db → src/mysql.db}/migrations/01-init.js.hbs +0 -0
  257. /package/templates/service/{db → src/mysql.db}/migrations/02-{{lowerCase serviceName}}-service-init.js.hbs +0 -0
  258. /package/templates/service/{policies → src/policies}/{{serviceName}}.policy.js.hbs +0 -0
  259. /package/templates/service/{services/{{serviceName}}.service.js.hbs → src/services/mysql.{{serviceName}}.service.js.hbs} +0 -0
@@ -1,23 +0,0 @@
1
- .collapsible-header {
2
- display: flex;
3
- justify-content: space-between;
4
-
5
- h3 {
6
- margin: 0px;
7
- }
8
-
9
- &:hover {
10
- cursor: pointer;
11
- }
12
- }
13
-
14
- .collapsible-content {
15
- overflow: hidden;
16
- transition-duration: 0.5s;
17
- }
18
- .collapsible-content-open {
19
- margin-top: 30px;
20
- }
21
- .collapsible-content-inner ul {
22
- margin: 0px;
23
- }
@@ -1,17 +0,0 @@
1
- import React from "react";
2
-
3
-
4
- const CustomCheckbox = ({name, label, checked, setChecked}) => {
5
-
6
- return (
7
- <div
8
- className={`custom-checkbox ${checked && 'checked'}`}
9
- onClick={(e) => e.stopPropagation()}
10
- >
11
- <input type="checkbox" id={name} name={name} checked={checked} onChange={() => setChecked(!checked)} />
12
- <label htmlFor={name}>{label}</label>
13
- </div>
14
- )
15
- }
16
-
17
- export default CustomCheckbox;
@@ -1,42 +0,0 @@
1
- .custom-checkbox {
2
- position: relative;
3
- margin-top: 15px;
4
- margin-bottom: 10px;
5
-
6
- input {
7
- opacity: 0;
8
- position: absolute;
9
- left: 0px;
10
- min-width: 18px;
11
- min-height: 18px;
12
-
13
- &:hover {
14
- cursor: pointer;
15
- }
16
- }
17
- label {
18
- padding-left: 20px;
19
- transition-duration: 0.1s;
20
- box-sizing: border-box;
21
-
22
- &:hover {
23
- cursor: pointer;
24
- opacity: 0.8;
25
- }
26
- }
27
-
28
- &:before {
29
- content: '';
30
- min-width: 18px;
31
- min-height: 18px;
32
- background: #F6F8F9;
33
- border: 1px solid #E4E4E4;
34
- border-radius: 6px;
35
- position: absolute;
36
- left: 0px;
37
- }
38
- &.checked:before {
39
- content: '';
40
- background: #F6F8F9 url('../assets/check.svg') no-repeat center center;
41
- }
42
- }
@@ -1,63 +0,0 @@
1
- import React, { useState } from "react";
2
-
3
- const CustomMultiSelect = ({placeholder, name, options, labelKey, icon = null, setSelectedOption, selectedOptions}) => {
4
-
5
- const [isOpen, setIsOpen] = useState(false);
6
- const [isClosing, setIsClosing] = useState(false);
7
-
8
- // Close dropdown
9
- const closeDropdown = () => {
10
- setIsClosing(true);
11
- setIsOpen(false);
12
- setTimeout(() => {
13
- setIsClosing(false);
14
- }, 300);
15
- };
16
-
17
- // Open dropdown
18
- const openDropdown = () => {
19
- setIsOpen(true);
20
- setIsClosing(false);
21
- };
22
-
23
- // Handle click for opening and closing
24
- const handleClick = () => {
25
- if (!isOpen) {
26
- openDropdown();
27
- } else {
28
- closeDropdown();
29
- }
30
- };
31
-
32
- return (
33
- <>
34
- {placeholder && name && setSelectedOption &&
35
- <div className={`custom-select ${isOpen && "open"} ${isClosing ? "closing" : ""}`}>
36
- <div className="custom-select-input" id={name} name={name} onClick={handleClick}>
37
- {icon && <img src={icon} alt="icon" />}
38
- {selectedOptions && selectedOptions.length >= 1 && selectedOptions[0] && selectedOptions[0][labelKey] ? (
39
- selectedOptions.map((selectedOption, index) => (
40
- <span>{selectedOption[labelKey]} {index + 1 !== selectedOptions.length && ', '}</span>
41
- ))
42
- ) : (
43
- <span>{placeholder}</span>
44
- )}
45
- </div>
46
- {isOpen && (
47
- <div className="custom-select-options" onMouseLeave={closeDropdown}>
48
- <div className="custom-select-options-inner">
49
- {options && options.map((option, index) => (
50
- <div key={index} className="custom-select-option" onClick={() => {setSelectedOption(option)}}>
51
- <span>{option[labelKey]}</span>
52
- </div>
53
- ))}
54
- </div>
55
- </div>
56
- )}
57
- </div>
58
- }
59
- </>
60
- )
61
- }
62
-
63
- export default CustomMultiSelect;
@@ -1,63 +0,0 @@
1
- import React, {useState, useEffect, useRef} from "react";
2
-
3
- const CustomMultiSelectPeriod = ({placeholder, name, options, icon = null, setSelectedOption, selectedOptions}) => {
4
-
5
- const [isOpen, setIsOpen] = useState(false);
6
- const [isClosing, setIsClosing] = useState(false);
7
-
8
- // Close dropdown
9
- const closeDropdown = () => {
10
- setIsClosing(true);
11
- setIsOpen(false);
12
- setTimeout(() => {
13
- setIsClosing(false);
14
- }, 300);
15
- };
16
-
17
- // Open dropdown
18
- const openDropdown = () => {
19
- setIsOpen(true);
20
- setIsClosing(false);
21
- };
22
-
23
- // Handle click for opening and closing
24
- const handleClick = () => {
25
- if (!isOpen) {
26
- openDropdown();
27
- } else {
28
- closeDropdown();
29
- }
30
- };
31
-
32
- return (
33
- <>
34
- {placeholder && name && options && setSelectedOption && selectedOptions &&
35
- <div className={`custom-select ${isOpen && "open"} ${isClosing ? "closing" : ""}`}>
36
- <div className="custom-select-input" id={name} name={name} onClick={handleClick}>
37
- {icon && <img src={icon} alt="icon" />}
38
- {selectedOptions.length >= 1 && selectedOptions[0] && selectedOptions[0].period_name ? (
39
- selectedOptions.map((selectedPeriod, index) => (
40
- <span>{selectedPeriod.period_name} {selectedPeriod.calendar_year} {index + 1 !== selectedOptions.length && ', '}</span>
41
- ))
42
- ) : (
43
- <span>{placeholder}</span>
44
- )}
45
- </div>
46
- {isOpen && (
47
- <div className="custom-select-options" onMouseLeave={closeDropdown}>
48
- <div className="custom-select-options-inner">
49
- {options.map((period, index) => (
50
- <div key={index} className="custom-select-option" onClick={() => {setSelectedOption(period)}}>
51
- <span>{period.period_name} {period.calendar_year}</span>
52
- </div>
53
- ))}
54
- </div>
55
- </div>
56
- )}
57
- </div>
58
- }
59
- </>
60
- )
61
- }
62
-
63
- export default CustomMultiSelectPeriod;
@@ -1,19 +0,0 @@
1
- import React from "react";
2
- import { Link, useNavigate } from "react-router-dom";
3
-
4
-
5
- export default function GoBack({text}) {
6
-
7
- const navigate = useNavigate();
8
-
9
- function handleGoBack() {
10
- navigate(-1);
11
- }
12
-
13
- return (
14
- <a onClick={handleGoBack}>
15
- <img className="cross" src={require('../../assets/x.svg').default} alt="back" />
16
- {text}
17
- </a>
18
- )
19
- }
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
-
3
- function Loader() {
4
-
5
- return (
6
- <div className="loader">
7
- <div className="loader__spinner">Loading...</div>
8
- </div>
9
- );
10
- }
11
-
12
- export default Loader;
@@ -1,23 +0,0 @@
1
- import React from 'react';
2
-
3
- const Pagination = ({ numPages, currentPage, setCurrentPage }) => {
4
- const handlePageChange = (page) => {
5
- setCurrentPage(page);
6
- };
7
-
8
- return (
9
- <div className="pagination">
10
- {Array.from({ length: numPages }, (_, i) => (
11
- <button
12
- key={i}
13
- onClick={() => handlePageChange(i + 1)}
14
- disabled={currentPage === i + 1}
15
- >
16
- {i + 1}
17
- </button>
18
- ))}
19
- </div>
20
- );
21
- };
22
-
23
- export default Pagination;
@@ -1,29 +0,0 @@
1
- import React from "react";
2
-
3
- const Repeater = ({ items = [], setItems, defaultItem, renderRow, buttonText }) => {
4
-
5
- const addItem = () => {
6
- setItems([...items, defaultItem]);
7
- }
8
-
9
- const updateItem = (index, newItem) => {
10
- const newItems = [...items];
11
- newItems[index] = newItem;
12
- setItems(newItems);
13
- };
14
-
15
- const removeItem = (index) => setItems(items.filter((_, i) => i !== index));
16
-
17
- return (
18
- <div>
19
- {items.length > 0 && items.map((item, index) =>
20
- renderRow(item, index, (newItem) => updateItem(index, newItem), () => removeItem(index))
21
- )}
22
- <div className="button-cont right">
23
- <button className="mainButton wide" onClick={addItem}>{buttonText}</button>
24
- </div>
25
- </div>
26
- );
27
- };
28
-
29
- export default Repeater;
@@ -1,69 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
-
3
- const SaveButton = ({ save, loading, textCreate, textCreateLoading, textCreateSuccess, textCreateError, textUpdate, textUpdateLoading, textUpdateSuccess, textUpdateError, isUpdating}) => {
4
-
5
- const [buttonText, setButtonText] = useState(textCreate || 'Save');
6
-
7
- // Determine the button class name based on the loading state
8
- const getButtonClassName = () => {
9
- if (loading === 'loading') {
10
- return 'btn-loading';
11
- }
12
-
13
- if (loading === 'success') {
14
- return 'success';
15
- }
16
-
17
- if (loading === 'error') {
18
- return 'error';
19
- }
20
-
21
- if (isUpdating) {
22
- return 'update';
23
- } else {
24
- return 'create';
25
- }
26
- };
27
-
28
- useEffect(() => {
29
- if (isUpdating) {
30
- // If updating
31
- switch (loading) {
32
- case 'loading':
33
- setButtonText(textUpdateLoading || 'Updating...');
34
- break;
35
- case 'success':
36
- setButtonText(textUpdateSuccess || 'Updated');
37
- break;
38
- case 'error':
39
- setButtonText(textUpdateError || 'Error');
40
- break;
41
- default:
42
- setButtonText(textUpdate || 'Update');
43
- break;
44
- }
45
- } else {
46
- // If creating
47
- switch (loading) {
48
- case 'loading':
49
- setButtonText(textCreateLoading || 'Creating...');
50
- break;
51
- case 'success':
52
- setButtonText(textCreateSuccess || 'Saved');
53
- break;
54
- case 'error':
55
- setButtonText(textCreateError || 'Error');
56
- break;
57
- default:
58
- setButtonText(textCreate || 'Save');
59
- break;
60
- }
61
- }
62
- }, [loading, isUpdating, textCreate, textCreateLoading, textCreateSuccess, textCreateError, textUpdate, textUpdateLoading, textUpdateSuccess, textUpdateError]);
63
-
64
- return (
65
- <button className={getButtonClassName()} onClick={save}>{buttonText}</button>
66
- );
67
- };
68
-
69
- export default SaveButton;
@@ -1,27 +0,0 @@
1
- import { logger } from '@gnar-engine/core';
2
- import { user } from '../../../services/user.service.js';
3
-
4
- /**
5
- * Up seeder
6
- */
7
- export const up = async () => {
8
-
9
- // create root users using user service
10
- const users = [];
11
-
12
- users.push(await user.create({
13
- email: 'alex@gnar.co.uk',
14
- username: 'alexgnar',
15
- password: 'gnarlybulkwash',
16
- role: 'admin'
17
- }));
18
-
19
- logger.info('Completed seeding root user data ' + JSON.stringify(users));
20
- }
21
-
22
- /**
23
- * Down seeder
24
- */
25
- export const down = async () => {
26
- logger.info('Down seeder not implemented');
27
- }
@@ -1,126 +0,0 @@
1
- const request = require('supertest');
2
- const url = 'http://localhost';
3
-
4
- describe('User API', () => {
5
-
6
- let adminAuthToken;
7
- let customerAuthToken;
8
- let userId;
9
- let testCustomerEmail;
10
-
11
- beforeAll(async () => {
12
- // check we are not in production mode
13
- if (process.env.NODE_ENV === 'production') {
14
- throw new Error('Do not run tests in production mode!');
15
- }
16
-
17
- testCustomerEmail = 'customertest13@gnar.co.uk';
18
- });
19
-
20
- // Test authenticate with email and password
21
- it('POST /authenticate (as admin)', async () => {
22
- const response = await request(url).post('/authenticate')
23
- .set('Content-Type', 'application/json')
24
- .send({
25
- username: 'root@gnar.co.uk',
26
- password: 'gn4rlyR00tP0rt4lP4ss'
27
- });
28
- console.log(response.body);
29
- expect(response.status).toBe(200);
30
- expect(response.body).toHaveProperty('token');
31
-
32
- adminAuthToken = response.body.token;
33
- });
34
-
35
- // Create new customer user (success no auth required)
36
- it('POST /users (create new customer user no auth required)', async () => {
37
- const response = await request(url).post('/users')
38
- .set('Content-Type', 'application/json')
39
- .send({
40
- user:
41
- {
42
- email: testCustomerEmail,
43
- password: 'password1234'
44
- }
45
- })
46
- console.log(response.body);
47
- expect(response.status).toBe(200);
48
- expect(response.body.users[0].email).toBe(testCustomerEmail);
49
-
50
- // Save the new user id
51
- userId = response.body.users[0].id;
52
- console.log('New user id: ' + userId);
53
- });
54
-
55
- // Test authenticate with new user
56
- it('POST /authenticate (as new customer user)', async () => {
57
- const response = await request(url).post('/authenticate')
58
- .set('Content-Type', 'application/json')
59
- .send({
60
- username: testCustomerEmail,
61
- password: 'password1234'
62
- });
63
- console.log(response.body);
64
- expect(response.status).toBe(200);
65
- expect(response.body).toHaveProperty('token');
66
-
67
- customerAuthToken = response.body.token;
68
- });
69
-
70
- // Fetch single customer user (as customer)
71
- it('GET /users/{id} (as customer)', async () => {
72
- const response = await request(url).get('/users/' + userId)
73
- .set('Authorization', 'Bearer ' + customerAuthToken);
74
- console.log(response.body);
75
- expect(response.status).toBe(200);
76
- });
77
-
78
- // Fetch all users (not authorised as customer)
79
- it('GET /users (not authorised as customer)', async () => {
80
- const response = await request(url).get('/users')
81
- .set('Authorization', 'Bearer ' + customerAuthToken);
82
- console.log(response.body);
83
- expect(response.status).toBe(403);
84
- });
85
-
86
- // Fetch all users (success as admin)
87
- it('GET /users (as admin)', async () => {
88
- const response = await request(url).get('/users')
89
- .set('Authorization', 'Bearer ' + adminAuthToken);
90
- console.log(response.body);
91
- expect(response.status).toBe(200);
92
- });
93
-
94
- // Update customer user (as customer)
95
- it('POST /users/{id} (as customer)', async () => {
96
- const response = await request(url).post('/users/' + userId)
97
- .set('Authorization', 'Bearer ' + customerAuthToken)
98
- .set('Content-Type', 'application/json')
99
- .send({
100
- email: 'changedcustomeremail2@gnar.co.uk'
101
- });
102
- console.log(response.body);
103
- expect(response.status).toBe(200);
104
- expect(response.body.user.email).toBe('changedcustomeremail2@gnar.co.uk');
105
- });
106
-
107
- // Update customer user (check cannot elevate role to admin)
108
- it('POST /users/{id} (as customer)', async () => {
109
- const response = await request(url).post('/users/' + userId)
110
- .set('Authorization', 'Bearer ' + customerAuthToken)
111
- .set('Content-Type', 'application/json')
112
- .send({
113
- role: 'service_admin'
114
- });
115
- console.log(response.body);
116
- expect(response.status).toBe(403);
117
- });-
118
-
119
- // Delete customer user (as admin)
120
- it('DELETE /users/{id} (as admin)', async () => {
121
- const response = await request(url).delete('/users/' + userId)
122
- .set('Authorization', 'Bearer ' + adminAuthToken);
123
- console.log(response.body);
124
- expect(response.status).toBe(200);
125
- });
126
- });
@@ -1,38 +0,0 @@
1
- import { message, http, logger, db } from '@gnar-engine/core';
2
- import { config } from './config.js';
3
- import { messageHandlers } from './controllers/message.controller.js';
4
- import { httpController as {{pascalCase serviceName}}PlatformHttpController } from './controllers/http.controller.js';
5
-
6
- /**
7
- * Initialise service
8
- */
9
- export const initService = async () => {
10
-
11
- // Run migrations
12
- db.migrations.runMigrations({config});
13
- db.seeders.runSeeders({config});
14
-
15
- // Import command handlers after the command bus is initialised
16
- await import('./commands/{{lowerCasePlural serviceName}}.handler.js');
17
- // Add more handlers as needed
18
-
19
- // Initialise and register message handlers
20
- await message.init({
21
- config: config.message,
22
- handlers: messageHandlers
23
- });
24
-
25
- // Register http routes
26
- await http.registerRoutes({
27
- controllers: [
28
- {{pascalCase serviceName}}PlatformHttpController,
29
- ]
30
- });
31
-
32
- // Start the HTTP server
33
- await http.start();
34
-
35
- logger.info('G n a r E n g i n e | {{capitaliseFirstLetter serviceName}} Service initialised successfully.');
36
- }
37
-
38
- initService();
@@ -1,14 +0,0 @@
1
- import { schema } from '@gnar-engine/core';
2
- import { config } from '../config.js';
3
-
4
- export const {{serviceName}}Schema = {
5
- type: 'object',
6
- properties: {
7
- // Add your properties here
8
-
9
- },
10
- required: [],
11
- additionalProperties: false,
12
- };
13
-
14
- export const validate{{pascalCase serviceName}} = schema.compile({{serviceName}}Schema);