bfg-common 1.1.63 → 1.1.64

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.
Files changed (92) hide show
  1. package/assets/localization/local_be.json +1 -1
  2. package/assets/localization/local_hy.json +1 -1
  3. package/assets/localization/local_kk.json +1 -1
  4. package/assets/localization/local_ru.json +1 -1
  5. package/components/atoms/alert/Notification.vue +167 -167
  6. package/components/atoms/autocomplete/Autocomplete.vue +236 -236
  7. package/components/atoms/datepicker/Datepicker.vue +612 -612
  8. package/components/atoms/list/SelectList.vue +62 -62
  9. package/components/atoms/nav/NavBar.vue +116 -116
  10. package/components/atoms/nav/VerticalNavBar.vue +89 -89
  11. package/components/atoms/notificationBar/NotificationBar.vue +175 -175
  12. package/components/atoms/perPage/PerPage.vue +52 -52
  13. package/components/atoms/popup/SimplePopup.vue +90 -90
  14. package/components/atoms/step/VerticalStep.vue +104 -104
  15. package/components/atoms/switch/Switch.vue +107 -107
  16. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +206 -206
  17. package/components/atoms/table/dataGrid/DataGridPage.vue +189 -189
  18. package/components/atoms/tabs/Tabs.vue +189 -189
  19. package/components/atoms/tooltip/Signpost.vue +224 -224
  20. package/components/common/adapterManager/AddAdapterWarningModal.vue +82 -82
  21. package/components/common/adapterManager/NoActiveAdaptersModal.vue +62 -62
  22. package/components/common/adapterManager/NoConnectedActiveAdaptersModal.vue +62 -62
  23. package/components/common/browse/Browse.vue +182 -182
  24. package/components/common/browse/blocks/Title.vue +66 -66
  25. package/components/common/diagramMain/Diagram.vue +186 -186
  26. package/components/common/diagramMain/DiagramMain.vue +986 -986
  27. package/components/common/diagramMain/adapter/AdapterItem.vue +227 -227
  28. package/components/common/diagramMain/adapter/AdapterItems.vue +57 -57
  29. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +339 -339
  30. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +202 -202
  31. package/components/common/diagramMain/modals/remove/RemoveModal.vue +226 -226
  32. package/components/common/diagramMain/network/Contents.vue +238 -238
  33. package/components/common/feedback/Buttons.vue +232 -232
  34. package/components/common/feedback/Message.vue +468 -468
  35. package/components/common/feedback/VisitPortal.vue +54 -54
  36. package/components/common/graph/Graph.vue +18 -20
  37. package/components/common/help/navbar/left/Left.vue +159 -159
  38. package/components/common/help/navbar/left/utils/constructAccordion.ts +27 -27
  39. package/components/common/mainNavigationPanel/MainNavigationPanel.vue +359 -359
  40. package/components/common/modals/Rename.vue +165 -165
  41. package/components/common/monitor/advanced/Advanced.vue +3 -33
  42. package/components/common/monitor/advanced/GraphView.vue +4 -4
  43. package/components/common/monitor/advanced/table/Table.vue +5 -5
  44. package/components/common/monitor/advanced/tools/Tools.vue +27 -91
  45. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +17 -101
  46. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +7 -25
  47. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/config/utils.ts +0 -55
  48. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/models/interfaces.ts +1 -1
  49. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +3 -32
  50. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/form/Form.vue +8 -25
  51. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +19 -41
  52. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/models/interfaces.ts +1 -1
  53. package/components/common/monitor/advanced/tools/config/advancedToolbar.ts +38 -50
  54. package/components/common/monitor/config/getValidDateByOption.ts +6 -105
  55. package/components/common/monitor/overview/filters/Filters.vue +6 -6
  56. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +8 -8
  57. package/components/common/monitor/overview/filters/customIntervalModal/config/dateChecker.ts +1 -1
  58. package/components/common/perPage/PerPage.vue +51 -51
  59. package/components/common/recursionTree/RecursionTree.vue +201 -201
  60. package/components/common/vm/actions/add/customizeHardware/virtualHardware/VirtualHardware.vue +641 -642
  61. package/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +245 -274
  62. package/components/common/vm/actions/add/customizeHardware/virtualHardware/cpu/Cpu.vue +375 -375
  63. package/components/common/vm/actions/add/customizeHardware/virtualHardware/limit/Limit.vue +234 -234
  64. package/components/common/vm/actions/add/customizeHardware/virtualHardware/limit/config/options.ts +28 -28
  65. package/components/common/vm/actions/add/customizeHardware/virtualHardware/memory/Memory.vue +316 -316
  66. package/components/common/vm/actions/add/customizeHardware/virtualHardware/memory/config/memoryOptions.ts +35 -35
  67. package/components/common/vm/actions/add/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +447 -447
  68. package/components/common/vm/actions/add/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +1 -1
  69. package/components/common/vm/actions/add/customizeHardware/virtualHardware/reservation/Reservation.vue +235 -235
  70. package/components/common/vm/actions/add/customizeHardware/vmoptions/bootOptions/order/Order.vue +203 -195
  71. package/components/common/vm/actions/add/select/storage/config/config.ts +154 -154
  72. package/components/common/wizards/datastore/add/nfs/configuration/Configuration.vue +373 -373
  73. package/components/common/wizards/datastore/add/nfs/configuration/serversList/ServersList.vue +123 -123
  74. package/components/common/wizards/datastore/add/nfs/kerberosAuthentication/KerberosAuthentication.vue +54 -54
  75. package/components/common/wizards/datastore/add/sharedStorm/deviceSelection/hostTable/HostTable.vue +131 -131
  76. package/components/common/wizards/datastore/add/sharedStorm/partitionConfiguration/PartitionConfiguration.vue +230 -230
  77. package/models/store/interfaces.ts +37 -37
  78. package/models/store/storage/interfaces.ts +32 -32
  79. package/models/store/types.ts +32 -32
  80. package/modules/fixContentBuild/utils/methods.ts +114 -114
  81. package/package.json +1 -1
  82. package/public/spice-console/application/codec.js +257 -257
  83. package/public/spice-console/lib/rasterEngine.js +907 -907
  84. package/public/spice-console/network/spicechannel.js +369 -369
  85. package/public/spice-console-minify/lib/decoder/dixie.min.js +4 -4
  86. package/public/spice-console-minify/lib/jgestures.min.js +24 -24
  87. package/public/spice-console-minify/lib/jquery-2.0.3.min.js +24 -24
  88. package/public/spice-console-minify/lib/jquery-mousewheel.min.js +11 -11
  89. package/public/spice-console-minify/lib/jquery-visibility.min.js +1 -1
  90. package/public/spice-console-minify/lib/lodash.4.0.0.min.js +5 -5
  91. package/utils/contentBuild.ts +34 -34
  92. package/components/common/monitor/advanced/tools/utils/countCores.ts +0 -7
@@ -1,54 +1,54 @@
1
- <template>
2
- <div>
3
- <div class="modal-body">
4
- <div>
5
- {{ localization.useOurExternalIdeasPortal }}
6
- </div>
7
- <a id="portal-link" :href="portalLink" target="_blank">
8
- <button id="visit-ideas-portal-button" class="btn btn-outline wrap">
9
- <span class="text"> {{ localization.visitIdeasPortal }} </span>
10
- <atoms-the-icon2 class="btn-icon" name="pop-out" />
11
- </button>
12
- </a>
13
- </div>
14
- </div>
15
- </template>
16
-
17
- <script setup lang="ts">
18
- import { UI_I_Localization } from '~/models/interfaces'
19
- const localization = computed<UI_I_Localization>(() => useLocal())
20
- const portalLink = ref<string>('#')
21
- </script>
22
-
23
- <style scoped lang="scss">
24
- .modal-body {
25
- padding: 0;
26
- a {
27
- text-decoration: none;
28
-
29
- .btn.btn-outline.wrap {
30
- display: flex;
31
- flex-direction: row;
32
- align-items: center;
33
-
34
- .text {
35
- color: var(--icon-fill-hover-color);
36
- }
37
- & .btn-icon {
38
- width: 16px;
39
- height: 16px;
40
- margin-left: 5px;
41
- fill: var(--icon-fill-hover-color);
42
- }
43
- }
44
- }
45
- }
46
- </style>
47
- <style>
48
- :root {
49
- --icon-fill-hover-color: rgb(0, 121, 184);
50
- }
51
- :root.dark-theme {
52
- --icon-fill-hover-color: rgb(73, 175, 217);
53
- }
54
- </style>
1
+ <template>
2
+ <div>
3
+ <div class="modal-body">
4
+ <div>
5
+ {{ localization.useOurExternalIdeasPortal }}
6
+ </div>
7
+ <a id="portal-link" :href="portalLink" target="_blank">
8
+ <button id="visit-ideas-portal-button" class="btn btn-outline wrap">
9
+ <span class="text"> {{ localization.visitIdeasPortal }} </span>
10
+ <atoms-the-icon2 class="btn-icon" name="pop-out" />
11
+ </button>
12
+ </a>
13
+ </div>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { UI_I_Localization } from '~/models/interfaces'
19
+ const localization = computed<UI_I_Localization>(() => useLocal())
20
+ const portalLink = ref<string>('#')
21
+ </script>
22
+
23
+ <style scoped lang="scss">
24
+ .modal-body {
25
+ padding: 0;
26
+ a {
27
+ text-decoration: none;
28
+
29
+ .btn.btn-outline.wrap {
30
+ display: flex;
31
+ flex-direction: row;
32
+ align-items: center;
33
+
34
+ .text {
35
+ color: var(--icon-fill-hover-color);
36
+ }
37
+ & .btn-icon {
38
+ width: 16px;
39
+ height: 16px;
40
+ margin-left: 5px;
41
+ fill: var(--icon-fill-hover-color);
42
+ }
43
+ }
44
+ }
45
+ }
46
+ </style>
47
+ <style>
48
+ :root {
49
+ --icon-fill-hover-color: rgb(0, 121, 184);
50
+ }
51
+ :root.dark-theme {
52
+ --icon-fill-hover-color: rgb(73, 175, 217);
53
+ }
54
+ </style>
@@ -26,27 +26,27 @@ const props = defineProps<{
26
26
  selectedRow?: number[]
27
27
  }>()
28
28
 
29
- let localChart: any = null
29
+ let chart: any = null
30
30
  const exportChart = (type: string): void => {
31
31
  if (type === 'png') {
32
- localChart.exportChart({
32
+ chart.exportChart({
33
33
  type: 'image/png',
34
34
  })
35
35
  } else if (type === 'jpeg') {
36
- localChart.exportChart({
36
+ chart.exportChart({
37
37
  type: 'image/jpeg',
38
38
  })
39
39
  } else if (type === 'svg') {
40
- localChart.exportChart({
40
+ chart.exportChart({
41
41
  type: 'image/svg+xml',
42
42
  })
43
43
  } else if (type === 'csv') {
44
- localChart.downloadCSV()
44
+ chart.downloadCSV()
45
45
  }
46
46
  }
47
47
 
48
48
  const chartOptions = ref<I_LineGraph | I_DiskGraph | null>(null)
49
- const initGraph = (): void => {
49
+ const initGraph = () => {
50
50
  if (!props.data) return
51
51
  setTimeout(() => {
52
52
  chartOptions.value = props.data
@@ -55,44 +55,42 @@ const initGraph = (): void => {
55
55
 
56
56
  watch(
57
57
  () => props.update,
58
- (newValue) => {
59
- newValue && initGraph()
58
+ (val) => {
59
+ val && initGraph()
60
60
  },
61
61
  { immediate: true }
62
62
  )
63
63
 
64
64
  watch(
65
65
  () => props.exportType,
66
- (newValue) => {
67
- if (!newValue) return
66
+ (val) => {
67
+ if (!val) return
68
68
 
69
- exportChart(newValue)
69
+ exportChart(val)
70
70
  }
71
71
  )
72
72
 
73
73
  watch(
74
74
  () => props.chart,
75
- (newValue) => {
76
- if (newValue.series) localChart = newValue
75
+ (val) => {
76
+ if (val.series) chart = val
77
77
  },
78
78
  { deep: true }
79
79
  )
80
80
 
81
81
  const updateSeriesStrokeWidth = (data: number[]): void => {
82
- if (!localChart) return
82
+ if (!chart) return
83
83
 
84
- localChart.series.forEach((_: any, key: number) => {
85
- localChart.options.series[key].lineWidth = 1.5
84
+ chart.series.forEach((_: any, key: number) => {
85
+ chart.options.series[key].lineWidth = 1.5
86
86
 
87
- if (data.includes(key)) localChart.options.series[key].lineWidth = 3
87
+ if (data.includes(key)) chart.options.series[key].lineWidth = 3
88
88
  })
89
-
90
- localChart.update(localChart.options)
91
89
  }
92
90
 
93
91
  watch(
94
92
  () => props.selectedRow,
95
- (newValue) => newValue && updateSeriesStrokeWidth(newValue)
93
+ (val) => val && updateSeriesStrokeWidth(val)
96
94
  )
97
95
  </script>
98
96
 
@@ -1,159 +1,159 @@
1
- <template>
2
- <div class="left-navbar">
3
- <div class="header-content">
4
- <button
5
- class="btn-trigger-collapsed-all"
6
- @click="onToggleAccordionShowType"
7
- >
8
- <atoms-the-icon
9
- :class="[
10
- 'trigger-icon',
11
- {
12
- isOpen: isCollapsed,
13
- },
14
- ]"
15
- name="angle"
16
- />
17
- <span v-if="isCollapsed">{{ localization.collapseAll }}</span>
18
- <span v-else>{{ localization.expandAll }}</span>
19
- </button>
20
- </div>
21
- <common-accordion
22
- :accordion="accordionItems"
23
- :show-type="accordionShowType"
24
- test-id="accordion-left-navbar"
25
- />
26
- </div>
27
- </template>
28
-
29
- <script setup lang="ts">
30
- import type { UI_I_Localization } from '~/models/interfaces'
31
- import type { UI_T_ShowType } from '~/components/common/accordion/models/types'
32
- import type { UI_I_AccordionRecursion } from '~/components/common/accordion/models/interfaces'
33
- import type { UI_I_ContentNavigation } from '~/components/common/help/navbar/left/models/interfaces'
34
- import { constructItems } from '~/components/common/help/navbar/left/utils/constructAccordion'
35
-
36
- const props = defineProps<{
37
- items: UI_I_ContentNavigation[] | null
38
- }>()
39
-
40
- const localization = computed<UI_I_Localization>(() => useLocal())
41
-
42
- const accordionShowType = ref<UI_T_ShowType>('default')
43
- const isCollapsed = computed<boolean>(
44
- () => accordionShowType.value === 'collapse'
45
- )
46
-
47
- const onToggleAccordionShowType = (): void => {
48
- accordionShowType.value =
49
- accordionShowType.value === 'collapse' ? 'expand' : 'collapse'
50
- }
51
-
52
- const accordionItems = ref<UI_I_AccordionRecursion[]>([])
53
-
54
- watch(
55
- () => props.items,
56
- (newValue) => {
57
- if (newValue === null) return
58
-
59
- accordionItems.value = constructItems(newValue)
60
- },
61
- { deep: true, immediate: true }
62
- )
63
- </script>
64
-
65
- <style lang="scss">
66
- .left-navbar {
67
- width: 350px;
68
- overflow: auto;
69
- position: sticky;
70
- top: 0;
71
- border: 0.5px solid var(--global-border-color);
72
-
73
- .header-content {
74
- border-bottom: 0.5px solid var(--global-border-color);
75
- padding: 11px 16px 11px 5px;
76
- background-color: #fff;
77
- position: sticky;
78
- top: 0;
79
- z-index: 1;
80
-
81
- .btn-trigger-collapsed-all {
82
- display: flex;
83
- align-items: center;
84
- gap: 5px;
85
- cursor: pointer;
86
- background-color: unset;
87
- border: unset;
88
-
89
- .trigger-icon {
90
- width: 16px;
91
- height: 16px;
92
- transform: rotate(180deg);
93
- fill: var(--triger-icon-color);
94
- &.isOpen {
95
- transform: rotate(0deg);
96
- }
97
- }
98
-
99
- span {
100
- color: #0079b8;
101
- font-size: 12px;
102
- font-weight: bold;
103
- }
104
- }
105
- }
106
-
107
- .accordion {
108
- .accordion-item.active {
109
- background-color: #fafafa;
110
- color: unset;
111
- }
112
-
113
- .router-link-exact-active {
114
- .text {
115
- font-weight: bold !important;
116
- background-color: #e6f4fb !important;
117
- }
118
- }
119
-
120
- .heading-wrap {
121
- flex-direction: row-reverse;
122
- border: unset !important;
123
- margin-bottom: 0 !important;
124
- background-color: unset !important;
125
-
126
- .btn-trigger {
127
- flex: 0;
128
- }
129
- }
130
-
131
- .text {
132
- font-weight: normal !important;
133
- font-size: 14px;
134
- width: 100%;
135
- padding: 6px 6px 6px 0;
136
- }
137
- }
138
- }
139
-
140
- html.dark-theme {
141
- .left-navbar {
142
- .header-content {
143
- background-color: transparent;
144
- }
145
-
146
- .accordion {
147
- .accordion-item.active {
148
- background-color: transparent;
149
- }
150
- }
151
-
152
- .router-link-exact-active {
153
- .text {
154
- background-color: #29414e!important;
155
- }
156
- }
157
- }
158
- }
159
- </style>
1
+ <template>
2
+ <div class="left-navbar">
3
+ <div class="header-content">
4
+ <button
5
+ class="btn-trigger-collapsed-all"
6
+ @click="onToggleAccordionShowType"
7
+ >
8
+ <atoms-the-icon
9
+ :class="[
10
+ 'trigger-icon',
11
+ {
12
+ isOpen: isCollapsed,
13
+ },
14
+ ]"
15
+ name="angle"
16
+ />
17
+ <span v-if="isCollapsed">{{ localization.collapseAll }}</span>
18
+ <span v-else>{{ localization.expandAll }}</span>
19
+ </button>
20
+ </div>
21
+ <common-accordion
22
+ :accordion="accordionItems"
23
+ :show-type="accordionShowType"
24
+ test-id="accordion-left-navbar"
25
+ />
26
+ </div>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import type { UI_I_Localization } from '~/models/interfaces'
31
+ import type { UI_T_ShowType } from '~/components/common/accordion/models/types'
32
+ import type { UI_I_AccordionRecursion } from '~/components/common/accordion/models/interfaces'
33
+ import type { UI_I_ContentNavigation } from '~/components/common/help/navbar/left/models/interfaces'
34
+ import { constructItems } from '~/components/common/help/navbar/left/utils/constructAccordion'
35
+
36
+ const props = defineProps<{
37
+ items: UI_I_ContentNavigation[] | null
38
+ }>()
39
+
40
+ const localization = computed<UI_I_Localization>(() => useLocal())
41
+
42
+ const accordionShowType = ref<UI_T_ShowType>('default')
43
+ const isCollapsed = computed<boolean>(
44
+ () => accordionShowType.value === 'collapse'
45
+ )
46
+
47
+ const onToggleAccordionShowType = (): void => {
48
+ accordionShowType.value =
49
+ accordionShowType.value === 'collapse' ? 'expand' : 'collapse'
50
+ }
51
+
52
+ const accordionItems = ref<UI_I_AccordionRecursion[]>([])
53
+
54
+ watch(
55
+ () => props.items,
56
+ (newValue) => {
57
+ if (newValue === null) return
58
+
59
+ accordionItems.value = constructItems(newValue)
60
+ },
61
+ { deep: true, immediate: true }
62
+ )
63
+ </script>
64
+
65
+ <style lang="scss">
66
+ .left-navbar {
67
+ width: 350px;
68
+ overflow: auto;
69
+ position: sticky;
70
+ top: 0;
71
+ border: 0.5px solid var(--global-border-color);
72
+
73
+ .header-content {
74
+ border-bottom: 0.5px solid var(--global-border-color);
75
+ padding: 11px 16px 11px 5px;
76
+ background-color: #fff;
77
+ position: sticky;
78
+ top: 0;
79
+ z-index: 1;
80
+
81
+ .btn-trigger-collapsed-all {
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 5px;
85
+ cursor: pointer;
86
+ background-color: unset;
87
+ border: unset;
88
+
89
+ .trigger-icon {
90
+ width: 16px;
91
+ height: 16px;
92
+ transform: rotate(180deg);
93
+ fill: var(--triger-icon-color);
94
+ &.isOpen {
95
+ transform: rotate(0deg);
96
+ }
97
+ }
98
+
99
+ span {
100
+ color: #0079b8;
101
+ font-size: 12px;
102
+ font-weight: bold;
103
+ }
104
+ }
105
+ }
106
+
107
+ .accordion {
108
+ .accordion-item.active {
109
+ background-color: #fafafa;
110
+ color: unset;
111
+ }
112
+
113
+ .router-link-exact-active {
114
+ .text {
115
+ font-weight: bold !important;
116
+ background-color: #e6f4fb !important;
117
+ }
118
+ }
119
+
120
+ .heading-wrap {
121
+ flex-direction: row-reverse;
122
+ border: unset !important;
123
+ margin-bottom: 0 !important;
124
+ background-color: unset !important;
125
+
126
+ .btn-trigger {
127
+ flex: 0;
128
+ }
129
+ }
130
+
131
+ .text {
132
+ font-weight: normal !important;
133
+ font-size: 14px;
134
+ width: 100%;
135
+ padding: 6px 6px 6px 0;
136
+ }
137
+ }
138
+ }
139
+
140
+ html.dark-theme {
141
+ .left-navbar {
142
+ .header-content {
143
+ background-color: transparent;
144
+ }
145
+
146
+ .accordion {
147
+ .accordion-item.active {
148
+ background-color: transparent;
149
+ }
150
+ }
151
+
152
+ .router-link-exact-active {
153
+ .text {
154
+ background-color: #29414e!important;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ </style>
@@ -1,27 +1,27 @@
1
- import type { UI_I_ContentNavigation } from '~/components/common/help/navbar/left/models/interfaces'
2
- import type { UI_I_AccordionRecursion } from '~/components/common/accordion/models/interfaces'
3
-
4
- export const constructItems = (
5
- items?: UI_I_ContentNavigation[],
6
- parent?: UI_I_ContentNavigation
7
- ): UI_I_AccordionRecursion[] => {
8
- if (!items) return []
9
-
10
- return items
11
- .filter((item) => {
12
- return (
13
- !parent || (item.title !== parent.title && item._path !== parent._path)
14
- )
15
- })
16
- .map((item: UI_I_ContentNavigation): UI_I_AccordionRecursion => {
17
- const children = constructItems(item.children, item)
18
- return {
19
- children,
20
- id: item._path,
21
- path: item._path,
22
- name: item.title,
23
- hasChild: !!children.length,
24
- isOpen: !parent,
25
- }
26
- })
27
- }
1
+ import type { UI_I_ContentNavigation } from '~/components/common/help/navbar/left/models/interfaces'
2
+ import type { UI_I_AccordionRecursion } from '~/components/common/accordion/models/interfaces'
3
+
4
+ export const constructItems = (
5
+ items?: UI_I_ContentNavigation[],
6
+ parent?: UI_I_ContentNavigation
7
+ ): UI_I_AccordionRecursion[] => {
8
+ if (!items) return []
9
+
10
+ return items
11
+ .filter((item) => {
12
+ return (
13
+ !parent || (item.title !== parent.title && item._path !== parent._path)
14
+ )
15
+ })
16
+ .map((item: UI_I_ContentNavigation): UI_I_AccordionRecursion => {
17
+ const children = constructItems(item.children, item)
18
+ return {
19
+ children,
20
+ id: item._path,
21
+ path: item._path,
22
+ name: item.title,
23
+ hasChild: !!children.length,
24
+ isOpen: !parent,
25
+ }
26
+ })
27
+ }