@portnet/ui 6.0.1 → 6.0.2
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.
- package/CHANGELOG.md +85 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldError.test.js +0 -1
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldWidth.test.js +146 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +0 -1
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +265 -0
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +248 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +380 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +0 -1
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/labels-merge.test.js +0 -1
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +37 -4
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Field.js +63 -1
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/index.js +27 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/index.js +12 -1
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/patterns/FavoriteColumn.js +14 -61
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +140 -0
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCombobox.js +5 -2
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +13 -47
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +150 -0
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/esm/v2/patterns/FormikInput.js +5 -2
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +141 -0
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikSelect.js +5 -2
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +5 -2
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +25 -8
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +122 -0
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js +74 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +83 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +209 -0
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/index.js +5 -0
- package/dist/esm/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +18 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/FieldError.test.js +26 -30
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldWidth.test.js +150 -0
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +25 -29
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +268 -0
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +247 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +381 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/v2/__tests__/MobileRowCard.test.js +52 -56
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/labels-merge.test.js +20 -24
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/components/DateTimePicker.d.ts.map +1 -1
- package/dist/v2/components/DateTimePicker.js +37 -4
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Field.d.ts +59 -1
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +62 -2
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/index.d.ts +27 -0
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.d.ts +9 -9
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.js +14 -61
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.d.ts +77 -0
- package/dist/v2/patterns/FormikCheckbox.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCheckbox.js +147 -0
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/v2/patterns/FormikCombobox.d.ts +7 -1
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +5 -2
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts +13 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +33 -66
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.d.ts +111 -0
- package/dist/v2/patterns/FormikDateTimePicker.d.ts.map +1 -0
- package/dist/v2/patterns/FormikDateTimePicker.js +158 -0
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/v2/patterns/FormikInput.d.ts +11 -1
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
- package/dist/v2/patterns/FormikInput.js +5 -2
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.d.ts +80 -0
- package/dist/v2/patterns/FormikRadioGroup.d.ts.map +1 -0
- package/dist/v2/patterns/FormikRadioGroup.js +148 -0
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/v2/patterns/FormikSelect.d.ts +9 -1
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +5 -2
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.d.ts +9 -1
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +5 -2
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +14 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +25 -8
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +92 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -0
- package/dist/v2/patterns/RowFavoriteToggle.js +127 -0
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/v2/patterns/_pickerSerialisation.d.ts +44 -0
- package/dist/v2/patterns/_pickerSerialisation.d.ts.map +1 -0
- package/dist/v2/patterns/_pickerSerialisation.js +81 -0
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +87 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +34 -0
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts +100 -0
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js +215 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/v2/personalization/capabilities/index.d.ts +6 -0
- package/dist/v2/personalization/capabilities/index.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +13 -0
- package/dist/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +18 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +13 -0
- package/dist/v2/personalization/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
3
|
require("@testing-library/jest-dom");
|
|
5
|
-
var
|
|
6
|
-
var _react2 = require("@testing-library/react");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
7
5
|
var _DataGrid = _interopRequireDefault(require("../patterns/DataGrid"));
|
|
8
6
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
10
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
11
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
12
8
|
/**
|
|
13
9
|
* Verifies the deep-merge contract for the `labels` prop pattern
|
|
14
10
|
* shared by 17 components / patterns in v2 (Batches 4-7).
|
|
@@ -29,7 +25,7 @@ describe("DataGrid — labels deep-merge contract", function () {
|
|
|
29
25
|
};
|
|
30
26
|
});
|
|
31
27
|
test("with no labels prop, all defaults render in French", function () {
|
|
32
|
-
(0,
|
|
28
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_DataGrid["default"], {
|
|
33
29
|
rows: baseRows,
|
|
34
30
|
columns: [{
|
|
35
31
|
key: "id",
|
|
@@ -44,13 +40,13 @@ describe("DataGrid — labels deep-merge contract", function () {
|
|
|
44
40
|
}));
|
|
45
41
|
|
|
46
42
|
// Pagination FR defaults
|
|
47
|
-
expect(
|
|
48
|
-
expect(
|
|
49
|
-
expect(
|
|
50
|
-
expect(
|
|
43
|
+
expect(_react.screen.getByLabelText("Première page")).toBeInTheDocument();
|
|
44
|
+
expect(_react.screen.getByLabelText("Page précédente")).toBeInTheDocument();
|
|
45
|
+
expect(_react.screen.getByLabelText("Page suivante")).toBeInTheDocument();
|
|
46
|
+
expect(_react.screen.getByLabelText("Dernière page")).toBeInTheDocument();
|
|
51
47
|
});
|
|
52
48
|
test("partial labels.pagination merges onto FR defaults — overridden keys win", function () {
|
|
53
|
-
(0,
|
|
49
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_DataGrid["default"], {
|
|
54
50
|
rows: baseRows,
|
|
55
51
|
columns: [{
|
|
56
52
|
key: "id",
|
|
@@ -72,15 +68,15 @@ describe("DataGrid — labels deep-merge contract", function () {
|
|
|
72
68
|
}));
|
|
73
69
|
|
|
74
70
|
// Custom override applied
|
|
75
|
-
expect(
|
|
71
|
+
expect(_react.screen.getByLabelText("First!")).toBeInTheDocument();
|
|
76
72
|
|
|
77
73
|
// FR defaults preserved (the regression class this test guards)
|
|
78
|
-
expect(
|
|
79
|
-
expect(
|
|
80
|
-
expect(
|
|
74
|
+
expect(_react.screen.getByLabelText("Page précédente")).toBeInTheDocument();
|
|
75
|
+
expect(_react.screen.getByLabelText("Page suivante")).toBeInTheDocument();
|
|
76
|
+
expect(_react.screen.getByLabelText("Dernière page")).toBeInTheDocument();
|
|
81
77
|
});
|
|
82
78
|
test("partial top-level labels merge onto FR defaults", function () {
|
|
83
|
-
(0,
|
|
79
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_DataGrid["default"], {
|
|
84
80
|
rows: baseRows,
|
|
85
81
|
columns: [{
|
|
86
82
|
key: "id",
|
|
@@ -98,14 +94,14 @@ describe("DataGrid — labels deep-merge contract", function () {
|
|
|
98
94
|
// selectAll, selectRow, pagination NOT provided — defaults stand.
|
|
99
95
|
}
|
|
100
96
|
}));
|
|
101
|
-
expect(
|
|
97
|
+
expect(_react.screen.getByLabelText("My table")).toBeInTheDocument();
|
|
102
98
|
// Default selectAll FR survives
|
|
103
|
-
expect(
|
|
99
|
+
expect(_react.screen.getByLabelText("Tout sélectionner")).toBeInTheDocument();
|
|
104
100
|
// Default pagination FR survives
|
|
105
|
-
expect(
|
|
101
|
+
expect(_react.screen.getByLabelText("Première page")).toBeInTheDocument();
|
|
106
102
|
});
|
|
107
103
|
test("legacy ariaLabel prop wins over labels.tableAria (back-compat contract)", function () {
|
|
108
|
-
(0,
|
|
104
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_DataGrid["default"], {
|
|
109
105
|
rows: baseRows,
|
|
110
106
|
columns: [{
|
|
111
107
|
key: "id",
|
|
@@ -122,12 +118,12 @@ describe("DataGrid — labels deep-merge contract", function () {
|
|
|
122
118
|
tableAria: "New label"
|
|
123
119
|
}
|
|
124
120
|
}));
|
|
125
|
-
expect(
|
|
121
|
+
expect(_react.screen.getByLabelText("Legacy wins")).toBeInTheDocument();
|
|
126
122
|
// The labels.tableAria value should NOT appear
|
|
127
|
-
expect(
|
|
123
|
+
expect(_react.screen.queryByLabelText("New label")).not.toBeInTheDocument();
|
|
128
124
|
});
|
|
129
125
|
test("rangeOf custom function reaches the rendered range text", function () {
|
|
130
|
-
(0,
|
|
126
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_DataGrid["default"], {
|
|
131
127
|
rows: baseRows,
|
|
132
128
|
columns: [{
|
|
133
129
|
key: "id",
|
|
@@ -147,7 +143,7 @@ describe("DataGrid — labels deep-merge contract", function () {
|
|
|
147
143
|
}
|
|
148
144
|
}
|
|
149
145
|
}));
|
|
150
|
-
expect(
|
|
146
|
+
expect(_react.screen.getByText(/Showing 1 to 25 of 100/)).toBeInTheDocument();
|
|
151
147
|
});
|
|
152
148
|
});
|
|
153
149
|
//# sourceMappingURL=labels-merge.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels-merge.test.js","names":["require","React","_interopRequireWildcard","_react2","_DataGrid","_interopRequireDefault","_jsxRuntime","obj","__esModule","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","describe","baseRows","Array","from","length","_","i","id","test","render","jsx","rows","columns","header","pagination","page","pageSize","total","onPageChange","expect","screen","getByLabelText","toBeInTheDocument","labels","firstPage","onSelectionChange","tableAria","ariaLabel","queryByLabelText","not","rangeOf","to","concat","getByText"],"sources":["../../../src/lib/v2/__tests__/labels-merge.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport * as React from \"react\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport DataGrid from \"../patterns/DataGrid\";\r\n\r\n/**\r\n * Verifies the deep-merge contract for the `labels` prop pattern\r\n * shared by 17 components / patterns in v2 (Batches 4-7).\r\n *\r\n * DataGrid is the canonical test subject because it has the deepest\r\n * label surface (top-level keys + nested `pagination.*`). The\r\n * Object.freeze on DEFAULT_LABELS protects against accidental\r\n * mutation; the mergeLabels helper must spread the nested object,\r\n * not replace it.\r\n */\r\ninterface Row {\r\n id: number;\r\n}\r\n\r\ndescribe(\"DataGrid — labels deep-merge contract\", () => {\r\n const baseRows: Row[] = Array.from({ length: 10 }, (_, i): Row => ({\r\n id: i + 1,\r\n }));\r\n\r\n test(\"with no labels prop, all defaults render in French\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n />\r\n );\r\n\r\n // Pagination FR defaults\r\n expect(screen.getByLabelText(\"Première page\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Page précédente\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Page suivante\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Dernière page\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"partial labels.pagination merges onto FR defaults — overridden keys win\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n labels={{\r\n pagination: {\r\n firstPage: \"First!\",\r\n // lastPage, previousPage, nextPage, loading, rowsPerPage,\r\n // rangeOf NOT provided — must fall back to FR defaults.\r\n },\r\n }}\r\n />\r\n );\r\n\r\n // Custom override applied\r\n expect(screen.getByLabelText(\"First!\")).toBeInTheDocument();\r\n\r\n // FR defaults preserved (the regression class this test guards)\r\n expect(screen.getByLabelText(\"Page précédente\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Page suivante\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Dernière page\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"partial top-level labels merge onto FR defaults\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n onSelectionChange={() => {}}\r\n labels={{\r\n tableAria: \"My table\",\r\n // selectAll, selectRow, pagination NOT provided — defaults stand.\r\n }}\r\n />\r\n );\r\n\r\n expect(screen.getByLabelText(\"My table\")).toBeInTheDocument();\r\n // Default selectAll FR survives\r\n expect(screen.getByLabelText(\"Tout sélectionner\")).toBeInTheDocument();\r\n // Default pagination FR survives\r\n expect(screen.getByLabelText(\"Première page\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"legacy ariaLabel prop wins over labels.tableAria (back-compat contract)\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n ariaLabel=\"Legacy wins\"\r\n labels={{ tableAria: \"New label\" }}\r\n />\r\n );\r\n\r\n expect(screen.getByLabelText(\"Legacy wins\")).toBeInTheDocument();\r\n // The labels.tableAria value should NOT appear\r\n expect(screen.queryByLabelText(\"New label\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"rangeOf custom function reaches the rendered range text\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n labels={{\r\n pagination: {\r\n rangeOf: (from, to, total) => `Showing ${from} to ${to} of ${total}`,\r\n },\r\n }}\r\n />\r\n );\r\n\r\n expect(screen.getByText(/Showing 1 to 25 of 100/)).toBeInTheDocument();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"labels-merge.test.js","names":["require","_react","_DataGrid","_interopRequireDefault","_jsxRuntime","obj","__esModule","describe","baseRows","Array","from","length","_","i","id","test","render","jsx","rows","columns","key","header","pagination","page","pageSize","total","onPageChange","expect","screen","getByLabelText","toBeInTheDocument","labels","firstPage","onSelectionChange","tableAria","ariaLabel","queryByLabelText","not","rangeOf","to","concat","getByText"],"sources":["../../../src/lib/v2/__tests__/labels-merge.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport DataGrid from \"../patterns/DataGrid\";\r\n\r\n/**\r\n * Verifies the deep-merge contract for the `labels` prop pattern\r\n * shared by 17 components / patterns in v2 (Batches 4-7).\r\n *\r\n * DataGrid is the canonical test subject because it has the deepest\r\n * label surface (top-level keys + nested `pagination.*`). The\r\n * Object.freeze on DEFAULT_LABELS protects against accidental\r\n * mutation; the mergeLabels helper must spread the nested object,\r\n * not replace it.\r\n */\r\ninterface Row {\r\n id: number;\r\n}\r\n\r\ndescribe(\"DataGrid — labels deep-merge contract\", () => {\r\n const baseRows: Row[] = Array.from({ length: 10 }, (_, i): Row => ({\r\n id: i + 1,\r\n }));\r\n\r\n test(\"with no labels prop, all defaults render in French\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n />\r\n );\r\n\r\n // Pagination FR defaults\r\n expect(screen.getByLabelText(\"Première page\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Page précédente\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Page suivante\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Dernière page\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"partial labels.pagination merges onto FR defaults — overridden keys win\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n labels={{\r\n pagination: {\r\n firstPage: \"First!\",\r\n // lastPage, previousPage, nextPage, loading, rowsPerPage,\r\n // rangeOf NOT provided — must fall back to FR defaults.\r\n },\r\n }}\r\n />\r\n );\r\n\r\n // Custom override applied\r\n expect(screen.getByLabelText(\"First!\")).toBeInTheDocument();\r\n\r\n // FR defaults preserved (the regression class this test guards)\r\n expect(screen.getByLabelText(\"Page précédente\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Page suivante\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(\"Dernière page\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"partial top-level labels merge onto FR defaults\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n onSelectionChange={() => {}}\r\n labels={{\r\n tableAria: \"My table\",\r\n // selectAll, selectRow, pagination NOT provided — defaults stand.\r\n }}\r\n />\r\n );\r\n\r\n expect(screen.getByLabelText(\"My table\")).toBeInTheDocument();\r\n // Default selectAll FR survives\r\n expect(screen.getByLabelText(\"Tout sélectionner\")).toBeInTheDocument();\r\n // Default pagination FR survives\r\n expect(screen.getByLabelText(\"Première page\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"legacy ariaLabel prop wins over labels.tableAria (back-compat contract)\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n ariaLabel=\"Legacy wins\"\r\n labels={{ tableAria: \"New label\" }}\r\n />\r\n );\r\n\r\n expect(screen.getByLabelText(\"Legacy wins\")).toBeInTheDocument();\r\n // The labels.tableAria value should NOT appear\r\n expect(screen.queryByLabelText(\"New label\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"rangeOf custom function reaches the rendered range text\", () => {\r\n render(\r\n <DataGrid\r\n rows={baseRows}\r\n columns={[{ key: \"id\", header: \"ID\" }]}\r\n pagination={{ page: 1, pageSize: 25, total: 100, onPageChange: () => {} }}\r\n labels={{\r\n pagination: {\r\n rangeOf: (from, to, total) => `Showing ${from} to ${to} of ${total}`,\r\n },\r\n }}\r\n />\r\n );\r\n\r\n expect(screen.getByText(/Showing 1 to 25 of 100/)).toBeInTheDocument();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/lib/v2/components/DateTimePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGxG,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/lib/v2/components/DateTimePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGxG,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAwF3D,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,sBAAsB,EACtB,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,IAAI,GAAG,KAAK,CACpF;IACD,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,SAAS,CAAC;IACrF,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;IACrE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;CACjC;AAED,QAAA,MAAM,cAAc,4FAgIlB,CAAC;AAEH,eAAO,MAAM,uBAAuB,qBAAiB,CAAC;AAEtD,eAAe,cAAc,CAAC"}
|
|
@@ -51,10 +51,43 @@ var _excluded = ["value", "onChange", "onBlur", "minDate", "maxDate", "disablePa
|
|
|
51
51
|
* the picker dialog also lets the user choose hours/minutes within
|
|
52
52
|
* the resulting day.
|
|
53
53
|
*
|
|
54
|
-
* A11y (DP-1):
|
|
55
|
-
* aria-
|
|
56
|
-
*
|
|
57
|
-
*
|
|
54
|
+
* A11y (DP-1) : when used inside <Field> the injected id + aria-describedby /
|
|
55
|
+
* aria-invalid / aria-required are intercepted and routed onto the field
|
|
56
|
+
* <input> via slotProps.htmlInput (MUI X does not forward top-level aria/id to
|
|
57
|
+
* the input). Explicit `inputProps` still win.
|
|
58
|
+
*
|
|
59
|
+
* ── KNOWN A11Y DEFECT, NOT FIXED HERE (opened as G-F, deferred) ────
|
|
60
|
+
*
|
|
61
|
+
* DP-1's routing lands on the value <input>, and MUI X v9 marks that input
|
|
62
|
+
* `aria-hidden="true"`. The visible field is a `role="group"` of one
|
|
63
|
+
* `role="spinbutton"` per section (Year, Month, Day, Hours, Minutes).
|
|
64
|
+
*
|
|
65
|
+
* So all four association attributes are INERT, on every date field of the
|
|
66
|
+
* platform, and none of it is visible on screen:
|
|
67
|
+
* — the `<label htmlFor>` names nothing: a screen reader announces « Year »,
|
|
68
|
+
* « Month », « Hours » without ever saying of WHAT (R-I.1) ;
|
|
69
|
+
* — a hint or an error message rendered by Field is never announced
|
|
70
|
+
* (R-I.3, R-4.1) ;
|
|
71
|
+
* — a required field does not report itself as required (R-I.2).
|
|
72
|
+
*
|
|
73
|
+
* Found while writing the tests for gap G-E: the DOM dump showed `role="group"`
|
|
74
|
+
* with `Name ""` beside a correctly wired `<label for>`.
|
|
75
|
+
*
|
|
76
|
+
* TWO ATTEMPTS FAILED, and both are worth recording so the next person does
|
|
77
|
+
* not repeat them:
|
|
78
|
+
* 1. routing the attrs through `slotProps.textField.InputProps` — accepted
|
|
79
|
+
* by the types, lands nowhere. `InputProps` is not the v9 anchor for the
|
|
80
|
+
* group element.
|
|
81
|
+
* 2. switching the Formik bridge to `Field`'s `group` mode — `Field` does
|
|
82
|
+
* emit `aria-labelledby` (verified in its source), but with (1) failing
|
|
83
|
+
* nothing carries it to the group, AND group mode drops the `<label
|
|
84
|
+
* for>`, so the label-click-to-focus is lost for no gain. A net
|
|
85
|
+
* regression.
|
|
86
|
+
*
|
|
87
|
+
* The fix needs the real v9 anchor for the `PickersInputBase` root, and it
|
|
88
|
+
* touches DatePicker AND DateTimePicker, hence every date field in the
|
|
89
|
+
* portfolio. It belongs to a pass with time to investigate the slot chain —
|
|
90
|
+
* Batch 10 (accessibility certification), not a side effect of G-E.
|
|
58
91
|
*
|
|
59
92
|
* MUI X v9 surface notes (migrated from v5 in Batch 4):
|
|
60
93
|
* See DatePicker.tsx for the same rationale — renderInput +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimePicker.js","names":["React","_interopRequireWildcard","require","_LocalizationProvider","_DateTimePicker","_AdapterMoment","_pickerShared","_jsxRuntime","_excluded","_excluded2","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","Number","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","CHARTER_FORMAT","DateTimePicker","forwardRef","_ref","ref","onChange","onBlur","minDate","maxDate","_ref$disablePast","disablePast","_ref$disableFuture","disableFuture","_ref$disabled","disabled","_ref$readOnly","readOnly","error","_ref$placeholder","placeholder","_ref$fullWidth","fullWidth","_ref$ampm","ampm","_ref$minutesStep","minutesStep","inputProps","_ref$adapterLocale","adapterLocale","sx","rest","_ref2","fieldId","id","ariaDescribedby","ariaInvalid","ariaRequired","ariaLabelledby","domRest","handleChange","next","momentToDate","slotProps","useMemo","textField","size","fontVariantNumeric","htmlInput","minDateM","dateToMoment","maxDateM","jsx","LocalizationProvider","dateAdapter","AdapterMoment","children","format","DATETIME_FORMAT_CHARTER","exports","_default"],"sources":["../../../src/lib/v2/components/DateTimePicker.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { DateTimePicker as MuiDateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\r\nimport type { DateTimePickerProps as MuiDateTimePickerProps } from \"@mui/x-date-pickers/DateTimePicker\";\r\nimport { AdapterMoment } from \"@mui/x-date-pickers/AdapterMoment\";\r\nimport type { Moment } from \"moment\";\r\nimport \"moment/locale/fr\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport { dateToMoment, momentToDate } from \"./_pickerShared\";\r\n\r\n/**\r\n * DateTimePicker — Portnet UI v2\r\n *\r\n * Extends the DatePicker family (Charter §03) for date+time-of-day\r\n * workflows: LC validity to the minute, audit-log timestamps,\r\n * scheduled exports, deadline pickers.\r\n *\r\n * <Field label=\"Date d'échéance\">\r\n * <DateTimePicker\r\n * value={deadline}\r\n * onChange={setDeadline}\r\n * minDate={new Date()}\r\n * />\r\n * </Field>\r\n *\r\n * Value contract:\r\n * Same as DatePicker — value/onChange exchange Date | null. Invalid\r\n * dates are coerced to null. Hosts never receive Invalid Date.\r\n *\r\n * Locale:\r\n * adapterLocale defaults to \"fr\". Hosts using other locales must\r\n * import the matching moment locale data themselves:\r\n *\r\n * import \"moment/locale/ar\";\r\n * <DateTimePicker adapterLocale=\"ar\" />\r\n *\r\n * Format:\r\n * Display + parse: AAAA-MM-JJ HH:MM (24h). MUI X v6+ derives the\r\n * input mask from this format string automatically.\r\n * ampm={true} switches to 12h with AM/PM marker — opt-in for hosts\r\n * targeting English-speaking users.\r\n *\r\n * Constraints:\r\n * minDate / maxDate accept Date objects. They bound the DATE part;\r\n * the picker dialog also lets the user choose hours/minutes within\r\n * the resulting day.\r\n *\r\n * A11y (DP-1): as with DatePicker, when used inside <Field> the injected id +\r\n * aria-describedby / aria-invalid / aria-required are intercepted and routed\r\n * onto the field <input> via slotProps.htmlInput (MUI X does not forward\r\n * top-level aria/id to the input). Explicit `inputProps` still win.\r\n *\r\n * MUI X v9 surface notes (migrated from v5 in Batch 4):\r\n * See DatePicker.tsx for the same rationale — renderInput +\r\n * inputFormat + mask removed in favor of the unified slots /\r\n * slotProps + format API. The textField slot is the canonical\r\n * input customisation entry point; slotProps.htmlInput is the v9\r\n * landing zone for what used to be TextField's inputProps.\r\n */\r\n\r\nconst CHARTER_FORMAT = \"YYYY-MM-DD HH:mm\";\r\n\r\nexport interface DateTimePickerProps\r\n extends Omit<\r\n MuiDateTimePickerProps,\r\n \"value\" | \"onChange\" | \"minDate\" | \"maxDate\" | \"slots\" | \"slotProps\" | \"sx\" | \"ref\"\r\n > {\r\n value?: Date | null | undefined;\r\n onChange?: ((value: Date | null) => void) | undefined;\r\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement> | undefined;\r\n minDate?: Date | null | undefined;\r\n maxDate?: Date | null | undefined;\r\n error?: boolean | undefined;\r\n placeholder?: string | undefined;\r\n fullWidth?: boolean | undefined;\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement> | undefined;\r\n adapterLocale?: string | undefined;\r\n sx?: SxProps<Theme> | undefined;\r\n}\r\n\r\nconst DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(function DateTimePicker(\r\n {\r\n value,\r\n onChange,\r\n onBlur,\r\n minDate,\r\n maxDate,\r\n disablePast = false,\r\n disableFuture = false,\r\n disabled = false,\r\n readOnly = false,\r\n error,\r\n placeholder = \"AAAA-MM-JJ HH:MM\",\r\n fullWidth = true,\r\n ampm = false,\r\n minutesStep = 1,\r\n inputProps,\r\n adapterLocale = \"fr\",\r\n sx,\r\n ...rest\r\n },\r\n ref,\r\n) {\r\n // DP-1 — see DatePicker.tsx. Field cloneElement-injects the label + hint/error\r\n // association props onto this child; MUI X won't forward top-level aria/id to\r\n // the field input, so intercept them (cast — not part of the picker props) and\r\n // route them onto the <input> via slotProps.htmlInput below. Everything else\r\n // stays in domRest for MuiDateTimePicker.\r\n const {\r\n id: fieldId,\r\n \"aria-describedby\": ariaDescribedby,\r\n \"aria-invalid\": ariaInvalid,\r\n \"aria-required\": ariaRequired,\r\n \"aria-labelledby\": ariaLabelledby,\r\n ...domRest\r\n } = rest as typeof rest & {\r\n id?: string;\r\n \"aria-describedby\"?: string;\r\n \"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\r\n \"aria-required\"?: boolean | \"true\" | \"false\";\r\n \"aria-labelledby\"?: string;\r\n };\r\n\r\n const handleChange = (next: Moment | null) => {\r\n if (!onChange) return;\r\n onChange(momentToDate(next));\r\n };\r\n\r\n // MUI X v9 — see DatePicker.tsx for the slotProps.textField +\r\n // nested slotProps.htmlInput rationale. htmlInput is also the DP-1\r\n // landing zone for the Field-injected id + aria-* so the label /\r\n // hint / error associate with the date-time input.\r\n const slotProps = React.useMemo<NonNullable<MuiDateTimePickerProps[\"slotProps\"]>>(\r\n () => ({\r\n textField: {\r\n ref,\r\n error: !!error,\r\n fullWidth,\r\n size: \"small\",\r\n // onBlur: the textField slot types this as FocusEventHandler<HTMLDivElement>;\r\n // our public onBlur is input-based. Cast (type-only) and include only\r\n // when defined so no explicit undefined reaches the slot.\r\n ...(onBlur ? { onBlur: onBlur as unknown as React.FocusEventHandler<HTMLDivElement> } : {}),\r\n sx: {\r\n // R-T.3 — tabular-nums for vertical alignment in tables/forms.\r\n \"& .MuiOutlinedInput-input\": { fontVariantNumeric: \"tabular-nums\" },\r\n ...sx,\r\n },\r\n slotProps: {\r\n htmlInput: {\r\n placeholder,\r\n // DP-1 — Field-injected association attrs land on the <input>.\r\n ...(fieldId != null ? { id: fieldId } : {}),\r\n ...(ariaDescribedby != null\r\n ? { \"aria-describedby\": ariaDescribedby }\r\n : {}),\r\n ...(ariaInvalid != null ? { \"aria-invalid\": ariaInvalid } : {}),\r\n ...(ariaRequired != null ? { \"aria-required\": ariaRequired } : {}),\r\n ...(ariaLabelledby != null\r\n ? { \"aria-labelledby\": ariaLabelledby }\r\n : {}),\r\n // Explicit host inputProps win over the injected defaults.\r\n ...inputProps,\r\n },\r\n },\r\n },\r\n }),\r\n [\r\n ref,\r\n error,\r\n fullWidth,\r\n onBlur,\r\n sx,\r\n placeholder,\r\n inputProps,\r\n fieldId,\r\n ariaDescribedby,\r\n ariaInvalid,\r\n ariaRequired,\r\n ariaLabelledby,\r\n ],\r\n );\r\n\r\n // exactOptionalPropertyTypes: MUI's minDate/maxDate are `Moment` (not\r\n // `Moment | undefined`), so spread the key only when a bound is set\r\n // rather than passing an explicit `undefined`.\r\n const minDateM = minDate ? dateToMoment(minDate) : null;\r\n const maxDateM = maxDate ? dateToMoment(maxDate) : null;\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterMoment} adapterLocale={adapterLocale}>\r\n <MuiDateTimePicker\r\n value={dateToMoment(value)}\r\n onChange={handleChange}\r\n {...(minDateM ? { minDate: minDateM } : {})}\r\n {...(maxDateM ? { maxDate: maxDateM } : {})}\r\n disablePast={disablePast}\r\n disableFuture={disableFuture}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n ampm={ampm}\r\n minutesStep={minutesStep}\r\n format={CHARTER_FORMAT}\r\n slotProps={slotProps}\r\n {...domRest}\r\n />\r\n </LocalizationProvider>\r\n );\r\n});\r\n\r\nexport const DATETIME_FORMAT_CHARTER = CHARTER_FORMAT;\r\n\r\nexport default DateTimePicker;\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DateTimePicker.js","names":["React","_interopRequireWildcard","require","_LocalizationProvider","_DateTimePicker","_AdapterMoment","_pickerShared","_jsxRuntime","_excluded","_excluded2","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","Number","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","CHARTER_FORMAT","DateTimePicker","forwardRef","_ref","ref","onChange","onBlur","minDate","maxDate","_ref$disablePast","disablePast","_ref$disableFuture","disableFuture","_ref$disabled","disabled","_ref$readOnly","readOnly","error","_ref$placeholder","placeholder","_ref$fullWidth","fullWidth","_ref$ampm","ampm","_ref$minutesStep","minutesStep","inputProps","_ref$adapterLocale","adapterLocale","sx","rest","_ref2","fieldId","id","ariaDescribedby","ariaInvalid","ariaRequired","ariaLabelledby","domRest","handleChange","next","momentToDate","slotProps","useMemo","textField","size","fontVariantNumeric","htmlInput","minDateM","dateToMoment","maxDateM","jsx","LocalizationProvider","dateAdapter","AdapterMoment","children","format","DATETIME_FORMAT_CHARTER","exports","_default"],"sources":["../../../src/lib/v2/components/DateTimePicker.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { DateTimePicker as MuiDateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\r\nimport type { DateTimePickerProps as MuiDateTimePickerProps } from \"@mui/x-date-pickers/DateTimePicker\";\r\nimport { AdapterMoment } from \"@mui/x-date-pickers/AdapterMoment\";\r\nimport type { Moment } from \"moment\";\r\nimport \"moment/locale/fr\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport { dateToMoment, momentToDate } from \"./_pickerShared\";\r\n\r\n/**\r\n * DateTimePicker — Portnet UI v2\r\n *\r\n * Extends the DatePicker family (Charter §03) for date+time-of-day\r\n * workflows: LC validity to the minute, audit-log timestamps,\r\n * scheduled exports, deadline pickers.\r\n *\r\n * <Field label=\"Date d'échéance\">\r\n * <DateTimePicker\r\n * value={deadline}\r\n * onChange={setDeadline}\r\n * minDate={new Date()}\r\n * />\r\n * </Field>\r\n *\r\n * Value contract:\r\n * Same as DatePicker — value/onChange exchange Date | null. Invalid\r\n * dates are coerced to null. Hosts never receive Invalid Date.\r\n *\r\n * Locale:\r\n * adapterLocale defaults to \"fr\". Hosts using other locales must\r\n * import the matching moment locale data themselves:\r\n *\r\n * import \"moment/locale/ar\";\r\n * <DateTimePicker adapterLocale=\"ar\" />\r\n *\r\n * Format:\r\n * Display + parse: AAAA-MM-JJ HH:MM (24h). MUI X v6+ derives the\r\n * input mask from this format string automatically.\r\n * ampm={true} switches to 12h with AM/PM marker — opt-in for hosts\r\n * targeting English-speaking users.\r\n *\r\n * Constraints:\r\n * minDate / maxDate accept Date objects. They bound the DATE part;\r\n * the picker dialog also lets the user choose hours/minutes within\r\n * the resulting day.\r\n *\r\n * A11y (DP-1) : when used inside <Field> the injected id + aria-describedby /\r\n * aria-invalid / aria-required are intercepted and routed onto the field\r\n * <input> via slotProps.htmlInput (MUI X does not forward top-level aria/id to\r\n * the input). Explicit `inputProps` still win.\r\n *\r\n * ── KNOWN A11Y DEFECT, NOT FIXED HERE (opened as G-F, deferred) ────\r\n *\r\n * DP-1's routing lands on the value <input>, and MUI X v9 marks that input\r\n * `aria-hidden=\"true\"`. The visible field is a `role=\"group\"` of one\r\n * `role=\"spinbutton\"` per section (Year, Month, Day, Hours, Minutes).\r\n *\r\n * So all four association attributes are INERT, on every date field of the\r\n * platform, and none of it is visible on screen:\r\n * — the `<label htmlFor>` names nothing: a screen reader announces « Year »,\r\n * « Month », « Hours » without ever saying of WHAT (R-I.1) ;\r\n * — a hint or an error message rendered by Field is never announced\r\n * (R-I.3, R-4.1) ;\r\n * — a required field does not report itself as required (R-I.2).\r\n *\r\n * Found while writing the tests for gap G-E: the DOM dump showed `role=\"group\"`\r\n * with `Name \"\"` beside a correctly wired `<label for>`.\r\n *\r\n * TWO ATTEMPTS FAILED, and both are worth recording so the next person does\r\n * not repeat them:\r\n * 1. routing the attrs through `slotProps.textField.InputProps` — accepted\r\n * by the types, lands nowhere. `InputProps` is not the v9 anchor for the\r\n * group element.\r\n * 2. switching the Formik bridge to `Field`'s `group` mode — `Field` does\r\n * emit `aria-labelledby` (verified in its source), but with (1) failing\r\n * nothing carries it to the group, AND group mode drops the `<label\r\n * for>`, so the label-click-to-focus is lost for no gain. A net\r\n * regression.\r\n *\r\n * The fix needs the real v9 anchor for the `PickersInputBase` root, and it\r\n * touches DatePicker AND DateTimePicker, hence every date field in the\r\n * portfolio. It belongs to a pass with time to investigate the slot chain —\r\n * Batch 10 (accessibility certification), not a side effect of G-E.\r\n *\r\n * MUI X v9 surface notes (migrated from v5 in Batch 4):\r\n * See DatePicker.tsx for the same rationale — renderInput +\r\n * inputFormat + mask removed in favor of the unified slots /\r\n * slotProps + format API. The textField slot is the canonical\r\n * input customisation entry point; slotProps.htmlInput is the v9\r\n * landing zone for what used to be TextField's inputProps.\r\n */\r\n\r\nconst CHARTER_FORMAT = \"YYYY-MM-DD HH:mm\";\r\n\r\nexport interface DateTimePickerProps\r\n extends Omit<\r\n MuiDateTimePickerProps,\r\n \"value\" | \"onChange\" | \"minDate\" | \"maxDate\" | \"slots\" | \"slotProps\" | \"sx\" | \"ref\"\r\n > {\r\n value?: Date | null | undefined;\r\n onChange?: ((value: Date | null) => void) | undefined;\r\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement> | undefined;\r\n minDate?: Date | null | undefined;\r\n maxDate?: Date | null | undefined;\r\n error?: boolean | undefined;\r\n placeholder?: string | undefined;\r\n fullWidth?: boolean | undefined;\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement> | undefined;\r\n adapterLocale?: string | undefined;\r\n sx?: SxProps<Theme> | undefined;\r\n}\r\n\r\nconst DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(function DateTimePicker(\r\n {\r\n value,\r\n onChange,\r\n onBlur,\r\n minDate,\r\n maxDate,\r\n disablePast = false,\r\n disableFuture = false,\r\n disabled = false,\r\n readOnly = false,\r\n error,\r\n placeholder = \"AAAA-MM-JJ HH:MM\",\r\n fullWidth = true,\r\n ampm = false,\r\n minutesStep = 1,\r\n inputProps,\r\n adapterLocale = \"fr\",\r\n sx,\r\n ...rest\r\n },\r\n ref,\r\n) {\r\n // DP-1 — see DatePicker.tsx. Field cloneElement-injects the label + hint/error\r\n // association props onto this child; MUI X won't forward top-level aria/id to\r\n // the field input, so intercept them (cast — not part of the picker props) and\r\n // route them onto the <input> via slotProps.htmlInput below. Everything else\r\n // stays in domRest for MuiDateTimePicker.\r\n const {\r\n id: fieldId,\r\n \"aria-describedby\": ariaDescribedby,\r\n \"aria-invalid\": ariaInvalid,\r\n \"aria-required\": ariaRequired,\r\n \"aria-labelledby\": ariaLabelledby,\r\n ...domRest\r\n } = rest as typeof rest & {\r\n id?: string;\r\n \"aria-describedby\"?: string;\r\n \"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\r\n \"aria-required\"?: boolean | \"true\" | \"false\";\r\n \"aria-labelledby\"?: string;\r\n };\r\n\r\n const handleChange = (next: Moment | null) => {\r\n if (!onChange) return;\r\n onChange(momentToDate(next));\r\n };\r\n\r\n // MUI X v9 — see DatePicker.tsx for the slotProps.textField +\r\n // nested slotProps.htmlInput rationale. htmlInput is also the DP-1\r\n // landing zone for the Field-injected id + aria-* so the label /\r\n // hint / error associate with the date-time input.\r\n const slotProps = React.useMemo<NonNullable<MuiDateTimePickerProps[\"slotProps\"]>>(\r\n () => ({\r\n textField: {\r\n ref,\r\n error: !!error,\r\n fullWidth,\r\n size: \"small\",\r\n // onBlur: the textField slot types this as FocusEventHandler<HTMLDivElement>;\r\n // our public onBlur is input-based. Cast (type-only) and include only\r\n // when defined so no explicit undefined reaches the slot.\r\n ...(onBlur ? { onBlur: onBlur as unknown as React.FocusEventHandler<HTMLDivElement> } : {}),\r\n sx: {\r\n // R-T.3 — tabular-nums for vertical alignment in tables/forms.\r\n \"& .MuiOutlinedInput-input\": { fontVariantNumeric: \"tabular-nums\" },\r\n ...sx,\r\n },\r\n slotProps: {\r\n htmlInput: {\r\n placeholder,\r\n // DP-1 — Field-injected association attrs land on the <input>.\r\n ...(fieldId != null ? { id: fieldId } : {}),\r\n ...(ariaDescribedby != null\r\n ? { \"aria-describedby\": ariaDescribedby }\r\n : {}),\r\n ...(ariaInvalid != null ? { \"aria-invalid\": ariaInvalid } : {}),\r\n ...(ariaRequired != null ? { \"aria-required\": ariaRequired } : {}),\r\n ...(ariaLabelledby != null\r\n ? { \"aria-labelledby\": ariaLabelledby }\r\n : {}),\r\n // Explicit host inputProps win over the injected defaults.\r\n ...inputProps,\r\n },\r\n },\r\n },\r\n }),\r\n [\r\n ref,\r\n error,\r\n fullWidth,\r\n onBlur,\r\n sx,\r\n placeholder,\r\n inputProps,\r\n fieldId,\r\n ariaDescribedby,\r\n ariaInvalid,\r\n ariaRequired,\r\n ariaLabelledby,\r\n ],\r\n );\r\n\r\n // exactOptionalPropertyTypes: MUI's minDate/maxDate are `Moment` (not\r\n // `Moment | undefined`), so spread the key only when a bound is set\r\n // rather than passing an explicit `undefined`.\r\n const minDateM = minDate ? dateToMoment(minDate) : null;\r\n const maxDateM = maxDate ? dateToMoment(maxDate) : null;\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterMoment} adapterLocale={adapterLocale}>\r\n <MuiDateTimePicker\r\n value={dateToMoment(value)}\r\n onChange={handleChange}\r\n {...(minDateM ? { minDate: minDateM } : {})}\r\n {...(maxDateM ? { maxDate: maxDateM } : {})}\r\n disablePast={disablePast}\r\n disableFuture={disableFuture}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n ampm={ampm}\r\n minutesStep={minutesStep}\r\n format={CHARTER_FORMAT}\r\n slotProps={slotProps}\r\n {...domRest}\r\n />\r\n </LocalizationProvider>\r\n );\r\n});\r\n\r\nexport const DATETIME_FORMAT_CHARTER = CHARTER_FORMAT;\r\n\r\nexport default DateTimePicker;\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -35,7 +35,57 @@ import type { SxProps, Theme } from "@mui/material/styles";
|
|
|
35
35
|
* <Field label="Genre" group error={errors.genre}>
|
|
36
36
|
* <RadioGroup … />
|
|
37
37
|
* </Field>
|
|
38
|
+
*
|
|
39
|
+
* ── LARGEUR SEMANTIQUE (gap G-H) ──────────────────────────────
|
|
40
|
+
*
|
|
41
|
+
* `width` rattache le champ a l'un des cinq gabarits imposes par la section
|
|
42
|
+
* « Form Field Width & Layout Standards » des Platform Mandatory UX Patterns.
|
|
43
|
+
* Le standard y interdit explicitement les « arbitrary input field widths » et
|
|
44
|
+
* les « jagged alignment fields within forms », et impose de mapper chaque
|
|
45
|
+
* champ a un gabarit d'apres sa contrainte de CARACTERES :
|
|
46
|
+
*
|
|
47
|
+
* xs 1 a 5 caracteres code postal, CVV, age
|
|
48
|
+
* s 6 a 15 telephone, montant, date, identifiant court
|
|
49
|
+
* m 16 a 60 nom, courriel, ville, liste simple
|
|
50
|
+
* l 61 a 256 adresse, recherche complexe, longue liste
|
|
51
|
+
* xl 257 et plus zone de texte, description, editeur
|
|
52
|
+
*
|
|
53
|
+
* POURQUOI SUR `Field` ET NON SUR CHAQUE CONTROLE. Le gabarit est une
|
|
54
|
+
* contrainte de MISE EN PAGE, pas une propriete de l'input : c'est la boite du
|
|
55
|
+
* champ - libelle, controle, indication, erreur - qui doit etre bornee, sinon
|
|
56
|
+
* le message d'erreur s'etale sur toute la cellule pendant que l'input est
|
|
57
|
+
* borne. `Field` est le seul endroit qui voit cette boite entiere.
|
|
58
|
+
*
|
|
59
|
+
* POURQUOI UN PLAFOND ET NON UNE LARGEUR FIXE. Le standard exige aussi que les
|
|
60
|
+
* champs soient empiles « 100% grid width » sur mobile, et que des champs
|
|
61
|
+
* heterogenes s'alignent sur des fractions de colonnes. Un `maxWidth`
|
|
62
|
+
* n'est donc pose qu'a partir de `sm` : la grille continue de decider des
|
|
63
|
+
* COLONNES, le gabarit borne le champ DANS sa cellule. Les deux regles
|
|
64
|
+
* coexistent au lieu de se contredire.
|
|
65
|
+
*
|
|
66
|
+
* >>> LES CINQ VALEURS SONT UNE DECISION DE DESIGN, PAS UNE LECTURE. Le
|
|
67
|
+
* >>> standard donne des FOURCHETTES (« ~80px to 120px max »). J'ai retenu le
|
|
68
|
+
* >>> HAUT de chaque fourchette, ces largeurs etant des plafonds : prendre le
|
|
69
|
+
* >>> bas tronquerait des valeurs qui tiennent dans la contrainte de
|
|
70
|
+
* >>> caracteres annoncee. A confirmer par l'equipe design ; les cinq nombres
|
|
71
|
+
* >>> sont exposes en variables CSS pour etre revus sans toucher au code. <<<
|
|
38
72
|
*/
|
|
73
|
+
/**
|
|
74
|
+
* Gabarits de largeur semantique (G-H). Voir la note en tete de fichier.
|
|
75
|
+
*
|
|
76
|
+
* Les valeurs passent par des variables CSS pour que l'equipe design puisse
|
|
77
|
+
* les revoir sans modification de code. Les replis sont le HAUT de chaque
|
|
78
|
+
* fourchette du standard, ces largeurs etant des plafonds.
|
|
79
|
+
*/
|
|
80
|
+
export type FieldWidth = "xs" | "s" | "m" | "l" | "xl";
|
|
81
|
+
/**
|
|
82
|
+
* Exporte pour etre TESTABLE : le plafond ne s'applique qu'a partir de `sm`,
|
|
83
|
+
* donc via une requete media qu'`emotion` injecte dans la feuille de style et
|
|
84
|
+
* que jsdom ne resout pas. Un test de rendu ne peut donc pas lire la largeur
|
|
85
|
+
* effective ; il peut en revanche epingler les cinq valeurs, ce qui est le
|
|
86
|
+
* point sensible (elles sont une decision de design, voir la note ci-dessus).
|
|
87
|
+
*/
|
|
88
|
+
export declare const FIELD_MAX_WIDTH: Record<FieldWidth, string>;
|
|
39
89
|
export interface FieldProps {
|
|
40
90
|
label?: React.ReactNode | undefined;
|
|
41
91
|
required?: boolean | undefined;
|
|
@@ -50,6 +100,14 @@ export interface FieldProps {
|
|
|
50
100
|
* instead of `htmlFor` / `id`.
|
|
51
101
|
*/
|
|
52
102
|
group?: boolean | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Gabarit de largeur semantique (G-H) : `xs` | `s` | `m` | `l` | `xl`,
|
|
105
|
+
* choisi d'apres la contrainte de CARACTERES du champ. Voir la note en tete
|
|
106
|
+
* de fichier. Omis = aucun plafond, la cellule de grille decide seule -
|
|
107
|
+
* c'est le comportement d'avant G-H, donc rien ne change pour les appelants
|
|
108
|
+
* existants.
|
|
109
|
+
*/
|
|
110
|
+
width?: FieldWidth | undefined;
|
|
53
111
|
/** Optional <FieldHelp> element rendered next to the label. */
|
|
54
112
|
helpAdornment?: React.ReactNode | undefined;
|
|
55
113
|
/** The single form-control element to wrap. */
|
|
@@ -57,7 +115,7 @@ export interface FieldProps {
|
|
|
57
115
|
sx?: SxProps<Theme> | undefined;
|
|
58
116
|
className?: string | undefined;
|
|
59
117
|
}
|
|
60
|
-
declare function Field({ label, required, hint, error, htmlFor, fullWidth, disabled, group, children, helpAdornment, // optional <FieldHelp> element
|
|
118
|
+
declare function Field({ label, required, hint, error, htmlFor, fullWidth, disabled, group, width, children, helpAdornment, // optional <FieldHelp> element
|
|
61
119
|
sx, className, }: FieldProps): React.JSX.Element;
|
|
62
120
|
export default Field;
|
|
63
121
|
//# sourceMappingURL=Field.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/lib/v2/components/Field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAG3D
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/lib/v2/components/Field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAMtD,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5C,+CAA+C;IAC/C,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;IAC7B,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,iBAAS,KAAK,CAAC,EACb,KAAK,EACL,QAAgB,EAChB,IAAI,EACJ,KAAK,EACL,OAAO,EACP,SAAgB,EAChB,QAAQ,EACR,KAAa,EACb,KAAK,EACL,QAAQ,EACR,aAAa,EAAE,+BAA+B;AAC9C,EAAE,EACF,SAAS,GACV,EAAE,UAAU,qBAyJZ;AAED,eAAe,KAAK,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports["default"] = void 0;
|
|
6
|
+
exports["default"] = exports.FIELD_MAX_WIDTH = void 0;
|
|
7
7
|
var React = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
|
|
9
9
|
var _FormLabel = _interopRequireDefault(require("@mui/material/FormLabel"));
|
|
@@ -54,7 +54,61 @@ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input ==
|
|
|
54
54
|
* <Field label="Genre" group error={errors.genre}>
|
|
55
55
|
* <RadioGroup … />
|
|
56
56
|
* </Field>
|
|
57
|
+
*
|
|
58
|
+
* ── LARGEUR SEMANTIQUE (gap G-H) ──────────────────────────────
|
|
59
|
+
*
|
|
60
|
+
* `width` rattache le champ a l'un des cinq gabarits imposes par la section
|
|
61
|
+
* « Form Field Width & Layout Standards » des Platform Mandatory UX Patterns.
|
|
62
|
+
* Le standard y interdit explicitement les « arbitrary input field widths » et
|
|
63
|
+
* les « jagged alignment fields within forms », et impose de mapper chaque
|
|
64
|
+
* champ a un gabarit d'apres sa contrainte de CARACTERES :
|
|
65
|
+
*
|
|
66
|
+
* xs 1 a 5 caracteres code postal, CVV, age
|
|
67
|
+
* s 6 a 15 telephone, montant, date, identifiant court
|
|
68
|
+
* m 16 a 60 nom, courriel, ville, liste simple
|
|
69
|
+
* l 61 a 256 adresse, recherche complexe, longue liste
|
|
70
|
+
* xl 257 et plus zone de texte, description, editeur
|
|
71
|
+
*
|
|
72
|
+
* POURQUOI SUR `Field` ET NON SUR CHAQUE CONTROLE. Le gabarit est une
|
|
73
|
+
* contrainte de MISE EN PAGE, pas une propriete de l'input : c'est la boite du
|
|
74
|
+
* champ - libelle, controle, indication, erreur - qui doit etre bornee, sinon
|
|
75
|
+
* le message d'erreur s'etale sur toute la cellule pendant que l'input est
|
|
76
|
+
* borne. `Field` est le seul endroit qui voit cette boite entiere.
|
|
77
|
+
*
|
|
78
|
+
* POURQUOI UN PLAFOND ET NON UNE LARGEUR FIXE. Le standard exige aussi que les
|
|
79
|
+
* champs soient empiles « 100% grid width » sur mobile, et que des champs
|
|
80
|
+
* heterogenes s'alignent sur des fractions de colonnes. Un `maxWidth`
|
|
81
|
+
* n'est donc pose qu'a partir de `sm` : la grille continue de decider des
|
|
82
|
+
* COLONNES, le gabarit borne le champ DANS sa cellule. Les deux regles
|
|
83
|
+
* coexistent au lieu de se contredire.
|
|
84
|
+
*
|
|
85
|
+
* >>> LES CINQ VALEURS SONT UNE DECISION DE DESIGN, PAS UNE LECTURE. Le
|
|
86
|
+
* >>> standard donne des FOURCHETTES (« ~80px to 120px max »). J'ai retenu le
|
|
87
|
+
* >>> HAUT de chaque fourchette, ces largeurs etant des plafonds : prendre le
|
|
88
|
+
* >>> bas tronquerait des valeurs qui tiennent dans la contrainte de
|
|
89
|
+
* >>> caracteres annoncee. A confirmer par l'equipe design ; les cinq nombres
|
|
90
|
+
* >>> sont exposes en variables CSS pour etre revus sans toucher au code. <<<
|
|
91
|
+
*/ /**
|
|
92
|
+
* Gabarits de largeur semantique (G-H). Voir la note en tete de fichier.
|
|
93
|
+
*
|
|
94
|
+
* Les valeurs passent par des variables CSS pour que l'equipe design puisse
|
|
95
|
+
* les revoir sans modification de code. Les replis sont le HAUT de chaque
|
|
96
|
+
* fourchette du standard, ces largeurs etant des plafonds.
|
|
97
|
+
*/
|
|
98
|
+
/**
|
|
99
|
+
* Exporte pour etre TESTABLE : le plafond ne s'applique qu'a partir de `sm`,
|
|
100
|
+
* donc via une requete media qu'`emotion` injecte dans la feuille de style et
|
|
101
|
+
* que jsdom ne resout pas. Un test de rendu ne peut donc pas lire la largeur
|
|
102
|
+
* effective ; il peut en revanche epingler les cinq valeurs, ce qui est le
|
|
103
|
+
* point sensible (elles sont une decision de design, voir la note ci-dessus).
|
|
57
104
|
*/
|
|
105
|
+
var FIELD_MAX_WIDTH = exports.FIELD_MAX_WIDTH = {
|
|
106
|
+
xs: "var(--field-w-xs, 120px)",
|
|
107
|
+
s: "var(--field-w-s, 200px)",
|
|
108
|
+
m: "var(--field-w-m, 400px)",
|
|
109
|
+
l: "var(--field-w-l, 600px)",
|
|
110
|
+
xl: "100%"
|
|
111
|
+
};
|
|
58
112
|
function Field(_ref) {
|
|
59
113
|
var label = _ref.label,
|
|
60
114
|
_ref$required = _ref.required,
|
|
@@ -67,6 +121,7 @@ function Field(_ref) {
|
|
|
67
121
|
disabled = _ref.disabled,
|
|
68
122
|
_ref$group = _ref.group,
|
|
69
123
|
group = _ref$group === void 0 ? false : _ref$group,
|
|
124
|
+
width = _ref.width,
|
|
70
125
|
children = _ref.children,
|
|
71
126
|
helpAdornment = _ref.helpAdornment,
|
|
72
127
|
sx = _ref.sx,
|
|
@@ -155,7 +210,12 @@ function Field(_ref) {
|
|
|
155
210
|
disabled: disabled,
|
|
156
211
|
fullWidth: fullWidth,
|
|
157
212
|
className: className,
|
|
158
|
-
sx:
|
|
213
|
+
sx: _objectSpread(_objectSpread({}, width ? {
|
|
214
|
+
maxWidth: {
|
|
215
|
+
xs: "100%",
|
|
216
|
+
sm: FIELD_MAX_WIDTH[width]
|
|
217
|
+
}
|
|
218
|
+
} : {}), sx),
|
|
159
219
|
children: [label && (group ?
|
|
160
220
|
/*#__PURE__*/
|
|
161
221
|
// Group mode: render as a <span> carrying an id (no <label for>),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.js","names":["React","_interopRequireWildcard","require","_FormControl","_interopRequireDefault","_FormLabel","_FormHelperText","_Box","_FieldError","_jsxRuntime","obj","__esModule","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","Symbol","iterator","constructor","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","toPrimitive","undefined","res","TypeError","Number","Field","_ref","label","_ref$required","required","error","htmlFor","_ref$fullWidth","fullWidth","disabled","_ref$group","group","children","helpAdornment","sx","className","reactId","useId","auto","concat","replace","inputId","hintId","errorId","labelId","hasError","child","Children","only","childProps","props","describedBy","Boolean","join","labelledBy","enhanced","cloneElement","id","helperResetSx","marginInlineStart","fontSize","LABEL_SX","display","alignItems","gap","fontWeight","color","marginBottom","labelContent","jsxs","Fragment","jsx","component","marginTop","_default","exports"],"sources":["../../../src/lib/v2/components/Field.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport FormLabel from \"@mui/material/FormLabel\";\r\nimport FormHelperText from \"@mui/material/FormHelperText\";\r\nimport Box from \"@mui/material/Box\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport FieldError from \"./FieldError\";\r\n\r\n/**\r\n * Field — Portnet UI v2\r\n *\r\n * Charter §03 · Component \"Input · Field\".\r\n * Universal wrapper providing label / required marker / hint / error / a11y bindings\r\n * for any form control (Input, Select, Textarea, Autocomplete, Combobox, …).\r\n *\r\n * Strict rules enforced:\r\n * R-I.1 — Label is associated to the control via `htmlFor` / `id`.\r\n * R-I.2 — Required adds the asterisk + `aria-required`.\r\n * R-I.3 — Error: `aria-invalid` + `aria-describedby` linking the message.\r\n * Field MERGES with the child's existing `aria-describedby` so a\r\n * consumer-supplied external help id is never lost. The message\r\n * itself is rendered by the shared `FieldError` primitive, which\r\n * carries the R-4.1 MUST icon (gap G-18) — previously this component\r\n * rendered a bare red `FormHelperText` with no icon, so the canonical\r\n * field wrapper did not satisfy a MUST and every module inherited the\r\n * gap on every form.\r\n * R-I.4 — Validation in `blur`, not `change` (caller's responsibility).\r\n * R-I.6 — Hint visible above error; never both at once.\r\n *\r\n * <Field label=\"Référence\" required hint=\"Format AAAA-IM-NNNNN\" error={errors.ref}>\r\n * <Input value={value} onChange={onChange} />\r\n * </Field>\r\n *\r\n * Grouping controls (RadioGroup / CheckboxGroup) — pass `group`:\r\n * A native `<label htmlFor>` cannot name an ARIA group (only labelable\r\n * elements can be `for`-targeted), so in `group` mode the label is rendered\r\n * as a <span> with an id and the child group is associated via\r\n * `aria-labelledby` instead. The child must forward `aria-labelledby`\r\n * (and `aria-describedby`) onto its `role=\"group\"`/`\"radiogroup\"` element.\r\n *\r\n * <Field label=\"Genre\" group error={errors.genre}>\r\n * <RadioGroup … />\r\n * </Field>\r\n */\r\nexport interface FieldProps {\r\n label?: React.ReactNode | undefined;\r\n required?: boolean | undefined;\r\n hint?: React.ReactNode | undefined;\r\n error?: React.ReactNode | undefined;\r\n htmlFor?: string | undefined;\r\n fullWidth?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n /**\r\n * The wrapped child is an ARIA group (RadioGroup / CheckboxGroup) rather than\r\n * a single labelable control. Associates the label via `aria-labelledby`\r\n * instead of `htmlFor` / `id`.\r\n */\r\n group?: boolean | undefined;\r\n /** Optional <FieldHelp> element rendered next to the label. */\r\n helpAdornment?: React.ReactNode | undefined;\r\n /** The single form-control element to wrap. */\r\n children: React.ReactElement;\r\n sx?: SxProps<Theme> | undefined;\r\n className?: string | undefined;\r\n}\r\n\r\nfunction Field({\r\n label,\r\n required = false,\r\n hint,\r\n error,\r\n htmlFor,\r\n fullWidth = true,\r\n disabled,\r\n group = false,\r\n children,\r\n helpAdornment, // optional <FieldHelp> element\r\n sx,\r\n className,\r\n}: FieldProps) {\r\n // R-I.1 — useId provides SSR-safe, per-instance, stable IDs.\r\n // Replaces the previous module-scoped counter (`let __uid = 0`) which broke\r\n // hydration and Concurrent Mode.\r\n const reactId = React.useId();\r\n const auto = `pui-${reactId.replace(/:/g, \"\")}`;\r\n const inputId = htmlFor || auto;\r\n const hintId = `${inputId}-h`;\r\n const errorId = `${inputId}-e`;\r\n const labelId = `${inputId}-l`;\r\n const hasError = !!error;\r\n\r\n const child = React.Children.only(children);\r\n // The wrapped control is polymorphic (Input/Select/NumberInput/Combobox/…);\r\n // type only the props Field reads/merges, replacing React's `props: any`.\r\n const childProps = child.props as {\r\n id?: string;\r\n disabled?: boolean;\r\n fullWidth?: boolean;\r\n \"aria-describedby\"?: string;\r\n \"aria-labelledby\"?: string;\r\n };\r\n\r\n // R-I.3 — MERGE the child's existing aria-describedby with our hint/error\r\n // ids. cloneElement replaces props, so without an explicit merge any\r\n // consumer-supplied describedby was silently discarded.\r\n const describedBy = [\r\n childProps[\"aria-describedby\"],\r\n hint && !hasError ? hintId : null,\r\n hasError ? errorId : null,\r\n ].filter(Boolean).join(\" \") || undefined;\r\n\r\n // CC-6 — in group mode the label names the group via aria-labelledby.\r\n // Merge with any consumer-supplied labelledby so it is never lost.\r\n const labelledBy = group\r\n ? [childProps[\"aria-labelledby\"], label ? labelId : null]\r\n .filter(Boolean)\r\n .join(\" \") || undefined\r\n : undefined;\r\n\r\n const enhanced = React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\r\n id: childProps.id || inputId,\r\n \"aria-invalid\": hasError ? \"true\" : undefined,\r\n \"aria-required\": required ? \"true\" : undefined,\r\n \"aria-describedby\": describedBy,\r\n // Only in group mode — a single labelable control is named by the\r\n // htmlFor/id pair below, not by aria-labelledby.\r\n ...(group ? { \"aria-labelledby\": labelledBy } : {}),\r\n // `error` / `disabled` are broadcast by FormControl via context for MUI\r\n // inputs, but several v2 inputs (NumberInput, Combobox renderInput) are\r\n // not pure MUI children and read the props directly — keep them explicit.\r\n error: hasError,\r\n disabled: disabled || childProps.disabled,\r\n // Respect the child's explicit fullWidth when defined (e.g. a narrow\r\n // inline filter input). Only fall back to Field's value when the child\r\n // hasn't expressed an opinion.\r\n fullWidth: childProps.fullWidth !== undefined ? childProps.fullWidth : fullWidth,\r\n });\r\n\r\n // R-I.6 — RTL-safe margin reset. `marginLeft: 0` only zeroes the LTR\r\n // inline-start; in [dir=\"rtl\"] the helper picks up MUI's default on\r\n // the (now physical-right but logical-start) side and is mis-aligned.\r\n // `marginInlineStart` resets the correct edge in both directions.\r\n const helperResetSx = { marginInlineStart: 0, fontSize: \"var(--text-xs)\" };\r\n\r\n const LABEL_SX = {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"var(--s-1)\",\r\n fontSize: \"var(--text-xs, 12px)\",\r\n fontWeight: \"var(--fw-semibold, 600)\",\r\n color: \"var(--fg-muted)\",\r\n marginBottom: \"var(--s-2)\",\r\n \"&.Mui-focused\": { color: \"var(--fg-muted)\" },\r\n \"&.Mui-error\": { color: \"var(--fg-muted)\" },\r\n } as const;\r\n\r\n // Shared label content (text + required marker + optional help adornment).\r\n const labelContent = (\r\n <>\r\n {label}\r\n {required && (\r\n <Box\r\n component=\"span\"\r\n aria-hidden=\"true\"\r\n sx={{ color: \"var(--danger)\", fontWeight: \"var(--fw-bold, 700)\" }}\r\n >\r\n *\r\n </Box>\r\n )}\r\n {helpAdornment}\r\n </>\r\n );\r\n\r\n return (\r\n <FormControl\r\n error={hasError}\r\n required={required}\r\n disabled={disabled}\r\n fullWidth={fullWidth}\r\n className={className}\r\n sx={sx}\r\n >\r\n {label &&\r\n (group ? (\r\n // Group mode: render as a <span> carrying an id (no <label for>),\r\n // referenced by the group's aria-labelledby.\r\n <FormLabel component=\"span\" id={labelId} required={false} sx={LABEL_SX}>\r\n {labelContent}\r\n </FormLabel>\r\n ) : (\r\n <FormLabel htmlFor={inputId} required={false /* we render the * ourselves */} sx={LABEL_SX}>\r\n {labelContent}\r\n </FormLabel>\r\n ))}\r\n\r\n {enhanced}\r\n\r\n {hint && !hasError && (\r\n <FormHelperText\r\n id={hintId}\r\n sx={{ ...helperResetSx, color: \"var(--fg-subtle)\" }}\r\n >\r\n {hint}\r\n </FormHelperText>\r\n )}\r\n\r\n {hasError && (\r\n /*\r\n * Rendered by the shared `FieldError` (gap G-18) rather than an inline\r\n * `FormHelperText`: R-4.1 MUST requires the icon, and a host with a\r\n * LIST-level error (a Formik array, an upload slot) has no single\r\n * control to wrap in a `Field` and needs the exact same renderer\r\n * standalone. One component, both paths, no drift.\r\n *\r\n * `marginTop: var(--s-1)` (4px) replaces `FormHelperText`'s hard-coded\r\n * 3px default — same optical result, on the spacing scale (R-S.1).\r\n * Dropping FormHelperText also removed a `color: … !important` that\r\n * only existed to beat MUI's own `Mui-error` colour.\r\n */\r\n <FieldError id={errorId} sx={{ marginTop: \"var(--s-1)\" }}>\r\n {error}\r\n </FieldError>\r\n )}\r\n </FormControl>\r\n );\r\n}\r\n\r\nexport default Field;\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Field.js","names":["React","_interopRequireWildcard","require","_FormControl","_interopRequireDefault","_FormLabel","_FormHelperText","_Box","_FieldError","_jsxRuntime","obj","__esModule","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","Symbol","iterator","constructor","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","toPrimitive","undefined","res","TypeError","Number","FIELD_MAX_WIDTH","exports","xs","s","m","l","xl","Field","_ref","label","_ref$required","required","error","htmlFor","_ref$fullWidth","fullWidth","disabled","_ref$group","group","width","children","helpAdornment","sx","className","reactId","useId","auto","concat","replace","inputId","hintId","errorId","labelId","hasError","child","Children","only","childProps","props","describedBy","Boolean","join","labelledBy","enhanced","cloneElement","id","helperResetSx","marginInlineStart","fontSize","LABEL_SX","display","alignItems","gap","fontWeight","color","marginBottom","labelContent","jsxs","Fragment","jsx","component","maxWidth","sm","marginTop","_default"],"sources":["../../../src/lib/v2/components/Field.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport FormLabel from \"@mui/material/FormLabel\";\r\nimport FormHelperText from \"@mui/material/FormHelperText\";\r\nimport Box from \"@mui/material/Box\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport FieldError from \"./FieldError\";\r\n\r\n/**\r\n * Field — Portnet UI v2\r\n *\r\n * Charter §03 · Component \"Input · Field\".\r\n * Universal wrapper providing label / required marker / hint / error / a11y bindings\r\n * for any form control (Input, Select, Textarea, Autocomplete, Combobox, …).\r\n *\r\n * Strict rules enforced:\r\n * R-I.1 — Label is associated to the control via `htmlFor` / `id`.\r\n * R-I.2 — Required adds the asterisk + `aria-required`.\r\n * R-I.3 — Error: `aria-invalid` + `aria-describedby` linking the message.\r\n * Field MERGES with the child's existing `aria-describedby` so a\r\n * consumer-supplied external help id is never lost. The message\r\n * itself is rendered by the shared `FieldError` primitive, which\r\n * carries the R-4.1 MUST icon (gap G-18) — previously this component\r\n * rendered a bare red `FormHelperText` with no icon, so the canonical\r\n * field wrapper did not satisfy a MUST and every module inherited the\r\n * gap on every form.\r\n * R-I.4 — Validation in `blur`, not `change` (caller's responsibility).\r\n * R-I.6 — Hint visible above error; never both at once.\r\n *\r\n * <Field label=\"Référence\" required hint=\"Format AAAA-IM-NNNNN\" error={errors.ref}>\r\n * <Input value={value} onChange={onChange} />\r\n * </Field>\r\n *\r\n * Grouping controls (RadioGroup / CheckboxGroup) — pass `group`:\r\n * A native `<label htmlFor>` cannot name an ARIA group (only labelable\r\n * elements can be `for`-targeted), so in `group` mode the label is rendered\r\n * as a <span> with an id and the child group is associated via\r\n * `aria-labelledby` instead. The child must forward `aria-labelledby`\r\n * (and `aria-describedby`) onto its `role=\"group\"`/`\"radiogroup\"` element.\r\n *\r\n * <Field label=\"Genre\" group error={errors.genre}>\r\n * <RadioGroup … />\r\n * </Field>\r\n *\r\n * ── LARGEUR SEMANTIQUE (gap G-H) ──────────────────────────────\r\n *\r\n * `width` rattache le champ a l'un des cinq gabarits imposes par la section\r\n * « Form Field Width & Layout Standards » des Platform Mandatory UX Patterns.\r\n * Le standard y interdit explicitement les « arbitrary input field widths » et\r\n * les « jagged alignment fields within forms », et impose de mapper chaque\r\n * champ a un gabarit d'apres sa contrainte de CARACTERES :\r\n *\r\n * xs 1 a 5 caracteres code postal, CVV, age\r\n * s 6 a 15 telephone, montant, date, identifiant court\r\n * m 16 a 60 nom, courriel, ville, liste simple\r\n * l 61 a 256 adresse, recherche complexe, longue liste\r\n * xl 257 et plus zone de texte, description, editeur\r\n *\r\n * POURQUOI SUR `Field` ET NON SUR CHAQUE CONTROLE. Le gabarit est une\r\n * contrainte de MISE EN PAGE, pas une propriete de l'input : c'est la boite du\r\n * champ - libelle, controle, indication, erreur - qui doit etre bornee, sinon\r\n * le message d'erreur s'etale sur toute la cellule pendant que l'input est\r\n * borne. `Field` est le seul endroit qui voit cette boite entiere.\r\n *\r\n * POURQUOI UN PLAFOND ET NON UNE LARGEUR FIXE. Le standard exige aussi que les\r\n * champs soient empiles « 100% grid width » sur mobile, et que des champs\r\n * heterogenes s'alignent sur des fractions de colonnes. Un `maxWidth`\r\n * n'est donc pose qu'a partir de `sm` : la grille continue de decider des\r\n * COLONNES, le gabarit borne le champ DANS sa cellule. Les deux regles\r\n * coexistent au lieu de se contredire.\r\n *\r\n * >>> LES CINQ VALEURS SONT UNE DECISION DE DESIGN, PAS UNE LECTURE. Le\r\n * >>> standard donne des FOURCHETTES (« ~80px to 120px max »). J'ai retenu le\r\n * >>> HAUT de chaque fourchette, ces largeurs etant des plafonds : prendre le\r\n * >>> bas tronquerait des valeurs qui tiennent dans la contrainte de\r\n * >>> caracteres annoncee. A confirmer par l'equipe design ; les cinq nombres\r\n * >>> sont exposes en variables CSS pour etre revus sans toucher au code. <<<\r\n */\r\n\r\n/**\r\n * Gabarits de largeur semantique (G-H). Voir la note en tete de fichier.\r\n *\r\n * Les valeurs passent par des variables CSS pour que l'equipe design puisse\r\n * les revoir sans modification de code. Les replis sont le HAUT de chaque\r\n * fourchette du standard, ces largeurs etant des plafonds.\r\n */\r\nexport type FieldWidth = \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\";\r\n\r\n/**\r\n * Exporte pour etre TESTABLE : le plafond ne s'applique qu'a partir de `sm`,\r\n * donc via une requete media qu'`emotion` injecte dans la feuille de style et\r\n * que jsdom ne resout pas. Un test de rendu ne peut donc pas lire la largeur\r\n * effective ; il peut en revanche epingler les cinq valeurs, ce qui est le\r\n * point sensible (elles sont une decision de design, voir la note ci-dessus).\r\n */\r\nexport const FIELD_MAX_WIDTH: Record<FieldWidth, string> = {\r\n xs: \"var(--field-w-xs, 120px)\",\r\n s: \"var(--field-w-s, 200px)\",\r\n m: \"var(--field-w-m, 400px)\",\r\n l: \"var(--field-w-l, 600px)\",\r\n xl: \"100%\",\r\n};\r\n\r\nexport interface FieldProps {\r\n label?: React.ReactNode | undefined;\r\n required?: boolean | undefined;\r\n hint?: React.ReactNode | undefined;\r\n error?: React.ReactNode | undefined;\r\n htmlFor?: string | undefined;\r\n fullWidth?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n /**\r\n * The wrapped child is an ARIA group (RadioGroup / CheckboxGroup) rather than\r\n * a single labelable control. Associates the label via `aria-labelledby`\r\n * instead of `htmlFor` / `id`.\r\n */\r\n group?: boolean | undefined;\r\n /**\r\n * Gabarit de largeur semantique (G-H) : `xs` | `s` | `m` | `l` | `xl`,\r\n * choisi d'apres la contrainte de CARACTERES du champ. Voir la note en tete\r\n * de fichier. Omis = aucun plafond, la cellule de grille decide seule -\r\n * c'est le comportement d'avant G-H, donc rien ne change pour les appelants\r\n * existants.\r\n */\r\n width?: FieldWidth | undefined;\r\n /** Optional <FieldHelp> element rendered next to the label. */\r\n helpAdornment?: React.ReactNode | undefined;\r\n /** The single form-control element to wrap. */\r\n children: React.ReactElement;\r\n sx?: SxProps<Theme> | undefined;\r\n className?: string | undefined;\r\n}\r\n\r\nfunction Field({\r\n label,\r\n required = false,\r\n hint,\r\n error,\r\n htmlFor,\r\n fullWidth = true,\r\n disabled,\r\n group = false,\r\n width,\r\n children,\r\n helpAdornment, // optional <FieldHelp> element\r\n sx,\r\n className,\r\n}: FieldProps) {\r\n // R-I.1 — useId provides SSR-safe, per-instance, stable IDs.\r\n // Replaces the previous module-scoped counter (`let __uid = 0`) which broke\r\n // hydration and Concurrent Mode.\r\n const reactId = React.useId();\r\n const auto = `pui-${reactId.replace(/:/g, \"\")}`;\r\n const inputId = htmlFor || auto;\r\n const hintId = `${inputId}-h`;\r\n const errorId = `${inputId}-e`;\r\n const labelId = `${inputId}-l`;\r\n const hasError = !!error;\r\n\r\n const child = React.Children.only(children);\r\n // The wrapped control is polymorphic (Input/Select/NumberInput/Combobox/…);\r\n // type only the props Field reads/merges, replacing React's `props: any`.\r\n const childProps = child.props as {\r\n id?: string;\r\n disabled?: boolean;\r\n fullWidth?: boolean;\r\n \"aria-describedby\"?: string;\r\n \"aria-labelledby\"?: string;\r\n };\r\n\r\n // R-I.3 — MERGE the child's existing aria-describedby with our hint/error\r\n // ids. cloneElement replaces props, so without an explicit merge any\r\n // consumer-supplied describedby was silently discarded.\r\n const describedBy = [\r\n childProps[\"aria-describedby\"],\r\n hint && !hasError ? hintId : null,\r\n hasError ? errorId : null,\r\n ].filter(Boolean).join(\" \") || undefined;\r\n\r\n // CC-6 — in group mode the label names the group via aria-labelledby.\r\n // Merge with any consumer-supplied labelledby so it is never lost.\r\n const labelledBy = group\r\n ? [childProps[\"aria-labelledby\"], label ? labelId : null]\r\n .filter(Boolean)\r\n .join(\" \") || undefined\r\n : undefined;\r\n\r\n const enhanced = React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\r\n id: childProps.id || inputId,\r\n \"aria-invalid\": hasError ? \"true\" : undefined,\r\n \"aria-required\": required ? \"true\" : undefined,\r\n \"aria-describedby\": describedBy,\r\n // Only in group mode — a single labelable control is named by the\r\n // htmlFor/id pair below, not by aria-labelledby.\r\n ...(group ? { \"aria-labelledby\": labelledBy } : {}),\r\n // `error` / `disabled` are broadcast by FormControl via context for MUI\r\n // inputs, but several v2 inputs (NumberInput, Combobox renderInput) are\r\n // not pure MUI children and read the props directly — keep them explicit.\r\n error: hasError,\r\n disabled: disabled || childProps.disabled,\r\n // Respect the child's explicit fullWidth when defined (e.g. a narrow\r\n // inline filter input). Only fall back to Field's value when the child\r\n // hasn't expressed an opinion.\r\n fullWidth: childProps.fullWidth !== undefined ? childProps.fullWidth : fullWidth,\r\n });\r\n\r\n // R-I.6 — RTL-safe margin reset. `marginLeft: 0` only zeroes the LTR\r\n // inline-start; in [dir=\"rtl\"] the helper picks up MUI's default on\r\n // the (now physical-right but logical-start) side and is mis-aligned.\r\n // `marginInlineStart` resets the correct edge in both directions.\r\n const helperResetSx = { marginInlineStart: 0, fontSize: \"var(--text-xs)\" };\r\n\r\n const LABEL_SX = {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"var(--s-1)\",\r\n fontSize: \"var(--text-xs, 12px)\",\r\n fontWeight: \"var(--fw-semibold, 600)\",\r\n color: \"var(--fg-muted)\",\r\n marginBottom: \"var(--s-2)\",\r\n \"&.Mui-focused\": { color: \"var(--fg-muted)\" },\r\n \"&.Mui-error\": { color: \"var(--fg-muted)\" },\r\n } as const;\r\n\r\n // Shared label content (text + required marker + optional help adornment).\r\n const labelContent = (\r\n <>\r\n {label}\r\n {required && (\r\n <Box\r\n component=\"span\"\r\n aria-hidden=\"true\"\r\n sx={{ color: \"var(--danger)\", fontWeight: \"var(--fw-bold, 700)\" }}\r\n >\r\n *\r\n </Box>\r\n )}\r\n {helpAdornment}\r\n </>\r\n );\r\n\r\n return (\r\n <FormControl\r\n error={hasError}\r\n required={required}\r\n disabled={disabled}\r\n fullWidth={fullWidth}\r\n className={className}\r\n sx={{\r\n /* G-H — plafond a partir de `sm` seulement : sur mobile le standard\r\n * impose 100% de la largeur de grille. */\r\n ...(width\r\n ? { maxWidth: { xs: \"100%\", sm: FIELD_MAX_WIDTH[width] } }\r\n : {}),\r\n ...sx,\r\n }}\r\n >\r\n {label &&\r\n (group ? (\r\n // Group mode: render as a <span> carrying an id (no <label for>),\r\n // referenced by the group's aria-labelledby.\r\n <FormLabel component=\"span\" id={labelId} required={false} sx={LABEL_SX}>\r\n {labelContent}\r\n </FormLabel>\r\n ) : (\r\n <FormLabel htmlFor={inputId} required={false /* we render the * ourselves */} sx={LABEL_SX}>\r\n {labelContent}\r\n </FormLabel>\r\n ))}\r\n\r\n {enhanced}\r\n\r\n {hint && !hasError && (\r\n <FormHelperText\r\n id={hintId}\r\n sx={{ ...helperResetSx, color: \"var(--fg-subtle)\" }}\r\n >\r\n {hint}\r\n </FormHelperText>\r\n )}\r\n\r\n {hasError && (\r\n /*\r\n * Rendered by the shared `FieldError` (gap G-18) rather than an inline\r\n * `FormHelperText`: R-4.1 MUST requires the icon, and a host with a\r\n * LIST-level error (a Formik array, an upload slot) has no single\r\n * control to wrap in a `Field` and needs the exact same renderer\r\n * standalone. One component, both paths, no drift.\r\n *\r\n * `marginTop: var(--s-1)` (4px) replaces `FormHelperText`'s hard-coded\r\n * 3px default — same optical result, on the spacing scale (R-S.1).\r\n * Dropping FormHelperText also removed a `color: … !important` that\r\n * only existed to beat MUI's own `Mui-error` colour.\r\n */\r\n <FieldError id={errorId} sx={{ marginTop: \"var(--s-1)\" }}>\r\n {error}\r\n </FieldError>\r\n )}\r\n </FormControl>\r\n );\r\n}\r\n\r\nexport default Field;\r\n"],"mappings":"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","ignoreList":[]}
|