shared-ritm 1.3.96 → 1.3.98

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 (99) hide show
  1. package/README.md +103 -103
  2. package/dist/index.css +1 -1
  3. package/dist/shared-ritm.es.js +24 -23
  4. package/dist/shared-ritm.umd.js +3 -3
  5. package/dist/types/api/services/InstrumentsService.d.ts +5 -1
  6. package/dist/types/api/types/Api_Instruments.d.ts +4 -0
  7. package/package.json +1 -1
  8. package/src/api/services/BrigadesService.ts +32 -32
  9. package/src/api/services/CommentsService.ts +24 -24
  10. package/src/api/services/FileService.ts +17 -17
  11. package/src/api/services/GanttService.ts +47 -47
  12. package/src/api/services/InstrumentsService.ts +72 -68
  13. package/src/api/services/ModulesService.ts +27 -27
  14. package/src/api/services/ProjectsService.ts +83 -83
  15. package/src/api/services/ScheduleService.ts +69 -69
  16. package/src/api/services/SearchService.ts +22 -22
  17. package/src/api/services/TasksService.ts +157 -157
  18. package/src/api/settings/ApiService.ts +184 -185
  19. package/src/api/types/Api_Brigades.ts +36 -36
  20. package/src/api/types/Api_Comment.ts +40 -40
  21. package/src/api/types/Api_Files.ts +7 -7
  22. package/src/api/types/Api_Instruments.ts +161 -156
  23. package/src/api/types/Api_Modules.ts +21 -21
  24. package/src/api/types/Api_Projects.ts +62 -62
  25. package/src/api/types/Api_Schedule.ts +64 -64
  26. package/src/api/types/Api_Service.ts +9 -9
  27. package/src/common/app-button/AppButton.vue +173 -173
  28. package/src/common/app-date-picker/AppDatePicker.vue +81 -81
  29. package/src/common/app-datepicker/AppDatepicker.vue +218 -218
  30. package/src/common/app-dropdown/AppDropdown.vue +37 -37
  31. package/src/common/app-file/AppFile.vue +80 -80
  32. package/src/common/app-input/AppInput.vue +150 -150
  33. package/src/common/app-input-search/AppInputSearch.vue +174 -174
  34. package/src/common/app-layout/AppLayout.vue +84 -84
  35. package/src/common/app-layout/components/AppLayoutPage.vue +16 -16
  36. package/src/common/app-loader/index.vue +43 -43
  37. package/src/common/app-page-layout/AppPageLayout.vue +122 -122
  38. package/src/common/app-sheet/AppSheet.vue +120 -120
  39. package/src/common/app-sheet-new/AppSheetNew.vue +244 -244
  40. package/src/common/app-sidebar/components/SidebarMenu.vue +37 -37
  41. package/src/common/app-sidebar/components/SidebarMenuItem.vue +149 -149
  42. package/src/common/app-table/AppTableLayout.vue +137 -137
  43. package/src/common/app-table/components/TablePagination.vue +152 -152
  44. package/src/common/app-table/components/TableSearch.vue +76 -76
  45. package/src/common/app-table/controllers/useBaseTable.ts +45 -45
  46. package/src/global.d.ts +1 -1
  47. package/src/icons/components/arrow-down-icon.vue +25 -25
  48. package/src/icons/components/arrow-frame-icon.vue +19 -19
  49. package/src/icons/components/arrow-square.vue +22 -22
  50. package/src/icons/components/table-filter-icon.vue +30 -30
  51. package/src/icons/dialogs/RemoveIcon.vue +12 -12
  52. package/src/icons/dialogs/SafetyIcon.vue +12 -12
  53. package/src/icons/header/NotificationIcon.vue +18 -18
  54. package/src/icons/header/PersonIcon.vue +11 -11
  55. package/src/icons/header/SettingIcon.vue +14 -14
  56. package/src/icons/header/flashIcon.vue +24 -24
  57. package/src/icons/header/searchStatusIcon.vue +24 -24
  58. package/src/icons/header/smallCapsIcon.vue +34 -34
  59. package/src/icons/sidebar/assign-module-icon.vue +36 -36
  60. package/src/icons/sidebar/instrument-history-icon.vue +32 -32
  61. package/src/icons/sidebar/instrument-order-icon.vue +38 -38
  62. package/src/icons/sidebar/instrument-work-zone-icon.vue +18 -18
  63. package/src/icons/sidebar/instruments-icon.vue +45 -45
  64. package/src/icons/sidebar/logo-icon.vue +15 -15
  65. package/src/icons/sidebar/logout-icon.vue +13 -13
  66. package/src/icons/sidebar/modules-icon.vue +16 -16
  67. package/src/icons/sidebar/notifications-icon.vue +24 -24
  68. package/src/icons/sidebar/order-icon.vue +44 -44
  69. package/src/icons/sidebar/pass-icon.vue +38 -38
  70. package/src/icons/sidebar/positions-icon.vue +42 -42
  71. package/src/icons/sidebar/preorder-icon.vue +19 -19
  72. package/src/icons/sidebar/projects-icon.vue +31 -31
  73. package/src/icons/sidebar/repair-object-icon.vue +18 -18
  74. package/src/icons/sidebar/repairs-icon.vue +20 -20
  75. package/src/icons/sidebar/roles-icon.vue +26 -26
  76. package/src/icons/sidebar/status-history-icon.vue +24 -24
  77. package/src/icons/sidebar/tasks-icon.vue +28 -28
  78. package/src/icons/sidebar/tasks_tasks-icon.vue +39 -39
  79. package/src/icons/sidebar/tasks_today-icon.vue +27 -27
  80. package/src/icons/sidebar/teams-icon.vue +32 -32
  81. package/src/icons/sidebar/user-icon.vue +18 -18
  82. package/src/icons/sidebar/users-icon.vue +46 -46
  83. package/src/icons/sidebar/videosources-icon.vue +19 -19
  84. package/src/icons/sidebar/videowall-icon.vue +13 -13
  85. package/src/icons/sidebar/videozones-icon.vue +21 -21
  86. package/src/icons/sidebar/warehouses-icon.vue +43 -43
  87. package/src/icons/sidebar/workshop-icon.vue +100 -100
  88. package/src/icons/sidebar/workzones-icon.vue +22 -22
  89. package/src/icons/task/attention-icon.vue +13 -13
  90. package/src/icons/task/clock-icon.vue +10 -10
  91. package/src/icons/task/delete-icon.vue +10 -10
  92. package/src/icons/task/fire-icon.vue +16 -16
  93. package/src/main.ts +28 -28
  94. package/src/quasar-user-options.ts +17 -17
  95. package/src/router/index.ts +10 -10
  96. package/src/shims-vue.d.ts +5 -5
  97. package/src/utils/confirm.ts +12 -12
  98. package/src/utils/faceApiHelper.ts +132 -132
  99. package/src/utils/notification.ts +9 -9
@@ -1,149 +1,149 @@
1
- <template>
2
- <q-expansion-item
3
- v-if="item.items"
4
- :model-value="isRouteActive(item) && expand"
5
- header-class="text-purple"
6
- :class="[$style['menu-item'], { 'expansion-item-active': isRouteActive(item) && minify }]"
7
- :data-test="`sidebar-expansion-item-${(item.name || 'unnamed').toLowerCase().replace(/\s+/g, '-')}`"
8
- :expand-icon-class="minify ? 'hidden' : ''"
9
- @update:model-value="expand = $event"
10
- >
11
- <template #header>
12
- <q-tooltip
13
- v-if="minify"
14
- :delay="100"
15
- transition-show="jump-right"
16
- transition-hide="jump-left"
17
- anchor="center right"
18
- self="center left"
19
- >
20
- {{ item.label }}
21
- </q-tooltip>
22
-
23
- <q-item-section v-if="item.icon" avatar>
24
- <app-icon :name="item.icon" color="white" size="24px" />
25
- </q-item-section>
26
-
27
- <q-item-section :class="$style['menu-item__label']">{{ minify ? '' : item.label }}</q-item-section>
28
- </template>
29
-
30
- <sidebar-menu-item
31
- v-for="(subItem, index) in item.items"
32
- :key="index"
33
- :item="subItem"
34
- :main="main"
35
- :is-route-active="isRouteActive"
36
- />
37
- </q-expansion-item>
38
- <q-item
39
- v-else-if="item.name !== 'sign-out'"
40
- v-ripple
41
- :class="$style['menu-item']"
42
- :active="isRouteActive(item)"
43
- active-class="menu-active"
44
- clickable
45
- :to="main ? item.to : ''"
46
- :data-test="`sidebar-item-${item.name.toLowerCase().replace(/\s+/g, '-')}`"
47
- @click="goToRoute(item.to)"
48
- >
49
- <q-item-section v-if="item.icon" avatar>
50
- <app-icon :name="item.icon" color="white" size="24px" />
51
- </q-item-section>
52
-
53
- <q-item-section :class="$style['menu-item__label']">
54
- <p>{{ minify ? '' : item.label }}</p>
55
- </q-item-section>
56
- <q-tooltip
57
- :delay="100"
58
- transition-show="jump-right"
59
- transition-hide="jump-left"
60
- anchor="center right"
61
- self="center left"
62
- >
63
- {{ item.label }}
64
- </q-tooltip>
65
- </q-item>
66
- </template>
67
-
68
- <script lang="ts" setup>
69
- import { defineProps, ref } from 'vue'
70
- import AppIcon from '@/common/app-icon/AppIcon.vue'
71
-
72
- interface Props {
73
- minify?: boolean
74
- main: boolean
75
- isRouteActive: (item: any) => boolean
76
- item: {
77
- name: string
78
- label: string
79
- icon: string
80
- href: string
81
- to: string
82
- items: any[]
83
- }
84
- }
85
-
86
- const emits = defineEmits(['goToRoute'])
87
- const props = defineProps<Props>()
88
-
89
- const expand = ref(true)
90
-
91
- const goToRoute = (to: string) => {
92
- if (!props.main) window.location.href = to
93
- }
94
- </script>
95
-
96
- <style lang="scss" scoped>
97
- .expansion-item-active {
98
- background: rgba(243, 249, 253, 0.1);
99
- border-radius: 10px;
100
- }
101
- </style>
102
-
103
- <style lang="scss" module>
104
- .menu-item {
105
- margin: 0 8px;
106
- &:global(.menu-active) {
107
- border-radius: 10px;
108
- background: rgba(243, 249, 253, 0.1);
109
- }
110
- :global(.q-item__section--avatar) {
111
- min-width: 24px;
112
- padding-right: 14px;
113
- }
114
-
115
- :global(.q-expansion-item__content .q-item) {
116
- padding-left: 20px;
117
- }
118
- :global(.q-item__section--main ~ .q-item__section--side) {
119
- color: white;
120
- }
121
- &__label {
122
- color: #fff;
123
- font-family: 'Nunito Sans', sans-serif;
124
- font-size: 16px;
125
- font-weight: 300;
126
- p {
127
- display: inline-block;
128
- max-width: 160px;
129
- white-space: nowrap;
130
- overflow: hidden;
131
- text-overflow: ellipsis;
132
- margin: 0;
133
- }
134
- }
135
- }
136
-
137
- @media (max-width: 1440px) {
138
- .menu-item {
139
- margin: 0 4px;
140
- :global(.q-item__section--avatar) {
141
- min-width: 24px;
142
- padding-right: 10px;
143
- }
144
- &__label {
145
- font-size: 14px;
146
- }
147
- }
148
- }
149
- </style>
1
+ <template>
2
+ <q-expansion-item
3
+ v-if="item.items"
4
+ :model-value="isRouteActive(item) && expand"
5
+ header-class="text-purple"
6
+ :class="[$style['menu-item'], { 'expansion-item-active': isRouteActive(item) && minify }]"
7
+ :data-test="`sidebar-expansion-item-${(item.name || 'unnamed').toLowerCase().replace(/\s+/g, '-')}`"
8
+ :expand-icon-class="minify ? 'hidden' : ''"
9
+ @update:model-value="expand = $event"
10
+ >
11
+ <template #header>
12
+ <q-tooltip
13
+ v-if="minify"
14
+ :delay="100"
15
+ transition-show="jump-right"
16
+ transition-hide="jump-left"
17
+ anchor="center right"
18
+ self="center left"
19
+ >
20
+ {{ item.label }}
21
+ </q-tooltip>
22
+
23
+ <q-item-section v-if="item.icon" avatar>
24
+ <app-icon :name="item.icon" color="white" size="24px" />
25
+ </q-item-section>
26
+
27
+ <q-item-section :class="$style['menu-item__label']">{{ minify ? '' : item.label }}</q-item-section>
28
+ </template>
29
+
30
+ <sidebar-menu-item
31
+ v-for="(subItem, index) in item.items"
32
+ :key="index"
33
+ :item="subItem"
34
+ :main="main"
35
+ :is-route-active="isRouteActive"
36
+ />
37
+ </q-expansion-item>
38
+ <q-item
39
+ v-else-if="item.name !== 'sign-out'"
40
+ v-ripple
41
+ :class="$style['menu-item']"
42
+ :active="isRouteActive(item)"
43
+ active-class="menu-active"
44
+ clickable
45
+ :to="main ? item.to : ''"
46
+ :data-test="`sidebar-item-${item.name.toLowerCase().replace(/\s+/g, '-')}`"
47
+ @click="goToRoute(item.to)"
48
+ >
49
+ <q-item-section v-if="item.icon" avatar>
50
+ <app-icon :name="item.icon" color="white" size="24px" />
51
+ </q-item-section>
52
+
53
+ <q-item-section :class="$style['menu-item__label']">
54
+ <p>{{ minify ? '' : item.label }}</p>
55
+ </q-item-section>
56
+ <q-tooltip
57
+ :delay="100"
58
+ transition-show="jump-right"
59
+ transition-hide="jump-left"
60
+ anchor="center right"
61
+ self="center left"
62
+ >
63
+ {{ item.label }}
64
+ </q-tooltip>
65
+ </q-item>
66
+ </template>
67
+
68
+ <script lang="ts" setup>
69
+ import { defineProps, ref } from 'vue'
70
+ import AppIcon from '@/common/app-icon/AppIcon.vue'
71
+
72
+ interface Props {
73
+ minify?: boolean
74
+ main: boolean
75
+ isRouteActive: (item: any) => boolean
76
+ item: {
77
+ name: string
78
+ label: string
79
+ icon: string
80
+ href: string
81
+ to: string
82
+ items: any[]
83
+ }
84
+ }
85
+
86
+ const emits = defineEmits(['goToRoute'])
87
+ const props = defineProps<Props>()
88
+
89
+ const expand = ref(true)
90
+
91
+ const goToRoute = (to: string) => {
92
+ if (!props.main) window.location.href = to
93
+ }
94
+ </script>
95
+
96
+ <style lang="scss" scoped>
97
+ .expansion-item-active {
98
+ background: rgba(243, 249, 253, 0.1);
99
+ border-radius: 10px;
100
+ }
101
+ </style>
102
+
103
+ <style lang="scss" module>
104
+ .menu-item {
105
+ margin: 0 8px;
106
+ &:global(.menu-active) {
107
+ border-radius: 10px;
108
+ background: rgba(243, 249, 253, 0.1);
109
+ }
110
+ :global(.q-item__section--avatar) {
111
+ min-width: 24px;
112
+ padding-right: 14px;
113
+ }
114
+
115
+ :global(.q-expansion-item__content .q-item) {
116
+ padding-left: 20px;
117
+ }
118
+ :global(.q-item__section--main ~ .q-item__section--side) {
119
+ color: white;
120
+ }
121
+ &__label {
122
+ color: #fff;
123
+ font-family: 'Nunito Sans', sans-serif;
124
+ font-size: 16px;
125
+ font-weight: 300;
126
+ p {
127
+ display: inline-block;
128
+ max-width: 160px;
129
+ white-space: nowrap;
130
+ overflow: hidden;
131
+ text-overflow: ellipsis;
132
+ margin: 0;
133
+ }
134
+ }
135
+ }
136
+
137
+ @media (max-width: 1440px) {
138
+ .menu-item {
139
+ margin: 0 4px;
140
+ :global(.q-item__section--avatar) {
141
+ min-width: 24px;
142
+ padding-right: 10px;
143
+ }
144
+ &__label {
145
+ font-size: 14px;
146
+ }
147
+ }
148
+ }
149
+ </style>
@@ -1,137 +1,137 @@
1
- <template>
2
- <div class="table-layout" :class="{ 'hide-search': !isActionsSlot && hideSearch, 'hide-pagination': hidePagination }">
3
- <div v-if="isActionsSlot || !hideSearch" class="table-controls">
4
- <app-table-search
5
- v-if="!hideSearch"
6
- :model-value="props.search || ''"
7
- class="search-input"
8
- placeholder="Введите наименование"
9
- @search="props.onSearch"
10
- />
11
- <slot v-if="isActionsSlot" name="actions" />
12
- </div>
13
-
14
- <div class="table-wrapper">
15
- <app-table
16
- v-bind="props.tableProps"
17
- :selected-rows="props.selectedRows"
18
- :no-hover="noHover"
19
- :slots="slots"
20
- :hide-pagination="hidePagination"
21
- v-on="props.tableEvents"
22
- @update:selectedRows="rows => emit('update:selectedRows', rows)"
23
- >
24
- <template v-for="name in cellSlotsNames" :key="name" #[name]="{ cellProps }">
25
- <slot :name="name" :row="cellProps.row" />
26
- </template>
27
- </app-table>
28
- <div v-if="props.loading" class="loader-overlay">
29
- <q-spinner-audio class="loader-spinner" size="md" :thickness="3" color="primary" />
30
- </div>
31
- </div>
32
-
33
- <app-table-pagination
34
- v-if="!hidePagination && props.currentPage && props.totalPages"
35
- :model-value="props.currentPage"
36
- :total-pages="props.totalPages"
37
- @page-change="props.onPageChange"
38
- />
39
-
40
- <slot v-if="'modal' in slots" name="modal" />
41
- </div>
42
- </template>
43
- <script setup lang="ts">
44
- import AppTable from './AppTable.vue'
45
- import AppTablePagination from '../app-table/components/TablePagination.vue'
46
- import AppTableSearch from '../app-table/components/TableSearch.vue'
47
- import { defineProps, defineEmits, useSlots, computed } from 'vue'
48
-
49
- const props = defineProps<{
50
- search?: string
51
- loading?: boolean
52
- currentPage?: number
53
- totalPages?: number
54
- tableProps: any
55
- tableEvents?: any
56
- onSearch?: (val: string) => void
57
- onPageChange?: (page: number) => void
58
- hideSearch?: boolean
59
- hidePagination?: boolean
60
- noHover?: boolean
61
- selectedRows?: any[]
62
- }>()
63
- const emit = defineEmits<{
64
- 'update:selectedRows': [rows: any[]]
65
- }>()
66
-
67
- const slots = useSlots()
68
-
69
- const baseSlotsNames = ['actions', 'modal']
70
-
71
- const cellSlotsNames = computed(() => {
72
- if (!slots) return []
73
-
74
- return Object.keys(slots).filter((key: string) => !baseSlotsNames.includes(key))
75
- })
76
-
77
- const isActionsSlot = computed(() => 'actions' in slots)
78
- </script>
79
- <style scoped lang="scss">
80
- .table-layout {
81
- height: 100%;
82
- display: grid;
83
- grid-template-rows: auto 1fr auto;
84
- gap: 1.25rem;
85
- box-sizing: border-box;
86
- overflow: auto;
87
-
88
- &.hide-search {
89
- grid-template-rows: 1fr auto;
90
- }
91
-
92
- &.hide-pagination {
93
- grid-template-rows: auto 1fr;
94
- }
95
-
96
- &.hide-search.hide-pagination {
97
- grid-template-rows: 1fr;
98
- }
99
- }
100
- .table-controls {
101
- display: flex;
102
- align-items: center;
103
- justify-content: space-between;
104
- gap: 1.25rem;
105
-
106
- .search-input {
107
- flex: 1;
108
- }
109
-
110
- ::v-deep(.q-btn) {
111
- flex-shrink: 0;
112
- border-radius: 2px;
113
- background: #fff;
114
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
115
- color: #3f8cff;
116
- height: 50px;
117
- width: 50px;
118
- }
119
- }
120
- .table-wrapper {
121
- position: relative;
122
- flex: 1;
123
- overflow-y: auto;
124
- }
125
- .loader-overlay {
126
- position: absolute;
127
- inset: 0;
128
- z-index: 10;
129
- background: rgba(255, 255, 255, 0.8);
130
- display: flex;
131
- align-items: center;
132
- justify-content: center;
133
- }
134
- .loader-spinner {
135
- z-index: 11;
136
- }
137
- </style>
1
+ <template>
2
+ <div class="table-layout" :class="{ 'hide-search': !isActionsSlot && hideSearch, 'hide-pagination': hidePagination }">
3
+ <div v-if="isActionsSlot || !hideSearch" class="table-controls">
4
+ <app-table-search
5
+ v-if="!hideSearch"
6
+ :model-value="props.search || ''"
7
+ class="search-input"
8
+ placeholder="Введите наименование"
9
+ @search="props.onSearch"
10
+ />
11
+ <slot v-if="isActionsSlot" name="actions" />
12
+ </div>
13
+
14
+ <div class="table-wrapper">
15
+ <app-table
16
+ v-bind="props.tableProps"
17
+ :selected-rows="props.selectedRows"
18
+ :no-hover="noHover"
19
+ :slots="slots"
20
+ :hide-pagination="hidePagination"
21
+ v-on="props.tableEvents"
22
+ @update:selectedRows="rows => emit('update:selectedRows', rows)"
23
+ >
24
+ <template v-for="name in cellSlotsNames" :key="name" #[name]="{ cellProps }">
25
+ <slot :name="name" :row="cellProps.row" />
26
+ </template>
27
+ </app-table>
28
+ <div v-if="props.loading" class="loader-overlay">
29
+ <q-spinner-audio class="loader-spinner" size="md" :thickness="3" color="primary" />
30
+ </div>
31
+ </div>
32
+
33
+ <app-table-pagination
34
+ v-if="!hidePagination && props.currentPage && props.totalPages"
35
+ :model-value="props.currentPage"
36
+ :total-pages="props.totalPages"
37
+ @page-change="props.onPageChange"
38
+ />
39
+
40
+ <slot v-if="'modal' in slots" name="modal" />
41
+ </div>
42
+ </template>
43
+ <script setup lang="ts">
44
+ import AppTable from './AppTable.vue'
45
+ import AppTablePagination from '../app-table/components/TablePagination.vue'
46
+ import AppTableSearch from '../app-table/components/TableSearch.vue'
47
+ import { defineProps, defineEmits, useSlots, computed } from 'vue'
48
+
49
+ const props = defineProps<{
50
+ search?: string
51
+ loading?: boolean
52
+ currentPage?: number
53
+ totalPages?: number
54
+ tableProps: any
55
+ tableEvents?: any
56
+ onSearch?: (val: string) => void
57
+ onPageChange?: (page: number) => void
58
+ hideSearch?: boolean
59
+ hidePagination?: boolean
60
+ noHover?: boolean
61
+ selectedRows?: any[]
62
+ }>()
63
+ const emit = defineEmits<{
64
+ 'update:selectedRows': [rows: any[]]
65
+ }>()
66
+
67
+ const slots = useSlots()
68
+
69
+ const baseSlotsNames = ['actions', 'modal']
70
+
71
+ const cellSlotsNames = computed(() => {
72
+ if (!slots) return []
73
+
74
+ return Object.keys(slots).filter((key: string) => !baseSlotsNames.includes(key))
75
+ })
76
+
77
+ const isActionsSlot = computed(() => 'actions' in slots)
78
+ </script>
79
+ <style scoped lang="scss">
80
+ .table-layout {
81
+ height: 100%;
82
+ display: grid;
83
+ grid-template-rows: auto 1fr auto;
84
+ gap: 1.25rem;
85
+ box-sizing: border-box;
86
+ overflow: auto;
87
+
88
+ &.hide-search {
89
+ grid-template-rows: 1fr auto;
90
+ }
91
+
92
+ &.hide-pagination {
93
+ grid-template-rows: auto 1fr;
94
+ }
95
+
96
+ &.hide-search.hide-pagination {
97
+ grid-template-rows: 1fr;
98
+ }
99
+ }
100
+ .table-controls {
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ gap: 1.25rem;
105
+
106
+ .search-input {
107
+ flex: 1;
108
+ }
109
+
110
+ ::v-deep(.q-btn) {
111
+ flex-shrink: 0;
112
+ border-radius: 2px;
113
+ background: #fff;
114
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
115
+ color: #3f8cff;
116
+ height: 50px;
117
+ width: 50px;
118
+ }
119
+ }
120
+ .table-wrapper {
121
+ position: relative;
122
+ flex: 1;
123
+ overflow-y: auto;
124
+ }
125
+ .loader-overlay {
126
+ position: absolute;
127
+ inset: 0;
128
+ z-index: 10;
129
+ background: rgba(255, 255, 255, 0.8);
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ }
134
+ .loader-spinner {
135
+ z-index: 11;
136
+ }
137
+ </style>