@plumile/backoffice-react 0.1.125 → 0.1.131

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 (68) hide show
  1. package/lib/esm/auth/login/loginPage.css.js +1 -0
  2. package/lib/esm/auth/login/loginPage.css.js.map +1 -1
  3. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +37 -26
  4. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  5. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js +2 -1
  6. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  7. package/lib/esm/components/backoffice/detail/BackofficeKpiStrip.js +23 -23
  8. package/lib/esm/components/backoffice/detail/BackofficeKpiStrip.js.map +1 -1
  9. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -0
  10. package/lib/esm/components/backoffice/detail/backofficeKpiStrip.css.js +14 -2
  11. package/lib/esm/components/backoffice/detail/backofficeKpiStrip.css.js.map +1 -1
  12. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +64 -50
  13. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  14. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +45 -50
  15. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  16. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +2 -2
  17. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
  18. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
  19. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -1
  20. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js.map +1 -1
  21. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +0 -1
  22. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -1
  23. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -1
  24. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +1 -1
  25. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +1 -1
  26. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  27. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js +2 -1
  28. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
  29. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
  30. package/lib/esm/i18n/locales/en/backofficeReact.js +3 -3
  31. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  32. package/lib/esm/i18n/locales/fr/backofficeReact.js +3 -3
  33. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  34. package/lib/esm/i18n/useBackofficeFormats.js +28 -12
  35. package/lib/esm/i18n/useBackofficeFormats.js.map +1 -1
  36. package/lib/esm/pages/BackofficeEntityDetailPage.js +197 -196
  37. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  38. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +74 -70
  39. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  40. package/lib/esm/pages/BackofficeEntityListPage.js +46 -53
  41. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  42. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  43. package/lib/esm/pages/backofficeEntityListPage.css.js.map +1 -1
  44. package/lib/esm/pages/dashboard/dashboardPanel.css.js.map +1 -1
  45. package/lib/esm/provider/BackofficeProvider.js +1 -1
  46. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  47. package/lib/esm/style.css +1 -1
  48. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts.map +1 -1
  49. package/lib/types/components/backoffice/detail/BackofficeDetailBadgeRow.d.ts.map +1 -1
  50. package/lib/types/components/backoffice/detail/BackofficeKpiStrip.d.ts.map +1 -1
  51. package/lib/types/components/backoffice/detail/backofficeKpiStrip.css.d.ts +24 -0
  52. package/lib/types/components/backoffice/detail/backofficeKpiStrip.css.d.ts.map +1 -1
  53. package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts +1 -1
  54. package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts.map +1 -1
  55. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
  56. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts +2 -0
  57. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
  58. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
  59. package/lib/types/components/backoffice/shared/BackofficeFormattedCurrency.d.ts.map +1 -1
  60. package/lib/types/i18n/resources.d.ts +6 -6
  61. package/lib/types/i18n/useBackofficeFormats.d.ts +1 -0
  62. package/lib/types/i18n/useBackofficeFormats.d.ts.map +1 -1
  63. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  64. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +1 -0
  65. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  66. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  67. package/lib/types/pages/backofficeEntityListPage.css.d.ts.map +1 -1
  68. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIdFilterField.js","names":[],"sources":["../../../../../src/components/backoffice/filters/EntityIdFilterField.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { BackofficeSidebarPenToolSvg } from '@plumile/ui/icons/backoffice/BackofficeSidebarPenToolSvg.js';\nimport { BackofficeSidebarSearchSvg } from '@plumile/ui/icons/backoffice/BackofficeSidebarSearchSvg.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n id?: string;\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n isResolving?: boolean;\n onPick?: () => void;\n onClear?: () => void;\n disabled?: boolean;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const {\n disabled = false,\n id,\n label,\n value,\n displayValue,\n placeholder,\n ariaDescribedBy,\n ariaInvalid,\n isResolving = false,\n onPick,\n onClear,\n } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.anyEntity', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('common.actions.change');\n }\n const pickAriaLabel = `${pickLabel} ${label}`;\n const clearLabel = t('common.actions.clear');\n const clearAriaLabel = `${clearLabel} ${label}`;\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <button\n type=\"button\"\n className={styles.clearButton}\n aria-label={clearAriaLabel}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClear();\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 3L9 9M9 3L3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n let actionIcon = (\n <BackofficeSidebarSearchSvg\n className={styles.actionIcon}\n aria-hidden=\"true\"\n />\n );\n if (hasValue) {\n actionIcon = (\n <BackofficeSidebarPenToolSvg\n className={styles.actionIcon}\n aria-hidden=\"true\"\n />\n );\n }\n\n pickerNode = (\n <div className={styles.pickerControl}>\n <button\n id={id}\n type=\"button\"\n className={styles.pickerButton}\n aria-label={pickAriaLabel}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-busy={isResolving || undefined}\n disabled={disabled}\n onClick={onPick}\n >\n <span className={styles.content}>\n <span className={styles.labelText}>{label}</span>\n {displayNode}\n </span>\n </button>\n <button\n type=\"button\"\n className={styles.pickActionButton}\n aria-label={pickAriaLabel}\n title={pickAriaLabel}\n disabled={disabled}\n onClick={onPick}\n >\n {actionIcon}\n </button>\n {clearNode}\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n {pickerNode ?? <div className={styles.valueBox}>{displayNode}</div>}\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n"],"mappings":";;;;;;AAsBA,IAAa,KACX,MACgB;CAChB,IAAM,EACJ,cAAW,IACX,OACA,UACA,UACA,iBACA,aAAA,GACA,oBACA,gBACA,iBAAc,IACd,WACA,eACE,GACE,EAAE,SAAM,GAA+B,EACvC,IAAkB,GAAO,MAAM,IAAI,IACnC,IAAyB,GAAc,MAAM,IAAI,IACjD,IAAW,MAAoB,IAC/B,IAAkB,MAA2B,IAE7C,IACJ,KAAe,EAAE,kCAAkC,EAAE,UAAO,CAAC,EACzD,IAAwB,EAAE,kCAAkC,EAE9D;CACJ,AASE,IATE,IAEA,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAA8B,CAAA,GAE3D,IAEP,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA6B,CAAA,GAInE,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA2B,CAAA;CAIrE,IAAI,IAAY,EAAE,sBAAsB;CACxC,AAAI,MACF,IAAY,EAAE,wBAAwB;CAExC,IAAM,IAAgB,GAAG,EAAU,GAAG,KAEhC,IAAiB,GADJ,EAAE,uBACK,CAAW,GAAG,KAEpC,IAAgC;CACpC,AAAI,KAAY,KAAW,SACzB,IACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,cAAY;EACF;EACV,UAAU,MAAU;GAElB,AADA,EAAM,iBAAiB,EACvB,GAAS;;YAGX,kBAAC,OAAD;GACE,OAAM;GACN,QAAO;GACP,SAAQ;GACR,MAAK;GACL,eAAY;aAEZ,kBAAC,QAAD;IACE,GAAE;IACF,QAAO;IACP,aAAY;IACZ,eAAc;IACd,CAAA;GACE,CAAA;EACC,CAAA;CAIb,IAAI,IAAiC;CACrC,IAAI,KAAU,MAAM;EAClB,IAAI,IACF,kBAAC,GAAD;GACE,WAAW;GACX,eAAY;GACZ,CAAA;EAWJ,AATI,MACF,IACE,kBAAC,GAAD;GACE,WAAW;GACX,eAAY;GACZ,CAAA,GAIN,IACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,UAAD;KACM;KACJ,MAAK;KACL,WAAW;KACX,cAAY;KACZ,oBAAkB;KAClB,gBAAc;KACd,aAAW,KAAe,KAAA;KAChB;KACV,SAAS;eAET,kBAAC,QAAD;MAAM,WAAW;gBAAjB,CACE,kBAAC,QAAD;OAAM,WAAW;iBAAmB;OAAa,CAAA,EAChD,EACI;;KACA,CAAA;IACT,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,cAAY;KACZ,OAAO;KACG;KACV,SAAS;eAER;KACM,CAAA;IACR;IACG;;;CAIV,OACE,kBAAC,OAAD;EAAK,WAAW;YACb,KAAc,kBAAC,OAAD;GAAK,WAAW;aAAkB;GAAkB,CAAA;EAC/D,CAAA"}
1
+ {"version":3,"file":"EntityIdFilterField.js","names":[],"sources":["../../../../../src/components/backoffice/filters/EntityIdFilterField.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { ModalCloseSvg } from '@plumile/ui/icons/ModalCloseSvg.js';\nimport { BackofficeSidebarPenToolSvg } from '@plumile/ui/icons/backoffice/BackofficeSidebarPenToolSvg.js';\nimport { BackofficeSidebarSearchSvg } from '@plumile/ui/icons/backoffice/BackofficeSidebarSearchSvg.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n id?: string;\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n isResolving?: boolean;\n onPick?: () => void;\n onClear?: () => void;\n disabled?: boolean;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const {\n disabled = false,\n id,\n label,\n value,\n displayValue,\n placeholder,\n ariaDescribedBy,\n ariaInvalid,\n isResolving = false,\n onPick,\n onClear,\n } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.anyEntity', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('filters.actions.changeFilterValue', { label });\n }\n let pickAriaLabel = t('filters.actions.filterBy', { label });\n if (hasValue) {\n pickAriaLabel = pickLabel;\n }\n const clearAriaLabel = t('filters.actions.clearFilter', { label });\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <button\n type=\"button\"\n className={styles.clearButton}\n aria-label={clearAriaLabel}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClear();\n }}\n >\n <ModalCloseSvg width={16} height={16} aria-hidden=\"true\" />\n </button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n let actionIcon = (\n <BackofficeSidebarSearchSvg\n className={styles.actionIcon}\n aria-hidden=\"true\"\n />\n );\n if (hasValue) {\n actionIcon = (\n <BackofficeSidebarPenToolSvg\n className={styles.actionIcon}\n aria-hidden=\"true\"\n />\n );\n }\n\n pickerNode = (\n <div className={styles.pickerControl}>\n <button\n id={id}\n type=\"button\"\n className={styles.pickerButton}\n aria-label={pickAriaLabel}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-busy={isResolving || undefined}\n disabled={disabled}\n onClick={onPick}\n >\n <span className={styles.content}>\n <span className={styles.labelText}>{label}</span>\n {displayNode}\n </span>\n </button>\n <button\n type=\"button\"\n className={styles.pickActionButton}\n aria-label={pickAriaLabel}\n title={pickAriaLabel}\n disabled={disabled}\n onClick={onPick}\n >\n {actionIcon}\n </button>\n {clearNode}\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n {pickerNode ?? <div className={styles.valueBox}>{displayNode}</div>}\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n"],"mappings":";;;;;;;AAuBA,IAAa,KACX,MACgB;CAChB,IAAM,EACJ,cAAW,IACX,OACA,UACA,UACA,iBACA,aAAA,GACA,oBACA,gBACA,iBAAc,IACd,WACA,eACE,GACE,EAAE,SAAM,GAA+B,EACvC,IAAkB,GAAO,MAAM,IAAI,IACnC,IAAyB,GAAc,MAAM,IAAI,IACjD,IAAW,MAAoB,IAC/B,IAAkB,MAA2B,IAE7C,IACJ,KAAe,EAAE,kCAAkC,EAAE,UAAO,CAAC,EACzD,IAAwB,EAAE,kCAAkC,EAE9D;CACJ,AASE,IATE,IAEA,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAA8B,CAAA,GAE3D,IAEP,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA6B,CAAA,GAInE,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA2B,CAAA;CAIrE,IAAI,IAAY,EAAE,sBAAsB;CACxC,AAAI,MACF,IAAY,EAAE,qCAAqC,EAAE,UAAO,CAAC;CAE/D,IAAI,IAAgB,EAAE,4BAA4B,EAAE,UAAO,CAAC;CAC5D,AAAI,MACF,IAAgB;CAElB,IAAM,IAAiB,EAAE,+BAA+B,EAAE,UAAO,CAAC,EAE9D,IAAgC;CACpC,AAAI,KAAY,KAAW,SACzB,IACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,cAAY;EACF;EACV,UAAU,MAAU;GAElB,AADA,EAAM,iBAAiB,EACvB,GAAS;;YAGX,kBAAC,GAAD;GAAe,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EACpD,CAAA;CAIb,IAAI,IAAiC;CACrC,IAAI,KAAU,MAAM;EAClB,IAAI,IACF,kBAAC,GAAD;GACE,WAAW;GACX,eAAY;GACZ,CAAA;EAWJ,AATI,MACF,IACE,kBAAC,GAAD;GACE,WAAW;GACX,eAAY;GACZ,CAAA,GAIN,IACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,UAAD;KACM;KACJ,MAAK;KACL,WAAW;KACX,cAAY;KACZ,oBAAkB;KAClB,gBAAc;KACd,aAAW,KAAe,KAAA;KAChB;KACV,SAAS;eAET,kBAAC,QAAD;MAAM,WAAW;gBAAjB,CACE,kBAAC,QAAD;OAAM,WAAW;iBAAmB;OAAa,CAAA,EAChD,EACI;;KACA,CAAA;IACT,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,cAAY;KACZ,OAAO;KACG;KACV,SAAS;eAER;KACM,CAAA;IACR;IACG;;;CAIV,OACE,kBAAC,OAAD;EAAK,WAAW;YACb,KAAc,kBAAC,OAAD;GAAK,WAAW;aAAkB;GAAkB,CAAA;EAC/D,CAAA"}
@@ -1,7 +1,7 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/filters/deferredFilterSearchInput.css.ts
3
- var e = "txvbqbdr8 txvbqbey txvbqbee txvbqbf6o txvbqbff6 txvbqb17w0", t = "txvbqbdr8 txvbqbey txvbqbf7y txvbqbfet txvbqbju8";
3
+ var e = "txvbqb17w0", t = "ds2thc0 txvbqbdsb txvbqbey txvbqbg9v", n = "ds2thc1 txvbqb6 txvbqbdsb txvbqbey txvbqbjtp txvbqb17ia txvbqbhnp txvbqbux3 txvbqb2g9 txvbqb1g5 txvbqb1933 txvbqb19cd txvbqbv txvbqb7h txvbqb75 txvbqb7t", r = "txvbqbdsb txvbqb17ia txvbqbhnp txvbqbf7y";
4
4
  //#endregion
5
- export { t as actions, e as container };
5
+ export { n as actionButton, r as actionButtonSpacer, t as actions, e as container };
6
6
 
7
7
  //# sourceMappingURL=deferredFilterSearchInput.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deferredFilterSearchInput.css.js","names":[],"sources":["../../../../../src/components/backoffice/filters/deferredFilterSearchInput.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: {\n base: 'center',\n max767: 'stretch',\n },\n flexDirection: {\n max767: 'column',\n },\n gap: 2,\n width: 'full',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n gap: 1,\n justifyContent: {\n max767: 'flex-end',\n },\n});\n"],"mappings":""}
1
+ {"version":3,"file":"deferredFilterSearchInput.css.js","names":[],"sources":["../../../../../src/components/backoffice/filters/deferredFilterSearchInput.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nexport const container = sprinkles({\n width: 'full',\n});\n\nexport const actions = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n }),\n {\n minWidth: '3.75rem',\n },\n]);\n\nexport const actionButton = style([\n sprinkles({\n appearance: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 7,\n height: 7,\n padding: 0,\n borderRadius: 'md',\n borderWidth: 0,\n backgroundColor: 'transparent',\n color: 'textMuted',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n color: vars.colors.text,\n backgroundColor: vars.colors.surfaceMuted,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.45,\n },\n },\n },\n]);\n\nexport const actionButtonSpacer = sprinkles({\n display: 'inline-flex',\n width: 7,\n height: 7,\n flexShrink: 0,\n});\n"],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/filters/entityIdFilterField.css.ts
3
- var e = "txvbqbdr8 txvbqbey txvbqb17ro txvbqbs65 txvbqbt9i", t = "oa1uye0 txvbqbyoi txvbqbzm3 txvbqb11ed txvbqbwqg txvbqbdrl txvbqbey txvbqbdxd txvbqbt9i txvbqb2gz txvbqb1uy txvbqb2et txvbqb17h txvbqb196b txvbqb19c9 txvbqb7g txvbqb76 txvbqb7t", n = "oa1uye1 txvbqb6 txvbqbdr8 txvbqbf6i txvbqbjtp txvbqbt9i txvbqb17w0 txvbqb16ex txvbqbv txvbqb1g5 txvbqb1933 txvbqb19c9 txvbqbux3", r = "txvbqbdr8 txvbqbf6i txvbqbjtp txvbqbg9v txvbqbt9i txvbqb17w0 txvbqbs65", i = "txvbqbdxd txvbqbt9i txvbqbdr8 txvbqbey txvbqbusr", a = "txvbqbdqi txvbqb19cd txvbqb96 txvbqbfcn txvbqbt9i txvbqbusr txvbqb16g0 txvbqb18xk", o = "txvbqbdqi txvbqbt9i txvbqbusr txvbqb16g0 txvbqb18xk txvbqb9j txvbqbfd0", s = "txvbqbdqi txvbqbt9i txvbqbusr txvbqb16g0 txvbqb18xk txvbqb19cd txvbqb9j", c = "oa1uye3 oa1uye2 txvbqb6 txvbqbdsb txvbqbey txvbqbgr txvbqbjtp txvbqb17ia txvbqbhnp txvbqbux3 txvbqb2gm txvbqb1uy txvbqb2et txvbqb17u txvbqb196b txvbqb19cd txvbqbv txvbqb7h txvbqb75 txvbqb7t", l = "oa1uye4 oa1uye2 txvbqb6 txvbqbdsb txvbqbey txvbqbgr txvbqbjtp txvbqb17ia txvbqbhnp txvbqbux3 txvbqb2gm txvbqb1uy txvbqb2et txvbqb17u txvbqb196b txvbqb19cd txvbqbv txvbqb7h txvbqb75 txvbqb7t txvbqb2is txvbqb196f", u = "txvbqb17h7 txvbqbhmm";
3
+ var e = "txvbqbdr8 txvbqbey txvbqb17ro txvbqbs65 txvbqbt9i", t = "oa1uye0 txvbqbyoi txvbqbzm3 txvbqb11ed txvbqbwqg txvbqbdrl txvbqbey txvbqbdxd txvbqbt9i txvbqb2gz txvbqb1uy txvbqb2et txvbqb17h txvbqb196b txvbqb19c9 txvbqb7g txvbqb76 txvbqb7t", n = "oa1uye1 txvbqb6 txvbqbdr8 txvbqbf6i txvbqbjtp txvbqbt9i txvbqb17w0 txvbqb16ex txvbqbv txvbqb1g5 txvbqb1933 txvbqb19c9 txvbqbux3", r = "txvbqbdr8 txvbqbf6i txvbqbjtp txvbqbg9v txvbqbt9i txvbqb17w0 txvbqbs65", i = "txvbqbdxd txvbqbt9i txvbqbdr8 txvbqbey txvbqbusr", a = "txvbqbdqi txvbqb19cd txvbqb96 txvbqbfcn txvbqbt9i txvbqbusr txvbqb16g0 txvbqb18xk", o = "txvbqbdqi txvbqbt9i txvbqbusr txvbqb16g0 txvbqb18xk txvbqb9j txvbqbfd0", s = "txvbqbdqi txvbqbt9i txvbqbusr txvbqb16g0 txvbqb18xk txvbqb19cd txvbqb9j", c = "oa1uye3 oa1uye2 txvbqb6 txvbqbdsb txvbqbey txvbqbgr txvbqbjtp txvbqb17ia txvbqbhnp txvbqbux3 txvbqb2g9 txvbqb1g5 txvbqb1933 txvbqb19cd txvbqbv txvbqb7h txvbqb75 txvbqb7t", l = "oa1uye4 oa1uye2 txvbqb6 txvbqbdsb txvbqbey txvbqbgr txvbqbjtp txvbqb17ia txvbqbhnp txvbqbux3 txvbqb2g9 txvbqb1g5 txvbqb1933 txvbqb19cd txvbqbv txvbqb7h txvbqb75 txvbqb7t", u = "txvbqb17h7 txvbqbhmm";
4
4
  //#endregion
5
5
  export { u as actionIcon, l as clearButton, e as container, r as content, a as labelText, c as pickActionButton, n as pickerButton, t as pickerControl, s as placeholder, i as valueBox, o as valueText };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"entityIdFilterField.css.js","names":[],"sources":["../../../../../src/components/backoffice/filters/entityIdFilterField.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n width: 72,\n maxWidth: 'full',\n minWidth: 0,\n});\n\nexport const pickerControl = style([\n sprinkles({\n display: 'grid',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n paddingX: 3,\n paddingY: 1.5,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n gridTemplateColumns: 'minmax(0, 1fr) auto auto',\n gridTemplateAreas: '\"content pickAction clearAction\"',\n columnGap: vars.spacing[1],\n minHeight: '2.5rem',\n width: '100%',\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n },\n },\n },\n]);\n\nexport const pickerButton = style([\n sprinkles({\n appearance: 'none',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n minWidth: 0,\n width: 'full',\n textAlign: 'left',\n cursor: 'pointer',\n borderWidth: 0,\n backgroundColor: 'transparent',\n color: 'text',\n padding: 0,\n }),\n {\n gridArea: 'content',\n minHeight: '100%',\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.65,\n },\n },\n },\n]);\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: 0.5,\n minWidth: 0,\n width: 'full',\n maxWidth: 'full',\n});\n\nexport const valueBox = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n});\n\nexport const labelText = sprinkles({\n display: 'block',\n color: 'textMuted',\n fontSize: 'xs',\n fontWeight: 'medium',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const valueText = sprinkles({\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: 'sm',\n fontWeight: 'semibold',\n});\n\nexport const placeholder = sprinkles({\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: 'textMuted',\n fontSize: 'sm',\n});\n\nconst actionButtonBase = style([\n sprinkles({\n appearance: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n alignSelf: 'center',\n justifyContent: 'center',\n width: 7,\n height: 7,\n padding: 0,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n color: 'textMuted',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n color: vars.colors.text,\n backgroundColor: vars.colors.surfaceMuted,\n borderColor: vars.colors.borderStrong,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.65,\n },\n },\n },\n]);\n\nexport const pickActionButton = style([\n actionButtonBase,\n {\n gridArea: 'pickAction',\n },\n]);\n\nexport const clearButton = style([\n actionButtonBase,\n sprinkles({\n borderRadius: 'full',\n backgroundColor: 'surfaceMuted',\n }),\n {\n gridArea: 'clearAction',\n },\n]);\n\nexport const actionIcon = sprinkles({\n width: 4,\n height: 4,\n});\n"],"mappings":""}
1
+ {"version":3,"file":"entityIdFilterField.css.js","names":[],"sources":["../../../../../src/components/backoffice/filters/entityIdFilterField.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n width: 72,\n maxWidth: 'full',\n minWidth: 0,\n});\n\nexport const pickerControl = style([\n sprinkles({\n display: 'grid',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n paddingX: 3,\n paddingY: 1.5,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n gridTemplateColumns: 'minmax(0, 1fr) auto auto',\n gridTemplateAreas: '\"content pickAction clearAction\"',\n columnGap: vars.spacing[0.5],\n minHeight: '2.5rem',\n width: '100%',\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n },\n },\n },\n]);\n\nexport const pickerButton = style([\n sprinkles({\n appearance: 'none',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n minWidth: 0,\n width: 'full',\n textAlign: 'left',\n cursor: 'pointer',\n borderWidth: 0,\n backgroundColor: 'transparent',\n color: 'text',\n padding: 0,\n }),\n {\n gridArea: 'content',\n minHeight: '100%',\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.65,\n },\n },\n },\n]);\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: 0.5,\n minWidth: 0,\n width: 'full',\n maxWidth: 'full',\n});\n\nexport const valueBox = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n});\n\nexport const labelText = sprinkles({\n display: 'block',\n color: 'textMuted',\n fontSize: 'xs',\n fontWeight: 'medium',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const valueText = sprinkles({\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: 'sm',\n fontWeight: 'semibold',\n});\n\nexport const placeholder = sprinkles({\n display: 'block',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: 'textMuted',\n fontSize: 'sm',\n});\n\nconst actionButtonBase = style([\n sprinkles({\n appearance: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n alignSelf: 'center',\n justifyContent: 'center',\n width: 7,\n height: 7,\n padding: 0,\n borderRadius: 'md',\n borderWidth: 0,\n backgroundColor: 'transparent',\n color: 'textMuted',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n color: vars.colors.text,\n backgroundColor: vars.colors.surfaceMuted,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.65,\n },\n },\n },\n]);\n\nexport const pickActionButton = style([\n actionButtonBase,\n {\n gridArea: 'pickAction',\n },\n]);\n\nexport const clearButton = style([\n actionButtonBase,\n {\n gridArea: 'clearAction',\n },\n]);\n\nexport const actionIcon = sprinkles({\n width: 4,\n height: 4,\n});\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeHubTemplate.css.js","names":[],"sources":["../../../../../src/components/backoffice/hub/backofficeHubTemplate.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n});\n\nexport const search = sprinkles({\n maxWidth: '2xl',\n});\n\nexport const groups = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const group = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const groupHeader = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n gap: 3,\n});\n\nexport const groupIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'surfaceMuted',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n color: 'textSecondary',\n flexShrink: 0,\n marginTop: 'px',\n});\n\nexport const groupHeading = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const groupTitle = sprinkles({\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const groupDescription = sprinkles({\n color: 'textMuted',\n fontSize: 'sm',\n});\n\nexport const grid = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'autoFitMinmax260',\n gap: 3,\n});\n\nexport const item = style([\n sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n gap: 3,\n padding: 3,\n borderRadius: 'md',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n color: 'text',\n textDecoration: 'none',\n minWidth: 0,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n minHeight: '92px',\n selectors: {\n '&:hover': {\n borderColor: vars.colors.border,\n backgroundColor: vars.colors.surfaceMuted,\n transform: 'translateY(-1px)',\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const itemIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 9,\n height: 9,\n borderRadius: 'md',\n backgroundColor: 'surfaceMuted',\n color: 'textSecondary',\n flexShrink: 0,\n});\n\nexport const itemContent = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const itemTitle = sprinkles({\n fontWeight: 'semibold',\n color: 'text',\n overflowWrap: 'anywhere',\n});\n\nexport const itemDescription = sprinkles({\n color: 'textMuted',\n fontSize: 'sm',\n lineHeight: 'normal',\n overflowWrap: 'anywhere',\n});\n\nexport const itemMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n fontWeight: 'medium',\n textTransform: 'uppercase',\n letterSpacing: 'wide',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeHubTemplate.css.js","names":[],"sources":["../../../../../src/components/backoffice/hub/backofficeHubTemplate.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n});\n\nexport const search = sprinkles({\n maxWidth: '2xl',\n});\n\nexport const groups = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const group = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const groupHeader = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n gap: 3,\n});\n\nexport const groupIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'surfaceMuted',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n color: 'textSecondary',\n flexShrink: 0,\n marginTop: 'px',\n});\n\nexport const groupHeading = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const groupTitle = sprinkles({\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const groupDescription = sprinkles({\n color: 'textMuted',\n fontSize: 'sm',\n});\n\nexport const grid = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'autoFitMinmax260',\n gap: 3,\n});\n\nexport const item = style([\n sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n gap: 3,\n padding: 3,\n borderRadius: 'md',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n color: 'text',\n textDecoration: 'none',\n minWidth: 0,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n minHeight: '92px',\n selectors: {\n '&:hover': {\n borderColor: vars.colors.border,\n backgroundColor: vars.colors.surfaceMuted,\n transform: 'translateY(-1px)',\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const itemIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 9,\n height: 9,\n borderRadius: 'md',\n backgroundColor: 'surfaceMuted',\n color: 'textSecondary',\n flexShrink: 0,\n});\n\nexport const itemContent = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const itemTitle = sprinkles({\n fontWeight: 'semibold',\n color: 'text',\n overflowWrap: 'anywhere',\n});\n\nexport const itemDescription = sprinkles({\n color: 'textMuted',\n fontSize: 'sm',\n lineHeight: 'normal',\n overflowWrap: 'anywhere',\n});\n\nexport const itemMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n fontWeight: 'medium',\n textTransform: 'uppercase',\n letterSpacing: 'wide',\n});\n"],"mappings":""}
@@ -1,4 +1,3 @@
1
- /* empty css */
2
1
  /* empty css */
3
2
  //#region src/components/backoffice/layout/backofficeSidebarActions.css.ts
4
3
  var e = "_1xws1b00 qbwcuej qbwcueh txvbqbdsb txvbqbey txvbqbjtp txvbqb1g5 txvbqb2e3 txvbqb2g9 txvbqb1933 txvbqb19cb txvbqbv txvbqbux3 txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1aey txvbqb1bsa qbwcue4 txvbqb1c2w txvbqb1c9c qbwcue0 txvbqb1cb0 txvbqb1cws txvbqb17hx txvbqbhnc";
@@ -1 +1 @@
1
- {"version":3,"file":"entityIdPickerDialog.css.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const loadingState = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n paddingY: 4,\n paddingX: 3,\n color: 'textSecondary',\n});\n\nexport const loadingLabel = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const list = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n }),\n {\n selectors: {\n '&:empty': {\n display: 'none',\n },\n },\n },\n]);\n\nexport const listItem = style([\n sprinkles({\n appearance: 'none',\n display: 'block',\n width: 'full',\n paddingX: 3,\n paddingY: 2.5,\n borderWidth: 0,\n backgroundColor: 'surface',\n color: 'text',\n cursor: 'pointer',\n textAlign: 'left',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n minHeight: '3.25rem',\n selectors: {\n '& + &': {\n borderTop: `1px solid ${vars.colors.borderSubtle}`,\n },\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '-2px',\n },\n },\n },\n]);\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n minWidth: 0,\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"entityIdPickerDialog.css.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const loadingState = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n paddingY: 4,\n paddingX: 3,\n color: 'textSecondary',\n});\n\nexport const loadingLabel = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const list = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n }),\n {\n selectors: {\n '&:empty': {\n display: 'none',\n },\n },\n },\n]);\n\nexport const listItem = style([\n sprinkles({\n appearance: 'none',\n display: 'block',\n width: 'full',\n paddingX: 3,\n paddingY: 2.5,\n borderWidth: 0,\n backgroundColor: 'surface',\n color: 'text',\n cursor: 'pointer',\n textAlign: 'left',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n minHeight: '3.25rem',\n selectors: {\n '& + &': {\n borderTop: `1px solid ${vars.colors.borderSubtle}`,\n },\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '-2px',\n },\n },\n },\n]);\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n minWidth: 0,\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeRelatedCountLink.css.js","names":[],"sources":["../../../../../src/components/backoffice/refs/backofficeRelatedCountLink.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { pillLink } from '@plumile/ui/theme/styleRecipes.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const link = pillLink;\n\nexport const count = sprinkles({\n minWidth: 2,\n textAlign: 'center',\n fontVariantNumeric: 'tabular-nums',\n});\n\nexport const icon = style([\n sprinkles({\n flexShrink: 0,\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'none',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n [`${link}:hover &`]: {\n color: vars.colors.brandPrimaryRed,\n },\n },\n },\n]);\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeRelatedCountLink.css.js","names":[],"sources":["../../../../../src/components/backoffice/refs/backofficeRelatedCountLink.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { pillLink } from '@plumile/ui/theme/styleRecipes.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nexport const link = pillLink;\n\nexport const count = sprinkles({\n minWidth: 2,\n textAlign: 'center',\n fontVariantNumeric: 'tabular-nums',\n});\n\nexport const icon = style([\n sprinkles({\n flexShrink: 0,\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'none',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n [`${link}:hover &`]: {\n color: vars.colors.brandPrimaryRed,\n },\n },\n },\n]);\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeRoutePendingBar.css.js","names":[],"sources":["../../../../../src/components/backoffice/routing/backofficeRoutePendingBar.css.ts"],"sourcesContent":["import { style, keyframes } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nconst slide = keyframes({\n '0%': { transform: 'translateX(-120%)' },\n '60%': { transform: 'translateX(30%)' },\n '100%': { transform: 'translateX(120%)' },\n});\n\nexport const root = style([\n sprinkles({\n backgroundColor: 'surfaceMuted',\n position: 'fixed',\n top: 0,\n left: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n width: 'full',\n zIndex: 50,\n }),\n {\n height: '3px',\n },\n]);\n\nexport const bar = style([\n sprinkles({\n height: 'full',\n width: '2/5',\n }),\n {\n background: `linear-gradient(90deg, ${vars.colors.primaryLight} 0%, ${vars.colors.primary} 60%, ${vars.colors.primaryLight} 100%)`,\n animation: `${slide} 1.1s ease-in-out infinite`,\n },\n]);\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeRoutePendingBar.css.js","names":[],"sources":["../../../../../src/components/backoffice/routing/backofficeRoutePendingBar.css.ts"],"sourcesContent":["import { style, keyframes } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nconst slide = keyframes({\n '0%': { transform: 'translateX(-120%)' },\n '60%': { transform: 'translateX(30%)' },\n '100%': { transform: 'translateX(120%)' },\n});\n\nexport const root = style([\n sprinkles({\n backgroundColor: 'surfaceMuted',\n position: 'fixed',\n top: 0,\n left: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n width: 'full',\n zIndex: 50,\n }),\n {\n height: '3px',\n },\n]);\n\nexport const bar = style([\n sprinkles({\n height: 'full',\n width: '2/5',\n }),\n {\n background: `linear-gradient(90deg, ${vars.colors.primaryLight} 0%, ${vars.colors.primary} 60%, ${vars.colors.primaryLight} 100%)`,\n animation: `${slide} 1.1s ease-in-out infinite`,\n },\n]);\n"],"mappings":""}
@@ -174,7 +174,7 @@ var C = (e, t) => e(t), w = (e, t) => e.fromGraphQL != null && t != null ? e.fro
174
174
  ariaLabel: t,
175
175
  className: d,
176
176
  inputMode: e.inputMode ?? "numeric",
177
- type: "number"
177
+ type: "text"
178
178
  });
179
179
  }
180
180
  if (e.kind === "enum") return /* @__PURE__ */ g(y, {
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterDrawer } from '@plumile/ui/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { BackofficeInfiniteListStatus } from '@plumile/ui/backoffice/molecules/backoffice_infinite_list_status/BackofficeInfiniteListStatus.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport {\n FilterChipRow,\n type FilterChip,\n} from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { InlineBanner } from '@plumile/ui/backoffice/molecules/inline_banner/InlineBanner.js';\nimport { BackofficeVirtualizedConnectionTable } from '@plumile/ui/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { ResponsiveRecordList } from '@plumile/ui/components/data-table/ResponsiveRecordList.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport { denseTableClass } from '@plumile/ui/shared/backofficeTableDensity.css.js';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListToolbar } from '../lists/BackofficeListToolbar.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport { isDevEnv } from '../../../relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = raw\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n if (\n typeof entry !== 'string' &&\n typeof entry !== 'number' &&\n typeof entry !== 'boolean'\n ) {\n return null;\n }\n const value = String(entry).trim();\n if (value === '') {\n return null;\n }\n return value;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n\n if (normalized.length === 0) {\n return null;\n }\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n isRefreshing = false,\n onLoadMore,\n onRefresh,\n totalCount,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false);\n const [filterSearch, setFilterSearch] = useState('');\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"number\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n ariaLabel={t('list.sort.label')}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const chipsNode = useMemo(() => {\n if (chips.length === 0) {\n return null;\n }\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.trigger');\n if (activeCount > 0) {\n label = t('filters.triggerWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, t]);\n\n const filterDrawerEmptyLabel =\n filterSearch.trim() === ''\n ? undefined\n : t('filters.drawer.emptySearchResults');\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n setIsFilterDrawerOpen(false);\n setFilterSearch('');\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n emptyLabel={filterDrawerEmptyLabel}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo(() => {\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled: !shouldVirtualizeTable && runtimeConfig.infiniteScroll.enabled,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <BackofficeVirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={runtimeConfig.virtualization}\n infiniteScroll={{\n enabled: runtimeConfig.infiniteScroll.enabled,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n ) : (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeListToolbar\n primaryFilters={\n searchNode != null || quickFiltersNode != null ? (\n <>\n {searchNode}\n {quickFiltersNode}\n </>\n ) : null\n }\n filterDrawerTrigger={allFiltersNode}\n sortControl={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n isLoading={isRefreshing}\n loadingLabel={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n activeFilters={chipsNode}\n density=\"compact\"\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div className={styles.tableHost}>\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n\n const tableFooterNode = shouldRenderTableFooter ? (\n <>\n <BackofficeInfiniteListStatus\n loadedCount={rows.length}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n pageInfoState={\n hasInconsistentPageInfo\n ? 'inconsistent'\n : isLoadingMore\n ? 'loading'\n : hasNextPage\n ? 'ready'\n : 'complete'\n }\n loadedLabel={tableFooterMeta}\n loadingLabel={t('list.loadMore.loading')}\n endLabel={t('list.loadMore.end')}\n />\n </>\n ) : null;\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterDrawer } from '@plumile/ui/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { BackofficeInfiniteListStatus } from '@plumile/ui/backoffice/molecules/backoffice_infinite_list_status/BackofficeInfiniteListStatus.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport {\n FilterChipRow,\n type FilterChip,\n} from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { InlineBanner } from '@plumile/ui/backoffice/molecules/inline_banner/InlineBanner.js';\nimport { BackofficeVirtualizedConnectionTable } from '@plumile/ui/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { ResponsiveRecordList } from '@plumile/ui/components/data-table/ResponsiveRecordList.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport { denseTableClass } from '@plumile/ui/shared/backofficeTableDensity.css.js';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListToolbar } from '../lists/BackofficeListToolbar.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport { isDevEnv } from '../../../relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = raw\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n if (\n typeof entry !== 'string' &&\n typeof entry !== 'number' &&\n typeof entry !== 'boolean'\n ) {\n return null;\n }\n const value = String(entry).trim();\n if (value === '') {\n return null;\n }\n return value;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n\n if (normalized.length === 0) {\n return null;\n }\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n isRefreshing = false,\n onLoadMore,\n onRefresh,\n totalCount,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false);\n const [filterSearch, setFilterSearch] = useState('');\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n ariaLabel={t('list.sort.label')}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const chipsNode = useMemo(() => {\n if (chips.length === 0) {\n return null;\n }\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.trigger');\n if (activeCount > 0) {\n label = t('filters.triggerWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, t]);\n\n const filterDrawerEmptyLabel =\n filterSearch.trim() === ''\n ? undefined\n : t('filters.drawer.emptySearchResults');\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n setIsFilterDrawerOpen(false);\n setFilterSearch('');\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n emptyLabel={filterDrawerEmptyLabel}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo(() => {\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled: !shouldVirtualizeTable && runtimeConfig.infiniteScroll.enabled,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <BackofficeVirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={runtimeConfig.virtualization}\n infiniteScroll={{\n enabled: runtimeConfig.infiniteScroll.enabled,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n ) : (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeListToolbar\n primaryFilters={\n searchNode != null || quickFiltersNode != null ? (\n <>\n {searchNode}\n {quickFiltersNode}\n </>\n ) : null\n }\n filterDrawerTrigger={allFiltersNode}\n sortControl={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n isLoading={isRefreshing}\n loadingLabel={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n activeFilters={chipsNode}\n density=\"compact\"\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div className={styles.tableHost}>\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n\n const tableFooterNode = shouldRenderTableFooter ? (\n <>\n <BackofficeInfiniteListStatus\n loadedCount={rows.length}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n pageInfoState={\n hasInconsistentPageInfo\n ? 'inconsistent'\n : isLoadingMore\n ? 'loading'\n : hasNextPage\n ? 'ready'\n : 'complete'\n }\n loadedLabel={tableFooterMeta}\n loadingLabel={t('list.loadMore.loading')}\n endLabel={t('list.loadMore.end')}\n />\n </>\n ) : null;\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
@@ -2,12 +2,13 @@ import { useBackofficeFormats as e } from "../../../i18n/useBackofficeFormats.js
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/components/backoffice/shared/BackofficeFormattedCurrency.tsx
4
4
  var n = ({ value: n, fallback: r = "-", className: i }) => {
5
- let { formatCurrency: a } = e();
5
+ let { formatCurrency: a, formatCurrencyTitle: o } = e();
6
6
  return n == null ? /* @__PURE__ */ t("span", {
7
7
  className: i,
8
8
  children: r
9
9
  }) : /* @__PURE__ */ t("span", {
10
10
  className: i,
11
+ title: o(n) ?? void 0,
11
12
  children: a(n)
12
13
  });
13
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeFormattedCurrency.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFormattedCurrency.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeFormats } from '../../../i18n/useBackofficeFormats.js';\n\nexport type BackofficeFormattedCurrencyProps = {\n value: number | null | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormattedCurrency = ({\n value,\n fallback = '-',\n className,\n}: BackofficeFormattedCurrencyProps): JSX.Element => {\n const { formatCurrency } = useBackofficeFormats();\n\n if (value == null) {\n return <span className={className}>{fallback}</span>;\n }\n\n return <span className={className}>{formatCurrency(value)}</span>;\n};\n\nexport default BackofficeFormattedCurrency;\n"],"mappings":";;;AAUA,IAAa,KAA+B,EAC1C,UACA,cAAW,KACX,mBACmD;CACnD,IAAM,EAAE,sBAAmB,GAAsB;CAMjD,OAJI,KAAS,OACJ,kBAAC,QAAD;EAAiB;YAAY;EAAgB,CAAA,GAG/C,kBAAC,QAAD;EAAiB;YAAY,EAAe,EAAM;EAAQ,CAAA"}
1
+ {"version":3,"file":"BackofficeFormattedCurrency.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFormattedCurrency.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeFormats } from '../../../i18n/useBackofficeFormats.js';\n\nexport type BackofficeFormattedCurrencyProps = {\n value: number | null | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormattedCurrency = ({\n value,\n fallback = '-',\n className,\n}: BackofficeFormattedCurrencyProps): JSX.Element => {\n const { formatCurrency, formatCurrencyTitle } = useBackofficeFormats();\n\n if (value == null) {\n return <span className={className}>{fallback}</span>;\n }\n\n return (\n <span className={className} title={formatCurrencyTitle(value) ?? undefined}>\n {formatCurrency(value)}\n </span>\n );\n};\n\nexport default BackofficeFormattedCurrency;\n"],"mappings":";;;AAUA,IAAa,KAA+B,EAC1C,UACA,cAAW,KACX,mBACmD;CACnD,IAAM,EAAE,mBAAgB,2BAAwB,GAAsB;CAMtE,OAJI,KAAS,OACJ,kBAAC,QAAD;EAAiB;YAAY;EAAgB,CAAA,GAIpD,kBAAC,QAAD;EAAiB;EAAW,OAAO,EAAoB,EAAM,IAAI,KAAA;YAC9D,EAAe,EAAM;EACjB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeToolsDocPanel.css.js","names":[],"sources":["../../../../../src/components/backoffice/tools/backofficeToolsDocPanel.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const panelGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const panel = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'lg',\n backgroundColor: 'surface',\n overflow: 'hidden',\n});\n\nexport const trigger = style([\n sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 3,\n paddingX: 4,\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n color: 'text',\n cursor: 'pointer',\n textAlign: 'left',\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `inset 0 0 0 2px ${vars.colors.primary}`,\n },\n },\n },\n]);\n\nexport const triggerTitle = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n});\n\nexport const triggerIcon = sprinkles({\n color: 'textSecondary',\n transitionProperty: 'transform',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n});\n\nexport const triggerIconOpen = sprinkles({\n rotate: 180,\n});\n\nexport const content = sprinkles({\n borderTopWidth: 'px',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n backgroundColor: 'surfaceSecondary',\n padding: 3,\n});\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeToolsDocPanel.css.js","names":[],"sources":["../../../../../src/components/backoffice/tools/backofficeToolsDocPanel.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.css.js';\n\nexport const panelGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const panel = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'lg',\n backgroundColor: 'surface',\n overflow: 'hidden',\n});\n\nexport const trigger = style([\n sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 3,\n paddingX: 4,\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n color: 'text',\n cursor: 'pointer',\n textAlign: 'left',\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `inset 0 0 0 2px ${vars.colors.primary}`,\n },\n },\n },\n]);\n\nexport const triggerTitle = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n});\n\nexport const triggerIcon = sprinkles({\n color: 'textSecondary',\n transitionProperty: 'transform',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n});\n\nexport const triggerIconOpen = sprinkles({\n rotate: 180,\n});\n\nexport const content = sprinkles({\n borderTopWidth: 'px',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n backgroundColor: 'surfaceSecondary',\n padding: 3,\n});\n"],"mappings":""}
@@ -216,8 +216,6 @@ var e = {
216
216
  },
217
217
  common: {
218
218
  actions: {
219
- change: "Change",
220
- clear: "Clear",
221
219
  close: "Close",
222
220
  copied: "Copied",
223
221
  copy: "Copy",
@@ -272,7 +270,9 @@ var e = {
272
270
  },
273
271
  filters: {
274
272
  actions: {
275
- apply: "Apply",
273
+ applyFilter: "Apply {{label}} filter",
274
+ changeFilterValue: "Change {{label}}",
275
+ clearFilter: "Clear {{label}} filter",
276
276
  filterBy: "Filter by {{label}}"
277
277
  },
278
278
  all: "All {{label}}",
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeReact.js","names":[],"sources":["../../../../../src/i18n/locales/en/backofficeReact.json"],"sourcesContent":["{\n \"actions\": {\n \"form\": {\n \"cancel\": \"Cancel\",\n \"errors\": {\n \"invalidJson\": \"{{label}} must be valid JSON.\",\n \"invalidJsonArray\": \"{{label}} must be a valid JSON array.\",\n \"invalidJsonObject\": \"{{label}} must be a valid JSON object.\",\n \"invalidNumber\": \"{{label}} must be a valid number.\",\n \"invalidPayload\": \"The submitted payload is invalid.\",\n \"required\": \"{{label}} is required.\",\n \"submitFailed\": \"Unable to complete this action. Please try again.\"\n },\n \"submitting\": \"Submitting...\"\n },\n \"view\": \"View\"\n },\n \"auth\": {\n \"acceptInvitation\": {\n \"actions\": {\n \"backToLogin\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyAccepted\": \"This invitation has already been accepted.\",\n \"default\": \"Unable to accept invitation.\",\n \"emailMismatch\": \"This invitation was sent to a different email address.\",\n \"expired\": \"Invitation link has expired.\",\n \"invalidToken\": \"Invitation link is invalid.\",\n \"missingToken\": \"Invitation link is missing or invalid.\",\n \"passwordMismatch\": \"Password and confirmation do not match.\",\n \"passwordPolicyViolation\": \"Your password does not meet policy requirements.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"unavailable\": \"Invitation acceptance is not available.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Confirm your password\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Create a password\",\n \"submit\": \"Accept invitation\"\n },\n \"mfaSubtitle\": \"Enter the verification code to continue.\",\n \"mfaTitle\": \"Verify your identity\",\n \"status\": {\n \"success\": \"Invitation accepted.\",\n \"workingButton\": \"Working...\"\n },\n \"subtitle\": \"Create your account to join.\",\n \"title\": \"Accept invitation\"\n },\n \"emailCapture\": {\n \"continue\": \"Continue\",\n \"description\": \"Enter your work email to continue.\",\n \"emailLabel\": \"Work email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"forgotPassword\": \"Forgot your password?\"\n },\n \"loginFlow\": {\n \"errors\": {\n \"accountLocked\": \"Too many attempts. Try again later.\",\n \"emailRequired\": \"Enter an email address to continue.\",\n \"invalidCredentials\": \"Email or password is incorrect.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"passkeyUnavailable\": \"Passkeys are not available.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"tryAgain\": \"Something went wrong. Please try again.\"\n },\n \"methods\": {\n \"title\": \"Choose a sign-in method\"\n },\n \"passkey\": {\n \"description\": \"Use the passkey associated with {{email}}.\",\n \"title\": \"Use a passkey\"\n },\n \"subtitle\": {\n \"default\": \"Choose a sign-in method to continue.\",\n \"mfa\": \"Enter the verification code to continue.\"\n },\n \"title\": {\n \"default\": \"Sign in\",\n \"mfa\": \"Two-factor authentication\"\n }\n },\n \"logout\": {\n \"errors\": {\n \"default\": \"Logout failed.\"\n }\n },\n \"methodChooser\": {\n \"actions\": {\n \"back\": \"Back\"\n },\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"methods\": {\n \"other\": \"{{method}}\",\n \"passkey\": \"Passkey\",\n \"password\": \"Password\"\n },\n \"prompt\": \"Choose how to sign in for <strong>{{email}}</strong>.\"\n },\n \"mfa\": {\n \"actions\": {\n \"back\": \"Back\",\n \"submit\": \"Verify\"\n },\n \"errors\": {\n \"expired\": \"Verification session expired. Please try again.\",\n \"invalidChallenge\": \"Verification session is invalid. Restart the login.\",\n \"invalidCode\": \"Invalid code. Try again.\",\n \"shortCode\": \"Enter the 6-digit code.\",\n \"tooManyAttempts\": \"Too many attempts. Try again later.\",\n \"verificationFailed\": \"Verification failed. Try again.\"\n },\n \"form\": {\n \"label\": \"Verification code\",\n \"placeholder\": \"123456\"\n },\n \"helper\": {\n \"default\": \"Enter the 6-digit code from your authenticator.\",\n \"withEmail\": \"Enter the 6-digit code sent to {{email}}.\"\n }\n },\n \"oidc\": {\n \"buttons\": {\n \"apple\": \"Continue with Apple\",\n \"generic\": \"Continue with single sign-on\",\n \"google\": \"Continue with Google\"\n }\n },\n \"passkey\": {\n \"actions\": {\n \"showMethods\": \"Use another method\",\n \"submit\": \"Continue with passkey\",\n \"submitting\": \"Waiting for passkey...\"\n },\n \"errors\": {\n \"cancelled\": \"Passkey sign-in was cancelled.\",\n \"challengeExpired\": \"Passkey request expired. Try again.\",\n \"emailRequired\": \"Enter your email to continue.\",\n \"failed\": \"Passkey sign-in failed.\",\n \"invalidAssertion\": \"Passkey response is invalid. Try again.\",\n \"invalidChallenge\": \"Passkey request is invalid. Try again.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"noCredential\": \"No credential was returned by the authenticator.\",\n \"notAvailable\": \"Passkeys are not available on this device.\",\n \"notFound\": \"No passkey found for this account.\"\n },\n \"form\": {\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\"\n },\n \"helper\": \"Use a passkey instead of your password.\"\n },\n \"passwordLogin\": {\n \"forgotPassword\": \"Forgot your password?\",\n \"title\": \"Sign in\"\n },\n \"passwordResetComplete\": {\n \"errors\": {\n \"expired\": \"This reset link has expired.\",\n \"invalid\": \"Reset link is invalid or expired.\",\n \"minLength\": \"Password must be at least {{minLength}} characters.\",\n \"mismatch\": \"Passwords do not match.\",\n \"missingToken\": \"Reset link is missing or invalid.\",\n \"policyViolation\": \"Your new password does not meet policy requirements.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Re-enter your password\",\n \"description\": \"Enter a new password for your account.\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Enter a new password\",\n \"submit\": \"Update password\",\n \"title\": \"New password\"\n },\n \"subtitle\": \"Choose a strong password to secure your account.\",\n \"success\": {\n \"action\": \"Back to login\",\n \"description\": \"Your password has been changed.\",\n \"helper\": \"You can now sign in with your new password.\",\n \"title\": \"Password updated\"\n },\n \"title\": \"Set a new password\"\n },\n \"passwordResetRequest\": {\n \"errors\": {\n \"emailRequired\": \"Enter an email address.\",\n \"invalidEmail\": \"Please enter a valid email address.\",\n \"rateLimited\": \"Too many requests. Please wait and try again.\",\n \"startFailed\": \"Unable to start password reset.\"\n },\n \"form\": {\n \"description\": \"Enter the email for your account.\",\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"submit\": \"Send reset link\"\n },\n \"sent\": {\n \"action\": \"Send another email\",\n \"description\": \"We sent a reset link to {{email}}.\",\n \"helper\": \"If you don't see it, check spam or try again.\",\n \"title\": \"Check your email\"\n },\n \"title\": \"Reset your password\"\n },\n \"verifyEmail\": {\n \"actions\": {\n \"continue\": \"Continue\",\n \"return\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyVerified\": \"This email address is already verified.\",\n \"expired\": \"This verification link has expired.\",\n \"invalid\": \"Verification link is invalid or expired.\",\n \"missingToken\": \"Verification link is missing or invalid.\"\n },\n \"status\": {\n \"success\": \"Email verified. You can continue.\",\n \"verifying\": \"Verifying...\",\n \"verifyingButton\": \"Verifying\"\n },\n \"subtitle\": \"Confirm your email address to continue.\",\n \"title\": \"Verify your email\"\n }\n },\n \"common\": {\n \"actions\": {\n \"change\": \"Change\",\n \"clear\": \"Clear\",\n \"close\": \"Close\",\n \"copied\": \"Copied\",\n \"copy\": \"Copy\",\n \"pick\": \"Pick\",\n \"retry\": \"Retry\"\n },\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"breadcrumb\": \"Breadcrumb\",\n \"errors\": {\n \"unexpected\": \"An unexpected error occurred.\"\n },\n \"loading\": \"Loading...\",\n \"notAvailable\": \"N/A\"\n },\n \"dashboard\": {\n \"actions\": {\n \"openList\": \"Open list\",\n \"openTool\": \"Open tool\"\n },\n \"subtitle\": \"Overview of the Work context.\",\n \"title\": \"Dashboard\"\n },\n \"detail\": {\n \"actionResult\": {\n \"message\": \"Message\",\n \"status\": \"Status\"\n },\n \"actions\": {\n \"viewDetails\": \"View details\"\n },\n \"audit\": {\n \"actor\": \"Actor\",\n \"source\": \"Source\"\n },\n \"columns\": {\n \"charged\": \"Charged\",\n \"events\": \"Events\",\n \"markup\": \"Markup\",\n \"name\": \"Name\",\n \"rawCost\": \"Raw cost\"\n },\n \"notFound\": \"Not found\"\n },\n \"emptyState\": {\n \"listEmpty\": {\n \"description\": \"There are no records to display.\",\n \"title\": \"No results\"\n },\n \"listEmptyFiltered\": {\n \"actions\": {\n \"reset\": \"Reset filters\"\n },\n \"description\": \"No results match the current filters.\"\n }\n },\n \"filters\": {\n \"actions\": {\n \"apply\": \"Apply\",\n \"filterBy\": \"Filter by {{label}}\"\n },\n \"all\": \"All {{label}}\",\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"drawer\": {\n \"emptySearchResults\": \"No filters match this search.\"\n },\n \"placeholders\": {\n \"anyEntity\": \"All\",\n \"search\": \"Search {{label}}\",\n \"unresolved\": \"Unresolved ID\"\n },\n \"sections\": {\n \"default\": \"Filters\"\n },\n \"trigger\": \"Filters\",\n \"triggerWithCount_one\": \"Filters ({{count}})\",\n \"triggerWithCount_other\": \"Filters ({{count}})\"\n },\n \"flags\": {\n \"agentManaged\": {\n \"agentManaged\": \"Agent managed\",\n \"userManaged\": \"User managed\"\n },\n \"capability\": {\n \"allowed\": \"Allowed\",\n \"denied\": \"Denied\"\n },\n \"default\": {\n \"default\": \"Default\",\n \"notDefault\": \"Not default\"\n },\n \"deployedProduction\": {\n \"deployed\": \"Deployed\",\n \"notDeployed\": \"Not deployed\"\n },\n \"enabled\": {\n \"disabled\": \"Disabled\",\n \"enabled\": \"Enabled\"\n },\n \"encrypted\": {\n \"encrypted\": \"Encrypted\",\n \"notEncrypted\": \"Not encrypted\"\n },\n \"failure\": {\n \"failed\": \"Failed\",\n \"ok\": \"OK\"\n },\n \"forced\": {\n \"forced\": \"Forced\",\n \"normal\": \"Normal\"\n },\n \"locked\": {\n \"locked\": \"Locked\",\n \"unlocked\": \"Unlocked\"\n }\n },\n \"format\": {\n \"currency\": \"{{value, currency}}\",\n \"number\": \"{{value, number}}\",\n \"percent\": \"{{value, percent}}\"\n },\n \"history\": \"\",\n \"hub\": {\n \"empty\": {\n \"description\": \"No available item matches the current filters.\",\n \"title\": \"No items\"\n },\n \"itemKinds\": {\n \"entity\": \"List\",\n \"tool\": \"Tool\"\n },\n \"search\": {\n \"placeholder\": \"Search\"\n },\n \"subtitle\": \"Choose an item to continue.\"\n },\n \"list\": {\n \"actions\": {\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing…\",\n \"retry\": \"Retry\"\n },\n \"errors\": {\n \"fetchFailed\": \"Unable to refresh the list. Please try again.\",\n \"tableFailed\": \"The table failed to load.\",\n \"title\": \"Table error\"\n },\n \"loaded_one\": \"{{count, number}} item loaded\",\n \"loaded_other\": \"{{count, number}} items loaded\",\n \"loadMore\": {\n \"end\": \"End of results\",\n \"loading\": \"Loading more…\"\n },\n \"showing\": \"Showing {{shown, number}} of {{total, number}}\",\n \"sort\": {\n \"label\": \"Sort order\"\n },\n \"title\": \"\"\n },\n \"overview\": \"\",\n \"picker\": {\n \"empty\": {\n \"description\": \"Try another search term.\",\n \"title\": \"No result\"\n },\n \"errors\": {\n \"loadFailed\": \"Failed to load.\"\n },\n \"searchPlaceholder\": {\n \"default\": \"Search...\"\n },\n \"searchRequired\": \"Enter an ID to search.\",\n \"title\": \"Select an ID\",\n \"unavailable\": \"Picker not available for {{entity}}.\"\n },\n \"relations\": {\n \"labelWithCount_one\": \"{{label}} ({{count}})\",\n \"labelWithCount_other\": \"{{label}} ({{count}})\",\n \"menu\": {\n \"label\": \"Relations\"\n },\n \"openFilteredList\": \"Open filtered list: {{label}}\",\n \"unavailable\": {\n \"description\": \"This related list cannot be loaded right now.\",\n \"title\": \"Relation unavailable\"\n },\n \"viewList\": \"View list\"\n },\n \"review\": {\n \"status\": {\n \"approved\": \"Approved\",\n \"changesRequested\": \"Changes requested\",\n \"pending\": \"Pending\",\n \"unknown\": \"Unknown\"\n }\n },\n \"sidebar\": {\n \"actions\": {\n \"collapseSidebar\": \"Close\",\n \"expandSidebar\": \"Open\",\n \"pin\": \"Pin\",\n \"reorder\": \"Reorder\",\n \"unpin\": \"Unpin\"\n },\n \"items\": {\n \"dashboard\": \"Dashboard\"\n },\n \"navigationAriaLabel\": \"Backoffice navigation\",\n \"profile\": {\n \"actions\": {\n \"signOut\": \"Sign out\"\n },\n \"menuAriaLabel\": \"Open profile menu\",\n \"title\": \"Profile\",\n \"unknownUser\": \"Unknown user\"\n },\n \"search\": {\n \"placeholder\": \"Search…\"\n },\n \"sections\": {\n \"pinned\": \"Pinned\",\n \"recent\": \"Recent\"\n }\n },\n \"tools\": {\n \"errors\": {\n \"description\": \"We couldn't run this tool.\",\n \"details\": \"Error details\",\n \"label\": \"Error\",\n \"title\": \"Tool error\",\n \"unknown\": \"Unknown error\"\n },\n \"forms\": {\n \"actions\": {\n \"insertExample\": \"Insert example\",\n \"run\": \"Run\"\n },\n \"inputJsonLabel\": \"Input JSON\"\n },\n \"loading\": {\n \"description\": \"Running tool...\"\n },\n \"output\": \"Output\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeReact.js","names":[],"sources":["../../../../../src/i18n/locales/en/backofficeReact.json"],"sourcesContent":["{\n \"actions\": {\n \"form\": {\n \"cancel\": \"Cancel\",\n \"errors\": {\n \"invalidJson\": \"{{label}} must be valid JSON.\",\n \"invalidJsonArray\": \"{{label}} must be a valid JSON array.\",\n \"invalidJsonObject\": \"{{label}} must be a valid JSON object.\",\n \"invalidNumber\": \"{{label}} must be a valid number.\",\n \"invalidPayload\": \"The submitted payload is invalid.\",\n \"required\": \"{{label}} is required.\",\n \"submitFailed\": \"Unable to complete this action. Please try again.\"\n },\n \"submitting\": \"Submitting...\"\n },\n \"view\": \"View\"\n },\n \"auth\": {\n \"acceptInvitation\": {\n \"actions\": {\n \"backToLogin\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyAccepted\": \"This invitation has already been accepted.\",\n \"default\": \"Unable to accept invitation.\",\n \"emailMismatch\": \"This invitation was sent to a different email address.\",\n \"expired\": \"Invitation link has expired.\",\n \"invalidToken\": \"Invitation link is invalid.\",\n \"missingToken\": \"Invitation link is missing or invalid.\",\n \"passwordMismatch\": \"Password and confirmation do not match.\",\n \"passwordPolicyViolation\": \"Your password does not meet policy requirements.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"unavailable\": \"Invitation acceptance is not available.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Confirm your password\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Create a password\",\n \"submit\": \"Accept invitation\"\n },\n \"mfaSubtitle\": \"Enter the verification code to continue.\",\n \"mfaTitle\": \"Verify your identity\",\n \"status\": {\n \"success\": \"Invitation accepted.\",\n \"workingButton\": \"Working...\"\n },\n \"subtitle\": \"Create your account to join.\",\n \"title\": \"Accept invitation\"\n },\n \"emailCapture\": {\n \"continue\": \"Continue\",\n \"description\": \"Enter your work email to continue.\",\n \"emailLabel\": \"Work email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"forgotPassword\": \"Forgot your password?\"\n },\n \"loginFlow\": {\n \"errors\": {\n \"accountLocked\": \"Too many attempts. Try again later.\",\n \"emailRequired\": \"Enter an email address to continue.\",\n \"invalidCredentials\": \"Email or password is incorrect.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"passkeyUnavailable\": \"Passkeys are not available.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"tryAgain\": \"Something went wrong. Please try again.\"\n },\n \"methods\": {\n \"title\": \"Choose a sign-in method\"\n },\n \"passkey\": {\n \"description\": \"Use the passkey associated with {{email}}.\",\n \"title\": \"Use a passkey\"\n },\n \"subtitle\": {\n \"default\": \"Choose a sign-in method to continue.\",\n \"mfa\": \"Enter the verification code to continue.\"\n },\n \"title\": {\n \"default\": \"Sign in\",\n \"mfa\": \"Two-factor authentication\"\n }\n },\n \"logout\": {\n \"errors\": {\n \"default\": \"Logout failed.\"\n }\n },\n \"methodChooser\": {\n \"actions\": {\n \"back\": \"Back\"\n },\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"methods\": {\n \"other\": \"{{method}}\",\n \"passkey\": \"Passkey\",\n \"password\": \"Password\"\n },\n \"prompt\": \"Choose how to sign in for <strong>{{email}}</strong>.\"\n },\n \"mfa\": {\n \"actions\": {\n \"back\": \"Back\",\n \"submit\": \"Verify\"\n },\n \"errors\": {\n \"expired\": \"Verification session expired. Please try again.\",\n \"invalidChallenge\": \"Verification session is invalid. Restart the login.\",\n \"invalidCode\": \"Invalid code. Try again.\",\n \"shortCode\": \"Enter the 6-digit code.\",\n \"tooManyAttempts\": \"Too many attempts. Try again later.\",\n \"verificationFailed\": \"Verification failed. Try again.\"\n },\n \"form\": {\n \"label\": \"Verification code\",\n \"placeholder\": \"123456\"\n },\n \"helper\": {\n \"default\": \"Enter the 6-digit code from your authenticator.\",\n \"withEmail\": \"Enter the 6-digit code sent to {{email}}.\"\n }\n },\n \"oidc\": {\n \"buttons\": {\n \"apple\": \"Continue with Apple\",\n \"generic\": \"Continue with single sign-on\",\n \"google\": \"Continue with Google\"\n }\n },\n \"passkey\": {\n \"actions\": {\n \"showMethods\": \"Use another method\",\n \"submit\": \"Continue with passkey\",\n \"submitting\": \"Waiting for passkey...\"\n },\n \"errors\": {\n \"cancelled\": \"Passkey sign-in was cancelled.\",\n \"challengeExpired\": \"Passkey request expired. Try again.\",\n \"emailRequired\": \"Enter your email to continue.\",\n \"failed\": \"Passkey sign-in failed.\",\n \"invalidAssertion\": \"Passkey response is invalid. Try again.\",\n \"invalidChallenge\": \"Passkey request is invalid. Try again.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"noCredential\": \"No credential was returned by the authenticator.\",\n \"notAvailable\": \"Passkeys are not available on this device.\",\n \"notFound\": \"No passkey found for this account.\"\n },\n \"form\": {\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\"\n },\n \"helper\": \"Use a passkey instead of your password.\"\n },\n \"passwordLogin\": {\n \"forgotPassword\": \"Forgot your password?\",\n \"title\": \"Sign in\"\n },\n \"passwordResetComplete\": {\n \"errors\": {\n \"expired\": \"This reset link has expired.\",\n \"invalid\": \"Reset link is invalid or expired.\",\n \"minLength\": \"Password must be at least {{minLength}} characters.\",\n \"mismatch\": \"Passwords do not match.\",\n \"missingToken\": \"Reset link is missing or invalid.\",\n \"policyViolation\": \"Your new password does not meet policy requirements.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Re-enter your password\",\n \"description\": \"Enter a new password for your account.\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Enter a new password\",\n \"submit\": \"Update password\",\n \"title\": \"New password\"\n },\n \"subtitle\": \"Choose a strong password to secure your account.\",\n \"success\": {\n \"action\": \"Back to login\",\n \"description\": \"Your password has been changed.\",\n \"helper\": \"You can now sign in with your new password.\",\n \"title\": \"Password updated\"\n },\n \"title\": \"Set a new password\"\n },\n \"passwordResetRequest\": {\n \"errors\": {\n \"emailRequired\": \"Enter an email address.\",\n \"invalidEmail\": \"Please enter a valid email address.\",\n \"rateLimited\": \"Too many requests. Please wait and try again.\",\n \"startFailed\": \"Unable to start password reset.\"\n },\n \"form\": {\n \"description\": \"Enter the email for your account.\",\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"submit\": \"Send reset link\"\n },\n \"sent\": {\n \"action\": \"Send another email\",\n \"description\": \"We sent a reset link to {{email}}.\",\n \"helper\": \"If you don't see it, check spam or try again.\",\n \"title\": \"Check your email\"\n },\n \"title\": \"Reset your password\"\n },\n \"verifyEmail\": {\n \"actions\": {\n \"continue\": \"Continue\",\n \"return\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyVerified\": \"This email address is already verified.\",\n \"expired\": \"This verification link has expired.\",\n \"invalid\": \"Verification link is invalid or expired.\",\n \"missingToken\": \"Verification link is missing or invalid.\"\n },\n \"status\": {\n \"success\": \"Email verified. You can continue.\",\n \"verifying\": \"Verifying...\",\n \"verifyingButton\": \"Verifying\"\n },\n \"subtitle\": \"Confirm your email address to continue.\",\n \"title\": \"Verify your email\"\n }\n },\n \"common\": {\n \"actions\": {\n \"close\": \"Close\",\n \"copied\": \"Copied\",\n \"copy\": \"Copy\",\n \"pick\": \"Pick\",\n \"retry\": \"Retry\"\n },\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"breadcrumb\": \"Breadcrumb\",\n \"errors\": {\n \"unexpected\": \"An unexpected error occurred.\"\n },\n \"loading\": \"Loading...\",\n \"notAvailable\": \"N/A\"\n },\n \"dashboard\": {\n \"actions\": {\n \"openList\": \"Open list\",\n \"openTool\": \"Open tool\"\n },\n \"subtitle\": \"Overview of the Work context.\",\n \"title\": \"Dashboard\"\n },\n \"detail\": {\n \"actionResult\": {\n \"message\": \"Message\",\n \"status\": \"Status\"\n },\n \"actions\": {\n \"viewDetails\": \"View details\"\n },\n \"audit\": {\n \"actor\": \"Actor\",\n \"source\": \"Source\"\n },\n \"columns\": {\n \"charged\": \"Charged\",\n \"events\": \"Events\",\n \"markup\": \"Markup\",\n \"name\": \"Name\",\n \"rawCost\": \"Raw cost\"\n },\n \"notFound\": \"Not found\"\n },\n \"emptyState\": {\n \"listEmpty\": {\n \"description\": \"There are no records to display.\",\n \"title\": \"No results\"\n },\n \"listEmptyFiltered\": {\n \"actions\": {\n \"reset\": \"Reset filters\"\n },\n \"description\": \"No results match the current filters.\"\n }\n },\n \"filters\": {\n \"actions\": {\n \"applyFilter\": \"Apply {{label}} filter\",\n \"changeFilterValue\": \"Change {{label}}\",\n \"clearFilter\": \"Clear {{label}} filter\",\n \"filterBy\": \"Filter by {{label}}\"\n },\n \"all\": \"All {{label}}\",\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"drawer\": {\n \"emptySearchResults\": \"No filters match this search.\"\n },\n \"placeholders\": {\n \"anyEntity\": \"All\",\n \"search\": \"Search {{label}}\",\n \"unresolved\": \"Unresolved ID\"\n },\n \"sections\": {\n \"default\": \"Filters\"\n },\n \"trigger\": \"Filters\",\n \"triggerWithCount_one\": \"Filters ({{count}})\",\n \"triggerWithCount_other\": \"Filters ({{count}})\"\n },\n \"flags\": {\n \"agentManaged\": {\n \"agentManaged\": \"Agent managed\",\n \"userManaged\": \"User managed\"\n },\n \"capability\": {\n \"allowed\": \"Allowed\",\n \"denied\": \"Denied\"\n },\n \"default\": {\n \"default\": \"Default\",\n \"notDefault\": \"Not default\"\n },\n \"deployedProduction\": {\n \"deployed\": \"Deployed\",\n \"notDeployed\": \"Not deployed\"\n },\n \"enabled\": {\n \"disabled\": \"Disabled\",\n \"enabled\": \"Enabled\"\n },\n \"encrypted\": {\n \"encrypted\": \"Encrypted\",\n \"notEncrypted\": \"Not encrypted\"\n },\n \"failure\": {\n \"failed\": \"Failed\",\n \"ok\": \"OK\"\n },\n \"forced\": {\n \"forced\": \"Forced\",\n \"normal\": \"Normal\"\n },\n \"locked\": {\n \"locked\": \"Locked\",\n \"unlocked\": \"Unlocked\"\n }\n },\n \"format\": {\n \"currency\": \"{{value, currency}}\",\n \"number\": \"{{value, number}}\",\n \"percent\": \"{{value, percent}}\"\n },\n \"history\": \"\",\n \"hub\": {\n \"empty\": {\n \"description\": \"No available item matches the current filters.\",\n \"title\": \"No items\"\n },\n \"itemKinds\": {\n \"entity\": \"List\",\n \"tool\": \"Tool\"\n },\n \"search\": {\n \"placeholder\": \"Search\"\n },\n \"subtitle\": \"Choose an item to continue.\"\n },\n \"list\": {\n \"actions\": {\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing…\",\n \"retry\": \"Retry\"\n },\n \"errors\": {\n \"fetchFailed\": \"Unable to refresh the list. Please try again.\",\n \"tableFailed\": \"The table failed to load.\",\n \"title\": \"Table error\"\n },\n \"loaded_one\": \"{{count, number}} item loaded\",\n \"loaded_other\": \"{{count, number}} items loaded\",\n \"loadMore\": {\n \"end\": \"End of results\",\n \"loading\": \"Loading more…\"\n },\n \"showing\": \"Showing {{shown, number}} of {{total, number}}\",\n \"sort\": {\n \"label\": \"Sort order\"\n },\n \"title\": \"\"\n },\n \"overview\": \"\",\n \"picker\": {\n \"empty\": {\n \"description\": \"Try another search term.\",\n \"title\": \"No result\"\n },\n \"errors\": {\n \"loadFailed\": \"Failed to load.\"\n },\n \"searchPlaceholder\": {\n \"default\": \"Search...\"\n },\n \"searchRequired\": \"Enter an ID to search.\",\n \"title\": \"Select an ID\",\n \"unavailable\": \"Picker not available for {{entity}}.\"\n },\n \"relations\": {\n \"labelWithCount_one\": \"{{label}} ({{count}})\",\n \"labelWithCount_other\": \"{{label}} ({{count}})\",\n \"menu\": {\n \"label\": \"Relations\"\n },\n \"openFilteredList\": \"Open filtered list: {{label}}\",\n \"unavailable\": {\n \"description\": \"This related list cannot be loaded right now.\",\n \"title\": \"Relation unavailable\"\n },\n \"viewList\": \"View list\"\n },\n \"review\": {\n \"status\": {\n \"approved\": \"Approved\",\n \"changesRequested\": \"Changes requested\",\n \"pending\": \"Pending\",\n \"unknown\": \"Unknown\"\n }\n },\n \"sidebar\": {\n \"actions\": {\n \"collapseSidebar\": \"Close\",\n \"expandSidebar\": \"Open\",\n \"pin\": \"Pin\",\n \"reorder\": \"Reorder\",\n \"unpin\": \"Unpin\"\n },\n \"items\": {\n \"dashboard\": \"Dashboard\"\n },\n \"navigationAriaLabel\": \"Backoffice navigation\",\n \"profile\": {\n \"actions\": {\n \"signOut\": \"Sign out\"\n },\n \"menuAriaLabel\": \"Open profile menu\",\n \"title\": \"Profile\",\n \"unknownUser\": \"Unknown user\"\n },\n \"search\": {\n \"placeholder\": \"Search…\"\n },\n \"sections\": {\n \"pinned\": \"Pinned\",\n \"recent\": \"Recent\"\n }\n },\n \"tools\": {\n \"errors\": {\n \"description\": \"We couldn't run this tool.\",\n \"details\": \"Error details\",\n \"label\": \"Error\",\n \"title\": \"Tool error\",\n \"unknown\": \"Unknown error\"\n },\n \"forms\": {\n \"actions\": {\n \"insertExample\": \"Insert example\",\n \"run\": \"Run\"\n },\n \"inputJsonLabel\": \"Input JSON\"\n },\n \"loading\": {\n \"description\": \"Running tool...\"\n },\n \"output\": \"Output\"\n }\n}\n"],"mappings":""}