@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
package/eslint.config.mjs
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// eslint.config.mjs
|
|
2
|
-
import baseConfig from "@gravity-ui/eslint-config";
|
|
3
|
-
import prettierConfig from "@gravity-ui/eslint-config/prettier";
|
|
4
|
-
import reactConfig from "@gravity-ui/eslint-config/react";
|
|
5
|
-
import typescriptEslint from "@typescript-eslint/eslint-plugin";
|
|
6
|
-
|
|
7
|
-
export default [
|
|
8
|
-
{
|
|
9
|
-
ignores: [
|
|
10
|
-
"build/**",
|
|
11
|
-
"storybook-static/**",
|
|
12
|
-
"node_modules/**",
|
|
13
|
-
"dist/**",
|
|
14
|
-
"*.config.mjs",
|
|
15
|
-
],
|
|
16
|
-
},
|
|
17
|
-
...baseConfig,
|
|
18
|
-
...prettierConfig,
|
|
19
|
-
...reactConfig,
|
|
20
|
-
{
|
|
21
|
-
settings: {
|
|
22
|
-
"import/resolver": {
|
|
23
|
-
typescript: true,
|
|
24
|
-
node: true
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
plugins: {
|
|
28
|
-
"@typescript-eslint": typescriptEslint,
|
|
29
|
-
},
|
|
30
|
-
rules: {
|
|
31
|
-
curly: "off",
|
|
32
|
-
"@typescript-eslint/explicit-member-accessibility": [
|
|
33
|
-
"error",
|
|
34
|
-
{
|
|
35
|
-
accessibility: "explicit",
|
|
36
|
-
overrides: {
|
|
37
|
-
accessors: "explicit",
|
|
38
|
-
constructors: "no-public",
|
|
39
|
-
methods: "explicit",
|
|
40
|
-
properties: "off",
|
|
41
|
-
parameterProperties: "explicit",
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
files: ["src/stories/**/*.{ts,tsx}"],
|
|
49
|
-
rules: {
|
|
50
|
-
"import/no-extraneous-dependencies": "off",
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
];
|
package/plans/i18n-rules.md
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
# Правила работы с i18n
|
|
2
|
-
|
|
3
|
-
Подробные правила именования кейсетов и ключей для агентов, работающих с локализацией в `@gravity-ui/querieskit`. Краткая выжимка — в разделе [`## i18n`](../AGENTS.md) файла `AGENTS.md`, здесь — полный справочник с примерами.
|
|
4
|
-
|
|
5
|
-
## Техническая структура
|
|
6
|
-
|
|
7
|
-
Каждый виджет хранит свою локализацию в подпапке `i18n/`:
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
widgets/
|
|
11
|
-
WidgetName/
|
|
12
|
-
i18n/
|
|
13
|
-
en.json
|
|
14
|
-
ru.json
|
|
15
|
-
dicts.ts
|
|
16
|
-
index.ts
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
- [`dicts.ts`](../src/widgets/QueriesHistory/i18n/dicts.ts:1) — собирает словари по языкам: `export default {en, ru}`.
|
|
20
|
-
- [`index.ts`](../src/widgets/QueriesHistory/i18n/index.ts:1) — регистрирует кейсет через [`addI18Keysets`](../src/i18n/index.ts:11) и экспортирует типизированную функцию `t`:
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
import {addI18Keysets} from '../../../i18n';
|
|
24
|
-
|
|
25
|
-
import dicts from './dicts';
|
|
26
|
-
|
|
27
|
-
export default addI18Keysets('qp:widget-name', dicts);
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
- Имя кейсета всегда начинается с префикса `qp:` (namespace библиотеки) — тип `addI18Keysets` требует `` `qp:${string}` ``.
|
|
31
|
-
- В компоненте используется как `i18n('key_name')`, см. [`QueriesHistory.tsx`](../src/widgets/QueriesHistory/QueriesHistory.tsx:41).
|
|
32
|
-
- `modules` и `components`, у которых есть собственный переиспользуемый сценарий, также могут заводить свою папку `i18n/` по этой же схеме — правило применяется на всех трёх уровнях (`components` / `modules` / `widgets`).
|
|
33
|
-
|
|
34
|
-
## Кейсеты
|
|
35
|
-
|
|
36
|
-
Кейсеты делятся на 4 типа:
|
|
37
|
-
|
|
38
|
-
1. **Общие для всей системы** — используются во многих разделах, часто повторяются. Например: `common`, `common.units`, `common.actions`.
|
|
39
|
-
2. **Общие для раздела** — часто повторяются на страницах одного раздела. Например: `queries.common`.
|
|
40
|
-
3. **Специфичные для страниц раздела**. Например: `queries.editor`.
|
|
41
|
-
4. **Для переиспользуемых компонентов**. Например: `queries.status-icon`.
|
|
42
|
-
|
|
43
|
-
В контексте `qp:` namespace эквивалент раздела — виджет/модуль/компонент, например `qp:queries-history`, `qp:queries-history.history-list`.
|
|
44
|
-
|
|
45
|
-
### Рекомендации по кейсетам
|
|
46
|
-
|
|
47
|
-
- Для каждого кейсета обязательно указывать его контекст (для чего он и где используется — в комментарии рядом с регистрацией или в PR/документации).
|
|
48
|
-
- Не злоупотреблять гранулярностью: не создавать кейсет на несколько ключей без необходимости — объединять с существующим кейсетом раздела/виджета.
|
|
49
|
-
- Для секций или попапов одного раздела не заводить несколько кейсетов — использовать общий кейсет раздела.
|
|
50
|
-
- Называть кейсеты как можно короче: не `queries.history.filters`, а `queries.filters`.
|
|
51
|
-
- Для переиспользуемых компонентов не начинать нейминг со слова `component.` — начинать с раздела/сущности, к которой относится компонент: не `component.queries.status-icon`, а `queries.status-icon`.
|
|
52
|
-
|
|
53
|
-
## Ключи
|
|
54
|
-
|
|
55
|
-
Формат: `<контекст-элемента>_<содержание-текста>`.
|
|
56
|
-
|
|
57
|
-
- Контекст стараться брать из готового списка ниже; если не подходит — придумать свой короткий и понятный; если контекст определить не получается — не писать его вовсе.
|
|
58
|
-
- Не использовать контекст `label_`.
|
|
59
|
-
- Содержание текста в имени должно однозначно и лаконично отражать смысл (для длинных фраз — краткое описание сути, а не дословный текст).
|
|
60
|
-
|
|
61
|
-
### Примеры
|
|
62
|
-
|
|
63
|
-
| Текст | Ключ |
|
|
64
|
-
|---|---|
|
|
65
|
-
| Нотификация, заголовок: «Не удалось выполнить запрос» | `alert_query-execution-error` |
|
|
66
|
-
| Нотификация, сообщение: «Запрос выполняется дольше обычного, результат появится позже» | `alert_query-long-running` |
|
|
67
|
-
| «История запросов будет очищена через 30 дней после создания» | `alert_history-retention-notice` |
|
|
68
|
-
| Описание секции про сохранение и повторный запуск сценариев запросов | `context_reuse-saved-queries` |
|
|
69
|
-
| Активное действие «Повторить запрос» | `action_query-rerun` |
|
|
70
|
-
|
|
71
|
-
### Рекомендуемые контексты
|
|
72
|
-
|
|
73
|
-
- `context` — контекстная информация: подсказки, абзацы с пояснением назначения раздела/элемента.
|
|
74
|
-
- `alert` — обратная связь системы: нотификации по завершению запроса к серверу, предупреждения в обзоре ресурса (например, скорая блокировка аккаунта).
|
|
75
|
-
- `action` — действия пользователя: кнопки, ссылки, пункты действий в таблице, действия в правом верхнем углу обзора ресурсов.
|
|
76
|
-
- `field` — названия полей ресурса: колонки таблиц, формы редактирования, обзор.
|
|
77
|
-
- `title` — заголовок секции, страницы, попапа, компонента подтверждения (confirm), пункт меню.
|
|
78
|
-
- `confirm` — призыв к действию, например описание подтверждения операции.
|
|
79
|
-
- `value` — значения radio/switch, статус или другое переводимое значение поля.
|
|
80
|
-
|
|
81
|
-
## Технические префиксы
|
|
82
|
-
|
|
83
|
-
- **`raw_`** — если нужно избежать прогона текста через типограф.
|
|
84
|
-
- **`md_`** — если нужно выделить текст жирным/курсивом или добавить ссылку. Текст прогоняется через YFM и превращается в HTML-теги; на стороне компонента нужно подключать через `Yfm`-компонент. Атрибуты ссылки задаются так:
|
|
85
|
-
|
|
86
|
-
```json
|
|
87
|
-
{
|
|
88
|
-
"md_query-syntax-help": "Подробнее о синтаксисе смотрите в [документации](https://example.com/docs/query-syntax){target=_blank rel=\"noreferrer noopener\"}"
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
- **Не использовать HTML-разметку в тексте напрямую** — для форматирования есть только `md_` + YFM.
|
|
93
|
-
|
|
94
|
-
## Допустимые символы
|
|
95
|
-
|
|
96
|
-
Каждый текст проверяется на отсутствие неразрешённых символов:
|
|
97
|
-
|
|
98
|
-
```ts
|
|
99
|
-
/**
|
|
100
|
-
* [\u0400-\u04ff] – Кириллица
|
|
101
|
-
* \u00a0 – Неразрывный пробел
|
|
102
|
-
*/
|
|
103
|
-
export const SAFE_SYMBOLS_REGEX = /^[a-z0-9\u0400-\u04ff[\](){}<>!@#$%^&*~_\-−–—+='"`«»„”‘’“?.,:;|\\/ ₽™®©№\u00a0]*$/i;
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Перед добавлением новых строк в `en.json`/`ru.json` проверять их на соответствие этому регулярному выражению.
|
|
107
|
-
|
|
108
|
-
## Чек-лист при добавлении новых текстов
|
|
109
|
-
|
|
110
|
-
1. Определить, в какой кейсет должен попасть ключ (существующий кейсет виджета/модуля/компонента или общий — не плодить новые без необходимости).
|
|
111
|
-
2. Подобрать короткий контекст ключа из списка (`context`, `alert`, `action`, `field`, `title`, `confirm`, `value`) либо не указывать его, если не подходит.
|
|
112
|
-
3. Сформулировать лаконичное однозначное содержание в имени ключа (kebab-case после `_`).
|
|
113
|
-
4. Добавить перевод в `en.json` и `ru.json` одновременно.
|
|
114
|
-
5. Проверить текст на допустимые символы (`SAFE_SYMBOLS_REGEX`).
|
|
115
|
-
6. Если нужна разметка (ссылка/жирный/курсив) — использовать `md_`-префикс и YFM, не HTML.
|
|
116
|
-
7. Если нужно отключить типограф — использовать `raw_`-префикс.
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
# Архитектура навигации: концепты
|
|
2
|
-
|
|
3
|
-
Обобщение серии планов по навигационному стеку (`QueriesNavigation` и модули `Navigation*`).
|
|
4
|
-
Документ описывает **принципы и контракты**, а не пошаговые задачи: конкретные шаги реализации
|
|
5
|
-
и разбор отдельных коммитов исчерпаны. Продуктовые/доменные привязки сознательно убраны —
|
|
6
|
-
библиотека остаётся нейтральной к системе-источнику данных.
|
|
7
|
-
|
|
8
|
-
## Состав стека
|
|
9
|
-
|
|
10
|
-
По правилам `AGENTS.md` навигация разложена на три уровня:
|
|
11
|
-
|
|
12
|
-
```text
|
|
13
|
-
widgets/
|
|
14
|
-
QueriesNavigation — готовый виджет: список кластеров/элементов + detail-панель
|
|
15
|
-
modules/
|
|
16
|
-
NavigationHeader — хлебные крошки, редактор пути, действия
|
|
17
|
-
ClustersList — список кластеров
|
|
18
|
-
NavigationItemsList — список элементов текущего пути (+ синтетическая строка «..»)
|
|
19
|
-
NavigationDetail — панель детали: заголовок, вкладки, общий поиск
|
|
20
|
-
NavigationSchema — вкладка со структурой полей (табличная)
|
|
21
|
-
NavigationPreview — вкладка с данными (табличная)
|
|
22
|
-
NavigationMeta — вкладка с метаданными (пары «ключ → значение»)
|
|
23
|
-
components/
|
|
24
|
-
DataTable, LazyList, PathEditor, Breadcrumbs,
|
|
25
|
-
SearchWithButtons, FieldsSelector, FieldsSearchToolbar,
|
|
26
|
-
EmptyContent, ListSpinner
|
|
27
|
-
helpers/
|
|
28
|
-
useVisibleColumns, useLoadMoreSentinel, getParentPath, getDefaultNavigationIcon
|
|
29
|
-
types/
|
|
30
|
-
navigation.ts, pathEditor.ts — публичные контракты
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Импорты идут строго в одну сторону: `widgets → modules → components`.
|
|
34
|
-
|
|
35
|
-
## Базовые принципы
|
|
36
|
-
|
|
37
|
-
1. **Нормализованные данные на входе.** Библиотека не парсит и не форматирует доменные
|
|
38
|
-
структуры источника. Значения приходят уже приведёнными к строке или `ReactNode`; схема,
|
|
39
|
-
строки данных и метаданные — плоские нормализованные объекты. Никаких зависимостей от
|
|
40
|
-
форматов сериализации конкретной системы.
|
|
41
|
-
2. **Минимальный дефолт + расширяемость.** Каждый контракт содержит минимальный набор
|
|
42
|
-
обязательных полей, а расширение делается через индексную подпись (`[key: string]: unknown`)
|
|
43
|
-
и дженерик, протянутый до рендера. Консюмер добавляет свои поля и типобезопасно использует
|
|
44
|
-
их в кастомных колонках/строках.
|
|
45
|
-
3. **Два уровня кастомизации.** Везде, где есть дефолтный вид, доступны оба варианта:
|
|
46
|
-
*добавление* к дефолту (`view.extraColumns`, `view.extraContent`) и *полная замена*
|
|
47
|
-
(`view.tableColumns`, `view.render`, `renderRowItem`). Дефолтные билдеры и дефолтные строки
|
|
48
|
-
экспортируются публично, чтобы сценарий «то же, что дефолт, плюс своё» не требовал
|
|
49
|
-
копирования кода.
|
|
50
|
-
4. **Единая форма пропсов у модулей детали:** `{data, view?, ...сквозные}`, где `data` —
|
|
51
|
-
единственный источник правды по данным и состоянию (совпадает с публичным типом конфига,
|
|
52
|
-
который отдаёт резолвер), `view` — изолированная группа кастомизации отображения, а наверху
|
|
53
|
-
остаются только инфраструктурные пропсы (`search`, `className` и пр.). Это не даёт разрастись
|
|
54
|
-
плоскому списку пропсов и убирает ручную раскладку полей конфига в местах интеграции.
|
|
55
|
-
5. **Controlled/uncontrolled для любого состояния.** Активная вкладка, значение поиска, набор
|
|
56
|
-
видимых колонок работают в обоих режимах: если проп задан — модуль полностью следует ему,
|
|
57
|
-
иначе держит внутреннее состояние. Внутренний стейт не обновляется в контролируемом режиме,
|
|
58
|
-
чтобы не заводить «мертвое» состояние.
|
|
59
|
-
6. **Дженерики с дефолтом** вместо фиксированных типов — обратная совместимость сохраняется
|
|
60
|
-
для тех, кто не расширяет модель.
|
|
61
|
-
|
|
62
|
-
## Модель данных
|
|
63
|
-
|
|
64
|
-
```text
|
|
65
|
-
NavigationLocation = {cluster?, path?}
|
|
66
|
-
NavigationCluster = {id, title, icon?, color?, backgroundColor?, description?}
|
|
67
|
-
NavigationItemKind = 'folder' | 'file' | 'table' | 'link' | 'unknown'
|
|
68
|
-
NavigationItem = {path, title, icon?, kind?, hasChildren?, targetPathBroken?, disabled?}
|
|
69
|
-
NavigationSortOrder = 'asc' | 'desc'
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Навигация «внутрь» против открытия детали определяется по `hasChildren`, а не по `kind`:
|
|
73
|
-
элемент с детьми — переход по пути, без детей — открытие detail-панели.
|
|
74
|
-
|
|
75
|
-
Виджет группирует сквозные настройки в конфиг-объекты (`header`, `search`, `sort`, `listState`,
|
|
76
|
-
`detail`) вместо плоского списка пропсов.
|
|
77
|
-
|
|
78
|
-
## Detail-панель и вкладки
|
|
79
|
-
|
|
80
|
-
Набор вкладок не зашит в виджет, а вычисляется резолвером по элементу:
|
|
81
|
-
|
|
82
|
-
```text
|
|
83
|
-
ResolveNavigationDetail<T> = (item: T) => NavigationDetailConfig | undefined
|
|
84
|
-
|
|
85
|
-
NavigationDetailConfig = {
|
|
86
|
-
tabs: NavigationDetailTab[];
|
|
87
|
-
defaultTab?: string;
|
|
88
|
-
hasSearch?: boolean;
|
|
89
|
-
searchPlaceholder?: string;
|
|
90
|
-
actions?: NavigationHeaderAction[];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
NavigationDetailTab = {
|
|
94
|
-
id; title;
|
|
95
|
-
content?: ReactNode; // статический контент
|
|
96
|
-
renderContent?: (ctx) => ReactNode; // приоритетнее content
|
|
97
|
-
hidden?; disabled?;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
NavigationDetailTabRenderContext = {search, onSearchUpdate?, searchPlaceholder?}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Ключевые решения:
|
|
104
|
-
|
|
105
|
-
- **Реестр по виду элемента.** Резолвер собирается из реестра `Partial<Record<NavigationItemKind,
|
|
106
|
-
factory>>` плюс `fallback`. Это даёт кастомное отображение для любого вида элемента, а не только
|
|
107
|
-
для табличного. Дефолт из коробки есть только для табличного вида; для остальных без
|
|
108
|
-
собственной фабрики показывается заглушка.
|
|
109
|
-
- **Search-aware контент.** Статический `content` не может реагировать на поиск, поэтому у вкладки
|
|
110
|
-
есть `renderContent(ctx)`, получающий актуальное значение поиска, колбэк его обновления и
|
|
111
|
-
плейсхолдер. Правило: задан `renderContent` — используется он, иначе `content`.
|
|
112
|
-
- **Кто рендерит строку поиска.** Табличные вкладки рендерят собственный тулбар (поиск + выбор
|
|
113
|
-
колонок), поэтому фабрика встроенных вкладок ставит `hasSearch: false`, а общий ряд поиска в
|
|
114
|
-
`NavigationDetail` остаётся механизмом для кастомных наборов вкладок. Побочный эффект —
|
|
115
|
-
на вкладках без тулбара (метаданные и т.п.) поиска нет, что и требовалось: поиск семантически
|
|
116
|
-
относится к полям, а не к метаданным.
|
|
117
|
-
|
|
118
|
-
```mermaid
|
|
119
|
-
flowchart TD
|
|
120
|
-
Item[NavigationItem] --> Resolver[resolve detail by kind]
|
|
121
|
-
Resolver --> Config[NavigationDetailConfig tabs]
|
|
122
|
-
Config --> Detail[NavigationDetail]
|
|
123
|
-
Detail -->|renderContent ctx| Tab[active tab]
|
|
124
|
-
Tab --> Schema[NavigationSchema]
|
|
125
|
-
Tab --> Preview[NavigationPreview]
|
|
126
|
-
Tab --> Meta[NavigationMeta]
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Табличные вкладки: структура полей и данные
|
|
130
|
-
|
|
131
|
-
Обе вкладки построены на общем компоненте `DataTable` (скелетон-загрузка, пустые состояния) и
|
|
132
|
-
имеют одинаковый каркас.
|
|
133
|
-
|
|
134
|
-
Контракты:
|
|
135
|
-
|
|
136
|
-
```text
|
|
137
|
-
NavigationSchemaColumn = {
|
|
138
|
-
name: string; // имя поля
|
|
139
|
-
type?: string; // тип готовой строкой
|
|
140
|
-
sortOrder?: 'ascending' | 'descending'; // участие в ключе + направление
|
|
141
|
-
required?: boolean;
|
|
142
|
-
[key: string]: unknown; // расширение
|
|
143
|
-
}
|
|
144
|
-
NavigationSchemaConfig<TColumn> = {columns: TColumn[]; loading?; loaded?; errorContent?}
|
|
145
|
-
|
|
146
|
-
NavigationPreviewCell = ReactNode // готовое к отображению значение
|
|
147
|
-
NavigationPreviewRow = Record<string, NavigationPreviewCell>
|
|
148
|
-
NavigationPreviewConfig<TRow> = {columns: string[]; rows: TRow[]; loading?; loaded?; errorContent?}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
Терминологическая тонкость: в схеме `columns` — это **строки** таблицы (поля описываемой
|
|
152
|
-
сущности), а `view.tableColumns` — **колонки** отображающей таблицы. В превью `columns` задают
|
|
153
|
-
состав и порядок колонок данных.
|
|
154
|
-
|
|
155
|
-
Поведение модулей:
|
|
156
|
-
|
|
157
|
-
- `view.tableColumns` заданы → используются как есть (полная замена вида).
|
|
158
|
-
- Иначе строится дефолт билдером (`buildSchemaColumns` / `buildPreviewColumns`) и к нему
|
|
159
|
-
добавляются `view.extraColumns`. Билдеры экспортируются публично.
|
|
160
|
-
- Данные фильтруются по значению поиска: в схеме — по имени и типу поля, в превью — по подстроке
|
|
161
|
-
в видимых колонках. Пустой результат поиска даёт состояние «ничего не найдено», пустые
|
|
162
|
-
исходные данные — «нет данных».
|
|
163
|
-
- Индексная колонка отключена (`displayIndices: false`).
|
|
164
|
-
|
|
165
|
-
### Тулбар: поиск + выбор видимых колонок
|
|
166
|
-
|
|
167
|
-
Над таблицей рендерится общий тулбар (`FieldsSearchToolbar`): инпут поиска плюс кнопка выбора
|
|
168
|
-
видимых полей в `endButtons`. Состав опций селектора берётся из отображаемых колонок; по умолчанию
|
|
169
|
-
видимы все. Набор видимых колонок живёт в модуле (uncontrolled) через общий хук
|
|
170
|
-
`useVisibleColumns`, но переопределяется извне парой `visibleColumns` / `onVisibleColumnsChange`
|
|
171
|
-
плюс `defaultVisibleColumns` для стартового набора. Тулбар и сам селектор можно скрыть
|
|
172
|
-
(`hideToolbar`, `hideFieldsSelector`).
|
|
173
|
-
|
|
174
|
-
## Вкладка метаданных
|
|
175
|
-
|
|
176
|
-
Модель — **массив групп пар «ключ → значение»**, а не таблица: для метаданных это семантически
|
|
177
|
-
точнее.
|
|
178
|
-
|
|
179
|
-
```text
|
|
180
|
-
NavigationMetaItem = {name: string; value: ReactNode; [key: string]: unknown}
|
|
181
|
-
NavigationMetaGroup = {title?: string; items: NavigationMetaItem[]}
|
|
182
|
-
NavigationMetaConfig = {groups: NavigationMetaGroup[]; loading?; loaded?; errorContent?}
|
|
183
|
-
|
|
184
|
-
NavigationMetaViewConfig = {
|
|
185
|
-
render?: (data) => ReactNode; // полная замена содержимого вкладки
|
|
186
|
-
extraContent?: ReactNode; // блок после дефолтных групп
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Дефолт рендерит по блоку на группу: необязательный заголовок группы и список пар с прочерком
|
|
191
|
-
на месте пустого значения. Полная замена вида (`view.render`) имеет приоритет над всем, включая
|
|
192
|
-
обработку ошибок, — это осознанный «сырой» хук для консюмера. Тулбар и поиск на этой вкладке
|
|
193
|
-
не рендерятся.
|
|
194
|
-
|
|
195
|
-
## Переопределение строк списков
|
|
196
|
-
|
|
197
|
-
Паттерн повторяет уже принятый в списке истории: модуль принимает необязательный
|
|
198
|
-
`renderRowItem?: (data) => ReactNode`, и если он задан — используется вместо дефолтной строки.
|
|
199
|
-
|
|
200
|
-
```text
|
|
201
|
-
NavigationItemRowRenderData<T> = {item: T; index; isActive; isParentRow}
|
|
202
|
-
NavigationClusterRowRenderData<T> = {cluster: T; index; isActive}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Особенности:
|
|
206
|
-
|
|
207
|
-
- Флаг `isParentRow` отличает синтетическую строку «..» (создаётся внутри модуля и не несёт
|
|
208
|
-
дополнительных полей `T`), чтобы консюмер мог отрендерить её иначе или оставить дефолт.
|
|
209
|
-
- Строка «..» рендерится в двух местах — в основном списке и над пустым состоянием, — поэтому
|
|
210
|
-
кастомный рендер прокидывается и в пустое состояние.
|
|
211
|
-
- Дженерики `TItem` / `TCluster` протянуты через виджет и модули (`items`, `onItemClick`,
|
|
212
|
-
`renderRowItem`), поэтому дополнительные поля видны в типах внутри рендера. Виджет из-за этого
|
|
213
|
-
объявляется обычной дженерик-функцией, а не через `React.FC`.
|
|
214
|
-
- Дефолтные строки остаются в `internal/`, но реэкспортируются через `index.ts` модулей и
|
|
215
|
-
попадают в публичное API — для сценария «дефолт плюс своё».
|
|
216
|
-
- На уровне виджета пропсы называются `renderNavigationItem` / `renderClusterItem`, на уровне
|
|
217
|
-
модулей — `renderRowItem` (консистентно с остальными списками библиотеки).
|
|
218
|
-
|
|
219
|
-
## Состояния
|
|
220
|
-
|
|
221
|
-
Единая схема для всех модулей детали:
|
|
222
|
-
|
|
223
|
-
- `errorContent` — ранний возврат с текстом ошибки; в конфиге состояния списка ошибка сведена к
|
|
224
|
-
одному полю `error?: boolean | ReactNode` (`true` — дефолтное сообщение, `ReactNode` — свой
|
|
225
|
-
контент), чтобы не было двух полей под одно состояние.
|
|
226
|
-
- `loading` без `loaded` — скелетон.
|
|
227
|
-
- `loaded` при пустых данных — пустое состояние (`EmptyContent` с вариантом `no-data`).
|
|
228
|
-
- Непустой поиск без совпадений — вариант `nothing-found`.
|
|
229
|
-
|
|
230
|
-
## i18n
|
|
231
|
-
|
|
232
|
-
Каждый модуль/виджет с собственным сценарием держит локализацию в `i18n/` (`en.json`, `ru.json`,
|
|
233
|
-
`dicts.ts`, `index.ts`) и регистрирует keyset вида `qp:navigation-schema`, `qp:navigation-preview`,
|
|
234
|
-
`qp:navigation-meta`. Ключи — по формату `<контекст>_<содержимое>` (`title_column-name`,
|
|
235
|
-
`value_sort-ascending`, `value_empty`, `context_empty`, `field_detail-search-placeholder`,
|
|
236
|
-
`action_configure-visible-fields`). Дублирование мелких ключей вроде `value_empty` между
|
|
237
|
-
keyset'ами допустимо; общая логика вроде «прочерк вместо пустого значения» лучше жила бы в одном
|
|
238
|
-
хелпере.
|
|
239
|
-
|
|
240
|
-
## Публичный экспорт
|
|
241
|
-
|
|
242
|
-
- `index.ts` каждого уровня явно реэкспортирует публичные единицы уровня (включая дефолтные
|
|
243
|
-
строки списков и дефолтные билдеры колонок).
|
|
244
|
-
- Публичные типы контрактов лежат в `src/types/navigation.ts` и реэкспортируются из корневого
|
|
245
|
-
`index.ts`, чтобы консюмер мог типизировать свои данные.
|
|
246
|
-
|
|
247
|
-
## Известные пробелы и договорённости
|
|
248
|
-
|
|
249
|
-
Зафиксировано по итогам ревью навигационного стека; часть закрыта, часть осознанно оставлена.
|
|
250
|
-
|
|
251
|
-
| Тема | Состояние |
|
|
252
|
-
|------|-----------|
|
|
253
|
-
| Источник действий detail-панели | Сведён к одному управляемому полю в конфиге панели; действия из резолвера домёрживаются внутри `NavigationDetail` |
|
|
254
|
-
| Ошибка в состоянии списка | Сведена к одному полю `error?: boolean \| ReactNode` |
|
|
255
|
-
| Внутренний стейт при controlled-режиме | Явно различаются controlled/uncontrolled для вкладки и поиска |
|
|
256
|
-
| Пустая вкладка «просмотр» | Остаётся заглушкой в публичном API: либо скрывать, либо дать резолвер/рендер |
|
|
257
|
-
| Точечное переопределение одной встроенной вкладки | Нельзя заменить одну вкладку, не пересобрав весь массив; есть только полная замена вида внутри модуля |
|
|
258
|
-
| Контекст рендера вкладки | Содержит только поиск; элемент и локацию консюмер вынужден замыкать в фабрике |
|
|
259
|
-
| Дефолты по видам элементов | Дефолтная фабрика есть только для табличного вида, остальные — заглушка до своей фабрики |
|
|
260
|
-
| Дублирование каркаса трёх модулей детали | Повторяются рендер ошибки, сборка колонок и обёртка над таблицей; кандидаты на общий хелпер, общий тип `view` для табличных модулей и общий `isEmptyValue` |
|
|
261
|
-
| Клик по строке «..» в непустом списке | Обработка «вверх» опирается на признак наличия детей у синтетической строки — поведение требует проверки |
|
|
262
|
-
| Презентационные поля модели кластера | `color` / `backgroundColor` / `description` в данных дублируют возможности кастомного рендера строки |
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# План трёхуровневой структуры QueriesKit
|
|
2
|
-
|
|
3
|
-
## Контекст
|
|
4
|
-
|
|
5
|
-
Текущая структура держит почти всё внутри [`src/components/QueriesHistory`](src/components/QueriesHistory). Из-за этого [`QueriesHistory`](src/components/QueriesHistory/QueriesHistory.tsx:28) одновременно выглядит и как публичный виджет, и как контейнер для всех внутренних частей: [`HistoryList`](src/components/QueriesHistory/HistoryList.tsx:26), [`HistoryHeader`](src/components/QueriesHistory/HistoryHeader/HistoryHeader.tsx:13), [`HistoryRow`](src/components/QueriesHistory/HistoryRow/HistoryRow.tsx:17), [`HistoryRowHeader`](src/components/QueriesHistory/HistoryRow/HistoryRowHeader.tsx:19), [`HistoryDuration`](src/components/QueriesHistory/HistoryRow/HistoryDuration.tsx), [`QueryStatusIcon`](src/components/QueriesHistory/HistoryRow/QueryStatusIcon.tsx:27), [`HistoryRowContent`](src/components/QueriesHistory/HistoryRowContent.tsx:1), [`HistoryGroupHeader`](src/components/QueriesHistory/HistoryGroupHeader.tsx:1).
|
|
6
|
-
|
|
7
|
-
Библиотека `@gravity-ui/querieskit` находится в начале развития: сейчас в ней один публичный виджет ([`QueriesHistory`](src/components/QueriesHistory/QueriesHistory.tsx:28)), но в дальнейшем планируется добавление ещё многих виджетов. Это подтверждает целесообразность трёхуровневого деления сразу, а не откладывания его "на потом".
|
|
8
|
-
|
|
9
|
-
Также обнаружен реальный баг: [`src/components/index.ts`](src/components/index.ts:1) содержит самоссылающийся экспорт `export * from '.'`, который не реэкспортирует ничего полезного из [`src/components/QueriesHistory/index.ts`](src/components/QueriesHistory/index.ts:1). Это нужно исправить в рамках реструктуризации.
|
|
10
|
-
|
|
11
|
-
Цель — сделать структуру библиотеки читаемой для потребителей: отдельно базовые building blocks, отдельно сборки из них, отдельно готовые виджеты — с расчётом на рост числа виджетов.
|
|
12
|
-
|
|
13
|
-
## Модель трёх уровней
|
|
14
|
-
|
|
15
|
-
1. [`src/components`](src/components) — базовые атомарные или малые доменные компоненты.
|
|
16
|
-
2. [`src/modules`](src/modules) — компоненты, собирающие несколько базовых компонентов в переиспользуемый сценарный блок внутри одного виджета.
|
|
17
|
-
3. [`src/widgets`](src/widgets) — готовые продуктовые виджеты, которые можно поставить в приложение как цельный feature.
|
|
18
|
-
|
|
19
|
-
### Почему `modules`, а не `compositions`/`blocks`
|
|
20
|
-
|
|
21
|
-
- `compositions` точно передаёт смысл, но менее привычно в JS/React-экосистеме.
|
|
22
|
-
- `blocks` короче и привычнее для UI-библиотек в целом, но в этом проекте уже активно используется BEM через `bem-cn-lite` (`const block = cn('qp-history-row')` в [`HistoryRow.tsx`](src/components/QueriesHistory/HistoryRow/HistoryRow.tsx:15), [`HistoryList.tsx`](src/components/QueriesHistory/HistoryList.tsx:24) и др.) — термин "block" уже занят под BEM-блок в CSS-классах, и папка `src/blocks` создавала бы двусмысленность.
|
|
23
|
-
- `modules` — нейтральный и привычный термин, не конфликтует с BEM-терминологией проекта и не тянет за собой чужую методологию (Atomic Design, Feature-Sliced Design), названия которой не совсем подходят под текущие сущности.
|
|
24
|
-
|
|
25
|
-
Главное ограничение: не нужно автоматически выносить каждую маленькую внутреннюю часть в публичный атом. Атом должен попадать в [`src/components`](src/components), только если потребитель библиотеки действительно может использовать его отдельно и если у него есть стабильный props-контракт.
|
|
26
|
-
|
|
27
|
-
## Классификация текущих компонентов
|
|
28
|
-
|
|
29
|
-
### Базовые компоненты
|
|
30
|
-
|
|
31
|
-
В [`src/components`](src/components) стоит держать малые компоненты, которые не управляют большим сценарием:
|
|
32
|
-
|
|
33
|
-
- [`QueryStatusIcon`](src/components/QueriesHistory/HistoryRow/QueryStatusIcon.tsx:27) — хороший кандидат в base component.
|
|
34
|
-
- [`QueryDuration`](src/components/QueryDuration/QueryDuration.tsx) — base component для отображения длительности запроса. Переименован из `HistoryDuration` — может переиспользоваться за пределами `QueriesHistory`. Использует хук [`useQueryDuration`](src/components/QueryDuration/useQueryDuration.ts), который лежит рядом.
|
|
35
|
-
- [`HistoryRowMenu`](src/components/QueriesHistory/HistoryRow/HistoryRowMenu.tsx) — скорее малый доменный component, но его можно оставить рядом с [`HistoryRow`](src/modules/HistoryRow), если самостоятельного использования почти нет.
|
|
36
|
-
- [`HistoryRowHeader`](src/components/QueriesHistory/HistoryRow/HistoryRowHeader.tsx:19) — пограничный случай: если header нужен отдельно, он может быть component; если только как часть строки, лучше держать внутри [`src/modules/HistoryRow`](src/modules/HistoryRow).
|
|
37
|
-
- [`HistoryGroupHeader`](src/components/QueriesHistory/HistoryGroupHeader.tsx:1) — маленький визуальный компонент заголовка группы, физически сейчас лежит в корне `QueriesHistory/`, используется только из [`HistoryRowContent`](src/components/QueriesHistory/HistoryRowContent.tsx:1).
|
|
38
|
-
|
|
39
|
-
### Модули
|
|
40
|
-
|
|
41
|
-
В [`src/modules`](src/modules) стоит держать блоки, которые собирают несколько components и задают сценарий взаимодействия внутри конкретного виджета:
|
|
42
|
-
|
|
43
|
-
- [`HistoryHeader`](src/components/QueriesHistory/HistoryHeader/HistoryHeader.tsx:13) — сборка поиска, фильтра и действий над историей.
|
|
44
|
-
- [`HistoryList`](src/components/QueriesHistory/HistoryList.tsx:26) — сборка списка, групп, строк, selection, editing и render pipeline. Включает внутренние [`HistoryRowContent`](src/components/QueriesHistory/HistoryRowContent.tsx:1) и хелпер [`prepareRowData`](src/components/QueriesHistory/helpers/prepareRowData.ts).
|
|
45
|
-
- [`HistoryRow`](src/components/QueriesHistory/HistoryRow/HistoryRow.tsx:17) — сборка строки из статуса, title/header, duration, metadata, checkbox и меню.
|
|
46
|
-
|
|
47
|
-
### Виджеты
|
|
48
|
-
|
|
49
|
-
В [`src/widgets`](src/widgets) стоит держать законченные feature-блоки:
|
|
50
|
-
|
|
51
|
-
- [`QueriesHistory`](src/components/QueriesHistory/QueriesHistory.tsx:28) — готовый виджет истории запросов, который собирает [`HistoryHeader`](src/modules/HistoryHeader), [`HistoryList`](src/modules/HistoryList), i18n и widget-level настройки.
|
|
52
|
-
- В будущем сюда же будут добавляться новые виджеты библиотеки (например, редактор запроса, результат запроса и т.п.) по той же трёхуровневой схеме.
|
|
53
|
-
|
|
54
|
-
## Рекомендуемая целевая структура
|
|
55
|
-
|
|
56
|
-
```text
|
|
57
|
-
src/
|
|
58
|
-
components/
|
|
59
|
-
QueryStatusIcon/
|
|
60
|
-
QueryStatusIcon.tsx
|
|
61
|
-
QueryStatusIcon.scss
|
|
62
|
-
index.ts
|
|
63
|
-
QueryDuration/
|
|
64
|
-
QueryDuration.tsx
|
|
65
|
-
QueryDuration.scss
|
|
66
|
-
useQueryDuration.ts
|
|
67
|
-
index.ts
|
|
68
|
-
HistoryGroupHeader/
|
|
69
|
-
HistoryGroupHeader.tsx
|
|
70
|
-
HistoryGroupHeader.scss
|
|
71
|
-
index.ts
|
|
72
|
-
modules/
|
|
73
|
-
HistoryHeader/
|
|
74
|
-
HistoryHeader.tsx
|
|
75
|
-
internal/
|
|
76
|
-
HistorySearch.tsx
|
|
77
|
-
HistoryFilter.tsx
|
|
78
|
-
index.ts
|
|
79
|
-
HistoryRow/
|
|
80
|
-
HistoryRow.tsx
|
|
81
|
-
HistoryRowHeader.tsx
|
|
82
|
-
HistoryRowMenu.tsx
|
|
83
|
-
HistoryRow.scss
|
|
84
|
-
index.ts
|
|
85
|
-
HistoryList/
|
|
86
|
-
HistoryList.tsx
|
|
87
|
-
internal/
|
|
88
|
-
HistoryRowContent.tsx
|
|
89
|
-
helpers/
|
|
90
|
-
prepareRowData.ts
|
|
91
|
-
index.ts
|
|
92
|
-
widgets/
|
|
93
|
-
QueriesHistory/
|
|
94
|
-
QueriesHistory.tsx
|
|
95
|
-
i18n/
|
|
96
|
-
index.ts
|
|
97
|
-
types/
|
|
98
|
-
history.ts
|
|
99
|
-
helpers/
|
|
100
|
-
time.ts
|
|
101
|
-
index.ts
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Почему не слишком мелко
|
|
105
|
-
|
|
106
|
-
Это не слишком мелко, потому что деление идёт по уровню ответственности:
|
|
107
|
-
|
|
108
|
-
- [`src/components`](src/components) отвечает за малые визуальные building blocks.
|
|
109
|
-
- [`src/modules`](src/modules) отвечает за переиспользуемые сценарные блоки внутри виджета.
|
|
110
|
-
- [`src/widgets`](src/widgets) отвечает за готовые feature-пакеты.
|
|
111
|
-
|
|
112
|
-
Но будет слишком мелко, если вынести [`HistorySearch`](src/components/QueriesHistory/HistoryHeader/HistorySearch.tsx:16), [`HistoryFilter`](src/components/QueriesHistory/HistoryHeader/HistoryFilter.tsx:16), [`HistoryRowHeader`](src/components/QueriesHistory/HistoryRow/HistoryRowHeader.tsx:19), [`HistoryRowMenu`](src/components/QueriesHistory/HistoryRow/HistoryRowMenu.tsx) в top-level components только ради симметрии. Если эти части не имеют самостоятельного сценария использования, лучше оставить их в [`internal`](src/modules/HistoryHeader/internal) или рядом с модулем [`HistoryRow`](src/modules/HistoryRow).
|
|
113
|
-
|
|
114
|
-
## Публичные entrypoints
|
|
115
|
-
|
|
116
|
-
Минимальный публичный API:
|
|
117
|
-
|
|
118
|
-
- [`src/index.ts`](src/index.ts:1) — общий экспорт библиотеки.
|
|
119
|
-
- [`src/components/index.ts`](src/components/index.ts:1) — базовые components.
|
|
120
|
-
- [`src/modules/index.ts`](src/modules/index.ts) — модули.
|
|
121
|
-
- [`src/widgets/index.ts`](src/widgets/index.ts) — готовые виджеты.
|
|
122
|
-
|
|
123
|
-
Если package exports будут настраиваться отдельно, можно дать потребителям импортировать уровни напрямую:
|
|
124
|
-
|
|
125
|
-
- [`src/components/index.ts`](src/components/index.ts:1) для base components.
|
|
126
|
-
- [`src/modules/index.ts`](src/modules/index.ts) для modules.
|
|
127
|
-
- [`src/widgets/index.ts`](src/widgets/index.ts) для widgets.
|
|
128
|
-
|
|
129
|
-
## Предлагаемый порядок реализации
|
|
130
|
-
|
|
131
|
-
1. Создать папки [`src/components`](src/components), [`src/modules`](src/modules), [`src/widgets`](src/widgets) как публичные уровни библиотеки.
|
|
132
|
-
2. Перенести [`QueriesHistory`](src/components/QueriesHistory/QueriesHistory.tsx:28) и его i18n в [`src/widgets/QueriesHistory`](src/widgets/QueriesHistory).
|
|
133
|
-
3. Перенести [`HistoryHeader`](src/components/QueriesHistory/HistoryHeader/HistoryHeader.tsx:13), [`HistoryList`](src/components/QueriesHistory/HistoryList.tsx:26) (вместе с [`HistoryRowContent`](src/components/QueriesHistory/HistoryRowContent.tsx:1) и [`prepareRowData`](src/components/QueriesHistory/helpers/prepareRowData.ts)), [`HistoryRow`](src/components/QueriesHistory/HistoryRow/HistoryRow.tsx:17) в [`src/modules`](src/modules).
|
|
134
|
-
4. Вынести [`QueryStatusIcon`](src/components/QueryStatusIcon/QueryStatusIcon.tsx:27), [`QueryDuration`](src/components/QueryDuration/QueryDuration.tsx) (вместе с хуком [`useQueryDuration`](src/components/QueryDuration/useQueryDuration.ts)) и [`HistoryGroupHeader`](src/components/HistoryGroupHeader/HistoryGroupHeader.tsx:1) в [`src/components`](src/components).
|
|
135
|
-
5. Оставить [`HistorySearch`](src/components/QueriesHistory/HistoryHeader/HistorySearch.tsx:16), [`HistoryFilter`](src/components/QueriesHistory/HistoryHeader/HistoryFilter.tsx:16), [`HistoryRowHeader`](src/components/QueriesHistory/HistoryRow/HistoryRowHeader.tsx:19), [`HistoryRowMenu`](src/components/QueriesHistory/HistoryRow/HistoryRowMenu.tsx) внутри соответствующих modules, пока нет явной потребности в самостоятельном использовании.
|
|
136
|
-
6. Обновить imports между уровнями: widgets импортируют modules и components, modules импортируют components, components не импортируют modules или widgets.
|
|
137
|
-
7. Исправить сломанный barrel-экспорт [`src/components/index.ts`](src/components/index.ts:1) (сейчас там `export * from '.'` — самоссылающийся экспорт) и создать корректные `index.ts` для всех трёх уровней.
|
|
138
|
-
8. Реэкспортировать публичные типы из [`src/types/history.ts`](src/types/history.ts:3) через [`src/index.ts`](src/index.ts:1), если они являются частью контракта.
|
|
139
|
-
9. Проверить сборку и storybook после переноса файлов (сейчас `.stories.tsx` файлов в проекте нет — добавить их отдельной задачей при необходимости).
|
|
140
|
-
|
|
141
|
-
## Итоговая рекомендация
|
|
142
|
-
|
|
143
|
-
Трёхуровневая структура [`components`](src/components) / [`modules`](src/modules) / [`widgets`](src/widgets) оправдана, так как библиотека находится в начале развития и в неё планируется добавление многих новых виджетов — закладывать деление по уровню абстракции нужно сразу, а не переделывать структуру повторно в будущем. При этом не стоит выносить каждую внутреннюю часть в top-level atom: маленькие детали должны становиться base components только при наличии самостоятельного публичного сценария использования.
|