adminizer 4.3.0-build.74 → 4.3.0-build.75

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 (75) hide show
  1. package/assets/add-B-wtzl14.js +1 -0
  2. package/assets/{add-form-CGi_qv3J.js → add-form-BlPl0S7W.js} +1 -1
  3. package/assets/add-group-CGiSK3je.js +1 -0
  4. package/assets/{add-group-form-DSd4UrnU.js → add-group-form-Chb9XkVr.js} +1 -1
  5. package/assets/add-user-CI91aShE.js +1 -0
  6. package/assets/{add-user-form-BAssKDpI.js → add-user-form-CpszaZtW.js} +1 -1
  7. package/assets/{app-GsYdx39W.css → app-CpGtjhxF.css} +1 -1
  8. package/assets/app-layout-CDjEwM9a.js +1 -0
  9. package/assets/{app-shell-DHzMWA1L.js → app-shell-CByYJPLe.js} +1 -1
  10. package/assets/{app-sidebar-D7l5BJPV.js → app-sidebar-CLPoDV2f.js} +1 -1
  11. package/assets/app-sidebar-header-B1mI-oGm.js +1 -0
  12. package/assets/app.js +2 -2
  13. package/assets/{breadcrumbs-DnNOEnT4.js → breadcrumbs-0GLBx1iv.js} +1 -1
  14. package/assets/{catalog-BavcTVb4.js → catalog-BEnuFPi6.js} +1 -1
  15. package/assets/{dashboard-xr-OyVyG.js → dashboard-Cb4RAfgr.js} +1 -1
  16. package/assets/{date-picker-DBHnomTY.js → date-picker-Gy19IF7Q.js} +1 -1
  17. package/assets/{del-modal-BeF4r3gk.js → del-modal-COG1XcES.js} +1 -1
  18. package/assets/{field-renderer-Sd68OLyc.js → field-renderer-CrsFaZNM.js} +3 -3
  19. package/assets/{form-DomTBI89.js → form-BwafUUB7.js} +1 -1
  20. package/assets/form-X67d3x3D.js +1 -0
  21. package/assets/{geo-json-CVaNUZbb.js → geo-json-Dswzlx0K.js} +1 -1
  22. package/assets/{handsontable-CZQ5Ietj.js → handsontable-DQYtlTE2.js} +1 -1
  23. package/assets/home-DlxjWnrt.js +2 -0
  24. package/assets/icon-BWrEqTE-.js +1 -0
  25. package/assets/{init-user-DqMDju_E.js → init-user-DKSIGCcH.js} +1 -1
  26. package/assets/{input-error-g1h6ps7t.js → input-error-BBzQCTcg.js} +1 -1
  27. package/assets/list-CjOxUyML.js +1 -0
  28. package/assets/{list-table-Br0K3rXg.js → list-table-DMJKIWta.js} +1 -1
  29. package/assets/{login-CUDpGsHl.js → login-5G-1gzoH.js} +1 -1
  30. package/assets/manifest.json +96 -101
  31. package/assets/{material-icon-BIcI8APG.js → material-icon-BE8cT_z7.js} +1 -1
  32. package/assets/{media-manager-CTstvyHm.js → media-manager-DWLUhFyJ.js} +1 -1
  33. package/assets/{module-CpZBs0fN.js → module-9RNagTns.js} +1 -1
  34. package/assets/{multi-select-BFWbEjH-.js → multi-select-BnR59_kI.js} +1 -1
  35. package/assets/{nav-footer-bO8D-Yir.js → nav-footer-Dq1Z6Fmw.js} +1 -1
  36. package/assets/{nav-main-DVgvko8g.js → nav-main-DQNNAKwu.js} +1 -1
  37. package/assets/{nav-user-vIwYShwE.js → nav-user-q7QW6ZiI.js} +1 -1
  38. package/assets/notification-CIUVTHsw.js +1 -0
  39. package/assets/{pagination-render-rZ5_6g0n.js → pagination-render-PLbPRWg5.js} +1 -1
  40. package/assets/{register-Kfu8zmmu.js → register-48nlLgHz.js} +1 -1
  41. package/assets/{tabs-CwgzWt48.js → tabs-D5eQoog9.js} +1 -1
  42. package/assets/{theme-switcher-fzVA8btX.js → theme-switcher-BZ6eg-WU.js} +1 -1
  43. package/assets/{user-info-Db5Y8KeN.js → user-info-CJp_GYZl.js} +1 -1
  44. package/assets/{user-menu-content-Bc8YNZPf.js → user-menu-content-ljwR9luU.js} +1 -1
  45. package/assets/{welcome-MKPFhPtG.js → welcome-CBKz_MRJ.js} +1 -1
  46. package/controllers/add.js +0 -2
  47. package/controllers/edit.js +3 -3
  48. package/controllers/login.js +21 -56
  49. package/controllers/remove.js +11 -2
  50. package/helpers/diffHelpers.d.ts +1 -1
  51. package/helpers/diffHelpers.js +52 -7
  52. package/index.d.ts +0 -1
  53. package/index.js +0 -1
  54. package/interfaces/types.d.ts +12 -2
  55. package/lib/Adminizer.d.ts +0 -8
  56. package/lib/Adminizer.js +0 -9
  57. package/lib/v4/DataAccessor.d.ts +1 -1
  58. package/lib/v4/model/AbstractModel.js +12 -0
  59. package/lib/v4/model/adapter/sequelize.js +1 -1
  60. package/lib/v4/notifications/AbstractNotificationService.js +1 -0
  61. package/lib/v4/notifications/GeneralNotificationService.js +1 -1
  62. package/lib/v4/notifications/SystemNotificationService.js +4 -3
  63. package/package.json +1 -1
  64. package/assets/add-BNb5A_qF.js +0 -1
  65. package/assets/add-group-RRjHTu93.js +0 -1
  66. package/assets/add-user-DSuvcKp6.js +0 -1
  67. package/assets/app-layout-ContoN1K.js +0 -1
  68. package/assets/app-sidebar-header-CK8t32cm.js +0 -1
  69. package/assets/form-C9P9m_9q.js +0 -1
  70. package/assets/home-BWHeZm-1.js +0 -2
  71. package/assets/icon-ChQBPA5l.js +0 -1
  72. package/assets/list-EEgAn-nx.js +0 -1
  73. package/assets/notification-BTXEslqa.js +0 -1
  74. package/lib/v4/model/adapter/typeorm.d.ts +0 -24
  75. package/lib/v4/model/adapter/typeorm.js +0 -88
@@ -25,6 +25,16 @@ export interface PropsField {
25
25
  isIn?: string[] | number[] | boolean[];
26
26
  options?: Record<string, unknown> | Record<string, unknown>[];
27
27
  }
28
+ export interface DiffChanges {
29
+ field: string;
30
+ oldValue: any;
31
+ newValue: any;
32
+ type: string;
33
+ }
34
+ export interface Diff {
35
+ changes: DiffChanges[];
36
+ summary: string;
37
+ }
28
38
  export interface INotification {
29
39
  id: string;
30
40
  title: string;
@@ -37,8 +47,8 @@ export interface INotification {
37
47
  iconColor: string;
38
48
  };
39
49
  notificationClass: string;
40
- channel: string;
41
- metadata?: Record<string | number, any>;
50
+ channel: string | 'created' | 'updated' | 'deleted' | 'system';
51
+ metadata?: Record<string | number, any> | Diff;
42
52
  }
43
53
  export interface INotificationEvent {
44
54
  type: 'notification' | 'heartbeat' | 'connected' | 'error';
@@ -14,8 +14,6 @@ import { ControlsHandler } from "./v4/controls/ControlsHandler";
14
14
  import { CatalogHandler } from "./v4/catalog/CatalogHandler";
15
15
  import { NotificationHandler } from './v4/notifications/NotificationHandler';
16
16
  import { INotification } from "../interfaces/types";
17
- import { UserAP } from "models/UserAP";
18
- export type AuthHandler = (req: ReqType, login: string, password: string) => Promise<Partial<UserAP> | null>;
19
17
  export declare class Adminizer {
20
18
  /**
21
19
  * If you convey this default Middleware, it will add it to the very top of the router,
@@ -37,14 +35,8 @@ export declare class Adminizer {
37
35
  controlsHandler: ControlsHandler;
38
36
  catalogHandler: CatalogHandler;
39
37
  jwtSecret: string;
40
- authHandler?: AuthHandler;
41
38
  static logger: winston.Logger;
42
39
  constructor(ormAdapters: AbstractAdapter[]);
43
- /**
44
- * Registers an external authentication handler. If a user is not found in UserAP
45
- * during login, this handler will be invoked to authenticate against an external source.
46
- */
47
- setAuthHandler(handler: AuthHandler): void;
48
40
  getMiddleware(): (req: express.Request, res: express.Response, next: () => void) => void;
49
41
  /**
50
42
  * Vite middleware
package/lib/Adminizer.js CHANGED
@@ -54,8 +54,6 @@ export class Adminizer {
54
54
  catalogHandler;
55
55
  // Constants
56
56
  jwtSecret = process.env.JWT_SECRET ?? uuid();
57
- // External auth handler
58
- authHandler;
59
57
  static logger = winston.createLogger({
60
58
  level: process.env.LOG_LEVEL ?? "debug",
61
59
  format: winston.format.combine(winston.format.timestamp(), winston.format.printf(({ timestamp, level, message, ...meta }) => {
@@ -72,13 +70,6 @@ export class Adminizer {
72
70
  this._emitter = new EventEmitter();
73
71
  this.ormAdapters = ormAdapters;
74
72
  }
75
- /**
76
- * Registers an external authentication handler. If a user is not found in UserAP
77
- * during login, this handler will be invoked to authenticate against an external source.
78
- */
79
- setAuthHandler(handler) {
80
- this.authHandler = handler;
81
- }
82
73
  getMiddleware() {
83
74
  return (req, res, next) => {
84
75
  try {
@@ -7,7 +7,7 @@ import { Fields } from "../../helpers/fieldsHelper";
7
7
  import { Adminizer } from "../Adminizer";
8
8
  import { UserAP } from "models/UserAP";
9
9
  export declare class DataAccessor {
10
- private readonly adminizer;
10
+ readonly adminizer: Adminizer;
11
11
  user: UserAP;
12
12
  entity: Entity;
13
13
  action: ActionType;
@@ -1,3 +1,4 @@
1
+ import { formatChanges, sanitizeForDiff } from "../../../helpers/diffHelpers";
1
2
  export class AbstractModel {
2
3
  modelname;
3
4
  attributes;
@@ -12,6 +13,17 @@ export class AbstractModel {
12
13
  async create(data, dataAccessor) {
13
14
  let _data = await dataAccessor.setUserRelationAccess(dataAccessor.process(data));
14
15
  let record = await this._create(_data);
16
+ // console.log(record.toJSON());
17
+ //Create diff
18
+ const cleanNewRecord = sanitizeForDiff(_data);
19
+ const formattedChanges = formatChanges({}, {}, cleanNewRecord, 'add');
20
+ // log system event notification с diff
21
+ await dataAccessor.adminizer.logSystemCreatedEvent('Created',
22
+ //@ts-ignore
23
+ `user ${dataAccessor.user.login} create ${dataAccessor.entity.name} ${record[this.primaryKey]}`, {
24
+ changes: formattedChanges,
25
+ summary: `Created ${formattedChanges.length} fields`
26
+ });
15
27
  return dataAccessor.process(record);
16
28
  }
17
29
  async findOne(criteria, dataAccessor) {
@@ -325,7 +325,7 @@ export class SequelizeModel extends AbstractModel {
325
325
  }
326
326
  await instance.reload({ include: Object.values(this.model.associations) });
327
327
  const pk = this.primaryKey;
328
- const fresh = await this.model.findByPk(instance.get(pk), { include: assocNames.map(a => ({ association: a })) });
328
+ const fresh = (await this.model.findByPk(instance.get(pk), { include: assocNames.map(a => ({ association: a })) })).toJSON();
329
329
  // console.debug(">> Результат после reload:", fresh?.toJSON());
330
330
  return fresh;
331
331
  }
@@ -8,6 +8,7 @@ export class AbstractNotificationService extends EventEmitter {
8
8
  this.adminizer = adminizer;
9
9
  }
10
10
  // Добавление клиента
11
+ // TODO - Проверить, что клиент имеет права на получение уведомлений
11
12
  addClient(clientId, sendFn) {
12
13
  this.clients.set(clientId, sendFn);
13
14
  Adminizer.log.info(`[${this.notificationClass}] Client ${clientId} connected. Total: ${this.clients.size}`);
@@ -33,7 +33,7 @@ export class GeneralNotificationService extends AbstractNotificationService {
33
33
  const event = {
34
34
  type: 'notification',
35
35
  data: {
36
- ...notificationDB.toJSON(),
36
+ ...notificationDB,
37
37
  read: false,
38
38
  icon: {
39
39
  icon: this.icon,
@@ -16,6 +16,7 @@ export class SystemNotificationService extends AbstractNotificationService {
16
16
  // Сохраняем в базу
17
17
  if (this.adminizer.modelHandler.model.has('notificationap')) {
18
18
  try {
19
+ // Idia how to keep in DB notification raw data ['user %s created %s in model %s', user, instance.name, modelName] as print_f()
19
20
  notificationDB = await this.adminizer.modelHandler.model.get('notificationap')["_create"](fullNotification);
20
21
  const users = await this.adminizer.modelHandler.model.get('userap')["_find"]({ isAdministrator: 1 });
21
22
  for (const user of users) {
@@ -29,7 +30,7 @@ export class SystemNotificationService extends AbstractNotificationService {
29
30
  const event = {
30
31
  type: 'notification',
31
32
  data: {
32
- ...notificationDB.toJSON(),
33
+ ...notificationDB,
33
34
  icon: {
34
35
  icon: this.icon,
35
36
  iconColor: this.iconColor
@@ -37,14 +38,14 @@ export class SystemNotificationService extends AbstractNotificationService {
37
38
  },
38
39
  notificationClass: this.notificationClass,
39
40
  userId: notification.userId ?? null,
40
- channel: notification.channel // Добавляем информацию о канале
41
+ channel: notification.channel ?? 'system' // Добавляем информацию о канале
41
42
  };
42
43
  // Отправляем на все каналы или на конкретный канал
43
44
  if (notification.channel) {
44
45
  this.broadcastToChannel(notification.channel, event);
45
46
  }
46
47
  else {
47
- this.broadcast(event);
48
+ this.broadcastToChannel('system', event);
48
49
  }
49
50
  Adminizer.log.info(`[System] Notification dispatched: ${fullNotification.title}`);
50
51
  return true;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "adminizer",
3
3
  "type": "module",
4
- "version": "4.3.0-build.74",
4
+ "version": "4.3.0-build.75",
5
5
  "main": "index.js",
6
6
  "exports": {
7
7
  ".": "./index.js",
@@ -1 +0,0 @@
1
- import{c as p,q as i,j as m}from"./app.js";import{A as s}from"./app-layout-ContoN1K.js";import e from"./add-form-CGi_qv3J.js";import"./app-shell-DHzMWA1L.js";import"./app-sidebar-D7l5BJPV.js";import"./nav-main-DVgvko8g.js";import"./material-icon-BIcI8APG.js";import"./app-sidebar-header-CK8t32cm.js";import"./breadcrumbs-DnNOEnT4.js";import"./nav-user-vIwYShwE.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./theme-switcher-fzVA8btX.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";import"./field-renderer-Sd68OLyc.js";import"./dynamic-controls-CSVVCONh.js";import"./multi-select-BFWbEjH-.js";import"./form-state-702tb_BV.js";import"./input-error-g1h6ps7t.js";const a=[];function v(){const t=p.c(2),r=i();let o;return t[0]!==r?(o=m.jsx(s,{breadcrumbs:a,children:m.jsx(e,{page:r,catalog:!1})}),t[0]=r,t[1]=o):o=t[1],o}export{v as default};
@@ -1 +0,0 @@
1
- import{c as m,j as t}from"./app.js";import{A as p}from"./app-layout-ContoN1K.js";import i from"./add-group-form-DSd4UrnU.js";import"./app-shell-DHzMWA1L.js";import"./app-sidebar-D7l5BJPV.js";import"./nav-main-DVgvko8g.js";import"./material-icon-BIcI8APG.js";import"./app-sidebar-header-CK8t32cm.js";import"./breadcrumbs-DnNOEnT4.js";import"./nav-user-vIwYShwE.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./theme-switcher-fzVA8btX.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";const e=[];function G(){const r=m.c(1);let o;return r[0]===Symbol.for("react.memo_cache_sentinel")?(o=t.jsx(p,{breadcrumbs:e,children:t.jsx(i,{})}),r[0]=o):o=r[0],o}export{G as default};
@@ -1 +0,0 @@
1
- import{c as m,j as t}from"./app.js";import{A as i}from"./app-layout-ContoN1K.js";import p from"./add-user-form-BAssKDpI.js";import"./app-shell-DHzMWA1L.js";import"./app-sidebar-D7l5BJPV.js";import"./nav-main-DVgvko8g.js";import"./material-icon-BIcI8APG.js";import"./app-sidebar-header-CK8t32cm.js";import"./breadcrumbs-DnNOEnT4.js";import"./nav-user-vIwYShwE.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./theme-switcher-fzVA8btX.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";import"./input-error-g1h6ps7t.js";const e=[];function U(){const o=m.c(1);let r;return o[0]===Symbol.for("react.memo_cache_sentinel")?(r=t.jsx(i,{breadcrumbs:e,children:t.jsx(p,{})}),o[0]=r):r=o[0],r}export{U as default};
@@ -1 +0,0 @@
1
- import{r as b,c as x,q as j,j as p,_ as u,a3 as h}from"./app.js";import A from"./app-shell-DHzMWA1L.js";import{AppSidebar as S}from"./app-sidebar-D7l5BJPV.js";import{AppSidebarHeader as y}from"./app-sidebar-header-CK8t32cm.js";const E=b.memo(m=>{const e=x.c(14),{children:r,breadcrumbs:t,className:l}=m;let s;e[0]!==t?(s=t===void 0?[]:t,e[0]=t,e[1]=s):s=e[1];const o=s,f=j().props.title;let a;e[2]!==f?(a=p.jsx(u,{title:f}),e[2]=f,e[3]=a):a=e[3];let n;e[4]===Symbol.for("react.memo_cache_sentinel")?(n=p.jsx(S,{}),e[4]=n):n=e[4];let i;e[5]!==o?(i=p.jsx(y,{breadcrumbs:o}),e[5]=o,e[6]=i):i=e[6];let c;e[7]!==r||e[8]!==l||e[9]!==i?(c=p.jsxs(h,{className:l,children:[i,r]}),e[7]=r,e[8]=l,e[9]=i,e[10]=c):c=e[10];let d;return e[11]!==a||e[12]!==c?(d=p.jsxs(A,{variant:"sidebar",children:[a,n,c]}),e[11]=a,e[12]=c,e[13]=d):d=e[13],d}),R=b.memo(m=>{const e=x.c(10);let r,t,l,s;e[0]!==m?({children:t,className:l,breadcrumbs:r,...s}=m,e[0]=m,e[1]=r,e[2]=t,e[3]=l,e[4]=s):(r=e[1],t=e[2],l=e[3],s=e[4]);let o;return e[5]!==r||e[6]!==t||e[7]!==l||e[8]!==s?(o=p.jsx(E,{breadcrumbs:r,className:l,...s,children:t}),e[5]=r,e[6]=t,e[7]=l,e[8]=s,e[9]=o):o=e[9],o});export{R as A};
@@ -1 +0,0 @@
1
- import{r as g,j as e,aJ as b,w as y,B as w,aK as M,y as S,z as C,aL as D,U as E,V as I,aM as T,W as $,aN as _,$ as R,L as z,h as v,c as A,aO as L}from"./app.js";import{Breadcrumbs as k}from"./breadcrumbs-DnNOEnT4.js";import{NavUser as O}from"./nav-user-vIwYShwE.js";import{ThemeSwitcher as P}from"./theme-switcher-fzVA8btX.js";import B from"./material-icon-BIcI8APG.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";function J(){const[m,r]=g.useState([]),[a,o]=g.useState(!1),c=async()=>{try{const s=await v.get(`${window.routePrefix}/api/notifications`,{params:{unreadOnly:!0,limit:4}});r(s.data.slice(0,4))}catch(s){console.error("Error fetching notifications:",s)}finally{}};g.useEffect(()=>{c();const s=new EventSource(`${window.routePrefix}/api/notifications/stream`);return s.addEventListener("connected",t=>{const i=JSON.parse(t.data);console.log("Connected event:",i)}),s.addEventListener("notification",t=>{const i=JSON.parse(t.data);r(f=>[i,...f].slice(0,4))}),s.onerror=()=>{console.error("SSE connection error")},()=>s.close()},[]);const l=async(s,t)=>{o(!0);try{await v.put(`${window.routePrefix}/api/notifications/${s}/${t}/read`,{}),await c()}catch(i){console.error("Error marking as read:",i)}finally{o(!1)}},n=s=>{const t=new Date,i=new Date(s),f=t.getTime()-i.getTime(),p=Math.floor(f/1e3),d=new Intl.RelativeTimeFormat("en",{numeric:"auto"});if(p<60)return d.format(-p,"second");const x=Math.floor(p/60);if(x<60)return d.format(-x,"minute");const u=Math.floor(x/60);if(u<24)return d.format(-u,"hour");const h=Math.floor(u/24);if(h<30)return d.format(-h,"day");const j=Math.floor(h/30);if(j<12)return d.format(-j,"month");const N=Math.floor(j/12);return d.format(-N,"year")};return e.jsx(e.Fragment,{children:e.jsxs(b,{children:[e.jsx(y,{asChild:!0,className:"cursor-pointer data-[state=open]:bg-sidebar-accent",children:e.jsxs(w,{variant:"ghost",className:"relative",children:[e.jsx(M,{}),m.length>0&&e.jsx("div",{className:"absolute top-1.5 right-1.5 size-1.5 rounded-full bg-destructive"})]})}),e.jsxs(S,{className:"z-[1002] p-2",align:"end",onCloseAutoFocus:s=>s.preventDefault(),children:[e.jsx(C,{className:`${a?"opacity-50 pointer-events-none":""}`,children:m.length===0?e.jsx("div",{className:"p-4 text-center text-muted-foreground",children:"No notifications"}):m.map(s=>e.jsxs("div",{children:[e.jsx(D,{asChild:!0,className:"cursor-pointer",onSelect:t=>t.preventDefault(),children:e.jsxs("div",{className:"grid grid-cols-[32px_250px] grid-rows-[auto_1fr] items-start gap-x-4 gap-y-2",children:[s.icon?e.jsx(B,{name:s.icon.icon,style:{color:s.icon.iconColor},className:"!text-[32px]"}):e.jsx("div",{}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"font-medium",children:s.title}),e.jsx("span",{className:"truncate",children:s.message})]}),e.jsxs("div",{className:"col-start-2 flex justify-between flex-nowrap items-center",children:[e.jsxs("div",{className:"flex flex-nowrap gap-2 items-center",children:[s.notificationClass==="general"?e.jsx("div",{className:"font-medium",children:"Info"}):e.jsx("div",{className:"font-medium",children:"Activity"}),e.jsx("span",{children:"●"}),e.jsx("div",{children:n(s.createdAt)})]}),e.jsxs(E,{children:[e.jsx(I,{asChild:!0,children:e.jsx(w,{variant:"ghost",size:"icon",className:"size-4",onClick:t=>{t.stopPropagation(),l(s.notificationClass,s.id)},children:e.jsx(T,{})})}),e.jsx($,{side:"left",className:"z-[1003]",children:e.jsx("p",{children:"Make read"})})]})]})]})}),e.jsx(_,{})]},s.id))}),e.jsx(w,{variant:"secondary",asChild:!0,children:e.jsxs(R,{href:`${window.routePrefix}/notifications`,className:`w-full ${a?"opacity-50 pointer-events-none":""}`,children:["View All",a&&e.jsx(z,{className:"h-4 w-4 animate-spin"})]})})]})]})})}function Q(m){const r=A.c(8),{breadcrumbs:a}=m;let o;r[0]!==a?(o=a===void 0?[]:a,r[0]=a,r[1]=o):o=r[1];const c=o;let l;r[2]===Symbol.for("react.memo_cache_sentinel")?(l=e.jsx(L,{className:"-ml-1"}),r[2]=l):l=r[2];let n;r[3]!==c?(n=e.jsxs("div",{className:"flex items-center gap-2",children:[l,e.jsx(k,{breadcrumbs:c})]}),r[3]=c,r[4]=n):n=r[4];let s;r[5]===Symbol.for("react.memo_cache_sentinel")?(s=e.jsxs("div",{className:"flex gap-4 items-center",children:[e.jsx(P,{}),e.jsx(J,{}),e.jsx(O,{})]}),r[5]=s):s=r[5];let t;return r[6]!==n?(t=e.jsx("header",{className:"border-sidebar-border/50 flex h-16 shrink-0 items-center gap-2 border-b px-6 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4",children:e.jsxs("div",{className:"flex justify-between w-full",children:[n,s]})}),r[6]=n,r[7]=t):t=r[7],t}export{Q as AppSidebarHeader};
@@ -1 +0,0 @@
1
- import{c as m,j as t}from"./app.js";import{A as p}from"./app-layout-ContoN1K.js";import i from"./form-DomTBI89.js";import"./app-shell-DHzMWA1L.js";import"./app-sidebar-D7l5BJPV.js";import"./nav-main-DVgvko8g.js";import"./material-icon-BIcI8APG.js";import"./app-sidebar-header-CK8t32cm.js";import"./breadcrumbs-DnNOEnT4.js";import"./nav-user-vIwYShwE.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./theme-switcher-fzVA8btX.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";import"./form-state-702tb_BV.js";import"./add-form-CGi_qv3J.js";import"./field-renderer-Sd68OLyc.js";import"./dynamic-controls-CSVVCONh.js";import"./multi-select-BFWbEjH-.js";import"./input-error-g1h6ps7t.js";const e=[];function $(){const o=m.c(1);let r;return o[0]===Symbol.for("react.memo_cache_sentinel")?(r=t.jsx(p,{breadcrumbs:e,children:t.jsx(i,{})}),o[0]=r):r=o[0],r}export{$ as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./VanillaJSONEditor-x8tDbio1.js","./app.js","./app-GsYdx39W.css","./index-C148XJoK.js","./index-Vcq4gwWv.js","./debounce-D6eaSoDg.js","./use-appearance-CXP5cHaQ.js","./form-state-702tb_BV.js","./add-form-CGi_qv3J.js","./icon-ChQBPA5l.js","./field-renderer-Sd68OLyc.js","./dynamic-controls-CSVVCONh.js","./multi-select-BFWbEjH-.js","./field-renderer-CsBa_tMB.css","./input-error-g1h6ps7t.js","./add-group-form-DSd4UrnU.js","./add-user-form-BAssKDpI.js","./material-icon-BIcI8APG.js","./app-shell-DHzMWA1L.js","./app-sidebar-header-CK8t32cm.js","./breadcrumbs-DnNOEnT4.js","./nav-user-vIwYShwE.js","./user-info-Db5Y8KeN.js","./user-menu-content-Bc8YNZPf.js","./theme-switcher-fzVA8btX.js","./app-sidebar-D7l5BJPV.js","./nav-main-DVgvko8g.js","./date-picker-DBHnomTY.js","./form-DomTBI89.js","./geo-json-CVaNUZbb.js","./handsontable-CZQ5Ietj.js","./list-table-Br0K3rXg.js","./del-modal-BeF4r3gk.js","./pagination-render-rZ5_6g0n.js","./monaco-editor-XX8Hz76f.js","./use-window-size-DLSEoR6e.js","./nav-footer-bO8D-Yir.js","./toast-editor-C0550yms.js"])))=>i.map(i=>d[i]);
2
- import{q as x,r as u,j as o,_ as v,$ as P,a0 as t}from"./app.js";const D=(m,r,_)=>{const e=m[r];return e?typeof e=="function"?e():Promise.resolve(e):new Promise((s,n)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(n.bind(null,new Error("Unknown variable dynamic import: "+r+(r.split("/").length!==_?". Note that variables only represent file names one level deep.":""))))})};function L(){const m=x(),[r,_]=u.useState(null),[e,s]=u.useState(null),n=m.props.controls,l=async()=>{const{component:i,props:p}=n[0],d=(await D(Object.assign({"../components/VanillaJSONEditor.tsx":()=>t(()=>import("./VanillaJSONEditor-x8tDbio1.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url),"../components/add-form.tsx":()=>t(()=>import("./add-form-CGi_qv3J.js"),__vite__mapDeps([8,1,2,9,10,11,12,13,7,14]),import.meta.url),"../components/add-group-form.tsx":()=>t(()=>import("./add-group-form-DSd4UrnU.js"),__vite__mapDeps([15,1,2,9]),import.meta.url),"../components/add-user-form.tsx":()=>t(()=>import("./add-user-form-BAssKDpI.js"),__vite__mapDeps([16,1,2,9,14,17]),import.meta.url),"../components/app-shell.tsx":()=>t(()=>import("./app-shell-DHzMWA1L.js"),__vite__mapDeps([18,1,2]),import.meta.url),"../components/app-sidebar-header.tsx":()=>t(()=>import("./app-sidebar-header-CK8t32cm.js"),__vite__mapDeps([19,1,2,20,21,22,23,24,6,9,17]),import.meta.url),"../components/app-sidebar.tsx":()=>t(()=>import("./app-sidebar-D7l5BJPV.js"),__vite__mapDeps([25,1,2,26,17]),import.meta.url),"../components/breadcrumbs.tsx":()=>t(()=>import("./breadcrumbs-DnNOEnT4.js"),__vite__mapDeps([20,1,2]),import.meta.url),"../components/date-picker.tsx":()=>t(()=>import("./date-picker-DBHnomTY.js"),__vite__mapDeps([27,1,2]),import.meta.url),"../components/dynamic-controls.tsx":()=>t(()=>import("./dynamic-controls-CSVVCONh.js"),__vite__mapDeps([11,1,2]),import.meta.url),"../components/field-renderer.tsx":()=>t(()=>import("./field-renderer-Sd68OLyc.js").then(E=>E.f),__vite__mapDeps([10,1,2,11,12,13]),import.meta.url),"../components/form.tsx":()=>t(()=>import("./form-DomTBI89.js"),__vite__mapDeps([28,1,2,7,8,9,10,11,12,13,14]),import.meta.url),"../components/geo-json.tsx":()=>t(()=>import("./geo-json-CVaNUZbb.js"),__vite__mapDeps([29,1,2]),import.meta.url),"../components/handsontable.tsx":()=>t(()=>import("./handsontable-CZQ5Ietj.js"),__vite__mapDeps([30,1,2,6]),import.meta.url),"../components/icon.tsx":()=>t(()=>import("./icon-ChQBPA5l.js"),__vite__mapDeps([9,1,2]),import.meta.url),"../components/input-error.tsx":()=>t(()=>import("./input-error-g1h6ps7t.js"),__vite__mapDeps([14,1,2]),import.meta.url),"../components/list-table.tsx":()=>t(()=>import("./list-table-Br0K3rXg.js"),__vite__mapDeps([31,1,2,9,17,32,33]),import.meta.url),"../components/material-icon.tsx":()=>t(()=>import("./material-icon-BIcI8APG.js"),__vite__mapDeps([17,1,2]),import.meta.url),"../components/monaco-editor.tsx":()=>t(()=>import("./monaco-editor-XX8Hz76f.js"),__vite__mapDeps([34,1,2,6,35]),import.meta.url),"../components/multi-select.tsx":()=>t(()=>import("./multi-select-BFWbEjH-.js"),__vite__mapDeps([12,1,2]),import.meta.url),"../components/nav-footer.tsx":()=>t(()=>import("./nav-footer-bO8D-Yir.js"),__vite__mapDeps([36,1,2,9]),import.meta.url),"../components/nav-main.tsx":()=>t(()=>import("./nav-main-DVgvko8g.js"),__vite__mapDeps([26,1,2,17]),import.meta.url),"../components/nav-user.tsx":()=>t(()=>import("./nav-user-vIwYShwE.js"),__vite__mapDeps([21,1,2,22,23]),import.meta.url),"../components/pagination-render.tsx":()=>t(()=>import("./pagination-render-rZ5_6g0n.js"),__vite__mapDeps([33,1,2]),import.meta.url),"../components/theme-switcher.tsx":()=>t(()=>import("./theme-switcher-fzVA8btX.js"),__vite__mapDeps([24,1,2,6,9]),import.meta.url),"../components/toast-editor.tsx":()=>t(()=>import("./toast-editor-C0550yms.js"),__vite__mapDeps([37,1,2,4,35,6]),import.meta.url),"../components/user-info.tsx":()=>t(()=>import("./user-info-Db5Y8KeN.js"),__vite__mapDeps([22,1,2]),import.meta.url),"../components/user-menu-content.tsx":()=>t(()=>import("./user-menu-content-Bc8YNZPf.js"),__vite__mapDeps([23,1,2,22]),import.meta.url)}),`../components/${i}.tsx`,3)).default;_(o.jsx(d,{...p}))},c=async()=>{const{component:i}=n[1],a=(await import(i)).default;s(o.jsx(a,{message:"Hello from Component B"}))};return o.jsxs(o.Fragment,{children:[o.jsx(v,{title:"Home"}),o.jsx("div",{children:o.jsx(P,{href:"/page",children:"Page"})}),o.jsx("div",{children:o.jsx("h1",{children:"Is Home"})}),o.jsxs("div",{children:[o.jsx("button",{onClick:l,children:"Загрузить компонент"}),o.jsx("p",{}),r||o.jsx("p",{children:"Нажмите кнопку, чтобы загрузить компонент"})]}),o.jsx("p",{}),o.jsxs("div",{children:[o.jsx("button",{onClick:c,children:"Загрузить компонент"}),o.jsx("p",{}),e||o.jsx("p",{children:"Нажмите кнопку, чтобы загрузить компонент"})]})]})}export{L as default};
@@ -1 +0,0 @@
1
- import{c as i,ae as r,j as a}from"./app.js";function p(l){const e=i.c(10);let s,o,t;e[0]!==l?({iconNode:s,className:o,...t}=l,e[0]=l,e[1]=s,e[2]=o,e[3]=t):(s=e[1],o=e[2],t=e[3]);let n;e[4]!==o?(n=r("h-4 w-4",o),e[4]=o,e[5]=n):n=e[5];let c;return e[6]!==s||e[7]!==t||e[8]!==n?(c=a.jsx(s,{className:n,...t}),e[6]=s,e[7]=t,e[8]=n,e[9]=c):c=e[9],c}export{p as Icon};
@@ -1 +0,0 @@
1
- import{j as o}from"./app.js";import{A as r}from"./app-layout-ContoN1K.js";import t from"./list-table-Br0K3rXg.js";import"./app-shell-DHzMWA1L.js";import"./app-sidebar-D7l5BJPV.js";import"./nav-main-DVgvko8g.js";import"./material-icon-BIcI8APG.js";import"./app-sidebar-header-CK8t32cm.js";import"./breadcrumbs-DnNOEnT4.js";import"./nav-user-vIwYShwE.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./theme-switcher-fzVA8btX.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";import"./del-modal-BeF4r3gk.js";import"./pagination-render-rZ5_6g0n.js";const m=[],L=()=>o.jsx(r,{breadcrumbs:m,className:"overflow-auto h-[calc(100svh-16px)]",children:o.jsx(t,{})});export{L as default};
@@ -1 +0,0 @@
1
- import{c as m,j as t,q as y,r as l,h,L as b}from"./app.js";import{A as v}from"./app-layout-ContoN1K.js";import{T as N,a as T,b as g,c as j}from"./tabs-CwgzWt48.js";import"./app-shell-DHzMWA1L.js";import"./app-sidebar-D7l5BJPV.js";import"./nav-main-DVgvko8g.js";import"./material-icon-BIcI8APG.js";import"./app-sidebar-header-CK8t32cm.js";import"./breadcrumbs-DnNOEnT4.js";import"./nav-user-vIwYShwE.js";import"./user-info-Db5Y8KeN.js";import"./user-menu-content-Bc8YNZPf.js";import"./theme-switcher-fzVA8btX.js";import"./use-appearance-CXP5cHaQ.js";import"./icon-ChQBPA5l.js";const w=a=>{const e=m.c(4),{notifications:n}=a;let s;e[0]!==n?(s=JSON.stringify(n,null,2),e[0]=n,e[1]=s):s=e[1];let i;return e[2]!==s?(i=t.jsx("div",{children:t.jsx("pre",{children:s})}),e[2]=s,e[3]=i):i=e[3],i},S=a=>{const e=m.c(4),{notifications:n}=a;let s;e[0]!==n?(s=JSON.stringify(n,null,2),e[0]=n,e[1]=s):s=e[1];let i;return e[2]!==s?(i=t.jsx("div",{children:t.jsx("pre",{children:s})}),e[2]=s,e[3]=i):i=e[3],i},C=()=>{const a=y(),[e,n]=l.useState(!0),[s,i]=l.useState("general"),[d,f]=l.useState(null),[c,u]=l.useState([]);l.useEffect(()=>{(async()=>{try{const r=await h.get(`${window.routePrefix}/api/notifications/general`);u(r.data)}catch(r){r instanceof Error&&console.error("Error fetching data:",r.message)}})().finally(()=>{n(!1)})},[]);const p=async o=>{i(o),f(o),n(!0);try{const r=await h.get(`${window.routePrefix}/api/notifications/${o}`);u(r.data)}catch(r){console.error(r)}finally{f(null),n(!1)}},x=o=>e&&c.length===0?t.jsx(b,{className:"mx-auto mt-14 size-12 animate-spin"}):c.length===0?t.jsx("div",{className:"text-center font-medium mt-8",children:"No media found"}):o==="general"?t.jsx(w,{notifications:c}):t.jsx(S,{notifications:c});return t.jsx("div",{className:"h-full p-4",children:t.jsxs("div",{className:"flex flex-col gap-4",children:[t.jsx("h1",{className:"font-bold text-xl",children:a.props.title}),t.jsxs(N,{value:s,className:"w-full",children:[t.jsxs(T,{className:"w-full",children:[t.jsx(g,{value:"general",onClick:()=>p("general"),disabled:!!d,children:"General"}),t.jsx(g,{value:"system",onClick:()=>p("system"),disabled:!!d,children:"System"})]}),t.jsx(j,{value:"general",children:x("general")}),t.jsx(j,{value:"system",children:x("system")})]})]})})},E=[],F=()=>{const a=m.c(1);let e;return a[0]===Symbol.for("react.memo_cache_sentinel")?(e=t.jsx(v,{breadcrumbs:E,children:t.jsx(C,{})}),a[0]=e):e=a[0],e};export{F as default};
@@ -1,24 +0,0 @@
1
- import { Repository } from "typeorm";
2
- import { AbstractAdapter, AbstractModel } from "../AbstractModel";
3
- import { FindOptions } from "../AbstractModel";
4
- export declare class TypeORMModel<T> extends AbstractModel<T> {
5
- private repository;
6
- constructor(repository: Repository<T>, modelName: string, model: any);
7
- protected _count(criteria: Partial<T> | undefined): Promise<number>;
8
- protected _create(data: Partial<T>): Promise<T>;
9
- protected _destroy(criteria: Partial<T>): Promise<T[]>;
10
- protected _destroyOne(criteria: Partial<T>): Promise<T | null>;
11
- protected _find(criteria: Partial<T>, options: FindOptions | undefined): Promise<T[]>;
12
- private _convertCriteriaForTypeORM;
13
- protected _findOne(criteria: Partial<T>): Promise<T | null>;
14
- protected _update(criteria: Partial<T>, data: Partial<T>): Promise<T[]>;
15
- protected _updateOne(criteria: Partial<T>, data: Partial<T>): Promise<T | null>;
16
- }
17
- export declare class TypeORMAdapter extends AbstractAdapter {
18
- Model: any;
19
- constructor(orm: any);
20
- get models(): Record<string, any>;
21
- registerModel(modelName: string, attributes: any): any;
22
- getAttributes(modelName: string): any;
23
- getModel(modelName: string): any;
24
- }
@@ -1,88 +0,0 @@
1
- import { AbstractAdapter, AbstractModel } from "../AbstractModel";
2
- // TODO TypeORM classes realized schematically and need to be tested
3
- export class TypeORMModel extends AbstractModel {
4
- repository;
5
- constructor(repository, modelName, model) {
6
- super(modelName, model.attributes, model.primaryKey, model.identity);
7
- this.repository = repository;
8
- }
9
- async _count(criteria) {
10
- return this.repository.count({ where: criteria });
11
- }
12
- async _create(data) {
13
- const entity = this.repository.create(data);
14
- return this.repository.save(entity);
15
- }
16
- async _destroy(criteria) {
17
- const entities = await this._find(criteria, undefined);
18
- await this.repository.remove(entities);
19
- return entities;
20
- }
21
- async _destroyOne(criteria) {
22
- const entity = await this._findOne(criteria);
23
- if (entity) {
24
- await this.repository.remove(entity);
25
- return entity;
26
- }
27
- return null;
28
- }
29
- async _find(criteria, options) {
30
- // Преобразуем критерии для поддержки массивов
31
- const where = this._convertCriteriaForTypeORM(criteria);
32
- return this.repository.find({ where, ...options });
33
- }
34
- _convertCriteriaForTypeORM(criteria) {
35
- const result = {};
36
- for (const key in criteria) {
37
- const value = criteria[key];
38
- if (Array.isArray(value)) {
39
- // Для массивов используем оператор IN
40
- result[key] = { $in: value };
41
- }
42
- else if (typeof value === 'object' && value !== null) {
43
- // Обработка вложенных объектов с операторами
44
- result[key] = value;
45
- }
46
- else {
47
- result[key] = value;
48
- }
49
- }
50
- return result;
51
- }
52
- async _findOne(criteria) {
53
- return this.repository.findOne({ where: criteria });
54
- }
55
- async _update(criteria, data) {
56
- const entities = await this._find(criteria, undefined);
57
- for (const entity of entities) {
58
- Object.assign(entity, data);
59
- }
60
- return this.repository.save(entities);
61
- }
62
- async _updateOne(criteria, data) {
63
- const entity = await this._findOne(criteria);
64
- if (entity) {
65
- Object.assign(entity, data);
66
- return this.repository.save(entity);
67
- }
68
- return null;
69
- }
70
- }
71
- export class TypeORMAdapter extends AbstractAdapter {
72
- Model = TypeORMModel;
73
- constructor(orm) {
74
- super("typeorm", orm);
75
- }
76
- get models() {
77
- return this.orm.models;
78
- }
79
- registerModel(modelName, attributes) {
80
- return undefined;
81
- }
82
- getAttributes(modelName) {
83
- return undefined;
84
- }
85
- getModel(modelName) {
86
- return undefined;
87
- }
88
- }