bfg-common 1.5.43 → 1.5.45

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 (185) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  3. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  4. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  5. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  6. package/assets/scss/common/normalize.scss +339 -339
  7. package/components/atoms/TheIcon3.vue +50 -50
  8. package/components/atoms/collapse/CollapseNav.vue +165 -165
  9. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  10. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  11. package/components/atoms/perPage/PerPage.vue +58 -58
  12. package/components/atoms/stack/StackBlock.vue +185 -185
  13. package/components/atoms/table/dataGrid/DataGrid.vue +1 -1
  14. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  15. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  16. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  17. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  18. package/components/atoms/tooltip/Signpost.vue +227 -227
  19. package/components/common/accordion/Recursion.vue +222 -222
  20. package/components/common/browse/BrowseNew.vue +237 -237
  21. package/components/common/browse/BrowseOld.vue +217 -217
  22. package/components/common/browse/blocks/contents/Files.vue +37 -37
  23. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  24. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  25. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  26. package/components/common/context/Context.vue +111 -111
  27. package/components/common/context/lib/models/interfaces.ts +31 -31
  28. package/components/common/context/recursion/Recursion.vue +87 -87
  29. package/components/common/context/recursion/RecursionNew.vue +238 -238
  30. package/components/common/context/recursion/RecursionOld.vue +228 -228
  31. package/components/common/details/DetailsItem.vue +109 -109
  32. package/components/common/diagramMain/DiagramMain.vue +897 -897
  33. package/components/common/diagramMain/Header.vue +214 -214
  34. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  35. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  36. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  37. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +336 -336
  38. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  39. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  40. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  41. package/components/common/pages/home/StatusContent.vue +49 -49
  42. package/components/common/pages/home/headline/Headline.vue +45 -45
  43. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  44. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  45. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  46. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  47. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  48. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  49. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  50. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  51. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  52. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  53. package/components/common/pages/licensing/Licensing.vue +128 -0
  54. package/components/common/pages/licensing/lib/models/interfaces.ts +22 -0
  55. package/components/common/pages/licensing/lib/utils/validation.ts +29 -0
  56. package/components/common/pages/licensing/listView/ListView.vue +50 -0
  57. package/components/common/pages/licensing/listView/lib/config/list.ts +57 -0
  58. package/components/common/pages/licensing/listView/lib/models/interfaces.ts +5 -0
  59. package/components/common/pages/licensing/modals/assign/Assign.vue +247 -0
  60. package/components/common/pages/licensing/modals/assign/lib/config/tabsPannel.ts +17 -0
  61. package/components/common/pages/licensing/modals/assign/lib/models/interfaces.ts +5 -0
  62. package/components/common/pages/licensing/modals/assign/lib/utils/error.ts +25 -0
  63. package/components/common/pages/licensing/modals/assign/new/New.vue +216 -0
  64. package/components/common/pages/licensing/modals/assign/tableView/TableView.vue +193 -0
  65. package/components/common/pages/licensing/modals/assign/tableView/lib/config/table.ts +100 -0
  66. package/components/common/pages/licensing/modals/assign/tableView/lib/config/tableKeys.ts +10 -0
  67. package/components/common/pages/licensing/modals/assign/tableView/lib/models/interfaces.ts +9 -0
  68. package/components/common/pages/licensing/modals/assign/tableView/lib/models/types.ts +8 -0
  69. package/components/common/pages/packages/Packages.vue +208 -208
  70. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  71. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  72. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  73. package/components/common/portlets/tag/Portlet.vue +433 -433
  74. package/components/common/recursionTree/RecursionTree.vue +223 -223
  75. package/components/common/select/button/ButtonDropdown.vue +108 -108
  76. package/components/common/spiceConsole/Drawer.vue +370 -370
  77. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  78. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  79. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  80. package/components/common/split/vertical/Vertical.vue +160 -160
  81. package/components/common/tools/Actions.vue +188 -188
  82. package/components/common/vm/actions/add/Add.vue +774 -774
  83. package/components/common/vm/actions/add/lib/config/steps.ts +247 -247
  84. package/components/common/vm/actions/clone/Clone.vue +798 -798
  85. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  86. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  87. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  88. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  89. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  90. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  152. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  160. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  161. package/components/common/vm/actions/common/select/createType/CreateType.vue +74 -74
  162. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  163. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  164. package/components/common/vm/actions/common/select/template/Template.vue +65 -65
  165. package/components/common/vm/actions/common/select/template/TemplateTreeView.vue +88 -88
  166. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  167. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  168. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  169. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  170. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  171. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  172. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  173. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  174. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  175. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  176. package/composables/productNameLocal.ts +30 -30
  177. package/composables/useAppVersion.ts +21 -21
  178. package/package.json +1 -1
  179. package/plugins/date.ts +233 -233
  180. package/plugins/directives.ts +24 -24
  181. package/public/spice-console/lib/images/bitmap.js +203 -203
  182. package/public/spice-console/network/spicechannel.js +383 -383
  183. package/store/main/mutations.ts +7 -7
  184. package/store/main/state.ts +7 -7
  185. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,20 +1,20 @@
1
- import type {UI_I_Card, UI_I_Vms} from "~/components/common/pages/home/lib/models/interfaces";
2
-
3
- export const itemsFunc = (vms: UI_I_Vms): UI_I_Card[] => [
4
- {
5
- value: vms.powered_on,
6
- text: 'powered_on',
7
- icon: 'vsphere-icon-vm-on',
8
- },
9
- {
10
- value: vms.powered_off,
11
- text: 'powered_off',
12
- icon: 'icon-vm-power-off',
13
- },
14
-
15
- {
16
- value: vms.suspended,
17
- text: 'suspended',
18
- icon: 'vsphere-icon-vm-suspended',
19
- },
1
+ import type {UI_I_Card, UI_I_Vms} from "~/components/common/pages/home/lib/models/interfaces";
2
+
3
+ export const itemsFunc = (vms: UI_I_Vms): UI_I_Card[] => [
4
+ {
5
+ value: vms.powered_on,
6
+ text: 'powered_on',
7
+ icon: 'vsphere-icon-vm-on',
8
+ },
9
+ {
10
+ value: vms.powered_off,
11
+ text: 'powered_off',
12
+ icon: 'icon-vm-power-off',
13
+ },
14
+
15
+ {
16
+ value: vms.suspended,
17
+ text: 'suspended',
18
+ icon: 'vsphere-icon-vm-suspended',
19
+ },
20
20
  ]
@@ -0,0 +1,128 @@
1
+ <template>
2
+ <atoms-loader v-show="props.isLoading" test-id="system-licensing-spinner" />
3
+ <div :class="['system-licensing', { expired: isLicenseExpired }]">
4
+ <h4 class="hardware-id word-break-all flex-align-center">
5
+ <span>{{ localization.license.hardwareId }}:</span>
6
+ <span>{{ props.hardwareId }}</span>
7
+ <span class="pointer" @click="onCopyToClipboard">
8
+ <ui-icon name="copy-to-clipboard" width="12" height="12" />
9
+ </span>
10
+ </h4>
11
+
12
+ <common-headline :headline="localization.license.licensing">
13
+ <template #action>
14
+ <button
15
+ id="assign-license-button"
16
+ class="btn btn-sm btn-secondary system-button"
17
+ @click="isShowAssignLicense = true"
18
+ >
19
+ {{ localization.license.assignLicense }}
20
+ </button>
21
+ </template>
22
+ </common-headline>
23
+
24
+ <common-pages-licensing-list-view :license="props.activeLicense" />
25
+
26
+ <!-- Modal -->
27
+ <common-pages-licensing-modals-assign
28
+ v-if="isShowAssignLicense"
29
+ v-model:selected-active-key="selectedActiveKey"
30
+ v-model:new-license-data="newLicenseData"
31
+ v-model:validation-error="validationError"
32
+ :host-name="props.hostName"
33
+ :system-licenses="props.systemLicenses"
34
+ @hide="isShowAssignLicense = false"
35
+ @refresh="emits('refresh')"
36
+ @change-active-license="emits('change-active-license', $event)"
37
+ @create-new-license="emits('create-new-license', $event)"
38
+ @check-validation="emits('check-validation', $event)"
39
+ />
40
+ </div>
41
+ </template>
42
+
43
+ <script lang="ts" setup>
44
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
45
+ import type {
46
+ UI_I_NewSystemLicense,
47
+ UI_I_SystemLicense,
48
+ } from '~/components/common/pages/licensing/lib/models/interfaces'
49
+ import type { API_UI_I_DataTable } from '~/lib/models/table/interfaces'
50
+
51
+ const newLicenseData = defineModel<UI_I_NewSystemLicense>('newLicenseData', {
52
+ required: true,
53
+ })
54
+ const selectedActiveKey = defineModel<string>('selectedActiveKey', {
55
+ required: true,
56
+ })
57
+ const validationError = defineModel<string | number>('validationError', {
58
+ required: true,
59
+ })
60
+
61
+ const props = defineProps<{
62
+ isLoading: boolean
63
+ hardwareId: string
64
+ hostName: string
65
+ systemLicenses: API_UI_I_DataTable<UI_I_SystemLicense[]> | null
66
+ activeLicense: UI_I_SystemLicense | null
67
+ }>()
68
+
69
+ const emits = defineEmits<{
70
+ (event: 'refresh'): void
71
+ (event: 'change-active-license', value: string): void
72
+ (event: 'create-new-license', value: string): void
73
+ (event: 'check-validation', value: string): void
74
+ (event: 'copy-to-clipboard'): void
75
+ }>()
76
+
77
+ const localization = computed<UI_I_Localization>(() => useLocal())
78
+
79
+ const isShowAssignLicense = ref<boolean>(false)
80
+
81
+ const isLicenseExpired = computed<boolean>(
82
+ () => (props.activeLicense?.timeLeft || 1) <= 0
83
+ )
84
+
85
+ const onCopyToClipboard = (): void => {
86
+ navigator.clipboard.writeText(props.hardwareId)
87
+ emits('copy-to-clipboard')
88
+ }
89
+ </script>
90
+
91
+ <style lang="scss" scoped>
92
+ @import '~/assets/scss/common/mixins.scss';
93
+
94
+ .system-licensing {
95
+ @include flex($dir: column);
96
+ height: 100%;
97
+ padding-left: 10px;
98
+
99
+ &.expired {
100
+ :deep(.heading-block .heading-block__title) {
101
+ color: #ea3223;
102
+ }
103
+ }
104
+
105
+ .hardware-id {
106
+ gap: 8px;
107
+ margin-bottom: 10px;
108
+ }
109
+
110
+ &__wrapper {
111
+ @include flex($dir: column);
112
+ height: 100%;
113
+
114
+ .btn-group {
115
+ padding-top: 12px;
116
+ }
117
+ }
118
+
119
+ &__tabs {
120
+ margin-bottom: 12px;
121
+ }
122
+ }
123
+
124
+ .system-button:hover {
125
+ background-color: var(--btn-outline-hover-bg-color);
126
+ color: var(--btn-outline-hover-color);
127
+ }
128
+ </style>
@@ -0,0 +1,22 @@
1
+ export interface UI_I_SystemLicense {
2
+ id: string
3
+ license: string
4
+ licenseIcon: string
5
+ key: string
6
+ product: string
7
+ usage: string
8
+ capacity: string
9
+ timeLeft: number
10
+ features: string[]
11
+ limits?: string[]
12
+ isActive?: boolean
13
+ }
14
+
15
+ export interface UI_I_NewSystemLicense {
16
+ name: string
17
+ productName: string
18
+ features: string[]
19
+ capacity: string
20
+ licenseExpires: string
21
+ limits: string[]
22
+ }
@@ -0,0 +1,29 @@
1
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
2
+
3
+ export const getValidationInfo = (timeLeft: number, localization: UI_I_Localization): string => {
4
+ if (timeLeft <= 0) return localization.license.licenseHasExpired
5
+
6
+ const { $store, $timeToTimeLeft, $correctRuUnit }: any = useNuxtApp()
7
+
8
+ const language = $store.getters['main/getInterfaceLang']
9
+ const { 0: year, 1: month, 2: day, 3: hour, 4: minute, 5: second }: number[] = $timeToTimeLeft(timeLeft)
10
+ let expiration = ''
11
+
12
+ if (language === 'ru_RU') {
13
+ if (year) expiration += `${year} ${$correctRuUnit(year, 'year')}`
14
+ if (month) expiration += ` ${month} ${$correctRuUnit(month, 'month')}`
15
+ if (day) expiration += ` ${day} ${$correctRuUnit(day, 'day')}`
16
+ if (hour) expiration += ` ${hour} ${$correctRuUnit(hour, 'hour')}`
17
+ if (minute) expiration += ` ${minute} ${$correctRuUnit(minute, 'minute')}`
18
+ if (second) expiration += ` ${second} ${$correctRuUnit(second, 'second')}`
19
+ } else {
20
+ if (year) expiration += `${year} ${localization.common.years2}`
21
+ if (month) expiration += ` ${month} ${localization.common.months2}`
22
+ if (day) expiration += ` ${day} ${localization.common.days2}`
23
+ if (hour) expiration += ` ${hour} ${localization.common.hours2}`
24
+ if (minute) expiration += ` ${minute} ${localization.common.minutes2}`
25
+ if (second) expiration += ` ${second} ${localization.common.seconds2}`
26
+ }
27
+
28
+ return expiration
29
+ }
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <form id="system-licensing-list-view-form">
3
+ <section v-if="listItems.length" class="form-block">
4
+ <div v-for="(item, index) in listItems" :key="index" class="form-group">
5
+ <label>{{ item.label }}</label>
6
+ <span :class="['word-break-all form-value', { expired: item.data?.isExpired }]">
7
+ <atoms-the-icon v-if="item.icon" :name="item.icon" class="icon" />
8
+ {{ item.value }}
9
+ </span>
10
+ </div>
11
+ </section>
12
+ <div v-else>
13
+ {{ localization.license.noActiveLicense }}
14
+ </div>
15
+ </form>
16
+ </template>
17
+
18
+ <script lang="ts" setup>
19
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
20
+ import type { UI_I_SystemLicense} from "~/components/common/pages/licensing/lib/models/interfaces";
21
+ import type { UI_I_LicensingInfoView} from "~/components/common/pages/licensing/listView/lib/models/interfaces";
22
+ import { systemLicenseViewFunc} from "~/components/common/pages/licensing/listView/lib/config/list";
23
+
24
+ const props = defineProps<{
25
+ license: UI_I_SystemLicense | null
26
+ }>()
27
+
28
+ const localization = computed<UI_I_Localization>(() => useLocal())
29
+
30
+ const listItems = computed<UI_I_LicensingInfoView[]>(() =>
31
+ props.license ? systemLicenseViewFunc(localization.value, props.license) : []
32
+ )
33
+ </script>
34
+
35
+ <style lang="scss" scoped>
36
+ .form-group {
37
+ margin-bottom: 0;
38
+
39
+ .form-value {
40
+ white-space: pre-line;
41
+
42
+ &.expired {
43
+ color: #ea3223;
44
+ }
45
+ }
46
+ .icon {
47
+ height: 20px;
48
+ }
49
+ }
50
+ </style>
@@ -0,0 +1,57 @@
1
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
2
+ import type { UI_I_SystemLicense} from "~/components/common/pages/licensing/lib/models/interfaces";
3
+ import type { UI_I_LicensingInfoView} from "~/components/common/pages/licensing/listView/lib/models/interfaces";
4
+ import { getValidationInfo} from "~/components/common/pages/licensing/lib/utils/validation";
5
+
6
+ export const systemLicenseViewFunc = (
7
+ localization: UI_I_Localization,
8
+ data: UI_I_SystemLicense
9
+ ): UI_I_LicensingInfoView[] => {
10
+ const expiration: string = getValidationInfo(data.timeLeft, localization)
11
+
12
+ return [
13
+ {
14
+ label: localization.license.license,
15
+ value: data.license,
16
+ icon: '',
17
+ items: [],
18
+ },
19
+ {
20
+ label: localization.license.licenseKey,
21
+ value: data.key,
22
+ icon: '',
23
+ items: [],
24
+ },
25
+ {
26
+ label: localization.common.product,
27
+ value: data.product,
28
+ icon: '',
29
+ items: [],
30
+ },
31
+ {
32
+ label: localization.common.usage,
33
+ value: data.usage,
34
+ icon: '',
35
+ items: [],
36
+ },
37
+ {
38
+ label: localization.license.licenseExpiration,
39
+ value: expiration,
40
+ icon: '',
41
+ items: [],
42
+ data: { isExpired: data.timeLeft <= 0 },
43
+ },
44
+ {
45
+ label: localization.license.limits,
46
+ value: data.limits?.join('\n') || '',
47
+ icon: '',
48
+ items: [],
49
+ },
50
+ {
51
+ label: localization.license.licensedFeatures,
52
+ value: data.features.join('\n'),
53
+ icon: '',
54
+ items: [],
55
+ },
56
+ ]
57
+ }
@@ -0,0 +1,5 @@
1
+ import type { UI_I_DetailsItem } from '~/components/common/details/lib/models/interfaces'
2
+
3
+ export interface UI_I_LicensingInfoView extends UI_I_DetailsItem {
4
+ icon: string
5
+ }
@@ -0,0 +1,247 @@
1
+ <template>
2
+ <atoms-modal
3
+ show
4
+ width="1150px"
5
+ class="assign-licenses"
6
+ :title="localization.license.assignLicense"
7
+ :second-title="props.hostName"
8
+ :disabled-submit="isDisabledSubmitButton"
9
+ test-id="assign-modal"
10
+ @hide="onHide"
11
+ @submit="onSubmit"
12
+ >
13
+ <template #modalBody>
14
+ <div class="assign-licenses-content">
15
+ <atoms-tabs
16
+ v-model="selectedTab"
17
+ :items="tabItems"
18
+ size="small"
19
+ class="w-100"
20
+ />
21
+
22
+ <div v-if="selectedTab === 0" class="main-height">
23
+ <div id="table-hidden-text">
24
+ <common-pages-licensing-modals-assign-table-view
25
+ v-model:selected-active-key="selectedActiveKey"
26
+ :data-table="props.systemLicenses?.items || []"
27
+ :total-items="props.systemLicenses?.total_items || 0"
28
+ :total-pages="props.systemLicenses?.total_pages || 1"
29
+ :pagination="pagination"
30
+ @pagination="onUpdatePagination"
31
+ />
32
+ </div>
33
+ </div>
34
+ <div v-else class="main-height">
35
+ <common-pages-licensing-modals-assign-new
36
+ v-model:license-key="licenseKey"
37
+ v-model:new-license-data="newLicenseData"
38
+ v-model:validation-error="validationErrorText"
39
+ @validate="onValidate"
40
+ />
41
+ </div>
42
+
43
+ <div class="validation-caption">
44
+ {{ validationBlock.caption }}
45
+ <div class="validation-message">
46
+ <div class="block">
47
+ <atoms-the-icon
48
+ :name="validationBlock.icon"
49
+ width="16"
50
+ height="16"
51
+ class="icon"
52
+ />
53
+ <atoms-the-icon2
54
+ :name="validationBlock.icon"
55
+ width="16"
56
+ height="16"
57
+ class="icon"
58
+ />
59
+ <span class="text">{{ validationBlock.message }}</span>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </template>
65
+ </atoms-modal>
66
+ </template>
67
+
68
+ <script setup lang="ts">
69
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
70
+ import type {
71
+ UI_I_Pagination,
72
+ API_UI_I_DataTable,
73
+ } from '~/lib/models/table/interfaces'
74
+ import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
75
+ import type {
76
+ UI_I_NewSystemLicense,
77
+ UI_I_SystemLicense
78
+ } from "~/components/common/pages/licensing/lib/models/interfaces";
79
+ import type { UI_I_ValidationBlock} from "~/components/common/pages/licensing/modals/assign/lib/models/interfaces";
80
+ import { tabsFunc} from "~/components/common/pages/licensing/modals/assign/lib/config/tabsPannel";
81
+ import { getErrorInfo} from "~/components/common/pages/licensing/modals/assign/lib/utils/error";
82
+
83
+ const newLicenseData = defineModel<UI_I_NewSystemLicense>('newLicenseData', { required: true })
84
+ const selectedActiveKey = defineModel<string>('selectedActiveKey', { required: true })
85
+ const validationError = defineModel<string | number>('validationError', { required: true })
86
+
87
+ const props = defineProps<{
88
+ hostName: string
89
+ systemLicenses: API_UI_I_DataTable<UI_I_SystemLicense[]> | null
90
+ }>()
91
+
92
+ const emits = defineEmits<{
93
+ (event: 'hide'): void
94
+ (event: 'refresh'): void
95
+ (event: 'change-active-license', value: string): void
96
+ (event: 'create-new-license', value: string): void
97
+ (event: 'check-validation', value: string): void
98
+
99
+ }>()
100
+
101
+
102
+ const localization = computed<UI_I_Localization>(() => useLocal())
103
+
104
+ const selectedTab = ref<0 | 1>(0)
105
+ const tabItems = computed<UI_I_CollapseNavItem[]>(() =>
106
+ tabsFunc(localization.value)
107
+ )
108
+
109
+
110
+ const onSubmit = (): void => {
111
+ if (selectedTab.value === 0) {
112
+ emits('change-active-license', selectedActiveKey.value)
113
+ emits('refresh')
114
+
115
+ onHide()
116
+ } else {
117
+ emits('create-new-license', licenseKey.value)
118
+
119
+ selectedTab.value = 0
120
+ licenseKey.value = ''
121
+ }
122
+ }
123
+ const onHide = (): void => {
124
+ selectedTab.value = 0
125
+ emits('hide')
126
+ }
127
+
128
+ const pagination = ref<UI_I_Pagination>({
129
+ page: 1,
130
+ pageSize: 35,
131
+ })
132
+ const onUpdatePagination = (event: UI_I_Pagination): void => {
133
+ pagination.value = event
134
+ }
135
+
136
+ const newLicenseValidationMessage = ref<string>('')
137
+ const newLicenseValidationIcon = ref<string>('')
138
+ const licenseKey = ref<string>('')
139
+ const licenseExpires = ref<number>(-1)
140
+ const onValidate = (licenseExpiresLocal: string): void => {
141
+ emits('check-validation', licenseExpiresLocal)
142
+ }
143
+
144
+ const validationErrorText = ref<string[]>([])
145
+ watch(validationError, (newValue) => {
146
+ if(typeof newValue === 'number') {
147
+ licenseExpires.value = newValue
148
+ const [icon, text] = getErrorInfo(newValue, localization.value)
149
+ newLicenseValidationIcon.value = icon
150
+ newLicenseValidationMessage.value = text
151
+ validationErrorText.value = [text]
152
+ return
153
+ }
154
+
155
+ newLicenseValidationMessage.value = newValue
156
+ newLicenseValidationIcon.value = newValue ? 'error-outline' : ''
157
+ validationErrorText.value = [newValue]
158
+ })
159
+
160
+ const isDisabledSubmitButton = computed<boolean>(() => {
161
+ let result = false
162
+ if (selectedTab.value === 0) {
163
+ result = (selectedLicense.value?.timeLeft || 0) <= 0
164
+ } else {
165
+ result = !licenseKey.value || licenseExpires.value <= 0
166
+ }
167
+
168
+ return result
169
+ })
170
+
171
+ const selectedLicense = computed<UI_I_SystemLicense | null>(() => {
172
+ const item = props.systemLicenses?.items.find(
173
+ (license) => license.id === selectedActiveKey.value
174
+ )
175
+
176
+ return item || null
177
+ })
178
+
179
+ const validationBlock = computed<UI_I_ValidationBlock>(() => {
180
+ let caption = ''
181
+ let icon = ''
182
+ let message = ''
183
+
184
+ if (selectedTab.value === 0) {
185
+ caption = localization.value.common.assignmentValidationFor.replace(
186
+ '{0}',
187
+ selectedLicense.value?.license || ''
188
+ )
189
+ if (selectedLicense.value) {
190
+ const [iconLocal, messageLocal] = getErrorInfo(selectedLicense.value.timeLeft, localization.value)
191
+ icon = iconLocal
192
+ message = messageLocal
193
+ }
194
+ } else {
195
+ caption = localization.value.common.assignmentValidation
196
+ icon = newLicenseValidationIcon.value
197
+ message = newLicenseValidationMessage.value
198
+ }
199
+
200
+ return {
201
+ caption,
202
+ icon,
203
+ message,
204
+ }
205
+ })
206
+ </script>
207
+
208
+ <style lang="scss" scoped>
209
+ @import '~/assets/scss/common/mixins.scss';
210
+ .assign-licenses {
211
+ .assign-licenses-content {
212
+ .main-height {
213
+ height: 300px;
214
+ }
215
+ .validation-caption {
216
+ font-size: 18px;
217
+ }
218
+ .validation-message {
219
+ border: 1px solid var(--global-border-color);
220
+ flex: 1 1 auto;
221
+ padding: 5px;
222
+ overflow: auto;
223
+ min-height: 100px;
224
+ max-height: 200px;
225
+ .block {
226
+ display: flex;
227
+ align-items: center;
228
+ line-height: 1.2rem;
229
+
230
+ .text {
231
+ padding-left: 5px;
232
+ }
233
+ }
234
+ }
235
+ }
236
+ :deep(.secondary-title) {
237
+ font-size: 18px;
238
+ font-weight: 300;
239
+ }
240
+
241
+ :deep(.modal-footer) {
242
+ .btn:last-child {
243
+ margin-left: 5px;
244
+ }
245
+ }
246
+ }
247
+ </style>
@@ -0,0 +1,17 @@
1
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
2
+ import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
3
+
4
+ export const tabsFunc = (
5
+ localization: UI_I_Localization
6
+ ): UI_I_CollapseNavItem[] => {
7
+ return [
8
+ {
9
+ text: localization.license.existingLicense.toUpperCase(),
10
+ value: 0,
11
+ },
12
+ {
13
+ text: localization.license.newLicense.toUpperCase(),
14
+ value: 1,
15
+ },
16
+ ]
17
+ }
@@ -0,0 +1,5 @@
1
+ export interface UI_I_ValidationBlock {
2
+ caption: string
3
+ icon: string
4
+ message: string
5
+ }
@@ -0,0 +1,25 @@
1
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
2
+
3
+ export const getErrorInfo = (timeLeft: number, localization: UI_I_Localization): [string, string] => {
4
+ let result: [string, string] = [
5
+ 'success-circle',
6
+ localization.license.theLicenseAssignmentIsValid,
7
+ ]
8
+ const days = Math.round(timeLeft / 60 / 60 / 24)
9
+ if (timeLeft < 0) {
10
+ result = [
11
+ 'error-outline',
12
+ localization.license.invalidLicense
13
+ ]
14
+ } else if (days < 30) {
15
+ result = [
16
+ 'warning-outline',
17
+ localization.license.theLicenseExpiresInDays.replace(
18
+ '{0}',
19
+ '' + days
20
+ ),
21
+ ]
22
+ }
23
+
24
+ return result
25
+ }