sprof 0.4.0 → 0.5.0

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.
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # sprof — UI Kit & Platform Library (PF)
2
2
 
3
3
  Библиотека UI-компонентов и платформенного ядра для проектов на **Vue 3 + Quasar 2**.
4
- Используется в rdkb (map/hr/food/leiter), portal и pros.
4
+ Используется во всех 8 клиентах: rdkb (hr/map/food/leiter/incident), portal, pros, ferma.
5
5
 
6
6
  - **P-компоненты** — обёртки над Quasar (полный проброс props/slots/events)
7
7
  - **PF / PFM** — платформенное ядро: helpers, store (BaseStore), FTSP, UI (Notify/Dialog), auth,
8
- модули (Buildings, Docs, Forms, Pages, Settings, Chats, Extracts, Menus)
8
+ модули (Tabs, Contacts, Schedule, Table, Menus, Forms)
9
9
  - **installSprof** — регистрация всех P-компонентов + Quasar-плагинов одной строкой
10
10
 
11
11
  ---
@@ -61,7 +61,7 @@ import type {} from 'sprof';
61
61
  export {};
62
62
  ```
63
63
 
64
- Ничего вручную дописывать не нужно — все 69 P-компонентов (атомы, молекулы, организмы)
64
+ Ничего вручную дописывать не нужно — все 96 P-компонентов (атомы, молекулы, организмы)
65
65
  типизируются в шаблонах автоматически.
66
66
 
67
67
  ---
@@ -85,8 +85,8 @@ export {};
85
85
  | `PBadge` | QBadge | label/color/outline/rounded/floating/multiLine |
86
86
  | `PRadio` | QRadio | v-model, label, size |
87
87
  | `PInputNumber` | QInput + QBtn | step/min/max, кнопки +/− |
88
- | `PDatePicker` | QInput | дата (legacy, см. PInputDate) |
89
- | `PInputDate` | QInput | дата |
88
+ | `PDateInput` | QInput + QDate | универсальное поле даты: mask ДД.ММ.ГГГГ + popup, модель `Date \| string` |
89
+ | `PDatePicker` / `PInputDate` | | legacy-алиасы PDateInput (удаление — TECH_DEBT Т2) |
90
90
  | `PTextarea` | QInput | resize, mask |
91
91
  | `PTooltip` | QTooltip | timeout, позиционирование, typeStyle |
92
92
  | `PString` | QItemLabel | текст с цветом/размером, isHtml |
@@ -95,14 +95,14 @@ export {};
95
95
  | `PList` / `PListItem` | QList / QItem | списки |
96
96
  | `PLeftSlider` / `PRightSlider` / `PTopSlider` | QBtn | выдвижные панели |
97
97
  | `PSticky` | div | sticky-обёртка |
98
- | `PTable` | table (HTML) | простая таблица со слотами |
98
+ | `PTableToggle` | QBtn | переключатель режима таблицы (используется в PTable модуля Table) |
99
99
 
100
100
  ### Молекулы/организмы (основные)
101
101
 
102
102
  `PAdd`, `PDel`, `PModal`, `PContainer`, `PContainerStickyHead`, `PTabs`, `PUploaderFile`,
103
- `PUploaderImage`, `PAuthForm`, `PAuthModal`, `PNameEdit`, `PNotify`, `PLoader`, `PPagination`,
104
- `PAutocomplete`, `PhoneForm`, `DateInputRange`, `FilterSelect`, `SortList`, `ThemeWrapper`
105
- и др. — полный список в реестрах `src/core/components/*/index.ts`.
103
+ `PUploaderImage`, `PAuthForm`, `PAuthModal`, `PPagination`, `PAutocomplete`,
104
+ `PContactForm*`, `PTable*`, `PCrudList`, `POptionsListMany` и др. — полный список
105
+ в реестрах `src/core/components/*/index.ts`.
106
106
 
107
107
  ---
108
108
 
@@ -111,7 +111,7 @@ export {};
111
111
  | Объект | Описание |
112
112
  | --- | --- |
113
113
  | `PF` | helpers, store (BaseStore), FTSP, UI (Notify/Dialog), auth, types |
114
- | `PFM` | модули: Buildings, Docs, Forms, Pages, Settings, Chats, Extracts, Menus |
114
+ | `PFM` | модули: Tabs, Contacts, Schedule, Table, Menus, Forms |
115
115
 
116
116
  ```ts
117
117
  import { PF, PFM } from 'sprof';
@@ -146,11 +146,13 @@ import { PF, PFM } from 'sprof';
146
146
  ## 🧪 Разработка
147
147
 
148
148
  ```bash
149
- npm run test # vitest (234 теста, 35 файлов)
149
+ npm run test # vitest (64 файла, 448 тестов)
150
150
  npm run lint # eslint src --fix
151
151
  npm run lint:check # eslint src (без мутаций, для CI)
152
152
  npm run build # сборка dist (ESM + UMD + d.ts)
153
153
  npm run check:dist # проверка бандла: нет resolveComponent("Q…")
154
+ npm run check:size # size-limit (бюджеты бандла)
155
+ npm run test:e2e # Playwright-смоук (e2e/app)
154
156
  npm run storybook # Storybook (документация компонентов)
155
157
  ```
156
158
 
@@ -163,8 +165,9 @@ npm run storybook # Storybook (документация компонентов
163
165
 
164
166
  Либо GitHub Actions `publish.yml` (workflow_dispatch, OTP-инпут).
165
167
 
166
- После публикации обновить клиентов: `npm i sprof@<версия> --save` в каждом клиенте
167
- (rdkb ×4, portal, pros), `quasar build` ×6, `make deploy` ×3.
168
+ После публикации обновить клиентов: `npm run update:clients`
169
+ `scripts/update-clients-sprof.sh` (npm ×8 + пересборка dev-контейнеров; rdkb ×5,
170
+ portal, pros, ferma).
168
171
 
169
172
  ### Генерация типов GlobalComponents
170
173
 
@@ -1,4 +1,5 @@
1
1
  import { default as FilterModel } from '../ftsp/FilterModel';
2
+ import { default as FTSP } from '../ftsp/FTSP';
2
3
  declare const _default: import('vue').DefineComponent<globalThis.ExtractPropTypes<{
3
4
  models: {
4
5
  type: {
@@ -26,6 +27,10 @@ declare const _default: import('vue').DefineComponent<globalThis.ExtractPropType
26
27
  required: false;
27
28
  default: boolean;
28
29
  };
30
+ ftsp: {
31
+ type: globalThis.PropType<FTSP>;
32
+ required: false;
33
+ };
29
34
  }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
30
35
  load: (...args: any[]) => void;
31
36
  }, string, import('vue').PublicProps, Readonly<globalThis.ExtractPropTypes<{
@@ -55,6 +60,10 @@ declare const _default: import('vue').DefineComponent<globalThis.ExtractPropType
55
60
  required: false;
56
61
  default: boolean;
57
62
  };
63
+ ftsp: {
64
+ type: globalThis.PropType<FTSP>;
65
+ required: false;
66
+ };
58
67
  }>> & Readonly<{
59
68
  onLoad?: ((...args: any[]) => any) | undefined;
60
69
  }>, {
@@ -1,8 +1,13 @@
1
+ import { default as FTSP } from '../ftsp/FTSP';
1
2
  declare const _default: import('vue').DefineComponent<globalThis.ExtractPropTypes<{
2
3
  maxWidth: {
3
4
  type: (StringConstructor | NumberConstructor)[];
4
5
  default: number;
5
6
  };
7
+ ftsp: {
8
+ type: globalThis.PropType<FTSP>;
9
+ required: false;
10
+ };
6
11
  }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
7
12
  load: (...args: any[]) => void;
8
13
  }, string, import('vue').PublicProps, Readonly<globalThis.ExtractPropTypes<{
@@ -10,6 +15,10 @@ declare const _default: import('vue').DefineComponent<globalThis.ExtractPropType
10
15
  type: (StringConstructor | NumberConstructor)[];
11
16
  default: number;
12
17
  };
18
+ ftsp: {
19
+ type: globalThis.PropType<FTSP>;
20
+ required: false;
21
+ };
13
22
  }>> & Readonly<{
14
23
  onLoad?: ((...args: any[]) => any) | undefined;
15
24
  }>, {
@@ -3,14 +3,12 @@ import { default as PButton } from './PButton/PButton.vue';
3
3
  import { default as PCheckBox } from './PCheckbox/PCheckBox.vue';
4
4
  import { default as PChip } from './PChip/PChip.vue';
5
5
  import { default as PDateInput } from './PDateInput/PDateInput.vue';
6
- import { default as PDatePicker } from './PDatePicker/PDatePicker.vue';
7
6
  import { default as PDateTimeInput } from './PDateTimeInput/PDateTimeInput.vue';
8
7
  import { default as PDialog } from './PDialog/PDialog.vue';
9
8
  import { default as PFlex } from './PFlex/PFlex.vue';
10
9
  import { default as PForm } from './PForm/PForm.vue';
11
10
  import { default as PHint } from './PHint/PHint.vue';
12
11
  import { default as PInput } from './PInput/PInput.vue';
13
- import { default as PInputDate } from './PInputDate/PInputDate.vue';
14
12
  import { default as PInputNumber } from './PInputNumber/PInputNumber.vue';
15
13
  import { default as PLeftSlider } from './PLeftSlider/PLeftSlider.vue';
16
14
  import { default as PList } from './PList/PList.vue';
@@ -30,4 +28,4 @@ import { default as PTopSlider } from './PTopSlider/PTopSlider.vue';
30
28
  export default function install(app: {
31
29
  component: (a: string, b: unknown) => void;
32
30
  }): void;
33
- export { PBadge, PButton, PCheckBox, PChip, PDateInput, PDatePicker, PDateTimeInput, PDialog, PFlex, PForm, PHint, PInput, PInputDate, PInputNumber, PLeftSlider, PList, PListItem, POptionsListSingle, POpts, PRadio, PRightSlider, PSelect, PSticky, PString, PTableToggle, PTextarea, PToggle, PTooltip, PTopSlider, };
31
+ export { PBadge, PButton, PCheckBox, PChip, PDateInput, PDateTimeInput, PDialog, PFlex, PForm, PHint, PInput, PInputNumber, PLeftSlider, PList, PListItem, POptionsListSingle, POpts, PRadio, PRightSlider, PSelect, PSticky, PString, PTableToggle, PTextarea, PToggle, PTooltip, PTopSlider, };
@@ -13,6 +13,14 @@ export default class FTSP {
13
13
  t: TreeModel;
14
14
  constructor(i?: FTSP);
15
15
  static Get(): FTSP;
16
+ /**
17
+ * Фабрика (Т1 TECH_DEBT): реактивный экземпляр на страницу/компонент.
18
+ *
19
+ * Синглтон Get() оставлен для совместимости; новый код — create() + передача
20
+ * экземпляра в useCrud/useFilters/usePagination и в компоненты с prop `ftsp`,
21
+ * чтобы фильтры/пагинация не «перетекали» между разделами.
22
+ */
23
+ static create(): FTSP;
16
24
  createFrom(ftsp: string): void;
17
25
  clearForHTTP(): FTSP;
18
26
  private static EmptyEntiries;
@@ -12,14 +12,12 @@ declare module 'vue' {
12
12
  PCheckBox: typeof Atoms.PCheckBox;
13
13
  PChip: typeof Atoms.PChip;
14
14
  PDateInput: typeof Atoms.PDateInput;
15
- PDatePicker: typeof Atoms.PDatePicker;
16
15
  PDateTimeInput: typeof Atoms.PDateTimeInput;
17
16
  PDialog: typeof Atoms.PDialog;
18
17
  PFlex: typeof Atoms.PFlex;
19
18
  PForm: typeof Atoms.PForm;
20
19
  PHint: typeof Atoms.PHint;
21
20
  PInput: typeof Atoms.PInput;
22
- PInputDate: typeof Atoms.PInputDate;
23
21
  PInputNumber: typeof Atoms.PInputNumber;
24
22
  PLeftSlider: typeof Atoms.PLeftSlider;
25
23
  PList: typeof Atoms.PList;
@@ -12,5 +12,5 @@ declare const _default: import('vue').DefineComponent<globalThis.ExtractPropType
12
12
  };
13
13
  }>> & Readonly<{
14
14
  onFill?: ((...args: any[]) => any) | undefined;
15
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
15
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
16
16
  export default _default;
@@ -58,7 +58,7 @@ declare const FiedlsComponents: {
58
58
  };
59
59
  }>> & Readonly<{
60
60
  onFill?: ((...args: any[]) => any) | undefined;
61
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
61
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
62
62
  radio: import('vue').DefineComponent<globalThis.ExtractPropTypes<{
63
63
  fieldFill: {
64
64
  type: typeof import('../../classes').FieldFill;
@@ -25,6 +25,20 @@ type __VLS_Props = {
25
25
  * и селект «Секция» у слотов.
26
26
  */
27
27
  sessionsEnabled?: boolean;
28
+ /**
29
+ * Управление днями (по умолчанию — true): вкладки дней, поле даты,
30
+ * кнопки «добавить/удалить день». Для бесдатовых однодневных расписаний
31
+ * («распорядок дня» отделения) — false: редактор работает с days[0],
32
+ * день создаётся и удаляется страницей-владельцем.
33
+ */
34
+ daysEnabled?: boolean;
35
+ /**
36
+ * Управление местами/залами (по умолчанию — true): «добавить зал»,
37
+ * выбор/создание места, удаление расписания-места. Для одноколоночных
38
+ * расписаний — false: место привязывается адаптером проекта,
39
+ * кнопки управления местами скрыты.
40
+ */
41
+ placesEnabled?: boolean;
28
42
  };
29
43
  declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
30
44
  labels: Partial<ScheduleLabels>;
@@ -37,6 +51,8 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<__
37
51
  slotListOf: (schedule: any) => any[];
38
52
  nestedSlotListOf: (session: any) => any[];
39
53
  sessionsEnabled: boolean;
54
+ daysEnabled: boolean;
55
+ placesEnabled: boolean;
40
56
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
41
57
  gridScrollRef: HTMLDivElement;
42
58
  }, HTMLDivElement>, {