@gravity-ui/querieskit 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/components/AttachmentListPlaceholder/AttachmentListPlaceholder.js +4 -4
- package/build/cjs/components/AttachmentListPlaceholder/AttachmentListPlaceholder.js.map +1 -1
- package/build/cjs/modules/HistoryLayout/HistoryLayout.d.ts +1 -1
- package/build/cjs/modules/HistoryLayout/HistoryLayout.js +1 -1
- package/build/cjs/modules/HistoryLayout/HistoryLayout.js.map +1 -1
- package/build/cjs/modules/RowsList/RowsList.css +4 -0
- package/build/cjs/modules/RowsList/RowsList.css.map +1 -1
- package/build/cjs/types/queryList.d.ts +1 -1
- package/build/cjs/types/queryList.js.map +1 -1
- package/build/cjs/widgets/QueriesHistory/QueriesHistory.js +1 -2
- package/build/cjs/widgets/QueriesHistory/QueriesHistory.js.map +1 -1
- package/build/cjs/widgets/QueriesHistory/QueriesHistory.stories.d.ts +1 -0
- package/build/cjs/widgets/QueriesHistory/QueriesHistory.stories.js +82 -1
- package/build/cjs/widgets/QueriesHistory/QueriesHistory.stories.js.map +1 -1
- package/build/cjs/widgets/SavedQueries/SavedQueries.stories.js.map +1 -1
- package/build/esm/components/AttachmentListPlaceholder/AttachmentListPlaceholder.js +4 -4
- package/build/esm/components/AttachmentListPlaceholder/AttachmentListPlaceholder.js.map +1 -1
- package/build/esm/modules/HistoryLayout/HistoryLayout.d.ts +1 -1
- package/build/esm/modules/HistoryLayout/HistoryLayout.js +1 -1
- package/build/esm/modules/HistoryLayout/HistoryLayout.js.map +1 -1
- package/build/esm/modules/RowsList/RowsList.css +4 -0
- package/build/esm/modules/RowsList/RowsList.css.map +1 -1
- package/build/esm/modules/RowsList/RowsList.scss +3 -0
- package/build/esm/types/queryList.d.ts +1 -1
- package/build/esm/types/queryList.js.map +1 -1
- package/build/esm/widgets/QueriesHistory/QueriesHistory.js +1 -2
- package/build/esm/widgets/QueriesHistory/QueriesHistory.js.map +1 -1
- package/build/esm/widgets/QueriesHistory/QueriesHistory.stories.d.ts +1 -0
- package/build/esm/widgets/QueriesHistory/QueriesHistory.stories.js +81 -0
- package/build/esm/widgets/QueriesHistory/QueriesHistory.stories.js.map +1 -1
- package/build/esm/widgets/SavedQueries/SavedQueries.stories.js.map +1 -1
- package/package.json +29 -2
- package/.agents/skills/code-review-checklist/SKILL.md +0 -94
- package/.agents/skills/github-pr-review/SKILL.md +0 -24
- package/.agents/skills/gravity-ui/SKILL.md +0 -175
- package/.agents/skills/gravity-ui/references/icons.md +0 -60
- package/.agents/skills/gravity-ui/references/layout.md +0 -366
- package/.agents/skills/gravity-ui/references/package-routing.md +0 -424
- package/.agents/skills/gravity-ui/references/theming.md +0 -309
- package/.agents/skills/gravity-ui/rules/hallucination-traps.md +0 -361
- package/.agents/skills/gravity-ui/scripts/icon-image-search.sh +0 -63
- package/.eslintignore +0 -3
- package/.github/workflows/ci.yml +0 -25
- package/.github/workflows/main-preview.yml +0 -31
- package/.github/workflows/pr-preview-build.yml +0 -13
- package/.github/workflows/pr-preview-deploy.yml +0 -22
- package/.github/workflows/pr-title.yml +0 -27
- package/.github/workflows/release.yml +0 -20
- package/.nvmrc +0 -1
- package/.prettierrc.js +0 -1
- package/.storybook/main.ts +0 -31
- package/.storybook/preview.tsx +0 -43
- package/.storybook/redefinition.css +0 -3
- package/.storybook/tsconfig.json +0 -9
- package/.stylelintrc +0 -9
- package/AGENTS.md +0 -129
- package/CHANGELOG.md +0 -103
- package/CODEOWNERS +0 -2
- package/CONTRIBUTING.md +0 -31
- package/NOTICES.md +0 -8
- package/app-builder.config.ts +0 -9
- package/commitlint.config.cjs +0 -6
- package/eslint.config.mjs +0 -53
- package/plans/i18n-rules.md +0 -116
- package/plans/navigation-architecture.md +0 -262
- package/plans/queries-history-structure.md +0 -143
- package/plans/queries-navigation-architecture-review.md +0 -217
- package/plans/styles-rules.md +0 -137
- package/skills-lock.json +0 -11
- package/src/components/AddChartButton/AddChartButton.scss +0 -12
- package/src/components/AddChartButton/AddChartButton.stories.tsx +0 -34
- package/src/components/AddChartButton/AddChartButton.tsx +0 -139
- package/src/components/AddChartButton/index.ts +0 -6
- package/src/components/AttachmentList/AttachmentList.scss +0 -25
- package/src/components/AttachmentList/AttachmentList.stories.tsx +0 -243
- package/src/components/AttachmentList/AttachmentList.tsx +0 -67
- package/src/components/AttachmentList/helpers/getIconByAttachmentName.ts +0 -36
- package/src/components/AttachmentList/helpers/objectLinkValidator.ts +0 -40
- package/src/components/AttachmentList/helpers/stringRequiredValidator.ts +0 -24
- package/src/components/AttachmentList/hooks/useKeyDownFormControl.ts +0 -22
- package/src/components/AttachmentList/hooks/useLabelRef.ts +0 -25
- package/src/components/AttachmentList/i18n/dicts.ts +0 -4
- package/src/components/AttachmentList/i18n/en.json +0 -10
- package/src/components/AttachmentList/i18n/index.ts +0 -5
- package/src/components/AttachmentList/i18n/ru.json +0 -10
- package/src/components/AttachmentList/index.ts +0 -4
- package/src/components/AttachmentList/internal/AttachmentItem/AttachmentItem.scss +0 -23
- package/src/components/AttachmentList/internal/AttachmentItem/AttachmentItem.tsx +0 -75
- package/src/components/AttachmentList/internal/AttachmentItem/index.ts +0 -2
- package/src/components/AttachmentList/internal/EditAttachmentItem/EditAttachmentItem.tsx +0 -21
- package/src/components/AttachmentList/internal/EditAttachmentItem/EditLinkItem.scss +0 -21
- package/src/components/AttachmentList/internal/EditAttachmentItem/EditLinkItem.tsx +0 -194
- package/src/components/AttachmentList/internal/EditAttachmentItem/FileEdit.tsx +0 -92
- package/src/components/AttachmentList/internal/EditAttachmentItem/index.ts +0 -4
- package/src/components/AttachmentListPlaceholder/AttachmentListPlaceholder.scss +0 -5
- package/src/components/AttachmentListPlaceholder/AttachmentListPlaceholder.stories.tsx +0 -30
- package/src/components/AttachmentListPlaceholder/AttachmentListPlaceholder.tsx +0 -72
- package/src/components/AttachmentListPlaceholder/assets/empty-attachments.svg +0 -14
- package/src/components/AttachmentListPlaceholder/i18n/dicts.ts +0 -4
- package/src/components/AttachmentListPlaceholder/i18n/en.json +0 -7
- package/src/components/AttachmentListPlaceholder/i18n/index.ts +0 -5
- package/src/components/AttachmentListPlaceholder/i18n/ru.json +0 -7
- package/src/components/AttachmentListPlaceholder/index.ts +0 -2
- package/src/components/Breadcrumbs/Breadcrumbs.scss +0 -25
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +0 -114
- package/src/components/Breadcrumbs/helpers/parsePathSegments.ts +0 -16
- package/src/components/Breadcrumbs/i18n/dicts.ts +0 -4
- package/src/components/Breadcrumbs/i18n/en.json +0 -4
- package/src/components/Breadcrumbs/i18n/index.ts +0 -5
- package/src/components/Breadcrumbs/i18n/ru.json +0 -4
- package/src/components/Breadcrumbs/index.ts +0 -2
- package/src/components/Chart/Chart.scss +0 -40
- package/src/components/Chart/Chart.stories.tsx +0 -75
- package/src/components/Chart/Chart.tsx +0 -120
- package/src/components/Chart/i18n/dicts.ts +0 -4
- package/src/components/Chart/i18n/en.json +0 -6
- package/src/components/Chart/i18n/index.ts +0 -5
- package/src/components/Chart/i18n/ru.json +0 -6
- package/src/components/Chart/index.ts +0 -2
- package/src/components/ChartEditorForm/ChartEditorForm.scss +0 -20
- package/src/components/ChartEditorForm/ChartEditorForm.stories.tsx +0 -88
- package/src/components/ChartEditorForm/ChartEditorForm.tsx +0 -120
- package/src/components/ChartEditorForm/helpers/resolveLabels.ts +0 -17
- package/src/components/ChartEditorForm/i18n/dicts.ts +0 -4
- package/src/components/ChartEditorForm/i18n/en.json +0 -12
- package/src/components/ChartEditorForm/i18n/index.ts +0 -5
- package/src/components/ChartEditorForm/i18n/ru.json +0 -12
- package/src/components/ChartEditorForm/index.ts +0 -7
- package/src/components/ChartEditorForm/internal/Field.tsx +0 -11
- package/src/components/ChartEditorForm/types.ts +0 -44
- package/src/components/ClusterRow/ClusterRow.tsx +0 -34
- package/src/components/ClusterRow/index.ts +0 -2
- package/src/components/Dashboard/Dashboard.scss +0 -4
- package/src/components/Dashboard/Dashboard.stories.scss +0 -18
- package/src/components/Dashboard/Dashboard.stories.tsx +0 -248
- package/src/components/Dashboard/Dashboard.tsx +0 -51
- package/src/components/Dashboard/helpers/createDefaultLayout.ts +0 -43
- package/src/components/Dashboard/hooks/useDashboardConfig.ts +0 -63
- package/src/components/Dashboard/index.ts +0 -2
- package/src/components/Dashboard/internal/DashPlate.scss +0 -23
- package/src/components/Dashboard/internal/DashPlate.tsx +0 -35
- package/src/components/Dashboard/internal/DashboardProvider.tsx +0 -37
- package/src/components/Dashboard/types.ts +0 -21
- package/src/components/DataTable/DataTable.scss +0 -27
- package/src/components/DataTable/DataTable.stories.tsx +0 -65
- package/src/components/DataTable/DataTable.tsx +0 -100
- package/src/components/DataTable/index.ts +0 -1
- package/src/components/EditableRowTitle/EditableRowTitle.tsx +0 -67
- package/src/components/EditableRowTitle/index.ts +0 -2
- package/src/components/EmptyContent/EmptyContent.scss +0 -3
- package/src/components/EmptyContent/EmptyContent.tsx +0 -57
- package/src/components/EmptyContent/i18n/dicts.ts +0 -4
- package/src/components/EmptyContent/i18n/en.json +0 -7
- package/src/components/EmptyContent/i18n/index.ts +0 -5
- package/src/components/EmptyContent/i18n/ru.json +0 -7
- package/src/components/EmptyContent/index.ts +0 -1
- package/src/components/ErrorTree/ErrorTree.stories.tsx +0 -94
- package/src/components/ErrorTree/ErrorTree.tsx +0 -30
- package/src/components/ErrorTree/helpers/formatAttributes.ts +0 -9
- package/src/components/ErrorTree/helpers/getIntermediateChain.ts +0 -21
- package/src/components/ErrorTree/i18n/dicts.ts +0 -4
- package/src/components/ErrorTree/i18n/en.json +0 -11
- package/src/components/ErrorTree/i18n/index.ts +0 -5
- package/src/components/ErrorTree/i18n/ru.json +0 -13
- package/src/components/ErrorTree/index.ts +0 -1
- package/src/components/ErrorTree/internal/ErrorTreeChildren.scss +0 -5
- package/src/components/ErrorTree/internal/ErrorTreeChildren.tsx +0 -25
- package/src/components/ErrorTree/internal/ErrorTreeNode.scss +0 -95
- package/src/components/ErrorTree/internal/ErrorTreeNode.tsx +0 -178
- package/src/components/ErrorTree/internal/IntermediateMessages.scss +0 -13
- package/src/components/ErrorTree/internal/IntermediateMessages.tsx +0 -127
- package/src/components/FieldsSearchToolbar/FieldsSearchToolbar.tsx +0 -48
- package/src/components/FieldsSearchToolbar/index.ts +0 -2
- package/src/components/FieldsSelector/FieldsSelector.scss +0 -18
- package/src/components/FieldsSelector/FieldsSelector.stories.tsx +0 -48
- package/src/components/FieldsSelector/FieldsSelector.tsx +0 -92
- package/src/components/FieldsSelector/i18n/dicts.ts +0 -4
- package/src/components/FieldsSelector/i18n/en.json +0 -3
- package/src/components/FieldsSelector/i18n/index.ts +0 -5
- package/src/components/FieldsSelector/i18n/ru.json +0 -3
- package/src/components/FieldsSelector/index.ts +0 -2
- package/src/components/HistoryFilter/HistoryFilter.scss +0 -5
- package/src/components/HistoryFilter/HistoryFilter.stories.tsx +0 -69
- package/src/components/HistoryFilter/HistoryFilter.tsx +0 -64
- package/src/components/HistoryFilter/i18n/dicts.ts +0 -4
- package/src/components/HistoryFilter/i18n/en.json +0 -4
- package/src/components/HistoryFilter/i18n/index.ts +0 -5
- package/src/components/HistoryFilter/i18n/ru.json +0 -4
- package/src/components/HistoryFilter/index.ts +0 -1
- package/src/components/HistoryGroupHeader/HistoryGroupHeader.scss +0 -7
- package/src/components/HistoryGroupHeader/HistoryGroupHeader.tsx +0 -18
- package/src/components/HistoryGroupHeader/index.ts +0 -1
- package/src/components/HistoryPrivateIcon/HistoryPrivateIcon.scss +0 -7
- package/src/components/HistoryPrivateIcon/HistoryPrivateIcon.tsx +0 -22
- package/src/components/HistoryPrivateIcon/index.ts +0 -1
- package/src/components/Icons/LogoCPlusPlus.tsx +0 -34
- package/src/components/Icons/index.ts +0 -1
- package/src/components/LazyList/LazyList.scss +0 -13
- package/src/components/LazyList/LazyList.tsx +0 -97
- package/src/components/LazyList/index.ts +0 -2
- package/src/components/ListSpinner/ListSpinner.scss +0 -3
- package/src/components/ListSpinner/ListSpinner.tsx +0 -18
- package/src/components/ListSpinner/index.ts +0 -2
- package/src/components/MonacoEditor/MonacoEditor.tsx +0 -112
- package/src/components/MonacoEditor/MonacoEditorThemes.tsx +0 -73
- package/src/components/MonacoEditor/index.ts +0 -11
- package/src/components/MonacoEditor/monaco-yql-languages/_.contribution.ts +0 -193
- package/src/components/MonacoEditor/monaco-yql-languages/clickhouse/clickhouse.contribution.ts +0 -14
- package/src/components/MonacoEditor/monaco-yql-languages/clickhouse/clickhouse.keywords.ts +0 -146
- package/src/components/MonacoEditor/monaco-yql-languages/clickhouse/clickhouse.ts +0 -217
- package/src/components/MonacoEditor/monaco-yql-languages/constants.ts +0 -6
- package/src/components/MonacoEditor/monaco-yql-languages/fillers/monaco-editor-core.ts +0 -3
- package/src/components/MonacoEditor/monaco-yql-languages/index.ts +0 -1
- package/src/components/MonacoEditor/monaco-yql-languages/monaco.contribution.ts +0 -5
- package/src/components/MonacoEditor/monaco-yql-languages/s-expressions/s-expressions.contribution.ts +0 -14
- package/src/components/MonacoEditor/monaco-yql-languages/s-expressions/s-expressions.keywords.ts +0 -97
- package/src/components/MonacoEditor/monaco-yql-languages/s-expressions/s-expressions.ts +0 -170
- package/src/components/MonacoEditor/monaco-yql-languages/themes/themes.contribution.ts +0 -35
- package/src/components/MonacoEditor/monaco-yql-languages/yql/yql.contribution.ts +0 -14
- package/src/components/MonacoEditor/monaco-yql-languages/yql/yql.keywords.ts +0 -13
- package/src/components/MonacoEditor/monaco-yql-languages/yql/yql.ts +0 -178
- package/src/components/MonacoEditor/monaco-yql-languages/yql_ansi/yql_ansi.contribution.ts +0 -14
- package/src/components/MonacoEditor/monaco-yql-languages/yql_ansi/yql_ansi.keywords.ts +0 -45
- package/src/components/MonacoEditor/monaco-yql-languages/yql_ansi/yql_ansi.ts +0 -142
- package/src/components/NavigationActionButtons/NavigationActionButtons.tsx +0 -46
- package/src/components/NavigationActionButtons/index.ts +0 -2
- package/src/components/NavigationItemRow/NavigationItemRow.tsx +0 -28
- package/src/components/NavigationItemRow/index.ts +0 -2
- package/src/components/PathEditor/PathEditor.scss +0 -41
- package/src/components/PathEditor/PathEditor.stories.helpers.ts +0 -118
- package/src/components/PathEditor/PathEditor.stories.tsx +0 -57
- package/src/components/PathEditor/PathEditor.tsx +0 -380
- package/src/components/PathEditor/helpers/suggestions.ts +0 -40
- package/src/components/PathEditor/i18n/dicts.ts +0 -4
- package/src/components/PathEditor/i18n/en.json +0 -4
- package/src/components/PathEditor/i18n/index.ts +0 -5
- package/src/components/PathEditor/i18n/ru.json +0 -4
- package/src/components/PathEditor/index.ts +0 -2
- package/src/components/QueryDuration/QueryDuration.scss +0 -6
- package/src/components/QueryDuration/QueryDuration.stories.tsx +0 -40
- package/src/components/QueryDuration/QueryDuration.tsx +0 -21
- package/src/components/QueryDuration/index.ts +0 -1
- package/src/components/QueryDuration/useQueryDuration.ts +0 -34
- package/src/components/QueryResultsTable/QueryResultsTable.scss +0 -65
- package/src/components/QueryResultsTable/QueryResultsTable.tsx +0 -112
- package/src/components/QueryResultsTable/helpers/formatQueryResultType.ts +0 -76
- package/src/components/QueryResultsTable/helpers/formatQueryResultValue.ts +0 -38
- package/src/components/QueryResultsTable/i18n/dicts.ts +0 -4
- package/src/components/QueryResultsTable/i18n/en.json +0 -5
- package/src/components/QueryResultsTable/i18n/index.ts +0 -4
- package/src/components/QueryResultsTable/i18n/ru.json +0 -5
- package/src/components/QueryResultsTable/index.ts +0 -3
- package/src/components/QueryResultsTable/internal/QueryResultCell.tsx +0 -63
- package/src/components/QueryStatusIcon/QueryStatusIcon.scss +0 -17
- package/src/components/QueryStatusIcon/QueryStatusIcon.stories.tsx +0 -50
- package/src/components/QueryStatusIcon/QueryStatusIcon.tsx +0 -37
- package/src/components/QueryStatusIcon/index.ts +0 -1
- package/src/components/RowActionsMenu/RowActionsMenu.tsx +0 -47
- package/src/components/RowActionsMenu/index.ts +0 -2
- package/src/components/RowLink/RowLink.scss +0 -8
- package/src/components/RowLink/RowLink.tsx +0 -23
- package/src/components/RowLink/index.ts +0 -2
- package/src/components/SearchRowLayout/SearchRowLayout.scss +0 -18
- package/src/components/SearchRowLayout/SearchRowLayout.tsx +0 -45
- package/src/components/SearchRowLayout/helpers/fitQueryToVisibleLines.ts +0 -10
- package/src/components/SearchRowLayout/helpers/monacoConfig.ts +0 -25
- package/src/components/SearchRowLayout/index.ts +0 -2
- package/src/components/SearchWithButtons/SearchWithButtons.scss +0 -10
- package/src/components/SearchWithButtons/SearchWithButtons.stories.tsx +0 -107
- package/src/components/SearchWithButtons/SearchWithButtons.tsx +0 -56
- package/src/components/SearchWithButtons/index.ts +0 -2
- package/src/components/SimpleForm/CheckboxGroupField.tsx +0 -53
- package/src/components/SimpleForm/RangeDatePickerField.tsx +0 -50
- package/src/components/SimpleForm/SelectField.tsx +0 -24
- package/src/components/SimpleForm/SimpleForm.stories.tsx +0 -115
- package/src/components/SimpleForm/SimpleForm.tsx +0 -65
- package/src/components/SimpleForm/SwitchField.tsx +0 -23
- package/src/components/SimpleForm/helpers/controlsRegistry.ts +0 -24
- package/src/components/SimpleForm/helpers/getInitialValues.ts +0 -10
- package/src/components/SimpleForm/helpers/index.ts +0 -2
- package/src/components/SimpleForm/index.ts +0 -7
- package/src/components/SkeletonRows/SkeletonRows.tsx +0 -24
- package/src/components/SkeletonRows/index.ts +0 -2
- package/src/components/index.ts +0 -71
- package/src/constants/query.ts +0 -10
- package/src/constants/row.ts +0 -2
- package/src/helpers/buildColumnsFromKeys.ts +0 -17
- package/src/helpers/createUuid.ts +0 -3
- package/src/helpers/getDefaultNavigationIcon.ts +0 -33
- package/src/helpers/getListKey.ts +0 -12
- package/src/helpers/getParentPath.ts +0 -10
- package/src/helpers/isEmptyValue.ts +0 -2
- package/src/helpers/isFieldVisible.ts +0 -20
- package/src/helpers/isObjectEqual.ts +0 -15
- package/src/helpers/time.ts +0 -29
- package/src/helpers/useDebouncedValue.ts +0 -14
- package/src/helpers/useLoadMoreSentinel.ts +0 -31
- package/src/helpers/useToggle.ts +0 -11
- package/src/helpers/useVisibleColumns.ts +0 -26
- package/src/i18n/index.ts +0 -26
- package/src/index.ts +0 -12
- package/src/modules/Attachments/Attachments.scss +0 -10
- package/src/modules/Attachments/Attachments.stories.tsx +0 -112
- package/src/modules/Attachments/Attachments.tsx +0 -336
- package/src/modules/Attachments/i18n/dicts.ts +0 -4
- package/src/modules/Attachments/i18n/en.json +0 -5
- package/src/modules/Attachments/i18n/index.ts +0 -5
- package/src/modules/Attachments/i18n/ru.json +0 -5
- package/src/modules/Attachments/index.ts +0 -2
- package/src/modules/ChartEditor/ChartEditor.scss +0 -12
- package/src/modules/ChartEditor/ChartEditor.tsx +0 -116
- package/src/modules/ChartEditor/i18n/dicts.ts +0 -4
- package/src/modules/ChartEditor/i18n/en.json +0 -3
- package/src/modules/ChartEditor/i18n/index.ts +0 -5
- package/src/modules/ChartEditor/i18n/ru.json +0 -3
- package/src/modules/ChartEditor/index.ts +0 -2
- package/src/modules/ChartEditor/story/ChartEditor.stories.tsx +0 -186
- package/src/modules/ChartEditor/story/mockData.ts +0 -222
- package/src/modules/ChartEditor/types.ts +0 -18
- package/src/modules/ClustersList/ClustersList.scss +0 -11
- package/src/modules/ClustersList/ClustersList.tsx +0 -49
- package/src/modules/ClustersList/index.ts +0 -2
- package/src/modules/HistoryComparisonActions/HistoryComparisonActions.scss +0 -4
- package/src/modules/HistoryComparisonActions/HistoryComparisonActions.tsx +0 -42
- package/src/modules/HistoryComparisonActions/index.ts +0 -2
- package/src/modules/HistoryHeader/HistoryHeader.stories.tsx +0 -47
- package/src/modules/HistoryHeader/HistoryHeader.tsx +0 -58
- package/src/modules/HistoryHeader/index.ts +0 -1
- package/src/modules/HistoryHeader/internal/FullSearchToggleButton.tsx +0 -16
- package/src/modules/HistoryLayout/HistoryLayout.scss +0 -7
- package/src/modules/HistoryLayout/HistoryLayout.tsx +0 -43
- package/src/modules/HistoryLayout/index.ts +0 -2
- package/src/modules/HistoryRow/HistoryRow.scss +0 -32
- package/src/modules/HistoryRow/HistoryRow.stories.tsx +0 -91
- package/src/modules/HistoryRow/HistoryRow.tsx +0 -77
- package/src/modules/HistoryRow/index.ts +0 -1
- package/src/modules/HistorySearchRow/HistorySearchRow.scss +0 -13
- package/src/modules/HistorySearchRow/HistorySearchRow.stories.tsx +0 -52
- package/src/modules/HistorySearchRow/HistorySearchRow.tsx +0 -62
- package/src/modules/HistorySearchRow/helpers/resolveMonacoLanguage.ts +0 -19
- package/src/modules/HistorySearchRow/index.ts +0 -1
- package/src/modules/NavigationDetail/NavigationDetail.scss +0 -13
- package/src/modules/NavigationDetail/NavigationDetail.tsx +0 -121
- package/src/modules/NavigationDetail/helpers/getInitialTab.ts +0 -9
- package/src/modules/NavigationDetail/helpers/getVisibleTabs.ts +0 -5
- package/src/modules/NavigationDetail/index.ts +0 -2
- package/src/modules/NavigationDetail/internal/NavigationDetailTabs.tsx +0 -32
- package/src/modules/NavigationHeader/NavigationHeader.stories.tsx +0 -118
- package/src/modules/NavigationHeader/NavigationHeader.tsx +0 -33
- package/src/modules/NavigationHeader/index.ts +0 -2
- package/src/modules/NavigationItemsList/NavigationItemsList.scss +0 -65
- package/src/modules/NavigationItemsList/NavigationItemsList.tsx +0 -92
- package/src/modules/NavigationItemsList/index.ts +0 -2
- package/src/modules/NavigationItemsList/internal/NavigationItemsListEmptyState.tsx +0 -45
- package/src/modules/NavigationItemsList/internal/NavigationItemsListHeader.scss +0 -6
- package/src/modules/NavigationItemsList/internal/NavigationItemsListHeader.tsx +0 -54
- package/src/modules/NavigationItemsList/internal/useParentRow.ts +0 -23
- package/src/modules/NavigationMeta/NavigationMeta.scss +0 -25
- package/src/modules/NavigationMeta/NavigationMeta.tsx +0 -81
- package/src/modules/NavigationMeta/helpers/buildMetaGroups.tsx +0 -27
- package/src/modules/NavigationMeta/i18n/dicts.ts +0 -4
- package/src/modules/NavigationMeta/i18n/en.json +0 -4
- package/src/modules/NavigationMeta/i18n/index.ts +0 -5
- package/src/modules/NavigationMeta/i18n/ru.json +0 -4
- package/src/modules/NavigationMeta/index.ts +0 -3
- package/src/modules/NavigationMeta/story/NavigationMeta.stories.tsx +0 -80
- package/src/modules/NavigationMeta/story/mockData.ts +0 -22
- package/src/modules/NavigationPreview/NavigationPreview.scss +0 -32
- package/src/modules/NavigationPreview/NavigationPreview.tsx +0 -155
- package/src/modules/NavigationPreview/helpers/buildPreviewColumns.tsx +0 -11
- package/src/modules/NavigationPreview/helpers/filterPreviewRows.ts +0 -29
- package/src/modules/NavigationPreview/i18n/dicts.ts +0 -4
- package/src/modules/NavigationPreview/i18n/en.json +0 -3
- package/src/modules/NavigationPreview/i18n/index.ts +0 -5
- package/src/modules/NavigationPreview/i18n/ru.json +0 -3
- package/src/modules/NavigationPreview/index.ts +0 -4
- package/src/modules/NavigationPreview/story/NavigationPreview.stories.tsx +0 -123
- package/src/modules/NavigationPreview/story/mockData.ts +0 -14
- package/src/modules/NavigationSchema/NavigationSchema.scss +0 -24
- package/src/modules/NavigationSchema/NavigationSchema.tsx +0 -118
- package/src/modules/NavigationSchema/helpers/buildSchemaColumns.tsx +0 -54
- package/src/modules/NavigationSchema/helpers/filterSchema.ts +0 -18
- package/src/modules/NavigationSchema/i18n/dicts.ts +0 -4
- package/src/modules/NavigationSchema/i18n/en.json +0 -9
- package/src/modules/NavigationSchema/i18n/index.ts +0 -5
- package/src/modules/NavigationSchema/i18n/ru.json +0 -9
- package/src/modules/NavigationSchema/index.ts +0 -4
- package/src/modules/NavigationSchema/story/NavigationSchema.stories.tsx +0 -112
- package/src/modules/NavigationSchema/story/mockData.ts +0 -9
- package/src/modules/NavigationView/NavigationView.scss +0 -44
- package/src/modules/NavigationView/NavigationView.tsx +0 -60
- package/src/modules/NavigationView/helpers/buildViewColumns.tsx +0 -11
- package/src/modules/NavigationView/i18n/dicts.ts +0 -4
- package/src/modules/NavigationView/i18n/en.json +0 -3
- package/src/modules/NavigationView/i18n/index.ts +0 -5
- package/src/modules/NavigationView/i18n/ru.json +0 -3
- package/src/modules/NavigationView/index.ts +0 -3
- package/src/modules/NavigationView/internal/NavigationViewSectionItem.tsx +0 -70
- package/src/modules/NavigationView/story/NavigationView.stories.tsx +0 -110
- package/src/modules/NavigationView/story/mockData.ts +0 -35
- package/src/modules/QueriesList/QueriesList.scss +0 -10
- package/src/modules/QueriesList/QueriesList.tsx +0 -98
- package/src/modules/QueriesList/index.ts +0 -2
- package/src/modules/QueryStatistics/QueryStatistics.scss +0 -3
- package/src/modules/QueryStatistics/QueryStatistics.tsx +0 -125
- package/src/modules/QueryStatistics/helpers.ts +0 -96
- package/src/modules/QueryStatistics/i18n/dicts.ts +0 -4
- package/src/modules/QueryStatistics/i18n/en.json +0 -16
- package/src/modules/QueryStatistics/i18n/index.ts +0 -4
- package/src/modules/QueryStatistics/i18n/ru.json +0 -16
- package/src/modules/QueryStatistics/index.ts +0 -13
- package/src/modules/QueryStatistics/internal/MetricCell.scss +0 -12
- package/src/modules/QueryStatistics/internal/MetricCell.tsx +0 -99
- package/src/modules/QueryStatistics/internal/QueryStatisticsTable.scss +0 -8
- package/src/modules/QueryStatistics/internal/QueryStatisticsTable.tsx +0 -135
- package/src/modules/QueryStatistics/internal/QueryStatisticsToolbar.scss +0 -1
- package/src/modules/QueryStatistics/internal/QueryStatisticsToolbar.tsx +0 -61
- package/src/modules/QueryStatistics/story/QueryStatistics.stories.tsx +0 -71
- package/src/modules/RowsList/RowsList.scss +0 -5
- package/src/modules/RowsList/RowsList.tsx +0 -96
- package/src/modules/RowsList/helpers/prepareRowData.ts +0 -61
- package/src/modules/RowsList/index.ts +0 -2
- package/src/modules/SavedQueryRow/SavedQueryRow.scss +0 -20
- package/src/modules/SavedQueryRow/SavedQueryRow.tsx +0 -60
- package/src/modules/SavedQueryRow/index.ts +0 -2
- package/src/modules/SavedQuerySearchRow/SavedQuerySearchRow.scss +0 -15
- package/src/modules/SavedQuerySearchRow/SavedQuerySearchRow.tsx +0 -58
- package/src/modules/SavedQuerySearchRow/index.ts +0 -2
- package/src/modules/TutorialRow/TutorialRow.scss +0 -9
- package/src/modules/TutorialRow/TutorialRow.stories.tsx +0 -43
- package/src/modules/TutorialRow/TutorialRow.tsx +0 -25
- package/src/modules/TutorialRow/index.ts +0 -2
- package/src/modules/TutorialSearchRow/TutorialSearchRow.scss +0 -5
- package/src/modules/TutorialSearchRow/TutorialSearchRow.stories.tsx +0 -44
- package/src/modules/TutorialSearchRow/TutorialSearchRow.tsx +0 -33
- package/src/modules/TutorialSearchRow/index.ts +0 -2
- package/src/modules/index.ts +0 -50
- package/src/types/declarations.d.ts +0 -25
- package/src/types/errorTree.ts +0 -30
- package/src/types/forms.ts +0 -33
- package/src/types/history.ts +0 -12
- package/src/types/navigation.ts +0 -209
- package/src/types/pathEditor.ts +0 -29
- package/src/types/queryList.ts +0 -92
- package/src/types/queryResults.ts +0 -48
- package/src/types/queryStatistics.ts +0 -67
- package/src/types/savedQueries.ts +0 -7
- package/src/types/tutorial.ts +0 -3
- package/src/widgets/DashboardCharts/DashboardCharts.scss +0 -25
- package/src/widgets/DashboardCharts/DashboardCharts.tsx +0 -214
- package/src/widgets/DashboardCharts/helpers/chartTypeIcons.ts +0 -33
- package/src/widgets/DashboardCharts/i18n/dicts.ts +0 -4
- package/src/widgets/DashboardCharts/i18n/en.json +0 -7
- package/src/widgets/DashboardCharts/i18n/index.ts +0 -5
- package/src/widgets/DashboardCharts/i18n/ru.json +0 -7
- package/src/widgets/DashboardCharts/index.ts +0 -2
- package/src/widgets/DashboardCharts/internal/EmptyDashboardPlaceholder.tsx +0 -26
- package/src/widgets/DashboardCharts/story/DashboardCharts.stories.scss +0 -6
- package/src/widgets/DashboardCharts/story/DashboardCharts.stories.tsx +0 -77
- package/src/widgets/DashboardCharts/story/mockData.ts +0 -419
- package/src/widgets/DashboardCharts/types.ts +0 -30
- package/src/widgets/QueriesHistory/QueriesHistory.scss +0 -3
- package/src/widgets/QueriesHistory/QueriesHistory.stories.tsx +0 -276
- package/src/widgets/QueriesHistory/QueriesHistory.tsx +0 -71
- package/src/widgets/QueriesHistory/i18n/dicts.ts +0 -4
- package/src/widgets/QueriesHistory/i18n/en.json +0 -3
- package/src/widgets/QueriesHistory/i18n/index.ts +0 -5
- package/src/widgets/QueriesHistory/i18n/ru.json +0 -3
- package/src/widgets/QueriesHistory/index.ts +0 -2
- package/src/widgets/QueriesHistory/internal/HistoryRowContent.tsx +0 -22
- package/src/widgets/QueriesNavigation/QueriesNavigation.scss +0 -9
- package/src/widgets/QueriesNavigation/QueriesNavigation.stories.tsx +0 -409
- package/src/widgets/QueriesNavigation/QueriesNavigation.tsx +0 -195
- package/src/widgets/QueriesNavigation/helpers/createEmptyDetailConfig.tsx +0 -8
- package/src/widgets/QueriesNavigation/helpers/createNavigationDetailResolver.ts +0 -28
- package/src/widgets/QueriesNavigation/helpers/createTableDetailConfig.tsx +0 -127
- package/src/widgets/QueriesNavigation/i18n/dicts.ts +0 -4
- package/src/widgets/QueriesNavigation/i18n/en.json +0 -10
- package/src/widgets/QueriesNavigation/i18n/index.ts +0 -5
- package/src/widgets/QueriesNavigation/i18n/ru.json +0 -10
- package/src/widgets/QueriesNavigation/index.ts +0 -13
- package/src/widgets/QueryResults/QueryResults.scss +0 -25
- package/src/widgets/QueryResults/QueryResults.stories.tsx +0 -155
- package/src/widgets/QueryResults/QueryResults.tsx +0 -121
- package/src/widgets/QueryResults/i18n/dicts.ts +0 -4
- package/src/widgets/QueryResults/i18n/en.json +0 -10
- package/src/widgets/QueryResults/i18n/index.ts +0 -4
- package/src/widgets/QueryResults/i18n/ru.json +0 -12
- package/src/widgets/QueryResults/index.ts +0 -2
- package/src/widgets/QueryResults/internal/QueryResultsSchema.tsx +0 -41
- package/src/widgets/SavedQueries/SavedQueries.scss +0 -3
- package/src/widgets/SavedQueries/SavedQueries.stories.tsx +0 -192
- package/src/widgets/SavedQueries/SavedQueries.tsx +0 -77
- package/src/widgets/SavedQueries/SavedQueryRowContent.tsx +0 -26
- package/src/widgets/SavedQueries/i18n/dicts.ts +0 -4
- package/src/widgets/SavedQueries/i18n/en.json +0 -3
- package/src/widgets/SavedQueries/i18n/index.ts +0 -4
- package/src/widgets/SavedQueries/i18n/ru.json +0 -3
- package/src/widgets/SavedQueries/index.ts +0 -2
- package/src/widgets/TutorialsHistory/TutorialRowContent.tsx +0 -16
- package/src/widgets/TutorialsHistory/TutorialsHistory.scss +0 -3
- package/src/widgets/TutorialsHistory/TutorialsHistory.stories.tsx +0 -135
- package/src/widgets/TutorialsHistory/TutorialsHistory.tsx +0 -63
- package/src/widgets/TutorialsHistory/i18n/dicts.ts +0 -4
- package/src/widgets/TutorialsHistory/i18n/en.json +0 -3
- package/src/widgets/TutorialsHistory/i18n/index.ts +0 -5
- package/src/widgets/TutorialsHistory/i18n/ru.json +0 -3
- package/src/widgets/TutorialsHistory/index.ts +0 -2
- package/src/widgets/index.ts +0 -20
- package/tsconfig.json +0 -20
- package/tsconfig.publish.json +0 -11
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
# Архитектурный анализ `QueriesNavigation` и дочерних компонент
|
|
2
|
-
|
|
3
|
-
Область анализа: состояние кода после коммита `bcaa6e4c` (анализировалось текущее
|
|
4
|
-
состояние рабочей директории — прямого доступа к git-diff в среде нет).
|
|
5
|
-
|
|
6
|
-
Затронутые единицы:
|
|
7
|
-
|
|
8
|
-
- Виджет [`QueriesNavigation`](src/widgets/QueriesNavigation/QueriesNavigation.tsx:51) + хелперы
|
|
9
|
-
[`createNavigationDetailResolver`](src/widgets/QueriesNavigation/helpers/createNavigationDetailResolver.ts:13),
|
|
10
|
-
[`createTableDetailConfig`](src/widgets/QueriesNavigation/helpers/createTableDetailConfig.tsx:45),
|
|
11
|
-
[`createEmptyDetailConfig`](src/widgets/QueriesNavigation/helpers/createEmptyDetailConfig.ts:5).
|
|
12
|
-
- Модули: [`NavigationDetail`](src/modules/NavigationDetail/NavigationDetail.tsx:39),
|
|
13
|
-
[`NavigationHeader`](src/modules/NavigationHeader/NavigationHeader.tsx:15),
|
|
14
|
-
[`ClustersList`](src/modules/ClustersList/ClustersList.tsx:23),
|
|
15
|
-
[`NavigationItemsList`](src/modules/NavigationItemsList/NavigationItemsList.tsx:31),
|
|
16
|
-
[`NavigationSchema`](src/modules/NavigationSchema/NavigationSchema.tsx:36),
|
|
17
|
-
[`NavigationPreview`](src/modules/NavigationPreview/NavigationPreview.tsx:34),
|
|
18
|
-
[`NavigationMeta`](src/modules/NavigationMeta/NavigationMeta.tsx:25),
|
|
19
|
-
[`NavigationView`](src/modules/NavigationView/NavigationView.tsx:24).
|
|
20
|
-
- Типы: [`src/types/navigation.ts`](src/types/navigation.ts:1).
|
|
21
|
-
|
|
22
|
-
Общая оценка: архитектура зрелая и последовательная. Уровни `components → modules → widgets`
|
|
23
|
-
выдержаны, generic-типизация сквозная, controlled/uncontrolled паттерн реализован. Ниже —
|
|
24
|
-
конкретные замечания, сгруппированные по 7 пунктам задачи.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 1. Соответствие стилю проекта и Gravity UI
|
|
29
|
-
|
|
30
|
-
Что хорошо:
|
|
31
|
-
|
|
32
|
-
- Везде используется `bem-cn-lite` с префиксом `qp-*`, компоновка через `Flex`, spacing через
|
|
33
|
-
`gap`, что совпадает с остальным проектом.
|
|
34
|
-
- Detail-табы построены на `SegmentedRadioGroup`, meta-скелетоны на `Skeleton`, секции на
|
|
35
|
-
`Disclosure` — всё нативные примитивы Gravity UI, без самописных аналогов.
|
|
36
|
-
|
|
37
|
-
Замечания:
|
|
38
|
-
|
|
39
|
-
- **Инлайн-стили вместо SCSS/токенов в продакшн-коде.** В [`buildSchemaColumns`](src/modules/NavigationSchema/helpers/buildSchemaColumns.tsx:22)
|
|
40
|
-
используется `style={{display:'inline-flex', alignItems:'center', gap:4}}`. По стилю проекта
|
|
41
|
-
раскладка/отступы задаются через `Flex gap` или `--g-spacing-*` в `.scss`. Инлайн-`gap:4` стоит
|
|
42
|
-
заменить на `Flex gap` или CSS-класс с токеном. (Инлайн-стили и текстовые заглушки в сторибуках
|
|
43
|
-
оставляем как есть — для демо это допустимо.)
|
|
44
|
-
- **Пустой `title: ''` в конфиге таба.** В [`createEmptyDetailConfig`](src/widgets/QueriesNavigation/helpers/createEmptyDetailConfig.ts:9)
|
|
45
|
-
создаётся таб с пустым заголовком — формально валидация i18n не срабатывает (строка не идёт
|
|
46
|
-
через `t`), но семантически это «фейковый» таб только ради контейнера. См. п.4.
|
|
47
|
-
|
|
48
|
-
## 2. Размещение новых компонент по уровням
|
|
49
|
-
|
|
50
|
-
В целом соответствует правилам из [`AGENTS.md`](AGENTS.md:1):
|
|
51
|
-
|
|
52
|
-
- Списковые/скомпонованные блоки (`ClustersList`, `NavigationItemsList`, `NavigationDetail`,
|
|
53
|
-
`NavigationSchema/Preview/Meta/View`) корректно лежат в `modules`.
|
|
54
|
-
- Внутренние части (`ClusterRow`, `NavigationItemRow`, `NavigationDetailTabs`,
|
|
55
|
-
`NavigationViewSectionItem`) — в `internal/`, что верно.
|
|
56
|
-
- Хелперы конфигов (`createTableDetailConfig` и пр.) — на уровне виджета, т.к. содержат
|
|
57
|
-
widget-specific i18n. Это оправданно.
|
|
58
|
-
|
|
59
|
-
Замечания:
|
|
60
|
-
|
|
61
|
-
- **`ClusterRow` и `NavigationItemRow` реэкспортируются как публичные из
|
|
62
|
-
[`src/modules/index.ts`](src/modules/index.ts:17), но физически лежат в `internal/`.**
|
|
63
|
-
Противоречие: либо это публичный API (тогда вынести из `internal/` на уровень модуля или в
|
|
64
|
-
`components`, т.к. они атомарны и переиспользуются в сторибуке `CustomRows`), либо это внутренняя
|
|
65
|
-
деталь (тогда убрать из barrel). Судя по использованию в кастомном рендере — это публичный
|
|
66
|
-
контракт, и их правильнее поднять до `components` (у них стабильный props-контракт, отдельное
|
|
67
|
-
использование есть).
|
|
68
|
-
- **`NavigationDetailTabs` в `internal/` — ок**, но у него нет `index.ts` и он импортируется по
|
|
69
|
-
прямому пути. По правилу «каждая единица — папка с `index.ts`» это допустимо для internal, но
|
|
70
|
-
стоит свериться на консистентность с другими internal-частями.
|
|
71
|
-
- **`NavigationDetail` не экспортирует `NavigationDetailConfig`-фабрики** из своего `index.ts`,
|
|
72
|
-
тогда как связанные типы живут в `types/navigation`. Это нормально, но стоит проверить, что
|
|
73
|
-
потребитель может собрать конфиг детали без импортов из `widgets`.
|
|
74
|
-
|
|
75
|
-
## 3. Кандидаты на вынос в хелперы
|
|
76
|
-
|
|
77
|
-
- **`visibleActions`-рендер дублируется.** Логика «отфильтровать по `hidden` → отрисовать список
|
|
78
|
-
`Button view=flat size=s` с `title/aria-label/disabled/qa`» повторяется в
|
|
79
|
-
[`NavigationHeader`](src/modules/NavigationHeader/NavigationHeader.tsx:22) и
|
|
80
|
-
[`NavigationViewSectionItem`](src/modules/NavigationView/internal/NavigationViewSectionItem.tsx:29).
|
|
81
|
-
Кандидат на общий компонент `ActionButtons`/`NavigationActions` (в `components`) с generic-типом
|
|
82
|
-
экшена, чтобы `NavigationHeaderAction` и `NavigationViewSectionAction` покрывались одним рендером.
|
|
83
|
-
- **Единый тип «action».** См. п.6 — `NavigationHeaderAction` и `NavigationViewSectionAction`
|
|
84
|
-
отличаются только сигнатурой `onClick`. Можно ввести generic `NavigationAction<TCtx>`.
|
|
85
|
-
- **`getInitialTab` / фильтр видимых табов.** В [`NavigationDetail`](src/modules/NavigationDetail/NavigationDetail.tsx:30)
|
|
86
|
-
`config.tabs.filter(t => !t.hidden)` считается дважды (в `getInitialTab` и в `useMemo`). Можно
|
|
87
|
-
вынести хелпер `getVisibleTabs`/`resolveInitialTab` в `NavigationDetail/helpers/`.
|
|
88
|
-
- **SKELETON-заглушка.** Блок «N `Skeleton` в колонку» полностью повторяется в
|
|
89
|
-
[`NavigationMeta`](src/modules/NavigationMeta/NavigationMeta.tsx:47) и
|
|
90
|
-
[`NavigationView`](src/modules/NavigationView/NavigationView.tsx:40) (одна и та же
|
|
91
|
-
`SKELETON_ROWS_COUNT = 4`). Кандидат на общий `ListSkeleton`/`SkeletonRows` в `components`.
|
|
92
|
-
|
|
93
|
-
## 4. Удобство использования, гибкость переопределения и типизация
|
|
94
|
-
|
|
95
|
-
Сильные стороны:
|
|
96
|
-
|
|
97
|
-
- Сквозные дженерики `<TItem, TCluster>`, `<TColumn>`, `<TRow>` дают типобезопасное расширение
|
|
98
|
-
строк/колонок.
|
|
99
|
-
- Паттерн `renderRowItem` + fallback на дефолтный ряд (`ClustersList`, `NavigationItemsList`) —
|
|
100
|
-
гибкий и предсказуемый.
|
|
101
|
-
- Controlled/uncontrolled в [`NavigationDetail`](src/modules/NavigationDetail/NavigationDetail.tsx:51)
|
|
102
|
-
реализован аккуратно (search и activeTab независимо).
|
|
103
|
-
- `view`-проп у detail-модулей (`tableColumns`/`extraColumns`/`render`) — хороший механизм
|
|
104
|
-
переопределения таблиц.
|
|
105
|
-
|
|
106
|
-
Замечания:
|
|
107
|
-
|
|
108
|
-
- **Дженерик теряется в detail-резолверах.** В [`createTableDetailConfig`](src/widgets/QueriesNavigation/helpers/createTableDetailConfig.tsx:19)
|
|
109
|
-
резолверы типизированы как `NavigationSchemaResolver<T>`, но возвращают `NavigationSchemaConfig`
|
|
110
|
-
без `<TColumn>`. Из-за этого `extraColumns`-типизация кастомных колонок в конфиге таблицы теряется.
|
|
111
|
-
Стоит пробросить `TColumn`/`TRow` до `NavigationSchema data`.
|
|
112
|
-
- **`createEmptyDetailConfig` через `React.createElement`.** Файл `.ts`, поэтому используется
|
|
113
|
-
`createElement` вместо JSX. Логичнее переименовать в `.tsx` и вернуть JSX, а «пустое состояние»
|
|
114
|
-
моделировать не фейковым табом с `title:''`, а отдельной веткой в `NavigationDetail`
|
|
115
|
-
(например, `config.empty?: ReactNode` или рендер `EmptyContent`, когда `tabs` пуст).
|
|
116
|
-
- **`[key: string]: unknown` в типах.** `NavigationSchemaColumn` и `NavigationMetaItem` имеют
|
|
117
|
-
индексную сигнатуру `[key: string]: unknown`. Это ослабляет типизацию расширений (лучше решать
|
|
118
|
-
через дженерик `T extends ...`, который и так есть). Возможная избыточность — см. п.6.
|
|
119
|
-
- **`resolvedDetailActions = detailActions ?? actions`** в
|
|
120
|
-
[`QueriesNavigation`](src/widgets/QueriesNavigation/QueriesNavigation.tsx:86): fallback header-экшенов
|
|
121
|
-
на detail неочевиден. Стоит задокументировать поведение в типе `NavigationDetailPanelConfig`.
|
|
122
|
-
|
|
123
|
-
## 5. Дублирование кода
|
|
124
|
-
|
|
125
|
-
- **`buildPreviewColumns` и `buildViewColumns` идентичны.**
|
|
126
|
-
[`buildPreviewColumns`](src/modules/NavigationPreview/helpers/buildPreviewColumns.tsx:5) и
|
|
127
|
-
[`buildViewColumns`](src/modules/NavigationView/helpers/buildViewColumns.tsx:5) — побайтово
|
|
128
|
-
одинаковая функция (маппинг `columns → Column` с заглушкой `value_empty`). Разнесены только по
|
|
129
|
-
разным i18n. Кандидат на общий хелпер (например, `buildStringColumns` в `src/helpers/` или
|
|
130
|
-
`components`), принимающий функцию перевода/`emptyText`.
|
|
131
|
-
- **Логика «пустого значения» повторяется трижды.** `value === undefined || null || ''` есть в
|
|
132
|
-
`buildPreviewColumns`, `buildViewColumns`, [`buildMetaGroups`](src/modules/NavigationMeta/helpers/buildMetaGroups.tsx:15)
|
|
133
|
-
(`isEmptyValue`). Вынести единый `isEmptyValue` в `src/helpers/`.
|
|
134
|
-
- **Скелетоны и action-рендер** — дублирование описано в п.3.
|
|
135
|
-
- **Блок `errorContent → <Text color="danger">`** повторяется в Schema/Preview/Meta/View. Можно
|
|
136
|
-
ввести общий `DetailError`/использовать существующий паттерн вывода ошибки.
|
|
137
|
-
|
|
138
|
-
## 6. Оценка новых типов (избыточность/дублирование)
|
|
139
|
-
|
|
140
|
-
Файл [`src/types/navigation.ts`](src/types/navigation.ts:1) большой и в целом хорошо
|
|
141
|
-
структурирован, но есть избыточность:
|
|
142
|
-
|
|
143
|
-
- **`NavigationViewRow = NavigationPreviewRow`** ([`строка 109`](src/types/navigation.ts:109)) — псевдоним.
|
|
144
|
-
А `NavigationViewConfig`/`NavigationPreviewConfig` очень близки (secions vs rows). Стоит оценить,
|
|
145
|
-
не свести ли preview к частному случаю view, либо явно задокументировать, что это осознанно разные
|
|
146
|
-
сущности.
|
|
147
|
-
- **`NavigationHeaderAction` vs `NavigationViewSectionAction`** — отличаются только типом аргумента
|
|
148
|
-
`onClick` (`NavigationLocation` против `NavigationViewSection`). Кандидат на generic
|
|
149
|
-
`NavigationAction<TArg>` c общими полями `id/title/content/hidden/disabled/qa`.
|
|
150
|
-
- **Четыре почти одинаковых `*Config`** (`Schema/Preview/Meta/View`) с общими полями
|
|
151
|
-
`loading/loaded/errorContent`. Можно ввести базовый `NavigationAsyncConfig` и расширять его
|
|
152
|
-
(`& {columns}`, `& {rows}`, `& {groups}`, `& {sections}`).
|
|
153
|
-
- **`ResolveNavigationDetail` vs `NavigationDetailConfigFactory`** — обе `(item) => Config`,
|
|
154
|
-
различие только в `| undefined`. Возможно, достаточно одного типа с опциональностью на месте
|
|
155
|
-
использования.
|
|
156
|
-
- **`NavigationPreviewCell = ReactNode` и `NavigationMetaValue = ReactNode`** — псевдонимы одного
|
|
157
|
-
и того же. Либо один общий `NavigationCellValue`, либо убрать псевдонимы.
|
|
158
|
-
- **Индексные сигнатуры `[key: string]: unknown`** в `NavigationSchemaColumn`/`NavigationMetaItem`
|
|
159
|
-
дублируют возможности дженериков — стоит выбрать один механизм расширения.
|
|
160
|
-
|
|
161
|
-
## 7. Оценка сторибуков (избыточность, объединение)
|
|
162
|
-
|
|
163
|
-
Наблюдения:
|
|
164
|
-
|
|
165
|
-
- **Повторяющиеся `Loading/Empty/Error`-стори у 4 detail-модулей.** У Schema, Preview, Meta, View
|
|
166
|
-
практически идентичные state-стори. Их можно оставить (они полезны для autodocs), но mock-данные
|
|
167
|
-
дублируются между сторибуками и [`QueriesNavigation.stories`](src/widgets/QueriesNavigation/QueriesNavigation.stories.tsx:148)
|
|
168
|
-
(`TABLE_SCHEMA_COLUMNS`, `TABLE_PREVIEW_ROWS`, `TABLE_META_GROUPS`, `TABLE_VIEW_SECTIONS`
|
|
169
|
-
повторяют данные модульных сторибуков). Кандидат на общий `story/mockData.ts`
|
|
170
|
-
(как уже сделано в `DashboardCharts/story/mockData.ts` и `ChartEditor/story/mockData.ts`).
|
|
171
|
-
- **`CustomColumns`-стори у Schema и Preview идентичны** (тот же `lock`-паттерн с `Label`+`LockIcon`).
|
|
172
|
-
Можно объединить логически или вынести общий пример.
|
|
173
|
-
- **Кандидат на объединение в одно демо.** Отдельные `Loading`/`Empty`/`Error` можно объединить в
|
|
174
|
-
одну «States»-стори через controls/args-матрицу, оставив `Default` и `Custom*` отдельными. Это
|
|
175
|
-
сократит число стори без потери покрытия.
|
|
176
|
-
- **Несогласованность с гайдом структуры сторибуков.** Часть модулей (`ChartEditor`,
|
|
177
|
-
`DashboardCharts`) держат стори в подпапке `story/` с `mockData.ts`, а Navigation-модули — рядом
|
|
178
|
-
с компонентом. Стоит привести к единому подходу (вероятно `story/` + вынесенные моки).
|
|
179
|
-
- **Мелочь:** опечатки в mock-данных `QueriesNavigation.stories` (`tesdting`, `Prestable`) —
|
|
180
|
-
косметика, но заметна в autodocs.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## Приоритизация правок (для последующей реализации в Code mode)
|
|
185
|
-
|
|
186
|
-
Высокий приоритет (дублирование/типобезопасность):
|
|
187
|
-
|
|
188
|
-
1. Объединить [`buildPreviewColumns`](src/modules/NavigationPreview/helpers/buildPreviewColumns.tsx:5)
|
|
189
|
-
и [`buildViewColumns`](src/modules/NavigationView/helpers/buildViewColumns.tsx:5) в один хелпер.
|
|
190
|
-
2. Вынести общий `isEmptyValue` в `src/helpers/`.
|
|
191
|
-
3. Пробросить дженерики `TColumn`/`TRow` в резолверах
|
|
192
|
-
[`createTableDetailConfig`](src/widgets/QueriesNavigation/helpers/createTableDetailConfig.tsx:45).
|
|
193
|
-
4. Решить статус `ClusterRow`/`NavigationItemRow`: поднять в `components` либо убрать из
|
|
194
|
-
публичного barrel.
|
|
195
|
-
|
|
196
|
-
Средний приоритет (переиспользование/типы):
|
|
197
|
-
|
|
198
|
-
5. Ввести generic `NavigationAction<TArg>` и общий рендер экшенов
|
|
199
|
-
(`NavigationHeader` + `NavigationViewSectionItem`).
|
|
200
|
-
6. Ввести базовый `NavigationAsyncConfig` (`loading/loaded/errorContent`) и общий `SkeletonRows`.
|
|
201
|
-
7. Убрать псевдонимы-дубликаты типов (`NavigationPreviewCell`/`NavigationMetaValue`,
|
|
202
|
-
`NavigationViewRow`) и пересмотреть индексные сигнатуры.
|
|
203
|
-
|
|
204
|
-
Низкий приоритет (стиль/сторибуки):
|
|
205
|
-
|
|
206
|
-
8. Вынести mock-данные detail-модулей в общий `story/mockData.ts`, объединить state-стори,
|
|
207
|
-
унифицировать расположение сторибуков.
|
|
208
|
-
9. Заменить инлайн-стиль `gap:4` в продакшн-хелпере [`buildSchemaColumns`](src/modules/NavigationSchema/helpers/buildSchemaColumns.tsx:22)
|
|
209
|
-
на `Flex gap` / CSS-класс с токеном (сторибуков не касается).
|
|
210
|
-
10. Переосмыслить `createEmptyDetailConfig` (JSX + отдельная ветка пустого состояния вместо
|
|
211
|
-
таба с `title:''`).
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
Примечание по процессу: анализ выполнен по текущему состоянию файлов. Если нужно строго сверить
|
|
216
|
-
именно diff коммита `bcaa6e4c` (какие строки добавлены/удалены), это удобнее сделать в среде с
|
|
217
|
-
доступом к `git`/`arc` — тогда часть замечаний можно будет привязать к конкретным ханкам.
|
package/plans/styles-rules.md
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
# Правила владения SCSS-стилями
|
|
2
|
-
|
|
3
|
-
Подробные правила для агентов, работающих со стилями в `@gravity-ui/querieskit`. Краткая обязательная выжимка находится в разделе [`## Styles`](../AGENTS.md) файла `AGENTS.md`.
|
|
4
|
-
|
|
5
|
-
## Структура
|
|
6
|
-
|
|
7
|
-
Каждый компонент, модуль или виджет, которому нужны стили, хранит одноимённый SCSS-файл рядом с файлом реализации и самостоятельно импортирует его:
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
ComponentName/
|
|
11
|
-
ComponentName.tsx
|
|
12
|
-
ComponentName.scss
|
|
13
|
-
index.ts
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
```tsx
|
|
17
|
-
// Child.tsx
|
|
18
|
-
import cn from 'bem-cn-lite';
|
|
19
|
-
|
|
20
|
-
import './Child.scss';
|
|
21
|
-
|
|
22
|
-
const block = cn('qp-child');
|
|
23
|
-
|
|
24
|
-
export type ChildProps = {
|
|
25
|
-
className?: string;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const Child = ({className}: ChildProps) => (
|
|
29
|
-
<div className={block(null, className)}>...</div>
|
|
30
|
-
);
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
```scss
|
|
34
|
-
// Child.scss
|
|
35
|
-
.qp-child {
|
|
36
|
-
// Внутренние стили Child.
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Если компоненту не нужны собственные стили, создавать пустой SCSS-файл не требуется.
|
|
41
|
-
|
|
42
|
-
## Flex-раскладка
|
|
43
|
-
|
|
44
|
-
Для flexbox-раскладки в приоритете компонент `Flex` из `@gravity-ui/uikit`. Если нужное поведение выражается его пропсами, следует задать направление, расстояние между детьми и выравнивание прямо в JSX, не дублируя их через `display: flex` в SCSS:
|
|
45
|
-
|
|
46
|
-
```tsx
|
|
47
|
-
import {Flex} from '@gravity-ui/uikit';
|
|
48
|
-
|
|
49
|
-
export const Parent = () => (
|
|
50
|
-
<Flex direction="column" gap={2} alignItems="center">
|
|
51
|
-
<Child />
|
|
52
|
-
<AnotherChild />
|
|
53
|
-
</Flex>
|
|
54
|
-
);
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Не следует без необходимости заменять такую раскладку отдельным классом:
|
|
58
|
-
|
|
59
|
-
```scss
|
|
60
|
-
// Parent.scss — не нужно, если достаточно пропсов Flex
|
|
61
|
-
.qp-parent {
|
|
62
|
-
display: flex;
|
|
63
|
-
flex-direction: column;
|
|
64
|
-
align-items: center;
|
|
65
|
-
gap: var(--g-spacing-2);
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
SCSS остаётся допустимым, когда API `Flex` не может выразить требуемое поведение: например, для псевдоклассов, вложенных селекторов, BEM-модификаторов состояния или отдельных правил внешней геометрии дочернего компонента. В таких случаях продолжают действовать правила владения стилями и передачи `className`.
|
|
70
|
-
|
|
71
|
-
## Владение стилями
|
|
72
|
-
|
|
73
|
-
Компонент владеет своим внутренним оформлением: размерами и расположением собственных элементов, цветами, состояниями, внутренними отступами и своим BEM-блоком. Его SCSS импортируется из его же файла реализации, поэтому компонент корректно выглядит независимо от того, через какого родителя он был отрендерен.
|
|
74
|
-
|
|
75
|
-
Родитель владеет компоновкой своих детей: расположением относительно контейнера и соседних элементов, участием в grid/flex-раскладке и внешней геометрией, необходимой конкретному сценарию. Сначала следует использовать `Flex` и возможности его API, например `gap` и `alignItems`; для grid-раскладки — подходящий контейнер. Если стиль нужно применить непосредственно к корневому элементу ребёнка, родитель передаёт собственный BEM-элемент через `className`:
|
|
76
|
-
|
|
77
|
-
```tsx
|
|
78
|
-
// Parent.tsx
|
|
79
|
-
import cn from 'bem-cn-lite';
|
|
80
|
-
|
|
81
|
-
import {Child} from '../Child';
|
|
82
|
-
import './Parent.scss';
|
|
83
|
-
|
|
84
|
-
const block = cn('qp-parent');
|
|
85
|
-
|
|
86
|
-
export const Parent = () => <Child className={block('child')} />;
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
```scss
|
|
90
|
-
// Parent.scss
|
|
91
|
-
.qp-parent {
|
|
92
|
-
&__child {
|
|
93
|
-
flex-shrink: 0;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
`Child` обязан объединить переданный `className` со своим корневым классом, а не заменить один класс другим. Текущий пример такого взаимодействия — [`HistorySearchRow`](../src/modules/HistorySearchRow/HistorySearchRow.tsx), который передаёт `className={block('icon')}` в [`QueryStatusIcon`](../src/components/QueryStatusIcon/QueryStatusIcon.tsx), а правило внешней компоновки хранит в [`HistorySearchRow.scss`](../src/modules/HistorySearchRow/HistorySearchRow.scss).
|
|
99
|
-
|
|
100
|
-
## Запрещённый паттерн
|
|
101
|
-
|
|
102
|
-
Нельзя складывать собственные стили дочерних компонентов в один SCSS-файл родителя и рассчитывать, что они загрузятся только потому, что родитель импортирует этот файл:
|
|
103
|
-
|
|
104
|
-
```scss
|
|
105
|
-
// Parent.scss — запрещено
|
|
106
|
-
.qp-child {
|
|
107
|
-
width: 100%;
|
|
108
|
-
|
|
109
|
-
&__title {
|
|
110
|
-
min-width: 0;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.qp-another-child {
|
|
115
|
-
padding: var(--g-spacing-2);
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Такой подход связывает внешний вид ребёнка с конкретным родителем: при самостоятельном использовании или переносе ребёнка его стили не загрузятся. Родительский SCSS должен описывать BEM-блок родителя и его элементы, но не BEM-блоки самостоятельных дочерних компонентов.
|
|
120
|
-
|
|
121
|
-
В текущем коде есть исторические нарушения этого правила:
|
|
122
|
-
|
|
123
|
-
- [`ClustersList.scss`](../src/modules/ClustersList/ClustersList.scss) объявляет блок `.qp-cluster-row`, принадлежащий [`ClusterRow`](../src/components/ClusterRow/ClusterRow.tsx).
|
|
124
|
-
- [`NavigationItemsList.scss`](../src/modules/NavigationItemsList/NavigationItemsList.scss) объявляет блок `.qp-navigation-item-row`, принадлежащий [`NavigationItemRow`](../src/components/NavigationItemRow/NavigationItemRow.tsx).
|
|
125
|
-
|
|
126
|
-
Эти места зафиксированы как анти-примеры и не должны использоваться как образец для нового кода. Их исправление выполняется отдельно.
|
|
127
|
-
|
|
128
|
-
## Чек-лист
|
|
129
|
-
|
|
130
|
-
1. У каждого компонента со своими стилями есть одноимённый SCSS-файл рядом с `.tsx`.
|
|
131
|
-
2. Компонент самостоятельно импортирует свой SCSS-файл.
|
|
132
|
-
3. SCSS компонента объявляет его собственный BEM-блок, а не блоки самостоятельных дочерних компонентов.
|
|
133
|
-
4. Внутреннее оформление ребёнка остаётся у ребёнка; родитель описывает только компоновку своего сценария.
|
|
134
|
-
5. Flexbox-раскладка сначала выражается через `Flex` из `@gravity-ui/uikit`; `display: flex` в SCSS используется только при недостаточности его API.
|
|
135
|
-
6. Для расстояний между детьми сначала используется `gap` компонента `Flex` или другое свойство подходящего контейнера.
|
|
136
|
-
7. Если родителю нужен класс на корневом элементе ребёнка, ребёнок принимает `className` и объединяет его со своим BEM-классом.
|
|
137
|
-
8. Переданный родителем класс является элементом BEM-блока родителя, например `qp-parent__child`.
|
package/skills-lock.json
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type {Meta, StoryObj} from '@storybook/react';
|
|
2
|
-
import {action} from 'storybook/actions';
|
|
3
|
-
|
|
4
|
-
import {AddChartButton} from './AddChartButton';
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof AddChartButton> = {
|
|
7
|
-
title: 'Components/AddChartButton',
|
|
8
|
-
component: AddChartButton,
|
|
9
|
-
tags: ['autodocs'],
|
|
10
|
-
parameters: {
|
|
11
|
-
layout: 'padded',
|
|
12
|
-
},
|
|
13
|
-
args: {
|
|
14
|
-
onSelect: action('onSelect'),
|
|
15
|
-
onOpenToggle: action('onOpenToggle'),
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export default meta;
|
|
20
|
-
type Story = StoryObj<typeof AddChartButton>;
|
|
21
|
-
|
|
22
|
-
export const Default: Story = {};
|
|
23
|
-
|
|
24
|
-
export const Opened: Story = {
|
|
25
|
-
args: {
|
|
26
|
-
open: true,
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export const CustomText: Story = {
|
|
31
|
-
args: {
|
|
32
|
-
text: 'Add visualization',
|
|
33
|
-
},
|
|
34
|
-
};
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import React, {type ReactNode, useMemo, useState} from 'react';
|
|
2
|
-
import {
|
|
3
|
-
ChartAreaStacked,
|
|
4
|
-
ChartBar,
|
|
5
|
-
ChartColumn,
|
|
6
|
-
ChartLine,
|
|
7
|
-
ChartPie,
|
|
8
|
-
Circles5Random,
|
|
9
|
-
Plus,
|
|
10
|
-
SquareBars,
|
|
11
|
-
} from '@gravity-ui/icons';
|
|
12
|
-
import {
|
|
13
|
-
Button,
|
|
14
|
-
type ButtonButtonProps,
|
|
15
|
-
DropdownMenu,
|
|
16
|
-
type DropdownMenuProps,
|
|
17
|
-
Icon,
|
|
18
|
-
type IconData,
|
|
19
|
-
} from '@gravity-ui/uikit';
|
|
20
|
-
import cn from 'bem-cn-lite';
|
|
21
|
-
|
|
22
|
-
import './AddChartButton.scss';
|
|
23
|
-
|
|
24
|
-
const block = cn('qp-add-chart-button');
|
|
25
|
-
|
|
26
|
-
export type AddChartButtonOption<TValue extends string = string> = {
|
|
27
|
-
value: TValue;
|
|
28
|
-
text: ReactNode;
|
|
29
|
-
icon?: IconData;
|
|
30
|
-
disabled?: boolean;
|
|
31
|
-
hidden?: boolean;
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export type DefaultAddChartButtonValue =
|
|
35
|
-
'Area' | 'BarX' | 'BarY' | 'Line' | 'Pie' | 'Scatter' | 'Waterfall';
|
|
36
|
-
|
|
37
|
-
export const DEFAULT_ADD_CHART_BUTTON_OPTIONS: readonly AddChartButtonOption<DefaultAddChartButtonValue>[] =
|
|
38
|
-
[
|
|
39
|
-
{value: 'Area', text: 'Area', icon: ChartAreaStacked},
|
|
40
|
-
{value: 'BarX', text: 'BarX', icon: ChartBar},
|
|
41
|
-
{value: 'BarY', text: 'BarY', icon: ChartColumn},
|
|
42
|
-
{value: 'Line', text: 'Line', icon: ChartLine},
|
|
43
|
-
{value: 'Pie', text: 'Pie', icon: ChartPie},
|
|
44
|
-
{value: 'Scatter', text: 'Scatter', icon: Circles5Random},
|
|
45
|
-
{value: 'Waterfall', text: 'Waterfall', icon: SquareBars},
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
type SwitcherButtonProps = Omit<
|
|
49
|
-
ButtonButtonProps,
|
|
50
|
-
'children' | 'className' | 'disabled' | 'onClick' | 'onKeyDown' | 'selected' | 'size' | 'view'
|
|
51
|
-
>;
|
|
52
|
-
|
|
53
|
-
type MenuProps = NonNullable<DropdownMenuProps<unknown>['menuProps']>;
|
|
54
|
-
type PopupProps = NonNullable<DropdownMenuProps<unknown>['popupProps']>;
|
|
55
|
-
|
|
56
|
-
export type AddChartButtonProps<TValue extends string = DefaultAddChartButtonValue> = {
|
|
57
|
-
text?: ReactNode;
|
|
58
|
-
options?: readonly AddChartButtonOption<TValue>[];
|
|
59
|
-
onSelect: (value: TValue) => void;
|
|
60
|
-
open?: boolean;
|
|
61
|
-
onOpenToggle?: (open: boolean) => void;
|
|
62
|
-
disabled?: boolean;
|
|
63
|
-
className?: string;
|
|
64
|
-
buttonProps?: SwitcherButtonProps;
|
|
65
|
-
menuProps?: MenuProps;
|
|
66
|
-
popupProps?: PopupProps;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export const AddChartButton = <TValue extends string = DefaultAddChartButtonValue>({
|
|
70
|
-
text = 'Add chart',
|
|
71
|
-
options = DEFAULT_ADD_CHART_BUTTON_OPTIONS as readonly AddChartButtonOption<TValue>[],
|
|
72
|
-
onSelect,
|
|
73
|
-
open,
|
|
74
|
-
onOpenToggle,
|
|
75
|
-
disabled,
|
|
76
|
-
className,
|
|
77
|
-
buttonProps,
|
|
78
|
-
menuProps,
|
|
79
|
-
popupProps,
|
|
80
|
-
}: AddChartButtonProps<TValue>) => {
|
|
81
|
-
const [innerOpen, setInnerOpen] = useState(false);
|
|
82
|
-
const isOpen = open ?? innerOpen;
|
|
83
|
-
|
|
84
|
-
const items = useMemo(
|
|
85
|
-
() =>
|
|
86
|
-
options.map(({value, text: optionText, icon, disabled: optionDisabled, hidden}) => ({
|
|
87
|
-
text: optionText,
|
|
88
|
-
iconStart: icon && <Icon data={icon} size={16} className={block('option-icon')} />,
|
|
89
|
-
disabled: optionDisabled,
|
|
90
|
-
hidden,
|
|
91
|
-
action: () => onSelect(value),
|
|
92
|
-
})),
|
|
93
|
-
[onSelect, options],
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
const handleOpenToggle: React.Dispatch<React.SetStateAction<boolean>> = (nextOpen) => {
|
|
97
|
-
const nextValue = typeof nextOpen === 'function' ? nextOpen(isOpen) : nextOpen;
|
|
98
|
-
|
|
99
|
-
if (open === undefined) {
|
|
100
|
-
setInnerOpen(nextValue);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
onOpenToggle?.(nextValue);
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
return (
|
|
107
|
-
<DropdownMenu
|
|
108
|
-
items={items}
|
|
109
|
-
open={isOpen}
|
|
110
|
-
onOpenToggle={handleOpenToggle}
|
|
111
|
-
disabled={disabled}
|
|
112
|
-
size="s"
|
|
113
|
-
switcherWrapperClassName={block(null, className)}
|
|
114
|
-
renderSwitcher={(switcherProps) => (
|
|
115
|
-
<Button
|
|
116
|
-
{...buttonProps}
|
|
117
|
-
{...switcherProps}
|
|
118
|
-
type={buttonProps?.type ?? 'button'}
|
|
119
|
-
view="flat-action"
|
|
120
|
-
size="m"
|
|
121
|
-
selected={isOpen}
|
|
122
|
-
disabled={disabled}
|
|
123
|
-
aria-haspopup="menu"
|
|
124
|
-
aria-expanded={isOpen}
|
|
125
|
-
className={block('button')}
|
|
126
|
-
>
|
|
127
|
-
<Icon data={Plus} size={16} />
|
|
128
|
-
{text}
|
|
129
|
-
</Button>
|
|
130
|
-
)}
|
|
131
|
-
menuProps={{
|
|
132
|
-
...menuProps,
|
|
133
|
-
size: menuProps?.size ?? 's',
|
|
134
|
-
className: block('menu', menuProps?.className),
|
|
135
|
-
}}
|
|
136
|
-
popupProps={{placement: 'bottom-start', ...popupProps}}
|
|
137
|
-
/>
|
|
138
|
-
);
|
|
139
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
.qp-attachment-list {
|
|
2
|
-
display: flex;
|
|
3
|
-
flex-direction: column;
|
|
4
|
-
min-width: 0;
|
|
5
|
-
margin: 0;
|
|
6
|
-
padding: 0;
|
|
7
|
-
list-style: none;
|
|
8
|
-
|
|
9
|
-
&__item {
|
|
10
|
-
min-width: 0;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
&__button {
|
|
14
|
-
--g-button-padding: var(--g-spacing-2);
|
|
15
|
-
|
|
16
|
-
min-width: 0;
|
|
17
|
-
justify-content: flex-start;
|
|
18
|
-
text-align: start;
|
|
19
|
-
|
|
20
|
-
&_active {
|
|
21
|
-
--g-button-background-color: var(--g-color-base-selection);
|
|
22
|
-
--g-button-background-color-hover: var(--g-color-base-selection-hover);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|