bfg-common 1.5.676 → 1.5.678

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,64 @@
1
+ <template>
2
+ <component
3
+ :is="currentComponent"
4
+ v-model:selected-tab="activeTabModel"
5
+ v-model:status-filter="statusFilter"
6
+ :panel-collapsed-model="panelCollapsedModel"
7
+ :tab-list="props.tabList"
8
+ :data-table-recent-tasks="props.dataTableRecentTasks"
9
+ :total-items-recent-tasks="props.totalItemsRecentTasks"
10
+ :total-pages-recent-tasks="props.totalPagesRecentTasks"
11
+ :pagination-recent-tasks="props.paginationRecentTasks"
12
+ :loading-recent-tasks="props.loadingRecentTasks"
13
+ @collapse-panel="onCollapseBottomPanel"
14
+ @sort-recent-task="emits('sort-recent-task', $event)"
15
+ @pagination-recent-task="emits('pagination-recent-task', $event)"
16
+ />
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
21
+ import type { UI_I_RecentTaskItem } from '~/lib/models/store/tasks/interfaces'
22
+ import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
23
+ import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
24
+ import type { UI_T_BottomPanelTabType } from '~/components/common/layout/bottomPanel/lib/models/types'
25
+ import type { UI_T_SelectedStatus } from '~/components/common/layout/bottomPanel/recentTasks/old/lib/models/types'
26
+
27
+ const panelCollapsedModel = defineModel<boolean>('panelCollapsed', {
28
+ required: true,
29
+ })
30
+ const activeTabModel = defineModel<UI_T_BottomPanelTabType>('selectedTab', {
31
+ required: true,
32
+ })
33
+ const props = defineProps<{
34
+ tabList: UI_I_CollapseNavItem[]
35
+ dataTableRecentTasks: UI_I_RecentTaskItem<UI_T_NodeType>[]
36
+ totalItemsRecentTasks: number
37
+ totalPagesRecentTasks: number
38
+ paginationRecentTasks: UI_I_Pagination
39
+ loadingRecentTasks: boolean
40
+ }>()
41
+
42
+ const emits = defineEmits<{
43
+ (event: 'sort-recent-task', value: string): void
44
+ (event: 'pagination-recent-task', value: UI_I_Pagination | null): void
45
+ }>()
46
+
47
+ const { $store }: any = useNuxtApp()
48
+
49
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
50
+
51
+ const currentComponent = computed(() =>
52
+ isNewView.value
53
+ ? defineAsyncComponent(() => import('./New.vue'))
54
+ : defineAsyncComponent(() => import('./Old.vue'))
55
+ )
56
+
57
+ const onCollapseBottomPanel = (): void => {
58
+ panelCollapsedModel.value = !panelCollapsedModel.value
59
+ }
60
+
61
+ const statusFilter = ref<UI_T_SelectedStatus>(-1)
62
+ </script>
63
+
64
+ <style scoped lang="scss"></style>
@@ -0,0 +1,227 @@
1
+ <template>
2
+ <div
3
+ :class="[
4
+ 'bottom-panel flex flex-col h-full',
5
+ { collapsed: props.panelCollapsedModel },
6
+ ]"
7
+ >
8
+ <div class="bottom-panel__tab-list flex">
9
+ <div class="bottom-panel__collapse relative">
10
+ <button
11
+ id="bottom-panel-collapse"
12
+ data-id="bottom-panel-toggle-button"
13
+ class="btn-collapse flex items-center"
14
+ @click="emits('collapse-panel')"
15
+ >
16
+ <ui-icon class="collapse-icon" name="arrow" />
17
+ </button>
18
+ </div>
19
+ <ui-tabs
20
+ v-model="activeTabModel"
21
+ :tabs="tabListLocal"
22
+ test-id="bottom-panel-tab-list"
23
+ type="underline"
24
+ class="bottom-panel__tab"
25
+ />
26
+
27
+ <div
28
+ v-show="isShowRecentTasksActions"
29
+ class="actions flex items-center gap-4 pr-4"
30
+ >
31
+ <ui-select
32
+ v-model="statusFilter"
33
+ :items="statusFilterItems"
34
+ test-id="status-filter"
35
+ class="status-filter-select"
36
+ />
37
+ <ui-button
38
+ test-id="more-tasks-button"
39
+ variant="primary"
40
+ type="text"
41
+ class="more-tasks-button"
42
+ is-without-sizes
43
+ @click="onNavigateToTasksPage"
44
+ >
45
+ {{ localization.tasks.moreTasks }}
46
+ </ui-button>
47
+ </div>
48
+ </div>
49
+ <div
50
+ v-show="!props.panelCollapsedModel"
51
+ class="bottom-panel__table-wrapper overflow-hidden"
52
+ >
53
+ <common-layout-bottom-panel-recent-tasks
54
+ v-show="activeTabModel === 'recentTask'"
55
+ v-model:status-filter="statusFilter"
56
+ :data-table="props.dataTableRecentTasks"
57
+ :total-items="props.totalItemsRecentTasks"
58
+ :total-pages="props.totalPagesRecentTasks"
59
+ :pagination="props.paginationRecentTasks"
60
+ :loading="props.loadingRecentTasks"
61
+ @sort="emits('sort-recent-task', $event)"
62
+ @pagination="emits('pagination-recent-task', $event)"
63
+ />
64
+
65
+ <slot name="alarms" />
66
+ </div>
67
+ </div>
68
+ </template>
69
+
70
+ <script setup lang="ts">
71
+ import type { UI_I_TabItem } from '~/node_modules/bfg-uikit/components/ui/tabs/models/interfaces'
72
+ import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
73
+ import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
74
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
75
+ import type { UI_T_BottomPanelTabType } from '~/components/common/layout/bottomPanel/lib/models/types'
76
+ import type { UI_I_RecentTaskItem } from '~/lib/models/store/tasks/interfaces'
77
+ import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
78
+ import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
79
+ import type { UI_T_SelectedStatus } from '~/components/common/layout/bottomPanel/recentTasks/old/lib/models/types'
80
+ import { statusFilterItemsFunc } from '~/components/common/layout/bottomPanel/lib/config/statusFilter'
81
+
82
+ const activeTabModel = defineModel<UI_T_BottomPanelTabType>('selectedTab', {
83
+ required: true,
84
+ })
85
+ const statusFilter = defineModel<UI_T_SelectedStatus>('statusFilter', {
86
+ required: true,
87
+ })
88
+
89
+ const props = defineProps<{
90
+ panelCollapsedModel: boolean
91
+ tabList: UI_I_CollapseNavItem[]
92
+ dataTableRecentTasks: UI_I_RecentTaskItem<UI_T_NodeType>[]
93
+ totalItemsRecentTasks: number
94
+ totalPagesRecentTasks: number
95
+ paginationRecentTasks: UI_I_Pagination
96
+ loadingRecentTasks: boolean
97
+ }>()
98
+
99
+ const emits = defineEmits<{
100
+ (event: 'collapse-panel'): void
101
+ (event: 'sort-recent-task', value: string): void
102
+ (event: 'pagination-recent-task', value: UI_I_Pagination | null): void
103
+ }>()
104
+
105
+ const tabListLocal = computed<UI_I_TabItem[]>(() =>
106
+ props.tabList.map(({ value, text: name, testId, development }) => ({
107
+ name,
108
+ development,
109
+ value: value + '',
110
+ testId: testId + '',
111
+ }))
112
+ )
113
+
114
+ const localization = computed<UI_I_Localization>(() => useLocal())
115
+ const statusFilterItems = ref<UI_I_Dropdown[]>(
116
+ statusFilterItemsFunc(localization.value)
117
+ )
118
+
119
+ const onNavigateToTasksPage = (): void => {
120
+ const router = useRouter()
121
+ router.push('/tasks')
122
+ }
123
+
124
+ const isShowRecentTasksActions = computed<boolean>(
125
+ () => activeTabModel.value === 'recentTask' && !props.panelCollapsedModel
126
+ )
127
+ </script>
128
+
129
+ <style>
130
+ :root {
131
+ --bottom-pannel-bg-color: #fff;
132
+ --bottom-pannel-border-color: #e9ebed;
133
+ --bottom-pannel-rtask-link-text: #008fd6;
134
+ --bottom-pannel-rtask-link-hover-text: #0081c1;
135
+ --bottom-pannel-divider-color: #e9ebeda3;
136
+ --bottom-pannel-collapse-button-icon: #213444;
137
+ }
138
+ :root.dark-theme {
139
+ --bottom-pannel-bg-color: #213444;
140
+ --bottom-pannel-border-color: #e9ebed1f;
141
+ --bottom-pannel-rtask-link-text: #2ba2de;
142
+ --bottom-pannel-rtask-link-hover-text: #008fd6;
143
+ --bottom-pannel-divider-color: #e9ebed1f;
144
+ --bottom-pannel-collapse-button-icon: #e9eaec;
145
+ }
146
+ </style>
147
+ <style scoped lang="scss">
148
+ @import '~/assets/scss/common/mixins';
149
+ .bottom-panel {
150
+ background-color: var(--bottom-pannel-bg-color);
151
+
152
+ &__tab-list {
153
+ border-bottom: 1px solid var(--bottom-pannel-border-color);
154
+ }
155
+ &__tab {
156
+ align-items: flex-end;
157
+ margin-left: 16px;
158
+
159
+ &.tabs-wrapper.is-link:before {
160
+ display: none;
161
+ }
162
+ .collapsed &.tabs-wrapper.is-link {
163
+ :deep(.tab-item.active.tab-underline) {
164
+ border-bottom: 3px solid transparent;
165
+ }
166
+ }
167
+ }
168
+ &__table-wrapper {
169
+ height: inherit;
170
+ }
171
+
172
+ .btn-collapse {
173
+ border: 0;
174
+ outline: none;
175
+ background-color: transparent;
176
+ cursor: pointer;
177
+
178
+ .collapse-icon {
179
+ width: 20px;
180
+ height: 20px;
181
+ transform: rotate(180deg);
182
+ color: var(--bottom-pannel-collapse-button-icon);
183
+
184
+ .collapsed & {
185
+ transform: rotate(0deg);
186
+ }
187
+ }
188
+ }
189
+ &__collapse {
190
+ padding: 12px 16px;
191
+
192
+ &:before {
193
+ content: '';
194
+ position: absolute;
195
+ top: 8px;
196
+ right: 0;
197
+ bottom: 8px;
198
+ width: 1px;
199
+ background-color: var(--bottom-pannel-divider-color);
200
+ }
201
+ }
202
+
203
+ .actions {
204
+ flex: 1;
205
+ justify-content: flex-end;
206
+
207
+ .more-tasks-button {
208
+ width: auto;
209
+ }
210
+
211
+ :deep(.ui-select-toggle-button) {
212
+ height: 24px;
213
+ min-width: 80px;
214
+ padding: 4px 4px 4px 8px;
215
+ border-radius: 6px;
216
+ }
217
+ :deep(.ui-popup-window) {
218
+ border-radius: 6px;
219
+ width: unset !important;
220
+ }
221
+ }
222
+ }
223
+
224
+ :deep(.table-container.default-layout) {
225
+ border-radius: 0;
226
+ }
227
+ </style>
@@ -0,0 +1,144 @@
1
+ <template>
2
+ <div
3
+ :class="[
4
+ 'bottom-panel flex flex-col h-full',
5
+ { collapsed: props.panelCollapsedModel },
6
+ ]"
7
+ >
8
+ <div class="flex">
9
+ <div class="bottom-panel__trigger">
10
+ <button
11
+ id="bottom-panel-trigger"
12
+ data-id="bottom-panel-toggle-button"
13
+ class="btn-trigger flex items-center"
14
+ @click="emits('collapse-panel')"
15
+ >
16
+ <atoms-the-icon class="trigger-icon" name="angle" />
17
+ </button>
18
+ </div>
19
+ <atoms-nav-bar
20
+ v-model="activeTabModel"
21
+ :items="props.tabList"
22
+ :class="[
23
+ 'bottom-panel__tabs',
24
+ props.panelCollapsedModel && 'collapsed',
25
+ ]"
26
+ test-id="bottom-panel-nav-bar"
27
+ />
28
+ </div>
29
+ <div
30
+ v-show="!props.panelCollapsedModel"
31
+ class="bottom-panel__table-wrapper overflow-hidden"
32
+ >
33
+ <common-layout-bottom-panel-recent-tasks
34
+ v-show="activeTabModel === 'recentTask'"
35
+ v-model:status-filter="statusFilter"
36
+ :data-table="props.dataTableRecentTasks"
37
+ :total-items="props.totalItemsRecentTasks"
38
+ :total-pages="props.totalPagesRecentTasks"
39
+ :pagination="props.paginationRecentTasks"
40
+ :loading="props.loadingRecentTasks"
41
+ @sort="emits('sort-recent-task', $event)"
42
+ @pagination="emits('pagination-recent-task', $event)"
43
+ />
44
+
45
+ <slot name="alarms" />
46
+ </div>
47
+ </div>
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
52
+ import type { UI_I_RecentTaskItem } from '~/lib/models/store/tasks/interfaces'
53
+ import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
54
+ import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
55
+ import type { UI_T_BottomPanelTabType } from '~/components/common/layout/bottomPanel/lib/models/types'
56
+ import type { UI_T_SelectedStatus } from '~/components/common/layout/bottomPanel/recentTasks/old/lib/models/types'
57
+
58
+ const statusFilter = defineModel<UI_T_SelectedStatus>('statusFilter', {
59
+ required: true,
60
+ })
61
+ const activeTabModel = defineModel<UI_T_BottomPanelTabType>('selectedTab', {
62
+ required: true,
63
+ })
64
+
65
+ const props = defineProps<{
66
+ panelCollapsedModel: boolean
67
+ tabList: UI_I_CollapseNavItem[]
68
+ dataTableRecentTasks: UI_I_RecentTaskItem<UI_T_NodeType>[]
69
+ totalItemsRecentTasks: number
70
+ totalPagesRecentTasks: number
71
+ paginationRecentTasks: UI_I_Pagination
72
+ loadingRecentTasks: boolean
73
+ }>()
74
+
75
+ const emits = defineEmits<{
76
+ (event: 'collapse-panel'): void
77
+ (event: 'sort-recent-task', value: string): void
78
+ (event: 'pagination-recent-task', value: UI_I_Pagination | null): void
79
+ }>()
80
+ </script>
81
+
82
+ <style scoped lang="scss">
83
+ @import '~/assets/scss/common/mixins';
84
+ .bottom-panel {
85
+ background-color: var(--pannel-bg-color);
86
+ & > div:first-child {
87
+ height: 36px;
88
+ }
89
+ &__table-wrapper {
90
+ height: inherit;
91
+ :deep(.datagrid-outer-wrapper) {
92
+ padding-top: 0;
93
+ .datagrid {
94
+ border-radius: 0;
95
+ margin-top: 0;
96
+ }
97
+ }
98
+ }
99
+ &__tabs {
100
+ &.collapsed {
101
+ :deep(button.nav-link) {
102
+ box-shadow: none;
103
+ }
104
+ }
105
+ }
106
+
107
+ &.collapsed {
108
+ .btn-trigger {
109
+ .trigger-icon {
110
+ transform: rotate(0deg);
111
+ }
112
+ }
113
+ }
114
+ .btn-trigger {
115
+ height: 31px;
116
+ border: 0;
117
+ outline: none;
118
+ background-color: transparent;
119
+ padding-left: 15px;
120
+ cursor: pointer;
121
+ .trigger-icon {
122
+ width: 16px;
123
+ height: 16px;
124
+ fill: var(--triger-icon-color);
125
+ transform: rotate(180deg);
126
+ }
127
+ }
128
+ &__trigger {
129
+ padding-right: 15px;
130
+ margin-right: 15px;
131
+ border-right: 0.05rem solid #ccc;
132
+ box-shadow: inset 0 -0.05rem 0 var(--nav-panel-border-color);
133
+ }
134
+ }
135
+ </style>
136
+
137
+ <style>
138
+ :root {
139
+ --pannel-bg-color: #fafafa;
140
+ }
141
+ :root.dark-theme {
142
+ --pannel-bg-color: #1b2a32;
143
+ }
144
+ </style>
@@ -0,0 +1,19 @@
1
+ import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
2
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
3
+
4
+ export const statusFilterItemsFunc = (
5
+ localization: UI_I_Localization
6
+ ): UI_I_Dropdown[] => [
7
+ {
8
+ text: localization.common.all,
9
+ value: -1,
10
+ },
11
+ {
12
+ text: localization.common.running,
13
+ value: 1,
14
+ },
15
+ {
16
+ text: localization.common.failed,
17
+ value: 3,
18
+ },
19
+ ]
@@ -0,0 +1 @@
1
+ export type UI_T_BottomPanelTabType = 'recentTask' | 'alarms'
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <component
3
+ :is="currentComponent"
4
+ v-model:status-filter="statusFilter"
5
+ :data-table="props.dataTable"
6
+ :total-items="props.totalItems"
7
+ :total-pages="props.totalPages"
8
+ :pagination="props.pagination"
9
+ :loading="props.loading"
10
+ @pagination="emits('pagination', $event)"
11
+ @sort="emits('sort', $event)"
12
+ />
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import type { UI_I_RecentTaskItem } from '~/lib/models/store/tasks/interfaces'
17
+ import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
18
+ import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
19
+ import type { UI_T_SelectedStatus } from '~/components/common/layout/bottomPanel/recentTasks/old/lib/models/types'
20
+
21
+ const statusFilter = defineModel<UI_T_SelectedStatus>('statusFilter', {
22
+ required: true,
23
+ })
24
+
25
+ const props = defineProps<{
26
+ dataTable: UI_I_RecentTaskItem<UI_T_NodeType>[]
27
+ totalItems: number
28
+ totalPages: number
29
+ pagination: UI_I_Pagination
30
+ loading: boolean
31
+ }>()
32
+
33
+ const emits = defineEmits<{
34
+ (event: 'pagination', value: UI_I_Pagination | null): void
35
+ (event: 'sort', value: string): void
36
+ }>()
37
+
38
+ const { $store }: any = useNuxtApp()
39
+
40
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
41
+
42
+ const currentComponent = computed(() =>
43
+ isNewView.value
44
+ ? defineAsyncComponent(() => import('./new/New.vue'))
45
+ : defineAsyncComponent(() => import('./old/Old.vue'))
46
+ )
47
+ </script>
48
+
49
+ <style scoped lang="scss"></style>
@@ -0,0 +1,14 @@
1
+ import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
2
+ import type { UI_T_NavNodes } from '~/lib/models/types'
3
+
4
+ interface UI_I_TargetData {
5
+ id: string
6
+ type: UI_T_NodeType
7
+ }
8
+
9
+ export interface UI_I_DataTargetForTable extends UI_I_TargetData {
10
+ nav: UI_T_NavNodes
11
+ isLink: boolean
12
+ iconClassName: string
13
+ testId?: string
14
+ }