pne-ui 4.3.0-rc.9 → 4.3.0
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/README.md +735 -157
- package/cjs/PneThemeProvider.d.ts +20 -0
- package/cjs/PneThemeProvider.js +36 -0
- package/cjs/PneThemeProvider.js.map +1 -0
- package/cjs/actionSpacing.d.ts +13 -0
- package/cjs/actionSpacing.js +26 -0
- package/cjs/actionSpacing.js.map +1 -0
- package/cjs/common/paynet/dropdown.d.ts +24 -5
- package/cjs/common/paynet/dropdown.js +38 -37
- package/cjs/common/paynet/dropdown.js.map +1 -1
- package/cjs/component/PneBreadcrumbs.d.ts +43 -0
- package/cjs/component/PneBreadcrumbs.js +269 -0
- package/cjs/component/PneBreadcrumbs.js.map +1 -0
- package/cjs/component/PneButton.d.ts +24 -6
- package/cjs/component/PneButton.js +53 -40
- package/cjs/component/PneButton.js.map +1 -1
- package/cjs/component/PneCheckbox.d.ts +4 -1
- package/cjs/component/PneCheckbox.js +78 -2
- package/cjs/component/PneCheckbox.js.map +1 -1
- package/cjs/component/PneCoachmark.d.ts +63 -0
- package/cjs/component/PneCoachmark.js +194 -0
- package/cjs/component/PneCoachmark.js.map +1 -0
- package/cjs/component/PneField.d.ts +49 -9
- package/cjs/component/PneField.js +109 -23
- package/cjs/component/PneField.js.map +1 -1
- package/cjs/component/PneFieldContext.d.ts +31 -8
- package/cjs/component/PneFieldContext.js +35 -12
- package/cjs/component/PneFieldContext.js.map +1 -1
- package/cjs/component/PneLabeledCheckbox.d.ts +4 -4
- package/cjs/component/PneLabeledCheckbox.js +9 -3
- package/cjs/component/PneLabeledCheckbox.js.map +1 -1
- package/cjs/component/PneModal.d.ts +65 -22
- package/cjs/component/PneModal.js +298 -64
- package/cjs/component/PneModal.js.map +1 -1
- package/cjs/component/PneModalActions.d.ts +16 -3
- package/cjs/component/PneModalActions.js +88 -35
- package/cjs/component/PneModalActions.js.map +1 -1
- package/cjs/component/PneOrdersIcon.d.ts +3 -0
- package/cjs/component/PneOrdersIcon.js +12 -0
- package/cjs/component/PneOrdersIcon.js.map +1 -0
- package/cjs/component/PneSwitch.d.ts +13 -2
- package/cjs/component/PneSwitch.js +322 -15
- package/cjs/component/PneSwitch.js.map +1 -1
- package/cjs/component/PneTextField.d.ts +3 -1
- package/cjs/component/PneTextField.js +288 -32
- package/cjs/component/PneTextField.js.map +1 -1
- package/cjs/component/PneToggleInput.d.ts +26 -0
- package/cjs/component/PneToggleInput.js +138 -0
- package/cjs/component/PneToggleInput.js.map +1 -0
- package/cjs/component/confirm/PneConfirmProvider.d.ts +13 -4
- package/cjs/component/confirm/PneConfirmProvider.js +36 -11
- package/cjs/component/confirm/PneConfirmProvider.js.map +1 -1
- package/cjs/component/dropdown/PneAsyncAutocomplete.d.ts +42 -17
- package/cjs/component/dropdown/PneAsyncAutocomplete.js +324 -51
- package/cjs/component/dropdown/PneAsyncAutocomplete.js.map +1 -1
- package/cjs/component/dropdown/PneAutocomplete.d.ts +39 -10
- package/cjs/component/dropdown/PneAutocomplete.js +33 -17
- package/cjs/component/dropdown/PneAutocomplete.js.map +1 -1
- package/cjs/component/dropdown/PneAutocompleteShared.d.ts +30 -0
- package/cjs/component/dropdown/PneAutocompleteShared.js +122 -0
- package/cjs/component/dropdown/PneAutocompleteShared.js.map +1 -0
- package/cjs/component/dropdown/PneSelect.d.ts +78 -12
- package/cjs/component/dropdown/PneSelect.js +296 -61
- package/cjs/component/dropdown/PneSelect.js.map +1 -1
- package/cjs/component/internal/PneSurface.d.ts +9 -0
- package/cjs/component/internal/PneSurface.js +71 -0
- package/cjs/component/internal/PneSurface.js.map +1 -0
- package/cjs/component/non-abstract-entity-selector/AbstractEntitySelectModal.d.ts +5 -0
- package/cjs/component/non-abstract-entity-selector/AbstractEntitySelectModal.js +15 -4
- package/cjs/component/non-abstract-entity-selector/AbstractEntitySelectModal.js.map +1 -1
- package/cjs/component/non-abstract-entity-selector/AbstractEntitySelector.d.ts +4 -0
- package/cjs/component/non-abstract-entity-selector/AbstractEntitySelector.js +24 -20
- package/cjs/component/non-abstract-entity-selector/AbstractEntitySelector.js.map +1 -1
- package/cjs/component/non-abstract-entity-selector/ItemEntitySelector.d.ts +2 -1
- package/cjs/component/non-abstract-entity-selector/ItemEntitySelector.js +31 -3
- package/cjs/component/non-abstract-entity-selector/ItemEntitySelector.js.map +1 -1
- package/cjs/component/non-abstract-entity-selector/styled.d.ts +1 -1
- package/cjs/component/non-abstract-entity-selector/styled.js +6 -0
- package/cjs/component/non-abstract-entity-selector/styled.js.map +1 -1
- package/cjs/component/non-abstract-entity-selector/useImmediateTouchSensor.d.ts +3 -0
- package/cjs/component/non-abstract-entity-selector/useImmediateTouchSensor.js +203 -0
- package/cjs/component/non-abstract-entity-selector/useImmediateTouchSensor.js.map +1 -0
- package/cjs/component/overlay/OverlayHost.d.ts +41 -3
- package/cjs/component/overlay/OverlayHost.js +317 -53
- package/cjs/component/overlay/OverlayHost.js.map +1 -1
- package/cjs/component/overlay/OverlayPortalContainerContext.d.ts +3 -0
- package/cjs/component/overlay/OverlayPortalContainerContext.js +8 -0
- package/cjs/component/overlay/OverlayPortalContainerContext.js.map +1 -0
- package/cjs/component/overlay/PaynetErrorContent.d.ts +8 -0
- package/cjs/component/overlay/PaynetErrorContent.js +255 -0
- package/cjs/component/overlay/PaynetErrorContent.js.map +1 -0
- package/cjs/component/overlay/PneOperationCenter.d.ts +71 -0
- package/cjs/component/overlay/PneOperationCenter.js +376 -0
- package/cjs/component/overlay/PneOperationCenter.js.map +1 -0
- package/cjs/component/overlay/overlayStore.d.ts +4 -2
- package/cjs/component/overlay/overlayStore.js +32 -2
- package/cjs/component/overlay/overlayStore.js.map +1 -1
- package/cjs/component/overlay/paynetError.d.ts +7 -0
- package/cjs/component/overlay/paynetError.js +209 -0
- package/cjs/component/overlay/paynetError.js.map +1 -0
- package/cjs/component/overlay/types.d.ts +36 -0
- package/cjs/component/search-ui/SearchUI.d.ts +27 -10
- package/cjs/component/search-ui/SearchUI.js +199 -46
- package/cjs/component/search-ui/SearchUI.js.map +1 -1
- package/cjs/component/search-ui/SearchUIProvider.d.ts +5 -0
- package/cjs/component/search-ui/SearchUIProvider.js +1 -0
- package/cjs/component/search-ui/SearchUIProvider.js.map +1 -1
- package/cjs/component/search-ui/SearchUITableSelection.d.ts +3 -1
- package/cjs/component/search-ui/SearchUITableSelection.js.map +1 -1
- package/cjs/component/search-ui/filters/CriterionContainer.d.ts +1 -0
- package/cjs/component/search-ui/filters/CriterionContainer.js +45 -2
- package/cjs/component/search-ui/filters/CriterionContainer.js.map +1 -1
- package/cjs/component/search-ui/filters/SearchUIFilters.d.ts +33 -3
- package/cjs/component/search-ui/filters/SearchUIFilters.js +186 -13
- package/cjs/component/search-ui/filters/SearchUIFilters.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/CsvCharsetCriterion.d.ts +2 -0
- package/cjs/component/search-ui/filters/component/criterion/CsvCharsetCriterion.js +22 -0
- package/cjs/component/search-ui/filters/component/criterion/CsvCharsetCriterion.js.map +1 -0
- package/cjs/component/search-ui/filters/component/criterion/DateRangeCriterion.js +12 -1
- package/cjs/component/search-ui/filters/component/criterion/DateRangeCriterion.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/ErrorCodeCriterion.js +1 -1
- package/cjs/component/search-ui/filters/component/criterion/ErrorCodeCriterion.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/GroupingCriterion.js +1 -6
- package/cjs/component/search-ui/filters/component/criterion/GroupingCriterion.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/MultigetCriterionPanel.js +6 -9
- package/cjs/component/search-ui/filters/component/criterion/MultigetCriterionPanel.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/ProjectCurrencyCriterion.js +1 -1
- package/cjs/component/search-ui/filters/component/criterion/ProjectCurrencyCriterion.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/TimeZoneCriterion.d.ts +2 -0
- package/cjs/component/search-ui/filters/component/criterion/TimeZoneCriterion.js +33 -0
- package/cjs/component/search-ui/filters/component/criterion/TimeZoneCriterion.js.map +1 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionDateTypeCriterion.d.ts +3 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionDateTypeCriterion.js +18 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionDateTypeCriterion.js.map +1 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionRecurrentFilterCriterion.d.ts +2 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionRecurrentFilterCriterion.js +17 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionRecurrentFilterCriterion.js.map +1 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionReportScopeCriterion.d.ts +2 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionReportScopeCriterion.js +43 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionReportScopeCriterion.js.map +1 -0
- package/cjs/component/search-ui/filters/component/criterion/TransactionSessionStatusCriterion.js +8 -11
- package/cjs/component/search-ui/filters/component/criterion/TransactionSessionStatusCriterion.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/TransactionTypesCriterion.js +6 -1
- package/cjs/component/search-ui/filters/component/criterion/TransactionTypesCriterion.js.map +1 -1
- package/cjs/component/search-ui/filters/component/criterion/orders-search/OrdersSearchCountrySelect.js +3 -3
- package/cjs/component/search-ui/filters/component/criterion/orders-search/OrdersSearchCountrySelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js +2 -2
- package/cjs/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIAddFilter.js +2 -2
- package/cjs/component/search-ui/filters/component/select/SearchUIAddFilter.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js +15 -2
- package/cjs/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIDateRangeSpecTypeSelect.js +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIDateRangeSpecTypeSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIEnumChipSelect.d.ts +2 -0
- package/cjs/component/search-ui/filters/component/select/SearchUIEnumChipSelect.js +13 -2
- package/cjs/component/search-ui/filters/component/select/SearchUIEnumChipSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIExactSearchLabelSelect.js +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIExactSearchLabelSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIGroupingDateTypeSelect.js +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIGroupingDateTypeSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIOrderDateTypeSelect.js +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIOrderDateTypeSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIOrdersSearchLabelSelect.js +15 -1
- package/cjs/component/search-ui/filters/component/select/SearchUIOrdersSearchLabelSelect.js.map +1 -1
- package/cjs/component/search-ui/filters/component/template/SearchUITemplatePanel.js +6 -9
- package/cjs/component/search-ui/filters/component/template/SearchUITemplatePanel.js.map +1 -1
- package/cjs/component/search-ui/filters/component/template/SearchUITemplatesMenu.js +1 -1
- package/cjs/component/search-ui/filters/component/template/SearchUITemplatesMenu.js.map +1 -1
- package/cjs/component/search-ui/filters/entityOptionRestriction.d.ts +10 -0
- package/cjs/component/search-ui/filters/entityOptionRestriction.js +79 -0
- package/cjs/component/search-ui/filters/entityOptionRestriction.js.map +1 -0
- package/cjs/component/search-ui/filters/publicConditions.d.ts +8 -0
- package/cjs/component/search-ui/filters/publicConditions.js +158 -0
- package/cjs/component/search-ui/filters/publicConditions.js.map +1 -0
- package/cjs/component/search-ui/filters/state/actions.js +211 -25
- package/cjs/component/search-ui/filters/state/actions.js.map +1 -1
- package/cjs/component/search-ui/filters/state/initial.js +11 -0
- package/cjs/component/search-ui/filters/state/initial.js.map +1 -1
- package/cjs/component/search-ui/filters/state/retention.d.ts +1 -0
- package/cjs/component/search-ui/filters/state/retention.js +18 -1
- package/cjs/component/search-ui/filters/state/retention.js.map +1 -1
- package/cjs/component/search-ui/filters/state/type.d.ts +22 -3
- package/cjs/component/search-ui/filters/state/undo.js +6 -0
- package/cjs/component/search-ui/filters/state/undo.js.map +1 -1
- package/cjs/component/search-ui/filters/templateStorage.d.ts +1 -0
- package/cjs/component/search-ui/filters/templateStorage.js +7 -0
- package/cjs/component/search-ui/filters/templateStorage.js.map +1 -0
- package/cjs/component/search-ui/filters/types.d.ts +76 -1
- package/cjs/component/search-ui/filters/types.js +38 -1
- package/cjs/component/search-ui/filters/types.js.map +1 -1
- package/cjs/component/search-ui/filters/validation.d.ts +17 -0
- package/cjs/component/search-ui/filters/validation.js +81 -0
- package/cjs/component/search-ui/filters/validation.js.map +1 -0
- package/cjs/component/search-ui/state/initial.js +6 -0
- package/cjs/component/search-ui/state/initial.js.map +1 -1
- package/cjs/component/search-ui/state/store.d.ts +12 -0
- package/cjs/component/table/AbstractHeaderTableCell.js +6 -2
- package/cjs/component/table/AbstractHeaderTableCell.js.map +1 -1
- package/cjs/component/table/AbstractTable.d.ts +2 -0
- package/cjs/component/table/AbstractTable.js +39 -7
- package/cjs/component/table/AbstractTable.js.map +1 -1
- package/cjs/component/table/AbstractTableCell.d.ts +2 -1
- package/cjs/component/table/AbstractTableCell.js +5 -4
- package/cjs/component/table/AbstractTableCell.js.map +1 -1
- package/cjs/component/table/PneTableCell.d.ts +5 -2
- package/cjs/component/table/PneTableCell.js +8 -7
- package/cjs/component/table/PneTableCell.js.map +1 -1
- package/cjs/component/table/PneTableControlCell.d.ts +5 -2
- package/cjs/component/table/PneTableControlCell.js +5 -4
- package/cjs/component/table/PneTableControlCell.js.map +1 -1
- package/cjs/component/table/PneTablePagination.d.ts +1 -1
- package/cjs/component/table/PneTablePaginationActions.d.ts +2 -0
- package/cjs/component/table/PneTablePaginationActions.js +18 -18
- package/cjs/component/table/PneTablePaginationActions.js.map +1 -1
- package/cjs/component/table/PneTableRow.d.ts +1 -1
- package/cjs/component/table/PneTableRow.js +14 -6
- package/cjs/component/table/PneTableRow.js.map +1 -1
- package/cjs/component/table/PneTableSelectionCell.d.ts +1 -1
- package/cjs/component/table/PneTableSelectionCell.js +4 -2
- package/cjs/component/table/PneTableSelectionCell.js.map +1 -1
- package/cjs/component/table/PneTableSelectionControls.d.ts +0 -2
- package/cjs/component/table/PneTableSelectionControls.js +2 -8
- package/cjs/component/table/PneTableSelectionControls.js.map +1 -1
- package/cjs/component/table/PneTableSortLabel.js +3 -1
- package/cjs/component/table/PneTableSortLabel.js.map +1 -1
- package/cjs/component/table/PneTableSwitchCell.d.ts +37 -0
- package/cjs/component/table/PneTableSwitchCell.js +62 -0
- package/cjs/component/table/PneTableSwitchCell.js.map +1 -0
- package/cjs/component/table/PneTableToolbar.js +2 -1
- package/cjs/component/table/PneTableToolbar.js.map +1 -1
- package/cjs/component/table/PneTableViewSelector.d.ts +6 -0
- package/cjs/component/table/PneTableViewSelector.js +58 -41
- package/cjs/component/table/PneTableViewSelector.js.map +1 -1
- package/cjs/component/table/tableLayoutMeasurement.d.ts +7 -0
- package/cjs/component/table/tableLayoutMeasurement.js +12 -0
- package/cjs/component/table/tableLayoutMeasurement.js.map +1 -0
- package/cjs/component/table/useTable.d.ts +7 -1
- package/cjs/component/table/useTable.js +103 -30
- package/cjs/component/table/useTable.js.map +1 -1
- package/cjs/createTheme.d.ts +57 -2
- package/cjs/createTheme.js +394 -129
- package/cjs/createTheme.js.map +1 -1
- package/cjs/exports/buttons.d.ts +1 -1
- package/cjs/exports/buttons.js +1 -3
- package/cjs/exports/buttons.js.map +1 -1
- package/cjs/exports/confirm.d.ts +1 -1
- package/cjs/exports/confirm.js.map +1 -1
- package/cjs/exports/inputs.d.ts +11 -6
- package/cjs/exports/inputs.js +3 -3
- package/cjs/exports/inputs.js.map +1 -1
- package/cjs/exports/modals.d.ts +3 -1
- package/cjs/exports/modals.js +3 -1
- package/cjs/exports/modals.js.map +1 -1
- package/cjs/exports/navigation.d.ts +2 -0
- package/cjs/exports/navigation.js +8 -0
- package/cjs/exports/navigation.js.map +1 -0
- package/cjs/exports/overlay.d.ts +7 -2
- package/cjs/exports/overlay.js +8 -1
- package/cjs/exports/overlay.js.map +1 -1
- package/cjs/exports/search.d.ts +4 -3
- package/cjs/exports/search.js +8 -1
- package/cjs/exports/search.js.map +1 -1
- package/cjs/exports/table.d.ts +5 -1
- package/cjs/exports/table.js +3 -1
- package/cjs/exports/table.js.map +1 -1
- package/cjs/exports/theme.d.ts +3 -1
- package/cjs/exports/theme.js +10 -1
- package/cjs/exports/theme.js.map +1 -1
- package/cjs/index.d.ts +11 -8
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/docs/action-spacing.md +34 -0
- package/docs/i18n.md +5 -2
- package/docs/releasing.md +148 -0
- package/esm/PneThemeProvider.d.ts +20 -0
- package/esm/PneThemeProvider.js +30 -0
- package/esm/PneThemeProvider.js.map +1 -0
- package/esm/actionSpacing.d.ts +13 -0
- package/esm/actionSpacing.js +21 -0
- package/esm/actionSpacing.js.map +1 -0
- package/esm/common/paynet/dropdown.d.ts +24 -5
- package/esm/common/paynet/dropdown.js +37 -36
- package/esm/common/paynet/dropdown.js.map +1 -1
- package/esm/component/PneBreadcrumbs.d.ts +43 -0
- package/esm/component/PneBreadcrumbs.js +264 -0
- package/esm/component/PneBreadcrumbs.js.map +1 -0
- package/esm/component/PneButton.d.ts +24 -6
- package/esm/component/PneButton.js +53 -40
- package/esm/component/PneButton.js.map +1 -1
- package/esm/component/PneCheckbox.d.ts +4 -1
- package/esm/component/PneCheckbox.js +79 -3
- package/esm/component/PneCheckbox.js.map +1 -1
- package/esm/component/PneCoachmark.d.ts +63 -0
- package/esm/component/PneCoachmark.js +191 -0
- package/esm/component/PneCoachmark.js.map +1 -0
- package/esm/component/PneField.d.ts +49 -9
- package/esm/component/PneField.js +110 -24
- package/esm/component/PneField.js.map +1 -1
- package/esm/component/PneFieldContext.d.ts +31 -8
- package/esm/component/PneFieldContext.js +32 -9
- package/esm/component/PneFieldContext.js.map +1 -1
- package/esm/component/PneLabeledCheckbox.d.ts +4 -4
- package/esm/component/PneLabeledCheckbox.js +10 -4
- package/esm/component/PneLabeledCheckbox.js.map +1 -1
- package/esm/component/PneModal.d.ts +65 -22
- package/esm/component/PneModal.js +300 -66
- package/esm/component/PneModal.js.map +1 -1
- package/esm/component/PneModalActions.d.ts +16 -3
- package/esm/component/PneModalActions.js +88 -35
- package/esm/component/PneModalActions.js.map +1 -1
- package/esm/component/PneOrdersIcon.d.ts +3 -0
- package/esm/component/PneOrdersIcon.js +7 -0
- package/esm/component/PneOrdersIcon.js.map +1 -0
- package/esm/component/PneSwitch.d.ts +13 -2
- package/esm/component/PneSwitch.js +324 -17
- package/esm/component/PneSwitch.js.map +1 -1
- package/esm/component/PneTextField.d.ts +3 -1
- package/esm/component/PneTextField.js +289 -33
- package/esm/component/PneTextField.js.map +1 -1
- package/esm/component/PneToggleInput.d.ts +26 -0
- package/esm/component/PneToggleInput.js +133 -0
- package/esm/component/PneToggleInput.js.map +1 -0
- package/esm/component/confirm/PneConfirmProvider.d.ts +13 -4
- package/esm/component/confirm/PneConfirmProvider.js +36 -11
- package/esm/component/confirm/PneConfirmProvider.js.map +1 -1
- package/esm/component/dropdown/PneAsyncAutocomplete.d.ts +42 -17
- package/esm/component/dropdown/PneAsyncAutocomplete.js +328 -55
- package/esm/component/dropdown/PneAsyncAutocomplete.js.map +1 -1
- package/esm/component/dropdown/PneAutocomplete.d.ts +39 -10
- package/esm/component/dropdown/PneAutocomplete.js +34 -18
- package/esm/component/dropdown/PneAutocomplete.js.map +1 -1
- package/esm/component/dropdown/PneAutocompleteShared.d.ts +30 -0
- package/esm/component/dropdown/PneAutocompleteShared.js +112 -0
- package/esm/component/dropdown/PneAutocompleteShared.js.map +1 -0
- package/esm/component/dropdown/PneSelect.d.ts +78 -12
- package/esm/component/dropdown/PneSelect.js +299 -64
- package/esm/component/dropdown/PneSelect.js.map +1 -1
- package/esm/component/internal/PneSurface.d.ts +9 -0
- package/esm/component/internal/PneSurface.js +65 -0
- package/esm/component/internal/PneSurface.js.map +1 -0
- package/esm/component/non-abstract-entity-selector/AbstractEntitySelectModal.d.ts +5 -0
- package/esm/component/non-abstract-entity-selector/AbstractEntitySelectModal.js +15 -4
- package/esm/component/non-abstract-entity-selector/AbstractEntitySelectModal.js.map +1 -1
- package/esm/component/non-abstract-entity-selector/AbstractEntitySelector.d.ts +4 -0
- package/esm/component/non-abstract-entity-selector/AbstractEntitySelector.js +25 -21
- package/esm/component/non-abstract-entity-selector/AbstractEntitySelector.js.map +1 -1
- package/esm/component/non-abstract-entity-selector/ItemEntitySelector.d.ts +2 -1
- package/esm/component/non-abstract-entity-selector/ItemEntitySelector.js +31 -3
- package/esm/component/non-abstract-entity-selector/ItemEntitySelector.js.map +1 -1
- package/esm/component/non-abstract-entity-selector/styled.d.ts +1 -1
- package/esm/component/non-abstract-entity-selector/styled.js +6 -0
- package/esm/component/non-abstract-entity-selector/styled.js.map +1 -1
- package/esm/component/non-abstract-entity-selector/useImmediateTouchSensor.d.ts +3 -0
- package/esm/component/non-abstract-entity-selector/useImmediateTouchSensor.js +200 -0
- package/esm/component/non-abstract-entity-selector/useImmediateTouchSensor.js.map +1 -0
- package/esm/component/overlay/OverlayHost.d.ts +41 -3
- package/esm/component/overlay/OverlayHost.js +316 -54
- package/esm/component/overlay/OverlayHost.js.map +1 -1
- package/esm/component/overlay/OverlayPortalContainerContext.d.ts +3 -0
- package/esm/component/overlay/OverlayPortalContainerContext.js +4 -0
- package/esm/component/overlay/OverlayPortalContainerContext.js.map +1 -0
- package/esm/component/overlay/PaynetErrorContent.d.ts +8 -0
- package/esm/component/overlay/PaynetErrorContent.js +250 -0
- package/esm/component/overlay/PaynetErrorContent.js.map +1 -0
- package/esm/component/overlay/PneOperationCenter.d.ts +71 -0
- package/esm/component/overlay/PneOperationCenter.js +372 -0
- package/esm/component/overlay/PneOperationCenter.js.map +1 -0
- package/esm/component/overlay/overlayStore.d.ts +4 -2
- package/esm/component/overlay/overlayStore.js +32 -2
- package/esm/component/overlay/overlayStore.js.map +1 -1
- package/esm/component/overlay/paynetError.d.ts +7 -0
- package/esm/component/overlay/paynetError.js +205 -0
- package/esm/component/overlay/paynetError.js.map +1 -0
- package/esm/component/overlay/types.d.ts +36 -0
- package/esm/component/search-ui/SearchUI.d.ts +27 -10
- package/esm/component/search-ui/SearchUI.js +199 -46
- package/esm/component/search-ui/SearchUI.js.map +1 -1
- package/esm/component/search-ui/SearchUIProvider.d.ts +5 -0
- package/esm/component/search-ui/SearchUIProvider.js +1 -0
- package/esm/component/search-ui/SearchUIProvider.js.map +1 -1
- package/esm/component/search-ui/SearchUITableSelection.d.ts +3 -1
- package/esm/component/search-ui/SearchUITableSelection.js.map +1 -1
- package/esm/component/search-ui/filters/CriterionContainer.d.ts +1 -0
- package/esm/component/search-ui/filters/CriterionContainer.js +45 -2
- package/esm/component/search-ui/filters/CriterionContainer.js.map +1 -1
- package/esm/component/search-ui/filters/SearchUIFilters.d.ts +33 -3
- package/esm/component/search-ui/filters/SearchUIFilters.js +187 -14
- package/esm/component/search-ui/filters/SearchUIFilters.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/CsvCharsetCriterion.d.ts +2 -0
- package/esm/component/search-ui/filters/component/criterion/CsvCharsetCriterion.js +17 -0
- package/esm/component/search-ui/filters/component/criterion/CsvCharsetCriterion.js.map +1 -0
- package/esm/component/search-ui/filters/component/criterion/DateRangeCriterion.js +13 -2
- package/esm/component/search-ui/filters/component/criterion/DateRangeCriterion.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/ErrorCodeCriterion.js +1 -1
- package/esm/component/search-ui/filters/component/criterion/ErrorCodeCriterion.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/GroupingCriterion.js +1 -6
- package/esm/component/search-ui/filters/component/criterion/GroupingCriterion.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/MultigetCriterionPanel.js +6 -9
- package/esm/component/search-ui/filters/component/criterion/MultigetCriterionPanel.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/ProjectCurrencyCriterion.js +1 -1
- package/esm/component/search-ui/filters/component/criterion/ProjectCurrencyCriterion.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/TimeZoneCriterion.d.ts +2 -0
- package/esm/component/search-ui/filters/component/criterion/TimeZoneCriterion.js +28 -0
- package/esm/component/search-ui/filters/component/criterion/TimeZoneCriterion.js.map +1 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionDateTypeCriterion.d.ts +3 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionDateTypeCriterion.js +13 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionDateTypeCriterion.js.map +1 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionRecurrentFilterCriterion.d.ts +2 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionRecurrentFilterCriterion.js +12 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionRecurrentFilterCriterion.js.map +1 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionReportScopeCriterion.d.ts +2 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionReportScopeCriterion.js +38 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionReportScopeCriterion.js.map +1 -0
- package/esm/component/search-ui/filters/component/criterion/TransactionSessionStatusCriterion.js +8 -11
- package/esm/component/search-ui/filters/component/criterion/TransactionSessionStatusCriterion.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/TransactionTypesCriterion.js +6 -1
- package/esm/component/search-ui/filters/component/criterion/TransactionTypesCriterion.js.map +1 -1
- package/esm/component/search-ui/filters/component/criterion/orders-search/OrdersSearchCountrySelect.js +3 -3
- package/esm/component/search-ui/filters/component/criterion/orders-search/OrdersSearchCountrySelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js +2 -2
- package/esm/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIAddFilter.js +2 -2
- package/esm/component/search-ui/filters/component/select/SearchUIAddFilter.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js +16 -3
- package/esm/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIDateRangeSpecTypeSelect.js +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIDateRangeSpecTypeSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIEnumChipSelect.d.ts +2 -0
- package/esm/component/search-ui/filters/component/select/SearchUIEnumChipSelect.js +13 -2
- package/esm/component/search-ui/filters/component/select/SearchUIEnumChipSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIExactSearchLabelSelect.js +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIExactSearchLabelSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIGroupingDateTypeSelect.js +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIGroupingDateTypeSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIOrderDateTypeSelect.js +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIOrderDateTypeSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/select/SearchUIOrdersSearchLabelSelect.js +15 -1
- package/esm/component/search-ui/filters/component/select/SearchUIOrdersSearchLabelSelect.js.map +1 -1
- package/esm/component/search-ui/filters/component/template/SearchUITemplatePanel.js +6 -9
- package/esm/component/search-ui/filters/component/template/SearchUITemplatePanel.js.map +1 -1
- package/esm/component/search-ui/filters/component/template/SearchUITemplatesMenu.js +1 -1
- package/esm/component/search-ui/filters/component/template/SearchUITemplatesMenu.js.map +1 -1
- package/esm/component/search-ui/filters/entityOptionRestriction.d.ts +10 -0
- package/esm/component/search-ui/filters/entityOptionRestriction.js +71 -0
- package/esm/component/search-ui/filters/entityOptionRestriction.js.map +1 -0
- package/esm/component/search-ui/filters/publicConditions.d.ts +8 -0
- package/esm/component/search-ui/filters/publicConditions.js +153 -0
- package/esm/component/search-ui/filters/publicConditions.js.map +1 -0
- package/esm/component/search-ui/filters/state/actions.js +211 -25
- package/esm/component/search-ui/filters/state/actions.js.map +1 -1
- package/esm/component/search-ui/filters/state/initial.js +11 -0
- package/esm/component/search-ui/filters/state/initial.js.map +1 -1
- package/esm/component/search-ui/filters/state/retention.d.ts +1 -0
- package/esm/component/search-ui/filters/state/retention.js +16 -0
- package/esm/component/search-ui/filters/state/retention.js.map +1 -1
- package/esm/component/search-ui/filters/state/type.d.ts +22 -3
- package/esm/component/search-ui/filters/state/undo.js +6 -0
- package/esm/component/search-ui/filters/state/undo.js.map +1 -1
- package/esm/component/search-ui/filters/templateStorage.d.ts +1 -0
- package/esm/component/search-ui/filters/templateStorage.js +3 -0
- package/esm/component/search-ui/filters/templateStorage.js.map +1 -0
- package/esm/component/search-ui/filters/types.d.ts +76 -1
- package/esm/component/search-ui/filters/types.js +37 -0
- package/esm/component/search-ui/filters/types.js.map +1 -1
- package/esm/component/search-ui/filters/validation.d.ts +17 -0
- package/esm/component/search-ui/filters/validation.js +75 -0
- package/esm/component/search-ui/filters/validation.js.map +1 -0
- package/esm/component/search-ui/state/initial.js +6 -0
- package/esm/component/search-ui/state/initial.js.map +1 -1
- package/esm/component/search-ui/state/store.d.ts +12 -0
- package/esm/component/table/AbstractHeaderTableCell.js +6 -2
- package/esm/component/table/AbstractHeaderTableCell.js.map +1 -1
- package/esm/component/table/AbstractTable.d.ts +2 -0
- package/esm/component/table/AbstractTable.js +39 -7
- package/esm/component/table/AbstractTable.js.map +1 -1
- package/esm/component/table/AbstractTableCell.d.ts +2 -1
- package/esm/component/table/AbstractTableCell.js +5 -4
- package/esm/component/table/AbstractTableCell.js.map +1 -1
- package/esm/component/table/PneTableCell.d.ts +5 -2
- package/esm/component/table/PneTableCell.js +8 -7
- package/esm/component/table/PneTableCell.js.map +1 -1
- package/esm/component/table/PneTableControlCell.d.ts +5 -2
- package/esm/component/table/PneTableControlCell.js +5 -4
- package/esm/component/table/PneTableControlCell.js.map +1 -1
- package/esm/component/table/PneTablePagination.d.ts +1 -1
- package/esm/component/table/PneTablePaginationActions.d.ts +2 -0
- package/esm/component/table/PneTablePaginationActions.js +18 -18
- package/esm/component/table/PneTablePaginationActions.js.map +1 -1
- package/esm/component/table/PneTableRow.d.ts +1 -1
- package/esm/component/table/PneTableRow.js +14 -6
- package/esm/component/table/PneTableRow.js.map +1 -1
- package/esm/component/table/PneTableSelectionCell.d.ts +1 -1
- package/esm/component/table/PneTableSelectionCell.js +4 -2
- package/esm/component/table/PneTableSelectionCell.js.map +1 -1
- package/esm/component/table/PneTableSelectionControls.d.ts +0 -2
- package/esm/component/table/PneTableSelectionControls.js +2 -8
- package/esm/component/table/PneTableSelectionControls.js.map +1 -1
- package/esm/component/table/PneTableSortLabel.js +3 -1
- package/esm/component/table/PneTableSortLabel.js.map +1 -1
- package/esm/component/table/PneTableSwitchCell.d.ts +37 -0
- package/esm/component/table/PneTableSwitchCell.js +59 -0
- package/esm/component/table/PneTableSwitchCell.js.map +1 -0
- package/esm/component/table/PneTableToolbar.js +2 -1
- package/esm/component/table/PneTableToolbar.js.map +1 -1
- package/esm/component/table/PneTableViewSelector.d.ts +6 -0
- package/esm/component/table/PneTableViewSelector.js +58 -41
- package/esm/component/table/PneTableViewSelector.js.map +1 -1
- package/esm/component/table/tableLayoutMeasurement.d.ts +7 -0
- package/esm/component/table/tableLayoutMeasurement.js +8 -0
- package/esm/component/table/tableLayoutMeasurement.js.map +1 -0
- package/esm/component/table/useTable.d.ts +7 -1
- package/esm/component/table/useTable.js +104 -31
- package/esm/component/table/useTable.js.map +1 -1
- package/esm/createTheme.d.ts +57 -2
- package/esm/createTheme.js +393 -129
- package/esm/createTheme.js.map +1 -1
- package/esm/exports/buttons.d.ts +1 -1
- package/esm/exports/buttons.js +0 -1
- package/esm/exports/buttons.js.map +1 -1
- package/esm/exports/confirm.d.ts +1 -1
- package/esm/exports/confirm.js.map +1 -1
- package/esm/exports/inputs.d.ts +11 -6
- package/esm/exports/inputs.js +1 -1
- package/esm/exports/inputs.js.map +1 -1
- package/esm/exports/modals.d.ts +3 -1
- package/esm/exports/modals.js +1 -0
- package/esm/exports/modals.js.map +1 -1
- package/esm/exports/navigation.d.ts +2 -0
- package/esm/exports/navigation.js +3 -0
- package/esm/exports/navigation.js.map +1 -0
- package/esm/exports/overlay.d.ts +7 -2
- package/esm/exports/overlay.js +4 -1
- package/esm/exports/overlay.js.map +1 -1
- package/esm/exports/search.d.ts +4 -3
- package/esm/exports/search.js +2 -1
- package/esm/exports/search.js.map +1 -1
- package/esm/exports/table.d.ts +5 -1
- package/esm/exports/table.js +1 -0
- package/esm/exports/table.js.map +1 -1
- package/esm/exports/theme.d.ts +3 -1
- package/esm/exports/theme.js +3 -1
- package/esm/exports/theme.js.map +1 -1
- package/esm/index.d.ts +11 -8
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/package.json +20 -38
- package/cjs/component/PneButtonGroup.d.ts +0 -3
- package/cjs/component/PneButtonGroup.js +0 -20
- package/cjs/component/PneButtonGroup.js.map +0 -1
- package/cjs/component/PneHighContrastLabeledCheckbox.d.ts +0 -3
- package/cjs/component/PneHighContrastLabeledCheckbox.js +0 -203
- package/cjs/component/PneHighContrastLabeledCheckbox.js.map +0 -1
- package/cjs/component/cloudscape/CloudscapeBoardStyles.d.ts +0 -10
- package/cjs/component/cloudscape/CloudscapeBoardStyles.js +0 -92
- package/cjs/component/cloudscape/CloudscapeBoardStyles.js.map +0 -1
- package/cjs/component/cloudscape/CloudscapeThemeProvider.d.ts +0 -8
- package/cjs/component/cloudscape/CloudscapeThemeProvider.js +0 -19
- package/cjs/component/cloudscape/CloudscapeThemeProvider.js.map +0 -1
- package/cjs/component/cloudscape/boardI18n.d.ts +0 -10
- package/cjs/component/cloudscape/boardI18n.js +0 -51
- package/cjs/component/cloudscape/boardI18n.js.map +0 -1
- package/cjs/component/cloudscape/cloudscapeTheme.d.ts +0 -6
- package/cjs/component/cloudscape/cloudscapeTheme.js +0 -14
- package/cjs/component/cloudscape/cloudscapeTheme.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoard.d.ts +0 -13
- package/cjs/component/widget-board/WidgetBoard.js +0 -342
- package/cjs/component/widget-board/WidgetBoard.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardCloudscapeEngine.d.ts +0 -15
- package/cjs/component/widget-board/WidgetBoardCloudscapeEngine.js +0 -24
- package/cjs/component/widget-board/WidgetBoardCloudscapeEngine.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardFab.d.ts +0 -6
- package/cjs/component/widget-board/WidgetBoardFab.js +0 -28
- package/cjs/component/widget-board/WidgetBoardFab.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardHeaderControls.d.ts +0 -11
- package/cjs/component/widget-board/WidgetBoardHeaderControls.js +0 -155
- package/cjs/component/widget-board/WidgetBoardHeaderControls.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardItem.d.ts +0 -17
- package/cjs/component/widget-board/WidgetBoardItem.js +0 -56
- package/cjs/component/widget-board/WidgetBoardItem.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardReactGridLayoutEngine.d.ts +0 -30
- package/cjs/component/widget-board/WidgetBoardReactGridLayoutEngine.js +0 -239
- package/cjs/component/widget-board/WidgetBoardReactGridLayoutEngine.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardScope.d.ts +0 -7
- package/cjs/component/widget-board/WidgetBoardScope.js +0 -23
- package/cjs/component/widget-board/WidgetBoardScope.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardSkeleton.d.ts +0 -2
- package/cjs/component/widget-board/WidgetBoardSkeleton.js +0 -65
- package/cjs/component/widget-board/WidgetBoardSkeleton.js.map +0 -1
- package/cjs/component/widget-board/WidgetBoardVisibilityModal.d.ts +0 -10
- package/cjs/component/widget-board/WidgetBoardVisibilityModal.js +0 -45
- package/cjs/component/widget-board/WidgetBoardVisibilityModal.js.map +0 -1
- package/cjs/component/widget-board/WidgetLayoutsPanel.d.ts +0 -21
- package/cjs/component/widget-board/WidgetLayoutsPanel.js +0 -127
- package/cjs/component/widget-board/WidgetLayoutsPanel.js.map +0 -1
- package/cjs/component/widget-board/index.d.ts +0 -9
- package/cjs/component/widget-board/index.js +0 -13
- package/cjs/component/widget-board/index.js.map +0 -1
- package/cjs/component/widget-board/layoutPersistence.d.ts +0 -2
- package/cjs/component/widget-board/layoutPersistence.js +0 -78
- package/cjs/component/widget-board/layoutPersistence.js.map +0 -1
- package/cjs/component/widget-board/types.d.ts +0 -95
- package/cjs/component/widget-board/types.js +0 -3
- package/cjs/component/widget-board/types.js.map +0 -1
- package/cjs/component/widget-board/useWidgetBoardAutosize.d.ts +0 -19
- package/cjs/component/widget-board/useWidgetBoardAutosize.js +0 -220
- package/cjs/component/widget-board/useWidgetBoardAutosize.js.map +0 -1
- package/cjs/component/widget-board/useWidgetBoardFabActions.d.ts +0 -11
- package/cjs/component/widget-board/useWidgetBoardFabActions.js +0 -104
- package/cjs/component/widget-board/useWidgetBoardFabActions.js.map +0 -1
- package/cjs/component/widget-board/useWidgetBoardInteractionLock.d.ts +0 -1
- package/cjs/component/widget-board/useWidgetBoardInteractionLock.js +0 -29
- package/cjs/component/widget-board/useWidgetBoardInteractionLock.js.map +0 -1
- package/cjs/component/widget-board/useWidgetBoardLayoutActions.d.ts +0 -28
- package/cjs/component/widget-board/useWidgetBoardLayoutActions.js +0 -144
- package/cjs/component/widget-board/useWidgetBoardLayoutActions.js.map +0 -1
- package/cjs/component/widget-board/useWidgetBoardLayoutSource.d.ts +0 -29
- package/cjs/component/widget-board/useWidgetBoardLayoutSource.js +0 -72
- package/cjs/component/widget-board/useWidgetBoardLayoutSource.js.map +0 -1
- package/cjs/component/widget-board/useWidgetBoardStateActions.d.ts +0 -24
- package/cjs/component/widget-board/useWidgetBoardStateActions.js +0 -249
- package/cjs/component/widget-board/useWidgetBoardStateActions.js.map +0 -1
- package/cjs/component/widget-board/widgetBoardFabStore.d.ts +0 -27
- package/cjs/component/widget-board/widgetBoardFabStore.js +0 -16
- package/cjs/component/widget-board/widgetBoardFabStore.js.map +0 -1
- package/cjs/component/widget-board/widgetBoardLayoutUtils.d.ts +0 -21
- package/cjs/component/widget-board/widgetBoardLayoutUtils.js +0 -125
- package/cjs/component/widget-board/widgetBoardLayoutUtils.js.map +0 -1
- package/cjs/exports/cloudscape.d.ts +0 -5
- package/cjs/exports/cloudscape.js +0 -15
- package/cjs/exports/cloudscape.js.map +0 -1
- package/esm/component/PneButtonGroup.d.ts +0 -3
- package/esm/component/PneButtonGroup.js +0 -15
- package/esm/component/PneButtonGroup.js.map +0 -1
- package/esm/component/PneHighContrastLabeledCheckbox.d.ts +0 -3
- package/esm/component/PneHighContrastLabeledCheckbox.js +0 -199
- package/esm/component/PneHighContrastLabeledCheckbox.js.map +0 -1
- package/esm/component/cloudscape/CloudscapeBoardStyles.d.ts +0 -10
- package/esm/component/cloudscape/CloudscapeBoardStyles.js +0 -88
- package/esm/component/cloudscape/CloudscapeBoardStyles.js.map +0 -1
- package/esm/component/cloudscape/CloudscapeThemeProvider.d.ts +0 -8
- package/esm/component/cloudscape/CloudscapeThemeProvider.js +0 -15
- package/esm/component/cloudscape/CloudscapeThemeProvider.js.map +0 -1
- package/esm/component/cloudscape/boardI18n.d.ts +0 -10
- package/esm/component/cloudscape/boardI18n.js +0 -47
- package/esm/component/cloudscape/boardI18n.js.map +0 -1
- package/esm/component/cloudscape/cloudscapeTheme.d.ts +0 -6
- package/esm/component/cloudscape/cloudscapeTheme.js +0 -11
- package/esm/component/cloudscape/cloudscapeTheme.js.map +0 -1
- package/esm/component/widget-board/WidgetBoard.d.ts +0 -13
- package/esm/component/widget-board/WidgetBoard.js +0 -337
- package/esm/component/widget-board/WidgetBoard.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardCloudscapeEngine.d.ts +0 -15
- package/esm/component/widget-board/WidgetBoardCloudscapeEngine.js +0 -19
- package/esm/component/widget-board/WidgetBoardCloudscapeEngine.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardFab.d.ts +0 -6
- package/esm/component/widget-board/WidgetBoardFab.js +0 -23
- package/esm/component/widget-board/WidgetBoardFab.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardHeaderControls.d.ts +0 -11
- package/esm/component/widget-board/WidgetBoardHeaderControls.js +0 -150
- package/esm/component/widget-board/WidgetBoardHeaderControls.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardItem.d.ts +0 -17
- package/esm/component/widget-board/WidgetBoardItem.js +0 -51
- package/esm/component/widget-board/WidgetBoardItem.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardReactGridLayoutEngine.d.ts +0 -30
- package/esm/component/widget-board/WidgetBoardReactGridLayoutEngine.js +0 -233
- package/esm/component/widget-board/WidgetBoardReactGridLayoutEngine.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardScope.d.ts +0 -7
- package/esm/component/widget-board/WidgetBoardScope.js +0 -17
- package/esm/component/widget-board/WidgetBoardScope.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardSkeleton.d.ts +0 -2
- package/esm/component/widget-board/WidgetBoardSkeleton.js +0 -60
- package/esm/component/widget-board/WidgetBoardSkeleton.js.map +0 -1
- package/esm/component/widget-board/WidgetBoardVisibilityModal.d.ts +0 -10
- package/esm/component/widget-board/WidgetBoardVisibilityModal.js +0 -40
- package/esm/component/widget-board/WidgetBoardVisibilityModal.js.map +0 -1
- package/esm/component/widget-board/WidgetLayoutsPanel.d.ts +0 -21
- package/esm/component/widget-board/WidgetLayoutsPanel.js +0 -122
- package/esm/component/widget-board/WidgetLayoutsPanel.js.map +0 -1
- package/esm/component/widget-board/index.d.ts +0 -9
- package/esm/component/widget-board/index.js +0 -10
- package/esm/component/widget-board/index.js.map +0 -1
- package/esm/component/widget-board/layoutPersistence.d.ts +0 -2
- package/esm/component/widget-board/layoutPersistence.js +0 -74
- package/esm/component/widget-board/layoutPersistence.js.map +0 -1
- package/esm/component/widget-board/types.d.ts +0 -95
- package/esm/component/widget-board/types.js +0 -2
- package/esm/component/widget-board/types.js.map +0 -1
- package/esm/component/widget-board/useWidgetBoardAutosize.d.ts +0 -19
- package/esm/component/widget-board/useWidgetBoardAutosize.js +0 -216
- package/esm/component/widget-board/useWidgetBoardAutosize.js.map +0 -1
- package/esm/component/widget-board/useWidgetBoardFabActions.d.ts +0 -11
- package/esm/component/widget-board/useWidgetBoardFabActions.js +0 -99
- package/esm/component/widget-board/useWidgetBoardFabActions.js.map +0 -1
- package/esm/component/widget-board/useWidgetBoardInteractionLock.d.ts +0 -1
- package/esm/component/widget-board/useWidgetBoardInteractionLock.js +0 -25
- package/esm/component/widget-board/useWidgetBoardInteractionLock.js.map +0 -1
- package/esm/component/widget-board/useWidgetBoardLayoutActions.d.ts +0 -28
- package/esm/component/widget-board/useWidgetBoardLayoutActions.js +0 -140
- package/esm/component/widget-board/useWidgetBoardLayoutActions.js.map +0 -1
- package/esm/component/widget-board/useWidgetBoardLayoutSource.d.ts +0 -29
- package/esm/component/widget-board/useWidgetBoardLayoutSource.js +0 -68
- package/esm/component/widget-board/useWidgetBoardLayoutSource.js.map +0 -1
- package/esm/component/widget-board/useWidgetBoardStateActions.d.ts +0 -24
- package/esm/component/widget-board/useWidgetBoardStateActions.js +0 -245
- package/esm/component/widget-board/useWidgetBoardStateActions.js.map +0 -1
- package/esm/component/widget-board/widgetBoardFabStore.d.ts +0 -27
- package/esm/component/widget-board/widgetBoardFabStore.js +0 -12
- package/esm/component/widget-board/widgetBoardFabStore.js.map +0 -1
- package/esm/component/widget-board/widgetBoardLayoutUtils.d.ts +0 -21
- package/esm/component/widget-board/widgetBoardLayoutUtils.js +0 -113
- package/esm/component/widget-board/widgetBoardLayoutUtils.js.map +0 -1
- package/esm/exports/cloudscape.d.ts +0 -5
- package/esm/exports/cloudscape.js +0 -6
- package/esm/exports/cloudscape.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# pne-ui
|
|
2
2
|
|
|
3
3
|
[![NPM version][npm-image]][npm-url]
|
|
4
|
-
[![
|
|
4
|
+
[![npm release][github-publish]][github-publish-url]
|
|
5
5
|
|
|
6
6
|
Мега обертка над MUI
|
|
7
7
|
|
|
@@ -10,25 +10,450 @@
|
|
|
10
10
|
Установите `pne-ui` вместе с peer-зависимостями:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
yarn add pne-ui @emotion/react@^11 @emotion/styled@^11 @mui/material@^
|
|
13
|
+
yarn add pne-ui @emotion/react@^11 @emotion/styled@^11 @mui/material@^9.0.1 @mui/system@^9.0.1 @mui/x-date-pickers-pro@^9 @mui/icons-material@^9.0.1 i18next@^23 react@^19 react-dom@^19 react-i18next@^11
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
`pne-ui` требует React 19 и MUI 9.0.1 или новее в пределах major 9. React 18, MUI 9.0.0 и предыдущие
|
|
17
|
+
major-версии MUI не входят в поддерживаемый peer contract.
|
|
18
18
|
|
|
19
19
|
Необходимые peer-зависимости и минимальные версии:
|
|
20
20
|
|
|
21
21
|
- `@emotion/react@^11`
|
|
22
22
|
- `@emotion/styled@^11`
|
|
23
|
-
- `@mui/material
|
|
24
|
-
- `@mui/system
|
|
25
|
-
- `@mui/x-date-pickers-pro@^
|
|
26
|
-
- `@mui/icons-material
|
|
23
|
+
- `@mui/material@>=9.0.1 <10`
|
|
24
|
+
- `@mui/system@>=9.0.1 <10`
|
|
25
|
+
- `@mui/x-date-pickers-pro@^9`
|
|
26
|
+
- `@mui/icons-material@>=9.0.1 <10`
|
|
27
27
|
- `i18next@^23`
|
|
28
|
-
- `react@^
|
|
29
|
-
- `react-dom@^
|
|
28
|
+
- `react@^19`
|
|
29
|
+
- `react-dom@^19`
|
|
30
30
|
- `react-i18next@^11`
|
|
31
31
|
|
|
32
|
+
## PneBreadcrumbs
|
|
33
|
+
|
|
34
|
+
`PneBreadcrumbs` — общий визуальный компонент хлебных крошек для host-приложения и микрофронтов. Он не
|
|
35
|
+
зависит от роутера, i18next, меню или permissions: consumer передаёт уже локализованные `label`, формирует
|
|
36
|
+
доступные ему элементы и при необходимости подключает bridge-aware ссылку через `linkComponent`.
|
|
37
|
+
Такой link adapter должен принимать `href`, передавать `className` и прочие DOM props и через `forwardRef`
|
|
38
|
+
возвращать ref фактического `<a>` — это нужно для клавиатурного фокуса в overflow-меню.
|
|
39
|
+
|
|
40
|
+
Элементы имеют стабильный `id` и один из трёх взаимоисключающих типов: `link` с `href`, `action` с `onClick`
|
|
41
|
+
или неинтерактивный `text`. Последний `text` автоматически получает `aria-current="page"`. При нехватке места
|
|
42
|
+
середина цепочки сворачивается в доступное меню, а `ResizeObserver` следит только за собственным контейнером
|
|
43
|
+
компонента. Для корректного измерения родитель должен разрешать сжатие через `min-width: 0`.
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
<PneBreadcrumbs
|
|
47
|
+
ariaLabel={t("navigation.breadcrumbs")}
|
|
48
|
+
moreLabel={t("navigation.more")}
|
|
49
|
+
linkComponent={PneLink}
|
|
50
|
+
items={[
|
|
51
|
+
{
|
|
52
|
+
id: "orders",
|
|
53
|
+
label: t("main.nav.orders"),
|
|
54
|
+
icon: <PneOrdersIcon/>,
|
|
55
|
+
type: "text",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "orders-search",
|
|
59
|
+
label: t("sidebar.menu.orders"),
|
|
60
|
+
href: "/paynet-ui/react-orders",
|
|
61
|
+
type: "link",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: `order-${orderId}`,
|
|
65
|
+
label: `${t("orders.order.history.order")} ${orderId}`,
|
|
66
|
+
type: "text",
|
|
67
|
+
},
|
|
68
|
+
]}
|
|
69
|
+
/>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## PneButton
|
|
73
|
+
|
|
74
|
+
`pneStyle` — единственный публичный способ выбрать PNE-вариант кнопки. Низкоуровневые MUI props `variant` и
|
|
75
|
+
`color` намеренно исключены из TypeScript API, чтобы они не конфликтовали с design-system preset.
|
|
76
|
+
|
|
77
|
+
| `pneStyle` | Эквивалент прежнего MUI API |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `contained` или prop не задан | `variant="contained" color="primary"` |
|
|
80
|
+
| `outlined` | `variant="outlined" color="primary"` |
|
|
81
|
+
| `error` | `variant="outlined" color="error"` |
|
|
82
|
+
| `text` | `variant="text" color="primary"` |
|
|
83
|
+
| `neutral` | `variant="contained" color="pneNeutral"` |
|
|
84
|
+
| `neutralText` | `variant="text" color="pneNeutral"` |
|
|
85
|
+
| `primaryLight` | `variant="contained" color="pnePrimaryLight"` |
|
|
86
|
+
| `warning` | `variant="contained" color="pneWarningLight"` |
|
|
87
|
+
| `white` | `variant="contained" color="pneWhite"` |
|
|
88
|
+
|
|
89
|
+
Компонент сохраняет polymorphic MUI-контракт для `component` и `href`; типы DOM props, событий и `ref`
|
|
90
|
+
выводятся из фактического root element. Это поведение рассчитано на React 19 ref-as-prop.
|
|
91
|
+
|
|
92
|
+
`PneButtonGroup` удалён из публичного API. Для группировки используйте `ButtonGroup` напрямую из
|
|
93
|
+
`@mui/material`; расстояние между независимыми действиями задавайте на layout-контейнере.
|
|
94
|
+
|
|
95
|
+
## PneField
|
|
96
|
+
|
|
97
|
+
`PneField` задаёт общий семантический контракт для одного поля: label, helper text, error/disabled/required state и
|
|
98
|
+
их ARIA-связи с единственным логическим control или control group. `PneTextField`, `PneSelect`,
|
|
99
|
+
`PneAutocomplete`, `PneAsyncAutocomplete`, `PneCheckbox` и `PneSwitch` читают этот контракт автоматически.
|
|
100
|
+
Внутри `PneField` должен быть ровно один логический control; для группы передавайте один group component, а не
|
|
101
|
+
несколько соседних controls. `PneField` не принимает ID произвольной layout-обёртки за ID самого control.
|
|
102
|
+
|
|
103
|
+
`id` принадлежит root `FormControl` и служит namespace для сгенерированных ID. `controlId` принадлежит самому
|
|
104
|
+
интерактивному control и используется в `label[for]`; эти ID должны различаться. Указанный на child `id` не
|
|
105
|
+
переопределяет field-owned ID, поэтому при миграции переносите его в `controlId`. Prop `htmlFor` оставлен только
|
|
106
|
+
как deprecated alias `controlId` и не должен использоваться в новом коде. ID обрезаются по краям; пустые ID и
|
|
107
|
+
ID с внутренними пробельными символами считаются невалидными, игнорируются и заменяются сгенерированными.
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
<PneField
|
|
111
|
+
id="delivery-field"
|
|
112
|
+
controlId="delivery-control"
|
|
113
|
+
label="Delivery server"
|
|
114
|
+
helperText="Select one server"
|
|
115
|
+
slotProps={{
|
|
116
|
+
label: {id: "delivery-label", "data-autotest": "delivery-label"},
|
|
117
|
+
helperText: {id: "delivery-help", "data-autotest": "delivery-help"},
|
|
118
|
+
}}
|
|
119
|
+
>
|
|
120
|
+
<PneSelect options={servers} value={server} onChange={setServer}/>
|
|
121
|
+
</PneField>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Для произвольного control используйте render prop и передайте результат `getControlProps` на фактический
|
|
125
|
+
focusable control или group root. Adapter сохраняет дополнительные props, объединяет consumer
|
|
126
|
+
`aria-labelledby`/`aria-describedby` с ID label/helper text и дедуплицирует ссылки. Явный `aria-label`
|
|
127
|
+
остаётся самостоятельным naming override и не смешивается с `aria-labelledby`. При disabled field adapter
|
|
128
|
+
возвращает одновременно `disabled` и `aria-disabled`; это сохраняет нативную/MUI блокировку и корректно
|
|
129
|
+
описывает composite control с group-role.
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
<PneField label="Period" helperText="Choose a unit" error={Boolean(error)} required>
|
|
133
|
+
{({getControlProps, fullWidth}) => (
|
|
134
|
+
<ToggleButtonGroup
|
|
135
|
+
{...getControlProps({"aria-describedby": "period-format"})}
|
|
136
|
+
exclusive
|
|
137
|
+
sx={{width: fullWidth ? "100%" : "auto"}}
|
|
138
|
+
value={period}
|
|
139
|
+
onChange={(_event, value) => setPeriod(value)}
|
|
140
|
+
>
|
|
141
|
+
<ToggleButton value="day">Day</ToggleButton>
|
|
142
|
+
<ToggleButton value="week">Week</ToggleButton>
|
|
143
|
+
</ToggleButtonGroup>
|
|
144
|
+
)}
|
|
145
|
+
</PneField>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Если adapter нужен внутри отдельного descendant component, вызовите `usePneFieldControl()` там; вне
|
|
149
|
+
`PneField` hook возвращает `undefined`. Render prop предпочтительнее для прямой композиции, потому что явно
|
|
150
|
+
показывает место применения DOM-контракта.
|
|
151
|
+
|
|
152
|
+
`PneField` владеет ID и связями label/helper text. Значения `true` у field-level `disabled`, `error` и
|
|
153
|
+
`required` нельзя ослабить props дочернего control; его дополнительные ARIA ID при этом не теряются. Явный
|
|
154
|
+
`fullWidth` у встроенного PNE control может переопределить field default. `required` на `PneField` добавляет
|
|
155
|
+
asterisk и `aria-required`, но намеренно не устанавливает нативный `required`: browser constraint validation
|
|
156
|
+
включается только `required` на самом input/select/checkbox/switch.
|
|
157
|
+
|
|
158
|
+
`slotProps.label` и `slotProps.helperText` предназначены для `id`, `className`, `sx`, `ref`, ARIA и `data-*`
|
|
159
|
+
соответствующих slots. Старые `labelSx` и `helperTextSx` deprecated. Split-state props MUI FormControl
|
|
160
|
+
(`color`, `focused`, `hiddenLabel`, `size`, `variant`) не входят в публичный API `PneField`; внешний вид control
|
|
161
|
+
настраивается на самом control, а label/helper — через `slotProps`. Root остаётся polymorphic через `component`,
|
|
162
|
+
и тип `ref` выводится из выбранного root element. `margin` остаётся исключительно layout-prop root
|
|
163
|
+
`FormControl` и не передаётся дочернему control.
|
|
164
|
+
|
|
165
|
+
## PneTextField
|
|
166
|
+
|
|
167
|
+
`PneTextField` сохраняет API MUI `TextField` и по умолчанию использует `size="small"`. Его `ref` указывает на
|
|
168
|
+
root `HTMLDivElement`; в text/multiline-режимах для focus, selection и интеграции с form-библиотеками передавайте
|
|
169
|
+
`inputRef`, который получает нативный `input` или `textarea`. В режиме `select` и при custom input slots семантика
|
|
170
|
+
`inputRef` остаётся контрактом MUI. В text/multiline-режимах нативные атрибуты (`maxLength`, `min`, `inputMode`) и
|
|
171
|
+
привязанные к input test/ARIA anchors передавайте через object или functional `slotProps.htmlInput`; для
|
|
172
|
+
интерактивного combobox в режиме `select` используйте `slotProps.select.SelectDisplayProps`. Обычные `data-*`
|
|
173
|
+
props самого `PneTextField` остаются на root. Компонент сохраняет результат slot callback и объединяет consumer
|
|
174
|
+
`aria-describedby` со связью собственного или внешнего helper text.
|
|
175
|
+
|
|
176
|
+
В композиции с `PneField` текстовое поле получает control ID, `disabled`, `error`, `fullWidth`, helper-связь и
|
|
177
|
+
`aria-required`. `required` внешнего `PneField` намеренно не включает нативный атрибут `required`: если нужна
|
|
178
|
+
browser constraint validation, передайте `required` непосредственно в `PneTextField`.
|
|
179
|
+
|
|
180
|
+
```tsx
|
|
181
|
+
const { ref, ...field } = controllerField
|
|
182
|
+
|
|
183
|
+
<PneField label="Customer reference" required helperText={error?.message}>
|
|
184
|
+
<PneTextField
|
|
185
|
+
{...field}
|
|
186
|
+
inputRef={ref}
|
|
187
|
+
slotProps={{htmlInput: {maxLength: 64}}}
|
|
188
|
+
/>
|
|
189
|
+
</PneField>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## PneCheckbox, PneSwitch и PneLabeledCheckbox
|
|
193
|
+
|
|
194
|
+
`PneCheckbox` и `PneSwitch` сохраняют MUI-контракт `checked` / `defaultChecked` / `onChange`, а также нативные
|
|
195
|
+
`name`, `value`, `required` и `disabled`. Основной `ref` указывает на фактический root `HTMLSpanElement`; для
|
|
196
|
+
focus, form-библиотек и доступа к нативным свойствам используйте `inputRef: Ref<HTMLInputElement>`. Верхнеуровневые
|
|
197
|
+
`aria-*` применяются к нативному input, а `data-*`, включая существующие `data-autotest`, остаются на root.
|
|
198
|
+
Object и functional `slotProps.input` сохраняются и объединяются с обоими refs и управляемой семантикой.
|
|
199
|
+
Это же объединение применяется к `MuiCheckbox` / `MuiSwitch` theme `defaultProps`, включая их input slots.
|
|
200
|
+
|
|
201
|
+
`PneSwitch` всегда сохраняет `role="switch"`. `PneCheckbox indeterminate` синхронизирует одновременно
|
|
202
|
+
`input.indeterminate` и mixed accessibility state. `readOnly` у обоих компонентов действительно блокирует
|
|
203
|
+
pointer, label и keyboard activation, но не делает input disabled: он остаётся focusable и участвует в
|
|
204
|
+
`FormData`; состояние также объявляется через `aria-readonly`.
|
|
205
|
+
|
|
206
|
+
Если `PneSwitch.onChange` возвращает Promise/thenable, компонент автоматически включает optimistic lifecycle
|
|
207
|
+
без отдельного `pending` prop: сразу показывает запрошенное состояние, помечает input через `aria-busy` и
|
|
208
|
+
`aria-disabled`, показывает progress-индикатор и игнорирует повторную активацию до settlement. При reject
|
|
209
|
+
переключатель откатывается, при resolve сохраняет подтверждённое состояние. Синхронные callbacks работают как
|
|
210
|
+
раньше. Для controlled usage возвращаемый Promise должен завершаться после обновления внешнего `checked`;
|
|
211
|
+
для `defaultChecked` commit и rollback полностью принадлежат самому `PneSwitch`. Нативный input во время
|
|
212
|
+
запроса не становится `disabled`, поэтому не теряет focus и сохраняет текущее ON/OFF-состояние.
|
|
213
|
+
|
|
214
|
+
Внешний `PneField` передаёт control ID, label/helper-связь, `disabled`, `error` и `aria-required`. Как и у
|
|
215
|
+
`PneTextField`, `required` на `PneField` не включает browser constraint validation; для неё задайте `required`
|
|
216
|
+
самому checkbox или switch. `PneLabeledCheckbox` добавляет локальные `label`, `helperText` и `error`, генерирует
|
|
217
|
+
ID helper text, сохраняет явный `helperTextProps.id` и объединяет все `aria-describedby`.
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
<PneField label="Notifications" helperText={error?.message} error={Boolean(error)} required>
|
|
221
|
+
<PneSwitch
|
|
222
|
+
checked={enabled}
|
|
223
|
+
inputRef={controllerRef}
|
|
224
|
+
name="notifications"
|
|
225
|
+
onChange={(_event, checked) => updateNotifications(checked)
|
|
226
|
+
.then(() => setEnabled(checked))}
|
|
227
|
+
/>
|
|
228
|
+
</PneField>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## PneTableSwitchCell
|
|
232
|
+
|
|
233
|
+
Для status-колонки `PneTable` используйте `PneTableSwitchCell`: он размещает `PneSwitch size="small"` в
|
|
234
|
+
компактной ячейке шириной `40px` без vertical padding и не передаёт click в интерактивную строку. Один из
|
|
235
|
+
`aria-label` / `aria-labelledby` обязателен. Интерактивному варианту нужен `onChange(checked, event)`;
|
|
236
|
+
display-only вариант задаётся через `readOnly` без пустого callback. Возвращённый из табличного `onChange`
|
|
237
|
+
Promise передаётся в `PneSwitch`, поэтому optimistic/pending/rollback lifecycle работает в status-колонке без
|
|
238
|
+
дополнительных props ячейки.
|
|
239
|
+
|
|
240
|
+
Props самой ячейки передаются напрямую, а props переключателя — через `switchProps`. В частности, `id`,
|
|
241
|
+
`inputRef`, `name`, `slotProps` и существующие верхнеуровневые `PneSwitch` `data-*` селекторы относятся к
|
|
242
|
+
`switchProps`; селектор сохраняется на том же Switch DOM anchor, что и при прямом использовании `PneSwitch`,
|
|
243
|
+
но это не обязательно внешний wrapper. Размер, controlled state и accessible name принадлежат
|
|
244
|
+
`PneTableSwitchCell`. `autoTestId` создаёт отдельный locator на нативном input и имеет приоритет над одноимённым
|
|
245
|
+
атрибутом в `switchProps.slotProps.input`, не удаляя верхнеуровневый `PneSwitch` locator из `switchProps`.
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
<PneTableSwitchCell
|
|
249
|
+
aria-label="Enable endpoint"
|
|
250
|
+
checked={enabled}
|
|
251
|
+
onChange={setEnabled}
|
|
252
|
+
switchProps={{
|
|
253
|
+
inputRef: controllerRef,
|
|
254
|
+
name: "enabled",
|
|
255
|
+
"data-autotest": "endpoint-status",
|
|
256
|
+
}}
|
|
257
|
+
/>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## PneModal и PneModalActions
|
|
261
|
+
|
|
262
|
+
`PneModal` владеет структурой dialog, focus trap и ARIA-связями. Передайте видимый `title`; для модалок без
|
|
263
|
+
визуального заголовка используйте `ariaLabel`. Если компонент внутри `title` сам возвращает `null`, передайте
|
|
264
|
+
`title={null}` и `ariaLabel` явно: содержимое произвольного React-компонента нельзя определить до его рендера.
|
|
265
|
+
`title` и `subtitle` принимают `ReactNode`. `ref` указывает на
|
|
266
|
+
`HTMLDivElement` с `role="dialog"`. Структурные `role`, `aria-modal`, `aria-labelledby` и `aria-describedby`
|
|
267
|
+
нельзя переопределить через container slot; дополнительное описание подключается через `ariaDescribedBy`.
|
|
268
|
+
|
|
269
|
+
`onClose(event, reason)` различает `closeButtonClick`, `escapeKeyDown` и `backdropClick`. Существующие callbacks
|
|
270
|
+
без аргументов остаются совместимыми. `closeLabel` необязателен и по умолчанию равен `Close`; передавайте перевод
|
|
271
|
+
только там, где он доступен consumer-у. `hideCloseButton` скрывает icon button без дополнительных обязательных
|
|
272
|
+
props.
|
|
273
|
+
|
|
274
|
+
```tsx
|
|
275
|
+
<PneModal
|
|
276
|
+
actions={<PneModalActions
|
|
277
|
+
secondary={<PneButton pneStyle="outlined">Cancel</PneButton>}
|
|
278
|
+
primary={<PneButton>Save</PneButton>}
|
|
279
|
+
/>}
|
|
280
|
+
closeLabel="Close"
|
|
281
|
+
onClose={(_event, reason) => {
|
|
282
|
+
if (reason !== "backdropClick") setOpen(false)
|
|
283
|
+
}}
|
|
284
|
+
open={open}
|
|
285
|
+
title={<span>Edit account</span>}
|
|
286
|
+
slotProps={{
|
|
287
|
+
container: {"data-autotest": "account-dialog"},
|
|
288
|
+
title: {component: "h2"},
|
|
289
|
+
}}
|
|
290
|
+
>
|
|
291
|
+
Account form
|
|
292
|
+
</PneModal>
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
`blockingOverlay` предназначен для loading-состояния всей модалки. Пока slot присутствует, dialog получает
|
|
296
|
+
`aria-busy`, header/body/footer становятся inert, focus остаётся на границе dialog, а Escape, backdrop и close
|
|
297
|
+
button не вызывают `onClose`. После снятия overlay прежний focused control восстанавливается, если он всё ещё
|
|
298
|
+
существует. Старый `overlay` оставлен как deprecated alias.
|
|
299
|
+
|
|
300
|
+
Внутренние части настраиваются через `slotProps`, но их element type, owned content и dialog semantics остаются
|
|
301
|
+
фиксированными. `modalProps` содержит только безопасные настройки MUI root и не позволяет подменять root/backdrop
|
|
302
|
+
slots. Прежние `containerProps` и `closeButtonProps` оставлены deprecated на период миграции.
|
|
303
|
+
|
|
304
|
+
Частые тестовые маркеры `data-*` передаются прямо в `PneModal` и попадают на семантический dialog container:
|
|
305
|
+
`<PneModal data-testattribute="edit-modal" ... />`. Для них не требуется обёртка `slotProps.container`;
|
|
306
|
+
этот slot остаётся для остальных безопасных атрибутов и `sx` контейнера.
|
|
307
|
+
|
|
308
|
+
`PneModalActions` сохраняет одни и те же keyed action nodes, но синхронизирует DOM/focus order с layout:
|
|
309
|
+
`leading → secondary → primary` на desktop и `primary → secondary → leading` на экране до 480 px. При смене
|
|
310
|
+
breakpoint существующие controls только перемещаются внутри дерева, не перемонтируются и не теряют focus/state.
|
|
311
|
+
Root фиксирован как `div`, поддерживает `ref`, `sx`, обычные HTML/ARIA/data attributes.
|
|
312
|
+
|
|
313
|
+
## PneSelect
|
|
314
|
+
|
|
315
|
+
`PneSelect` — controlled single-select для произвольного типа option. `value` имеет тип `T | null`, а `onChange`
|
|
316
|
+
получает выбранный `T`. Для строк и чисел key и label выводятся автоматически; объектам нужны явные
|
|
317
|
+
`getOptionKey` и `getOptionLabel`. Все option callbacks получают исходный объект, поэтому дополнительные поля не
|
|
318
|
+
нужно переносить во вспомогательную форму `{value, label}`.
|
|
319
|
+
|
|
320
|
+
`getOptionLabel` всегда возвращает plain `string`: он служит также accessible name для option. Rich JSX
|
|
321
|
+
передавайте отдельно через `renderOption`, сохраняя в `getOptionLabel` текстовый эквивалент.
|
|
322
|
+
|
|
323
|
+
Для HOC сначала зафиксируйте generic явным публичным props-типом: стандартный `ComponentProps<typeof PneSelect>`
|
|
324
|
+
не может представить сразу primitive и object overloads без потери точности.
|
|
325
|
+
|
|
326
|
+
```tsx
|
|
327
|
+
const RegionSelect = (props: PneSelectObjectProps<Region, string>) => <PneSelect {...props}/>
|
|
328
|
+
const MemoRegionSelect = memo(RegionSelect)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
type Region = {
|
|
333
|
+
code: string
|
|
334
|
+
disabled: boolean
|
|
335
|
+
title: string
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const [region, setRegion] = useState<Region | null>(null)
|
|
339
|
+
|
|
340
|
+
<PneSelect
|
|
341
|
+
options={regions}
|
|
342
|
+
value={region}
|
|
343
|
+
onChange={setRegion}
|
|
344
|
+
getOptionKey={option => option.code}
|
|
345
|
+
getOptionLabel={option => option.title}
|
|
346
|
+
getOptionDisabled={option => option.disabled}
|
|
347
|
+
getOptionProps={option => ({'data-region': option.code})}
|
|
348
|
+
placeholder="Please select"
|
|
349
|
+
/>
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Компонент намеренно не публикует MUI-режимы `native`, `multiple`, `defaultValue`, custom input и input/slot escape
|
|
353
|
+
hatches: его контракт controlled, single и non-native. `ref` указывает на корневой `HTMLDivElement` внутреннего
|
|
354
|
+
MUI Select; `sx` и `fullWidth` применяются к внешнему FormControl. Для композиции
|
|
355
|
+
label/helper/error/required/fullWidth оборачивайте select в `PneField`.
|
|
356
|
+
`SelectDisplayProps` и `MenuProps` сохраняют styling/data/ARIA-настройки, но не позволяют заменить управляемые
|
|
357
|
+
combobox/listbox roles, keyboard/pointer handlers, identity или open/close lifecycle.
|
|
358
|
+
`getOptionProps` предназначен для неинтерактивных DOM-метаданных, ARIA, styling и `data-*`; содержимое option
|
|
359
|
+
задавайте через `renderOption`, disabled-состояние — через `getOptionDisabled`, а выбор обрабатывайте в `onChange`.
|
|
360
|
+
|
|
361
|
+
`null` обозначает только пустое состояние и не может входить в `options`; `undefined` также не является option.
|
|
362
|
+
Ключи сериализуются в строки, поэтому после сериализации они должны быть уникальны; например, `1` и `"1"`
|
|
363
|
+
конфликтуют. Пустая строка зарезервирована для `null`. Если key текущего `value` отсутствует в `options`, select
|
|
364
|
+
показывает empty/placeholder state без MUI `out-of-range` warning и снова отображает значение после появления
|
|
365
|
+
совпадающей option.
|
|
366
|
+
|
|
367
|
+
При миграции object options передавайте в `value` сам выбранный объект или `null`, а не замаскированный через cast
|
|
368
|
+
numeric/string ID. `getOptionLabel`, `getOptionProps`, `getOptionDisabled`, `renderOption` и `renderValue` теперь
|
|
369
|
+
работают с исходным `T`, а не с нормализованным `{value, label}`.
|
|
370
|
+
|
|
371
|
+
## PneAutocomplete
|
|
372
|
+
|
|
373
|
+
`PneAutocomplete` сохраняет MUI-контракт single/multiple, `disableClearable` и `freeSolo`, но не ограничивает
|
|
374
|
+
данные Paynet DTO. Для строк, чисел и структур `{id, displayName}` / `{choiceId, displayName}` key, label и
|
|
375
|
+
сравнение выводятся автоматически. `id` и `choiceId` могут быть строками или числами; восстановленный из API
|
|
376
|
+
объект считается выбранным по key, а не по ссылке. Значения разных форм (например, freeSolo-строка и объект)
|
|
377
|
+
всегда считаются различными и не приводят к исключению.
|
|
378
|
+
|
|
379
|
+
Для произвольного объекта обязательны `getOptionKey` и `getOptionLabel`. Явный key также становится default
|
|
380
|
+
правилом сравнения, если caller не передал `isOptionEqualToValue`:
|
|
381
|
+
|
|
382
|
+
```tsx
|
|
383
|
+
type Region = {code: string; title: string; disabled: boolean}
|
|
384
|
+
|
|
385
|
+
<PneAutocomplete
|
|
386
|
+
options={regions}
|
|
387
|
+
value={selectedRegion}
|
|
388
|
+
onChange={(_event, value) => setSelectedRegion(value)}
|
|
389
|
+
getOptionKey={region => region.code}
|
|
390
|
+
getOptionLabel={region => region.title}
|
|
391
|
+
getOptionDisabled={region => region.disabled}
|
|
392
|
+
label="Region"
|
|
393
|
+
/>
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
Обычный `ref` указывает на фиксированный root `HTMLDivElement`, `inputRef` — на нативный `HTMLInputElement`.
|
|
397
|
+
`htmlInputProps` принимает только безопасные native metadata: `data-*`, name/ARIA и ограниченный набор
|
|
398
|
+
текстовых input-атрибутов. Lifecycle handlers, `value`, `id`, `role`, `disabled`, `readOnly` и другие управляемые
|
|
399
|
+
свойства задаются через API Autocomplete. Имя input автоматически переносится на portal listbox; это работает
|
|
400
|
+
для собственного `label`, внешнего `PneField`, `aria-label` и `aria-labelledby`.
|
|
401
|
+
|
|
402
|
+
## PneAsyncAutocomplete
|
|
403
|
+
|
|
404
|
+
`PneAsyncAutocomplete` владеет remote options, loading и отключением локальной MUI-фильтрации. Loader получает
|
|
405
|
+
plain query и контекст запроса:
|
|
406
|
+
|
|
407
|
+
```tsx
|
|
408
|
+
<PneAsyncAutocomplete
|
|
409
|
+
value={merchant}
|
|
410
|
+
onChange={(_event, value) => setMerchant(value)}
|
|
411
|
+
loadOptions={(query, {signal}) => api.searchMerchants({query, signal})}
|
|
412
|
+
reloadKey={manager?.id}
|
|
413
|
+
minQueryLength={2}
|
|
414
|
+
onLoadError={(error, {query, reason}) => reportAutocompleteError(error, query, reason)}
|
|
415
|
+
label="Merchant"
|
|
416
|
+
/>
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
```ts
|
|
420
|
+
type PneLoadOptions<T> = (
|
|
421
|
+
query: string,
|
|
422
|
+
context: {
|
|
423
|
+
signal: AbortSignal
|
|
424
|
+
reason: 'open' | 'input' | 'clear' | 'reload'
|
|
425
|
+
},
|
|
426
|
+
) => Promise<readonly T[]>
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Новый запрос отменяет предыдущий через `AbortSignal` и дополнительно защищён request ID на случай, если loader
|
|
430
|
+
игнорирует signal. Закрытие и unmount также отменяют активный запрос. Sync throw и rejected Promise переходят в
|
|
431
|
+
одно error-состояние; `AbortError` не вызывает `onLoadError`. `loadErrorText`, `minQueryLengthText`, MUI
|
|
432
|
+
`loadingText` и `noOptionsText` разделяют error/min-query/loading/empty состояния и объявляются assistive
|
|
433
|
+
technology. `keepPreviousOptions` по умолчанию выключен.
|
|
434
|
+
|
|
435
|
+
`open` и `inputValue` поддерживают controlled и uncontrolled режимы с исходными MUI callbacks/reasons.
|
|
436
|
+
Изменение identity `loadOptions` не перезапускает открытый поиск: для реальной зависимости результата от
|
|
437
|
+
manager/status/currency передавайте стабильный primitive `reloadKey`.
|
|
438
|
+
|
|
439
|
+
Компонент намеренно не делает debounce и вызывает loader сразу для `open`, пользовательского `input`, `clear`
|
|
440
|
+
и изменения `reloadKey`. Если сервисный метод уже обёрнут React/service debounce-декоратором, дополнительного
|
|
441
|
+
слоя в компоненте нет и конфликтовать с ним нечему.
|
|
442
|
+
|
|
443
|
+
Breaking migration со старого API выполняется напрямую:
|
|
444
|
+
|
|
445
|
+
```tsx
|
|
446
|
+
// было
|
|
447
|
+
<PneAsyncAutocomplete searchChoices={({searchString}) => search(searchString ?? '')}/>
|
|
448
|
+
|
|
449
|
+
// стало
|
|
450
|
+
<PneAsyncAutocomplete loadOptions={query => search(query)}/>
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
`searchChoices` и `onSearchError` удалены; используйте `loadOptions` и `onLoadError`. Props `options`, `loading`
|
|
454
|
+
и `filterOptions` также не входят в async API, потому что ими владеет компонент. Debounce в эту миграцию не
|
|
455
|
+
входит.
|
|
456
|
+
|
|
32
457
|
## Якоря для автотестов
|
|
33
458
|
|
|
34
459
|
Для нового кода добавляйте якорь непосредственно на существующий DOM-элемент или нужный MUI slot через
|
|
@@ -143,12 +568,12 @@ const selection = useTableSelection({
|
|
|
143
568
|
/>
|
|
144
569
|
{/* business cells */}
|
|
145
570
|
</PneTableRow>}
|
|
571
|
+
feedback={consumerOwnedLimitWarning}
|
|
146
572
|
toolbar={<PneTableToolbar
|
|
147
573
|
aria-label="Table controls"
|
|
148
574
|
contextual={<PneTableSelectionControls
|
|
149
575
|
summary={`${selection.selectedCount} selected`}
|
|
150
576
|
actions={consumerOwnedBulkActions}
|
|
151
|
-
status={consumerOwnedLimitWarning}
|
|
152
577
|
/>}
|
|
153
578
|
persistent={optionalViewSelector}
|
|
154
579
|
/>}
|
|
@@ -165,6 +590,10 @@ scope-reset и вернуть canonical empty-модель `{mode: 'explicit', s
|
|
|
165
590
|
полосе таблицы. Он измеряет фактическое содержимое и сохраняет DOM/keyboard-порядок Selection → View →
|
|
166
591
|
Pagination при переходе на несколько строк, включая поддерживаемую ширину viewport 360px.
|
|
167
592
|
|
|
593
|
+
`PneTable.feedback` — отдельный full-width slot над всей верхней полосой. Warning, error и informational alert
|
|
594
|
+
нужно передавать туда, а не внутрь toolbar: feedback не входит в измерения `PneTableToolbar` и пагинации и
|
|
595
|
+
поэтому не меняет их inline/stacked layout даже при переносе текста на несколько строк.
|
|
596
|
+
|
|
168
597
|
#### Выбор строк в SearchUI
|
|
169
598
|
|
|
170
599
|
`SearchUI.tableSelection` добавляет тот же controller к consumer-owned header/row factories и автоматически
|
|
@@ -198,9 +627,11 @@ value-equivalent refresh сохраняют выбор. Новые примен
|
|
|
198
627
|
>
|
|
199
628
|
Select all results
|
|
200
629
|
</button>}
|
|
201
|
-
status={controller.selectingAllMatching ? 'Selecting…' : selectionStatus}
|
|
202
630
|
/>
|
|
203
631
|
),
|
|
632
|
+
renderFeedback: ({selection: controller}) => (
|
|
633
|
+
controller.selectingAllMatching ? 'Selecting…' : selectionFeedback
|
|
634
|
+
),
|
|
204
635
|
toolbarAriaLabel: 'Order table controls',
|
|
205
636
|
}}
|
|
206
637
|
createTableHeader={(params, context) => {
|
|
@@ -407,10 +838,11 @@ assertEquals("true", enabled.getAttribute("aria-pressed"));
|
|
|
407
838
|
|---|---|---|
|
|
408
839
|
| Верхняя пагинация | `[data-autotest="pagination"][data-autotest-value="top"]` | Native button `disabled`; `current-page` внутри |
|
|
409
840
|
| Нижняя пагинация | `[data-autotest="pagination"][data-autotest-value="bottom"]` | Native button `disabled`; `current-page` внутри |
|
|
841
|
+
| Feedback над таблицей | `[data-autotest="table-feedback"]` | Full-width slot перед верхней полосой; alert/status semantics задаёт consumer |
|
|
410
842
|
| Общая полоса контролов | `[data-autotest="table-control-bar"]` | `data-autotest-value="inline|stacked"` |
|
|
411
843
|
| Выбор текущей страницы | `input[data-autotest="page-selection"]` | Native `checked`, `disabled`, `aria-checked="mixed"` |
|
|
412
844
|
| Выбор строки | `input[data-autotest="row-selection"]` | Native `checked`, `disabled`; consumer может задать `autoTestId`/`autoTestValue` |
|
|
413
|
-
| Selection summary/actions
|
|
845
|
+
| Selection summary/actions | `[data-autotest="selection-summary"]`, `[data-autotest="selection-actions"]` | Summary является polite live status |
|
|
414
846
|
| Пустой результат | `[data-autotest="empty-state"]` | Наличие существующей empty row |
|
|
415
847
|
| Загрузка | Semantic `table` | `aria-busy="true|false"` |
|
|
416
848
|
| Активная сортировка | `th[aria-sort="ascending"], th[aria-sort="descending"]` | Значение `aria-sort` |
|
|
@@ -962,6 +1394,10 @@ export const App = () => (
|
|
|
962
1394
|
- `OverlayHost` должен подключаться в приложении-хосте, а не внутри отдельных виджетов библиотеки.
|
|
963
1395
|
- stacks и permanent overlays по умолчанию уходят одним React portal в `document.body`, не добавляя overlay-wrapper в DOM приложения; для изолированного harness можно передать `container` (или `null` для inline render);
|
|
964
1396
|
- `maxSnack` является жёсткой границей: при переполнении самые старые snackbar удаляются, а не остаются скрытой очередью;
|
|
1397
|
+
- для обычного уведомления о завершившемся действии не передавайте `id`: каждый вызов получит собственную внутреннюю
|
|
1398
|
+
identity, поэтому даже одинаковые сообщения будут показаны отдельными элементами стека;
|
|
1399
|
+
- явный `id` нужен только для управляемого lifecycle, когда вызывающий код должен позднее адресно удалить или заменить
|
|
1400
|
+
конкретный snackbar (например, после Undo);
|
|
965
1401
|
- повторный enqueue с тем же явным `id` игнорируется, пока первый snackbar присутствует. Для замены сначала вызовите `removeSnackbar(id)`.
|
|
966
1402
|
|
|
967
1403
|
## PneConfirmProvider
|
|
@@ -978,6 +1414,7 @@ const DeleteButton = () => {
|
|
|
978
1414
|
|
|
979
1415
|
const handleDelete = async () => {
|
|
980
1416
|
const accepted = await confirm({
|
|
1417
|
+
autoTestValue: item.id,
|
|
981
1418
|
danger: true,
|
|
982
1419
|
title: 'Delete item?',
|
|
983
1420
|
message: 'This action cannot be undone.',
|
|
@@ -1004,12 +1441,17 @@ Cancel используйте `showCancel: false`: Close, Escape и backdrop п
|
|
|
1004
1441
|
вызовы обслуживаются по FIFO; повторное событие от action предыдущего dialog не подтверждает следующий запрос.
|
|
1005
1442
|
При размонтировании provider текущий и ожидающие Promise завершаются значением `false`.
|
|
1006
1443
|
|
|
1444
|
+
Для повторяемого или бизнес-специфичного действия передавайте стабильный не-секретный
|
|
1445
|
+
`autoTestValue` (raw entity ID, enum или caller-owned scope). Portal-root получает это значение, поэтому dialog
|
|
1446
|
+
однозначно связывается с инициировавшим control даже вне его DOM-поддерева. Очередь хранит scope каждого
|
|
1447
|
+
запроса независимо и меняет его вместе с текущим confirm.
|
|
1448
|
+
|
|
1007
1449
|
Поддерживаемые Selenium-якоря размещены на существующих интерактивных/смысловых DOM nodes без
|
|
1008
1450
|
дополнительных wrapper-элементов:
|
|
1009
1451
|
|
|
1010
1452
|
| Якорь | Назначение |
|
|
1011
1453
|
|-------|------------|
|
|
1012
|
-
| `alert.container
|
|
1454
|
+
| `alert.container/<autoTestValue?>` | контейнер confirm modal и опциональный owner scope |
|
|
1013
1455
|
| `alert.message` | содержимое сообщения |
|
|
1014
1456
|
| `alert.button.close` | кнопка закрытия |
|
|
1015
1457
|
| `alert.button.cancel` | cancel action; отсутствует при `showCancel: false` |
|
|
@@ -1089,6 +1531,190 @@ const config = {
|
|
|
1089
1531
|
/>
|
|
1090
1532
|
```
|
|
1091
1533
|
|
|
1534
|
+
Параметр `maxRangeSpanInDays` задаёт включительную верхнюю границу диапазона.
|
|
1535
|
+
Он проверяет уже разрешённые границы всех режимов даты; для date-only `EXACTLY`
|
|
1536
|
+
пользовательская конечная дата считается включительной. Значение должно быть
|
|
1537
|
+
положительным целым числом.
|
|
1538
|
+
|
|
1539
|
+
### Критерии отчёта по транзакциям
|
|
1540
|
+
|
|
1541
|
+
Для экранов полного и краткого отчётов специализированная конфигурация включает
|
|
1542
|
+
шесть критериев: диапазон дат и пять новых критериев отчёта. Имена их полей в
|
|
1543
|
+
`SearchCriteria` совместимы с контрактом API: `scope` вместе с
|
|
1544
|
+
`transactionIds`, `datesType`, `recurrentFilter`, `timeZoneOffsetHours` и
|
|
1545
|
+
`csvCharset`. Поддерживаемые библиотекой значения местами намеренно уже полного
|
|
1546
|
+
backend-контракта; различия перечислены ниже.
|
|
1547
|
+
|
|
1548
|
+
Все шесть специализированных критериев следует передавать в
|
|
1549
|
+
`predefinedCriteria`, чтобы их нельзя было удалить. Их необходимо объединить с
|
|
1550
|
+
уже существующими обязательными критериями конкретного отчёта. В примере ниже
|
|
1551
|
+
использован базовый набор Wicket-страниц: типы транзакций, статусы транзакций и
|
|
1552
|
+
типы карт. Дополнительные доступные критерии, например валюты, можно добавить
|
|
1553
|
+
только в `possibleCriteria`.
|
|
1554
|
+
|
|
1555
|
+
```tsx
|
|
1556
|
+
import {useState} from 'react'
|
|
1557
|
+
import {
|
|
1558
|
+
CriterionTypeEnum,
|
|
1559
|
+
DATE_RANGE_SPEC_TYPES,
|
|
1560
|
+
OverlayHost,
|
|
1561
|
+
PneButton,
|
|
1562
|
+
type SearchCriteria,
|
|
1563
|
+
SearchUIFilters,
|
|
1564
|
+
SearchUIProvider,
|
|
1565
|
+
type SearchUIValidationResult,
|
|
1566
|
+
} from 'pne-ui'
|
|
1567
|
+
|
|
1568
|
+
const BASE_REQUIRED_REPORT_CRITERIA: CriterionTypeEnum[] = [
|
|
1569
|
+
CriterionTypeEnum.TRANSACTION_TYPES,
|
|
1570
|
+
CriterionTypeEnum.TRANSACTION_STATUS,
|
|
1571
|
+
CriterionTypeEnum.CARD_TYPES,
|
|
1572
|
+
]
|
|
1573
|
+
|
|
1574
|
+
const SPECIALIZED_TRANSACTION_REPORT_CRITERIA: CriterionTypeEnum[] = [
|
|
1575
|
+
CriterionTypeEnum.DATE_RANGE,
|
|
1576
|
+
CriterionTypeEnum.TRANSACTION_REPORT_SCOPE,
|
|
1577
|
+
CriterionTypeEnum.TRANSACTION_DATE_TYPE,
|
|
1578
|
+
CriterionTypeEnum.TRANSACTION_RECURRENT_FILTER,
|
|
1579
|
+
CriterionTypeEnum.TIME_ZONE,
|
|
1580
|
+
CriterionTypeEnum.CSV_CHARSET,
|
|
1581
|
+
]
|
|
1582
|
+
|
|
1583
|
+
const REQUIRED_TRANSACTION_REPORT_CRITERIA: CriterionTypeEnum[] = [
|
|
1584
|
+
...BASE_REQUIRED_REPORT_CRITERIA,
|
|
1585
|
+
...SPECIALIZED_TRANSACTION_REPORT_CRITERIA,
|
|
1586
|
+
]
|
|
1587
|
+
|
|
1588
|
+
type TransactionReportFiltersExampleProps = {
|
|
1589
|
+
onGenerate: (criteria: SearchCriteria) => void
|
|
1590
|
+
}
|
|
1591
|
+
|
|
1592
|
+
export const TransactionReportFiltersExample = ({
|
|
1593
|
+
onGenerate,
|
|
1594
|
+
}: TransactionReportFiltersExampleProps) => {
|
|
1595
|
+
const [searchCriteria, setSearchCriteria] = useState<SearchCriteria | null>(null)
|
|
1596
|
+
const [validation, setValidation] = useState<SearchUIValidationResult | null>(null)
|
|
1597
|
+
|
|
1598
|
+
const generateReport = () => {
|
|
1599
|
+
if (searchCriteria !== null) {
|
|
1600
|
+
onGenerate(searchCriteria)
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
return <OverlayHost>
|
|
1605
|
+
<SearchUIProvider>
|
|
1606
|
+
<SearchUIFilters
|
|
1607
|
+
settingsContextName="transaction-report"
|
|
1608
|
+
possibleCriteria={REQUIRED_TRANSACTION_REPORT_CRITERIA}
|
|
1609
|
+
predefinedCriteria={REQUIRED_TRANSACTION_REPORT_CRITERIA}
|
|
1610
|
+
initialSearchConditions={{
|
|
1611
|
+
dateRangeSpec: {
|
|
1612
|
+
dateRangeSpecType: 'EXACTLY',
|
|
1613
|
+
dateFrom: new Date(2026, 0, 1),
|
|
1614
|
+
dateTo: new Date(2026, 0, 31),
|
|
1615
|
+
},
|
|
1616
|
+
scope: 'ALL',
|
|
1617
|
+
transactionIds: '',
|
|
1618
|
+
datesType: 'CREATED',
|
|
1619
|
+
recurrentFilter: 'ALL',
|
|
1620
|
+
timeZoneOffsetHours: null,
|
|
1621
|
+
csvCharset: null,
|
|
1622
|
+
}}
|
|
1623
|
+
onFiltersUpdate={criteria => setSearchCriteria(criteria)}
|
|
1624
|
+
onValidationChange={setValidation}
|
|
1625
|
+
config={{
|
|
1626
|
+
dateRange: {
|
|
1627
|
+
dateRangeSpecTypes: DATE_RANGE_SPEC_TYPES.filter(
|
|
1628
|
+
type => type !== 'DATE_INDEPENDENT',
|
|
1629
|
+
),
|
|
1630
|
+
maxRangeSpanInDays: 93,
|
|
1631
|
+
},
|
|
1632
|
+
}}
|
|
1633
|
+
/>
|
|
1634
|
+
|
|
1635
|
+
<PneButton
|
|
1636
|
+
disabled={searchCriteria === null || !validation?.isValid}
|
|
1637
|
+
onClick={generateReport}
|
|
1638
|
+
>
|
|
1639
|
+
Generate report
|
|
1640
|
+
</PneButton>
|
|
1641
|
+
</SearchUIProvider>
|
|
1642
|
+
</OverlayHost>
|
|
1643
|
+
}
|
|
1644
|
+
```
|
|
1645
|
+
|
|
1646
|
+
У высокоуровневого `SearchUI` используются те же `possibleCriteria`,
|
|
1647
|
+
`predefinedCriteria`, `initialSearchConditions`, `config` и
|
|
1648
|
+
`onValidationChange`; результат для бэкенда передаётся в `searchData` как часть
|
|
1649
|
+
`SearchParams`.
|
|
1650
|
+
|
|
1651
|
+
Поддерживаемые значения специализированных полей:
|
|
1652
|
+
|
|
1653
|
+
- `scope`: `ALL`, `SELECTED_BY_SESS_ID`, `SELECTED_BY_PROCESSOR_TX_ID`,
|
|
1654
|
+
`SELECTED_BY_MOTHER_SESS_ID`, `SELECTED_BY_MOTHER_PROCESSOR_TX_ID`,
|
|
1655
|
+
`SELECTED_BY_TX_RRN`;
|
|
1656
|
+
- `datesType`: библиотека поддерживает только `CREATED`. Backend enum и Wicket
|
|
1657
|
+
также принимают deprecated-вариант `BANK`, который сейчас обрабатывается как
|
|
1658
|
+
тот же диапазон created dates; библиотека намеренно его не показывает;
|
|
1659
|
+
- `recurrentFilter`: `ALL`, `RECURRENTS_ONLY`, `NON_RECURRENTS_ONLY`;
|
|
1660
|
+
- `timeZoneOffsetHours`: `null` либо целое число от `-12` до `12`;
|
|
1661
|
+
- `csvCharset`: `null`, `UTF-8`, `UTF-8-SIG` или `windows-1251`.
|
|
1662
|
+
|
|
1663
|
+
`transactionIds` — необязательная строка, которая показывается только при
|
|
1664
|
+
`scope !== 'ALL'` и передаётся библиотекой без преобразования и UI-валидации.
|
|
1665
|
+
Backend заменяет каждую непрерывную группу whitespace, запятых, точек с запятой,
|
|
1666
|
+
одинарных/двойных кавычек и NUL одним разделителем-запятой. Для scope с числовыми
|
|
1667
|
+
order ID он затем молча отбрасывает фрагменты с недесятичными символами. Проверка,
|
|
1668
|
+
отключающая период при непустых ID, выполняется backend по исходной строке до
|
|
1669
|
+
этой нормализации.
|
|
1670
|
+
|
|
1671
|
+
`timeZoneOffsetHours: null` включает backend fallback на серверный сдвиг
|
|
1672
|
+
таймзоны, а `csvCharset: null` — выбор кодировки на сервере по данным браузера.
|
|
1673
|
+
Wicket сразу показывает эти вычисленные значения в обязательных dropdown; React
|
|
1674
|
+
для `null` показывает `Default`. Если нужна точная визуальная parity с Wicket,
|
|
1675
|
+
передайте вычисленные конкретные значения вместо `null`.
|
|
1676
|
+
|
|
1677
|
+
`UTF-8-SIG` экспонируется библиотекой в соответствии с UI-контрактом, но в
|
|
1678
|
+
текущем endpoint отчётов ещё нет обязательного backend mapping строки
|
|
1679
|
+
`UTF-8-SIG` на custom charset с BOM. До появления такого mapping выбор этого
|
|
1680
|
+
значения не является end-to-end поддержанным и не должен отправляться в
|
|
1681
|
+
production-запросе.
|
|
1682
|
+
|
|
1683
|
+
Если диапазон невалиден, встроенная кнопка Search/Refresh блокируется и
|
|
1684
|
+
`onFiltersUpdate` не публикует невалидный черновик. При валидном изменении пример
|
|
1685
|
+
выше сразу синхронизирует актуальные критерии, а внешнюю кнопку Generate блокирует
|
|
1686
|
+
через `onValidationChange`.
|
|
1687
|
+
|
|
1688
|
+
Если отдельно включить `manualSearch: true`, пользователь должен сначала применить
|
|
1689
|
+
изменения встроенной кнопкой Search и только затем запускать Generate: до Search в
|
|
1690
|
+
`onFiltersUpdate` остаются последние применённые критерии.
|
|
1691
|
+
|
|
1692
|
+
### Ограничение типов транзакций
|
|
1693
|
+
|
|
1694
|
+
Чтобы показать в `TRANSACTION_TYPES` только часть общего справочника, передайте
|
|
1695
|
+
точные системные имена в `config.transactionTypes.allowedNames`. Имена сравниваются
|
|
1696
|
+
с полем `displayName`, а числовые ID берутся из справочника текущего инстанса.
|
|
1697
|
+
|
|
1698
|
+
```tsx
|
|
1699
|
+
<SearchUIFilters
|
|
1700
|
+
settingsContextName="fraud-chargeback-report"
|
|
1701
|
+
possibleCriteria={[CriterionTypeEnum.TRANSACTION_TYPES]}
|
|
1702
|
+
predefinedCriteria={[CriterionTypeEnum.TRANSACTION_TYPES]}
|
|
1703
|
+
onFiltersUpdate={handleFiltersUpdate}
|
|
1704
|
+
config={{
|
|
1705
|
+
transactionTypes: {
|
|
1706
|
+
allowedNames: ['chargeback', 'fraud'],
|
|
1707
|
+
},
|
|
1708
|
+
}}
|
|
1709
|
+
/>
|
|
1710
|
+
```
|
|
1711
|
+
|
|
1712
|
+
При таком ограничении значение `All` соответствует всем разрешённым типам и
|
|
1713
|
+
передаёт их фактические ID в `SearchCriteria.transactionTypes`. Пока справочник
|
|
1714
|
+
не загружен, фильтры не инициализируются и промежуточный неограниченный запрос не
|
|
1715
|
+
отправляется. Без `config.transactionTypes` сохраняется прежний контракт:
|
|
1716
|
+
`All` сериализуется как пустой массив.
|
|
1717
|
+
|
|
1092
1718
|
### Динамическая доступность критериев
|
|
1093
1719
|
|
|
1094
1720
|
Если критерий должен быть доступен только при определённом состоянии фильтров,
|
|
@@ -1125,6 +1751,25 @@ const config = {
|
|
|
1125
1751
|
/>
|
|
1126
1752
|
```
|
|
1127
1753
|
|
|
1754
|
+
### Первичная загрузка и сохранённые шаблоны
|
|
1755
|
+
|
|
1756
|
+
При монтировании `SearchUIFilters` определяет источник начальных условий до
|
|
1757
|
+
первого связанного с шаблонами вызова `onFiltersUpdate`. Источники имеют
|
|
1758
|
+
следующий приоритет: внешние `searchConditions`, восстановленное in-memory
|
|
1759
|
+
состояние, последний сохранённый шаблон, затем `initialSearchConditions` и
|
|
1760
|
+
значения по умолчанию.
|
|
1761
|
+
|
|
1762
|
+
Если имя последнего шаблона сохранено, фильтры дожидаются `getSearchTemplates`,
|
|
1763
|
+
применяют найденный шаблон и только после этого выполняют первый поиск. Если
|
|
1764
|
+
шаблон отсутствует или загрузка завершилась ошибкой, выполняется один fallback-
|
|
1765
|
+
поиск с начальными значениями. Когда сохранённого имени нет, начальный поиск не
|
|
1766
|
+
ждёт фоновой загрузки списка шаблонов.
|
|
1767
|
+
|
|
1768
|
+
Поэтому отдельный признак готовности шаблонов потребителю не требуется: загрузка
|
|
1769
|
+
шаблонов не публикует промежуточные критерии. Компонент `SearchUI` соблюдает тот
|
|
1770
|
+
же контракт и не вызывает `searchData` сначала с начальными значениями, а затем
|
|
1771
|
+
повторно с автоматически восстановленным шаблоном.
|
|
1772
|
+
|
|
1128
1773
|
### Ручной режим поиска (manual search)
|
|
1129
1774
|
|
|
1130
1775
|
По умолчанию любое изменение фильтра немедленно запускает новый запрос.
|
|
@@ -1152,15 +1797,48 @@ const config = {
|
|
|
1152
1797
|
/>
|
|
1153
1798
|
```
|
|
1154
1799
|
|
|
1155
|
-
При первой загрузке запрос всё равно отправляется автоматически, чтобы
|
|
1156
|
-
пользователь сразу видел данные.
|
|
1800
|
+
При первой загрузке итоговый запрос всё равно отправляется автоматически, чтобы
|
|
1801
|
+
пользователь сразу видел данные. Если сохранён последний шаблон, не выполняется
|
|
1802
|
+
предварительный запрос с начальными значениями: первый связанный с шаблонами
|
|
1803
|
+
запрос сразу использует его условия. Кнопка Search становится активной только
|
|
1157
1804
|
после того, как фильтры были изменены.
|
|
1158
1805
|
|
|
1159
1806
|
Исключения из этого правила тоже остаются автоматическими:
|
|
1160
|
-
|
|
1807
|
+
|
|
1808
|
+
- применение пользователем сохранённого шаблона после инициализации;
|
|
1161
1809
|
- внешняя синхронизация через проп `searchConditions` (например, клик по
|
|
1162
1810
|
значению вне панели SearchUI).
|
|
1163
1811
|
|
|
1812
|
+
### Относительные диапазоны дат
|
|
1813
|
+
|
|
1814
|
+
Относительные календарные и скользящие диапазоны (`TODAY`, `DAYS_BEFORE`,
|
|
1815
|
+
`HOURS_BEFORE` и аналогичные) являются декларативными пресетами. Хост должен
|
|
1816
|
+
передавать тип диапазона и его параметры, а вычисление конкретных `dateFrom` и
|
|
1817
|
+
`dateTo` оставлять `SearchUI`:
|
|
1818
|
+
|
|
1819
|
+
```tsx
|
|
1820
|
+
import {SearchUIDateRangeSpec} from 'pne-ui'
|
|
1821
|
+
|
|
1822
|
+
const last30Days = {
|
|
1823
|
+
dateRangeSpecType: 'DAYS_BEFORE',
|
|
1824
|
+
beforeCount: 30,
|
|
1825
|
+
} satisfies SearchUIDateRangeSpec
|
|
1826
|
+
```
|
|
1827
|
+
|
|
1828
|
+
`SearchUI` пересчитывает такой диапазон при применении внешних `searchConditions`,
|
|
1829
|
+
восстановлении шаблона или сохранённого состояния и перед выполнением повторного
|
|
1830
|
+
Search. Поэтому не вычисляйте относительные даты заранее в хосте:
|
|
1831
|
+
иначе сохранённый `dateTo` со временем превращается в устаревшую верхнюю границу.
|
|
1832
|
+
Для `EXACTLY`, напротив, `dateFrom` и `dateTo` задаются явно и не пересчитываются;
|
|
1833
|
+
`DATE_INDEPENDENT` конкретного диапазона вообще не имеет.
|
|
1834
|
+
|
|
1835
|
+
Публичные props `SearchUI` и `SearchUIFilters` проверяют эту форму и на этапе
|
|
1836
|
+
компиляции, и в runtime. Поэтому относительные пресеты не принимают `dateFrom` /
|
|
1837
|
+
`dateTo`, `EXACTLY` требует обе даты и не принимает `beforeCount`, а
|
|
1838
|
+
`DAYS_BEFORE` / `HOURS_BEFORE` требуют положительный целый `beforeCount`.
|
|
1839
|
+
Формат уже сохранённых пользовательских шаблонов не меняется: он остаётся
|
|
1840
|
+
обратно совместимым внутренним resolved-state форматом.
|
|
1841
|
+
|
|
1164
1842
|
### Автоматическое восстановление состояния
|
|
1165
1843
|
|
|
1166
1844
|
`SearchUI` и `SearchUIFilters` автоматически сохраняют текущее состояние фильтров
|
|
@@ -1222,10 +1900,13 @@ export default i18n
|
|
|
1222
1900
|
|
|
1223
1901
|
## Темизация компонентов MUI
|
|
1224
1902
|
|
|
1225
|
-
`pne-ui` поставляет
|
|
1903
|
+
`pne-ui` поставляет `createPneTheme`, `PneThemeProvider` и тип `Skin`.
|
|
1226
1904
|
`Skin` описывает корпоративные цвета Paynet (цвета хедера, меню и т.д.),
|
|
1227
1905
|
а `createPneTheme(skin)` на их основе строит расширенную MUI-тему с дополнительными палитрами:
|
|
1228
1906
|
`pnePrimary`, `pneNeutral`, `pnePrimaryLight`, `pneAccentuated`, `pneWhite`, `pneWarningLight`.
|
|
1907
|
+
По умолчанию тема остаётся светлой. Для тёмной схемы передайте `{colorMode: 'dark'}`; нейтральные
|
|
1908
|
+
surface/text/action-токены при этом меняются, а skin accent автоматически получает контрастный вариант для
|
|
1909
|
+
текста и отдельный исходный fill для contained-кнопок.
|
|
1229
1910
|
|
|
1230
1911
|
### Быстрый старт
|
|
1231
1912
|
|
|
@@ -1261,122 +1942,31 @@ export const App = () => (
|
|
|
1261
1942
|
тему MUI (тип `ThemeOptions`). Обёрнутые компоненты получают как базовые цвета skin, так и кастомные
|
|
1262
1943
|
color overrides (`pneNeutral`, `pnePrimaryLight`, `pneAccentuated` и др.), объявленные в `src/index.ts`.
|
|
1263
1944
|
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
`WidgetBoard` — дашборд с драгабл-виджетами и встраиваемой панелью лейаутов. Компонент инкапсулирует состояние:
|
|
1267
|
-
выбор лейаута, CRUD кастомных схем и сохранение/загрузку лежат внутри `WidgetBoard`; снаружи достаточно передать
|
|
1268
|
-
источники данных. Для связи `WidgetBoard` с `WidgetLayoutsPanel`/`WidgetBoardFab` используйте
|
|
1269
|
-
`WidgetBoardScopeProvider` и `useWidgetBoardScopeStore`.
|
|
1270
|
-
|
|
1271
|
-
Основные пропсы:
|
|
1272
|
-
- `widgets`: список `{ id, title, render }` — содержимое виджетов.
|
|
1273
|
-
- `layoutByBreakpoint`: базовый пресет для дефолтного лейаута.
|
|
1274
|
-
- `loadLayouts(): Promise<{ options; selectedId? } | null>`: обязательная функция загрузки пользовательских схем (вызывается при маунте). `WidgetBoard` сам добавляет и блокирует встроенный `default`-лейаут.
|
|
1275
|
-
- `saveLayouts(options, selectedId?)`: обязательная функция сохранения пользовательских схем (вызывается при select/add/delete и автосохранении изменений в выбранном пользовательском лейауте).
|
|
1276
|
-
|
|
1277
|
-
Панель `WidgetLayoutsPanel` — презентационный компонент. Передавайте `items/selectedId/onSelect/onAdd/onDelete`
|
|
1278
|
-
и прочие данные из scoped store (`useWidgetBoardScopeStore`).
|
|
1279
|
-
|
|
1280
|
-
### Структура данных для лейаутов
|
|
1281
|
-
|
|
1282
|
-
`loadLayouts` и `saveLayouts` работают с массивом `WidgetBoardLayoutOption`:
|
|
1283
|
-
|
|
1284
|
-
- `id: string`: уникальный идентификатор лейаута (можно `uuid` или любое значение бэка).
|
|
1285
|
-
- `name: string`: отображаемое имя пресета.
|
|
1286
|
-
- `layoutByBreakpoint: Record<number | string, BreakpointLayoutConfig>`: карта брейкпоинтов (ключ — число или строка, обычно `12`, `1280`, `1600` и т.д.).
|
|
1287
|
-
- `BreakpointLayoutConfig`: `{ widgets: Record<widgetId, WidgetLayoutConfig> }`.
|
|
1288
|
-
- `WidgetLayoutConfig`: `{ defaultSize: { columnSpan; rowSpan; columnOffset? }; limits?; initialState?; heightMode? }`.
|
|
1289
|
-
- `initialState` поддерживает `isHidden` и `isCollapsed`.
|
|
1290
|
-
|
|
1291
|
-
Формат функции `loadLayouts`:
|
|
1292
|
-
|
|
1293
|
-
```ts
|
|
1294
|
-
type LoadLayoutsResult = {
|
|
1295
|
-
options: WidgetBoardLayoutOption[]
|
|
1296
|
-
selectedId?: string // id активного лейаута, если его нет в options — упадет на первый элемент
|
|
1297
|
-
} | null
|
|
1298
|
-
```
|
|
1299
|
-
|
|
1300
|
-
`saveLayouts` получает тот же `options` (уже с последними изменениями) и `selectedId`.
|
|
1945
|
+
### Светлая и тёмная схемы
|
|
1301
1946
|
|
|
1302
|
-
|
|
1947
|
+
Для управляемого режима используйте `PneThemeProvider`. Он создаёт один MUI `ThemeProvider` и публикует
|
|
1948
|
+
`usePneColorMode()` для переключателя внутри выбранной области. Компонент намеренно ничего не читает и не пишет
|
|
1949
|
+
в `localStorage`: загрузка, optimistic update, rollback и сохранение пользовательской настройки принадлежат
|
|
1950
|
+
приложению. Вложенный provider позволяет сначала включить dark mode только для одной страницы; React portals
|
|
1951
|
+
этой страницы сохраняют её theme context.
|
|
1303
1952
|
|
|
1304
1953
|
```tsx
|
|
1305
|
-
import
|
|
1306
|
-
import { Box, Stack } from '@mui/material'
|
|
1307
|
-
import {
|
|
1308
|
-
WidgetBoard,
|
|
1309
|
-
WidgetLayoutsPanel,
|
|
1310
|
-
WidgetBoardScopeProvider,
|
|
1311
|
-
useWidgetBoardScopeStore,
|
|
1312
|
-
type WidgetDefinition,
|
|
1313
|
-
type WidgetBoardLayoutOption,
|
|
1314
|
-
} from 'pne-ui'
|
|
1954
|
+
import {PneThemeProvider, type PneColorMode} from 'pne-ui'
|
|
1315
1955
|
|
|
1316
|
-
const
|
|
1317
|
-
{ id: 'traffic', title: 'Traffic', render: () => <div>Traffic content</div> },
|
|
1318
|
-
{ id: 'sales', title: 'Sales', render: () => <div>Sales content</div> },
|
|
1319
|
-
]
|
|
1320
|
-
|
|
1321
|
-
const baseLayoutByBreakpoint = {
|
|
1322
|
-
12: {
|
|
1323
|
-
widgets: {
|
|
1324
|
-
traffic: { defaultSize: { columnSpan: 6, rowSpan: 2 } },
|
|
1325
|
-
sales: { defaultSize: { columnSpan: 6, rowSpan: 2 } },
|
|
1326
|
-
},
|
|
1327
|
-
},
|
|
1328
|
-
}
|
|
1956
|
+
const [mode, setMode] = useState<PneColorMode>('light')
|
|
1329
1957
|
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
return response ?? { options: [], selectedId: 'default' }
|
|
1335
|
-
}
|
|
1336
|
-
const saveLayouts = async (options: WidgetBoardLayoutOption[], selectedId?: string) => {
|
|
1337
|
-
await api.saveUserLayouts({ options, selectedId })
|
|
1338
|
-
}
|
|
1339
|
-
|
|
1340
|
-
const DashboardContent = () => {
|
|
1341
|
-
const boardStore = useWidgetBoardScopeStore()
|
|
1342
|
-
const panelProps = boardStore(state => ({
|
|
1343
|
-
items: state.items,
|
|
1344
|
-
selectedId: state.selectedId,
|
|
1345
|
-
onSelect: state.onSelect,
|
|
1346
|
-
onDelete: state.onDelete,
|
|
1347
|
-
onAdd: state.onAdd,
|
|
1348
|
-
addInfo: state.addInfo,
|
|
1349
|
-
lockedIds: state.lockedIds,
|
|
1350
|
-
}))
|
|
1351
|
-
|
|
1352
|
-
return (
|
|
1353
|
-
<Box sx={{ p: 2 }}>
|
|
1354
|
-
<Stack direction={{ xs: 'column', md: 'row' }} spacing={2} alignItems={{ xs: 'stretch', md: 'flex-start' }}>
|
|
1355
|
-
<Box sx={{ minWidth: 260 }}>
|
|
1356
|
-
<WidgetLayoutsPanel {...panelProps} />
|
|
1357
|
-
</Box>
|
|
1358
|
-
<Box sx={{ flex: 1 }}>
|
|
1359
|
-
<WidgetBoard
|
|
1360
|
-
widgets={widgets}
|
|
1361
|
-
layoutByBreakpoint={baseLayoutByBreakpoint}
|
|
1362
|
-
loadLayouts={loadLayouts}
|
|
1363
|
-
saveLayouts={saveLayouts}
|
|
1364
|
-
/>
|
|
1365
|
-
</Box>
|
|
1366
|
-
</Box>
|
|
1367
|
-
</Box>
|
|
1368
|
-
)
|
|
1369
|
-
}
|
|
1370
|
-
|
|
1371
|
-
export const Dashboard = () => (
|
|
1372
|
-
<WidgetBoardScopeProvider>
|
|
1373
|
-
<DashboardContent />
|
|
1374
|
-
</WidgetBoardScopeProvider>
|
|
1958
|
+
return (
|
|
1959
|
+
<PneThemeProvider skin={skin} mode={mode} onModeChange={setMode}>
|
|
1960
|
+
<OrderDetails />
|
|
1961
|
+
</PneThemeProvider>
|
|
1375
1962
|
)
|
|
1376
1963
|
```
|
|
1377
1964
|
|
|
1378
|
-
|
|
1379
|
-
|
|
1965
|
+
Новые роли доступны в `theme.palette.pne`: `surface.sunken/subtle/raised`,
|
|
1966
|
+
`border.default/control`, `text.muted` и `brand`. В `brand` исходный `seed/fill` отделён от автоматически
|
|
1967
|
+
адаптированного `foreground`; используйте `foreground` для ссылок, иконок и заголовков на тёмных surfaces,
|
|
1968
|
+
а `fill/onFill/fillBorder` — для залитых controls. `createPneThemeOptions` возвращает те же чистые MUI
|
|
1969
|
+
`ThemeOptions`, если consumer должен сам вызвать свою `createTheme`.
|
|
1380
1970
|
|
|
1381
1971
|
## OverlayHost и уведомления
|
|
1382
1972
|
|
|
@@ -1415,6 +2005,7 @@ const AppShell = () => (
|
|
|
1415
2005
|
```
|
|
1416
2006
|
|
|
1417
2007
|
- Для уведомлений используйте `overlayActions.showSuccess/showError/showWarning/showInfo`, `showSnackbar` или `showUndoSnackbar`.
|
|
2008
|
+
- `showError` принимает как готовый UI-текст (`{ message }`), так и исходную Paynet/transport ошибку (`{ error }`). Во втором случае библиотека сама разворачивает Paynet v1, Axios/Fetch/Blob payload, переводит `messageId`, показывает `errorId`, `errorI18N` и доступный пользователю `details`.
|
|
1418
2009
|
- `showUndoSnackbar` возвращает `id` snackbar и добавляет встроенную action-кнопку `Undo` (или ваш `undoLabel`).
|
|
1419
2010
|
- Любой snackbar с конечным `autoHideMs` показывает progress bar вверху карточки; если `autoHideMs` не задан, progress bar не рендерится.
|
|
1420
2011
|
- По умолчанию UI рендерится portal-ом в `document.body`; `container` позволяет задать другой `Element` или callback (в том числе через `ref.current`). Layer берётся из `theme.zIndex.snackbar`/`theme.zIndex.modal`.
|
|
@@ -1442,7 +2033,7 @@ const AppShell = () => (
|
|
|
1442
2033
|
import { PneFloatingActionButtons, overlayActions } from 'pne-ui'
|
|
1443
2034
|
|
|
1444
2035
|
const actions = [
|
|
1445
|
-
{ id: '
|
|
2036
|
+
{ id: 'refresh', label: 'Refresh data', onClick: () => overlayActions.showInfo({ message: 'Refreshed' }) },
|
|
1446
2037
|
{ id: 'save', label: 'Save', onClick: () => overlayActions.showSuccess({ message: 'Saved' }) },
|
|
1447
2038
|
{ id: 'divider', kind: 'divider' as const },
|
|
1448
2039
|
{ id: 'custom', kind: 'content' as const, node: <div style={{ padding: 8 }}>Any JSX here</div> },
|
|
@@ -1452,7 +2043,7 @@ export const FabDemo = () => (
|
|
|
1452
2043
|
<PneFloatingActionButtons
|
|
1453
2044
|
actions={actions}
|
|
1454
2045
|
fabLabel='Actions'
|
|
1455
|
-
bannerText='
|
|
2046
|
+
bannerText='Page actions'
|
|
1456
2047
|
position={{ bottom: 24, right: 24 }}
|
|
1457
2048
|
mobileBreakpoint={900} // считать мобильным до 900px, иначе поведение как на десктопе
|
|
1458
2049
|
/>
|
|
@@ -1465,41 +2056,28 @@ export const FabDemo = () => (
|
|
|
1465
2056
|
|
|
1466
2057
|
## Публикация пакета
|
|
1467
2058
|
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
Стабильные версии публикуются под npm dist-tag `latest`:
|
|
2059
|
+
Релиз запускается явной отправкой тега `npm/v<version>` через `yarn release:send`. Обычный push ветки не
|
|
2060
|
+
запускает проверки или публикацию. Единственный workflow `publish.yml` собирает, проверяет и упаковывает
|
|
2061
|
+
библиотеку, затем публикует проверенный архив через npm Trusted Publishing / OIDC.
|
|
1472
2062
|
|
|
1473
2063
|
| Команда | Результат |
|
|
1474
2064
|
| --- | --- |
|
|
1475
|
-
| `yarn release
|
|
1476
|
-
| `yarn release:
|
|
1477
|
-
| `yarn release:
|
|
1478
|
-
| `yarn release:
|
|
1479
|
-
| `yarn release:
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
| `yarn release:rc:next` | Например, `4.3.0-rc.0` → `4.3.0-rc.1`, затем опубликовать. |
|
|
1487
|
-
| `yarn release:rc:patch` | Начать следующую patch RC-линейку и опубликовать. |
|
|
1488
|
-
| `yarn release:rc:minor` | Начать следующую minor RC-линейку и опубликовать. |
|
|
1489
|
-
| `yarn release:rc:major` | Начать следующую major RC-линейку и опубликовать. |
|
|
1490
|
-
|
|
1491
|
-
Версию можно изменить отдельно, без публикации: `yarn version:patch`, `yarn version:minor`, `yarn version:major`,
|
|
1492
|
-
`yarn version:rc:patch`, `yarn version:rc:minor`, `yarn version:rc:major` или `yarn version:rc:next`. После ручного bump
|
|
1493
|
-
используйте `yarn publish:stable` либо `yarn publish:rc`; команда должна соответствовать типу версии в `package.json`.
|
|
1494
|
-
Повторный запуск составной `release:*`-команды поднимет версию ещё раз.
|
|
1495
|
-
|
|
1496
|
-
Если публикация завершилась ошибкой уже после bump, исправьте причину и повторите только `yarn publish:stable` или
|
|
1497
|
-
`yarn publish:rc`. Скрипты меняют `package.json`, но не создают git commit и tag — их следует оформить отдельно.
|
|
2065
|
+
| `yarn release:prepare --channel next --bump prerelease` | Подготовить следующую RC-версию, локальный version commit и annotated tag; ничего не отправлять. |
|
|
2066
|
+
| `yarn release:prepare --channel latest --bump patch` | Подготовить стабильную версию из `master`. Доступны также `minor` / `major`. |
|
|
2067
|
+
| `yarn release:prepare --channel next --version <точная-rc-версия>` | Выбрать номер явно; `--version current` использует текущий номер из `package.json`. |
|
|
2068
|
+
| `yarn release:send --dry-run` | Проверить подготовленный релиз и показать адресную отправку ветки и одного тега без push. |
|
|
2069
|
+
| `yarn release:send` | Атомарно отправить подготовленную ветку и один релизный тег в `origin`, запуская публикацию. |
|
|
2070
|
+
| `yarn release:status` | Прочитать состояние релиза без изменения git refs и npm-пакета. |
|
|
2071
|
+
|
|
2072
|
+
RC публикуются под `next`; стабильные версии — под `latest` и только из истории `master`.
|
|
2073
|
+
Сначала требуется однократная настройка доверия npm/GitHub и доставка нового workflow на релизные ветки.
|
|
2074
|
+
Подробные команды, ограничения и порядок внедрения описаны в [docs/releasing.md](docs/releasing.md).
|
|
2075
|
+
Локальный Storybook остаётся доступен через `yarn storybook` и `yarn build-storybook`; Chromatic не используется.
|
|
1498
2076
|
|
|
1499
2077
|
[npm-url]: https://www.npmjs.com/package/pne-ui
|
|
1500
2078
|
|
|
1501
2079
|
[npm-image]: https://img.shields.io/npm/v/pne-ui
|
|
1502
2080
|
|
|
1503
|
-
[github-
|
|
2081
|
+
[github-publish]: https://github.com/alcovp/pne-ui/actions/workflows/publish.yml/badge.svg
|
|
1504
2082
|
|
|
1505
|
-
[github-
|
|
2083
|
+
[github-publish-url]: https://github.com/alcovp/pne-ui/actions/workflows/publish.yml
|