@inventreedb/ui 0.0.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 (541) hide show
  1. package/.babelrc +8 -0
  2. package/.linguirc +55 -0
  3. package/README.md +17 -0
  4. package/index.html +15 -0
  5. package/lib/enums/ApiEndpoints.tsx +233 -0
  6. package/lib/enums/ModelType.tsx +38 -0
  7. package/lib/enums/Roles.tsx +25 -0
  8. package/lib/functions/Api.tsx +42 -0
  9. package/lib/functions/Plugins.tsx +27 -0
  10. package/lib/index.ts +11 -0
  11. package/lib/types/Auth.tsx +51 -0
  12. package/lib/types/Core.tsx +13 -0
  13. package/lib/types/Filters.tsx +69 -0
  14. package/lib/types/Forms.tsx +185 -0
  15. package/lib/types/Modals.tsx +17 -0
  16. package/lib/types/Plugins.tsx +68 -0
  17. package/lib/types/Server.tsx +8 -0
  18. package/lib/types/Settings.tsx +55 -0
  19. package/lib/types/Tables.tsx +69 -0
  20. package/lib/types/User.tsx +62 -0
  21. package/netlify.toml +22 -0
  22. package/package.json +125 -0
  23. package/playwright/global-setup.ts +45 -0
  24. package/playwright.config.ts +99 -0
  25. package/public/inventree.svg +291 -0
  26. package/src/App.tsx +35 -0
  27. package/src/assets/inventree.svg +1 -0
  28. package/src/components/Boundary.tsx +43 -0
  29. package/src/components/SplashScreen.tsx +35 -0
  30. package/src/components/barcodes/BarcodeCameraInput.tsx +207 -0
  31. package/src/components/barcodes/BarcodeInput.tsx +127 -0
  32. package/src/components/barcodes/BarcodeKeyboardInput.tsx +50 -0
  33. package/src/components/barcodes/BarcodeScanDialog.tsx +101 -0
  34. package/src/components/barcodes/BarcodeScanItem.tsx +23 -0
  35. package/src/components/barcodes/QRCode.tsx +211 -0
  36. package/src/components/buttons/ActionButton.tsx +61 -0
  37. package/src/components/buttons/AddItemButton.tsx +10 -0
  38. package/src/components/buttons/AdminButton.tsx +91 -0
  39. package/src/components/buttons/ButtonMenu.tsx +33 -0
  40. package/src/components/buttons/CopyButton.tsx +52 -0
  41. package/src/components/buttons/PrimaryActionButton.tsx +40 -0
  42. package/src/components/buttons/PrintingActions.tsx +191 -0
  43. package/src/components/buttons/RemoveRowButton.tsx +22 -0
  44. package/src/components/buttons/SSOButton.tsx +53 -0
  45. package/src/components/buttons/ScanButton.tsx +27 -0
  46. package/src/components/buttons/SegmentedIconControl.tsx +51 -0
  47. package/src/components/buttons/SplitButton.css.ts +19 -0
  48. package/src/components/buttons/SplitButton.tsx +111 -0
  49. package/src/components/buttons/SpotlightButton.tsx +22 -0
  50. package/src/components/buttons/StarredToggleButton.tsx +62 -0
  51. package/src/components/buttons/YesNoButton.tsx +42 -0
  52. package/src/components/calendar/Calendar.tsx +193 -0
  53. package/src/components/calendar/OrderCalendar.tsx +209 -0
  54. package/src/components/charts/colors.tsx +12 -0
  55. package/src/components/charts/tooltipFormatter.tsx +12 -0
  56. package/src/components/dashboard/DashboardLayout.tsx +327 -0
  57. package/src/components/dashboard/DashboardMenu.tsx +136 -0
  58. package/src/components/dashboard/DashboardWidget.tsx +82 -0
  59. package/src/components/dashboard/DashboardWidgetDrawer.tsx +130 -0
  60. package/src/components/dashboard/DashboardWidgetLibrary.tsx +189 -0
  61. package/src/components/dashboard/widgets/ColorToggleWidget.tsx +28 -0
  62. package/src/components/dashboard/widgets/GetStartedWidget.tsx +19 -0
  63. package/src/components/dashboard/widgets/LanguageSelectWidget.tsx +28 -0
  64. package/src/components/dashboard/widgets/NewsWidget.tsx +143 -0
  65. package/src/components/dashboard/widgets/QueryCountDashboardWidget.tsx +134 -0
  66. package/src/components/details/Details.tsx +514 -0
  67. package/src/components/details/DetailsBadge.tsx +20 -0
  68. package/src/components/details/DetailsImage.tsx +462 -0
  69. package/src/components/details/ItemDetails.tsx +17 -0
  70. package/src/components/editors/NotesEditor.tsx +232 -0
  71. package/src/components/editors/TemplateEditor/CodeEditor/CodeEditor.tsx +158 -0
  72. package/src/components/editors/TemplateEditor/CodeEditor/index.tsx +12 -0
  73. package/src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx +90 -0
  74. package/src/components/editors/TemplateEditor/PdfPreview/index.tsx +12 -0
  75. package/src/components/editors/TemplateEditor/TemplateEditor.tsx +425 -0
  76. package/src/components/editors/TemplateEditor/index.tsx +3 -0
  77. package/src/components/errors/ClientError.tsx +28 -0
  78. package/src/components/errors/GenericErrorPage.tsx +73 -0
  79. package/src/components/errors/NotAuthenticated.tsx +12 -0
  80. package/src/components/errors/NotFound.tsx +12 -0
  81. package/src/components/errors/PermissionDenied.tsx +12 -0
  82. package/src/components/errors/ServerError.tsx +13 -0
  83. package/src/components/forms/ApiForm.tsx +718 -0
  84. package/src/components/forms/AuthFormOptions.tsx +39 -0
  85. package/src/components/forms/AuthenticationForm.tsx +332 -0
  86. package/src/components/forms/HostOptionsForm.tsx +96 -0
  87. package/src/components/forms/InstanceOptions.tsx +178 -0
  88. package/src/components/forms/StandaloneField.tsx +55 -0
  89. package/src/components/forms/fields/ApiFormField.tsx +281 -0
  90. package/src/components/forms/fields/ChoiceField.tsx +86 -0
  91. package/src/components/forms/fields/DateField.tsx +79 -0
  92. package/src/components/forms/fields/DependentField.tsx +91 -0
  93. package/src/components/forms/fields/IconField.tsx +353 -0
  94. package/src/components/forms/fields/NestedObjectField.tsx +45 -0
  95. package/src/components/forms/fields/RelatedModelField.tsx +339 -0
  96. package/src/components/forms/fields/TableField.tsx +275 -0
  97. package/src/components/forms/fields/TextField.tsx +81 -0
  98. package/src/components/images/ApiImage.tsx +35 -0
  99. package/src/components/images/Thumbnail.tsx +52 -0
  100. package/src/components/importer/ImportDataSelector.tsx +433 -0
  101. package/src/components/importer/ImporterColumnSelector.tsx +244 -0
  102. package/src/components/importer/ImporterDrawer.tsx +173 -0
  103. package/src/components/importer/ImporterImportProgress.tsx +45 -0
  104. package/src/components/items/ActionDropdown.tsx +290 -0
  105. package/src/components/items/ApiIcon.css.ts +13 -0
  106. package/src/components/items/ApiIcon.tsx +32 -0
  107. package/src/components/items/AttachmentLink.tsx +79 -0
  108. package/src/components/items/ColorToggle.tsx +34 -0
  109. package/src/components/items/DashboardItem.tsx +33 -0
  110. package/src/components/items/DocInfo.tsx +20 -0
  111. package/src/components/items/DocTooltip.tsx +98 -0
  112. package/src/components/items/ErrorItem.tsx +17 -0
  113. package/src/components/items/Expand.tsx +14 -0
  114. package/src/components/items/GettingStartedCarousel.css.ts +30 -0
  115. package/src/components/items/GettingStartedCarousel.tsx +49 -0
  116. package/src/components/items/InfoItem.tsx +64 -0
  117. package/src/components/items/InvenTreeLogo.tsx +24 -0
  118. package/src/components/items/LanguageSelect.tsx +43 -0
  119. package/src/components/items/LanguageToggle.tsx +37 -0
  120. package/src/components/items/MenuLinks.tsx +113 -0
  121. package/src/components/items/OnlyStaff.tsx +10 -0
  122. package/src/components/items/ProgressBar.tsx +45 -0
  123. package/src/components/items/StylishText.tsx +59 -0
  124. package/src/components/items/TitleWithDoc.tsx +26 -0
  125. package/src/components/items/UnavailableIndicator.tsx +5 -0
  126. package/src/components/items/inventree.svg +1 -0
  127. package/src/components/modals/AboutInvenTreeModal.tsx +203 -0
  128. package/src/components/modals/LicenseModal.tsx +116 -0
  129. package/src/components/modals/QrModal.tsx +21 -0
  130. package/src/components/modals/ServerInfoModal.tsx +136 -0
  131. package/src/components/nav/Alerts.tsx +130 -0
  132. package/src/components/nav/BreadcrumbList.tsx +84 -0
  133. package/src/components/nav/DetailDrawer.css.ts +6 -0
  134. package/src/components/nav/DetailDrawer.tsx +105 -0
  135. package/src/components/nav/Footer.tsx +11 -0
  136. package/src/components/nav/Header.tsx +226 -0
  137. package/src/components/nav/InstanceDetail.tsx +46 -0
  138. package/src/components/nav/Layout.tsx +85 -0
  139. package/src/components/nav/MainMenu.tsx +101 -0
  140. package/src/components/nav/NavHoverMenu.tsx +15 -0
  141. package/src/components/nav/NavigationDrawer.tsx +230 -0
  142. package/src/components/nav/NavigationTree.tsx +210 -0
  143. package/src/components/nav/NotificationDrawer.tsx +231 -0
  144. package/src/components/nav/PageDetail.tsx +171 -0
  145. package/src/components/nav/PageTitle.tsx +53 -0
  146. package/src/components/nav/SearchDrawer.tsx +598 -0
  147. package/src/components/nav/SettingsHeader.tsx +50 -0
  148. package/src/components/panels/AttachmentPanel.tsx +27 -0
  149. package/src/components/panels/NotesPanel.tsx +36 -0
  150. package/src/components/panels/Panel.tsx +15 -0
  151. package/src/components/panels/PanelGroup.css.ts +10 -0
  152. package/src/components/panels/PanelGroup.tsx +292 -0
  153. package/src/components/plugins/LocateItemButton.tsx +94 -0
  154. package/src/components/plugins/PluginContext.tsx +67 -0
  155. package/src/components/plugins/PluginDrawer.tsx +156 -0
  156. package/src/components/plugins/PluginInterface.tsx +34 -0
  157. package/src/components/plugins/PluginPanel.tsx +37 -0
  158. package/src/components/plugins/PluginSettingsPanel.tsx +34 -0
  159. package/src/components/plugins/PluginSource.tsx +48 -0
  160. package/src/components/plugins/PluginUIFeature.tsx +174 -0
  161. package/src/components/plugins/PluginUIFeatureTypes.ts +78 -0
  162. package/src/components/plugins/RemoteComponent.tsx +137 -0
  163. package/src/components/render/Build.tsx +54 -0
  164. package/src/components/render/Company.tsx +114 -0
  165. package/src/components/render/Generic.tsx +49 -0
  166. package/src/components/render/Instance.tsx +240 -0
  167. package/src/components/render/InstanceFromUrl.tsx +33 -0
  168. package/src/components/render/ModelType.tsx +293 -0
  169. package/src/components/render/Order.tsx +124 -0
  170. package/src/components/render/Part.tsx +109 -0
  171. package/src/components/render/Plugin.tsx +21 -0
  172. package/src/components/render/Report.tsx +29 -0
  173. package/src/components/render/StatusRenderer.tsx +178 -0
  174. package/src/components/render/Stock.tsx +84 -0
  175. package/src/components/render/User.tsx +42 -0
  176. package/src/components/settings/FactCollection.tsx +31 -0
  177. package/src/components/settings/FactItem.tsx +17 -0
  178. package/src/components/settings/SettingItem.tsx +176 -0
  179. package/src/components/settings/SettingList.tsx +217 -0
  180. package/src/components/wizards/OrderPartsWizard.tsx +473 -0
  181. package/src/components/wizards/WizardDrawer.tsx +188 -0
  182. package/src/contexts/ApiContext.tsx +31 -0
  183. package/src/contexts/LanguageContext.tsx +155 -0
  184. package/src/contexts/ThemeContext.tsx +58 -0
  185. package/src/contexts/colorSchema.tsx +67 -0
  186. package/src/defaults/actions.tsx +87 -0
  187. package/src/defaults/backendMappings.tsx +32 -0
  188. package/src/defaults/defaultHostList.tsx +4 -0
  189. package/src/defaults/defaults.tsx +38 -0
  190. package/src/defaults/formatters.tsx +176 -0
  191. package/src/defaults/links.tsx +193 -0
  192. package/src/defaults/templates.tsx +53 -0
  193. package/src/forms/BomForms.tsx +26 -0
  194. package/src/forms/BuildForms.tsx +615 -0
  195. package/src/forms/CommonForms.tsx +89 -0
  196. package/src/forms/CompanyForms.tsx +133 -0
  197. package/src/forms/ImporterForms.tsx +20 -0
  198. package/src/forms/PartForms.tsx +281 -0
  199. package/src/forms/PurchaseOrderForms.tsx +779 -0
  200. package/src/forms/ReturnOrderForms.tsx +263 -0
  201. package/src/forms/SalesOrderForms.tsx +408 -0
  202. package/src/forms/StockForms.tsx +1296 -0
  203. package/src/forms/selectionListFields.tsx +120 -0
  204. package/src/functions/api.tsx +61 -0
  205. package/src/functions/auth.tsx +574 -0
  206. package/src/functions/conversion.tsx +42 -0
  207. package/src/functions/events.tsx +6 -0
  208. package/src/functions/forms.tsx +173 -0
  209. package/src/functions/icons.tsx +294 -0
  210. package/src/functions/loading.tsx +29 -0
  211. package/src/functions/navigation.tsx +20 -0
  212. package/src/functions/notifications.tsx +101 -0
  213. package/src/functions/tables.tsx +26 -0
  214. package/src/functions/uid.tsx +15 -0
  215. package/src/functions/urls.tsx +58 -0
  216. package/src/hooks/UseCalendar.tsx +178 -0
  217. package/src/hooks/UseDashboardItems.tsx +118 -0
  218. package/src/hooks/UseDataExport.tsx +125 -0
  219. package/src/hooks/UseDataOutput.tsx +109 -0
  220. package/src/hooks/UseFilter.tsx +67 -0
  221. package/src/hooks/UseFilterSet.tsx +24 -0
  222. package/src/hooks/UseForm.tsx +161 -0
  223. package/src/hooks/UseGenerator.tsx +92 -0
  224. package/src/hooks/UseImportSession.tsx +139 -0
  225. package/src/hooks/UseInstance.tsx +137 -0
  226. package/src/hooks/UseInstanceName.tsx +14 -0
  227. package/src/hooks/UseModal.tsx +38 -0
  228. package/src/hooks/UsePlaceholder.tsx +66 -0
  229. package/src/hooks/UsePluginPanels.tsx +123 -0
  230. package/src/hooks/UsePluginUIFeature.tsx +95 -0
  231. package/src/hooks/UsePlugins.tsx +45 -0
  232. package/src/hooks/UseSelectedRows.tsx +37 -0
  233. package/src/hooks/UseStatusCodes.tsx +50 -0
  234. package/src/hooks/UseTable.tsx +145 -0
  235. package/src/hooks/UseWizard.tsx +133 -0
  236. package/src/locales/ar/messages.d.ts +4 -0
  237. package/src/locales/ar/messages.po +10695 -0
  238. package/src/locales/ar/messages.ts +1 -0
  239. package/src/locales/bg/messages.d.ts +4 -0
  240. package/src/locales/bg/messages.po +10695 -0
  241. package/src/locales/bg/messages.ts +1 -0
  242. package/src/locales/cs/messages.d.ts +4 -0
  243. package/src/locales/cs/messages.po +10695 -0
  244. package/src/locales/cs/messages.ts +1 -0
  245. package/src/locales/da/messages.d.ts +4 -0
  246. package/src/locales/da/messages.po +10695 -0
  247. package/src/locales/da/messages.ts +1 -0
  248. package/src/locales/de/messages.d.ts +4 -0
  249. package/src/locales/de/messages.po +10695 -0
  250. package/src/locales/de/messages.ts +1 -0
  251. package/src/locales/el/messages.d.ts +4 -0
  252. package/src/locales/el/messages.po +10695 -0
  253. package/src/locales/el/messages.ts +1 -0
  254. package/src/locales/en/messages.d.ts +4 -0
  255. package/src/locales/en/messages.po +10689 -0
  256. package/src/locales/en/messages.ts +1 -0
  257. package/src/locales/es/messages.d.ts +4 -0
  258. package/src/locales/es/messages.po +10695 -0
  259. package/src/locales/es/messages.ts +1 -0
  260. package/src/locales/es_MX/messages.d.ts +4 -0
  261. package/src/locales/es_MX/messages.po +10695 -0
  262. package/src/locales/es_MX/messages.ts +1 -0
  263. package/src/locales/et/messages.d.ts +4 -0
  264. package/src/locales/et/messages.po +10695 -0
  265. package/src/locales/et/messages.ts +1 -0
  266. package/src/locales/fa/messages.d.ts +4 -0
  267. package/src/locales/fa/messages.po +10695 -0
  268. package/src/locales/fa/messages.ts +1 -0
  269. package/src/locales/fi/messages.d.ts +4 -0
  270. package/src/locales/fi/messages.po +10695 -0
  271. package/src/locales/fi/messages.ts +1 -0
  272. package/src/locales/fr/messages.d.ts +4 -0
  273. package/src/locales/fr/messages.po +10695 -0
  274. package/src/locales/fr/messages.ts +1 -0
  275. package/src/locales/he/messages.d.ts +4 -0
  276. package/src/locales/he/messages.po +10695 -0
  277. package/src/locales/he/messages.ts +1 -0
  278. package/src/locales/hi/messages.d.ts +4 -0
  279. package/src/locales/hi/messages.po +10695 -0
  280. package/src/locales/hi/messages.ts +1 -0
  281. package/src/locales/hu/messages.d.ts +4 -0
  282. package/src/locales/hu/messages.po +10695 -0
  283. package/src/locales/hu/messages.ts +1 -0
  284. package/src/locales/id/messages.po +10695 -0
  285. package/src/locales/it/messages.d.ts +4 -0
  286. package/src/locales/it/messages.po +10695 -0
  287. package/src/locales/it/messages.ts +1 -0
  288. package/src/locales/ja/messages.d.ts +4 -0
  289. package/src/locales/ja/messages.po +10695 -0
  290. package/src/locales/ja/messages.ts +1 -0
  291. package/src/locales/ko/messages.d.ts +4 -0
  292. package/src/locales/ko/messages.po +10695 -0
  293. package/src/locales/ko/messages.ts +1 -0
  294. package/src/locales/lt/messages.d.ts +4 -0
  295. package/src/locales/lt/messages.po +10695 -0
  296. package/src/locales/lt/messages.ts +1 -0
  297. package/src/locales/lv/messages.d.ts +4 -0
  298. package/src/locales/lv/messages.po +10695 -0
  299. package/src/locales/lv/messages.ts +1 -0
  300. package/src/locales/nl/messages.d.ts +4 -0
  301. package/src/locales/nl/messages.po +10695 -0
  302. package/src/locales/nl/messages.ts +1 -0
  303. package/src/locales/no/messages.d.ts +4 -0
  304. package/src/locales/no/messages.po +10695 -0
  305. package/src/locales/no/messages.ts +1 -0
  306. package/src/locales/pl/messages.d.ts +4 -0
  307. package/src/locales/pl/messages.po +10695 -0
  308. package/src/locales/pl/messages.ts +1 -0
  309. package/src/locales/pseudo-LOCALE/messages.d.ts +4 -0
  310. package/src/locales/pseudo-LOCALE/messages.po +8003 -0
  311. package/src/locales/pseudo-LOCALE/messages.ts +1 -0
  312. package/src/locales/pt/messages.d.ts +4 -0
  313. package/src/locales/pt/messages.po +10696 -0
  314. package/src/locales/pt/messages.ts +1 -0
  315. package/src/locales/pt_BR/messages.d.ts +4 -0
  316. package/src/locales/pt_BR/messages.po +10695 -0
  317. package/src/locales/pt_BR/messages.ts +1 -0
  318. package/src/locales/ro/messages.po +10695 -0
  319. package/src/locales/ro/messages.ts +1 -0
  320. package/src/locales/ru/messages.d.ts +4 -0
  321. package/src/locales/ru/messages.po +10695 -0
  322. package/src/locales/ru/messages.ts +1 -0
  323. package/src/locales/sk/messages.d.ts +4 -0
  324. package/src/locales/sk/messages.po +10695 -0
  325. package/src/locales/sk/messages.ts +1 -0
  326. package/src/locales/sl/messages.d.ts +4 -0
  327. package/src/locales/sl/messages.po +10695 -0
  328. package/src/locales/sl/messages.ts +1 -0
  329. package/src/locales/sr/messages.d.ts +4 -0
  330. package/src/locales/sr/messages.po +10695 -0
  331. package/src/locales/sr/messages.ts +1 -0
  332. package/src/locales/sv/messages.d.ts +4 -0
  333. package/src/locales/sv/messages.po +10695 -0
  334. package/src/locales/sv/messages.ts +1 -0
  335. package/src/locales/th/messages.d.ts +4 -0
  336. package/src/locales/th/messages.po +10695 -0
  337. package/src/locales/th/messages.ts +1 -0
  338. package/src/locales/tr/messages.d.ts +4 -0
  339. package/src/locales/tr/messages.po +10695 -0
  340. package/src/locales/tr/messages.ts +1 -0
  341. package/src/locales/uk/messages.d.ts +3 -0
  342. package/src/locales/uk/messages.po +10695 -0
  343. package/src/locales/uk/messages.ts +1 -0
  344. package/src/locales/vi/messages.d.ts +4 -0
  345. package/src/locales/vi/messages.po +10695 -0
  346. package/src/locales/vi/messages.ts +1 -0
  347. package/src/locales/zh_Hans/messages.d.ts +4 -0
  348. package/src/locales/zh_Hans/messages.po +10695 -0
  349. package/src/locales/zh_Hans/messages.ts +1 -0
  350. package/src/locales/zh_Hant/messages.d.ts +4 -0
  351. package/src/locales/zh_Hant/messages.po +10695 -0
  352. package/src/locales/zh_Hant/messages.ts +1 -0
  353. package/src/main.css.ts +148 -0
  354. package/src/main.tsx +123 -0
  355. package/src/pages/Auth/ChangePassword.tsx +84 -0
  356. package/src/pages/Auth/Layout.tsx +74 -0
  357. package/src/pages/Auth/LoggedIn.tsx +21 -0
  358. package/src/pages/Auth/Login.tsx +133 -0
  359. package/src/pages/Auth/Logout.tsx +16 -0
  360. package/src/pages/Auth/MFA.tsx +36 -0
  361. package/src/pages/Auth/MFASetup.tsx +38 -0
  362. package/src/pages/Auth/Register.tsx +28 -0
  363. package/src/pages/Auth/Reset.tsx +30 -0
  364. package/src/pages/Auth/ResetPassword.tsx +48 -0
  365. package/src/pages/Auth/VerifyEmail.tsx +34 -0
  366. package/src/pages/ErrorPage.tsx +26 -0
  367. package/src/pages/Index/Home.tsx +12 -0
  368. package/src/pages/Index/Scan.tsx +258 -0
  369. package/src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx +162 -0
  370. package/src/pages/Index/Settings/AccountSettings/QrRegistrationForm.tsx +38 -0
  371. package/src/pages/Index/Settings/AccountSettings/SecurityContent.tsx +713 -0
  372. package/src/pages/Index/Settings/AccountSettings/UserPanel.tsx +24 -0
  373. package/src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx +207 -0
  374. package/src/pages/Index/Settings/AccountSettings/useConfirm.tsx +117 -0
  375. package/src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx +111 -0
  376. package/src/pages/Index/Settings/AdminCenter/Index.tsx +251 -0
  377. package/src/pages/Index/Settings/AdminCenter/LabelTemplatePanel.tsx +23 -0
  378. package/src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx +110 -0
  379. package/src/pages/Index/Settings/AdminCenter/PartParameterPanel.tsx +29 -0
  380. package/src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx +84 -0
  381. package/src/pages/Index/Settings/AdminCenter/ReportTemplatePanel.tsx +38 -0
  382. package/src/pages/Index/Settings/AdminCenter/StocktakePanel.tsx +31 -0
  383. package/src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx +73 -0
  384. package/src/pages/Index/Settings/AdminCenter/UnitManagementPanel.tsx +74 -0
  385. package/src/pages/Index/Settings/AdminCenter/UserManagementPanel.tsx +49 -0
  386. package/src/pages/Index/Settings/SystemSettings.tsx +339 -0
  387. package/src/pages/Index/Settings/UserSettings.tsx +143 -0
  388. package/src/pages/Notifications.tsx +134 -0
  389. package/src/pages/build/BuildDetail.tsx +579 -0
  390. package/src/pages/build/BuildIndex.tsx +100 -0
  391. package/src/pages/company/CompanyDetail.tsx +352 -0
  392. package/src/pages/company/CustomerDetail.tsx +13 -0
  393. package/src/pages/company/ManufacturerDetail.tsx +13 -0
  394. package/src/pages/company/ManufacturerPartDetail.tsx +307 -0
  395. package/src/pages/company/SupplierDetail.tsx +13 -0
  396. package/src/pages/company/SupplierPartDetail.tsx +433 -0
  397. package/src/pages/core/CoreIndex.tsx +50 -0
  398. package/src/pages/core/GroupDetail.tsx +97 -0
  399. package/src/pages/core/UserDetail.tsx +193 -0
  400. package/src/pages/part/CategoryDetail.tsx +369 -0
  401. package/src/pages/part/PartAllocationPanel.tsx +40 -0
  402. package/src/pages/part/PartDetail.tsx +1071 -0
  403. package/src/pages/part/PartPricingPanel.tsx +155 -0
  404. package/src/pages/part/PartSchedulingDetail.tsx +315 -0
  405. package/src/pages/part/PartStocktakeDetail.tsx +285 -0
  406. package/src/pages/part/PartSupplierDetail.tsx +31 -0
  407. package/src/pages/part/pricing/BomPricingPanel.tsx +269 -0
  408. package/src/pages/part/pricing/PriceBreakPanel.tsx +182 -0
  409. package/src/pages/part/pricing/PricingOverviewPanel.tsx +338 -0
  410. package/src/pages/part/pricing/PricingPanel.tsx +82 -0
  411. package/src/pages/part/pricing/PurchaseHistoryPanel.tsx +134 -0
  412. package/src/pages/part/pricing/SaleHistoryPanel.tsx +95 -0
  413. package/src/pages/part/pricing/SupplierPricingPanel.tsx +80 -0
  414. package/src/pages/part/pricing/VariantPricingPanel.tsx +112 -0
  415. package/src/pages/purchasing/PurchaseOrderDetail.tsx +547 -0
  416. package/src/pages/purchasing/PurchasingIndex.tsx +131 -0
  417. package/src/pages/sales/ReturnOrderDetail.tsx +529 -0
  418. package/src/pages/sales/SalesIndex.tsx +148 -0
  419. package/src/pages/sales/SalesOrderDetail.tsx +593 -0
  420. package/src/pages/sales/SalesOrderShipmentDetail.tsx +385 -0
  421. package/src/pages/stock/LocationDetail.tsx +413 -0
  422. package/src/pages/stock/StockDetail.tsx +951 -0
  423. package/src/router.tsx +213 -0
  424. package/src/states/ApiState.tsx +85 -0
  425. package/src/states/IconState.tsx +94 -0
  426. package/src/states/LocalState.tsx +181 -0
  427. package/src/states/SettingsState.tsx +206 -0
  428. package/src/states/StatusState.tsx +55 -0
  429. package/src/states/UserState.tsx +202 -0
  430. package/src/states/states.tsx +69 -0
  431. package/src/tables/Column.tsx +29 -0
  432. package/src/tables/ColumnRenderers.tsx +320 -0
  433. package/src/tables/ColumnSelect.tsx +39 -0
  434. package/src/tables/Filter.tsx +297 -0
  435. package/src/tables/FilterSelectDrawer.tsx +358 -0
  436. package/src/tables/InvenTreeTable.tsx +750 -0
  437. package/src/tables/InvenTreeTableHeader.tsx +257 -0
  438. package/src/tables/RowActions.tsx +176 -0
  439. package/src/tables/RowExpansionIcon.tsx +16 -0
  440. package/src/tables/Search.tsx +42 -0
  441. package/src/tables/TableHoverCard.tsx +91 -0
  442. package/src/tables/bom/BomTable.tsx +590 -0
  443. package/src/tables/bom/UsedInTable.tsx +114 -0
  444. package/src/tables/build/BuildAllocatedStockTable.tsx +233 -0
  445. package/src/tables/build/BuildLineTable.tsx +800 -0
  446. package/src/tables/build/BuildOrderTable.tsx +226 -0
  447. package/src/tables/build/BuildOrderTestTable.tsx +265 -0
  448. package/src/tables/build/BuildOutputTable.tsx +599 -0
  449. package/src/tables/company/AddressTable.tsx +211 -0
  450. package/src/tables/company/CompanyTable.tsx +176 -0
  451. package/src/tables/company/ContactTable.tsx +182 -0
  452. package/src/tables/core/UserTable.tsx +88 -0
  453. package/src/tables/general/AttachmentTable.tsx +404 -0
  454. package/src/tables/general/BarcodeScanTable.tsx +124 -0
  455. package/src/tables/general/ExtraLineItemTable.tsx +174 -0
  456. package/src/tables/machine/MachineListTable.tsx +634 -0
  457. package/src/tables/machine/MachineTypeTable.tsx +395 -0
  458. package/src/tables/notifications/NotificationTable.tsx +60 -0
  459. package/src/tables/part/ParametricPartTable.tsx +297 -0
  460. package/src/tables/part/PartBuildAllocationsTable.tsx +128 -0
  461. package/src/tables/part/PartCategoryTable.tsx +208 -0
  462. package/src/tables/part/PartCategoryTemplateTable.tsx +157 -0
  463. package/src/tables/part/PartParameterTable.tsx +226 -0
  464. package/src/tables/part/PartParameterTemplateTable.tsx +168 -0
  465. package/src/tables/part/PartPurchaseOrdersTable.tsx +163 -0
  466. package/src/tables/part/PartSalesAllocationsTable.tsx +130 -0
  467. package/src/tables/part/PartTable.tsx +423 -0
  468. package/src/tables/part/PartTestTemplateTable.tsx +290 -0
  469. package/src/tables/part/PartThumbTable.tsx +230 -0
  470. package/src/tables/part/PartVariantTable.tsx +52 -0
  471. package/src/tables/part/RelatedPartTable.tsx +182 -0
  472. package/src/tables/part/SelectionListTable.tsx +134 -0
  473. package/src/tables/plugin/PluginErrorTable.tsx +58 -0
  474. package/src/tables/plugin/PluginListTable.tsx +440 -0
  475. package/src/tables/purchasing/ManufacturerPartParameterTable.tsx +136 -0
  476. package/src/tables/purchasing/ManufacturerPartTable.tsx +158 -0
  477. package/src/tables/purchasing/PurchaseOrderLineItemTable.tsx +424 -0
  478. package/src/tables/purchasing/PurchaseOrderTable.tsx +193 -0
  479. package/src/tables/purchasing/SupplierPartTable.tsx +281 -0
  480. package/src/tables/purchasing/SupplierPriceBreakTable.tsx +222 -0
  481. package/src/tables/sales/ReturnOrderLineItemTable.tsx +271 -0
  482. package/src/tables/sales/ReturnOrderTable.tsx +201 -0
  483. package/src/tables/sales/SalesOrderAllocationTable.tsx +330 -0
  484. package/src/tables/sales/SalesOrderLineItemTable.tsx +508 -0
  485. package/src/tables/sales/SalesOrderShipmentTable.tsx +225 -0
  486. package/src/tables/sales/SalesOrderTable.tsx +212 -0
  487. package/src/tables/settings/ApiTokenTable.tsx +203 -0
  488. package/src/tables/settings/BarcodeScanHistoryTable.tsx +281 -0
  489. package/src/tables/settings/CustomStateTable.tsx +226 -0
  490. package/src/tables/settings/CustomUnitsTable.tsx +125 -0
  491. package/src/tables/settings/ErrorTable.tsx +170 -0
  492. package/src/tables/settings/ExportSessionTable.tsx +60 -0
  493. package/src/tables/settings/FailedTasksTable.tsx +103 -0
  494. package/src/tables/settings/GroupTable.tsx +240 -0
  495. package/src/tables/settings/ImportSessionTable.tsx +175 -0
  496. package/src/tables/settings/PendingTasksTable.tsx +63 -0
  497. package/src/tables/settings/ProjectCodeTable.tsx +115 -0
  498. package/src/tables/settings/ScheduledTasksTable.tsx +62 -0
  499. package/src/tables/settings/StocktakeReportTable.tsx +111 -0
  500. package/src/tables/settings/TemplateTable.tsx +404 -0
  501. package/src/tables/settings/UserTable.tsx +329 -0
  502. package/src/tables/stock/InstalledItemsTable.tsx +146 -0
  503. package/src/tables/stock/LocationTypesTable.tsx +132 -0
  504. package/src/tables/stock/StockItemTable.tsx +707 -0
  505. package/src/tables/stock/StockItemTestResultTable.tsx +487 -0
  506. package/src/tables/stock/StockLocationTable.tsx +208 -0
  507. package/src/tables/stock/StockTrackingTable.tsx +244 -0
  508. package/src/theme.ts +5 -0
  509. package/src/views/DesktopAppView.tsx +28 -0
  510. package/src/views/MainView.tsx +38 -0
  511. package/src/views/MobileAppView.tsx +43 -0
  512. package/tests/baseFixtures.ts +93 -0
  513. package/tests/defaults.ts +18 -0
  514. package/tests/helpers.ts +122 -0
  515. package/tests/login.ts +97 -0
  516. package/tests/pages/pui_build.spec.ts +373 -0
  517. package/tests/pages/pui_company.spec.ts +40 -0
  518. package/tests/pages/pui_core.spec.ts +26 -0
  519. package/tests/pages/pui_dashboard.spec.ts +64 -0
  520. package/tests/pages/pui_part.spec.ts +413 -0
  521. package/tests/pages/pui_purchase_order.spec.ts +388 -0
  522. package/tests/pages/pui_sales_order.spec.ts +224 -0
  523. package/tests/pages/pui_scan.spec.ts +114 -0
  524. package/tests/pages/pui_stock.spec.ts +259 -0
  525. package/tests/pui_exporting.spec.ts +124 -0
  526. package/tests/pui_forms.spec.ts +131 -0
  527. package/tests/pui_general.spec.ts +60 -0
  528. package/tests/pui_login.spec.ts +74 -0
  529. package/tests/pui_modals.spec.ts +144 -0
  530. package/tests/pui_plugins.spec.ts +216 -0
  531. package/tests/pui_printing.spec.ts +149 -0
  532. package/tests/pui_settings.spec.ts +285 -0
  533. package/tests/pui_tables.spec.ts +65 -0
  534. package/tests/settings/selectionList.spec.ts +103 -0
  535. package/tests/settings.ts +54 -0
  536. package/tsconfig.json +25 -0
  537. package/tsconfig.lib.json +13 -0
  538. package/tsconfig.node.json +11 -0
  539. package/vite-env.d.ts +11 -0
  540. package/vite.config.ts +98 -0
  541. package/vite.lib.config.ts +50 -0
@@ -0,0 +1,285 @@
1
+ import { expect, test } from './baseFixtures.js';
2
+ import { apiUrl } from './defaults.js';
3
+ import { getRowFromCell, loadTab, navigate } from './helpers.js';
4
+ import { doCachedLogin } from './login.js';
5
+ import { setSettingState } from './settings.js';
6
+
7
+ /**
8
+ * Adjust language and color settings
9
+ *
10
+ * TODO: Reimplement this - without logging out a cached user
11
+ */
12
+ // test('Settings - Language / Color', async ({ browser }) => {
13
+ // const page = await doCachedLogin(browser);
14
+
15
+ // await page.getByRole('button', { name: 'Ally Access' }).click();
16
+ // await page.getByRole('menuitem', { name: 'Logout' }).click();
17
+ // await page.getByRole('button', { name: 'Send me an email' }).click();
18
+ // await page.getByLabel('Language toggle').click();
19
+ // await page.getByLabel('Select language').first().click();
20
+ // await page.getByRole('option', { name: 'German' }).click();
21
+ // await page.waitForTimeout(200);
22
+
23
+ // await page.getByRole('button', { name: 'Benutzername und Passwort' }).click();
24
+ // await page.getByPlaceholder('Ihr Benutzername').click();
25
+ // await page.getByPlaceholder('Ihr Benutzername').fill('admin');
26
+ // await page.getByPlaceholder('Ihr Benutzername').press('Tab');
27
+ // await page.getByPlaceholder('Dein Passwort').fill('inventree');
28
+ // await page.getByRole('button', { name: 'Anmelden' }).click();
29
+ // await page.waitForTimeout(200);
30
+
31
+ // await page.getByRole('tab', { name: 'Dashboard' }).click();
32
+ // await page.waitForURL('**/web/home');
33
+ // });
34
+
35
+ test('Settings - User theme', async ({ browser }) => {
36
+ const page = await doCachedLogin(browser, {
37
+ username: 'allaccess',
38
+ password: 'nolimits'
39
+ });
40
+
41
+ await page.waitForLoadState('networkidle');
42
+
43
+ await page.getByRole('button', { name: 'Ally Access' }).click();
44
+ await page.getByRole('menuitem', { name: 'Account settings' }).click();
45
+
46
+ // loader
47
+ await page.getByRole('textbox', { name: 'Loader Type Selector' }).click();
48
+ await page.getByRole('option', { name: 'Oval' }).click();
49
+ await page.getByRole('textbox', { name: 'Loader Type Selector' }).click();
50
+ await page.getByRole('option', { name: 'Bars' }).click();
51
+
52
+ // dark / light mode
53
+ await page
54
+ .getByRole('row', { name: 'Color Mode' })
55
+ .getByRole('button')
56
+ .click();
57
+ await page
58
+ .getByRole('row', { name: 'Color Mode' })
59
+ .getByRole('button')
60
+ .click();
61
+
62
+ // colors
63
+ await testColorPicker(page, 'Color Picker White');
64
+ await testColorPicker(page, 'Color Picker Black');
65
+
66
+ await page.waitForTimeout(500);
67
+
68
+ await page.getByLabel('Reset Black Color').click();
69
+ await page.getByLabel('Reset White Color').click();
70
+
71
+ // radius
72
+ await page
73
+ .locator('div')
74
+ .filter({ hasText: /^xssmmdlgxl$/ })
75
+ .nth(2)
76
+ .click();
77
+
78
+ // primary
79
+ await page.getByLabel('#fab005').click();
80
+ await page.getByLabel('#228be6').click();
81
+ });
82
+
83
+ test('Settings - Admin', async ({ browser }) => {
84
+ // Note here we login with admin access
85
+ const page = await doCachedLogin(browser, {
86
+ username: 'admin',
87
+ password: 'inventree'
88
+ });
89
+
90
+ // User settings
91
+ await page.getByRole('button', { name: 'admin' }).click();
92
+ await page.getByRole('menuitem', { name: 'Account settings' }).click();
93
+ await loadTab(page, 'Security');
94
+
95
+ await loadTab(page, 'Display Options');
96
+ await page.getByText('Date Format').waitFor();
97
+ await loadTab(page, 'Search');
98
+ await page.getByText('Regex Search').waitFor();
99
+ await loadTab(page, 'Notifications');
100
+ await loadTab(page, 'Reporting');
101
+ await page.getByText('Inline report display').waitFor();
102
+
103
+ // System Settings
104
+ await page.locator('label').filter({ hasText: 'System Settings' }).click();
105
+ await page.getByText('Base URL', { exact: true }).waitFor();
106
+ await loadTab(page, 'Authentication');
107
+ await loadTab(page, 'Barcodes');
108
+ await loadTab(page, 'Notifications');
109
+ await loadTab(page, 'Pricing');
110
+ await loadTab(page, 'Labels');
111
+ await loadTab(page, 'Reporting');
112
+
113
+ await loadTab(page, 'Build Orders');
114
+ await loadTab(page, 'Purchase Orders');
115
+ await loadTab(page, 'Sales Orders');
116
+ await loadTab(page, 'Return Orders');
117
+
118
+ // Admin Center
119
+ await page.getByRole('button', { name: 'admin' }).click();
120
+ await page.getByRole('menuitem', { name: 'Admin Center' }).click();
121
+ await loadTab(page, 'Background Tasks');
122
+ await loadTab(page, 'Error Reports');
123
+ await loadTab(page, 'Currencies');
124
+ await loadTab(page, 'Project Codes');
125
+ await loadTab(page, 'Custom Units');
126
+ await loadTab(page, 'Part Parameters');
127
+ await loadTab(page, 'Category Parameters');
128
+ await loadTab(page, 'Label Templates');
129
+ await loadTab(page, 'Report Templates');
130
+ await loadTab(page, 'Plugins');
131
+
132
+ // Adjust some "location type" items
133
+ await loadTab(page, 'Location Types');
134
+
135
+ // Edit first item ('Room')
136
+ const roomCell = await page.getByRole('cell', { name: 'Room', exact: true });
137
+ const roomRow = await getRowFromCell(roomCell);
138
+
139
+ await roomRow.getByLabel(/row-action-menu-/i).click();
140
+
141
+ await page.getByRole('menuitem', { name: 'Edit' }).click();
142
+ await expect(page.getByLabel('text-field-name')).toHaveValue('Room');
143
+
144
+ // Toggle the "description" field
145
+ const oldDescription = await page
146
+ .getByLabel('text-field-description')
147
+ .inputValue();
148
+
149
+ const newDescription = `${oldDescription} (edited)`;
150
+
151
+ await page.getByLabel('text-field-description').fill(newDescription);
152
+ await page.waitForTimeout(500);
153
+ await page.getByRole('button', { name: 'Submit' }).click();
154
+
155
+ // Edit second item - 'Box (Large)'
156
+ const boxCell = await page.getByRole('cell', {
157
+ name: 'Box (Large)',
158
+ exact: true
159
+ });
160
+ const boxRow = await getRowFromCell(boxCell);
161
+
162
+ await boxRow.getByLabel(/row-action-menu-/i).click();
163
+
164
+ await page.getByRole('menuitem', { name: 'Edit' }).click();
165
+ await expect(page.getByLabel('text-field-name')).toHaveValue('Box (Large)');
166
+ await expect(page.getByLabel('text-field-description')).toHaveValue(
167
+ 'Large cardboard box'
168
+ );
169
+ await page.getByRole('button', { name: 'Cancel' }).click();
170
+
171
+ // Edit first item again (revert values)
172
+ await roomRow.getByLabel(/row-action-menu-/i).click();
173
+ await page.getByRole('menuitem', { name: 'Edit' }).click();
174
+ await page.getByLabel('text-field-name').fill('Room');
175
+ await page.waitForTimeout(500);
176
+ await page
177
+ .getByLabel('text-field-description')
178
+ .fill(newDescription.replaceAll(' (edited)', ''));
179
+ await page.waitForTimeout(500);
180
+ await page.getByRole('button', { name: 'Submit' }).click();
181
+ });
182
+
183
+ test('Settings - Admin - Barcode History', async ({ browser, request }) => {
184
+ // Login with admin credentials
185
+ const page = await doCachedLogin(browser, {
186
+ username: 'admin',
187
+ password: 'inventree'
188
+ });
189
+
190
+ // Ensure that the "save scans" setting is enabled
191
+ await setSettingState({
192
+ request: request,
193
+ setting: 'BARCODE_STORE_RESULTS',
194
+ value: true
195
+ });
196
+
197
+ // Scan some barcodes (via API calls)
198
+ const barcodes = ['ABC1234', 'XYZ5678', 'QRS9012'];
199
+
200
+ barcodes.forEach(async (barcode) => {
201
+ await request.post(`${apiUrl}/barcode/`, {
202
+ data: {
203
+ barcode: barcode
204
+ },
205
+ headers: {
206
+ Authorization: `Basic ${btoa('admin:inventree')}`
207
+ }
208
+ });
209
+ });
210
+
211
+ await page.getByRole('button', { name: 'admin' }).click();
212
+ await page.getByRole('menuitem', { name: 'Admin Center' }).click();
213
+ await loadTab(page, 'Barcode Scans');
214
+
215
+ await page.waitForTimeout(500);
216
+
217
+ // Barcode history is displayed in table
218
+ barcodes.forEach(async (barcode) => {
219
+ await page.getByText(barcode).first().waitFor();
220
+ });
221
+ });
222
+
223
+ test('Settings - Admin - Unauthorized', async ({ browser }) => {
224
+ // Try to access "admin" page with a non-staff user
225
+ const page = await doCachedLogin(browser, {
226
+ username: 'allaccess',
227
+ password: 'nolimits',
228
+ url: 'settings/admin/'
229
+ });
230
+
231
+ await page.waitForURL('**/settings/admin/**');
232
+
233
+ // Should get a permission denied message
234
+ await page.getByText('Permission Denied').waitFor();
235
+ await page
236
+ .getByRole('button', { name: 'Return to the index page' })
237
+ .waitFor();
238
+
239
+ // Try to access user settings page (should be accessible)
240
+ await navigate(page, 'settings/user/');
241
+ await page.waitForURL('**/settings/user/**');
242
+
243
+ await loadTab(page, 'Display Options');
244
+ await loadTab(page, 'Account');
245
+
246
+ // Try to access global settings page
247
+ await navigate(page, 'settings/system/');
248
+ await page.waitForURL('**/settings/system/**');
249
+
250
+ await page.getByText('Permission Denied').waitFor();
251
+ await page
252
+ .getByRole('button', { name: 'Return to the index page' })
253
+ .waitFor();
254
+ });
255
+
256
+ // Test for user auth configuration
257
+ test('Settings - Auth - Email', async ({ browser }) => {
258
+ const page = await doCachedLogin(browser, {
259
+ username: 'allaccess',
260
+ password: 'nolimits',
261
+ url: 'settings/user/'
262
+ });
263
+
264
+ await loadTab(page, 'Security');
265
+
266
+ await page.getByText('Currently no email addresses are registered').waitFor();
267
+ await page.getByLabel('email-address-input').fill('test-email@domain.org');
268
+ await page.getByLabel('email-address-submit').click();
269
+
270
+ await page.getByText('Unverified', { exact: true }).waitFor();
271
+ await page.getByLabel('test-email@domain.').click();
272
+ await page.getByRole('button', { name: 'Make Primary' }).click();
273
+ await page.getByText('Primary', { exact: true }).waitFor();
274
+ await page.getByRole('button', { name: 'Remove' }).click();
275
+
276
+ await page.getByText('Currently no email addresses are registered').waitFor();
277
+ });
278
+
279
+ async function testColorPicker(page, ref: string) {
280
+ const element = page.getByLabel(ref);
281
+ await element.click();
282
+ const box = (await element.boundingBox())!;
283
+ await page.mouse.click(box.x + box.width / 2, box.y + box.height + 25);
284
+ await page.getByText('Color Mode').click();
285
+ }
@@ -0,0 +1,65 @@
1
+ import { test } from './baseFixtures.js';
2
+ import {
3
+ clearTableFilters,
4
+ navigate,
5
+ setTableChoiceFilter
6
+ } from './helpers.js';
7
+ import { doCachedLogin } from './login.js';
8
+
9
+ test('Tables - Filters', async ({ browser }) => {
10
+ // Head to the "build order list" page
11
+ const page = await doCachedLogin(browser, { url: 'manufacturing/index/' });
12
+
13
+ await clearTableFilters(page);
14
+
15
+ await setTableChoiceFilter(page, 'Status', 'Complete');
16
+ await setTableChoiceFilter(page, 'Responsible', 'allaccess');
17
+ await setTableChoiceFilter(page, 'Project Code', 'PRJ-NIM');
18
+
19
+ await clearTableFilters(page);
20
+
21
+ // Head to the "part list" page
22
+ await navigate(page, 'part/category/index/parts/');
23
+
24
+ await setTableChoiceFilter(page, 'Assembly', 'Yes');
25
+
26
+ await clearTableFilters(page);
27
+
28
+ // Head to the "purchase order list" page
29
+ await navigate(page, 'purchasing/index/purchaseorders/');
30
+
31
+ await clearTableFilters(page);
32
+
33
+ await setTableChoiceFilter(page, 'Status', 'Complete');
34
+ await setTableChoiceFilter(page, 'Responsible', 'readers');
35
+ await setTableChoiceFilter(page, 'Assigned to me', 'No');
36
+ await setTableChoiceFilter(page, 'Project Code', 'PRO-ZEN');
37
+ await setTableChoiceFilter(page, 'Has Start Date', 'Yes');
38
+
39
+ await clearTableFilters(page);
40
+ });
41
+
42
+ test('Tables - Columns', async ({ browser }) => {
43
+ // Go to the "stock list" page
44
+ const page = await doCachedLogin(browser, {
45
+ url: 'stock/location/index/stock-items'
46
+ });
47
+
48
+ // Open column selector
49
+ await page.getByLabel('table-select-columns').click();
50
+
51
+ // De-select some items
52
+ await page.getByRole('menuitem', { name: 'Description' }).click();
53
+ await page.getByRole('menuitem', { name: 'Stocktake' }).click();
54
+ await page.keyboard.press('Escape');
55
+
56
+ await navigate(page, '/sales/index/salesorders');
57
+
58
+ // Open column selector
59
+ await page.getByLabel('table-select-columns').click();
60
+
61
+ await page.getByRole('menuitem', { name: 'Start Date' }).click();
62
+ await page.getByRole('menuitem', { name: 'Target Date' }).click();
63
+ await page.getByRole('menuitem', { name: 'Reference', exact: true }).click();
64
+ await page.getByRole('menuitem', { name: 'Project Code' }).click();
65
+ });
@@ -0,0 +1,103 @@
1
+ import { test } from '../baseFixtures';
2
+ import { navigate } from '../helpers';
3
+ import { doCachedLogin } from '../login';
4
+
5
+ test('PUI - Admin - Parameter', async ({ browser }) => {
6
+ const page = await doCachedLogin(browser, {
7
+ username: 'admin',
8
+ password: 'inventree'
9
+ });
10
+ await page.getByRole('button', { name: 'admin' }).click();
11
+ await page.getByRole('menuitem', { name: 'Admin Center' }).click();
12
+ await page.getByRole('tab', { name: 'Part Parameters' }).click();
13
+
14
+ await page.getByRole('button', { name: 'Selection Lists' }).click();
15
+ await page.waitForLoadState('networkidle');
16
+
17
+ // clean old data if exists
18
+ await page
19
+ .getByRole('cell', { name: 'some list' })
20
+ .waitFor({ timeout: 200 })
21
+ .then(async (cell) => {
22
+ await page
23
+ .getByRole('cell', { name: 'some list' })
24
+ .locator('..')
25
+ .getByLabel('row-action-menu-')
26
+ .click();
27
+ await page.getByRole('menuitem', { name: 'Delete' }).click();
28
+ await page.getByRole('button', { name: 'Delete' }).click();
29
+ })
30
+ .catch(() => {});
31
+
32
+ // clean old data if exists
33
+ await page.getByRole('button', { name: 'Part Parameter Template' }).click();
34
+ await page.waitForLoadState('networkidle');
35
+ await page
36
+ .getByRole('cell', { name: 'my custom parameter' })
37
+ .waitFor({ timeout: 200 })
38
+ .then(async (cell) => {
39
+ await page
40
+ .getByRole('cell', { name: 'my custom parameter' })
41
+ .locator('..')
42
+ .getByLabel('row-action-menu-')
43
+ .click();
44
+ await page.getByRole('menuitem', { name: 'Delete' }).click();
45
+ await page.getByRole('button', { name: 'Delete' }).click();
46
+ })
47
+ .catch(() => {});
48
+
49
+ // Add selection list
50
+ await page.getByRole('button', { name: 'Selection Lists' }).click();
51
+ await page.waitForLoadState('networkidle');
52
+ await page.getByLabel('action-button-add-selection-').waitFor();
53
+ await page.getByLabel('action-button-add-selection-').click();
54
+ await page.getByLabel('text-field-name').fill('some list');
55
+ await page.getByLabel('text-field-description').fill('Listdescription');
56
+ await page.getByRole('button', { name: 'Submit' }).click();
57
+ await page.getByRole('cell', { name: 'some list' }).waitFor();
58
+ await page.waitForTimeout(200);
59
+
60
+ // Add parameter
61
+ await page.waitForLoadState('networkidle');
62
+ await page.getByRole('button', { name: 'Part Parameter Template' }).click();
63
+ await page.getByLabel('action-button-add-parameter').waitFor();
64
+ await page.getByLabel('action-button-add-parameter').click();
65
+ await page.getByLabel('text-field-name').fill('my custom parameter');
66
+ await page.getByLabel('text-field-description').fill('description');
67
+ await page
68
+ .locator('div')
69
+ .filter({ hasText: /^Search\.\.\.$/ })
70
+ .nth(2)
71
+ .click();
72
+ await page
73
+ .getByRole('option', { name: 'some list' })
74
+ .locator('div')
75
+ .first()
76
+ .click();
77
+ await page.getByRole('button', { name: 'Submit' }).click();
78
+ await page.getByRole('cell', { name: 'my custom parameter' }).click();
79
+
80
+ // Fill parameter
81
+ await navigate(page, 'part/104/parameters/');
82
+ await page.getByLabel('Parameters').getByText('Parameters').waitFor();
83
+ await page.waitForLoadState('networkidle');
84
+ await page.getByLabel('action-button-add-parameter').waitFor();
85
+ await page.getByLabel('action-button-add-parameter').click();
86
+ await page.waitForTimeout(200);
87
+ await page.getByText('New Part Parameter').waitFor();
88
+ await page
89
+ .getByText('Template *Parameter')
90
+ .locator('div')
91
+ .filter({ hasText: /^Search\.\.\.$/ })
92
+ .nth(2)
93
+ .click();
94
+ await page
95
+ .getByText('Template *Parameter')
96
+ .locator('div')
97
+ .filter({ hasText: /^Search\.\.\.$/ })
98
+ .locator('input')
99
+ .fill('my custom parameter');
100
+ await page.getByRole('option', { name: 'my custom parameter' }).click();
101
+ await page.getByLabel('choice-field-data').fill('2');
102
+ await page.getByRole('button', { name: 'Submit' }).click();
103
+ });
@@ -0,0 +1,54 @@
1
+ import { expect } from 'playwright/test';
2
+
3
+ import { apiUrl } from './defaults';
4
+
5
+ /*
6
+ * Set the value of a global setting in the database
7
+ */
8
+ export const setSettingState = async ({
9
+ request,
10
+ setting,
11
+ value
12
+ }: {
13
+ request: any;
14
+ setting: string;
15
+ value: any;
16
+ }) => {
17
+ const url = `${apiUrl}/settings/global/${setting}/`;
18
+
19
+ const response = await request.patch(url, {
20
+ data: {
21
+ value: value
22
+ },
23
+ headers: {
24
+ // Basic username: password authorization
25
+ Authorization: `Basic ${btoa('admin:inventree')}`
26
+ }
27
+ });
28
+
29
+ expect(await response.status()).toBe(200);
30
+ };
31
+
32
+ export const setPluginState = async ({
33
+ request,
34
+ plugin,
35
+ state
36
+ }: {
37
+ request: any;
38
+ plugin: string;
39
+ state: boolean;
40
+ }) => {
41
+ const url = `${apiUrl}/plugins/${plugin}/activate/`;
42
+
43
+ const response = await request.patch(url, {
44
+ data: {
45
+ active: state
46
+ },
47
+ headers: {
48
+ // Basic username: password authorization
49
+ Authorization: `Basic ${btoa('admin:inventree')}`
50
+ }
51
+ });
52
+
53
+ expect(await response.status()).toBe(200);
54
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
6
+ "allowJs": true,
7
+ "skipLibCheck": true,
8
+ "esModuleInterop": false,
9
+ "allowSyntheticDefaultImports": true,
10
+ "strict": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "module": "ESNext",
13
+ "moduleResolution": "Node",
14
+ "resolveJsonModule": true,
15
+ "isolatedModules": true,
16
+ "noEmit": true,
17
+ "jsx": "react-jsx",
18
+ "paths": {
19
+ "@lib/*": ["./lib/*"]
20
+ }
21
+ },
22
+ "include": ["src", "lib", "vite-env.d.ts"],
23
+ "exclude": ["node_nodules", "dist"],
24
+ "references": [{ "path": "./tsconfig.node.json" }]
25
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "moduleResolution": "bundler",
5
+ "declaration": true,
6
+ "declarationDir": "./dist",
7
+ "rootDir": "./lib",
8
+ "outDir": "./dist",
9
+ "paths": {},
10
+ },
11
+ "include": ["lib"],
12
+ "exclude": ["node_modules", "src"]
13
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "module": "ESNext",
5
+ "target": "ES2023",
6
+ "lib": ["ES2023"],
7
+ "moduleResolution": "Node",
8
+ "allowSyntheticDefaultImports": true
9
+ },
10
+ "include": ["vite.config.ts"]
11
+ }
package/vite-env.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ interface ImportMetaEnv {
4
+ readonly VITE_DEMO: string;
5
+ }
6
+
7
+ interface ImportMeta {
8
+ readonly env: ImportMetaEnv;
9
+ }
10
+
11
+ declare const __INVENTREE_LIB_VERSION__: string;
package/vite.config.ts ADDED
@@ -0,0 +1,98 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { platform, release } from 'node:os';
3
+ import { codecovVitePlugin } from '@codecov/vite-plugin';
4
+ import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
5
+ import react from '@vitejs/plugin-react';
6
+ import license from 'rollup-plugin-license';
7
+ import { defineConfig, splitVendorChunkPlugin } from 'vite';
8
+ import istanbul from 'vite-plugin-istanbul';
9
+
10
+ const packageJson = JSON.parse(readFileSync('./package.json', 'utf-8'));
11
+
12
+ // Detect if the current environment is WSL
13
+ // Required for enabling file system polling
14
+ const IS_IN_WSL = platform().includes('WSL') || release().includes('WSL');
15
+
16
+ // Detect if code coverage is enabled (runs in GitHub CI)
17
+ const IS_COVERAGE = !!process.env.VITE_COVERAGE_BUILD;
18
+
19
+ if (IS_IN_WSL) {
20
+ console.log('WSL detected: using polling for file system events');
21
+ }
22
+
23
+ // Output directory for the built files
24
+ const OUTPUT_DIR = '../../src/backend/InvenTree/web/static/web';
25
+
26
+ // https://vitejs.dev/config/
27
+ export default defineConfig(({ command, mode }) => {
28
+ return {
29
+ plugins: [
30
+ react({
31
+ babel: {
32
+ plugins: ['macros']
33
+ }
34
+ }),
35
+ vanillaExtractPlugin(),
36
+ splitVendorChunkPlugin(),
37
+ license({
38
+ sourcemap: true,
39
+ thirdParty: {
40
+ includePrivate: true,
41
+ multipleVersions: true,
42
+ output: {
43
+ file: `${OUTPUT_DIR}/.vite/dependencies.json`,
44
+ template(dependencies) {
45
+ return JSON.stringify(dependencies);
46
+ }
47
+ }
48
+ }
49
+ }),
50
+ istanbul({
51
+ include: ['src/*', 'lib/*'],
52
+ exclude: ['node_modules', 'test/'],
53
+ extension: ['.js', '.ts', '.tsx'],
54
+ requireEnv: true
55
+ }),
56
+ codecovVitePlugin({
57
+ enableBundleAnalysis: process.env.CODECOV_TOKEN !== undefined,
58
+ bundleName: 'pui_v1',
59
+ uploadToken: process.env.CODECOV_TOKEN
60
+ })
61
+ ],
62
+ // When building, set the base path to an empty string
63
+ // This is required to ensure that the static path prefix is observed
64
+ base: command == 'build' ? '' : undefined,
65
+ build: {
66
+ manifest: true,
67
+ outDir: OUTPUT_DIR,
68
+ sourcemap: true
69
+ },
70
+ resolve: {
71
+ alias: {
72
+ '@lib': '/lib'
73
+ }
74
+ },
75
+ server: {
76
+ proxy: {
77
+ '/media': {
78
+ target: 'http://localhost:8000',
79
+ changeOrigin: true,
80
+ secure: true
81
+ },
82
+ '/static': {
83
+ target: 'http://localhost:8000',
84
+ changeOrigin: true,
85
+ secure: true
86
+ }
87
+ },
88
+ watch: {
89
+ // Use polling only for WSL as the file system doesn't trigger notifications for Linux apps
90
+ // Ref: https://github.com/vitejs/vite/issues/1153#issuecomment-785467271
91
+ usePolling: IS_IN_WSL
92
+ }
93
+ },
94
+ define: {
95
+ __INVENTREE_LIB_VERSION__: JSON.stringify(packageJson.version)
96
+ }
97
+ };
98
+ });