diff --git a/redisinsight/ui/src/constants/mocks/mock-enablement-area.ts b/redisinsight/ui/src/constants/mocks/mock-enablement-area.ts
index 4419c2232b..b5f54ddcb3 100644
--- a/redisinsight/ui/src/constants/mocks/mock-enablement-area.ts
+++ b/redisinsight/ui/src/constants/mocks/mock-enablement-area.ts
@@ -1,35 +1,59 @@
import { EnablementAreaComponent, IEnablementAreaItem } from 'uiSrc/slices/interfaces'
-export const MOCK_ENABLEMENT_AREA_ITEMS: IEnablementAreaItem[] = [
- {
+export const MOCK_ENABLEMENT_AREA_ITEMS: Record = {
+ 'quick-guides': {
type: EnablementAreaComponent.Group,
id: 'quick-guides',
label: 'Quick Guides',
- children: [
- {
+ children: {
+ 'document-capabilities': {
type: EnablementAreaComponent.InternalLink,
id: 'document-capabilities',
label: 'Document Capabilities',
args: {
- path: 'static/workbench/guides/document-capabilities.html',
+ path: 'static/workbench/quick-guides/document-capabilities.html',
+ },
+ },
+ 'working-with-json': {
+ type: EnablementAreaComponent.InternalLink,
+ id: 'working-with-json',
+ label: 'Working with JSON',
+ args: {
+ path: 'static/workbench/quick-guides/working-with-json.html',
+ },
+ },
+ 'working-with-hash': {
+ type: EnablementAreaComponent.InternalLink,
+ id: 'working-with-hash',
+ label: 'Working with HASH',
+ args: {
+ path: 'static/workbench/quick-guides/working-with-hash.html',
},
}
- ]
+ }
},
- {
+ 'internal-page': {
type: EnablementAreaComponent.InternalLink,
id: 'internal-page',
label: 'Internal Page',
args: {
- path: 'static/workbench/guides/document-capabilities.html'
+ path: 'static/workbench/quick-guides/document-capabilities.html'
+ },
+ },
+ 'second-internal-page': {
+ type: EnablementAreaComponent.InternalLink,
+ id: 'second-internal-page',
+ label: 'Second Internal Page',
+ args: {
+ path: 'static/workbench/quick-guides/document-capabilities.html'
},
},
- {
+ 'manual': {
type: EnablementAreaComponent.CodeButton,
id: 'manual',
label: 'Manual',
args: {
- path: 'static/workbench/scripts/manual.txt'
+ path: 'static/workbench/_scripts/manual.txt'
},
}
-]
+}
diff --git a/redisinsight/ui/src/packages/enablement-area/images/aggregations.png b/redisinsight/ui/src/packages/enablement-area/_images/aggregations.png
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/images/aggregations.png
rename to redisinsight/ui/src/packages/enablement-area/_images/aggregations.png
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/aggregation-with-apply.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/aggregation-with-apply.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/aggregation-with-apply.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/aggregation-with-apply.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/combined-search-with-and.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/combined-search-with-and.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/combined-search-with-and.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/combined-search-with-and.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/combined-search-with-geo-filter.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/combined-search-with-geo-filter.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/combined-search-with-geo-filter.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/combined-search-with-geo-filter.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/combined-search-with-or.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/combined-search-with-or.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/combined-search-with-or.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/combined-search-with-or.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/create-hash-index.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/create-hash-index.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/create-hash-index.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/create-hash-index.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-create.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-create.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-create.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-create.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-delete.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-delete.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-delete.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-delete.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-read.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-read.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-read.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-read.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-update.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-update.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/crud-update.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/crud-update.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/exact-text-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/exact-text-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/exact-text-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/exact-text-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/field-specific-text-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/field-specific-text-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/field-specific-text-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/field-specific-text-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/fuzzy-text-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/fuzzy-text-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/fuzzy-text-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/fuzzy-text-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/group-and-sort-by-aggregation.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/group-and-sort-by-aggregation.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/group-and-sort-by-aggregation.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/group-and-sort-by-aggregation.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/index-info.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/index-info.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/index-info.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/index-info.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/list-all-indexes.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/list-all-indexes.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/list-all-indexes.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/list-all-indexes.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/multiple-tags-and-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/multiple-tags-and-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/multiple-tags-and-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/multiple-tags-and-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/multiple-tags-or-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/multiple-tags-or-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/multiple-tags-or-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/multiple-tags-or-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/numeric-range-query.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/numeric-range-query.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/numeric-range-query.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/numeric-range-query.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/tag-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/tag-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-hashes/tag-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-hashes/tag-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/combined-search-with-and.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/combined-search-with-and.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/combined-search-with-and.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/combined-search-with-and.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/combined-search-with-geo-filter.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/combined-search-with-geo-filter.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/combined-search-with-geo-filter.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/combined-search-with-geo-filter.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/combined-search-with-or.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/combined-search-with-or.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/combined-search-with-or.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/combined-search-with-or.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/create-json-index.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/create-json-index.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/create-json-index.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/create-json-index.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-create.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-create.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-create.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-create.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-delete.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-delete.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-delete.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-delete.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-read.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-read.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-read.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-read.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-update.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-update.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/crud-update.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/crud-update.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/exact-text-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/exact-text-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/exact-text-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/exact-text-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/field-specific-text-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/field-specific-text-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/field-specific-text-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/field-specific-text-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/fuzzy-text-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/fuzzy-text-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/fuzzy-text-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/fuzzy-text-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/group-and-sort-by-aggregation.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/group-and-sort-by-aggregation.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/group-and-sort-by-aggregation.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/group-and-sort-by-aggregation.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/index-info.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/index-info.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/index-info.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/index-info.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/list-all-indexes.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/list-all-indexes.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/list-all-indexes.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/list-all-indexes.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/multiple-tags-and-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/multiple-tags-and-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/multiple-tags-and-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/multiple-tags-and-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/multiple-tags-or-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/multiple-tags-or-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/multiple-tags-or-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/multiple-tags-or-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/numeric-range-query.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/numeric-range-query.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/numeric-range-query.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/numeric-range-query.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/tag-search.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/tag-search.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/document/working-with-json/tag-search.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/document/working-with-json/tag-search.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/scripts/manual.txt b/redisinsight/ui/src/packages/enablement-area/_scripts/manual.txt
similarity index 100%
rename from redisinsight/ui/src/packages/enablement-area/scripts/manual.txt
rename to redisinsight/ui/src/packages/enablement-area/_scripts/manual.txt
diff --git a/redisinsight/ui/src/packages/enablement-area/enablement-area.json b/redisinsight/ui/src/packages/enablement-area/enablement-area.json
index 68167458c6..cc1aafbb5b 100644
--- a/redisinsight/ui/src/packages/enablement-area/enablement-area.json
+++ b/redisinsight/ui/src/packages/enablement-area/enablement-area.json
@@ -1,5 +1,5 @@
-[
- {
+{
+ "quick-guides": {
"type": "group",
"id": "quick-guides",
"label": "QUICK GUIDES",
@@ -7,57 +7,57 @@
"withBorder": true,
"initialIsOpen": true
},
- "children": [
- {
+ "children": {
+ "document": {
"type": "group",
"id": "document",
"label": "Document",
"args": {
"initialIsOpen": true
},
- "children": [
- {
+ "children": {
+ "introduction": {
"type": "internal-link",
"id": "introduction",
"label": "Introduction",
"args": {
- "path": "/static/workbench/guides/document/introduction.html"
+ "path": "/static/workbench/quick-guides/document/introduction.html"
}
},
- {
+ "working-with-hashes": {
"type": "internal-link",
"id": "working-with-hashes",
"label": "Working with Hashes",
"args": {
- "path": "/static/workbench/guides/document/working-with-hashes.html"
+ "path": "/static/workbench/quick-guides/document/working-with-hashes.html"
}
},
- {
+ "working-with-json": {
"type": "internal-link",
"id": "working-with-json",
"label": "Working with JSON",
"args": {
- "path": "/static/workbench/guides/document/working-with-json.html"
+ "path": "/static/workbench/quick-guides/document/working-with-json.html"
}
},
- {
+ "learn-more": {
"type": "internal-link",
"id": "learn-more",
"label": "Learn More",
"args": {
- "path": "/static/workbench/guides/document/learn-more.html"
+ "path": "/static/workbench/quick-guides/document/learn-more.html"
}
}
- ]
+ }
}
- ]
+ }
},
- {
+ "manual": {
"type": "code-button",
"id": "manual",
"label": "Manual",
"args": {
- "path": "/static/workbench/scripts/manual.txt"
+ "path": "/static/workbench/_scripts/manual.txt"
}
}
-]
+}
diff --git a/redisinsight/ui/src/packages/enablement-area/guides/document/introduction.html b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/introduction.html
similarity index 87%
rename from redisinsight/ui/src/packages/enablement-area/guides/document/introduction.html
rename to redisinsight/ui/src/packages/enablement-area/quick-guides/document/introduction.html
index 8e01ece071..25f6334d8f 100644
--- a/redisinsight/ui/src/packages/enablement-area/guides/document/introduction.html
+++ b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/introduction.html
@@ -67,19 +67,4 @@ PRE-REQUISITES
You could also create a free and ready to use instance on Redis Cloud.
-
diff --git a/redisinsight/ui/src/packages/enablement-area/guides/document/learn-more.html b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/learn-more.html
similarity index 76%
rename from redisinsight/ui/src/packages/enablement-area/guides/document/learn-more.html
rename to redisinsight/ui/src/packages/enablement-area/quick-guides/document/learn-more.html
index ce1fa26ee2..e052e84ffb 100644
--- a/redisinsight/ui/src/packages/enablement-area/guides/document/learn-more.html
+++ b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/learn-more.html
@@ -37,19 +37,4 @@ Tutorials
-
diff --git a/redisinsight/ui/src/packages/enablement-area/guides/document/working-with-hashes.html b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/working-with-hashes.html
similarity index 52%
rename from redisinsight/ui/src/packages/enablement-area/guides/document/working-with-hashes.html
rename to redisinsight/ui/src/packages/enablement-area/quick-guides/document/working-with-hashes.html
index e0aa902fa5..fbe1b031b8 100644
--- a/redisinsight/ui/src/packages/enablement-area/guides/document/working-with-hashes.html
+++ b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/working-with-hashes.html
@@ -8,25 +8,25 @@
@@ -37,19 +37,19 @@
@@ -60,114 +60,77 @@
-
diff --git a/redisinsight/ui/src/packages/enablement-area/guides/document/working-with-json.html b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/working-with-json.html
similarity index 52%
rename from redisinsight/ui/src/packages/enablement-area/guides/document/working-with-json.html
rename to redisinsight/ui/src/packages/enablement-area/quick-guides/document/working-with-json.html
index fd6d327e81..e228f992af 100644
--- a/redisinsight/ui/src/packages/enablement-area/guides/document/working-with-json.html
+++ b/redisinsight/ui/src/packages/enablement-area/quick-guides/document/working-with-json.html
@@ -8,25 +8,25 @@
@@ -37,19 +37,19 @@
@@ -60,108 +60,71 @@
-
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.spec.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.spec.tsx
index 4689e82561..d846421de4 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.spec.tsx
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.spec.tsx
@@ -29,7 +29,8 @@ jest.mock('uiSrc/slices/workbench/wb-enablement-area', () => {
describe('EnablementArea', () => {
it('should render', () => {
- expect(render()).toBeTruthy()
+ expect(render())
+ .toBeTruthy()
})
it('should render loading', () => {
@@ -53,7 +54,7 @@ describe('EnablementArea', () => {
expect(loaderEl).not.toBeInTheDocument()
expect(treeViewEl).toBeInTheDocument()
- expect(treeViewEl?.childNodes.length).toEqual(MOCK_ENABLEMENT_AREA_ITEMS.length)
+ expect(treeViewEl?.childNodes.length).toEqual(Object.values(MOCK_ENABLEMENT_AREA_ITEMS).length)
})
it('should render Group component', () => {
const item = {
@@ -66,7 +67,7 @@ describe('EnablementArea', () => {
id: 'document-capabilities',
label: 'Document Capabilities',
args: {
- path: 'static/workbench/guides/document-capabilities.html'
+ path: 'static/workbench/quick-guides/document-capabilities.html'
},
}
]
@@ -75,7 +76,7 @@ describe('EnablementArea', () => {
const { queryByTestId } = render(
)
@@ -89,13 +90,13 @@ describe('EnablementArea', () => {
id: 'manual',
label: 'Manual',
args: {
- path: 'static/workbench/scripts/manual.txt'
+ path: 'static/workbench/_scripts/manual.txt'
},
}
const { queryByTestId } = render(
)
const codeButtonEl = queryByTestId(`preselect-${item.label}`)
@@ -108,13 +109,13 @@ describe('EnablementArea', () => {
id: 'internal-page',
label: 'Internal Page',
args: {
- path: 'static/workbench/guides/document-capabilities.html',
+ path: 'static/workbench/quick-guides/document-capabilities.html',
}
}
const { queryByTestId } = render(
)
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.tsx
index 24f92a1ee9..4e22440a2b 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.tsx
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.tsx
@@ -19,7 +19,7 @@ import './styles.scss'
import styles from './styles.module.scss'
export interface Props {
- items: IEnablementAreaItem[];
+ items: Record;
loading: boolean;
openScript: (script: string, path: string) => void;
openInternalPage: (page: IInternalPage) => void;
@@ -71,13 +71,13 @@ const EnablementArea = ({ items, openScript, loading }: Props) => {
label={label}
{...args}
>
- {renderTreeView(children || [])}
+ {renderTreeView(Object.values(children || {}) || [])}
)
case EnablementAreaComponent.CodeButton:
return args?.path
- ?
- : openScript(args?.content || '', '')} label={label} {...args} />
+ ?
+ : openScript(args?.content || '', '')} label={label} {...args} />
case EnablementAreaComponent.InternalLink:
return (
@@ -91,7 +91,7 @@ const EnablementArea = ({ items, openScript, loading }: Props) => {
const renderTreeView = (elements: IEnablementAreaItem[]) => (
elements?.map((item) => (
-
+
{renderSwitch(item)}
)))
@@ -110,7 +110,7 @@ const EnablementArea = ({ items, openScript, loading }: Props) => {
flush
className={cx(styles.innerContainer)}
>
- {renderTreeView(items)}
+ {renderTreeView(Object.values(items))}
)}
()
-
-describe('Carousel', () => {
- it('should render initial slide and pagination by using React portal', () => {
- const { container, queryByTestId } = render(
-
-
- Slide 1
- Slide 2
-
-
-
- )
-
- expect(container).toBeTruthy()
- expect(queryByTestId('slide-1')).toBeInTheDocument()
- expect(queryByTestId('slide-2')).not.toBeInTheDocument()
- expect(container?.querySelector('.pagination')).toBeInTheDocument()
- })
- it('should switch slide', () => {
- const { queryByTestId, container } = render(
-
-
- Slide 1
- Slide 2
-
-
-
- )
-
- fireEvent.click(container?.querySelector('[data-test-subj="pagination-button-next"]') as Element)
- expect(queryByTestId('slide-1')).not.toBeInTheDocument()
- expect(queryByTestId('slide-2')).toBeInTheDocument()
- })
-})
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/Carousel.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/Carousel.tsx
deleted file mode 100644
index f9ca14ec05..0000000000
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/Carousel.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import ReactDOM from 'react-dom'
-import React, { useEffect, useState } from 'react'
-import { EuiPagination } from '@elastic/eui'
-
-import styles from './styles.module.scss'
-
-export interface Props {
- children: React.ReactElement[];
-}
-const Carousel = ({ children }: Props) => {
- const [slideIndex, setSlideIndex] = useState
(0)
- const [slides, setSlides] = useState([])
-
- useEffect(() => {
- // Get items only with specified key attribute
- setSlides(children.filter((element) => element?.key && element.key.toString().startsWith('slide')))
- }, [])
-
- const Pagination = () => {
- const footerEl = document.getElementById('internalPageFooter')
- if (footerEl) {
- return ReactDOM.createPortal(
-
- setSlideIndex(slide)}
- />
-
,
- footerEl
- )
- }
- return null
- }
- return (
-
- {slides[slideIndex]}
- {slides.length &&
}
-
- )
-}
-
-export default Carousel
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/index.ts b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/index.ts
deleted file mode 100644
index 349416af45..0000000000
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import Carousel from './Carousel'
-
-export default Carousel
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/styles.module.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/styles.module.scss
deleted file mode 100644
index 6e4d396369..0000000000
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Carousel/styles.module.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.container {
- margin-bottom: 40px;
-}
-
-.pagination {
- width: 100%;
- display: flex;
- justify-content: center;
-}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/CodeButton.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/CodeButton.tsx
index ab3aa7a35f..0e4bd17999 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/CodeButton.tsx
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/CodeButton.tsx
@@ -17,7 +17,7 @@ const CodeButton = ({ onClick, label, isLoading, ...rest }: Props) => (
onClick={onClick}
fullWidth
color="secondary"
- contentProps={{ className: styles.button }}
+ className={styles.button}
textProps={{ className: styles.buttonText }}
data-testid={`preselect-${label}`}
{...rest}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/styles.module.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/styles.module.scss
index 32424ff45e..645b37b7cd 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/styles.module.scss
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/CodeButton/styles.module.scss
@@ -1,5 +1,15 @@
+@import '@elastic/eui/src/global_styling/index';
+
.button {
justify-content: space-between;
+ &[class*='euiButton--secondary']:not([class*='isDisabled']) {
+ &:hover,
+ &:focus,
+ &:focus-within {
+ background-color: var(--euiColorSecondary) !important;
+ border-color: var(--euiColorSecondary) !important;
+ }
+ }
&:not(:hover) {
span {
color: var(--euiTextSubduedColor);
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Group/styles.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Group/styles.scss
index f11fee8396..f59a9a1f2f 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Group/styles.scss
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Group/styles.scss
@@ -20,7 +20,7 @@
.euiAccordion-isOpen {
min-width: 100%;
&.withBorder {
- border-color: var(--separatorColor)
+ border-color: var(--separatorColor);
}
}
.euiAccordion__triggerWrapper, .euiAccordion__childWrapper {
@@ -34,9 +34,15 @@
button {
padding: 3px 8px;
line-height: 24px;
+ max-height: 30px;
+ &:hover {
+ background-color: var(--hoverInListColorDarken);
+ color: var(--euiTextColor)
+ }
}
.euiListGroupItem__label {
- line-height: 20px;
+ font: normal normal normal 14px/20px Graphik;
+ letter-spacing: -0.14px;
}
}
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalLink/styles.module.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalLink/styles.module.scss
index b573bfa744..d1c4c1ac6e 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalLink/styles.module.scss
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalLink/styles.module.scss
@@ -31,4 +31,5 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ line-height: 24px;
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/InternalPage.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/InternalPage.tsx
index d527998e2a..908175a75c 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/InternalPage.tsx
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/InternalPage.tsx
@@ -1,12 +1,10 @@
import React, { useMemo, useRef, useEffect } from 'react'
import {
- EuiFlexGroup,
- EuiFlexItem,
EuiFlyoutHeader,
- EuiTitle,
EuiText,
- EuiButtonIcon,
+ EuiButtonEmpty,
EuiLoadingContent,
+ EuiHorizontalRule,
} from '@elastic/eui'
import JsxParser from 'react-jsx-parser'
import cx from 'classnames'
@@ -14,11 +12,12 @@ import { debounce } from 'lodash'
import {
LazyCodeButton,
- Carousel,
InternalLink,
Image,
- EmptyPrompt
+ EmptyPrompt,
+ Pagination
} from 'uiSrc/pages/workbench/components/enablament-area/EnablementArea/components'
+import { IEnablementAreaItem } from 'uiSrc/slices/interfaces'
import styles from './styles.module.scss'
import './styles.scss'
@@ -32,10 +31,12 @@ export interface Props {
error?: string;
scrollTop?: number;
onScroll?: (top: number) => void;
+ id: string;
+ pagination?: IEnablementAreaItem[]
}
const InternalPage = (props: Props) => {
- const { onClose, title, backTitle, isLoading, error, content, onScroll, scrollTop } = props
- const components: any = { LazyCodeButton, Carousel, InternalLink, Image }
+ const { onClose, title, backTitle, isLoading, error, content, onScroll, scrollTop, pagination, id } = props
+ const components: any = { LazyCodeButton, InternalLink, Image }
const containerRef = useRef(null)
const handleScroll = debounce(() => {
if (containerRef.current && onScroll) {
@@ -61,37 +62,41 @@ const InternalPage = (props: Props) => {
), [content])
return (
-
+
-
-
-
-
-
-
- {backTitle}
-
-
-
-
-
-
- {title?.toUpperCase()}
-
-
-
+
+
+ {backTitle}
+
+
+
+
+
+
+ {title?.toUpperCase()}
+
-
+
{ isLoading && }
{ !isLoading && error && }
{ !isLoading && !error && contentComponent }
-
+ {!!pagination?.length && (
+ <>
+
+
+ >
+ )}
)
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.module.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.module.scss
index 80eec0a666..84f403651a 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.module.scss
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.module.scss
@@ -3,36 +3,59 @@
@import '@elastic/eui/src/global_styling/index';
.container {
- @include euiScrollBar;
- padding: 10px 12px 0 12px !important;
- overflow: auto;
+ min-height: 1px;
height: 100%;
background-color: var(--euiColorEmptyShade);
text-align: left;
letter-spacing: 0;
color: var(--euiTextSubduedColor) !important;
position: relative;
+ display: flex;
+ flex-direction: column;
}
.header {
- position: fixed;
- left: 0;
- top: 0;
- padding: 10px 4px;
+ padding: 6px 0;
width: 100%;
background-color: var(--euiColorEmptyShade);
+ & > div {
+ width: 100%;
+ padding: 0 18px;
+ }
}
.footer {
- position: fixed;
- left: 0;
- bottom: 0;
width: 100%;
background-color: var(--euiColorEmptyShade);
}
-
-
+.pageTitle {
+ margin: 8px 0 4px;
+ font: normal normal 500 14px/24px Graphik, sans-serif;
+}
+.backButton {
+ padding: 0 4px;
+ max-height: 30px;
+ line-height: 24px;
+ width: 100%;
+ font: normal normal 14px/24px Graphik, sans-serif !important;
+ text-decoration: none;
+ color: var(--euiTextSubduedColor) !important;
+ & > span {
+ justify-content: flex-start;
+ }
+ &:hover {
+ background-color: var(--hoverInListColorDarken);
+ color: var(--euiTextColor) !important;
+ text-decoration: none !important;
+ }
+}
.content {
- padding: 4px 0;
+ @include euiScrollBar;
+ padding: 8px 12px 4px 18px !important;
+ overflow: auto;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
}
+
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.scss
index b7c4ffdeb8..c9f706c717 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.scss
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/styles.scss
@@ -1,13 +1,22 @@
+@mixin font{
+ font: normal normal normal 14px/24px Graphik;
+ letter-spacing: -0.14px;
+ @media only screen and (max-width: 992px) {
+ font: normal normal normal 12px/18px Graphik;
+ letter-spacing: -0.12px;
+ }
+}
+
.enablement-area__page {
height: 100%;
- font: normal normal normal 12px/18px Graphik;
+ @include font;
letter-spacing: -0.12px;
h1, h2, h3, h4, h5, h6 {
color: var(--euiColorGhost);
- font: normal normal medium 12px/16px Graphik;
+ font: normal normal 500 14px/24px Graphik;
margin-bottom: 12px;
- letter-spacing: -0.12px;
+ letter-spacing: 0;
}
p {
@@ -22,7 +31,7 @@
}
}
b, strong {
- font: normal normal normal 12px/16px Graphik;
+ @include font;
letter-spacing: -0.12px;
color: var(--htmlColor);
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx
index 22ee986445..04effd5fd8 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx
@@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react'
import { startCase } from 'lodash'
import { useDispatch, useSelector } from 'react-redux'
import axios from 'axios'
+
import { getApiErrorMessage, isStatusSuccessful } from 'uiSrc/utils'
import { resourcesService } from 'uiSrc/services'
import { IS_ABSOLUTE_PATH } from 'uiSrc/constants/regex'
@@ -11,9 +12,18 @@ import {
appContextWorkbenchEA,
setWorkbenchEAGuideScrollTop
} from 'uiSrc/slices/app/context'
-import { getFileInfo } from '../../utils/getFileInfo'
+import { IEnablementAreaItem } from 'uiSrc/slices/interfaces'
+import { workbenchEnablementAreaSelector } from 'uiSrc/slices/workbench/wb-enablement-area'
+
+import { getFileInfo, getPagesInsideGroup, IFileInfo } from '../../utils/getFileInfo'
import InternalPage from '../InternalPage'
+interface IPageData extends IFileInfo {
+ content: string;
+ relatedPages?: IEnablementAreaItem[];
+}
+const DEFAULT_PAGE_DATA = { content: '', name: '', parent: '', extension: '', location: '', relatedPages: [] }
+
export interface Props {
onClose: () => void;
title?: string;
@@ -22,23 +32,25 @@ export interface Props {
const LazyInternalPage = ({ onClose, title, path }: Props) => {
const { guideScrollTop } = useSelector(appContextWorkbenchEA)
+ const enablementArea = useSelector(workbenchEnablementAreaSelector)
const [isLoading, setLoading] = useState
(false)
const [error, setError] = useState('')
- const [content, setContent] = useState('')
- const pageInfo = getFileInfo(path)
+ const [pageData, setPageData] = useState(DEFAULT_PAGE_DATA)
const dispatch = useDispatch()
const fetchService = IS_ABSOLUTE_PATH.test(path) ? axios : resourcesService
const loadContent = async () => {
setLoading(true)
setError('')
- setContent('')
+ const pageInfo = getFileInfo(path)
+ const relatedPages = getPagesInsideGroup(enablementArea.items, pageInfo.location)
+ setPageData({ ...DEFAULT_PAGE_DATA, ...pageInfo, relatedPages })
try {
const { data, status } = await fetchService.get(path)
if (isStatusSuccessful(status)) {
dispatch(setWorkbenchEAGuide(path))
+ setPageData((prevState) => ({ ...prevState, content: data }))
setLoading(false)
- setContent(data)
}
} catch (error) {
setLoading(false)
@@ -50,9 +62,11 @@ const LazyInternalPage = ({ onClose, title, path }: Props) => {
useEffect(() => {
(async function () {
- await loadContent()
+ if (!enablementArea.loading) {
+ await loadContent()
+ }
}())
- }, [path])
+ }, [path, enablementArea.loading])
const handlePageScroll = (top: number) => {
dispatch(setWorkbenchEAGuideScrollTop(top))
@@ -60,14 +74,16 @@ const LazyInternalPage = ({ onClose, title, path }: Props) => {
return (
)
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/Pagination.spec.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/Pagination.spec.tsx
new file mode 100644
index 0000000000..96cdbd240d
--- /dev/null
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/Pagination.spec.tsx
@@ -0,0 +1,75 @@
+import React from 'react'
+import { fireEvent, render, screen, waitFor } from 'uiSrc/utils/test-utils'
+import { MOCK_ENABLEMENT_AREA_ITEMS } from 'uiSrc/constants'
+import { defaultValue, EnablementAreaProvider } from 'uiSrc/pages/workbench/contexts/enablementAreaContext'
+import Pagination from './Pagination'
+
+const paginationItems = Object.values(MOCK_ENABLEMENT_AREA_ITEMS['quick-guides']?.children || {})
+
+describe('Pagination', () => {
+ it('should render', () => {
+ const component = render()
+ const { queryByTestId } = component
+
+ expect(component).toBeTruthy()
+ expect(queryByTestId('enablement-area__prev-page-btn')).not.toBeInTheDocument()
+ expect(queryByTestId('enablement-area__next-page-btn')).toBeInTheDocument()
+ })
+ it('should correctly open popover', () => {
+ const { queryByTestId } = render(
+
+ )
+ fireEvent.click(screen.getByTestId('enablement-area__pagination-popover-btn'))
+ const popover = queryByTestId('enablement-area__pagination-popover')
+
+ expect(popover).toBeInTheDocument()
+ expect(popover?.querySelectorAll('.pagesItem').length).toEqual(paginationItems.length)
+ expect(popover?.querySelector('.pagesItemActive')).toHaveTextContent(paginationItems[0].label)
+ })
+ it('should correctly open next page', () => {
+ const openPage = jest.fn()
+ const pageIndex = 0
+
+ render(
+
+
+
+ )
+ fireEvent.click(screen.getByTestId('enablement-area__next-page-btn'))
+
+ expect(openPage).toBeCalledWith({ path: paginationItems[pageIndex + 1]?.args?.path })
+ })
+ it('should correctly open previous page', () => {
+ const openPage = jest.fn()
+ const pageIndex = 1
+
+ render(
+
+
+
+ )
+ fireEvent.click(screen.getByTestId('enablement-area__prev-page-btn'))
+
+ expect(openPage).toBeCalledWith({ path: paginationItems[pageIndex - 1]?.args?.path })
+ })
+ it('should correctly open by using pagination popover', async () => {
+ const openPage = jest.fn()
+ const { queryByTestId } = render(
+
+
+
+ )
+
+ fireEvent.click(screen.getByTestId('enablement-area__pagination-popover-btn'))
+ const popover = queryByTestId('enablement-area__pagination-popover')
+ await waitFor(() => {
+ popover?.querySelectorAll('.pagesItem').forEach(async (el) => {
+ fireEvent.click(el)
+ })
+ })
+
+ expect(openPage).toBeCalledTimes(paginationItems.length - 1) // -1 because active item should not be clickable
+ expect(openPage)
+ .lastCalledWith({ path: paginationItems[paginationItems.length - 1]?.args?.path })
+ })
+})
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/Pagination.tsx b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/Pagination.tsx
new file mode 100644
index 0000000000..5f6f9e168d
--- /dev/null
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/Pagination.tsx
@@ -0,0 +1,129 @@
+import React, { useContext, useEffect, useState } from 'react'
+import {
+ EuiButton,
+ EuiContextMenuPanel,
+ EuiContextMenuItem,
+ EuiPopover
+} from '@elastic/eui'
+import cx from 'classnames'
+import { IEnablementAreaItem } from 'uiSrc/slices/interfaces'
+import EnablementAreaContext from 'uiSrc/pages/workbench/contexts/enablementAreaContext'
+
+import styles from './styles.module.scss'
+
+export interface Props {
+ items: IEnablementAreaItem[];
+ activePageId?: string;
+ compressed?: boolean;
+}
+
+const Pagination = ({ items = [], activePageId, compressed }: Props) => {
+ const [isPopoverOpen, setPopover] = useState(false)
+ const [activePage, setActivePage] = useState(0)
+ const { openPage } = useContext(EnablementAreaContext)
+
+ useEffect(() => {
+ if (activePageId) {
+ const index = items.findIndex((item) => item.id === activePageId)
+ setActivePage(index)
+ }
+ }, [activePageId])
+
+ const togglePopover = () => {
+ setPopover(!isPopoverOpen)
+ }
+
+ const closePopover = () => {
+ setPopover(false)
+ }
+
+ const handleOpenPage = (index: number) => {
+ const path = items[index]?.args?.path
+ closePopover()
+ if (index !== activePage && openPage && path) {
+ openPage({ path })
+ }
+ }
+
+ const pages = items.map((item, index) => (
+ handleOpenPage(index)}
+ >
+ {item.label}
+
+ ))
+
+ const PagesControl = () => (
+
+ )
+
+ return (
+
+
+ {activePage > 0 && (
+ handleOpenPage(activePage - 1)}
+ size={compressed ? 's' : 'm'}
+ className={cx(styles.prevPage, { [styles.prevPageCompressed]: compressed })}
+ >
+ Back
+
+ )}
+
+
+
+ {(activePage < items.length - 1) && (
+ handleOpenPage(activePage + 1)}
+ className={cx(styles.nextPage, { [styles.nextPageCompressed]: compressed })}
+ size={compressed ? 's' : 'm'}
+ >
+ Next
+
+ )}
+
+
+ )
+}
+
+export default Pagination
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/index.ts b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/index.ts
new file mode 100644
index 0000000000..1466412190
--- /dev/null
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/index.ts
@@ -0,0 +1,3 @@
+import Pagination from './Pagination'
+
+export default Pagination
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/styles.module.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/styles.module.scss
new file mode 100644
index 0000000000..aae4155116
--- /dev/null
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Pagination/styles.module.scss
@@ -0,0 +1,98 @@
+@import '@elastic/eui/src/global_styling/index';
+
+.pagination {
+ padding: 12px 18px;
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-top: 1px solid var(--separatorColor);
+ & > div:first-of-type,& > div:last-of-type {
+ min-width: 94px;
+ }
+}
+
+.paginationCompressed {
+ padding: 8px 6px;
+ & > div:first-of-type, & > div:last-of-type {
+ min-width: 70px;
+ }
+}
+
+.panel {
+ padding: 1px 0;
+ button:first-of-type {
+ border-radius: 3px 3px 0 0;
+ }
+ button:last-of-type {
+ border-radius: 0 0 2px 2px;
+ }
+}
+
+.popover {
+ border: 1px solid var(--euiColorPrimary) !important;
+ [class~=euiPopover__panelArrow] {
+ &:before {
+ border-top-color: var(--euiColorPrimary) !important;
+ }
+ }
+ [class~=euiPopover__panelArrow--bottom] {
+ &:before {
+ border-bottom-color: var(--euiColorPrimary) !important;
+ }
+ }
+}
+
+.popoverButton {
+ text-decoration: underline;
+ color: var(--euiTextSubduedColor);
+ &:hover, &:focus {
+ color: var(--euiTextColor);
+ }
+ font: normal normal 500 13px/18px Graphik, sans-serif;
+}
+
+.pagesItem {
+ padding: 4px 18px !important;
+ background-color: transparent;
+ text-decoration: none !important;
+ font: normal normal normal 14px/30px Graphik, sans-serif;
+ letter-spacing: 0;
+ span {
+ color: var(--euiTextSubduedColor);
+ }
+ &:focus {
+ background-color: transparent !important;
+ }
+ &:hover {
+ background-color: var(--hoverInListColorLight) !important;
+ span {
+ color: inherit;
+ }
+ }
+}
+
+.pagesItemActive, .pagesItemActive:hover, .pagesItemActive:focus {
+ background-color: var(--euiColorPrimary) !important;
+ cursor: default !important;
+ span {
+ color: var(--euiColorEmptyShade);
+ }
+}
+
+.prevPage, .nextPage {
+ & > span {
+ justify-content: flex-start;
+ }
+}
+
+.prevPageCompressed {
+ & > span {
+ padding: 0 12px 0 4px !important;
+ }
+}
+.nextPageCompressed {
+ & > span {
+ padding: 0 4px 0 12px !important;
+ }
+}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/index.ts b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/index.ts
index f2f8c160d4..651a69e594 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/index.ts
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/index.ts
@@ -1,4 +1,3 @@
-import Carousel from './Carousel'
import CodeButton from './CodeButton'
import EmptyPrompt from './EmptyPrompt'
import Group from './Group'
@@ -8,9 +7,9 @@ import InternalPage from './InternalPage'
import LazyCodeButton from './LazyCodeButton'
import LazyInternalPage from './LazyInternalPage'
import PlainText from './PlainText'
+import Pagination from './Pagination'
export {
- Carousel,
CodeButton,
EmptyPrompt,
Group,
@@ -20,4 +19,5 @@ export {
LazyCodeButton,
LazyInternalPage,
PlainText,
+ Pagination,
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/styles.module.scss b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/styles.module.scss
index 9dfdd67aa4..84a2313734 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/styles.module.scss
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/styles.module.scss
@@ -2,10 +2,11 @@
@import '@elastic/eui/src/components/table/mixins';
@import '@elastic/eui/src/global_styling/index';
+$paddingHorizontal: 18px;
.container {
overflow: hidden;
height: 100%;
- padding: 0 8px;
+ padding: 0 $paddingHorizontal;
background-color: var(--euiColorEmptyShade);
border: 1px solid var(--euiColorLightShade) !important;
}
@@ -20,13 +21,7 @@
color: var(--euiTextSubduedColor) !important;
}
-.item {
- padding: 6px 0;
- min-width: 100%;
-}
-
.internalPage {
- padding-top: 60px;
width: 100%;
max-width: 100%;
position: absolute;
@@ -39,5 +34,5 @@
}
.internalPageVisible {
- transform: translateX(-8px);
+ transform: translateX(-$paddingHorizontal);
}
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.spec.ts b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.spec.ts
index 271ccec5d6..c9f5eb4286 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.spec.ts
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.spec.ts
@@ -1,41 +1,42 @@
-import { getFileInfo } from './getFileInfo'
+import { MOCK_ENABLEMENT_AREA_ITEMS } from 'uiSrc/constants'
+import { getFileInfo, getPagesInsideGroup } from './getFileInfo'
const getFileInfoTests = [
{
- input: '/parent-folder/file-name.txt',
- expected: { title: 'file name', parent: 'parent folder', extension: 'txt' }
+ input: 'static/workbench/quick-guides/file-name.txt',
+ expected: { name: 'file-name', parent: 'quick guides', extension: 'txt', location: '/static/workbench/quick-guides' }
},
{
input: 'parent_folder\\file_name.txt',
- expected: { title: 'file name', parent: 'parent folder', extension: 'txt' }
+ expected: { name: 'file_name', parent: 'parent folder', extension: 'txt', location: '/parent_folder' }
},
{
input: 'https://domen.com/workbench/enablement-area/introduction.html',
- expected: { title: 'introduction', parent: 'enablement area', extension: 'html' }
+ expected: { name: 'introduction', parent: 'enablement area', extension: 'html', location: '/workbench/enablement-area' }
},
{
input: 'https://domen.com/introduction.html',
- expected: { title: 'introduction', parent: '', extension: 'html' }
+ expected: { name: 'introduction', parent: '', extension: 'html', location: '' }
},
{
input: '/introduction.html',
- expected: { title: 'introduction', parent: '', extension: 'html' }
+ expected: { name: 'introduction', parent: '', extension: 'html', location: '' }
},
{
input: '//parent/markdown.md',
- expected: { title: '', parent: '', extension: '' }
+ expected: { name: '', parent: '', extension: '', location: '' }
},
{
input: '/file.txt',
- expected: { title: 'file', parent: '', extension: 'txt' }
+ expected: { name: 'file', parent: '', extension: 'txt', location: '' }
},
{
input: '',
- expected: { title: '', parent: '', extension: '' }
+ expected: { name: '', parent: '', extension: '', location: '' }
},
{
input: '/',
- expected: { title: '', parent: '', extension: '' }
+ expected: { name: '', parent: '', extension: '', location: '' }
},
]
@@ -48,3 +49,33 @@ describe('getFileInfo', () => {
}
)
})
+
+const getPagesInsideGroupTests = [
+ {
+ input: [MOCK_ENABLEMENT_AREA_ITEMS, '/static/workbench/quick-guides'],
+ expected: Object.values(MOCK_ENABLEMENT_AREA_ITEMS['quick-guides'].children || {})
+ },
+ {
+ input: [MOCK_ENABLEMENT_AREA_ITEMS, '/static/workbench/'],
+ expected: [MOCK_ENABLEMENT_AREA_ITEMS['internal-page'], MOCK_ENABLEMENT_AREA_ITEMS['second-internal-page']]
+ },
+ {
+ input: [MOCK_ENABLEMENT_AREA_ITEMS, 'https://domen.com/workbench/enablement-area/'],
+ expected: []
+ },
+ {
+ input: [],
+ expected: []
+ },
+]
+
+describe('getPagesInsideGroup', () => {
+ test.each(getPagesInsideGroupTests)(
+ '%j',
+ ({ input, expected }) => {
+ // @ts-ignore
+ const result = getPagesInsideGroup(...input)
+ expect(result).toEqual(expected)
+ }
+ )
+})
diff --git a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.ts b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.ts
index 545139b93f..e271d0efbd 100644
--- a/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.ts
+++ b/redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo.ts
@@ -1,22 +1,27 @@
+import { get } from 'lodash'
import { API_URL } from 'uiSrc/constants'
import { IS_ABSOLUTE_PATH } from 'uiSrc/constants/regex'
+import { EnablementAreaComponent, IEnablementAreaItem } from 'uiSrc/slices/interfaces'
-interface IFileInfo {
+export interface IFileInfo {
extension: string;
- title: string;
+ name: string;
parent: string;
+ location: string;
}
export const getFileInfo = (path: string): IFileInfo => {
- const result = { extension: '', title: '', parent: '' }
+ const result: IFileInfo = { extension: '', name: '', parent: '', location: '' }
try {
const url = IS_ABSOLUTE_PATH.test(path) ? new URL(path) : new URL(path, API_URL)
const pathNames = url.pathname.split('/')
const file = pathNames.pop() || ''
- const [fileName, extension] = file.split('.')
+
+ result.location = pathNames.join('/')
const parent = pathNames.pop() || ''
+ const [fileName, extension] = file.split('.')
if (fileName) {
- result.title = fileName.replace(/[-_]+/g, ' ')
+ result.name = fileName
}
if (extension) {
result.extension = extension
@@ -29,3 +34,31 @@ export const getFileInfo = (path: string): IFileInfo => {
return result
}
}
+
+const EA_STATIC_PATH_REGEX = /^\/?static\/(workbench|enablement-area)\//
+const EA_STATIC_ROOT_PATH = /^\/?static\/(workbench|enablement-area)\/?$/
+
+export const getPagesInsideGroup = (
+ structure: Record,
+ path: string
+): IEnablementAreaItem[] => {
+ try {
+ if (EA_STATIC_PATH_REGEX.test(path)) {
+ let groupPath = path.replace(EA_STATIC_PATH_REGEX, '')
+ let groupChildren
+ if (!EA_STATIC_ROOT_PATH.test(path)) {
+ groupPath = groupPath.replace('/', '.children.')
+ groupChildren = get(structure, groupPath, undefined)?.children
+ } else {
+ groupChildren = structure
+ }
+ if (groupChildren) {
+ return Object.values(groupChildren)
+ .filter((item) => item.type === EnablementAreaComponent.InternalLink)
+ }
+ }
+ return []
+ } catch (e) {
+ return []
+ }
+}
diff --git a/redisinsight/ui/src/slices/interfaces/workbench.ts b/redisinsight/ui/src/slices/interfaces/workbench.ts
index f0c3ae8baf..ff786c27ce 100644
--- a/redisinsight/ui/src/slices/interfaces/workbench.ts
+++ b/redisinsight/ui/src/slices/interfaces/workbench.ts
@@ -22,12 +22,12 @@ export interface IEnablementAreaItem {
id: string,
type: EnablementAreaComponent,
label: string,
- children?: IEnablementAreaItem[],
+ children?: Record,
args?: Record,
}
export interface StateWorkbenchEnablementArea {
loading: boolean;
error: string;
- items: IEnablementAreaItem[];
+ items: Record;
}
diff --git a/redisinsight/ui/src/slices/tests/workbench/wb-enablement-area.spec.ts b/redisinsight/ui/src/slices/tests/workbench/wb-enablement-area.spec.ts
index 27fb1861c8..23aeeddd4e 100644
--- a/redisinsight/ui/src/slices/tests/workbench/wb-enablement-area.spec.ts
+++ b/redisinsight/ui/src/slices/tests/workbench/wb-enablement-area.spec.ts
@@ -61,7 +61,7 @@ describe('slices', () => {
describe('getWBEnablementAreaSuccess', () => {
it('should properly set state after success', () => {
// Arrange
- const items: IEnablementAreaItem[] = MOCK_ENABLEMENT_AREA_ITEMS
+ const items: Record = MOCK_ENABLEMENT_AREA_ITEMS
const state = {
...initialState,
items,
diff --git a/redisinsight/ui/src/slices/workbench/wb-enablement-area.ts b/redisinsight/ui/src/slices/workbench/wb-enablement-area.ts
index a570b34aa1..bae21f1897 100644
--- a/redisinsight/ui/src/slices/workbench/wb-enablement-area.ts
+++ b/redisinsight/ui/src/slices/workbench/wb-enablement-area.ts
@@ -6,8 +6,8 @@ import { EnablementAreaComponent, IEnablementAreaItem, StateWorkbenchEnablementA
import { AppDispatch, RootState } from '../store'
-export const defaultItems: IEnablementAreaItem[] = [
- {
+export const defaultItems: Record = {
+ manual: {
type: EnablementAreaComponent.CodeButton,
id: 'manual',
label: 'Manual',
@@ -15,11 +15,11 @@ export const defaultItems: IEnablementAreaItem[] = [
content: MONACO_MANUAL,
}
}
-]
+}
export const initialState: StateWorkbenchEnablementArea = {
loading: false,
error: '',
- items: [],
+ items: {},
}
// A slice for recipes
@@ -61,7 +61,8 @@ export function fetchEnablementArea(onSuccessAction?: () => void, onFailAction?:
dispatch(getWBEnablementArea())
try {
- const { data, status } = await resourcesService.get(ApiEndpoints.ENABLEMENT_AREA)
+ const { data, status } = await resourcesService
+ .get>(ApiEndpoints.ENABLEMENT_AREA)
if (isStatusSuccessful(status)) {
dispatch(getWBEnablementAreaSuccess(data))
diff --git a/redisinsight/ui/src/styles/themes/dark_theme/_dark_theme.lazy.scss b/redisinsight/ui/src/styles/themes/dark_theme/_dark_theme.lazy.scss
index f808273d44..732506a7e5 100644
--- a/redisinsight/ui/src/styles/themes/dark_theme/_dark_theme.lazy.scss
+++ b/redisinsight/ui/src/styles/themes/dark_theme/_dark_theme.lazy.scss
@@ -84,6 +84,7 @@
--controlsLabelColor: #{$controlsLabelColor};
--hoverInListColor: #{$hoverInListColor};
--hoverInListColorLight: #{$hoverInListColorLight};
+ --hoverInListColorDarken: #{$hoverInListColorDarken};
--externalLinkColor: #{$externalLinkColor};
--externalLinkTooltipColor: #{$externalLinkTooltipColor};
diff --git a/redisinsight/ui/src/styles/themes/dark_theme/_theme_color.scss b/redisinsight/ui/src/styles/themes/dark_theme/_theme_color.scss
index 9530883b9a..a7fd414d57 100644
--- a/redisinsight/ui/src/styles/themes/dark_theme/_theme_color.scss
+++ b/redisinsight/ui/src/styles/themes/dark_theme/_theme_color.scss
@@ -61,6 +61,7 @@ $buttonDangerHoverColor: #E8524A;
$hoverInListColor: #070707;
$hoverInListColorLight: #465282;
+$hoverInListColorDarken: #292F47;
$textColorShade: #b5b6c0;
$cliOutputResponseColor: #ffffff;
$cliOutputResponseFailColor: #e06c75;
diff --git a/redisinsight/ui/src/styles/themes/light_theme/_light_theme.lazy.scss b/redisinsight/ui/src/styles/themes/light_theme/_light_theme.lazy.scss
index ce0bb6deae..314f4df6f6 100644
--- a/redisinsight/ui/src/styles/themes/light_theme/_light_theme.lazy.scss
+++ b/redisinsight/ui/src/styles/themes/light_theme/_light_theme.lazy.scss
@@ -86,6 +86,7 @@
--controlsLabelHoverColor: #{$controlsLabelHoverColor};
--hoverInListColor: #{$hoverInListColor};
--hoverInListColorLight: #{$hoverInListColor};
+ --hoverInListColorDarken: #{$hoverInListColorLight};
--externalLinkColor: #{$externalLinkColor};
--externalLinkTooltipColor: #{$externalLinkTooltipColor};