shared-ritm 1.3.38 → 1.3.39

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 (62) hide show
  1. package/dist/index.css +1 -1
  2. package/dist/shared-ritm.es.js +7 -7
  3. package/dist/shared-ritm.umd.js +150 -150
  4. package/package.json +70 -64
  5. package/src/App.vue +2461 -2461
  6. package/src/api/services/ControlsService.ts +96 -96
  7. package/src/api/services/EquipmentService.ts +29 -29
  8. package/src/api/services/GanttService.ts +23 -23
  9. package/src/api/services/MetricsService.ts +123 -123
  10. package/src/api/services/RepairsService.ts +111 -111
  11. package/src/api/services/TasksService.ts +157 -157
  12. package/src/api/services/UserService.ts +123 -123
  13. package/src/api/services/VideoService.ts +118 -118
  14. package/src/api/types/Api_Metrics.ts +5 -5
  15. package/src/api/types/Api_Repairs.ts +186 -186
  16. package/src/api/types/Api_Tasks.ts +376 -376
  17. package/src/api/types/Api_Video.ts +244 -244
  18. package/src/common/app-button/Button.stories.ts +369 -0
  19. package/src/common/app-checkbox/Checkbox.stories.ts +60 -0
  20. package/src/common/app-date-picker/DatePicker.stories.ts +66 -0
  21. package/src/common/app-datepicker/Datepicker.stories.ts +145 -0
  22. package/src/common/app-dialogs/AppConfirmDialog.vue +109 -109
  23. package/src/common/app-dialogs/Confirm.stories.ts +93 -0
  24. package/src/common/app-dropdown/Dropdown.stories.ts +94 -0
  25. package/src/common/app-file/File.stories.ts +104 -0
  26. package/src/common/app-icon/AppIcon.vue +108 -108
  27. package/src/common/app-icon/Icon.stories.ts +91 -0
  28. package/src/common/app-input/Input.stories.ts +160 -0
  29. package/src/common/app-input-new/InputNew.stories.ts +240 -0
  30. package/src/common/app-input-search/InputSearch.stories.ts +149 -0
  31. package/src/common/app-layout/components/AppLayoutHeader.vue +289 -273
  32. package/src/common/app-loader/Loader.stories.ts +114 -0
  33. package/src/common/app-select/AppSelect.vue +159 -159
  34. package/src/common/app-select/Select.stories.ts +155 -0
  35. package/src/common/app-sidebar/AppSidebar.vue +174 -174
  36. package/src/common/app-table/AppTable.vue +313 -313
  37. package/src/common/app-table/components/ModalSelect.stories.ts +323 -0
  38. package/src/common/app-table/components/ModalSelect.vue +302 -302
  39. package/src/common/app-table/components/TableModal.vue +367 -367
  40. package/src/common/app-table/controllers/useColumnSelector.ts +45 -45
  41. package/src/common/app-table/controllers/useTableModel.ts +97 -102
  42. package/src/common/app-toggle/Toggle.stories.ts +69 -0
  43. package/src/common/app-wrapper/AppWrapper.vue +31 -28
  44. package/src/configs/storybook.ts +14 -0
  45. package/src/index.ts +131 -131
  46. package/src/shared/styles/general.css +140 -124
  47. package/src/styles/variables.sass +12 -12
  48. package/src/utils/helpers.ts +59 -59
  49. package/dist/types/api/services/PhotoService.d.ts +0 -40
  50. package/dist/types/stories/Button.stories.d.ts +0 -13
  51. package/dist/types/stories/Checkbox.stories.d.ts +0 -7
  52. package/dist/types/stories/Confirm.stories.d.ts +0 -8
  53. package/dist/types/stories/DatePicker.stories.d.ts +0 -8
  54. package/dist/types/stories/Dropdown.stories.d.ts +0 -8
  55. package/dist/types/stories/File.stories.d.ts +0 -8
  56. package/dist/types/stories/Icon.stories.d.ts +0 -7
  57. package/dist/types/stories/Input.stories.d.ts +0 -11
  58. package/dist/types/stories/InputNew.stories.d.ts +0 -12
  59. package/dist/types/stories/InputSearch.stories.d.ts +0 -10
  60. package/dist/types/stories/Loader.stories.d.ts +0 -8
  61. package/dist/types/stories/Select.stories.d.ts +0 -7
  62. package/dist/types/stories/Toggle.stories.d.ts +0 -8
@@ -1,45 +1,45 @@
1
- import { computed, ref } from 'vue'
2
-
3
- export interface ColumnConfig {
4
- name: string
5
- label: string
6
- [key: string]: any
7
- }
8
-
9
- export function useColumnSelector(allColumns: ColumnConfig[], fixedColumnNames: string[] = []) {
10
- const selectedColumnNames = ref<string[]>([...new Set([...fixedColumnNames, ...allColumns.map(col => col.name)])])
11
-
12
- const visibleColumns = computed(() => allColumns.filter(col => selectedColumnNames.value.includes(col.name)))
13
-
14
- function openColumnSelectorDialog($q: any) {
15
- $q.dialog({
16
- title: 'Выберите колонки',
17
- options: {
18
- type: 'checkbox',
19
- model: [...selectedColumnNames.value],
20
- items: allColumns.map(col => ({
21
- label: col.label,
22
- value: col.name,
23
- disable: fixedColumnNames.includes(col.name),
24
- })),
25
- },
26
- cancel: {
27
- label: 'Отмена',
28
- 'data-test': 'cancel-button',
29
- },
30
- ok: {
31
- label: 'Ок',
32
- 'data-test': 'ok-button',
33
- },
34
- persistent: true,
35
- }).onOk((val: string[]) => {
36
- selectedColumnNames.value = Array.from(new Set([...val, ...fixedColumnNames]))
37
- })
38
- }
39
-
40
- return {
41
- selectedColumnNames,
42
- visibleColumns,
43
- openColumnSelectorDialog,
44
- }
45
- }
1
+ import { computed, ref } from 'vue'
2
+
3
+ export interface ColumnConfig {
4
+ name: string
5
+ label: string
6
+ [key: string]: any
7
+ }
8
+
9
+ export function useColumnSelector(allColumns: ColumnConfig[], fixedColumnNames: string[] = []) {
10
+ const selectedColumnNames = ref<string[]>([...new Set([...fixedColumnNames, ...allColumns.map(col => col.name)])])
11
+
12
+ const visibleColumns = computed(() => allColumns.filter(col => selectedColumnNames.value.includes(col.name)))
13
+
14
+ function openColumnSelectorDialog($q: any) {
15
+ $q.dialog({
16
+ title: 'Выберите колонки',
17
+ options: {
18
+ type: 'checkbox',
19
+ model: [...selectedColumnNames.value],
20
+ items: allColumns.map(col => ({
21
+ label: col.label,
22
+ value: col.name,
23
+ disable: fixedColumnNames.includes(col.name),
24
+ })),
25
+ },
26
+ cancel: {
27
+ label: 'Отмена',
28
+ 'data-test': 'cancel-button',
29
+ },
30
+ ok: {
31
+ label: 'Ок',
32
+ 'data-test': 'ok-button',
33
+ },
34
+ persistent: true,
35
+ }).onOk((val: string[]) => {
36
+ selectedColumnNames.value = Array.from(new Set([...val, ...fixedColumnNames]))
37
+ })
38
+ }
39
+
40
+ return {
41
+ selectedColumnNames,
42
+ visibleColumns,
43
+ openColumnSelectorDialog,
44
+ }
45
+ }
@@ -1,102 +1,97 @@
1
- import { Ref, computed, ref } from 'vue'
2
-
3
- export interface TableColumn {
4
- name: string
5
- label: string
6
- style?: string
7
- headerStyle?: string
8
- field?: string | ((row: any) => any)
9
- sortable?: boolean
10
- filterType?: 'single' | 'multi' | null
11
- align?: 'left' | 'center' | 'right'
12
- badge?: {
13
- true?: string
14
- false?: string
15
- colorTrue?: string
16
- colorFalse?: string
17
- }
18
- format?: (val: any) => any
19
- html?: boolean
20
- }
21
-
22
- export interface FilterOption {
23
- id: string
24
- name: string
25
- }
26
-
27
- export interface TableModel<T = any> {
28
- columns: TableColumn[]
29
- rows: T[] | Ref<T[]>
30
- filtersOptions?: Ref<Record<string, FilterOption[]>>
31
- }
32
-
33
- export const useTableModel = <T = any>(model: TableModel<T>) => {
34
- const columnFilters = ref<Record<string, string | string[] | undefined>>({})
35
- const filterMenus = ref<Record<string, boolean>>({})
36
-
37
- model.columns.forEach(({ name, filterType }) => {
38
- if (filterType) {
39
- columnFilters.value[name] = filterType === 'multi' ? [] : undefined
40
- filterMenus.value[name] = false
41
- }
42
- })
43
-
44
- const resolvedRows = computed(() => (Array.isArray(model.rows) ? model.rows : model.rows.value))
45
-
46
- const toggleFilterValue = (colName: string, value: string) => {
47
- const col = model.columns.find(c => c.name === colName)
48
- if (col?.filterType === 'multi') {
49
- const current = columnFilters.value[colName] as string[]
50
- const index = current.indexOf(value)
51
- index > -1 ? current.splice(index, 1) : current.push(value)
52
- columnFilters.value[colName] = [...current]
53
- } else {
54
- columnFilters.value[colName] = value
55
- filterMenus.value[colName] = false
56
- }
57
- }
58
-
59
- const selectedFilters = computed(() => {
60
- const result: Record<string, string[]> = {}
61
- for (const col of model.columns) {
62
- const filter = columnFilters.value[col.name]
63
- const options = model.filtersOptions?.value[col.name] || []
64
-
65
- if (filter) {
66
- let selectedIds: string[] = []
67
- if (Array.isArray(filter)) {
68
- selectedIds = options
69
- .filter(opt => filter.includes(opt.name))
70
- .map(opt => opt.id)
71
- } else {
72
- selectedIds = options
73
- .filter(opt => opt.name === filter)
74
- .map(opt => opt.id)
75
- }
76
- result[col.name] = Array.from(new Set(selectedIds))
77
- }
78
- }
79
- return result
80
- })
81
-
82
-
83
- const clearFilter = (colName: string) => {
84
- const col = model.columns.find(c => c.name === colName)
85
- columnFilters.value[colName] = col?.filterType === 'multi' ? [] : undefined
86
- }
87
-
88
- const openFilterMenu = (colName: string, isOpen: boolean) => {
89
- filterMenus.value[colName] = isOpen
90
- }
91
-
92
- return {
93
- rows: resolvedRows,
94
- columns: computed(() => model.columns),
95
- columnFilters,
96
- filterMenus,
97
- toggleFilterValue,
98
- clearFilter,
99
- openFilterMenu,
100
- selectedFilters,
101
- }
102
- }
1
+ import { Ref, computed, ref } from 'vue'
2
+
3
+ export interface TableColumn {
4
+ name: string
5
+ label: string
6
+ style?: string
7
+ headerStyle?: string
8
+ field?: string | ((row: any) => any)
9
+ sortable?: boolean
10
+ filterType?: 'single' | 'multi' | null
11
+ align?: 'left' | 'center' | 'right'
12
+ badge?: {
13
+ true?: string
14
+ false?: string
15
+ colorTrue?: string
16
+ colorFalse?: string
17
+ }
18
+ format?: (val: any) => any
19
+ html?: boolean
20
+ }
21
+
22
+ export interface FilterOption {
23
+ id: string
24
+ name: string
25
+ }
26
+
27
+ export interface TableModel<T = any> {
28
+ columns: TableColumn[]
29
+ rows: T[] | Ref<T[]>
30
+ filtersOptions?: Ref<Record<string, FilterOption[]>>
31
+ }
32
+
33
+ export const useTableModel = <T = any>(model: TableModel<T>) => {
34
+ const columnFilters = ref<Record<string, string | string[] | undefined>>({})
35
+ const filterMenus = ref<Record<string, boolean>>({})
36
+
37
+ model.columns.forEach(({ name, filterType }) => {
38
+ if (filterType) {
39
+ columnFilters.value[name] = filterType === 'multi' ? [] : undefined
40
+ filterMenus.value[name] = false
41
+ }
42
+ })
43
+
44
+ const resolvedRows = computed(() => (Array.isArray(model.rows) ? model.rows : model.rows.value))
45
+
46
+ const toggleFilterValue = (colName: string, value: string) => {
47
+ const col = model.columns.find(c => c.name === colName)
48
+ if (col?.filterType === 'multi') {
49
+ const current = columnFilters.value[colName] as string[]
50
+ const index = current.indexOf(value)
51
+ index > -1 ? current.splice(index, 1) : current.push(value)
52
+ columnFilters.value[colName] = [...current]
53
+ } else {
54
+ columnFilters.value[colName] = value
55
+ filterMenus.value[colName] = false
56
+ }
57
+ }
58
+
59
+ const selectedFilters = computed(() => {
60
+ const result: Record<string, string[]> = {}
61
+ for (const col of model.columns) {
62
+ const filter = columnFilters.value[col.name]
63
+ const options = model.filtersOptions?.value[col.name] || []
64
+
65
+ if (filter) {
66
+ let selectedIds: string[] = []
67
+ if (Array.isArray(filter)) {
68
+ selectedIds = options.filter(opt => filter.includes(opt.name)).map(opt => opt.id)
69
+ } else {
70
+ selectedIds = options.filter(opt => opt.name === filter).map(opt => opt.id)
71
+ }
72
+ result[col.name] = Array.from(new Set(selectedIds))
73
+ }
74
+ }
75
+ return result
76
+ })
77
+
78
+ const clearFilter = (colName: string) => {
79
+ const col = model.columns.find(c => c.name === colName)
80
+ columnFilters.value[colName] = col?.filterType === 'multi' ? [] : undefined
81
+ }
82
+
83
+ const openFilterMenu = (colName: string, isOpen: boolean) => {
84
+ filterMenus.value[colName] = isOpen
85
+ }
86
+
87
+ return {
88
+ rows: resolvedRows,
89
+ columns: computed(() => model.columns),
90
+ columnFilters,
91
+ filterMenus,
92
+ toggleFilterValue,
93
+ clearFilter,
94
+ openFilterMenu,
95
+ selectedFilters,
96
+ }
97
+ }
@@ -0,0 +1,69 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import AppToggle from '@/common/app-toggle/AppToggle.vue'
3
+
4
+ const meta: Meta<typeof AppToggle> = {
5
+ title: 'Components/AppToggle',
6
+ component: AppToggle,
7
+ tags: ['autodocs'],
8
+ argTypes: {
9
+ modelValue: {
10
+ control: 'boolean',
11
+ },
12
+ disable: {
13
+ control: 'boolean',
14
+ },
15
+ },
16
+ args: {
17
+ modelValue: false,
18
+ disable: false,
19
+ },
20
+ }
21
+
22
+ export default meta
23
+
24
+ type Story = StoryObj<typeof AppToggle>
25
+
26
+ export const Default: Story = {}
27
+
28
+ export const States: Story = {
29
+ render: () => ({
30
+ components: { AppToggle },
31
+ template: `
32
+ <div style="display: flex; flex-direction: column; gap: 12px;">
33
+ <label style="display: flex; align-items: center; gap: 12px;">
34
+ <AppToggle :model-value="true" />
35
+ Включён
36
+ </label>
37
+ <label style="display: flex; align-items: center; gap: 12px;">
38
+ <AppToggle :model-value="false" />
39
+ Выключен
40
+ </label>
41
+ <label style="display: flex; align-items: center; gap: 12px; opacity: 0.6;">
42
+ <AppToggle :model-value="true" :disable="true" />
43
+ Включён + отключён
44
+ </label>
45
+ <label style="display: flex; align-items: center; gap: 12px; opacity: 0.6;">
46
+ <AppToggle :model-value="false" :disable="true" />
47
+ Выключен + отключён
48
+ </label>
49
+ </div>
50
+ `,
51
+ }),
52
+ }
53
+
54
+ export const WithBinding: Story = {
55
+ render: () => ({
56
+ components: { AppToggle },
57
+ template: `
58
+ <div style="display: flex; align-items: center; gap: 16px;">
59
+ <AppToggle v-model="toggleState" />
60
+ <span>Значение: {{ toggleState ? 'включено' : 'выключено' }}</span>
61
+ </div>
62
+ `,
63
+ data() {
64
+ return {
65
+ toggleState: true,
66
+ }
67
+ },
68
+ }),
69
+ }
@@ -1,28 +1,31 @@
1
- <template>
2
- <div class="app-wrapper">
3
- <slot />
4
- </div>
5
- </template>
6
- <script setup lang="ts"></script>
7
- <style scoped lang="scss">
8
- .app-wrapper {
9
- width: 100%;
10
- height: 100%;
11
- margin: 20px 0 12px 0;
12
- padding: 30px;
13
- border-radius: 8px;
14
- background: #fff;
15
- outline: 4px solid #598dd5;
16
- outline-offset: -3px;
17
- box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25), 0px 4px 4px 0px #c4d7f1 inset,
18
- 0px 0px 6.4px 3px rgba(31, 82, 159, 0.5), 0px 6px 58px 0px rgba(0, 49, 122, 0.1);
19
- }
20
-
21
- @media (max-width: 1440px) {
22
- .app-wrapper {
23
- margin: 10px 0;
24
- padding: 14px;
25
- border-radius: 8px;
26
- }
27
- }
28
- </style>
1
+ <template>
2
+ <div class="app-wrapper">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+ <script setup lang="ts"></script>
7
+ <style scoped lang="scss">
8
+ .app-wrapper {
9
+ width: 100%;
10
+ height: 100%;
11
+ margin: 20px 0 12px 0;
12
+ padding: 30px;
13
+ border-radius: 8px;
14
+ background: #fff;
15
+ outline: 4px solid #598dd5;
16
+ outline-offset: -3px;
17
+ box-shadow:
18
+ 0px 4px 4px 0px rgba(0, 0, 0, 0.25),
19
+ 0px 4px 4px 0px #c4d7f1 inset,
20
+ 0px 0px 6.4px 3px rgba(31, 82, 159, 0.5),
21
+ 0px 6px 58px 0px rgba(0, 49, 122, 0.1);
22
+ }
23
+
24
+ @media (max-width: 1440px) {
25
+ .app-wrapper {
26
+ margin: 10px 0;
27
+ padding: 14px;
28
+ border-radius: 8px;
29
+ }
30
+ }
31
+ </style>
@@ -0,0 +1,14 @@
1
+ export const quasarColorOpts = [
2
+ 'primary',
3
+ 'secondary',
4
+ 'accent',
5
+ 'positive',
6
+ 'negative',
7
+ 'info',
8
+ 'warning',
9
+ 'dark',
10
+ 'light',
11
+ 'faded',
12
+ 'white',
13
+ 'black',
14
+ ]