bfg-common 1.4.774 → 1.4.776

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.
@@ -0,0 +1,208 @@
1
+ <template>
2
+ <div class="packages-page">
3
+ <common-headline :headline="localization.common.softwarePackages" />
4
+
5
+ <div class="grid-toolbar">
6
+ <common-tools-actions
7
+ test-id="packages-tools-panel"
8
+ :actions="actions"
9
+ @click="onClickAction"
10
+ >
11
+ <template #icon="{ data }">
12
+ <span
13
+ v-if="data.type === 'updates'"
14
+ class="vx-icon-import icon"
15
+ ></span>
16
+ <span
17
+ v-if="data.type === 'refresh'"
18
+ class="vsphere-icon-reset icon"
19
+ ></span>
20
+ </template>
21
+ </common-tools-actions>
22
+ </div>
23
+
24
+ <common-pages-packages-table-view
25
+ v-model="selectedRow"
26
+ :data-table="props.packagesData?.items || []"
27
+ :total-items="props.packagesData?.total_items || 0"
28
+ :total-pages="props.packagesData?.total_pages || 1"
29
+ :pagination="pagination"
30
+ :loading="props.loading"
31
+ @pagination="onPagination"
32
+ @sort="onSort"
33
+ />
34
+ </div>
35
+ </template>
36
+
37
+ <script lang="ts" setup>
38
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
39
+ import type {
40
+ UI_I_Pagination,
41
+ } from '~/lib/models/table/interfaces'
42
+ import type { UI_T_SelectedRow } from '~/components/atoms/table/dataGrid/lib/models/types'
43
+ import type { UI_I_Button } from '~/components/common/tools/lib/models/interfaces'
44
+ import type { UI_T_Action } from '~/components/common/pages/packages/lib/models/types'
45
+ import { actionsFunc } from '~/components/common/pages/packages/lib/config/actions'
46
+
47
+
48
+ const selectedRow = defineModel<UI_T_SelectedRow>('selectedRow')
49
+ const pagination = defineModel<UI_I_Pagination>('pagination')
50
+
51
+ const props = defineProps<{
52
+ packagesData: any | null
53
+ loading: boolean
54
+ }>()
55
+ const emits = defineEmits<{
56
+ (event: 'sort', value: string): void
57
+ (event: 'pagination', value: UI_I_Pagination): void
58
+ (event: 'action', value: [UI_T_Action, FormData | null]): void
59
+ (event: 'refresh'): void
60
+ }>()
61
+
62
+ const localization = computed<UI_I_Localization>(() => useLocal())
63
+
64
+ const disabledActions = ref<string[]>([
65
+ 'enable',
66
+ 'disable',
67
+ 'on',
68
+ 'off',
69
+ 'remove',
70
+ ])
71
+
72
+ const actions = computed<UI_I_Button[]>(() =>
73
+ actionsFunc(localization.value, disabledActions.value)
74
+ )
75
+
76
+ const onPagination = (value: UI_I_Pagination): void => {
77
+ emits('pagination', value)
78
+ }
79
+ const onSort = (value: string): void => {
80
+ emits('sort', value)
81
+ }
82
+
83
+ const checkAllActions = (): void => {
84
+ if (typeof selectedRow.value !== 'number') return
85
+
86
+ const selectedPackage = props.packagesData?.items[selectedRow.value]
87
+ if (!selectedPackage) return
88
+
89
+ disabledActions.value = []
90
+ if (window.location.hostname === 'dev-pn.aobfg.ru') return
91
+
92
+ if (selectedPackage.not_runnable || selectedPackage.required) {
93
+ disabledActions.value = ['enable', 'disable', 'on', 'off']
94
+ }
95
+
96
+ if (selectedPackage.required) {
97
+ disabledActions.value = ['remove']
98
+ }
99
+ }
100
+ watch(
101
+ selectedRow,
102
+ () => {
103
+ checkAllActions()
104
+ },
105
+ { immediate: true }
106
+ )
107
+
108
+ const onAction = async (
109
+ action: UI_T_Action,
110
+ file: FormData | null = null
111
+ ): Promise<void> => {
112
+ emits('action', [action, file])
113
+ }
114
+ const onRefresh = (): void => {
115
+ emits('refresh')
116
+ }
117
+ const onChangeFiles = (event: Event | undefined): void => {
118
+ if (!event) return
119
+
120
+ const target = event.target as HTMLInputElement
121
+ if (!target.files) return
122
+
123
+ const file = target.files[0]
124
+
125
+ const formData = new FormData()
126
+ formData.append('package', file)
127
+ onAction('update', formData)
128
+ }
129
+
130
+ const onClickAction = (type: string, file?: Event): void => {
131
+ switch (type) {
132
+ case 'updates':
133
+ onChangeFiles(file)
134
+ break
135
+ case 'refresh':
136
+ onRefresh()
137
+ break
138
+ case 'enable':
139
+ onAction('enable')
140
+ break
141
+ case 'disable':
142
+ onAction('disable')
143
+ break
144
+ case 'on':
145
+ onAction('on')
146
+ break
147
+ case 'off':
148
+ onAction('off')
149
+ break
150
+ case 'remove':
151
+ onAction('remove')
152
+ break
153
+ }
154
+ }
155
+ </script>
156
+
157
+ <style>
158
+ :root {
159
+ --action-link-container-bg-color: #e9f6fd;
160
+ --vui-action-label-color: #333;
161
+ }
162
+ :root.dark-theme {
163
+ --action-link-container-bg-color: #29414e;
164
+ --vui-action-label-color: #adbbc4;
165
+ }
166
+ </style>
167
+
168
+ <style lang="scss" scoped>
169
+ @import '~/assets/scss/common/mixins.scss';
170
+
171
+ .packages-page {
172
+ @include flex($dir: column);
173
+ height: 100%;
174
+
175
+ .grid-toolbar {
176
+ .icon {
177
+ display: block;
178
+ width: 16px;
179
+ height: 16px;
180
+ min-width: 16px;
181
+ min-height: 16px;
182
+ background-size: 100% auto;
183
+ margin-right: 5px;
184
+ }
185
+
186
+ :deep(.btn) {
187
+ text-transform: none;
188
+ font-size: 13px;
189
+ font-weight: normal;
190
+ color: var(--vui-action-label-color);
191
+ min-width: unset;
192
+ padding: 4px;
193
+ line-height: normal;
194
+ margin-right: 4px;
195
+ display: flex;
196
+ align-items: center;
197
+ letter-spacing: normal;
198
+
199
+ &:not(:disabled):hover {
200
+ color: var(--vui-action-label-color);
201
+ text-decoration: none;
202
+ background-color: var(--action-link-container-bg-color);
203
+ border: 1px solid #c7e9ff;
204
+ }
205
+ }
206
+ }
207
+ }
208
+ </style>
@@ -0,0 +1,59 @@
1
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
2
+ import type { UI_I_Button } from '~/components/common/tools/lib/models/interfaces'
3
+
4
+ export const actionsFunc = (
5
+ localization: UI_I_Localization,
6
+ disabledActions: string[]
7
+ ): UI_I_Button[] => {
8
+ const actions = [
9
+ {
10
+ text: localization.common.updates,
11
+ type: 'updates',
12
+ disabled: false,
13
+ uploaded: true,
14
+ testId: 'packages-updates',
15
+ },
16
+ {
17
+ text: localization.common.refresh2,
18
+ type: 'refresh',
19
+ disabled: false,
20
+ testId: 'packages-refresh',
21
+ },
22
+ {
23
+ text: localization.common.enable2,
24
+ type: 'enable',
25
+ disabled: false,
26
+ testId: 'packages-enable',
27
+ },
28
+ {
29
+ text: localization.common.disable2,
30
+ type: 'disable',
31
+ disabled: false,
32
+ testId: 'packages-disable',
33
+ },
34
+ {
35
+ text: localization.common.on,
36
+ type: 'on',
37
+ disabled: false,
38
+ testId: 'packages-on',
39
+ },
40
+ {
41
+ text: localization.common.off2,
42
+ type: 'off',
43
+ disabled: false,
44
+ testId: 'packages-off',
45
+ },
46
+ {
47
+ text: localization.common.remove,
48
+ type: 'remove',
49
+ disabled: false,
50
+ testId: 'packages-remove',
51
+ },
52
+ ]
53
+
54
+ return actions.map((action) => {
55
+ action.disabled = disabledActions.includes(action.type)
56
+
57
+ return action
58
+ })
59
+ }
@@ -0,0 +1,8 @@
1
+ export type UI_T_Action =
2
+ | 'update'
3
+ | 'refresh'
4
+ | 'enable'
5
+ | 'disable'
6
+ | 'on'
7
+ | 'off'
8
+ | 'remove'
@@ -0,0 +1,120 @@
1
+ <template>
2
+ <div class="packages-table">
3
+ <atoms-table-data-grid
4
+ v-model:selected-row="selectedRowLocal"
5
+ v-model:column-keys="columnKeys"
6
+ v-model:page-size="paginationLocal.pageSize"
7
+ v-model:page="paginationLocal.page"
8
+ type="radio"
9
+ class="data-table"
10
+ test-id="packages-table"
11
+ :head-items="headItems"
12
+ :body-items="bodyItems"
13
+ :total-items="props.totalItems"
14
+ :total-pages="props.totalPages"
15
+ :loading="props.loading"
16
+ hide-footer
17
+ @filtering="onFiltering"
18
+ @sorting="onSorting"
19
+ />
20
+ </div>
21
+ </template>
22
+
23
+ <script setup lang="ts">
24
+ import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
25
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
26
+ import type {
27
+ UI_I_ColumnKey,
28
+ UI_I_HeadItem,
29
+ UI_I_BodyItem,
30
+ } from '~/components/atoms/table/dataGrid/lib/models/interfaces'
31
+ import type { UI_T_SelectedRow } from '~/components/atoms/table/dataGrid/lib/models/types'
32
+ import type { UI_T_TimeValue } from '~/components/common/layout/theHeader/userMenu/modals/preferences/timeFormat/lib/models/types'
33
+ import * as table from '~/components/common/pages/packages/tableView/lib/config/configTable'
34
+
35
+ const props = defineProps<{
36
+ dataTable: any[]
37
+ totalItems: number
38
+ totalPages: number
39
+ pagination: UI_I_Pagination
40
+ loading: boolean
41
+ }>()
42
+ const emits = defineEmits<{
43
+ (event: 'pagination', value: UI_I_Pagination): void
44
+ (event: 'sort', value: string): void
45
+ }>()
46
+ const selectedRowLocal = defineModel<UI_T_SelectedRow>({ required: true })
47
+
48
+ const localization = computed<UI_I_Localization>(() => useLocal())
49
+
50
+ const paginationLocal = ref<UI_I_Pagination>(props.pagination)
51
+ watch(
52
+ () => props.pagination,
53
+ (newValue) => {
54
+ paginationLocal.value = newValue
55
+ }
56
+ )
57
+ watch(
58
+ paginationLocal,
59
+ (newValue) => {
60
+ if (!newValue) return
61
+
62
+ emits('pagination', newValue)
63
+ },
64
+ { deep: true, immediate: true }
65
+ )
66
+
67
+ const columnKeys = ref<UI_I_ColumnKey[]>(table.columnKeys(localization.value))
68
+ const headItems = computed<UI_I_HeadItem[]>(() =>
69
+ table.headItems(localization.value)
70
+ )
71
+
72
+ const bodyItems = ref<UI_I_BodyItem[][]>([])
73
+ watch(
74
+ () => props.dataTable,
75
+ (newValue) => {
76
+ if (!newValue?.length) {
77
+ bodyItems.value = []
78
+ return
79
+ }
80
+ bodyItems.value = table.bodyItems(newValue, localization.value)
81
+ }
82
+ )
83
+
84
+ const { $store }: any = useNuxtApp()
85
+
86
+ const timeFormat = computed<UI_T_TimeValue>(
87
+ () => $store.getters['main/getTimeFormat']
88
+ )
89
+
90
+ watch([localization, timeFormat], () => {
91
+ bodyItems.value = table.bodyItems(props.dataTable, localization.value)
92
+ })
93
+
94
+ const onSorting = (data: [number, boolean]): void => {
95
+ const [column, status] = data
96
+ const direction = status ? 'desc' : 'asc'
97
+
98
+ const sort = `${column}.${direction}`
99
+
100
+ emits('sort', sort)
101
+ }
102
+
103
+ const onFiltering = (): void => {
104
+ console.log('onFiltering')
105
+ }
106
+ </script>
107
+
108
+ <style scoped lang="scss">
109
+ .packages-table {
110
+ height: inherit;
111
+
112
+ .data-table {
113
+ height: inherit;
114
+
115
+ :deep(.datagrid-outer-wrapper) {
116
+ height: inherit;
117
+ }
118
+ }
119
+ }
120
+ </style>
@@ -0,0 +1,136 @@
1
+ import type {
2
+ UI_I_ColumnKey,
3
+ UI_I_HeadItem,
4
+ UI_I_BodyItem,
5
+ } from '~/components/atoms/table/dataGrid/lib/models/interfaces'
6
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
7
+ import * as defaultSettings from '~/components/atoms/table/dataGrid/lib/config/settingsTable'
8
+ import { systemPackagesTableKeys } from '~/components/common/pages/packages/tableView/lib/config/tableKey'
9
+
10
+ const getItems = (
11
+ localization: UI_I_Localization
12
+ ): [string, boolean, string, string][] => {
13
+ return [
14
+ [localization.common.name, true, '180px', systemPackagesTableKeys[0]],
15
+ [localization.common.version, true, '180px', systemPackagesTableKeys[1]],
16
+ [
17
+ localization.common.installedAt,
18
+ true,
19
+ '180px',
20
+ systemPackagesTableKeys[2],
21
+ ],
22
+ [localization.common.startedAt, true, '180px', systemPackagesTableKeys[3]],
23
+ [localization.common.stoppedAt, true, '180px', systemPackagesTableKeys[4]],
24
+ [localization.common.status, true, '180px', systemPackagesTableKeys[5]],
25
+ [localization.common.required, true, '180px', systemPackagesTableKeys[6]],
26
+ [localization.common.enabled, true, '180px', systemPackagesTableKeys[7]],
27
+ [
28
+ localization.common.notRunnable,
29
+ true,
30
+ '180px',
31
+ systemPackagesTableKeys[8],
32
+ ],
33
+ [localization.common.failCount, true, '180px', systemPackagesTableKeys[9]],
34
+ ]
35
+ }
36
+
37
+ export const columnKeys = (
38
+ localization: UI_I_Localization
39
+ ): UI_I_ColumnKey[] => {
40
+ return defaultSettings.defaultColumnKeys(getItems(localization))
41
+ }
42
+ export const headItems = (localization: UI_I_Localization): UI_I_HeadItem[] => {
43
+ return defaultSettings.defaultHeadItems(getItems(localization))
44
+ }
45
+ export const bodyItems = (
46
+ data: any[],
47
+ localization: UI_I_Localization
48
+ ): UI_I_BodyItem[][] => {
49
+ const { $formattedDatetime }: any = useNuxtApp()
50
+
51
+ const bodyItems: UI_I_BodyItem[][] = []
52
+ data.forEach((item: any, key) => {
53
+ const installedAt = item[systemPackagesTableKeys[2]]
54
+ const formattedInstalledAt =
55
+ installedAt && $formattedDatetime(+installedAt * 1000, '', true)
56
+
57
+ const startedAt = item[systemPackagesTableKeys[3]]
58
+ const formattedStartedAt =
59
+ startedAt && $formattedDatetime(+startedAt * 1000, '', true)
60
+
61
+ const stoppedAt = item[systemPackagesTableKeys[4]]
62
+ const formattedStoppedAt =
63
+ stoppedAt && $formattedDatetime(+stoppedAt * 1000, '', true)
64
+
65
+ const onOffText = item[systemPackagesTableKeys[5]]
66
+ ? localization.common.on3
67
+ : localization.common.off
68
+
69
+ const requiredText = item[systemPackagesTableKeys[6]]
70
+ ? localization.common.yes
71
+ : localization.common.no
72
+
73
+ const enabledText = item[systemPackagesTableKeys[7]]
74
+ ? localization.common.yes
75
+ : localization.common.no
76
+
77
+ const notRunnableText = item[systemPackagesTableKeys[8]]
78
+ ? localization.common.yes
79
+ : localization.common.no
80
+
81
+ const failCount = item[systemPackagesTableKeys[9]] ?? 0
82
+ bodyItems.push([
83
+ {
84
+ key: 'col0',
85
+ text: item[systemPackagesTableKeys[0]],
86
+ id: key,
87
+ testId: `package-item-${key}`,
88
+ },
89
+ {
90
+ key: 'col1',
91
+ text: item[systemPackagesTableKeys[1]],
92
+ id: key,
93
+ testId: `package-item-${key}`,
94
+ },
95
+ {
96
+ key: 'col2',
97
+ text: formattedInstalledAt || '-',
98
+ id: key,
99
+ testId: `package-item-${key}`,
100
+ },
101
+ {
102
+ key: 'col3',
103
+ text: formattedStartedAt || '-',
104
+ id: key,
105
+ testId: `package-item-${key}`,
106
+ },
107
+ {
108
+ key: 'col4',
109
+ text: formattedStoppedAt || '-',
110
+ id: key,
111
+ testId: `package-item-${key}`,
112
+ },
113
+ { key: 'col5', text: onOffText, id: key, testId: `package-item-${key}` },
114
+ {
115
+ key: 'col6',
116
+ text: requiredText,
117
+ id: key,
118
+ testId: `package-item-${key}`,
119
+ },
120
+ {
121
+ key: 'col7',
122
+ text: enabledText,
123
+ id: key,
124
+ testId: `package-item-${key}`,
125
+ },
126
+ {
127
+ key: 'col8',
128
+ text: notRunnableText,
129
+ id: key,
130
+ testId: `package-item-${key}`,
131
+ },
132
+ { key: 'col9', text: failCount, id: key, testId: `package-item-${key}` },
133
+ ])
134
+ })
135
+ return bodyItems
136
+ }
@@ -0,0 +1,14 @@
1
+ import type { UI_T_SystemPackagesTableItemTuple } from '~/components/common/pages/packages/tableView/lib/models/types'
2
+
3
+ export const systemPackagesTableKeys: UI_T_SystemPackagesTableItemTuple = [
4
+ 'name',
5
+ 'version',
6
+ 'installed_at',
7
+ 'started_at',
8
+ 'stopped_at',
9
+ 'on',
10
+ 'required',
11
+ 'enabled',
12
+ 'not_runnable',
13
+ 'fail_count',
14
+ ]
@@ -0,0 +1,12 @@
1
+ export type UI_T_SystemPackagesTableItemTuple = [
2
+ 'name',
3
+ 'version',
4
+ 'installed_at',
5
+ 'started_at',
6
+ 'stopped_at',
7
+ 'on',
8
+ 'required',
9
+ 'enabled',
10
+ 'not_runnable',
11
+ 'fail_count'
12
+ ]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bfg-common",
3
3
  "private": false,
4
- "version": "1.4.774",
4
+ "version": "1.4.776",
5
5
  "scripts": {
6
6
  "build": "nuxt build",
7
7
  "dev": "nuxt dev --port=3002",
@@ -35,7 +35,7 @@
35
35
  "@vueuse/components": "^10.1.2",
36
36
  "date-fns": "^2.29.3",
37
37
  "bfg-nuxt-3-graph": "1.0.17",
38
- "bfg-uikit": "1.0.326",
38
+ "bfg-uikit": "1.0.330",
39
39
  "html2canvas": "^1.4.1",
40
40
  "prettier-eslint": "^15.0.1"
41
41
  }