@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,373 @@
1
+ import { expect } from '@playwright/test';
2
+ import { test } from '../baseFixtures.ts';
3
+ import {
4
+ activateCalendarView,
5
+ clearTableFilters,
6
+ getRowFromCell,
7
+ loadTab,
8
+ navigate,
9
+ setTableChoiceFilter
10
+ } from '../helpers.ts';
11
+ import { doCachedLogin } from '../login.ts';
12
+
13
+ test('Build Order - Basic Tests', async ({ browser }) => {
14
+ const page = await doCachedLogin(browser);
15
+
16
+ // Navigate to the correct build order
17
+ await page.getByRole('tab', { name: 'Manufacturing' }).click();
18
+ await page.waitForURL('**/manufacturing/index/**');
19
+
20
+ await loadTab(page, 'Build Orders');
21
+
22
+ await clearTableFilters(page);
23
+
24
+ // We have now loaded the "Build Order" table. Check for some expected texts
25
+ await page.getByText('On Hold').first().waitFor();
26
+ await page.getByText('Pending').first().waitFor();
27
+
28
+ // Load a particular build order
29
+ await page.getByRole('cell', { name: 'BO0017' }).click();
30
+
31
+ // This build order should be "on hold"
32
+ await page.getByText('On Hold').first().waitFor();
33
+
34
+ // Edit the build order (via keyboard shortcut)
35
+ await page.keyboard.press('Control+E');
36
+ await page.getByLabel('text-field-title').waitFor();
37
+ await page.getByLabel('related-field-project_code').waitFor();
38
+ await page.getByRole('button', { name: 'Cancel' }).click();
39
+
40
+ await page.getByRole('button', { name: 'Issue Order' }).click();
41
+ await page.getByRole('button', { name: 'Cancel' }).click();
42
+
43
+ // Back to the build list
44
+ await page.getByLabel('breadcrumb-0-manufacturing').click();
45
+
46
+ // Load a different build order
47
+ await page.getByRole('cell', { name: 'BO0011' }).click();
48
+
49
+ // This build order should be "in production"
50
+ await page.getByText('Production').first().waitFor();
51
+ await page.getByRole('button', { name: 'Complete Order' }).click();
52
+ await page.getByText('Accept Unallocated').waitFor();
53
+ await page.getByRole('button', { name: 'Cancel' }).click();
54
+
55
+ // Check for other expected actions
56
+ await page.getByLabel('action-menu-build-order-').click();
57
+ await page.getByLabel('action-menu-build-order-actions-edit').waitFor();
58
+ await page.getByLabel('action-menu-build-order-actions-duplicate').waitFor();
59
+ await page.getByLabel('action-menu-build-order-actions-hold').waitFor();
60
+ await page.getByLabel('action-menu-build-order-actions-cancel').click();
61
+ await page.getByText('Remove Incomplete Outputs').waitFor();
62
+ await page.getByRole('button', { name: 'Cancel' }).click();
63
+
64
+ // Click on some tabs
65
+ await loadTab(page, 'Attachments');
66
+ await loadTab(page, 'Notes');
67
+ await loadTab(page, 'Incomplete Outputs');
68
+ await loadTab(page, 'Line Items');
69
+ await loadTab(page, 'Allocated Stock');
70
+
71
+ // Check for expected text in the table
72
+ await page.getByText('R_10R_0402_1%').waitFor();
73
+ await page
74
+ .getByRole('cell', { name: 'R38, R39, R40, R41, R42, R43' })
75
+ .waitFor();
76
+
77
+ // Check "test results"
78
+ await loadTab(page, 'Test Results');
79
+ await page.getByText('Quantity: 25').waitFor();
80
+ await page.getByText('Continuity Checks').waitFor();
81
+ await page
82
+ .getByRole('row', { name: 'Quantity: 16 No location set' })
83
+ .getByRole('button')
84
+ .hover();
85
+ await page.getByText('Add Test Result').waitFor();
86
+
87
+ // Click through to the "parent" build
88
+ await loadTab(page, 'Build Details');
89
+ await page.getByRole('link', { name: 'BO0010' }).click();
90
+ await page
91
+ .getByLabel('Build Details')
92
+ .getByText('Making a high level assembly')
93
+ .waitFor();
94
+ });
95
+
96
+ test('Build Order - Calendar', async ({ browser }) => {
97
+ const page = await doCachedLogin(browser);
98
+
99
+ await navigate(page, 'manufacturing/index/buildorders');
100
+ await activateCalendarView(page);
101
+
102
+ // Export calendar data
103
+ await page.getByLabel('calendar-export-data').click();
104
+ await page.getByRole('button', { name: 'Export', exact: true }).click();
105
+ await page.getByText('Process completed successfully').waitFor();
106
+
107
+ // Check "part category" filter
108
+ await page.getByLabel('calendar-select-filters').click();
109
+ await page.getByRole('button', { name: 'Add Filter' }).click();
110
+ await page.getByPlaceholder('Select filter').fill('category');
111
+ await page.getByRole('option', { name: 'Category', exact: true }).click();
112
+ await page.getByLabel('related-field-filter-category').click();
113
+ await page.getByText('Part category, level 1').waitFor();
114
+
115
+ // Required because we downloaded a file
116
+ await page.context().close();
117
+ });
118
+
119
+ test('Build Order - Edit', async ({ browser }) => {
120
+ const page = await doCachedLogin(browser);
121
+
122
+ await navigate(page, 'manufacturing/build-order/22/');
123
+
124
+ // Check for expected text items
125
+ await page.getByText('Building for sales order').first().waitFor();
126
+ await page.getByText('2024-08-08').waitFor(); // Created date
127
+ await page.getByText('2025-01-01').waitFor(); // Start date
128
+ await page.getByText('2025-01-22').waitFor(); // Target date
129
+
130
+ await page.keyboard.press('Control+E');
131
+
132
+ // Edit start date
133
+ await page.getByLabel('date-field-start_date').fill('2026-09-09');
134
+
135
+ // Submit the form
136
+ await page.getByRole('button', { name: 'Submit' }).click();
137
+
138
+ // Expect error
139
+ await page.getByText('Errors exist for one or more form fields').waitFor();
140
+ await page.getByText('Target date must be after start date').waitFor();
141
+
142
+ // Cancel the form
143
+ await page.getByRole('button', { name: 'Cancel' }).click();
144
+ });
145
+
146
+ test('Build Order - Build Outputs', async ({ browser }) => {
147
+ const page = await doCachedLogin(browser);
148
+
149
+ await navigate(page, 'manufacturing/index/');
150
+ await loadTab(page, 'Build Orders');
151
+
152
+ await clearTableFilters(page);
153
+
154
+ // We have now loaded the "Build Order" table. Check for some expected texts
155
+ await page.getByText('On Hold').first().waitFor();
156
+ await page.getByText('Pending').first().waitFor();
157
+
158
+ await page.getByRole('cell', { name: 'BO0011' }).click();
159
+ await loadTab(page, 'Incomplete Outputs');
160
+
161
+ // Create a new build output
162
+ await page.getByLabel('action-button-add-build-output').click();
163
+ await page.getByLabel('number-field-quantity').fill('5');
164
+
165
+ const placeholder = await page
166
+ .getByLabel('text-field-serial_numbers')
167
+ .getAttribute('placeholder');
168
+
169
+ let sn = 1;
170
+
171
+ if (!!placeholder && placeholder.includes('Next serial number')) {
172
+ sn = Number.parseInt(placeholder.split(':')[1].trim());
173
+ }
174
+
175
+ // Generate some new serial numbers
176
+ await page.getByLabel('text-field-serial_numbers').fill(`${sn}, ${sn + 1}`);
177
+
178
+ await page.getByLabel('text-field-batch_code').fill('BATCH12345');
179
+ await page.getByLabel('related-field-location').click();
180
+ await page.getByText('Reel Storage').click();
181
+ await page.getByRole('button', { name: 'Submit' }).click();
182
+
183
+ // Should be an error as the number of serial numbers doesn't match the quantity
184
+ await page.getByText('Errors exist for one or more').waitFor();
185
+ await page.getByText('Number of unique serial').waitFor();
186
+
187
+ // Fix the quantity
188
+ await page.getByLabel('number-field-quantity').fill('2');
189
+ await page.waitForTimeout(250);
190
+ await page.getByRole('button', { name: 'Submit' }).click();
191
+
192
+ // Check that new serial numbers have been created
193
+ await page
194
+ .getByRole('cell', { name: `# ${sn}` })
195
+ .first()
196
+ .waitFor();
197
+ await page
198
+ .getByRole('cell', { name: `# ${sn + 1}` })
199
+ .first()
200
+ .waitFor();
201
+
202
+ // Cancel one of the newly created outputs
203
+ const cell = await page.getByRole('cell', { name: `# ${sn}` });
204
+ const row = await getRowFromCell(cell);
205
+ await row.getByLabel(/row-action-menu-/i).click();
206
+ await page.getByRole('menuitem', { name: 'Cancel' }).click();
207
+ await page.getByRole('button', { name: 'Submit' }).click();
208
+ await page.getByText('Build outputs have been cancelled').waitFor();
209
+
210
+ // Complete the other output
211
+ const cell2 = await page.getByRole('cell', { name: `# ${sn + 1}` });
212
+ const row2 = await getRowFromCell(cell2);
213
+ await row2.getByLabel(/row-action-menu-/i).click();
214
+ await page.getByRole('menuitem', { name: 'Complete' }).click();
215
+ await page.getByLabel('related-field-location').click();
216
+ await page.getByText('Mechanical Lab').click();
217
+ await page.waitForTimeout(250);
218
+ await page.getByRole('button', { name: 'Submit' }).click();
219
+ await page.getByText('Build outputs have been completed').waitFor();
220
+ });
221
+
222
+ test('Build Order - Allocation', async ({ browser }) => {
223
+ const page = await doCachedLogin(browser);
224
+
225
+ await navigate(page, 'manufacturing/build-order/1/line-items');
226
+
227
+ // Expand the R_10K_0805 line item
228
+ await page.getByText('R_10K_0805_1%').first().click();
229
+ await page.getByText('Reel Storage').waitFor();
230
+ await page.getByText('R_10K_0805_1%').first().click();
231
+
232
+ // The capacitor stock should be fully allocated
233
+ const cell = await page.getByRole('cell', { name: /C_1uF_0805/ });
234
+ const row = await getRowFromCell(cell);
235
+
236
+ await row.getByText(/150 \/ 150/).waitFor();
237
+
238
+ // Expand this row
239
+ await cell.click();
240
+ await page.getByRole('cell', { name: '2022-4-27', exact: true }).waitFor();
241
+ await page.getByRole('cell', { name: 'Reel Storage', exact: true }).waitFor();
242
+
243
+ // Navigate to the "Incomplete Outputs" tab
244
+ await loadTab(page, 'Incomplete Outputs');
245
+
246
+ // Find output #7
247
+ const output7 = await page
248
+ .getByRole('cell', { name: '# 7' })
249
+ .locator('xpath=ancestor::tr')
250
+ .first();
251
+
252
+ // Expecting 3/4 allocated outputs
253
+ await output7.getByText('3 / 4').waitFor();
254
+
255
+ // Expecting 0/3 completed tests
256
+ await output7.getByText('0 / 3').waitFor();
257
+
258
+ // Expand the output
259
+ await output7.click();
260
+
261
+ await page.getByText('Build Output Stock Allocation').waitFor();
262
+ await page.getByText('Serial Number: 7').waitFor();
263
+
264
+ // Data of expected rows
265
+ const data = [
266
+ {
267
+ name: 'Red Widget',
268
+ ipn: 'widget.red',
269
+ available: '123',
270
+ required: '3',
271
+ allocated: '3'
272
+ },
273
+ {
274
+ name: 'Blue Widget',
275
+ ipn: 'widget.blue',
276
+ available: '39',
277
+ required: '5',
278
+ allocated: '5'
279
+ },
280
+ {
281
+ name: 'Pink Widget',
282
+ ipn: 'widget.pink',
283
+ available: '4',
284
+ required: '4',
285
+ allocated: '0'
286
+ },
287
+ {
288
+ name: 'Green Widget',
289
+ ipn: 'widget.green',
290
+ available: '245',
291
+ required: '6',
292
+ allocated: '6'
293
+ }
294
+ ];
295
+
296
+ // Check for expected rows
297
+ for (let idx = 0; idx < data.length; idx++) {
298
+ const item = data[idx];
299
+
300
+ const cell = await page.getByRole('cell', { name: item.name });
301
+ const row = await getRowFromCell(cell);
302
+ const progress = `${item.allocated} / ${item.required}`;
303
+
304
+ await row.getByRole('cell', { name: item.ipn }).first().waitFor();
305
+ await row.getByRole('cell', { name: item.available }).first().waitFor();
306
+ await row.getByRole('cell', { name: progress }).first().waitFor();
307
+ }
308
+
309
+ // Check for expected buttons on Red Widget
310
+ const redWidget = await page.getByRole('cell', { name: 'Red Widget' });
311
+ const redRow = await redWidget.locator('xpath=ancestor::tr').first();
312
+
313
+ await redRow.getByLabel(/row-action-menu-/i).click();
314
+ await page
315
+ .getByRole('menuitem', { name: 'Allocate Stock', exact: true })
316
+ .waitFor();
317
+ await page
318
+ .getByRole('menuitem', { name: 'Deallocate Stock', exact: true })
319
+ .waitFor();
320
+ });
321
+
322
+ test('Build Order - Filters', async ({ browser }) => {
323
+ const page = await doCachedLogin(browser);
324
+
325
+ await navigate(page, 'manufacturing/index/buildorders');
326
+
327
+ await clearTableFilters(page);
328
+
329
+ // Check for expected pagination text i.e. (1 - 24 / 24)
330
+ // Note: Due to other concurrent tests, the number of build orders may vary
331
+ await page.getByText(/1 - \d+ \/ \d+/).waitFor();
332
+ await page.getByRole('cell', { name: 'BO0023' }).waitFor();
333
+
334
+ // Toggle 'Outstanding' filter
335
+ await setTableChoiceFilter(page, 'Outstanding', 'Yes');
336
+ await page.getByRole('cell', { name: 'BO0017' }).waitFor();
337
+
338
+ await clearTableFilters(page);
339
+ await setTableChoiceFilter(page, 'Outstanding', 'No');
340
+
341
+ await page.getByText('1 - 6 / 6').waitFor();
342
+
343
+ await clearTableFilters(page);
344
+
345
+ // Filter by custom status code
346
+ await setTableChoiceFilter(page, 'Status', 'Pending Approval');
347
+
348
+ // Single result - navigate through to the build order
349
+ await page.getByText('1 - 1 / 1').waitFor();
350
+ await page.getByRole('cell', { name: 'BO0023' }).click();
351
+
352
+ await page.getByText('On Hold').first().waitFor();
353
+ await page.getByText('Pending Approval').first().waitFor();
354
+ });
355
+
356
+ test('Build Order - Duplicate', async ({ browser }) => {
357
+ const page = await doCachedLogin(browser);
358
+
359
+ await navigate(page, 'manufacturing/build-order/24/details');
360
+ await page.getByLabel('action-menu-build-order-').click();
361
+ await page.getByLabel('action-menu-build-order-actions-duplicate').click();
362
+
363
+ // Ensure a new reference is suggested
364
+ await expect(page.getByLabel('text-field-reference')).not.toBeEmpty();
365
+
366
+ // Submit the duplicate request and ensure it completes
367
+ await page.getByRole('button', { name: 'Submit' }).isEnabled();
368
+ await page.getByRole('button', { name: 'Submit' }).click();
369
+ await page.getByRole('tab', { name: 'Build Details' }).waitFor();
370
+ await page.getByRole('tab', { name: 'Build Details' }).click();
371
+
372
+ await page.getByText('Pending').first().waitFor();
373
+ });
@@ -0,0 +1,40 @@
1
+ import { test } from '../baseFixtures.js';
2
+ import { loadTab, navigate } from '../helpers.js';
3
+ import { doCachedLogin } from '../login.js';
4
+
5
+ test('Company', async ({ browser }) => {
6
+ const page = await doCachedLogin(browser);
7
+
8
+ await navigate(page, 'company/1/details');
9
+ await page.getByLabel('Details').getByText('DigiKey Electronics').waitFor();
10
+ await page.getByRole('cell', { name: 'https://www.digikey.com/' }).waitFor();
11
+ await loadTab(page, 'Supplied Parts');
12
+ await page
13
+ .getByRole('cell', { name: 'RR05P100KDTR-ND', exact: true })
14
+ .waitFor();
15
+ await loadTab(page, 'Purchase Orders');
16
+ await page.getByRole('cell', { name: 'Molex connectors' }).first().waitFor();
17
+ await loadTab(page, 'Stock Items');
18
+ await page
19
+ .getByRole('cell', { name: 'Blue plastic enclosure' })
20
+ .first()
21
+ .waitFor();
22
+ await loadTab(page, 'Contacts');
23
+ await page.getByRole('cell', { name: 'jimmy.mcleod@digikey.com' }).waitFor();
24
+ await loadTab(page, 'Addresses');
25
+ await page.getByRole('cell', { name: 'Carla Tunnel' }).waitFor();
26
+ await loadTab(page, 'Attachments');
27
+ await loadTab(page, 'Notes');
28
+
29
+ // Let's edit the company details
30
+ await page.getByLabel('action-menu-company-actions').click();
31
+ await page.getByLabel('action-menu-company-actions-edit').click();
32
+
33
+ await page.getByLabel('text-field-name').fill('');
34
+ await page.getByLabel('text-field-website').fill('invalid-website');
35
+ await page.getByRole('button', { name: 'Submit' }).click();
36
+
37
+ await page.getByText('This field may not be blank.').waitFor();
38
+ await page.getByText('Enter a valid URL.').waitFor();
39
+ await page.getByRole('button', { name: 'Cancel' }).click();
40
+ });
@@ -0,0 +1,26 @@
1
+ import { test } from '../baseFixtures.js';
2
+ import { loadTab, navigate } from '../helpers.js';
3
+ import { doCachedLogin } from '../login.js';
4
+
5
+ test('Core User/Group/Contact', async ({ browser }) => {
6
+ const page = await doCachedLogin(browser);
7
+
8
+ // groups
9
+ await navigate(page, '/core');
10
+ await page.getByText('System Overview', { exact: true }).first().click();
11
+ await loadTab(page, 'Groups');
12
+ await page.getByRole('cell', { name: 'all access' }).click();
13
+ await page.getByText('Group: all access', { exact: true }).click();
14
+ await page.getByLabel('breadcrumb-1-groups').click();
15
+
16
+ // users
17
+ await loadTab(page, 'Users');
18
+ await page.getByRole('cell', { name: 'admin' }).click();
19
+ await page.getByText('User: admin', { exact: true }).waitFor();
20
+ await page.getByLabel('User Details').waitFor();
21
+ await page.getByLabel('breadcrumb-1-users').click();
22
+
23
+ // contacts
24
+ await loadTab(page, 'Contacts');
25
+ await page.getByRole('cell', { name: 'Adrian Briggs' }).waitFor();
26
+ });
@@ -0,0 +1,64 @@
1
+ import { test } from '../baseFixtures.js';
2
+ import { doCachedLogin } from '../login.js';
3
+ import { setPluginState } from '../settings.js';
4
+
5
+ test('Dashboard - Basic', async ({ browser }) => {
6
+ const page = await doCachedLogin(browser);
7
+
8
+ await page.getByText('Use the menu to add widgets').waitFor();
9
+
10
+ // Let's add some widgets
11
+ await page.getByLabel('dashboard-menu').click();
12
+ await page.getByRole('menuitem', { name: 'Add Widget' }).click();
13
+ await page.getByLabel('dashboard-widgets-filter-input').fill('overdue order');
14
+
15
+ await page.getByLabel('add-widget-ovr-so').click();
16
+ await page.getByLabel('add-widget-ovr-po').click();
17
+
18
+ await page.getByLabel('dashboard-widgets-filter-clear').click();
19
+
20
+ // Close the widget
21
+ await page.getByRole('banner').getByRole('button').click();
22
+
23
+ await page.waitForTimeout(500);
24
+
25
+ // Check that the widgets are visible
26
+ await page.getByText('Overdue Sales Orders').waitFor();
27
+ await page.getByText('Overdue Purchase Orders').waitFor();
28
+
29
+ // Let's remove one of the widgets
30
+ await page.getByLabel('dashboard-menu').click();
31
+ await page.getByRole('menuitem', { name: 'Remove Widgets' }).click();
32
+ await page.getByLabel('remove-dashboard-item-ovr-so').click();
33
+
34
+ // Accept the layout
35
+ await page.getByLabel('dashboard-accept-layout').click();
36
+ });
37
+
38
+ test('Dashboard - Plugins', async ({ browser, request }) => {
39
+ // Ensure that the "SampleUI" plugin is enabled
40
+ await setPluginState({
41
+ request,
42
+ plugin: 'sampleui',
43
+ state: true
44
+ });
45
+
46
+ const page = await doCachedLogin(browser);
47
+
48
+ // Add a dashboard widget from the SampleUI plugin
49
+ await page.getByLabel('dashboard-menu').click();
50
+ await page.getByRole('menuitem', { name: 'Add Widget' }).click();
51
+ await page.getByLabel('dashboard-widgets-filter-input').fill('sample');
52
+
53
+ // Add the widget
54
+ await page.getByLabel(/add-widget-p-sampleui-sample-/).click();
55
+
56
+ // Close the widget
57
+ await page.getByRole('banner').getByRole('button').click();
58
+
59
+ await page.waitForTimeout(500);
60
+
61
+ // Check that the widget is visible
62
+ await page.getByRole('heading', { name: 'Sample Dashboard Item' }).waitFor();
63
+ await page.getByText('Hello world! This is a sample').waitFor();
64
+ });