shared-ritm 1.2.118 → 1.2.120

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 (42) hide show
  1. package/dist/index.css +1 -1
  2. package/dist/shared-ritm.es.js +1474 -1467
  3. package/dist/shared-ritm.umd.js +105 -105
  4. package/dist/types/api/services/AuthService.d.ts +0 -14
  5. package/dist/types/api/services/ComentsServise.d.ts +10 -0
  6. package/dist/types/api/services/PhotoService.d.ts +51 -38
  7. package/dist/types/api/services/ProjectsService.d.ts +3 -1
  8. package/dist/types/api/types/Api_Auth.d.ts +76 -0
  9. package/dist/types/api/types/Api_Projects.d.ts +4 -0
  10. package/dist/types/api/types/Api_Users.d.ts +43 -0
  11. package/dist/types/index.d.ts +1 -0
  12. package/package.json +64 -64
  13. package/src/api/services/AuthService.ts +11 -22
  14. package/src/api/services/BrigadesService.ts +32 -32
  15. package/src/api/services/EquipmentService.ts +29 -29
  16. package/src/api/services/InstrumentsService.ts +63 -63
  17. package/src/api/services/ModulesService.ts +27 -27
  18. package/src/api/services/ProjectsService.ts +8 -1
  19. package/src/api/services/SearchService.ts +22 -22
  20. package/src/api/services/UserService.ts +101 -101
  21. package/src/api/services/VideoService.ts +71 -71
  22. package/src/api/settings/ApiService.ts +124 -124
  23. package/src/api/types/Api_Auth.ts +86 -0
  24. package/src/api/types/Api_Brigades.ts +36 -36
  25. package/src/api/types/Api_Equipment.ts +3 -3
  26. package/src/api/types/Api_Instruments.ts +136 -136
  27. package/src/api/types/Api_Modules.ts +21 -21
  28. package/src/api/types/Api_Projects.ts +5 -0
  29. package/src/api/types/Api_Repairs.ts +117 -117
  30. package/src/api/types/Api_Search.ts +77 -77
  31. package/src/api/types/Api_User.ts +117 -117
  32. package/src/api/types/Api_Video.ts +140 -140
  33. package/src/common/app-input-new/AppInputNew.vue +175 -175
  34. package/src/common/app-layout/components/AppLayoutHeader.vue +23 -1
  35. package/src/common/app-sheet-new/AppSheetNew.vue +246 -246
  36. package/src/common/app-table/AppTable.vue +314 -314
  37. package/src/common/app-table/AppTableLayout.vue +137 -137
  38. package/src/common/app-table/components/ModalSelect.vue +270 -270
  39. package/src/common/app-table/components/TableModal.vue +356 -356
  40. package/src/common/app-table/controllers/useBaseTable.ts +45 -45
  41. package/src/index.ts +1 -0
  42. package/src/styles/variables.sass +12 -12
@@ -1,140 +1,140 @@
1
- import { Api_Status_DTO } from '@/api/types/Api_Tasks'
2
- import { Api_Work_Zone_By_Tasks } from '@/api/types/Api_Repairs'
3
-
4
- export type Api_Video_Source = {
5
- id: string
6
- name: string
7
- login: string
8
- password: string
9
- camera_id: string | null
10
- comment: string | null
11
- data: unknown | null
12
- snapshot_path: string | null
13
- url: string
14
- updated_at: string
15
- created_at: string
16
- fps: string
17
- domed: boolean
18
- height: number
19
- width: number
20
- }
21
-
22
- export type Api_Work_Zone_Search = {
23
- id: string
24
- name: string
25
- title: string
26
- type: number
27
- parent_id: string | null
28
- created_at: string
29
- deleted_at: string | null
30
- updated_at: string
31
- description: string
32
- detect_face: boolean
33
- detect_helmet: boolean
34
- detect_mask: boolean
35
- detect_work_time: boolean
36
- detect_work_zone: boolean
37
- has_tasks: boolean
38
- is_parent: boolean
39
- x0: number
40
- x1: number
41
- y0: number
42
- y1: number
43
- video_source: Api_Video_Source
44
- video_source_id: string
45
- warehouse_by_work_zone_instruments: unknown[]
46
- }
47
-
48
- export type Api_Work_Zone_Usage_User = {
49
- id: string
50
- user_id: string
51
- user_full_name: string
52
- work_zone_id: string
53
- start_interval: string
54
- end_interval: string
55
- minutes: number
56
- }
57
-
58
- export type Api_Work_Zone_Task = {
59
- id: string
60
- name: string
61
- plan_date: string
62
- planned_start: null | string
63
- planned_end: null | string
64
- deadline: string
65
- is_critical_path: boolean | null
66
- is_expired: boolean
67
- power_output_MWh: number
68
- cost_per_MWh: number | null
69
- fact_start_date: null | string
70
- fact_end_date: null | string
71
- time_to_complete_sec: number | null
72
- status: Api_Status_DTO
73
- usage_users: Api_Work_Zone_Usage_User[]
74
- }
75
-
76
- export type Api_Work_Zone_Coords = {
77
- x0: number
78
- x1: number
79
- y0: number
80
- y1: number
81
- }
82
-
83
- export type Api_Work_Zone = {
84
- id: string
85
- title: string
86
- created_at: string
87
- video_source: { id: string; name: string }
88
- coordinates: Api_Work_Zone_Coords
89
- warehouse_by_work_zone_instruments: unknown[]
90
- tasks: Api_Work_Zone_Task[]
91
- }
92
-
93
- export type Api_Video_Source_Search = {
94
- comment: string
95
- domed: boolean
96
- fps: string
97
- height: number
98
- id: string
99
- interactive_zones: unknown
100
- login: string
101
- name: string
102
- password: string
103
- related_video_sources: unknown[]
104
- shapes: unknown[]
105
- snapshot_path: string
106
- url: string
107
- video_source: Api_Video_Source_Search[]
108
- width: number
109
- work_zones: unknown[]
110
- }
111
-
112
- export type Api_Video_Source_Create = {
113
- fps: string
114
- height: number
115
- login: string
116
- name: string
117
- password: string
118
- url: string
119
- width: number
120
- comment?: string
121
- domed?: boolean
122
- video_source_ids?: string[]
123
- snapshot?: string
124
- }
125
-
126
- export type Api_Video_Source_By_Repair_Project = {
127
- id: string
128
- name: string
129
- deadline: string
130
- }
131
-
132
- export type Api_Video_Source_By_Repair = {
133
- list_video_source: {
134
- id: string
135
- name: string
136
- url: string
137
- work_zones_by_tasks: Api_Work_Zone_By_Tasks[]
138
- }[]
139
- project: Api_Video_Source_By_Repair_Project
140
- }
1
+ import { Api_Status_DTO } from '@/api/types/Api_Tasks'
2
+ import { Api_Work_Zone_By_Tasks } from '@/api/types/Api_Repairs'
3
+
4
+ export type Api_Video_Source = {
5
+ id: string
6
+ name: string
7
+ login: string
8
+ password: string
9
+ camera_id: string | null
10
+ comment: string | null
11
+ data: unknown | null
12
+ snapshot_path: string | null
13
+ url: string
14
+ updated_at: string
15
+ created_at: string
16
+ fps: string
17
+ domed: boolean
18
+ height: number
19
+ width: number
20
+ }
21
+
22
+ export type Api_Work_Zone_Search = {
23
+ id: string
24
+ name: string
25
+ title: string
26
+ type: number
27
+ parent_id: string | null
28
+ created_at: string
29
+ deleted_at: string | null
30
+ updated_at: string
31
+ description: string
32
+ detect_face: boolean
33
+ detect_helmet: boolean
34
+ detect_mask: boolean
35
+ detect_work_time: boolean
36
+ detect_work_zone: boolean
37
+ has_tasks: boolean
38
+ is_parent: boolean
39
+ x0: number
40
+ x1: number
41
+ y0: number
42
+ y1: number
43
+ video_source: Api_Video_Source
44
+ video_source_id: string
45
+ warehouse_by_work_zone_instruments: unknown[]
46
+ }
47
+
48
+ export type Api_Work_Zone_Usage_User = {
49
+ id: string
50
+ user_id: string
51
+ user_full_name: string
52
+ work_zone_id: string
53
+ start_interval: string
54
+ end_interval: string
55
+ minutes: number
56
+ }
57
+
58
+ export type Api_Work_Zone_Task = {
59
+ id: string
60
+ name: string
61
+ plan_date: string
62
+ planned_start: null | string
63
+ planned_end: null | string
64
+ deadline: string
65
+ is_critical_path: boolean | null
66
+ is_expired: boolean
67
+ power_output_MWh: number
68
+ cost_per_MWh: number | null
69
+ fact_start_date: null | string
70
+ fact_end_date: null | string
71
+ time_to_complete_sec: number | null
72
+ status: Api_Status_DTO
73
+ usage_users: Api_Work_Zone_Usage_User[]
74
+ }
75
+
76
+ export type Api_Work_Zone_Coords = {
77
+ x0: number
78
+ x1: number
79
+ y0: number
80
+ y1: number
81
+ }
82
+
83
+ export type Api_Work_Zone = {
84
+ id: string
85
+ title: string
86
+ created_at: string
87
+ video_source: { id: string; name: string }
88
+ coordinates: Api_Work_Zone_Coords
89
+ warehouse_by_work_zone_instruments: unknown[]
90
+ tasks: Api_Work_Zone_Task[]
91
+ }
92
+
93
+ export type Api_Video_Source_Search = {
94
+ comment: string
95
+ domed: boolean
96
+ fps: string
97
+ height: number
98
+ id: string
99
+ interactive_zones: unknown
100
+ login: string
101
+ name: string
102
+ password: string
103
+ related_video_sources: unknown[]
104
+ shapes: unknown[]
105
+ snapshot_path: string
106
+ url: string
107
+ video_source: Api_Video_Source_Search[]
108
+ width: number
109
+ work_zones: unknown[]
110
+ }
111
+
112
+ export type Api_Video_Source_Create = {
113
+ fps: string
114
+ height: number
115
+ login: string
116
+ name: string
117
+ password: string
118
+ url: string
119
+ width: number
120
+ comment?: string
121
+ domed?: boolean
122
+ video_source_ids?: string[]
123
+ snapshot?: string
124
+ }
125
+
126
+ export type Api_Video_Source_By_Repair_Project = {
127
+ id: string
128
+ name: string
129
+ deadline: string
130
+ }
131
+
132
+ export type Api_Video_Source_By_Repair = {
133
+ list_video_source: {
134
+ id: string
135
+ name: string
136
+ url: string
137
+ work_zones_by_tasks: Api_Work_Zone_By_Tasks[]
138
+ }[]
139
+ project: Api_Video_Source_By_Repair_Project
140
+ }
@@ -1,175 +1,175 @@
1
- <template>
2
- <div class="app-input-new">
3
- <label v-if="label" class="app-input-new__label">
4
- {{ label }}
5
- <span v-if="required" class="required">*</span>
6
- </label>
7
-
8
- <q-input
9
- v-model="model"
10
- filled
11
- :type="inputType"
12
- :rules="rules"
13
- :placeholder="placeholder"
14
- :disable="disable"
15
- :readonly="readonly"
16
- :class="inputClass"
17
- :error="error"
18
- :autocomplete="autocomplete"
19
- @blur="emit('blur')"
20
- >
21
- <slot />
22
- <template #append>
23
- <slot name="append" />
24
- <q-icon
25
- v-if="type === 'password'"
26
- :name="isVisiblePass ? 'visibility' : 'visibility_off'"
27
- color="primary"
28
- class="cursor-pointer"
29
- @click="isVisiblePass = !isVisiblePass"
30
- />
31
- <q-icon
32
- v-if="clearable && String(model)?.length"
33
- name="close"
34
- class="cursor-pointer clear-input"
35
- @click="model = null"
36
- />
37
- <q-btn
38
- v-if="uuid && !disable && !readonly"
39
- flat
40
- no-caps
41
- label="UUID"
42
- size="sm"
43
- class="q-ml-sm uuid-btn"
44
- @click="model = uuidv4()"
45
- />
46
- <q-icon
47
- v-if="copyable"
48
- name="content_copy"
49
- class="cursor-pointer q-ml-sm copy-icon"
50
- color="primary"
51
- :disable="!model"
52
- @click="copyToClipboard"
53
- />
54
- </template>
55
- </q-input>
56
- </div>
57
- </template>
58
-
59
- <script setup lang="ts">
60
- import { defineEmits, defineProps, computed, ref } from 'vue'
61
- import { uuidv4 } from '@/utils/helpers'
62
- import { notificationSettings } from '@/utils/notification'
63
- import { QInputProps, useQuasar } from 'quasar'
64
-
65
- const props = defineProps<
66
- QInputProps & {
67
- modelValue?: string | number | null
68
- label?: string
69
- placeholder?: string
70
- rules?: ((val: string | number | null | undefined) => boolean | string)[]
71
- inputClass?: string
72
- required?: boolean
73
- readonly?: boolean
74
- disable?: boolean
75
- uuid?: boolean
76
- clearable?: boolean
77
- copyable?: boolean
78
- error?: boolean
79
- autocomplete?: string
80
- }
81
- >()
82
-
83
- const emit = defineEmits<{
84
- (e: 'update:modelValue', val?: string | number | null): void
85
- (e: 'blur', val?: string | number | null): void
86
- }>()
87
-
88
- const $q = useQuasar()
89
-
90
- const isVisiblePass = ref(false)
91
-
92
- const model = computed({
93
- get: () => getValue(props.modelValue),
94
- set: (newValue?: string | number | null) => emit('update:modelValue', getValue(newValue)),
95
- })
96
-
97
- const inputType = computed(() => (props.type === 'password' && isVisiblePass.value ? 'text' : props.type))
98
-
99
- const getValue = (value?: string | number | null) => {
100
- if (props.type === 'number') return value ? +value : value
101
-
102
- return value
103
- }
104
-
105
- const copyToClipboard = () => {
106
- if (!model.value && model.value !== 0) return
107
-
108
- navigator.clipboard.writeText(model.value.toString()).then(() => {
109
- $q.notify(notificationSettings('success', 'Данные скопированы'))
110
- })
111
- }
112
- </script>
113
-
114
- <style scoped lang="scss">
115
- .app-input-new {
116
- display: flex;
117
- flex-direction: column;
118
- margin-bottom: 15px;
119
-
120
- &__label {
121
- font-size: 14px;
122
- font-weight: 700;
123
- color: #7d8592;
124
- }
125
-
126
- .required {
127
- color: #f65160;
128
- font-weight: bold;
129
- }
130
-
131
- .clear-input {
132
- color: #d8e0f0;
133
- }
134
-
135
- .uuid-btn {
136
- height: 32px;
137
- padding: 0 10px;
138
- border: 1px solid #3f8cff;
139
- color: #3f8cff;
140
- font-weight: 700;
141
- font-size: 14px;
142
- background: white;
143
- border-radius: 6px;
144
-
145
- :deep(.block) {
146
- line-height: normal;
147
- }
148
- }
149
-
150
- :deep(.q-placeholder) {
151
- color: #7d8592;
152
- }
153
-
154
- :deep(.q-field__control) {
155
- min-height: 58px;
156
- border-radius: 8px;
157
- border: 1px solid #d8e0f0;
158
- background: #fff;
159
- box-shadow: 0 1px 2px 0 rgba(184, 200, 224, 0.22);
160
- }
161
-
162
- :deep(.q-field--filled .q-field__control:before) {
163
- background: #fff !important;
164
- border: none;
165
- }
166
-
167
- :deep(.q-field--with-bottom) {
168
- padding-bottom: 0;
169
- }
170
-
171
- :deep(.q-field__bottom) {
172
- padding: 0;
173
- }
174
- }
175
- </style>
1
+ <template>
2
+ <div class="app-input-new">
3
+ <label v-if="label" class="app-input-new__label">
4
+ {{ label }}
5
+ <span v-if="required" class="required">*</span>
6
+ </label>
7
+
8
+ <q-input
9
+ v-model="model"
10
+ filled
11
+ :type="inputType"
12
+ :rules="rules"
13
+ :placeholder="placeholder"
14
+ :disable="disable"
15
+ :readonly="readonly"
16
+ :class="inputClass"
17
+ :error="error"
18
+ :autocomplete="autocomplete"
19
+ @blur="emit('blur')"
20
+ >
21
+ <slot />
22
+ <template #append>
23
+ <slot name="append" />
24
+ <q-icon
25
+ v-if="type === 'password'"
26
+ :name="isVisiblePass ? 'visibility' : 'visibility_off'"
27
+ color="primary"
28
+ class="cursor-pointer"
29
+ @click="isVisiblePass = !isVisiblePass"
30
+ />
31
+ <q-icon
32
+ v-if="clearable && String(model)?.length"
33
+ name="close"
34
+ class="cursor-pointer clear-input"
35
+ @click="model = null"
36
+ />
37
+ <q-btn
38
+ v-if="uuid && !disable && !readonly"
39
+ flat
40
+ no-caps
41
+ label="UUID"
42
+ size="sm"
43
+ class="q-ml-sm uuid-btn"
44
+ @click="model = uuidv4()"
45
+ />
46
+ <q-icon
47
+ v-if="copyable"
48
+ name="content_copy"
49
+ class="cursor-pointer q-ml-sm copy-icon"
50
+ color="primary"
51
+ :disable="!model"
52
+ @click="copyToClipboard"
53
+ />
54
+ </template>
55
+ </q-input>
56
+ </div>
57
+ </template>
58
+
59
+ <script setup lang="ts">
60
+ import { defineEmits, defineProps, computed, ref } from 'vue'
61
+ import { uuidv4 } from '@/utils/helpers'
62
+ import { notificationSettings } from '@/utils/notification'
63
+ import { QInputProps, useQuasar } from 'quasar'
64
+
65
+ const props = defineProps<
66
+ QInputProps & {
67
+ modelValue?: string | number | null
68
+ label?: string
69
+ placeholder?: string
70
+ rules?: ((val: string | number | null | undefined) => boolean | string)[]
71
+ inputClass?: string
72
+ required?: boolean
73
+ readonly?: boolean
74
+ disable?: boolean
75
+ uuid?: boolean
76
+ clearable?: boolean
77
+ copyable?: boolean
78
+ error?: boolean
79
+ autocomplete?: string
80
+ }
81
+ >()
82
+
83
+ const emit = defineEmits<{
84
+ (e: 'update:modelValue', val?: string | number | null): void
85
+ (e: 'blur', val?: string | number | null): void
86
+ }>()
87
+
88
+ const $q = useQuasar()
89
+
90
+ const isVisiblePass = ref(false)
91
+
92
+ const model = computed({
93
+ get: () => getValue(props.modelValue),
94
+ set: (newValue?: string | number | null) => emit('update:modelValue', getValue(newValue)),
95
+ })
96
+
97
+ const inputType = computed(() => (props.type === 'password' && isVisiblePass.value ? 'text' : props.type))
98
+
99
+ const getValue = (value?: string | number | null) => {
100
+ if (props.type === 'number') return value ? +value : value
101
+
102
+ return value
103
+ }
104
+
105
+ const copyToClipboard = () => {
106
+ if (!model.value && model.value !== 0) return
107
+
108
+ navigator.clipboard.writeText(model.value.toString()).then(() => {
109
+ $q.notify(notificationSettings('success', 'Данные скопированы'))
110
+ })
111
+ }
112
+ </script>
113
+
114
+ <style scoped lang="scss">
115
+ .app-input-new {
116
+ display: flex;
117
+ flex-direction: column;
118
+ margin-bottom: 15px;
119
+
120
+ &__label {
121
+ font-size: 14px;
122
+ font-weight: 700;
123
+ color: #7d8592;
124
+ }
125
+
126
+ .required {
127
+ color: #f65160;
128
+ font-weight: bold;
129
+ }
130
+
131
+ .clear-input {
132
+ color: #d8e0f0;
133
+ }
134
+
135
+ .uuid-btn {
136
+ height: 32px;
137
+ padding: 0 10px;
138
+ border: 1px solid #3f8cff;
139
+ color: #3f8cff;
140
+ font-weight: 700;
141
+ font-size: 14px;
142
+ background: white;
143
+ border-radius: 6px;
144
+
145
+ :deep(.block) {
146
+ line-height: normal;
147
+ }
148
+ }
149
+
150
+ :deep(.q-placeholder) {
151
+ color: #7d8592;
152
+ }
153
+
154
+ :deep(.q-field__control) {
155
+ min-height: 58px;
156
+ border-radius: 8px;
157
+ border: 1px solid #d8e0f0;
158
+ background: #fff;
159
+ box-shadow: 0 1px 2px 0 rgba(184, 200, 224, 0.22);
160
+ }
161
+
162
+ :deep(.q-field--filled .q-field__control:before) {
163
+ background: #fff !important;
164
+ border: none;
165
+ }
166
+
167
+ :deep(.q-field--with-bottom) {
168
+ padding-bottom: 0;
169
+ }
170
+
171
+ :deep(.q-field__bottom) {
172
+ padding: 0;
173
+ }
174
+ }
175
+ </style>
@@ -3,7 +3,10 @@
3
3
  <q-toolbar :class="$style.toolbar">
4
4
  <h1>{{ pageTitle }}</h1>
5
5
  <div :class="$style['action-buttons']">
6
- <p v-if="settingsMenuItems?.find(x => x.name === 'root-on' && x.isShow)" style="color: red">Root-режим</p>
6
+ <div v-if="settingsMenuItems?.find(x => x.name === 'root-on' && x.isShow)" :class="$style['root-mode']">
7
+ <h1>Включен Root-режим</h1>
8
+ </div>
9
+
7
10
  <div :class="$style['person']" @click="clickProfile">
8
11
  <app-icon name="person-icon" />
9
12
  <div :class="$style['person__info']">
@@ -147,6 +150,25 @@ onClickOutside(refMenuSettings, () => (isSettingsOpened.value = false))
147
150
  background: white;
148
151
  }
149
152
 
153
+ .root-mode {
154
+ display: flex;
155
+ align-items: center;
156
+ background-color: red;
157
+ padding: 14px;
158
+ border-radius: 10px;
159
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2), 0 2px 2px rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12);
160
+ cursor: pointer;
161
+ user-select: none;
162
+ h1 {
163
+ font-size: 16px;
164
+ font-weight: 600;
165
+ font-family: 'Nunito Sans', sans-serif;
166
+ }
167
+ &:active {
168
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 4px rgba(0, 0, 0, 0.2), 0 6px 2px -5px rgba(0, 0, 0, 0.2);
169
+ }
170
+ }
171
+
150
172
  .person {
151
173
  display: flex;
152
174
  align-items: center;