@xen-orchestra/web-core 0.33.0 → 0.35.0

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 (34) hide show
  1. package/lib/components/dropdown/{DropdownTitle.vue → VtsDropdownTitle.vue} +4 -4
  2. package/lib/components/input-wrapper/VtsInputWrapper.vue +1 -10
  3. package/lib/components/label-value-list/VtsLabelValueList.vue +46 -0
  4. package/lib/components/menu/MenuList.vue +1 -0
  5. package/lib/components/progress-bar/VtsProgressBar.vue +8 -3
  6. package/lib/components/size-progress-cell/VtsSizeProgressCell.vue +36 -0
  7. package/lib/components/space-card/VtsSpaceCard.vue +94 -0
  8. package/lib/components/ui/input/UiInput.vue +5 -7
  9. package/lib/components/ui/label/UiLabel.vue +4 -15
  10. package/lib/components/ui/tag/UiTag.vue +4 -1
  11. package/lib/components/ui/tag/UiTagsList.vue +11 -1
  12. package/lib/components/ui/text-area/UiTextarea.vue +1 -3
  13. package/lib/i18n.ts +4 -0
  14. package/lib/icons/fa-icons.ts +4 -0
  15. package/lib/icons/legacy-icons.ts +33 -8
  16. package/lib/locales/cs.json +12 -6
  17. package/lib/locales/da.json +261 -0
  18. package/lib/locales/de.json +3 -3
  19. package/lib/locales/en.json +57 -7
  20. package/lib/locales/es.json +1 -5
  21. package/lib/locales/fa.json +1 -1
  22. package/lib/locales/fr.json +61 -11
  23. package/lib/locales/it.json +9 -0
  24. package/lib/locales/nl.json +10 -5
  25. package/lib/locales/pt_BR.json +75 -16
  26. package/lib/locales/ru.json +1 -5
  27. package/lib/locales/sv.json +1 -5
  28. package/lib/locales/uk.json +2 -6
  29. package/lib/packages/remote-resource/README.md +32 -0
  30. package/lib/packages/remote-resource/define-remote-resource.ts +107 -17
  31. package/lib/packages/remote-resource/sse.store.ts +140 -0
  32. package/lib/types/utility.type.ts +6 -0
  33. package/lib/utils/progress.util.ts +7 -5
  34. package/package.json +1 -1
@@ -3,9 +3,9 @@
3
3
  TODO: Replace `span` with `UiButton` when new version (with tertiary) is available
4
4
  -->
5
5
  <template>
6
- <div class="dropdown-title">
6
+ <div class="vts-dropdown-title">
7
7
  <VtsIcon :name="icon" size="medium" />
8
- <div class="label c3 semi-bold">
8
+ <div class="typo-caption-small">
9
9
  <slot />
10
10
  </div>
11
11
  <div v-if="onToggleSelectAll" class="buttons">
@@ -41,12 +41,12 @@ const { t } = useI18n()
41
41
  </script>
42
42
 
43
43
  <style lang="postcss" scoped>
44
- .dropdown-title {
44
+ .vts-dropdown-title {
45
45
  display: flex;
46
46
  align-items: center;
47
47
  padding: 0.4rem 1.6rem;
48
48
  gap: 0.8rem;
49
- height: 2.6rem;
49
+ height: 2.9rem;
50
50
  background: var(--color-neutral-background-secondary);
51
51
  }
52
52
 
@@ -1,13 +1,6 @@
1
1
  <template>
2
2
  <div class="vts-input-wrapper">
3
- <UiLabel
4
- :accent="labelAccent"
5
- :for="id"
6
- :href="learnMoreUrl"
7
- :icon
8
- :required="wrapperController.required"
9
- class="label"
10
- >
3
+ <UiLabel :accent="labelAccent" :for="id" :href="learnMoreUrl" :required="wrapperController.required" class="label">
11
4
  <slot name="label">{{ label }}</slot>
12
5
  </UiLabel>
13
6
  <slot />
@@ -21,7 +14,6 @@
21
14
  import UiInfo, { type InfoAccent } from '@core/components/ui/info/UiInfo.vue'
22
15
  import UiLabel, { type LabelAccent } from '@core/components/ui/label/UiLabel.vue'
23
16
  import { useRanked } from '@core/composables/ranked.composable.ts'
24
- import type { IconName } from '@core/icons'
25
17
  import { useMapper } from '@core/packages/mapper/use-mapper.ts'
26
18
  import type { MaybeArray } from '@core/types/utility.type'
27
19
  import { IK_INPUT_WRAPPER_CONTROLLER } from '@core/utils/injection-keys.util'
@@ -40,7 +32,6 @@ export type InputWrapperController = {
40
32
  const { message: _message } = defineProps<{
41
33
  label?: string
42
34
  learnMoreUrl?: string
43
- icon?: IconName
44
35
  message?: InputWrapperMessage
45
36
  }>()
46
37
 
@@ -0,0 +1,46 @@
1
+ <template>
2
+ <template v-for="(value, label) in fields" :key="label">
3
+ <VtsCardRowKeyValue v-if="isPrimitiveOrBooleanString(value)">
4
+ <template #key>
5
+ <span class="label">{{ label }}</span>
6
+ </template>
7
+ <template #value>
8
+ <template v-if="isBooleanLike(value)">
9
+ <VtsEnabledState :enabled="toBoolean(value)" />
10
+ </template>
11
+ <template v-else>
12
+ {{ value }}
13
+ </template>
14
+ </template>
15
+ <template v-if="!isBooleanLike(value)" #addons>
16
+ <VtsCopyButton :value="String(value)" />
17
+ </template>
18
+ </VtsCardRowKeyValue>
19
+ <VtsLabelValueList v-else :fields="value" />
20
+ </template>
21
+ </template>
22
+
23
+ <script lang="ts" setup>
24
+ import VtsCardRowKeyValue from '@core/components/card/VtsCardRowKeyValue.vue'
25
+ import VtsCopyButton from '@core/components/copy-button/VtsCopyButton.vue'
26
+ import VtsEnabledState from '@core/components/enabled-state/VtsEnabledState.vue'
27
+
28
+ defineProps<{
29
+ fields: Record<string, unknown> | unknown
30
+ }>()
31
+
32
+ const isBooleanString = (value: unknown): value is string => value === 'true' || value === 'false'
33
+
34
+ const isBooleanLike = (value: unknown): boolean => typeof value === 'boolean' || isBooleanString(value)
35
+
36
+ const toBoolean = (value: unknown): boolean => value === true || value === 'true'
37
+
38
+ const isPrimitiveOrBooleanString = (value: unknown): boolean =>
39
+ ['number', 'string'].includes(typeof value) || isBooleanString(value)
40
+ </script>
41
+
42
+ <style lang="postcss" scoped>
43
+ .label {
44
+ text-transform: capitalize;
45
+ }
46
+ </style>
@@ -93,6 +93,7 @@ const open = (event: MouseEvent) => {
93
93
  border-radius: 0.4rem;
94
94
  background-color: var(--color-neutral-background-primary);
95
95
  z-index: 1010;
96
+ overflow: auto;
96
97
 
97
98
  &.horizontal {
98
99
  flex-direction: row;
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="vts-progress-bar">
3
- <UiDataRuler :max="percentageCap" :warning="threshold.payload" />
3
+ <UiDataRuler v-if="!noruler" :max="percentageCap" :warning="threshold.payload" />
4
4
  <UiProgressBar :accent="threshold.payload.accent ?? 'info'" :fill-width :legend />
5
5
  </div>
6
6
  </template>
@@ -28,9 +28,10 @@ const {
28
28
  } = defineProps<{
29
29
  current: number
30
30
  total: number
31
- label: string
31
+ label?: string
32
32
  legendType?: ProgressBarLegendType
33
33
  thresholds?: ProgressBarThresholdConfig
34
+ noruler?: boolean
34
35
  }>()
35
36
 
36
37
  const progress = useProgress(
@@ -40,7 +41,11 @@ const progress = useProgress(
40
41
 
41
42
  const { percentageCap, percentage, fillWidth } = progress
42
43
 
43
- const legend = useProgressToLegend(() => legendType, label, progress)
44
+ const legend = useProgressToLegend(
45
+ () => legendType,
46
+ () => label,
47
+ progress
48
+ )
44
49
 
45
50
  const threshold = useThreshold(percentage, () => thresholds)
46
51
  </script>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <div class="progress-cell">
3
+ <VtsProgressBar :current :total noruler class="progress" />
4
+ <span>{{ n(percentage / 100, { maximumFractionDigits: 0, style: 'percent' }) }}</span>
5
+ </div>
6
+ </template>
7
+
8
+ <script setup lang="ts">
9
+ import VtsProgressBar from '@core/components/progress-bar/VtsProgressBar.vue'
10
+ import { useProgress } from '@core/packages/progress/use-progress.ts'
11
+ import { useI18n } from 'vue-i18n'
12
+
13
+ const { current, total } = defineProps<{
14
+ current: number
15
+ total: number
16
+ }>()
17
+
18
+ const { n } = useI18n()
19
+
20
+ const { percentage } = useProgress(
21
+ () => current,
22
+ () => total
23
+ )
24
+ </script>
25
+
26
+ <style lang="postcss" scoped>
27
+ .progress-cell {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 0.8rem;
31
+
32
+ .progress {
33
+ flex-grow: 1;
34
+ }
35
+ }
36
+ </style>
@@ -0,0 +1,94 @@
1
+ <template>
2
+ <UiCard class="card-container">
3
+ <UiCardTitle>
4
+ {{ t('space') }}
5
+ </UiCardTitle>
6
+
7
+ <div class="content">
8
+ <VtsProgressBar noruler :current="used" :total :label legend-type="percent" class="progress" />
9
+
10
+ <VtsCardRowKeyValue>
11
+ <template #key>{{ t('used-space') }}</template>
12
+ <template #value>{{ usedSpace.formattedValue }}</template>
13
+ <template v-if="usedSpace.rawValue > 0" #addons>
14
+ <VtsCopyButton :value="usedSpace.formattedValue" />
15
+ </template>
16
+ </VtsCardRowKeyValue>
17
+
18
+ <VtsCardRowKeyValue>
19
+ <template #key>{{ t('free-space') }}</template>
20
+ <template #value>
21
+ {{ freeSpace.formattedValue }}
22
+ </template>
23
+ <template v-if="freeSpace.rawValue > 0" #addons>
24
+ <VtsCopyButton :value="freeSpace.formattedValue" />
25
+ </template>
26
+ </VtsCardRowKeyValue>
27
+
28
+ <VtsCardRowKeyValue>
29
+ <template #key>{{ totalSizeLabel ? totalSizeLabel : t('size') }}</template>
30
+ <template #value>
31
+ {{ totalSpace.formattedValue }}
32
+ </template>
33
+ <template v-if="totalSpace.rawValue > 0" #addons>
34
+ <VtsCopyButton :value="totalSpace.formattedValue" />
35
+ </template>
36
+ </VtsCardRowKeyValue>
37
+ </div>
38
+ </UiCard>
39
+ </template>
40
+
41
+ <script setup lang="ts">
42
+ import VtsCardRowKeyValue from '@core/components/card/VtsCardRowKeyValue.vue'
43
+ import VtsCopyButton from '@core/components/copy-button/VtsCopyButton.vue'
44
+ import VtsProgressBar from '@core/components/progress-bar/VtsProgressBar.vue'
45
+ import UiCard from '@core/components/ui/card/UiCard.vue'
46
+ import UiCardTitle from '@core/components/ui/card-title/UiCardTitle.vue'
47
+ import { formatSize } from '@core/utils/size.util'
48
+ import { computed } from 'vue'
49
+ import { useI18n } from 'vue-i18n'
50
+
51
+ const { used, total } = defineProps<{
52
+ used: number
53
+ total: number
54
+ label: string
55
+ totalSizeLabel?: string
56
+ }>()
57
+
58
+ const { t } = useI18n()
59
+
60
+ const usedSpace = computed(() => ({
61
+ formattedValue: formatSize(used, 2),
62
+ rawValue: used,
63
+ }))
64
+
65
+ const totalSpace = computed(() => ({
66
+ formattedValue: formatSize(total, 2),
67
+ rawValue: total,
68
+ }))
69
+
70
+ const freeSpace = computed(() => {
71
+ const rawFreeSpace = total - used
72
+
73
+ return {
74
+ formattedValue: formatSize(rawFreeSpace, 2),
75
+ rawValue: rawFreeSpace,
76
+ }
77
+ })
78
+ </script>
79
+
80
+ <style scoped lang="postcss">
81
+ .card-container {
82
+ gap: 1.6rem;
83
+
84
+ .content {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 0.4rem;
88
+
89
+ .progress {
90
+ margin-block-end: 1.6rem;
91
+ }
92
+ }
93
+ }
94
+ </style>
@@ -1,7 +1,6 @@
1
1
  <!-- v5 -->
2
2
  <template>
3
3
  <div :class="toVariants({ accent, disabled })" class="ui-input" @click.self="focus()">
4
- <VtsIcon :name="icon" size="medium" class="left-icon" />
5
4
  <input
6
5
  :id="wrapperController?.id ?? id"
7
6
  ref="inputRef"
@@ -114,14 +113,9 @@ defineExpose({ focus })
114
113
  min-width: 15rem;
115
114
  padding-inline: 1.6rem;
116
115
 
117
- .left-icon,
118
116
  .right-icon {
119
117
  pointer-events: none;
120
- color: var(--color-neutral-txt-secondary);
121
- }
122
-
123
- &:not(.disabled) .right-icon {
124
- color: var(--color-brand-item-base);
118
+ color: var(--color-brand-txt-base);
125
119
  }
126
120
 
127
121
  .input {
@@ -133,6 +127,10 @@ defineExpose({ focus })
133
127
  &::placeholder {
134
128
  color: var(--color-neutral-txt-secondary);
135
129
  }
130
+
131
+ &::-webkit-search-cancel-button {
132
+ -webkit-appearance: none;
133
+ }
136
134
  }
137
135
 
138
136
  /* VARIANT */
@@ -1,18 +1,15 @@
1
- <!-- v1 -->
1
+ <!-- v3 -->
2
2
  <template>
3
3
  <div :class="toVariants({ accent })" class="ui-label">
4
- <VtsIcon :name="icon" size="medium" class="icon" />
5
- <label :for="htmlFor" :class="{ required }" class="typo-caption label">
4
+ <label :for="htmlFor" :class="{ required }" class="typo-body-bold label">
6
5
  <slot />
7
6
  </label>
8
- <UiLink v-if="href" class="learn-more-link" size="small" :href>{{ t('learn-more') }}</UiLink>
7
+ <UiLink v-if="href" size="small" :href>{{ t('learn-more') }}</UiLink>
9
8
  </div>
10
9
  </template>
11
10
 
12
11
  <script lang="ts" setup>
13
- import VtsIcon from '@core/components/icon/VtsIcon.vue'
14
12
  import UiLink from '@core/components/ui/link/UiLink.vue'
15
- import type { IconName } from '@core/icons'
16
13
  import { toVariants } from '@core/utils/to-variants.util'
17
14
  import { useI18n } from 'vue-i18n'
18
15
 
@@ -21,7 +18,6 @@ export type LabelAccent = 'neutral' | 'warning' | 'danger'
21
18
  const { for: htmlFor } = defineProps<{
22
19
  accent: LabelAccent
23
20
  for?: string
24
- icon?: IconName
25
21
  required?: boolean
26
22
  href?: string
27
23
  }>()
@@ -33,10 +29,7 @@ const { t } = useI18n()
33
29
  .ui-label {
34
30
  display: flex;
35
31
  align-items: center;
36
-
37
- .icon {
38
- margin-right: 0.8rem;
39
- }
32
+ justify-content: space-between;
40
33
 
41
34
  .label {
42
35
  &.required::after {
@@ -46,10 +39,6 @@ const { t } = useI18n()
46
39
  }
47
40
  }
48
41
 
49
- .learn-more-link {
50
- margin-left: auto;
51
- }
52
-
53
42
  /* ACCENT VARIANTS */
54
43
 
55
44
  &.accent--neutral {
@@ -5,12 +5,15 @@
5
5
  <slot name="icon">
6
6
  <VtsIcon :name="icon" size="medium" />
7
7
  </slot>
8
- <span class="text-ellipsis"><slot /></span>
8
+ <span v-tooltip class="text-ellipsis">
9
+ <slot />
10
+ </span>
9
11
  </span>
10
12
  </template>
11
13
 
12
14
  <script lang="ts" setup>
13
15
  import VtsIcon from '@core/components/icon/VtsIcon.vue'
16
+ import { vTooltip } from '@core/directives/tooltip.directive.ts'
14
17
  import type { IconName } from '@core/icons'
15
18
  import { toVariants } from '@core/utils/to-variants.util'
16
19
 
@@ -1,14 +1,24 @@
1
1
  <!-- v1 -->
2
2
  <template>
3
- <div class="ui-tags-list">
3
+ <div class="ui-tags-list" :class="{ nowrap }">
4
4
  <slot />
5
5
  </div>
6
6
  </template>
7
7
 
8
+ <script lang="ts" setup>
9
+ defineProps<{
10
+ nowrap?: boolean
11
+ }>()
12
+ </script>
13
+
8
14
  <style lang="postcss" scoped>
9
15
  .ui-tags-list {
10
16
  display: flex;
11
17
  flex-wrap: wrap;
12
18
  gap: 0.4rem;
13
19
  }
20
+
21
+ .nowrap {
22
+ flex-wrap: nowrap;
23
+ }
14
24
  </style>
@@ -1,7 +1,7 @@
1
1
  <!-- v2 -->
2
2
  <template>
3
3
  <div class="ui-textarea" :class="toVariants({ accent: hasMaxCharactersError ? 'danger' : accent })">
4
- <UiLabel v-if="slots.default" :accent="labelAccent" :required :icon :href :for="id">
4
+ <UiLabel v-if="slots.default" :accent="labelAccent" :required :href :for="id">
5
5
  <slot />
6
6
  </UiLabel>
7
7
  <textarea v-bind="attrs" :id ref="textarea" v-model="model" :disabled class="textarea" />
@@ -19,7 +19,6 @@
19
19
  import UiCharacterLimit from '@core/components/ui/character-limit/UiCharacterLimit.vue'
20
20
  import UiInfo from '@core/components/ui/info/UiInfo.vue'
21
21
  import UiLabel from '@core/components/ui/label/UiLabel.vue'
22
- import type { IconName } from '@core/icons'
23
22
  import { toVariants } from '@core/utils/to-variants.util'
24
23
  import { useFocus } from '@vueuse/core'
25
24
  import { computed, useAttrs, useId, useTemplateRef } from 'vue'
@@ -39,7 +38,6 @@ const {
39
38
  maxCharacters?: number
40
39
  disabled?: boolean
41
40
  href?: string
42
- icon?: IconName
43
41
  required?: boolean
44
42
  }>()
45
43
 
package/lib/i18n.ts CHANGED
@@ -57,6 +57,10 @@ export const locales: Locales = {
57
57
  code: 'pt_BR',
58
58
  name: 'Português (Brasil)',
59
59
  },
60
+ da: {
61
+ code: 'da',
62
+ name: 'Danish',
63
+ },
60
64
  }
61
65
 
62
66
  export default createI18n({
@@ -65,6 +65,7 @@ import {
65
65
  faFloppyDisk,
66
66
  faFont,
67
67
  faGear,
68
+ faHardDrive,
68
69
  faHashtag,
69
70
  faHeadset,
70
71
  faInfo,
@@ -88,6 +89,7 @@ import {
88
89
  faPlug,
89
90
  faPlus,
90
91
  faPowerOff,
92
+ faPuzzlePiece,
91
93
  faRemove,
92
94
  faRepeat,
93
95
  faRotateLeft,
@@ -174,6 +176,7 @@ export const faIcons = defineIconPack({
174
176
  'folder-open': { icon: faFolderOpen },
175
177
  font: { icon: faFont },
176
178
  gear: { icon: faGear },
179
+ 'hard-drive': { icon: faHardDrive },
177
180
  hashtag: { icon: faHashtag },
178
181
  headset: { icon: faHeadset },
179
182
  info: { icon: faInfo },
@@ -210,6 +213,7 @@ export const faIcons = defineIconPack({
210
213
  star: { icon: faStar },
211
214
  stop: { icon: faStop },
212
215
  tags: { icon: faTags },
216
+ template: { icon: faPuzzlePiece },
213
217
  time: { icon: faClock },
214
218
  'thumb-tack': { icon: faThumbTack },
215
219
  'thumb-tack-slash': { icon: faThumbTackSlash },
@@ -44,10 +44,17 @@ export const legacyIcons = defineIconPack({
44
44
  icon: accent === 'success' ? faCheck : faExclamation,
45
45
  },
46
46
  ]),
47
- halted: {
48
- icon: faStop,
49
- color: 'var(--color-danger-item-base)',
50
- },
47
+ halted: [
48
+ {
49
+ icon: faCircle,
50
+ color: 'var(--color-danger-item-base)',
51
+ },
52
+ {
53
+ icon: faStop,
54
+ color: 'var(--color-danger-txt-item)',
55
+ size: 8,
56
+ },
57
+ ],
51
58
  info: {
52
59
  icon: faCircleInfo,
53
60
  color: 'var(--color-info-item-base)',
@@ -68,10 +75,17 @@ export const legacyIcons = defineIconPack({
68
75
  size: 8,
69
76
  },
70
77
  ],
71
- running: {
72
- icon: faPlay,
73
- color: 'var(--color-success-item-base)',
74
- },
78
+ running: [
79
+ {
80
+ icon: faCircle,
81
+ color: 'var(--color-success-item-base)',
82
+ },
83
+ {
84
+ icon: faPlay,
85
+ color: 'var(--color-success-txt-item)',
86
+ size: 8,
87
+ },
88
+ ],
75
89
  status: defineIcon([['info', 'success', 'warning', 'danger', 'muted']], accent => [
76
90
  {
77
91
  icon: faCircle,
@@ -87,4 +101,15 @@ export const legacyIcons = defineIconPack({
87
101
  icon: faMoon,
88
102
  color: 'var(--color-info-item-base)',
89
103
  },
104
+ checked: [
105
+ {
106
+ icon: faCircle,
107
+ color: 'var(--color-success-item-base)',
108
+ },
109
+ {
110
+ icon: faCheck,
111
+ color: 'var(--color-success-txt-item)',
112
+ size: 8,
113
+ },
114
+ ],
90
115
  })
@@ -34,6 +34,7 @@
34
34
  "api-info-details": "Podrobnosti o informaci z API",
35
35
  "api-warning-details": "Podrobnosti o varování z API",
36
36
  "appearance": "Vzhled",
37
+ "aria.breadcrumb.label": "Drobečková navigace",
37
38
  "ascending": "vzestupně",
38
39
  "auto-generated": "Automaticky vytvořeno",
39
40
  "auto-power": "Automatické zapínání",
@@ -50,12 +51,12 @@
50
51
  "backup-repositories": "Repozitáře zálohy",
51
52
  "backup-repository": "Repozitář pro zálohy (místní, NFS, SMB)",
52
53
  "backup-targets": "Cíle zálohování",
53
- "backup.continuous-replication": "Průběžná replikace",
54
- "backup.disaster-recovery": "Obnova po havárii",
55
54
  "backup.full": "Plná záloha",
55
+ "backup.full-replication": "Úplná replikace",
56
56
  "backup.incremental": "Přírůstková záloha",
57
- "backup.metadata": "Záloha metadat",
58
- "backup.mirror": "Zrcadlení zálohy",
57
+ "backup.incremental-replication": "Přírůstková replikace",
58
+ "backup.mirror.full": "Zrcadlová úplná záloha",
59
+ "backup.mirror.incremental": "Zrcadlová přírůstková záloha",
59
60
  "backup.pool-metadata": "Metadata fondu",
60
61
  "backup.rolling-snapshot": "Průběžně zachycovaný stav",
61
62
  "backup.xo-config": "Nastavení XO",
@@ -78,7 +79,6 @@
78
79
  "bond-devices": "Zařízení svazku",
79
80
  "bond-status": "Stav svazku",
80
81
  "boot-firmware": "Firmware zavádění",
81
- "boot-firmware-bios": "Šablona už obsahuje řetězec BIOS",
82
82
  "boot-firmware-uefi": "Firmware, kterým zaváděno, je UEFI",
83
83
  "boot-vm": "Nastartovat virt. stroj",
84
84
  "build-number": "Číslo sestavení",
@@ -293,6 +293,8 @@
293
293
  "ip-addresses": "IP adresy",
294
294
  "ip-mode": "Režim IP",
295
295
  "ip-port-placeholder": "adresa[:port]",
296
+ "ipv4": "IPv4 adresa | IPv4 adresy",
297
+ "ipv6": "IPv6 adresa | IPv6 adresy",
296
298
  "is-primary-host": "{name} je hlavní hostitel",
297
299
  "iscsi-iqn": "iSCSI IQN název",
298
300
  "iso-dvd": "ISO/DVD",
@@ -367,6 +369,7 @@
367
369
  "manage-citrix-pv-drivers-via-windows-update": "Spravovat citrix PV ovladače prostřednictvím Windows Update",
368
370
  "management": "Správa",
369
371
  "management-agent-version": "Verze agenta pro správu",
372
+ "management-ip": "IP adresa správy",
370
373
  "manufacturer-info": "Informace o výrobci",
371
374
  "master": "Hlavní hostitel",
372
375
  "maximum-cpu-limit": "Limit procesoru nejvýše",
@@ -383,7 +386,7 @@
383
386
  "minimum-dynamic-memory": "Dynamicky přidělované paměti nejméně",
384
387
  "minimum-static-memory": "Staticky přidělené paměti nejméně",
385
388
  "missing-patches": "Chybějící záplaty",
386
- "mode": "Režim",
389
+ "mode": "Režim | Režimy",
387
390
  "more-actions": "Další akce",
388
391
  "mtu": "MTU",
389
392
  "multi-creation": "Vícenásobné vytvoření",
@@ -427,6 +430,7 @@
427
430
  "no-config": "Žádné nastavení",
428
431
  "no-data": "Žádné údaje",
429
432
  "no-data-to-calculate": "Žádná data k výpočtu",
433
+ "no-hosts-detected": "Nezjištěni žádní hostitelé.",
430
434
  "no-network-detected": "Nezjištěna žádná síť",
431
435
  "no-pif-detected": "Nezjištěno žádné fyz. rozhraní",
432
436
  "no-pools-detected": "Nezjištěny žádné fondy",
@@ -573,6 +577,7 @@
573
577
  "snapshot": "Zachytit stav",
574
578
  "snapshot-mode": "Režim zachyceného stavu",
575
579
  "sockets-with-cores-per-socket": "{nSockets} patic × {nCores} jader/patici",
580
+ "software": "Software",
576
581
  "software-tooling": "Software a nástroje",
577
582
  "sort-by": "Seřadit podle",
578
583
  "source-backup-repository": "Zdrojový repozitář záloh",
@@ -627,6 +632,7 @@
627
632
  "tasks.quick-view.failed": "Nezdařilo se",
628
633
  "tasks.quick-view.in-progress": "Probíhá",
629
634
  "template": "Šablona",
635
+ "template-has-bios-strings": "Šablona už obsahuje řetězec BIOS",
630
636
  "theme-auto": "Automaticky",
631
637
  "theme-dark": "Tmavý",
632
638
  "theme-light": "Světlý",