@plumile/backoffice-react 0.1.87 → 0.1.90

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 (91) hide show
  1. package/README.md +6 -6
  2. package/lib/esm/{AcceptInvitationScreen-dnOvRx4Z.js → AcceptInvitationScreen-DLc4aovr.js} +8 -7
  3. package/lib/esm/AcceptInvitationScreen-DLc4aovr.js.map +1 -0
  4. package/lib/esm/{AuthPanel-DiHejPoq.js → AuthPanel-BaIRFGbX.js} +2 -2
  5. package/lib/esm/{AuthPanel-DiHejPoq.js.map → AuthPanel-BaIRFGbX.js.map} +1 -1
  6. package/lib/esm/{BackofficeAcceptInvitationPage-CGht2ka0.js → BackofficeAcceptInvitationPage-D0dZnrV7.js} +4 -4
  7. package/lib/esm/{BackofficeAcceptInvitationPage-CGht2ka0.js.map → BackofficeAcceptInvitationPage-D0dZnrV7.js.map} +1 -1
  8. package/lib/esm/{BackofficeDashboardPage-h1OWb_rV.js → BackofficeDashboardPage-YWvoQODn.js} +33 -33
  9. package/lib/esm/{BackofficeDashboardPage-h1OWb_rV.js.map → BackofficeDashboardPage-YWvoQODn.js.map} +1 -1
  10. package/lib/esm/{BackofficeDetailPayload-iVx66o_6.js → BackofficeDetailPayload-P61MDRLE.js} +2 -2
  11. package/lib/esm/{BackofficeDetailPayload-iVx66o_6.js.map → BackofficeDetailPayload-P61MDRLE.js.map} +1 -1
  12. package/lib/esm/{BackofficeEntityActionFormDialog-V4QXnvpy.js → BackofficeEntityActionFormDialog-BgRTJ_JS.js} +3 -4
  13. package/lib/esm/BackofficeEntityActionFormDialog-BgRTJ_JS.js.map +1 -0
  14. package/lib/esm/BackofficeEntityDetailLayoutPage-DXjRqvcZ.js.map +1 -1
  15. package/lib/esm/{BackofficeEntityDetailPage-CIyGKwVP.js → BackofficeEntityDetailPage-DPFXbJxC.js} +34 -34
  16. package/lib/esm/BackofficeEntityDetailPage-DPFXbJxC.js.map +1 -0
  17. package/lib/esm/{BackofficeEntityListPage-DmZozSNk.js → BackofficeEntityListPage-C8Ucmc_E.js} +3 -4
  18. package/lib/esm/BackofficeEntityListPage-C8Ucmc_E.js.map +1 -0
  19. package/lib/esm/{useBackofficeReactTranslation-WfXU8kCf.js → BackofficeErrorBoundary-BwRVSDHU.js} +3 -9
  20. package/lib/esm/BackofficeErrorBoundary-BwRVSDHU.js.map +1 -0
  21. package/lib/esm/{BackofficeLayoutPage-DtFDn_nU.js → BackofficeLayoutPage-j3VUX3Tu.js} +35 -35
  22. package/lib/esm/{BackofficeLayoutPage-DtFDn_nU.js.map → BackofficeLayoutPage-j3VUX3Tu.js.map} +1 -1
  23. package/lib/esm/{BackofficeLoginPage-BvOPqbKO.js → BackofficeLoginPage-DgdIWTeu.js} +5 -5
  24. package/lib/esm/{BackofficeLoginPage-BvOPqbKO.js.map → BackofficeLoginPage-DgdIWTeu.js.map} +1 -1
  25. package/lib/esm/{BackofficePasswordResetCompletePage-ZLhghfhC.js → BackofficePasswordResetCompletePage-CF_0t3Nq.js} +4 -5
  26. package/lib/esm/BackofficePasswordResetCompletePage-CF_0t3Nq.js.map +1 -0
  27. package/lib/esm/{BackofficePasswordResetRequestPage-BLNHQD79.js → BackofficePasswordResetRequestPage-BJOrQXcy.js} +4 -4
  28. package/lib/esm/BackofficePasswordResetRequestPage-BJOrQXcy.js.map +1 -0
  29. package/lib/esm/BackofficeRightPageLayout-DZQvIHnj.js.map +1 -1
  30. package/lib/esm/{BackofficeVerifyEmailPage-BSTtLXdx.js → BackofficeVerifyEmailPage-C81LlsNM.js} +4 -5
  31. package/lib/esm/BackofficeVerifyEmailPage-C81LlsNM.js.map +1 -0
  32. package/lib/esm/{EntityFilterValue-B5ZGHO_u.js → EntityFilterValue-BWUdPBwp.js} +10 -9
  33. package/lib/esm/EntityFilterValue-BWUdPBwp.js.map +1 -0
  34. package/lib/esm/{EntityIdPickerDialog-DbTnDU4v.js → EntityIdPickerDialog-Yhmr-WsV.js} +9 -9
  35. package/lib/esm/{EntityIdPickerDialog-DbTnDU4v.js.map → EntityIdPickerDialog-Yhmr-WsV.js.map} +1 -1
  36. package/lib/esm/{LazyBackofficeEntityActionFormDialog-BE3wVfU6.js → LazyBackofficeEntityActionFormDialog-DVPQyWlr.js} +8 -7
  37. package/lib/esm/{LazyBackofficeEntityActionFormDialog-BE3wVfU6.js.map → LazyBackofficeEntityActionFormDialog-DVPQyWlr.js.map} +1 -1
  38. package/lib/esm/{PasswordResetCompleteScreen-B0P_tZg2.js → PasswordResetCompleteScreen-Cgg96DPo.js} +6 -5
  39. package/lib/esm/PasswordResetCompleteScreen-Cgg96DPo.js.map +1 -0
  40. package/lib/esm/{PasswordResetRequestScreen-p9s0dblR.js → PasswordResetRequestScreen-I1nFvGLd.js} +6 -5
  41. package/lib/esm/PasswordResetRequestScreen-I1nFvGLd.js.map +1 -0
  42. package/lib/esm/{VerifyEmailScreen--9lxOGlW.js → VerifyEmailScreen-Br5KyHjg.js} +7 -6
  43. package/lib/esm/VerifyEmailScreen-Br5KyHjg.js.map +1 -0
  44. package/lib/esm/backoffice-react.js +830 -1001
  45. package/lib/esm/backoffice-react.js.map +1 -1
  46. package/lib/esm/buildBreadcrumbs-CqF9Nh6x.js.map +1 -1
  47. package/lib/esm/environment-BXoBq_6e.js.map +1 -1
  48. package/lib/esm/loginPage.css-B7Io_DuU.js +6 -0
  49. package/lib/esm/loginPage.css-B7Io_DuU.js.map +1 -0
  50. package/lib/esm/mutationResult-CcQMY13J.js.map +1 -1
  51. package/lib/esm/pageResolution-hAQA5C6S.js.map +1 -1
  52. package/lib/esm/sidebarUtils-CuwJ_3mD.js.map +1 -1
  53. package/lib/esm/{synchronizeAuthStatusQuery-By_lNCnP.js → synchronizeAuthStatusQuery-1juorUEX.js} +47 -46
  54. package/lib/esm/synchronizeAuthStatusQuery-1juorUEX.js.map +1 -0
  55. package/lib/esm/{useAuth-OVPPa9bO.js → useAuth-BdSNpGqe.js} +43 -42
  56. package/lib/esm/useAuth-BdSNpGqe.js.map +1 -0
  57. package/lib/esm/{useBackofficeAuth-BvEoEqnB.js → useBackofficeAuth-C16Euw2X.js} +3 -3
  58. package/lib/esm/{useBackofficeAuth-BvEoEqnB.js.map → useBackofficeAuth-C16Euw2X.js.map} +1 -1
  59. package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js → useBackofficeLazyValue-Bh_13h8A.js} +2 -2
  60. package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js.map → useBackofficeLazyValue-Bh_13h8A.js.map} +1 -1
  61. package/lib/esm/useBackofficeListUrlState-D4fx5O7u.js.map +1 -1
  62. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js +18 -0
  63. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js.map +1 -0
  64. package/lib/types/components/backoffice/scaffolds/BackofficeListFilterContext.d.ts.map +1 -1
  65. package/lib/types/hooks/useConditionalSubscription.d.ts.map +1 -1
  66. package/lib/types/i18n/resources.d.ts +211 -409
  67. package/lib/types/i18n/resources.d.ts.map +1 -1
  68. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  69. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  70. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  71. package/package.json +14 -12
  72. package/lib/esm/AcceptInvitationScreen-dnOvRx4Z.js.map +0 -1
  73. package/lib/esm/BackofficeConfigContext-R0t1owTI.js +0 -12
  74. package/lib/esm/BackofficeConfigContext-R0t1owTI.js.map +0 -1
  75. package/lib/esm/BackofficeEntityActionFormDialog-V4QXnvpy.js.map +0 -1
  76. package/lib/esm/BackofficeEntityDetailPage-CIyGKwVP.js.map +0 -1
  77. package/lib/esm/BackofficeEntityListPage-DmZozSNk.js.map +0 -1
  78. package/lib/esm/BackofficePasswordResetCompletePage-ZLhghfhC.js.map +0 -1
  79. package/lib/esm/BackofficePasswordResetRequestPage-BLNHQD79.js.map +0 -1
  80. package/lib/esm/BackofficeVerifyEmailPage-BSTtLXdx.js.map +0 -1
  81. package/lib/esm/EntityFilterValue-B5ZGHO_u.js.map +0 -1
  82. package/lib/esm/PasswordResetCompleteScreen-B0P_tZg2.js.map +0 -1
  83. package/lib/esm/PasswordResetRequestScreen-p9s0dblR.js.map +0 -1
  84. package/lib/esm/VerifyEmailScreen--9lxOGlW.js.map +0 -1
  85. package/lib/esm/loginPage.css-CBJ1Ozm5.js +0 -12
  86. package/lib/esm/loginPage.css-CBJ1Ozm5.js.map +0 -1
  87. package/lib/esm/synchronizeAuthStatusQuery-By_lNCnP.js.map +0 -1
  88. package/lib/esm/useAuth-OVPPa9bO.js.map +0 -1
  89. package/lib/esm/useBackofficeReactTranslation-WfXU8kCf.js.map +0 -1
  90. package/lib/types/i18n/useSharedTranslation.d.ts +0 -3
  91. package/lib/types/i18n/useSharedTranslation.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/i18n/resources.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG/B,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAC"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/i18n/resources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG/B,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailPage.d.ts","sourceRoot":"","sources":["../../../src/pages/BackofficeEntityDetailPage.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAiD,MAAM,OAAO,CAAC;AAEhF,OAAO,EAEL,KAAK,cAAc,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAUnD,OAAO,KAAK,EACV,6CAA6C,EAE7C,2CAA2C,EAC5C,MAAM,mCAAmC,CAAC;AAwE3C,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,6CAA6C,CAAC;IACtD,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,2CAA2C,CAAC;QACxD,SAAS,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAqwBF,eAAO,MAAM,0BAA0B,GAAI,uBAGxC,+BAA+B,KAAG,GAAG,CAAC,OA0BxC,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
1
+ {"version":3,"file":"BackofficeEntityDetailPage.d.ts","sourceRoot":"","sources":["../../../src/pages/BackofficeEntityDetailPage.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAiD,MAAM,OAAO,CAAC;AAEhF,OAAO,EAEL,KAAK,cAAc,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAUnD,OAAO,KAAK,EACV,6CAA6C,EAE7C,2CAA2C,EAC5C,MAAM,mCAAmC,CAAC;AAuE3C,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,6CAA6C,CAAC;IACtD,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,2CAA2C,CAAC;QACxD,SAAS,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAqwBF,eAAO,MAAM,0BAA0B,GAAI,uBAGxC,+BAA+B,KAAG,GAAG,CAAC,OA0BxC,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeProvider.d.ts","sourceRoot":"","sources":["../../../src/provider/BackofficeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAqBjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAgH1D,eAAO,MAAM,kBAAkB,GAC7B,OAAO,uBAAuB,KAC7B,GAAG,CAAC,OAgKN,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"BackofficeProvider.d.ts","sourceRoot":"","sources":["../../../src/provider/BackofficeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAqBjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAgH1D,eAAO,MAAM,kBAAkB,GAC7B,OAAO,uBAAuB,KAC7B,GAAG,CAAC,OAuJN,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createBackofficeRoutes.d.ts","sourceRoot":"","sources":["../../../src/router/createBackofficeRoutes.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAGhE,OAAO,KAAK,EACV,2BAA2B,EAM5B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAI9E,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,2BAA2B,CAAC;IAC5C,cAAc,EAAE,wBAAwB,CAAC;IACzC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,kBAAkB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,EAAE,WAAW,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAAY,GAAG,IAMhD,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,YAAY,GAAG,IAKvD,CAAC;AAEJ,eAAO,MAAM,gCAAgC,EAAE,YAAY,GAAG,IAK3D,CAAC;AAEJ,eAAO,MAAM,kCAAkC,EAAE,YAAY,GAAG,IAK7D,CAAC;AAEJ,eAAO,MAAM,wCAAwC,EAAE,YAAY,GAAG,IAKnE,CAAC;AAEJ,eAAO,MAAM,iDAAiD,EAAE,YAAY,GAAG,IAK5E,CAAC;AAEJ,eAAO,MAAM,+BAA+B,EAAE,YAAY,GAAG,IAK1D,CAAC;AAEJ,eAAO,MAAM,2BAA2B,EAAE,YAAY,GAAG,IAIxD,CAAC;AAEF,eAAO,MAAM,0CAA0C,EAAE,YAAY,GAAG,IAKrE,CAAC;AAEJ,eAAO,MAAM,2CAA2C,EAAE,YAAY,GAAG,IAKtE,CAAC;AAEJ,eAAO,MAAM,iCAAiC,EAAE,YAAY,GAAG,IAK5D,CAAC;AAEJ,eAAO,MAAM,sCAAsC,EAAE,YAAY,GAAG,IAKjE,CAAC;AAsGJ,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,2BAA2B,GACjC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,EAAE,CA+evC;AAED,eAAO,MAAM,MAAM;2CA3kBkB,MAAM,KAAG,MAAM;oCAQtB,MAAM,KAAG,MAAM;4CAQP,MAAM,QAAQ,MAAM,KAAG,MAAM;oDAWrB,MAAM,QAAQ,MAAM,KAAG,MAAM;+CAK3D,MAAM,eACP,MAAM,KAClB,MAAM;qDAUA;QAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;KAAE,GAAG,IAAI,oBAClB,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC1C,MAAM,GAAG,IAAI;qCAgBe,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,eAAe;CAqhB9D,CAAC;AAEX,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"createBackofficeRoutes.d.ts","sourceRoot":"","sources":["../../../src/router/createBackofficeRoutes.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAGhE,OAAO,KAAK,EACV,2BAA2B,EAM5B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAI9E,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,2BAA2B,CAAC;IAC5C,cAAc,EAAE,wBAAwB,CAAC;IACzC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,kBAAkB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,EAAE,WAAW,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAAY,GAAG,IAMhD,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,YAAY,GAAG,IAKvD,CAAC;AAEJ,eAAO,MAAM,gCAAgC,EAAE,YAAY,GAAG,IAK3D,CAAC;AAEJ,eAAO,MAAM,kCAAkC,EAAE,YAAY,GAAG,IAK7D,CAAC;AAEJ,eAAO,MAAM,wCAAwC,EAAE,YAAY,GAAG,IAKnE,CAAC;AAEJ,eAAO,MAAM,iDAAiD,EAAE,YAAY,GAAG,IAK5E,CAAC;AAEJ,eAAO,MAAM,+BAA+B,EAAE,YAAY,GAAG,IAK1D,CAAC;AAEJ,eAAO,MAAM,2BAA2B,EAAE,YAAY,GAAG,IAIxD,CAAC;AAEF,eAAO,MAAM,0CAA0C,EAAE,YAAY,GAAG,IAKrE,CAAC;AAEJ,eAAO,MAAM,2CAA2C,EAAE,YAAY,GAAG,IAKtE,CAAC;AAEJ,eAAO,MAAM,iCAAiC,EAAE,YAAY,GAAG,IAK5D,CAAC;AAEJ,eAAO,MAAM,sCAAsC,EAAE,YAAY,GAAG,IAKjE,CAAC;AAsGJ,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,2BAA2B,GACjC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,EAAE,CA2evC;AAED,eAAO,MAAM,MAAM;2CAvkBkB,MAAM,KAAG,MAAM;oCAQtB,MAAM,KAAG,MAAM;4CAQP,MAAM,QAAQ,MAAM,KAAG,MAAM;oDAWrB,MAAM,QAAQ,MAAM,KAAG,MAAM;+CAK3D,MAAM,eACP,MAAM,KAClB,MAAM;qDAUA;QAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;KAAE,GAAG,IAAI,oBAClB,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC1C,MAAM,GAAG,IAAI;qCAgBe,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,eAAe;CAihB9D,CAAC;AAEX,eAAe,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@plumile/backoffice-react",
3
- "version": "0.1.87",
4
- "description": "React provider and pages for Plumile backoffice",
3
+ "version": "0.1.90",
4
+ "description": "React provider and pages for Kronex backoffice",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "main": "lib/esm/backoffice-react.js",
@@ -137,6 +137,8 @@
137
137
  "build:package:types": "tsc --build tsconfig.types.json",
138
138
  "check:build-package": "tsc --noEmit",
139
139
  "clean": "rimraf lib && rimraf *.tsbuildinfo",
140
+ "i18n:check": "npm run i18n:update -- --ci",
141
+ "i18n:update": "i18next-cli extract --config ./i18next.config.ts",
140
142
  "test:build-package": "./tools/test-build-package.sh"
141
143
  },
142
144
  "repository": {
@@ -158,14 +160,14 @@
158
160
  "npm": ">=8.0.0"
159
161
  },
160
162
  "dependencies": {
161
- "@plumile/backoffice-core": "^0.1.87",
162
- "@plumile/filter-query": "^0.1.87",
163
- "@plumile/router": "^0.1.87",
164
- "@plumile/ui": "^0.1.87",
163
+ "@plumile/backoffice-core": "^0.1.90",
164
+ "@plumile/filter-query": "^0.1.90",
165
+ "@plumile/router": "^0.1.90",
166
+ "@plumile/ui": "^0.1.90",
165
167
  "graphql-ws": "6.0.8",
166
- "i18next": "^26.0.4",
168
+ "i18next": "^26.0.8",
167
169
  "i18next-browser-languagedetector": "8.2.1",
168
- "react-i18next": "17.0.2",
170
+ "react-i18next": "17.0.6",
169
171
  "relay-runtime": "20.1.1",
170
172
  "tslib": "^2.8.1"
171
173
  },
@@ -173,18 +175,18 @@
173
175
  "@types/react": "19.2.14",
174
176
  "@types/react-dom": "19.2.3",
175
177
  "@types/relay-runtime": "20.1.1",
176
- "i18next": "26.0.4",
178
+ "i18next": "26.0.8",
177
179
  "react": "19.2.5",
178
180
  "react-dom": "19.2.5",
179
181
  "react-relay": "20.1.1",
180
182
  "rimraf": "6.1.3",
181
- "typescript": "6.0.2"
183
+ "typescript": "6.0.3"
182
184
  },
183
185
  "peerDependencies": {
184
- "i18next": "^26.0.4",
186
+ "i18next": "^26.0.8",
185
187
  "react": "^19.2.5",
186
188
  "react-dom": "^19.2.5",
187
- "react-i18next": "^17.0.2",
189
+ "react-i18next": "^17.0.6",
188
190
  "react-relay": "^20.1.1",
189
191
  "relay-runtime": "^20.1.1"
190
192
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"AcceptInvitationScreen-dnOvRx4Z.js","names":[],"sources":["../../src/auth/pages/AcceptInvitationScreen.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useMemo,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useSharedTranslation } from '../../i18n/useSharedTranslation.js';\n\nimport { AuthLayout, Button, FormError, FormField } from '@plumile/ui';\n\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\nimport { MfaChallengeForm } from '../login/MfaChallengeForm.js';\nimport AuthPanel from '../login/AuthPanel.js';\nimport * as styles from '../login/loginPage.css.js';\n\ntype AcceptanceState = 'pending' | 'mfa' | 'completed' | 'error' | 'idle';\n\ntype Props = {\n auth: UseAuthReturn;\n onSuccessRedirect: () => void;\n onBackToLogin: () => void;\n token?: string;\n};\n\nexport const AcceptInvitationScreen = ({\n auth,\n onSuccessRedirect,\n onBackToLogin,\n token,\n}: Props): JSX.Element => {\n const { t } = useSharedTranslation();\n const { acceptInvitation } = auth;\n const [status, setStatus] = useState<AcceptanceState>('idle');\n const [password, setPassword] = useState('');\n const [passwordConfirmation, setPasswordConfirmation] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const resolvedToken = useMemo(() => {\n if (token != null) {\n return token;\n }\n if (typeof window === 'undefined') {\n return '';\n }\n const params = new URLSearchParams(window.location.search);\n return params.get('token') ?? '';\n }, [token]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (resolvedToken === '') {\n setErrorMessage(t('auth.acceptInvitation.errors.missingToken'));\n setStatus('error');\n return;\n }\n\n if (password !== passwordConfirmation) {\n setErrorMessage(t('auth.acceptInvitation.errors.passwordMismatch'));\n setStatus('error');\n return;\n }\n\n setStatus('pending');\n setErrorMessage(null);\n setIsSubmitting(true);\n\n // eslint-disable-next-line no-void\n void acceptInvitation({\n token: resolvedToken,\n password,\n passwordConfirmation,\n })\n .then((result) => {\n if (result === 'mfa-required') {\n setStatus('mfa');\n return;\n }\n setStatus('completed');\n onSuccessRedirect();\n })\n .catch((error) => {\n setStatus('error');\n if (error instanceof Error) {\n setErrorMessage(error.message);\n } else if (typeof error === 'string') {\n setErrorMessage(error);\n } else {\n setErrorMessage(t('auth.acceptInvitation.errors.default'));\n }\n })\n .finally(() => {\n setIsSubmitting(false);\n });\n },\n [\n acceptInvitation,\n onSuccessRedirect,\n password,\n passwordConfirmation,\n resolvedToken,\n t,\n ],\n );\n\n const handleMfaSuccess = useCallback(() => {\n setStatus('completed');\n onSuccessRedirect();\n }, [onSuccessRedirect]);\n\n const handleRetry = useCallback(() => {\n setStatus('idle');\n setErrorMessage(null);\n setIsSubmitting(false);\n }, []);\n\n if (status === 'mfa') {\n return (\n <AuthLayout\n title={t('auth.acceptInvitation.mfaTitle')}\n subtitle={t('auth.acceptInvitation.mfaSubtitle')}\n >\n <MfaChallengeForm\n auth={auth}\n onSuccess={handleMfaSuccess}\n onBack={() => {\n auth.reset();\n handleRetry();\n }}\n />\n </AuthLayout>\n );\n }\n\n let content: JSX.Element;\n if (status === 'completed') {\n content = (\n <div className={styles.stack}>\n <p className={styles.helper}>\n {t('auth.acceptInvitation.status.success')}\n </p>\n </div>\n );\n } else {\n content = (\n <AuthPanel description={t('auth.acceptInvitation.subtitle')}>\n <form className={styles.formSurface} onSubmit={handleSubmit} noValidate>\n {errorMessage != null ? <FormError>{errorMessage}</FormError> : null}\n <FormField\n label={t('auth.acceptInvitation.form.passwordLabel')}\n name=\"password\"\n type=\"password\"\n value={password}\n onChange={(event) => {\n setPassword(event.target.value);\n setErrorMessage(null);\n if (status === 'error') {\n setStatus('idle');\n }\n }}\n placeholder={t('auth.acceptInvitation.form.passwordPlaceholder')}\n autoComplete=\"new-password\"\n required\n />\n <FormField\n label={t('auth.acceptInvitation.form.confirmLabel')}\n name=\"password-confirmation\"\n type=\"password\"\n value={passwordConfirmation}\n onChange={(event) => {\n setPasswordConfirmation(event.target.value);\n setErrorMessage(null);\n if (status === 'error') {\n setStatus('idle');\n }\n }}\n placeholder={t('auth.acceptInvitation.form.confirmPlaceholder')}\n autoComplete=\"new-password\"\n required\n />\n <Button type=\"submit\" isLoading={isSubmitting}>\n {status === 'pending'\n ? t('auth.acceptInvitation.status.workingButton')\n : t('auth.acceptInvitation.form.submit')}\n </Button>\n <Button type=\"button\" variant=\"secondary\" onClick={onBackToLogin}>\n {t('auth.acceptInvitation.actions.backToLogin')}\n </Button>\n </form>\n </AuthPanel>\n );\n }\n\n return (\n <AuthLayout title={t('auth.acceptInvitation.title')}>{content}</AuthLayout>\n );\n};\n"],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { createContext as e, useContext as t } from "react";
2
- //#region src/provider/BackofficeConfigContext.tsx
3
- var n = e(null), r = n.Provider;
4
- function i() {
5
- let e = t(n);
6
- if (e == null) throw Error("BackofficeProvider is missing in the component tree.");
7
- return e;
8
- }
9
- //#endregion
10
- export { i as n, r as t };
11
-
12
- //# sourceMappingURL=BackofficeConfigContext-R0t1owTI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeConfigContext-R0t1owTI.js","names":[],"sources":["../../src/provider/BackofficeConfigContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeAuthConfig,\n BackofficeDashboardModule,\n BackofficeGraphQLConfig,\n BackofficeSidebarConfig,\n} from './types.js';\nimport type { BackofficeEntityRegistry } from './entityRegistry.js';\n\nexport type BackofficeConfigContextValue = {\n basePath: string;\n entities: BackofficeEntityManifestMap;\n entityManifest: BackofficeEntityManifestMap;\n entityRegistry: BackofficeEntityRegistry;\n filterColumnAliases?: Record<string, string>;\n sidebar?: BackofficeSidebarConfig;\n dashboard?: BackofficeDashboardModule;\n auth: BackofficeAuthConfig;\n graphql: BackofficeGraphQLConfig;\n};\n\nconst BackofficeConfigContext =\n createContext<BackofficeConfigContextValue | null>(null);\n\nexport const BackofficeConfigProvider = BackofficeConfigContext.Provider;\n\n/**\n * Hook to access the Backoffice configuration context\n */\nexport function useBackofficeConfig(): BackofficeConfigContextValue {\n const context = useContext(BackofficeConfigContext);\n if (context == null) {\n throw new Error('BackofficeProvider is missing in the component tree.');\n }\n return context;\n}\n\nexport default BackofficeConfigContext;\n"],"mappings":";;AAwBA,IAAM,IACJ,EAAmD,KAAK,EAE7C,IAA2B,EAAwB;AAKhE,SAAgB,IAAoD;CAClE,IAAM,IAAU,EAAW,EAAwB;AACnD,KAAI,KAAW,KACb,OAAU,MAAM,uDAAuD;AAEzE,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeEntityActionFormDialog-V4QXnvpy.js","names":[],"sources":["../../src/components/backoffice/actions/backofficeEntityActionFormDialog.css.ts","../../src/components/backoffice/actions/BackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import { sprinkles } from '@plumile/ui';\n\nexport const form = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 2,\n});\n\nexport const checkboxGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const resultSection = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const fieldError = sprinkles({\n fontSize: 'xs',\n color: 'error',\n});\n\nexport const fieldDescription = sprinkles({\n fontSize: 'xs',\n color: 'secondary',\n});\n","import {\n type FormEvent,\n type JSX,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport {\n type MutationPayloadBase,\n resolveMutationOutcome,\n} from '../../../relay/mutationResult.js';\nimport {\n BackofficeFormSection,\n Button,\n CheckboxField,\n Form,\n FormErrorBanner,\n FormGroup,\n HighlightCode,\n Input,\n Label,\n Modal,\n SimpleSelect,\n Textarea,\n useToast,\n} from '@plumile/ui';\nimport type {\n BackofficeEntityActionFormFieldSpec,\n BackofficeEntityFormMutationActionSpec,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from './toastViewAction.js';\n\nconst { commitMutation, useRelayEnvironment } = ReactRelay;\nimport { RoutingContext } from '@plumile/router';\n\nimport * as styles from './backofficeEntityActionFormDialog.css.js';\n\nexport type BackofficeEntityActionFormDialogProps<Node> = {\n isOpen: boolean;\n action: BackofficeEntityFormMutationActionSpec<Node>;\n node: Node;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nconst extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value as MutationPayloadBase;\n }\n }\n\n return null;\n};\n\nconst buildDefaultValues = (\n fields: readonly BackofficeEntityActionFormFieldSpec[],\n): Record<string, unknown> => {\n const output: Record<string, unknown> = {};\n fields.forEach((field) => {\n if (field.kind === 'boolean') {\n output[field.id] = field.defaultValue ?? false;\n return;\n }\n if (field.kind === 'multiEnum') {\n output[field.id] = field.defaultValue ?? [];\n return;\n }\n if (field.defaultValue != null) {\n output[field.id] = field.defaultValue;\n return;\n }\n output[field.id] = '';\n });\n return output;\n};\n\nconst normalizeInitialValue = (\n field: BackofficeEntityActionFormFieldSpec,\n value: unknown,\n): unknown => {\n if (field.kind === 'number') {\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return value;\n }\n return '';\n }\n if (field.kind === 'multiEnum') {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => {\n return typeof entry === 'string' && entry.trim() !== '';\n });\n }\n return [];\n }\n if (field.kind === 'boolean') {\n return value === true;\n }\n if (typeof value === 'string') {\n return value;\n }\n return value ?? '';\n};\n\nconst buildInitialValues = <Node,>(\n action: BackofficeEntityFormMutationActionSpec<Node>,\n node: Node,\n): Record<string, unknown> => {\n const defaults = buildDefaultValues(action.fields);\n if (action.getInitialValues == null) {\n return defaults;\n }\n const overrides = action.getInitialValues(node);\n const next: Record<string, unknown> = { ...defaults };\n action.fields.forEach((field) => {\n if (!(field.id in overrides)) {\n return;\n }\n next[field.id] = normalizeInitialValue(field, overrides[field.id]);\n });\n return next;\n};\n\nexport const BackofficeEntityActionFormDialog = <Node,>({\n isOpen,\n action,\n node,\n onClose,\n onSuccess,\n}: BackofficeEntityActionFormDialogProps<Node>): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n\n const [values, setValues] = useState<Record<string, unknown>>({});\n const [formError, setFormError] = useState<string | null>(null);\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [resultValue, setResultValue] = useState<string | null>(null);\n const [resultResponse, setResultResponse] = useState<unknown>(null);\n const [activeEntityPicker, setActiveEntityPicker] = useState<{\n fieldId: string;\n entity: string;\n label: string;\n } | null>(null);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n setValues(buildInitialValues(action, node));\n setFormError(null);\n setFieldErrors({});\n setResultValue(null);\n setResultResponse(null);\n }, [action, isOpen, node]);\n\n const setFieldValue = useCallback((fieldId: string, value: unknown) => {\n setValues((current) => {\n return { ...current, [fieldId]: value };\n });\n setFieldErrors((current) => {\n if (current[fieldId] == null) {\n return current;\n }\n const { [fieldId]: removedValue, ...next } = current;\n return next;\n });\n }, []);\n\n const title = resolveLabel(action.label, tApp);\n\n const resolveRequiredError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.required', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidNumberError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidNumber', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJson', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonObjectError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJsonObject', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonArrayError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJsonArray', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const buildPayload = useCallback(():\n | { values: Record<string, unknown> }\n | { error: string; fieldId?: string } => {\n const output: Record<string, unknown> = {};\n\n for (const field of action.fields) {\n const fieldLabel = resolveLabel(field.label, tApp);\n const rawValue = values[field.id];\n\n switch (field.kind) {\n case 'text': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'number': {\n let valueString = '';\n if (typeof rawValue === 'string') {\n valueString = rawValue.trim();\n } else if (\n typeof rawValue === 'number' &&\n Number.isFinite(rawValue)\n ) {\n valueString = String(rawValue);\n }\n if (valueString === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n const parsed = Number(valueString);\n if (!Number.isFinite(parsed)) {\n return {\n error: resolveInvalidNumberError(fieldLabel),\n fieldId: field.id,\n };\n }\n output[field.id] = parsed;\n break;\n }\n case 'json': {\n let valueString = '';\n if (typeof rawValue === 'string') {\n valueString = rawValue.trim();\n }\n if (valueString === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(valueString);\n } catch {\n return {\n error: resolveInvalidJsonError(fieldLabel),\n fieldId: field.id,\n };\n }\n\n const jsonType = field.jsonType ?? 'object';\n if (jsonType === 'object' && !isPlainObject(parsed)) {\n return {\n error: resolveInvalidJsonObjectError(fieldLabel),\n fieldId: field.id,\n };\n }\n if (jsonType === 'array' && !Array.isArray(parsed)) {\n return {\n error: resolveInvalidJsonArrayError(fieldLabel),\n fieldId: field.id,\n };\n }\n\n output[field.id] = parsed;\n break;\n }\n case 'enum': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'boolean': {\n output[field.id] = rawValue === true;\n break;\n }\n case 'entityId': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'multiEnum': {\n let list: string[] = [];\n if (Array.isArray(rawValue)) {\n list = rawValue.filter((entry): entry is string => {\n return typeof entry === 'string' && entry.trim() !== '';\n });\n }\n if (list.length === 0) {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = list;\n break;\n }\n default: {\n break;\n }\n }\n }\n\n return { values: output };\n }, [\n action.fields,\n resolveInvalidJsonArrayError,\n resolveInvalidJsonError,\n resolveInvalidJsonObjectError,\n resolveInvalidNumberError,\n resolveRequiredError,\n tApp,\n values,\n ]);\n\n const handleSubmit = useCallback(() => {\n if (isSubmitting) {\n return;\n }\n\n setFormError(null);\n setFieldErrors({});\n\n const payload = buildPayload();\n if ('error' in payload) {\n setFormError(payload.error);\n if (payload.fieldId != null) {\n setFieldErrors({ [payload.fieldId]: payload.error });\n }\n return;\n }\n\n let variables: ReturnType<typeof action.getVariables>;\n try {\n variables = action.getVariables(node, payload.values);\n } catch (error) {\n let message = t('actions.form.errors.invalidPayload');\n if (error instanceof Error) {\n message = error.message;\n }\n setFormError(message);\n return;\n }\n\n setIsSubmitting(true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, node);\n },\n onCompleted: (response) => {\n setIsSubmitting(false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t('actions.form.errors.invalidPayload');\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(action.toasts.error.title, tApp);\n }\n\n const outcome = resolveMutationOutcome(mutationPayload, {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(reason, node);\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n });\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n setFormError(outcome.message);\n action.onError?.(error, node);\n if (action.toasts?.error != null) {\n const toastTitle = resolveLabel(action.toasts.error.title, tApp);\n let toastMessage: string | undefined;\n if (action.toasts.error.message != null) {\n toastMessage = resolveLabel(action.toasts.error.message, tApp);\n }\n toast.error(toastTitle, toastMessage);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, node);\n\n let hasCustomResult = false;\n if (action.result?.render != null) {\n const renderedResult = action.result.render(response, node);\n if (renderedResult != null) {\n hasCustomResult = true;\n setResultResponse(response);\n }\n }\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(action.toasts.success, tApp);\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n\n if (action.result != null) {\n const nextValue = action.result.getValue(response, node);\n if (typeof nextValue === 'string' && nextValue.trim() !== '') {\n setResultValue(nextValue);\n onSuccess?.();\n return;\n }\n }\n\n if (hasCustomResult) {\n onSuccess?.();\n return;\n }\n\n onSuccess?.();\n onClose();\n },\n onError: (error) => {\n setIsSubmitting(false);\n action.onError?.(error, node);\n if (action.toasts?.error != null) {\n const toastTitle = resolveLabel(action.toasts.error.title, tApp);\n let toastMessage: string | undefined;\n if (action.toasts.error.message != null) {\n toastMessage = resolveLabel(action.toasts.error.message, tApp);\n }\n toast.error(toastTitle, toastMessage);\n }\n },\n });\n }, [\n action,\n buildPayload,\n entities,\n environment,\n isSubmitting,\n node,\n onClose,\n onSuccess,\n routing?.history,\n t,\n tApp,\n toast,\n ]);\n\n const handleFormSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n handleSubmit();\n },\n [handleSubmit],\n );\n\n const resultLabel = useMemo(() => {\n if (action.result == null) {\n return null;\n }\n return resolveLabel(action.result.label, tApp);\n }, [action.result, tApp]);\n\n const resultRender = useMemo(() => {\n if (action.result?.render == null || resultResponse == null) {\n return null;\n }\n return action.result.render(resultResponse as never, node);\n }, [action.result, node, resultResponse]);\n\n const showResult =\n (resultValue != null && resultLabel != null) || resultRender != null;\n\n const submitLabel = resolveLabel(action.label, tApp);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={\n <div className={styles.actions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onClose}\n >\n {t('actions.form.cancel')}\n </Button>\n {!showResult && (\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"small\"\n disabled={isSubmitting}\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n )}\n </div>\n }\n >\n <Form onSubmit={handleFormSubmit} className={styles.form}>\n <FormErrorBanner message={formError} />\n <BackofficeFormSection>\n {action.fields.map((field) => {\n const fieldLabel = resolveLabel(field.label, tApp);\n let fieldDescription: string | null = null;\n if (field.description != null) {\n fieldDescription = resolveLabel(field.description, tApp);\n }\n\n switch (field.kind) {\n case 'text': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormGroup key={field.id}>\n <Label>{fieldLabel}</Label>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <Input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n case 'number': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormGroup key={field.id}>\n <Label>{fieldLabel}</Label>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <Input\n type=\"number\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n case 'json': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormGroup key={field.id}>\n <Label>{fieldLabel}</Label>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <Textarea\n value={value}\n placeholder={placeholder}\n rows={8}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n case 'enum': {\n const rawValue = values[field.id];\n let selected = '';\n if (typeof rawValue === 'string') {\n selected = rawValue;\n }\n const options = field.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n });\n return (\n <FormGroup key={field.id}>\n <Label>{fieldLabel}</Label>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <SimpleSelect\n options={options}\n value={selected}\n placeholder={fieldLabel}\n onChange={(nextValue) => {\n setFieldValue(field.id, nextValue);\n }}\n />\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n case 'boolean': {\n const checked = values[field.id] === true;\n return (\n <FormGroup key={field.id}>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <CheckboxField\n label={fieldLabel}\n checked={checked}\n onChange={(event) => {\n setFieldValue(field.id, event.target.checked);\n }}\n />\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n case 'entityId': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n return (\n <FormGroup key={field.id}>\n <Label>{fieldLabel}</Label>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <EntityIdFilterField\n label={fieldLabel}\n value={value}\n onPick={() => {\n setActiveEntityPicker({\n fieldId: field.id,\n entity: field.entity,\n label: fieldLabel,\n });\n }}\n onClear={() => {\n setFieldValue(field.id, '');\n }}\n />\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n case 'multiEnum': {\n const rawValue = values[field.id];\n let selected: string[] = [];\n if (Array.isArray(rawValue)) {\n selected = rawValue.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n }\n return (\n <FormGroup key={field.id}>\n <Label>{fieldLabel}</Label>\n {fieldDescription != null && (\n <span className={styles.fieldDescription}>\n {fieldDescription}\n </span>\n )}\n <div className={styles.checkboxGroup}>\n {field.options.map((option) => {\n const optionLabel = resolveLabel(option.label, tApp);\n const isChecked = selected.includes(option.value);\n return (\n <CheckboxField\n key={option.value}\n label={optionLabel}\n checked={isChecked}\n onChange={(event) => {\n let nextList = selected;\n if (event.target.checked) {\n if (!selected.includes(option.value)) {\n nextList = [...selected, option.value];\n }\n } else {\n nextList = selected.filter((value) => {\n return value !== option.value;\n });\n }\n setFieldValue(field.id, nextList);\n }}\n />\n );\n })}\n </div>\n {fieldErrors[field.id] != null && (\n <span className={styles.fieldError}>\n {fieldErrors[field.id]}\n </span>\n )}\n </FormGroup>\n );\n }\n default: {\n return null;\n }\n }\n })}\n </BackofficeFormSection>\n\n {showResult && (\n <div className={styles.resultSection}>\n {resultValue != null && resultLabel != null && (\n <HighlightCode\n badgeLabel={resultLabel}\n copyCode={resultValue}\n fallbackCodeText={resultValue}\n />\n )}\n {resultRender}\n </div>\n )}\n </Form>\n </Modal>\n <EntityIdPickerDialog\n isOpen={activeEntityPicker != null}\n entity={activeEntityPicker?.entity ?? ''}\n title={activeEntityPicker?.label ?? ''}\n onClose={() => {\n setActiveEntityPicker(null);\n }}\n onSelectId={(id) => {\n if (activeEntityPicker == null) {\n return;\n }\n setFieldValue(activeEntityPicker.fieldId, id);\n setActiveEntityPicker(null);\n }}\n />\n </>\n );\n};\n\nexport default BackofficeEntityActionFormDialog;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeEntityDetailPage-CIyGKwVP.js","names":[],"sources":["../../src/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.tsx","../../src/components/backoffice/detail/BackofficeDetailFlagTag.css.ts","../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx","../../src/components/backoffice/detail/backofficeDetailTaggedValue.css.ts","../../src/components/backoffice/detail/BackofficeDetailTaggedValue.tsx","../../src/components/backoffice/detail/backofficeDetailErrorList.css.ts","../../src/components/backoffice/detail/BackofficeDetailErrorList.tsx","../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx","../../src/pages/backofficeEntityDetailPage.css.ts","../../src/i18n/useBackofficeFormats.ts","../../src/pages/detail/buildTabsItems.ts","../../src/pages/BackofficeEntityDetailPage.helpers.ts","../../src/pages/BackofficeEntityDetailPage.view-helpers.ts","../../src/pages/BackofficeEntityDetailPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityDetailScaffoldProps<\n NodeUnion extends { __typename: string },\n> = {\n node: NodeUnion | null | undefined;\n render: (node: NodeUnion) => JSX.Element | null;\n notFound?: ReactNode;\n};\n\nexport const BackofficeEntityDetailScaffold = <\n NodeUnion extends { __typename: string },\n>({\n node,\n render,\n notFound,\n}: BackofficeEntityDetailScaffoldProps<NodeUnion>): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedNotFound = notFound ?? t('detail.notFound');\n if (node == null) {\n return <>{resolvedNotFound}</>;\n }\n\n const content = render(node);\n if (content == null) {\n return <>{resolvedNotFound}</>;\n }\n\n return content;\n};\n\nexport default BackofficeEntityDetailScaffold;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui';\n\nexport const content = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const icon = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n }),\n {\n flex: '0 0 auto',\n },\n]);\n\nexport const label = style({\n flex: '0 1 auto',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Tag, type TagTone } from '@plumile/ui';\n\nimport * as styles from './BackofficeDetailFlagTag.css.js';\n\nexport type BackofficeDetailFlagTagProps = {\n tone: TagTone;\n icon?: ReactNode;\n label: string;\n};\n\nexport const BackofficeDetailFlagTag = ({\n tone,\n icon,\n label,\n}: BackofficeDetailFlagTagProps): JSX.Element => {\n const hasIcon = icon != null;\n let iconNode: ReactNode | null = null;\n if (hasIcon) {\n iconNode = <span className={styles.icon}>{icon}</span>;\n }\n\n return (\n <Tag tone={tone}>\n <span className={styles.content}>\n {iconNode}\n <span className={styles.label}>{label}</span>\n </span>\n </Tag>\n );\n};\n\nexport default BackofficeDetailFlagTag;\n","import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const value = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeBadgeTone } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailTaggedValue.css.js';\n\nexport type BackofficeDetailTaggedValueProps = {\n tag: { label: string; tone?: BackofficeBadgeTone } | null;\n value: ReactNode;\n};\n\nexport const BackofficeDetailTaggedValue = ({\n tag,\n value,\n}: BackofficeDetailTaggedValueProps): JSX.Element => {\n return (\n <span className={styles.container}>\n {tag != null && <Tag tone={tag.tone}>{tag.label}</Tag>}\n <span className={styles.value}>{value}</span>\n </span>\n );\n};\n\nexport default BackofficeDetailTaggedValue;\n","import { sprinkles } from '@plumile/ui';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const item = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderRadius: 'xl',\n});\n\nexport const itemSurface = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const code = sprinkles({\n fontFamily: 'mono',\n fontSize: 'sm',\n color: 'textMuted',\n});\n\nexport const message = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const details = sprinkles({\n fontSize: 'sm',\n});\n","import { type JSX } from 'react';\n\nimport { LazyMarkdownRenderer, cx } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { BackofficeDetailSection } from './BackofficeDetailSection.js';\nimport { formatJsonPayload } from './detailPayloadUtils.js';\n\nimport * as styles from './backofficeDetailErrorList.css.js';\n\nexport type BackofficeDetailErrorItem = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type BackofficeDetailErrorListProps = {\n title: string;\n description?: string;\n items: readonly BackofficeDetailErrorItem[];\n};\n\nexport const BackofficeDetailErrorList = ({\n title,\n description,\n items,\n}: BackofficeDetailErrorListProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <div className={styles.list}>\n {items.map((error, index) => {\n let details = t('common.notAvailable');\n if (error.details != null) {\n details = formatJsonPayload(error.details);\n }\n return (\n <div\n key={`${error.code}-${index}`}\n className={cx(styles.item, styles.itemSurface)}\n >\n <div className={styles.header}>\n <span className={styles.code}>{error.code}</span>\n <span className={styles.message}>{error.message}</span>\n </div>\n <div className={styles.details}>\n <LazyMarkdownRenderer content={details} />\n </div>\n </div>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeDetailErrorList;\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.js';\nimport { useBackofficeLoadMore } from '../../../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../../../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n target: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeResolvedListFacetConfig;\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n targetId: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n whereKey,\n value,\n path,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n if (config.list.kind === 'records') {\n return null;\n }\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<BackofficeListState<unknown, string>>({\n where: listDefaults.where as never,\n sort: listDefaults.sort ?? null,\n });\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(\n state.where as Record<string, unknown> | null,\n whereKey as never,\n value,\n path,\n );\n }, [path, state.where, value, whereKey]);\n\n const effectiveWhere = relationWhere ?? (state.where as never);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere as never,\n sort: resolvedSort as never,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n if (listConfig.buildVariables != null) {\n return listConfig.buildVariables(variablesBase as never);\n }\n return variablesBase;\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables as never,\n { fetchPolicy: 'store-or-network' },\n );\n\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n }, [entities, listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row as never);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? (listDefaults.where as never);\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { onRefresh } = useBackofficeListRefetch({\n refetch: refetch as never,\n variables: variablesBase as never,\n defaults: defaults as never,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildVariables: listConfig.buildVariables as never,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next as never);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n targetId,\n whereKey,\n value,\n path,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [targetId];\n }, [targetId]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return null;\n }\n\n const config = relatedEntitiesState.modules[targetId]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n entities={entities}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n target,\n whereKey,\n value,\n path,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <BackofficeTableSkeleton rows={6} />;\n }}\n >\n <Suspense fallback={<BackofficeTableSkeleton rows={6} />}>\n <RelationListBlockBody\n title={title}\n targetId={target}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n","import { sprinkles } from '@plumile/ui';\n\nexport const headerActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const headerBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const headerMeta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const headerMetaList = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { useBackofficeReactTranslation } from './useBackofficeReactTranslation.js';\n\nexport type BackofficeFormats = {\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatPercent: (value: number | null | undefined) => string;\n};\n\n/**\n *\n */\nexport function useBackofficeFormats(): BackofficeFormats {\n const { t } = useBackofficeReactTranslation();\n\n /**\n *\n */\n function formatNumber(value: number | null | undefined): string {\n return t('format.number', { value });\n }\n\n /**\n *\n */\n function formatCurrency(value: number | null | undefined): string {\n return t('format.currency', { value });\n }\n\n /**\n *\n */\n function formatPercent(value: number | null | undefined): string {\n return t('format.percent', { value });\n }\n\n return { formatNumber, formatCurrency, formatPercent };\n}\n","import type { BackofficeDetailPageRouteSpec } from '@plumile/backoffice-core/types.js';\nimport type { BackofficeTabItem } from '@plumile/ui';\nimport type { TFunction } from 'i18next';\n\ntype DetailPage<Node> = BackofficeDetailPageRouteSpec<Node>;\n\nexport const buildTabsItems = <Node>(input: {\n pages: readonly DetailPage<Node>[];\n id: string;\n tApp: TFunction;\n detailPageHref: (id: string, pageId: string) => string;\n}): readonly BackofficeTabItem[] => {\n return input.pages.map((page) => {\n return {\n id: page.id,\n label: page.label(input.tApp),\n to: input.detailPageHref(input.id, page.id),\n };\n });\n};\n","import type {\n BackofficeBadgeTone,\n BackofficeEntityActionSpec,\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeValueLabel,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { MutationPayloadBase } from '../relay/mutationResult.js';\nimport type { TFunction } from 'i18next';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isPlainObject = (\n value: unknown,\n): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nexport const extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value as MutationPayloadBase;\n }\n }\n\n return null;\n};\n\nexport const isRouteAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityRouteActionSpec<Node> => {\n return action.kind === 'route';\n};\n\nexport const isMutationAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityMutationActionSpec<Node> => {\n return action.kind === 'mutation';\n};\n\nexport const isFormMutationAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityFormMutationActionSpec<Node> => {\n return action.kind === 'formMutation';\n};\n\nexport const resolveValueLabel = (\n value: BackofficeValueLabel | null | undefined,\n tApp: TFunction,\n): string | number | null => {\n if (typeof value === 'function') {\n return value(tApp);\n }\n if (value == null) {\n return null;\n }\n return value;\n};\n\nexport const resolveRelationValue = (value: string | null): string | null => {\n if (value == null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nexport const isEmptyText = (\n value: string | number | null | undefined,\n): boolean => {\n if (value == null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n return false;\n};\n\nexport const resolveBadgeTone = <Node>(\n tone: BackofficeBadgeTone | ((node: Node) => BackofficeBadgeTone) | undefined,\n node: Node,\n): BackofficeBadgeTone | undefined => {\n if (typeof tone === 'function') {\n return tone(node);\n }\n return tone;\n};\n","/* eslint-disable no-ternary */\nimport type {\n BackofficeBadgeItem,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFieldSize,\n BackofficeFlagVariant,\n BackofficeInlineValueSpec,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { Fragment, createElement, type ReactNode } from 'react';\n\nimport {\n isEmptyText,\n resolveLabel,\n resolveBadgeTone,\n resolveRelationValue,\n resolveValueLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\n\nexport type ResolvedFieldItem = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport type ResolvedHeaderItem = {\n id: string;\n label: string;\n value: ReactNode;\n};\n\nexport type FlagIconName =\n | 'shield-lock'\n | 'shield-off'\n | 'settings-check'\n | 'settings-x'\n | 'x-badge'\n | 'chat-check'\n | 'key'\n | 'key-off'\n | 'lock'\n | 'lock-open'\n | 'robot-check'\n | 'robot-x'\n | 'rocket'\n | 'rocket-off';\n\nexport type ResolvedFlagTag = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n iconName?: FlagIconName;\n};\n\nexport const resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): ResolvedFlagTag => {\n switch (variant) {\n case 'yesNo':\n return value\n ? { tone: 'success', label: t('common.boolean.yes') }\n : { tone: 'neutral', label: t('common.boolean.no') };\n case 'capability':\n return value\n ? {\n tone: 'success',\n label: t('flags.capability.allowed'),\n iconName: 'shield-lock',\n }\n : {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n iconName: 'shield-off',\n };\n case 'enabled':\n return value\n ? {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n iconName: 'settings-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n iconName: 'settings-x',\n };\n case 'failure':\n return value\n ? {\n tone: 'danger',\n label: t('flags.failure.failed'),\n iconName: 'x-badge',\n }\n : {\n tone: 'success',\n label: t('flags.failure.ok'),\n iconName: 'chat-check',\n };\n case 'encrypted':\n return value\n ? {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n iconName: 'key',\n }\n : {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n iconName: 'key-off',\n };\n case 'locked':\n return value\n ? {\n tone: 'warning',\n label: t('flags.locked.locked'),\n iconName: 'lock',\n }\n : {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n iconName: 'lock-open',\n };\n case 'default':\n return value\n ? { tone: 'info', label: t('flags.default.default') }\n : { tone: 'neutral', label: t('flags.default.notDefault') };\n case 'agentManaged':\n return value\n ? {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n iconName: 'robot-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n iconName: 'robot-x',\n };\n case 'deployedProduction':\n return value\n ? {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n iconName: 'rocket',\n }\n : {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n iconName: 'rocket-off',\n };\n case 'forced':\n return value\n ? { tone: 'warning', label: t('flags.forced.forced') }\n : { tone: 'neutral', label: t('flags.forced.normal') };\n default:\n throw new Error(`Unsupported flag variant: ${String(variant)}`);\n }\n};\n\nexport const resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return renderLink(href, label);\n};\n\nexport const resolveHeaderMeta = <Node>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderDate, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n return renderDate(meta.value(node), fallback);\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return renderLink(href, labelValue);\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nexport const resolveHeaderStatus = <Node>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n renderers: {\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n },\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return renderers.renderBadgeRow(items);\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return renderers.renderTag(tone, label);\n};\n\nexport const buildFieldItems = <Node, RelationItem>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatPercent: (value: number | null | undefined) => string;\n relationEntityListRoutes: Record<string, string>;\n resolveRelationItem: (args: {\n id: string;\n label: string;\n count: number | null;\n entityId: string;\n filterId?: string;\n listRoute: string;\n path?: readonly string[];\n value: string;\n where: Record<string, unknown>;\n whereKey: string;\n }) => RelationItem;\n setWhereValue: (\n where: Record<string, unknown> | null,\n whereKey: string,\n value: string,\n path?: readonly string[],\n ) => Record<string, unknown> | null;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderFlagTag: (tag: ResolvedFlagTag) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderTaggedValue: (tag: unknown, value: ReactNode) => ReactNode;\n wrapCustomNode: (id: string, node: ReactNode) => ReactNode;\n },\n): {\n items: ResolvedFieldItem[];\n relationItems: RelationItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n setWhereValue,\n renderTag,\n renderBadgeRow,\n renderDate,\n renderFlagTag,\n renderLink,\n renderTaggedValue,\n wrapCustomNode,\n } = options;\n const items: ResolvedFieldItem[] = [];\n const relationItems: RelationItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: label.trim() !== '' ? renderTag(tone, label) : null,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeItems.length > 0 ? renderBadgeRow(badgeItems) : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: renderDate(field.value(node), fallback),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: string | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n formatted = formatCurrency(value);\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value != null\n ? renderFlagTag(resolveFlagTag(field.variant, value, t))\n : null,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n value = href != null ? renderLink(href, label) : label;\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n href != null && href.trim() !== '' && !isEmptyText(labelValue)\n ? renderLink(href, labelValue)\n : null,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const valueNode = resolveInlineValue(field.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n resolvedTag != null || valueNode != null\n ? renderTaggedValue(resolvedTag, valueNode)\n : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'relation': {\n const value = resolveRelationValue(field.value(node));\n if (value == null) {\n break;\n }\n const listRoute = relationEntityListRoutes[field.entity];\n if (listRoute == null) {\n break;\n }\n const where = setWhereValue(null, field.whereKey, value, field.path);\n if (where == null) {\n break;\n }\n relationItems.push(\n resolveRelationItem({\n id,\n label: resolveLabel(field.label, tApp),\n count: field.count?.(node) ?? null,\n entityId: field.entity,\n filterId: field.filterId,\n listRoute,\n path: field.path,\n value,\n where,\n whereKey: field.whereKey,\n }),\n );\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(wrapCustomNode(id, custom));\n break;\n }\n default:\n break;\n }\n });\n\n return { items, relationItems, customNodes };\n};\n\nexport const resolveHeaderItems = <Node>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly ResolvedHeaderItem[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n renderDate,\n renderTag,\n renderBadgeRow,\n } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const title =\n resolvedTitle.trim() === ''\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const { subtitleItems } = header;\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n subtitleItems.forEach((item, index) => {\n parts.push(\n createElement(\n 'span',\n { key: item.id },\n resolveInlineValue(item.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n }),\n ),\n );\n if (index < subtitleItems.length - 1) {\n parts.push(createElement('span', { key: `${item.id}-sep` }, separator));\n }\n });\n subtitleNode = createElement('span', null, ...parts);\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n header.badges?.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n badgeNodes.push(\n renderTag(resolveBadgeTone(badge.tone, node), `${label}: ${value}`),\n );\n if (typeof badgeNodes[badgeNodes.length - 1] === 'object') {\n badgeNodes[badgeNodes.length - 1] = createElement(\n Fragment,\n { key: `${label}-${index}` },\n badgeNodes[badgeNodes.length - 1],\n );\n }\n });\n\n const status =\n header.status != null\n ? resolveHeaderStatus(header.status, node, tApp, {\n renderBadgeRow,\n renderTag,\n })\n : undefined;\n\n const items = header.meta?.map((meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n return {\n id: `${label}-${index}`,\n label,\n value: resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n renderDate,\n renderLink,\n }),\n };\n });\n\n return {\n title,\n subtitle: subtitleNode,\n badges:\n badgeNodes.length > 0\n ? createElement(Fragment, null, ...badgeNodes)\n : undefined,\n status,\n items,\n };\n};\n\nexport const renderBlocks = <Node>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n renderCustomSection: (\n key: string,\n title: string,\n child: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (key: string, node: ReactNode) => ReactNode;\n renderRelationList: (args: {\n key: string;\n title: string;\n target: string;\n whereKey: string;\n value: string | null | undefined;\n path?: readonly string[];\n }) => ReactNode;\n resolveTableColumns: (columns: readonly unknown[]) => unknown;\n renderTable: (args: {\n key: string;\n title: string;\n description?: string;\n columns: unknown;\n rows: readonly unknown[];\n }) => ReactNode;\n renderJson: (args: {\n key: string;\n title: string;\n description?: string;\n value: unknown;\n }) => ReactNode;\n renderCode: (args: {\n key: string;\n title: string;\n description?: string;\n value: string;\n outputLabel: string;\n }) => ReactNode;\n renderPayload: (args: {\n key: string;\n title: string;\n description?: string;\n content: unknown;\n format?: string;\n }) => ReactNode;\n renderErrorList: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly unknown[];\n }) => ReactNode;\n renderKeyValueListSection: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly { id: string; label: string; value: ReactNode }[];\n }) => ReactNode;\n },\n): ReactNode[] => {\n const { tApp, t, keyPrefix } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index): ReactNode => {\n const key =\n keyPrefix != null\n ? `${keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n return options.renderCustomSection(\n key,\n resolveLabel(block.label, tApp),\n custom,\n );\n }\n return options.wrapCustomNode(key, custom);\n }\n\n const title = resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'relationList') {\n return options.renderRelationList({\n key,\n title,\n target: block.target,\n whereKey: block.whereKey,\n value: block.value(node),\n path: block.path,\n });\n }\n\n if (block.kind === 'table') {\n return options.renderTable({\n key,\n title,\n description,\n columns: options.resolveTableColumns(\n block.columns as readonly unknown[],\n ),\n rows: block.rows(node) as readonly unknown[],\n });\n }\n\n if (block.kind === 'json') {\n return options.renderJson({\n key,\n title,\n description,\n value: block.value(node),\n });\n }\n\n if (block.kind === 'code') {\n return options.renderCode({\n key,\n title,\n description,\n value: block.value(node),\n outputLabel: t('tools.output'),\n });\n }\n\n if (block.kind === 'payload') {\n return options.renderPayload({\n key,\n title,\n description,\n content: block.value(node),\n format: block.format,\n });\n }\n\n if (block.kind === 'errorList') {\n return options.renderErrorList({\n key,\n title,\n description,\n items: block.errors(node),\n });\n }\n\n const items = block.items.map((item, itemIndex) => {\n const label = resolveLabel(item.label, tApp);\n const resolvedValue = resolveValueLabel(item.value(node), tApp);\n return {\n id: `${label}-${itemIndex}`,\n label,\n value: resolvedValue ?? t('common.notAvailable'),\n };\n });\n\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items,\n });\n });\n};\n","/* eslint-disable no-ternary */\nimport { type JSX, type ReactNode, useContext, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n type PreloadedQuery,\n useFragment,\n usePreloadedQuery,\n} from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport { resolveMutationOutcome } from '../relay/mutationResult.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeResolvedDetailLayoutFacetConfigBase,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeResolvedDetailPageFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\nimport {\n BackofficeKeyValueList,\n BackofficePageHeader,\n BackofficeRelationsMenu,\n BackofficeTabs,\n type BackofficeRelationsMenuItem,\n type BackofficeTabItem,\n Button,\n ChatCheckSvg,\n DataTable,\n DetailPageTemplate,\n FormattedDate,\n HighlightCode,\n KeyOffSvg,\n KeySvg,\n LazyBackofficeJsonViewer,\n LinkButton,\n LockOpenSvg,\n LockSvg,\n RobotCheckSvg,\n RobotXSvg,\n RocketOffSvg,\n RocketSvg,\n SettingsCheckSvg,\n SettingsXSvg,\n ShieldLockSvg,\n ShieldOffSvg,\n Tag,\n useToast,\n XBadgeSvg,\n} from '@plumile/ui';\nimport { HttpRedirect, Link, RoutingContext } from '@plumile/router';\n\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeEntityDetailScaffold } from '../components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js';\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeDetailFlagTag } from '../components/backoffice/detail/BackofficeDetailFlagTag.js';\nimport { BackofficeDetailTaggedValue } from '../components/backoffice/detail/BackofficeDetailTaggedValue.js';\nimport { BackofficeDetailPayload } from '../components/backoffice/detail/BackofficeDetailPayload.js';\nimport { BackofficeDetailErrorList } from '../components/backoffice/detail/BackofficeDetailErrorList.js';\nimport { BackofficeDetailRelationListBlock } from '../components/backoffice/detail/BackofficeDetailRelationListBlock.js';\nimport { BackofficeDetailSection } from '../components/backoffice/detail/BackofficeDetailSection.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from '../components/backoffice/actions/toastViewAction.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport { useBackofficeFormats } from '../i18n/useBackofficeFormats.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityDetailLayoutContext } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n extractMutationPayload,\n isFormMutationAction,\n isMutationAction,\n isRouteAction,\n resolveLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport {\n buildFieldItems,\n renderBlocks,\n resolveHeaderItems,\n type FlagIconName,\n} from './BackofficeEntityDetailPage.view-helpers.js';\n\nexport type BackofficeEntityDetailPageProps = {\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n prepared: {\n id: string;\n detailId?: string;\n pageConfig: BackofficeResolvedDetailPageFacetConfigBase;\n pageQuery: PreloadedQuery<OperationType>;\n pageId: string;\n pagePath: string;\n };\n};\n\nconst renderFlagIcon = (iconName: FlagIconName): JSX.Element => {\n const iconSize = 14;\n switch (iconName) {\n case 'shield-lock':\n return (\n <ShieldLockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'shield-off':\n return (\n <ShieldOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'settings-check':\n return (\n <SettingsCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n );\n case 'settings-x':\n return (\n <SettingsXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'x-badge':\n return (\n <XBadgeSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'chat-check':\n return (\n <ChatCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'key':\n return <KeySvg width={iconSize} height={iconSize} aria-hidden=\"true\" />;\n case 'key-off':\n return (\n <KeyOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'lock':\n return <LockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />;\n case 'lock-open':\n return (\n <LockOpenSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'robot-check':\n return (\n <RobotCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'robot-x':\n return (\n <RobotXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'rocket':\n return (\n <RocketSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'rocket-off':\n return (\n <RocketOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n default:\n throw new Error(`Unsupported flag icon: ${String(iconName)}`);\n }\n};\n\nconst BackofficeEntityDetailPageContent = ({\n config,\n prepared,\n}: {\n config: BackofficeResolvedDetailPageFacetConfig;\n prepared: {\n pageQuery: PreloadedQuery<OperationType>;\n id: string;\n detailId?: string;\n pageId: string;\n pagePath: string;\n };\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { formatNumber, formatCurrency, formatPercent } =\n useBackofficeFormats();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const [actionState, setActionState] = useState<Record<string, boolean>>({});\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n const activePage = resolvedPages.activePage ?? config.pages.mainPage;\n const pages =\n resolvedPages.pages.length > 0\n ? resolvedPages.pages\n : [config.pages.mainPage];\n\n const setActionLoading = (actionId: string, isLoading: boolean) => {\n setActionState((prev) => {\n if (prev[actionId] === isLoading) {\n return prev;\n }\n return { ...prev, [actionId]: isLoading };\n });\n };\n\n const { page } = config;\n\n const pageQueryData = usePreloadedQuery(page.query, prepared.pageQuery);\n const pageNodeRef = page.resolveNode(pageQueryData as never, {\n id: prepared.id,\n detailId: prepared.detailId,\n });\n if (pageNodeRef == null) {\n throw new HttpRedirect(config.routes.list);\n }\n const resolvedNode = useFragment(page.fragment, pageNodeRef as never);\n const relationEntityListRoutes = useMemo(() => {\n return Object.fromEntries(\n page.content\n .flatMap((block) => {\n if (block.kind !== 'section') {\n return [];\n }\n\n return block.fields.flatMap((field) => {\n if (field.type !== 'relation') {\n return [];\n }\n return [field.entity];\n });\n })\n .flatMap((entityId) => {\n const entityManifest = entities[entityId];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n return [[entityId, entityManifest.routes.list]];\n }),\n ) as Record<string, string>;\n }, [entities, page.content]);\n\n return (\n <BackofficeEntityDetailScaffold\n node={resolvedNode as { __typename: string } | null | undefined}\n render={(node) => {\n const view = page.toView(node);\n const tabsItems = buildTabsItems({\n pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const resolveRelationItem = ({\n id,\n label,\n count,\n entityId,\n filterId,\n listRoute,\n path,\n value,\n where,\n whereKey,\n }: {\n id: string;\n label: string;\n count: number | null;\n entityId: string;\n filterId?: string;\n listRoute: string;\n path?: readonly string[];\n value: string;\n where: Record<string, unknown>;\n whereKey: string;\n }): BackofficeRelationsMenuItem => {\n const loadedEntity = entityRegistry.getLoadedListEntity(entityId);\n return {\n id,\n label,\n count,\n href:\n loadedEntity == null\n ? buildBackofficeFallbackListHref(listRoute, where, [\n {\n id:\n filterId ??\n (path == null\n ? whereKey\n : `${whereKey}.${path.join('.')}`),\n value,\n },\n ])\n : buildBackofficeListHref(loadedEntity.config, { where }),\n onClick: async (event) => {\n if (\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n\n const listEntity = await entityRegistry.loadListEntity(entityId);\n const next = buildBackofficeListLink(listEntity.config, {\n where,\n });\n\n routing.history.push({\n pathname: next.pathname,\n search: next.search === '' ? '' : `?${next.search}`,\n hash: '',\n });\n },\n };\n };\n\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n });\n\n const actions = page.actions ?? [];\n let headerActionButtons: ReactNode[] = [];\n if (actions.length > 0) {\n const visibleActions = actions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(view);\n });\n\n if (visibleActions.length > 0) {\n headerActionButtons = visibleActions.map((action) => {\n const label = resolveLabel(action.label, tApp);\n const ariaLabel =\n action.ariaLabel != null\n ? resolveLabel(action.ariaLabel, tApp)\n : label;\n const variant = action.variant ?? 'secondary';\n const size = action.size ?? 'small';\n const isLoading = actionState[action.id] ?? false;\n const isDisabled =\n isLoading || action.isDisabled?.(view) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(view);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={false}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n if (isMutationAction(action)) {\n const handleClick = () => {\n if (isLoading) {\n return;\n }\n const variables = action.getVariables(view);\n setActionLoading(action.id, true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, view);\n },\n onCompleted: (response) => {\n setActionLoading(action.id, false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t(\n 'actions.form.errors.invalidPayload',\n );\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.title,\n tApp,\n );\n }\n\n const outcome = resolveMutationOutcome(\n mutationPayload,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(\n reason,\n view,\n );\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n },\n );\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, view);\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.success,\n tApp,\n );\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node: view,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n },\n onError: (error) => {\n setActionLoading(action.id, false);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n },\n });\n };\n\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={isLoading}\n disabled={isDisabled}\n onClick={handleClick}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n });\n }\n }\n\n const activeFormAction = actions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const { content } = page;\n\n const primaryNodes: ReactNode[] = [];\n const secondaryNodes: ReactNode[] = [];\n const relationMenuItems: BackofficeRelationsMenuItem[] = [];\n\n content.forEach((item, index) => {\n const placement = item.placement ?? 'primary';\n const targetNodes =\n placement === 'secondary' ? secondaryNodes : primaryNodes;\n\n if (item.kind === 'section') {\n const sectionLabel = resolveLabel(item.title, tApp);\n const description =\n item.description != null\n ? resolveLabel(item.description, tApp)\n : undefined;\n const { items, relationItems, customNodes } = buildFieldItems(\n item.fields,\n view,\n {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n setWhereValue,\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderFlagTag: (tag) => {\n return (\n <BackofficeDetailFlagTag\n tone={tag.tone}\n icon={\n tag.iconName != null\n ? renderFlagIcon(tag.iconName)\n : undefined\n }\n label={tag.label}\n />\n );\n },\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderTaggedValue: (tag, value) => {\n return (\n <BackofficeDetailTaggedValue\n tag={tag as never}\n value={value}\n />\n );\n },\n wrapCustomNode: (id, custom) => {\n return <div key={id}>{custom}</div>;\n },\n },\n );\n relationItems.forEach((relation) => {\n if (\n !relationMenuItems.some((entry) => {\n return entry.id === relation.id;\n })\n ) {\n relationMenuItems.push(relation);\n }\n });\n\n const hasContent = items.length > 0 || customNodes.length > 0;\n\n if (!hasContent) {\n return;\n }\n\n targetNodes.push(\n <BackofficeDetailSection\n key={`${sectionLabel}-${index}`}\n title={sectionLabel}\n description={description}\n items={items.length > 0 ? items : undefined}\n >\n {customNodes}\n </BackofficeDetailSection>,\n );\n return;\n }\n\n const rendered = renderBlocks([item], view, {\n tApp,\n t,\n resolveEntityHref,\n keyPrefix: String(index),\n renderCustomSection: (key, title, child) => {\n return (\n <BackofficeDetailSection key={key} title={title}>\n {child}\n </BackofficeDetailSection>\n );\n },\n wrapCustomNode: (key, custom) => {\n return <div key={key}>{custom}</div>;\n },\n renderRelationList: ({\n key,\n title,\n target,\n whereKey,\n value,\n path,\n }) => {\n return (\n <BackofficeDetailRelationListBlock\n key={key}\n title={title}\n target={target}\n whereKey={whereKey}\n value={value ?? null}\n path={path}\n />\n );\n },\n resolveTableColumns: (columns) => {\n return buildDataTableColumns(columns as never, {\n tApp,\n t,\n resolveEntityHref,\n });\n },\n renderTable: ({ key, title, description, columns, rows }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <DataTable\n columns={columns as never}\n rows={rows as never}\n getRowId={(row, rowIndex) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const maybeId = record.id;\n if (\n typeof maybeId === 'string' &&\n maybeId.trim() !== ''\n ) {\n return maybeId;\n }\n }\n return String(rowIndex);\n }}\n />\n </BackofficeDetailSection>\n );\n },\n renderJson: ({ key, title, description, value }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <LazyBackofficeJsonViewer value={value} title={title} />\n </BackofficeDetailSection>\n );\n },\n renderCode: ({ key, title, description, value, outputLabel }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <HighlightCode\n badgeLabel={outputLabel}\n copyCode={value}\n fallbackCodeText={value}\n />\n </BackofficeDetailSection>\n );\n },\n renderPayload: ({ key, title, description, content, format }) => {\n return (\n <BackofficeDetailPayload\n key={key}\n title={title}\n description={description}\n content={content}\n format={format as never}\n />\n );\n },\n renderErrorList: ({ key, title, description, items }) => {\n return (\n <BackofficeDetailErrorList\n key={key}\n title={title}\n description={description}\n items={items as never}\n />\n );\n },\n renderKeyValueListSection: ({ key, title, description, items }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficeKeyValueList items={items as never} />\n </BackofficeDetailSection>\n );\n },\n });\n const blockNode = rendered[0];\n if (blockNode != null) {\n targetNodes.push(blockNode);\n }\n });\n\n const relationsMenuNode =\n relationMenuItems.length > 0 ? (\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n ) : null;\n\n const headerActions =\n headerActionButtons.length > 0 || relationsMenuNode != null ? (\n <div className={pageStyles.headerActions}>\n {headerActionButtons}\n {relationsMenuNode}\n </div>\n ) : undefined;\n\n const headerMetaNode =\n header.status != null || header.badges != null ? (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n ) : undefined;\n\n const headerItemsNode =\n header.items != null && header.items.length > 0 ? (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n ) : null;\n\n const hasAside = secondaryNodes.length > 0;\n let tabsNode: JSX.Element | null = null;\n if (pages.length > 1) {\n tabsNode = (\n <BackofficeTabs\n items={tabsItems as BackofficeTabItem[]}\n activeId={activePage.id}\n onChange={() => {}}\n />\n );\n }\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n actions={headerActions}\n meta={headerMetaNode}\n />\n {headerItemsNode}\n </div>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n sidePanel={hasAside ? <>{secondaryNodes}</> : undefined}\n sidePanelVariant=\"plain\"\n >\n <>{primaryNodes}</>\n </DetailPageTemplate>\n {activeFormAction != null &&\n isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={view}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n />\n )}\n </BackofficeRightPageLayout>\n );\n }}\n />\n );\n};\n\nexport const BackofficeEntityDetailPage = ({\n config,\n prepared,\n}: BackofficeEntityDetailPageProps): JSX.Element => {\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n if (resolvedPages.activePage.id !== prepared.pageId) {\n throw new HttpRedirect(\n config.routes.detailPage(prepared.id, resolvedPages.activePage.id),\n );\n }\n\n return (\n <BackofficeEntityDetailPageContent\n config={prepared.pageConfig}\n prepared={prepared}\n />\n );\n};\n\nexport default BackofficeEntityDetailPage;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeEntityListPage-DmZozSNk.js","names":[],"sources":["../../src/components/backoffice/list/RowFlagsCell.css.ts","../../src/components/backoffice/list/RowFlagsCell.tsx","../../src/pages/backofficeEntityListPage.css.ts","../../src/pages/BackofficeEntityListPage.helpers.tsx","../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nexport const rowFlagsColumnCell = style({\n justifyContent: 'center',\n padding: '0 4px',\n});\n\nexport const container = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n width: '100%',\n});\n\nexport const flag = style({\n display: 'grid',\n placeItems: 'center',\n width: 24,\n height: 24,\n});\n","import { useMemo, type JSX, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeRowFlagSpec } from '@plumile/backoffice-core/types.js';\n\nimport * as styles from './RowFlagsCell.css.js';\n\nexport type RowFlagsCellProps<Row> = {\n row: Row;\n flags: readonly BackofficeRowFlagSpec<Row>[];\n tApp: TFunction;\n};\n\n/**\n * Renders row-level flags (icons) in a dedicated compact column.\n */\nexport const RowFlagsCell = <Row,>({\n row,\n flags,\n tApp,\n}: RowFlagsCellProps<Row>): JSX.Element => {\n const resolved = useMemo(() => {\n const out: { id: string; node: ReactNode; label: string }[] = [];\n for (const flag of flags) {\n const node = flag.render(row) as ReactNode;\n if (node != null && node !== '' && node !== false) {\n out.push({ id: flag.id, node, label: flag.label(row)(tApp) });\n }\n }\n return out;\n }, [flags, row, tApp]);\n\n const ariaLabel = resolved\n .map((entry) => {\n return entry.label.trim();\n })\n .filter((label) => {\n return label !== '';\n })\n .join(', ');\n\n let ariaLabelProp: string | undefined;\n if (ariaLabel !== '') {\n ariaLabelProp = ariaLabel;\n }\n\n return (\n <div className={styles.container} aria-label={ariaLabelProp}>\n {resolved.map((entry) => {\n return (\n <span\n key={entry.id}\n className={styles.flag}\n title={entry.label}\n role=\"img\"\n aria-label={entry.label}\n >\n {entry.node}\n </span>\n );\n })}\n </div>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui';\n\nexport const headerActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actionsColumnCell = style({\n justifyContent: 'flex-end',\n});\n\nexport const actionTrigger = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2rem',\n height: '2rem',\n flexShrink: 0,\n});\n","import type { ComponentProps, JSX } from 'react';\n\nimport type {\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeListActionSpec,\n BackofficeRecordListConfig,\n BackofficeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { Button, DataTableColumn } from '@plumile/ui';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeSizedDataTableColumn } from '../components/backoffice/columns/buildDataTableColumns.js';\n\ntype ButtonVariant = ComponentProps<typeof Button>['variant'];\n\nconst ROW_FLAGS_SLOT_PX = 24;\nconst ROW_FLAGS_GAP_PX = 6;\nconst ROW_FLAGS_PADDING_X_PX = 4;\n\nconst ACTIONS_SLOT_PX = 32;\nconst ACTIONS_GAP_PX = 8;\nconst ACTIONS_PADDING_X_PX = 12;\nconst ACTIONS_SAFETY_PX = 4;\n\nconst listColumnTrackBySize: Record<\n BackofficeSizedDataTableColumn<unknown>['size'],\n string\n> = {\n xs: 'minmax(56px, 76px)',\n s: 'minmax(88px, 120px)',\n m: 'minmax(120px, 168px)',\n l: 'minmax(160px, 220px)',\n xl: 'minmax(220px, 300px)',\n fluid: 'minmax(0, 1fr)',\n};\n\nexport const computeRowFlagsColumnWidthPx = (flagCount: number): number => {\n if (flagCount <= 0) {\n return 0;\n }\n return (\n ROW_FLAGS_PADDING_X_PX * 2 +\n ROW_FLAGS_SLOT_PX * flagCount +\n ROW_FLAGS_GAP_PX * Math.max(0, flagCount - 1)\n );\n};\n\nexport const computeActionsColumnWidthPx = (actionCount: number): number => {\n if (actionCount <= 0) {\n return 0;\n }\n return (\n ACTIONS_SAFETY_PX +\n ACTIONS_PADDING_X_PX * 2 +\n ACTIONS_SLOT_PX * actionCount +\n ACTIONS_GAP_PX * Math.max(0, actionCount - 1)\n );\n};\n\nexport const resolveTrackBySize = (\n column: DataTableColumn<unknown>,\n fallback: string,\n): string => {\n if ('size' in column && typeof column.size === 'string') {\n return listColumnTrackBySize[\n column.size as BackofficeSizedDataTableColumn<unknown>['size']\n ];\n }\n return fallback;\n};\n\nexport const isRouteAction = (\n action: BackofficeListActionSpec,\n): action is BackofficeEntityRouteActionSpec<null> => {\n return action.kind === 'route';\n};\n\nexport const isFormMutationAction = (\n action: BackofficeListActionSpec,\n): action is BackofficeEntityFormMutationActionSpec<null> => {\n return action.kind === 'formMutation';\n};\n\nexport const resolveActionVariant = (\n actionVariant: ButtonVariant | undefined,\n index: number,\n): Exclude<ButtonVariant, undefined> => {\n if (actionVariant != null) {\n return actionVariant;\n }\n if (index === 0) {\n return 'primary';\n }\n return 'secondary';\n};\n\nexport const resolveRowId = (row: unknown): string | null => {\n if (row == null || typeof row !== 'object') {\n return null;\n }\n if (!('id' in row)) {\n return null;\n }\n const value = (row as { id?: unknown }).id;\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\ntype RecordListConfig = BackofficeResolvedListFacetConfig & {\n list: BackofficeRecordListConfig<\n Record<string, unknown>,\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n Record<string, unknown>\n >;\n};\n\nexport const isRecordListConfig = (\n config: BackofficeResolvedListFacetConfig,\n): config is RecordListConfig => {\n return config.list.kind === 'records';\n};\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const buildActionsColumn = (options: {\n ariaLabel: string;\n fallback: string;\n resolveDetailHref: (id: string) => string | null;\n className?: string;\n renderAction: (input: { href: string; ariaLabel: string }) => JSX.Element;\n}): DataTableColumn<unknown> => {\n const { ariaLabel, fallback, resolveDetailHref, className, renderAction } =\n options;\n\n return {\n id: 'actions',\n header: '',\n className,\n cell: (row) => {\n const id = resolveRowId(row);\n if (id == null) {\n return fallback;\n }\n const href = resolveDetailHref(id);\n if (href == null) {\n return fallback;\n }\n return renderAction({ href, ariaLabel });\n },\n };\n};\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n useFragment,\n usePaginationFragment,\n usePreloadedQuery,\n useRelayEnvironment,\n} from 'react-relay';\nimport { fetchQuery } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListRoute,\n BackofficeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport {\n Button,\n EyeSvg,\n LinkButton,\n TableCell,\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isRecordListConfig,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\ntype RecordFetchMode = 'append' | 'reset';\ntype RecordFetchInput = {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n mode: RecordFetchMode;\n};\n\nconst RECORD_FETCH_POLICY = 'store-or-network' as const;\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityRecordListPage = ({\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const environment = useRelayEnvironment();\n\n if (!isRecordListConfig(config)) {\n return null;\n }\n\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const fragmentData = useFragment(listConfig.fragment, queryData as never);\n\n const initialRows = useMemo(() => {\n return listConfig.getRows(fragmentData).map((row) => {\n return listConfig.toRow(row);\n });\n }, [fragmentData, listConfig]);\n\n const initialCursor = useMemo(() => {\n return listConfig.getNextCursor?.(queryData as never) ?? null;\n }, [listConfig, queryData]);\n\n const [rows, setRows] = useState(initialRows);\n const [nextCursor, setNextCursor] = useState(initialCursor);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n\n useEffect(() => {\n setRows(initialRows);\n setNextCursor(initialCursor);\n }, [initialCursor, initialRows]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <span className={pageStyles.actionTrigger} title={ariaLabel}>\n <LinkButton\n to={href}\n variant=\"icon\"\n size=\"small\"\n aria-label={ariaLabel}\n >\n <EyeSvg width={16} height={16} />\n </LinkButton>\n </span>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [\n config.routes,\n listConfig.columns,\n listConfig.rowFlags,\n entities,\n t,\n tApp,\n ]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const buildVariables = useCallback(\n (input: {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n }) => {\n if (listConfig.buildVariables != null) {\n return listConfig.buildVariables(input as never);\n }\n return input;\n },\n [listConfig],\n );\n\n const requestIdRef = useRef(0);\n const lastRefetchKeyRef = useRef(\n stableListVariablesKey({\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n }),\n );\n\n const runFetch = useCallback(\n async (input: RecordFetchInput) => {\n const requestId = requestIdRef.current + 1;\n requestIdRef.current = requestId;\n\n if (input.mode === 'append') {\n setIsLoadingMore(true);\n } else {\n setIsRefreshing(true);\n }\n\n try {\n const variables = buildVariables({\n where: input.where,\n sort: input.sort,\n count: input.count,\n cursor: input.cursor,\n });\n\n const response = await fetchQuery(\n environment,\n listConfig.query,\n variables as never,\n { fetchPolicy: RECORD_FETCH_POLICY },\n ).toPromise();\n\n if (response == null || requestIdRef.current !== requestId) {\n return;\n }\n\n const nextRows = listConfig.getRows(response as never).map((row) => {\n return listConfig.toRow(row);\n });\n setRows((prev) => {\n if (input.mode === 'append') {\n return [...prev, ...nextRows];\n }\n return nextRows;\n });\n const cursor = listConfig.getNextCursor?.(response as never) ?? null;\n setNextCursor(cursor);\n } finally {\n if (input.mode === 'append') {\n setIsLoadingMore(false);\n } else {\n setIsRefreshing(false);\n }\n }\n },\n [buildVariables, environment, listConfig],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {});\n }, [pageSize, resolvedSort, runFetch, state.where]);\n\n const handleRefresh = useCallback(() => {\n if (isRefreshing) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {});\n }, [isRefreshing, pageSize, resolvedSort, runFetch, state.where]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext: nextCursor != null,\n isLoadingNext: isLoadingMore,\n loadNext: (count) => {\n if (nextCursor == null) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count,\n cursor: nextCursor,\n mode: 'append',\n }).catch(() => {});\n },\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n return (\n <>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={nextCursor != null}\n isLoadingMore={isLoadingMore}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefresh}\n />\n )}\n </>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n if (isRecordListConfig(config)) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityRecordListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n />\n </BackofficeRightPageLayout>\n );\n }\n const listConfig = config.list;\n if (listConfig.kind === 'records') {\n return null;\n }\n\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <span className={pageStyles.actionTrigger} title={ariaLabel}>\n <LinkButton\n to={href}\n variant=\"icon\"\n size=\"small\"\n aria-label={ariaLabel}\n >\n <EyeSvg width={16} height={16} />\n </LinkButton>\n </span>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [\n config.routes,\n listConfig.columns,\n listConfig.rowFlags,\n entities,\n t,\n tApp,\n ]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row as never);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n\n const { onRefresh } = useBackofficeListRefetch({\n refetch: refetch as never,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildVariables: listConfig.buildVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={onRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}