@sync-in/server 1.3.8 → 1.3.9

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 (68) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/migrations/0001_square_mauler.sql +4 -0
  3. package/migrations/meta/0001_snapshot.json +2417 -0
  4. package/migrations/meta/_journal.json +7 -0
  5. package/package.json +19 -1
  6. package/server/app.service.spec.js +4 -4
  7. package/server/app.service.spec.js.map +1 -1
  8. package/server/applications/sync/schemas/sync-clients.schema.js +4 -4
  9. package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
  10. package/server/applications/users/schemas/users.schema.js +4 -4
  11. package/server/applications/users/schemas/users.schema.js.map +1 -1
  12. package/server/configuration/config.constants.js +0 -4
  13. package/server/configuration/config.constants.js.map +1 -1
  14. package/server/configuration/config.loader.js +2 -2
  15. package/server/configuration/config.loader.js.map +1 -1
  16. package/server/infrastructure/database/configuration.js +1 -1
  17. package/server/infrastructure/database/configuration.js.map +1 -1
  18. package/server/infrastructure/database/constants.js +19 -5
  19. package/server/infrastructure/database/constants.js.map +1 -1
  20. package/static/{chunk-LATG3ZVP.js → chunk-3FX6ISDY.js} +1 -1
  21. package/static/chunk-3S4WNZ2T.js +7 -0
  22. package/static/chunk-4KESSWTF.js +1 -0
  23. package/static/{chunk-3PB73RWL.js → chunk-4TEHM3AS.js} +1 -1
  24. package/static/chunk-AY2GOSJ2.js +24 -0
  25. package/static/chunk-BW5PQAKK.js +4 -0
  26. package/static/{chunk-UEN7RH33.js → chunk-CLSVDV7J.js} +1 -1
  27. package/static/chunk-FJFNDK67.js +1 -0
  28. package/static/{chunk-VO5W2VKC.js → chunk-HUWQHCUX.js} +1 -1
  29. package/static/{chunk-EVYNK2XG.js → chunk-KFM544CA.js} +1 -1
  30. package/static/{chunk-6A5R4OPV.js → chunk-LB7B5RIV.js} +1 -1
  31. package/static/{chunk-JM5PB2NQ.js → chunk-LYTD6AJE.js} +1 -1
  32. package/static/{chunk-Z6S7RFGN.js → chunk-MK7WZG3F.js} +1 -1
  33. package/static/{chunk-3UFSZ24R.js → chunk-MTRNPGS4.js} +1 -1
  34. package/static/{chunk-XN4TXQKE.js → chunk-MWFRZBJD.js} +1 -1
  35. package/static/{chunk-BEC2WQVF.js → chunk-N3T57OCA.js} +1 -1
  36. package/static/{chunk-L4F2K2VQ.js → chunk-NV2MEIWP.js} +1 -1
  37. package/static/{chunk-FNO4KAYG.js → chunk-O4AQBQBF.js} +1 -1
  38. package/static/{chunk-6E5YHOWA.js → chunk-O67RFAWU.js} +1 -1
  39. package/static/{chunk-YTROXGRM.js → chunk-PYSFXLMV.js} +1 -1
  40. package/static/{chunk-BEJ62KA7.js → chunk-QTW62OKJ.js} +1 -1
  41. package/static/chunk-RSNLYAN6.js +560 -0
  42. package/static/{chunk-BLRDUWOI.js → chunk-S5WXHO6D.js} +1 -1
  43. package/static/{chunk-VCXIQZT4.js → chunk-SH5EVL4E.js} +4 -4
  44. package/static/{chunk-F2KKCIDO.js → chunk-SKDQM65G.js} +1 -1
  45. package/static/{chunk-WSVE6EWB.js → chunk-SRLMFJ7C.js} +1 -1
  46. package/static/{chunk-OWYD7F64.js → chunk-TTQ37MUV.js} +1 -1
  47. package/static/chunk-WL65GYD5.js +4 -0
  48. package/static/{chunk-I6ACCGIM.js → chunk-WLPYIJFI.js} +1 -1
  49. package/static/chunk-XE5YHU5J.js +1 -0
  50. package/static/{chunk-VSBD6246.js → chunk-XUZSYWRF.js} +1 -1
  51. package/static/{chunk-4YWOE6HM.js → chunk-Z5X7LVMZ.js} +1 -1
  52. package/static/{chunk-MWPC5XQW.js → chunk-ZFKCGL6X.js} +1 -1
  53. package/static/chunk-ZTXJC5IC.js +1 -0
  54. package/static/index.html +1 -1
  55. package/static/main-RREKR34B.js +10 -0
  56. package/static/{polyfills-GNKGQMRJ.js → polyfills-IA5XWQYN.js} +1 -1
  57. package/static/{scripts-263WP5VB.js → scripts-VZVAP2P4.js} +4 -4
  58. package/sync-in-server.js +1 -1
  59. package/static/chunk-CIGVDQPA.js +0 -1
  60. package/static/chunk-CY3GGCEX.js +0 -7
  61. package/static/chunk-DJRILQTU.js +0 -1
  62. package/static/chunk-EDLO4Y5E.js +0 -4
  63. package/static/chunk-ENDRPUCI.js +0 -4
  64. package/static/chunk-HXRRMHEX.js +0 -1
  65. package/static/chunk-IJDFKCZM.js +0 -24
  66. package/static/chunk-J6YSVODR.js +0 -1
  67. package/static/chunk-JQOMI5VI.js +0 -560
  68. package/static/main-7LVJ2JSP.js +0 -10
@@ -8,6 +8,13 @@
8
8
  "when": 1743060115940,
9
9
  "tag": "0000_init",
10
10
  "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "5",
15
+ "when": 1755785750261,
16
+ "tag": "0001_square_mauler",
17
+ "breakpoints": true
11
18
  }
12
19
  ]
13
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sync-in/server",
3
- "version": "1.3.8",
3
+ "version": "1.3.9",
4
4
  "description": "The secure, open-source platform for file storage, sharing, collaboration, and sync",
5
5
  "author": {
6
6
  "name": "Johan Legrand",
@@ -21,6 +21,24 @@
21
21
  "engines": {
22
22
  "node": ">=22.15.0"
23
23
  },
24
+ "funding": [
25
+ {
26
+ "type": "github",
27
+ "url": "https://github.com/sponsors/sync-in"
28
+ },
29
+ {
30
+ "type": "patreon",
31
+ "url": "https://patreon.com/sync_in"
32
+ },
33
+ {
34
+ "type": "liberapay",
35
+ "url": "https://liberapay.com/sync-in"
36
+ },
37
+ {
38
+ "type": "project",
39
+ "url": "https://sync-in.com/support"
40
+ }
41
+ ],
24
42
  "keywords": [
25
43
  "sync-in",
26
44
  "self-hosted",
@@ -69,19 +69,19 @@ describe(_appservice.AppService.name, ()=>{
69
69
  expect(conf.logger.stdout).toBe(true);
70
70
  expect(conf.logger.colorize).toBe(true);
71
71
  const tmpSecretFile = _nodepath.default.join(_nodeos.default.tmpdir(), 'secret');
72
- _nodefs.default.writeFileSync(tmpSecretFile, 'foobar8888');
73
- _nodeprocess.default.env[`${_configconstants.ENVIRONMENT_PREFIX}APPLICATIONS_FILES_ONLYOFFICE_SECRET`] = 'foobar';
72
+ _nodefs.default.writeFileSync(tmpSecretFile, 'fooBAR8888');
73
+ _nodeprocess.default.env[`${_configconstants.ENVIRONMENT_PREFIX}APPLICATIONS_FILES_ONLYOFFICE_SECRET`] = 'fooBAR';
74
74
  _nodeprocess.default.env[`${_configconstants.ENVIRONMENT_PREFIX}LOGGER_STDOUT`] = 'false';
75
75
  _nodeprocess.default.env[`${_configconstants.ENVIRONMENT_PREFIX}LOGGER_COLORIZE`] = '"false"';
76
76
  _nodeprocess.default.env[`${_configconstants.ENVIRONMENT_PREFIX}APPLICATIONS_FILES_MAXUPLOADSIZE`] = '8888';
77
77
  // docker compose secret file
78
78
  _nodeprocess.default.env[`${_configconstants.ENVIRONMENT_PREFIX}AUTH_TOKEN_ACCESS_SECRET_FILE`] = tmpSecretFile;
79
79
  conf = (0, _configenvironment.exportConfiguration)(true);
80
- expect(conf.applications.files.onlyoffice.secret).toBe('foobar');
80
+ expect(conf.applications.files.onlyoffice.secret).toBe('fooBAR');
81
81
  expect(conf.logger.stdout).toBe(false);
82
82
  expect(conf.logger.colorize).toBe(false);
83
83
  expect(conf.applications.files.maxUploadSize).toBe(8888);
84
- expect(conf.auth.token.access.secret).toBe('foobar8888');
84
+ expect(conf.auth.token.access.secret).toBe('fooBAR8888');
85
85
  // cleanup secret file
86
86
  _nodefs.default.promises.rm(tmpSecretFile, {
87
87
  force: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../backend/src/app.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Logger } from '@nestjs/common'\nimport cluster from 'node:cluster'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { AppService } from './app.service'\nimport { ENVIRONMENT_PREFIX } from './configuration/config.constants'\nimport { configuration, exportConfiguration } from './configuration/config.environment'\n\ndescribe(AppService.name, () => {\n let appService: AppService\n\n beforeAll(async () => {\n appService = new AppService()\n Logger.overrideLogger(['fatal'])\n })\n\n it('should be defined', () => {\n expect(appService).toBeDefined()\n })\n\n it('should clusterize', () => {\n configuration.server.restartOnFailure = true\n const callBack = jest.fn().mockReturnValue({ process: { pid: 1 } })\n cluster.fork = jest.fn(() => callBack())\n const spyExit = jest.spyOn(cluster, 'on')\n expect(() => AppService.clusterize(callBack)).not.toThrow()\n expect(callBack).toHaveBeenCalledTimes(configuration.server.workers)\n expect(cluster.fork).toHaveBeenCalledTimes(configuration.server.workers)\n callBack.mockClear()\n AppService.schedulerPID = 1\n cluster.emit('exit', { process: { pid: 1 } }, 1, 1)\n AppService.schedulerPID = 0\n cluster.emit('exit', { process: { pid: 1 } }, 1, 1)\n expect(spyExit).toHaveBeenCalled()\n expect(callBack).toHaveBeenCalledTimes(2)\n jest.replaceProperty(cluster, 'isPrimary', false)\n callBack.mockClear()\n expect(() => AppService.clusterize(callBack)).not.toThrow()\n expect(callBack).toHaveBeenCalledTimes(1)\n spyExit.mockClear()\n })\n\n it(`should use ${ENVIRONMENT_PREFIX} environment variables to override the configuration`, () => {\n let conf = exportConfiguration()\n expect(conf.logger.stdout).toBe(true)\n expect(conf.logger.colorize).toBe(true)\n const tmpSecretFile = path.join(os.tmpdir(), 'secret')\n fs.writeFileSync(tmpSecretFile, 'foobar8888')\n process.env[`${ENVIRONMENT_PREFIX}APPLICATIONS_FILES_ONLYOFFICE_SECRET`] = 'foobar'\n process.env[`${ENVIRONMENT_PREFIX}LOGGER_STDOUT`] = 'false'\n process.env[`${ENVIRONMENT_PREFIX}LOGGER_COLORIZE`] = '\"false\"'\n process.env[`${ENVIRONMENT_PREFIX}APPLICATIONS_FILES_MAXUPLOADSIZE`] = '8888'\n // docker compose secret file\n process.env[`${ENVIRONMENT_PREFIX}AUTH_TOKEN_ACCESS_SECRET_FILE`] = tmpSecretFile\n conf = exportConfiguration(true)\n expect(conf.applications.files.onlyoffice.secret).toBe('foobar')\n expect(conf.logger.stdout).toBe(false)\n expect(conf.logger.colorize).toBe(false)\n expect(conf.applications.files.maxUploadSize).toBe(8888)\n expect(conf.auth.token.access.secret).toBe('foobar8888')\n // cleanup secret file\n fs.promises.rm(tmpSecretFile, { force: true }).catch((e) => {\n console.error(e)\n })\n })\n})\n"],"names":["describe","AppService","name","appService","beforeAll","Logger","overrideLogger","it","expect","toBeDefined","configuration","server","restartOnFailure","callBack","jest","fn","mockReturnValue","process","pid","cluster","fork","spyExit","spyOn","clusterize","not","toThrow","toHaveBeenCalledTimes","workers","mockClear","schedulerPID","emit","toHaveBeenCalled","replaceProperty","ENVIRONMENT_PREFIX","conf","exportConfiguration","logger","stdout","toBe","colorize","tmpSecretFile","path","join","os","tmpdir","fs","writeFileSync","env","applications","files","onlyoffice","secret","maxUploadSize","auth","token","access","promises","rm","force","catch","e","console","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../backend/src/app.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Logger } from '@nestjs/common'\nimport cluster from 'node:cluster'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { AppService } from './app.service'\nimport { ENVIRONMENT_PREFIX } from './configuration/config.constants'\nimport { configuration, exportConfiguration } from './configuration/config.environment'\n\ndescribe(AppService.name, () => {\n let appService: AppService\n\n beforeAll(async () => {\n appService = new AppService()\n Logger.overrideLogger(['fatal'])\n })\n\n it('should be defined', () => {\n expect(appService).toBeDefined()\n })\n\n it('should clusterize', () => {\n configuration.server.restartOnFailure = true\n const callBack = jest.fn().mockReturnValue({ process: { pid: 1 } })\n cluster.fork = jest.fn(() => callBack())\n const spyExit = jest.spyOn(cluster, 'on')\n expect(() => AppService.clusterize(callBack)).not.toThrow()\n expect(callBack).toHaveBeenCalledTimes(configuration.server.workers)\n expect(cluster.fork).toHaveBeenCalledTimes(configuration.server.workers)\n callBack.mockClear()\n AppService.schedulerPID = 1\n cluster.emit('exit', { process: { pid: 1 } }, 1, 1)\n AppService.schedulerPID = 0\n cluster.emit('exit', { process: { pid: 1 } }, 1, 1)\n expect(spyExit).toHaveBeenCalled()\n expect(callBack).toHaveBeenCalledTimes(2)\n jest.replaceProperty(cluster, 'isPrimary', false)\n callBack.mockClear()\n expect(() => AppService.clusterize(callBack)).not.toThrow()\n expect(callBack).toHaveBeenCalledTimes(1)\n spyExit.mockClear()\n })\n\n it(`should use ${ENVIRONMENT_PREFIX} environment variables to override the configuration`, () => {\n let conf = exportConfiguration()\n expect(conf.logger.stdout).toBe(true)\n expect(conf.logger.colorize).toBe(true)\n const tmpSecretFile = path.join(os.tmpdir(), 'secret')\n fs.writeFileSync(tmpSecretFile, 'fooBAR8888')\n process.env[`${ENVIRONMENT_PREFIX}APPLICATIONS_FILES_ONLYOFFICE_SECRET`] = 'fooBAR'\n process.env[`${ENVIRONMENT_PREFIX}LOGGER_STDOUT`] = 'false'\n process.env[`${ENVIRONMENT_PREFIX}LOGGER_COLORIZE`] = '\"false\"'\n process.env[`${ENVIRONMENT_PREFIX}APPLICATIONS_FILES_MAXUPLOADSIZE`] = '8888'\n // docker compose secret file\n process.env[`${ENVIRONMENT_PREFIX}AUTH_TOKEN_ACCESS_SECRET_FILE`] = tmpSecretFile\n conf = exportConfiguration(true)\n expect(conf.applications.files.onlyoffice.secret).toBe('fooBAR')\n expect(conf.logger.stdout).toBe(false)\n expect(conf.logger.colorize).toBe(false)\n expect(conf.applications.files.maxUploadSize).toBe(8888)\n expect(conf.auth.token.access.secret).toBe('fooBAR8888')\n // cleanup secret file\n fs.promises.rm(tmpSecretFile, { force: true }).catch((e) => {\n console.error(e)\n })\n })\n})\n"],"names":["describe","AppService","name","appService","beforeAll","Logger","overrideLogger","it","expect","toBeDefined","configuration","server","restartOnFailure","callBack","jest","fn","mockReturnValue","process","pid","cluster","fork","spyExit","spyOn","clusterize","not","toThrow","toHaveBeenCalledTimes","workers","mockClear","schedulerPID","emit","toHaveBeenCalled","replaceProperty","ENVIRONMENT_PREFIX","conf","exportConfiguration","logger","stdout","toBe","colorize","tmpSecretFile","path","join","os","tmpdir","fs","writeFileSync","env","applications","files","onlyoffice","secret","maxUploadSize","auth","token","access","promises","rm","force","catch","e","console","error"],"mappings":"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"}
@@ -34,11 +34,11 @@ const syncClients = (0, _mysqlcore.mysqlTable)('sync_clients', {
34
34
  }).notNull(),
35
35
  info: (0, _mysqlcore.json)('info').$type().notNull(),
36
36
  enabled: (0, _mysqlcore.boolean)('enabled').default(true).notNull(),
37
- currentIp: (0, _mysqlcore.char)('currentIp', {
38
- length: 15
37
+ currentIp: (0, _mysqlcore.varchar)('currentIp', {
38
+ length: 45
39
39
  }),
40
- lastIp: (0, _mysqlcore.char)('lastIp', {
41
- length: 15
40
+ lastIp: (0, _mysqlcore.varchar)('lastIp', {
41
+ length: 45
42
42
  }),
43
43
  currentAccess: (0, _mysqlcore.datetime)('currentAccess', {
44
44
  mode: 'date'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/schemas/sync-clients.schema.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { sql } from 'drizzle-orm'\nimport { bigint, boolean, char, datetime, index, json, mysqlTable } from 'drizzle-orm/mysql-core'\nimport { users } from '../../users/schemas/users.schema'\nimport type { SyncClientInfo } from '../interfaces/sync-client.interface'\n\nexport const syncClients = mysqlTable(\n 'sync_clients',\n {\n id: char('id', { length: 36 }).primaryKey(),\n ownerId: bigint('ownerId', { mode: 'number', unsigned: true })\n .references(() => users.id, { onDelete: 'cascade' })\n .notNull(),\n token: char('token', { length: 36 }).notNull(),\n tokenExpiration: bigint('tokenExpiration', { mode: 'number', unsigned: true }).notNull(),\n info: json('info').$type<SyncClientInfo>().notNull(),\n enabled: boolean('enabled').default(true).notNull(),\n currentIp: char('currentIp', { length: 15 }),\n lastIp: char('lastIp', { length: 15 }),\n currentAccess: datetime('currentAccess', { mode: 'date' }),\n lastAccess: datetime('lastAccess', { mode: 'date' }),\n createdAt: datetime('createdAt', { mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull()\n },\n (table) => [index('owner_idx').on(table.ownerId), index('token_idx').on(table.token)]\n)\n"],"names":["syncClients","mysqlTable","id","char","length","primaryKey","ownerId","bigint","mode","unsigned","references","users","onDelete","notNull","token","tokenExpiration","info","json","$type","enabled","boolean","default","currentIp","lastIp","currentAccess","datetime","lastAccess","createdAt","sql","table","index","on"],"mappings":"AAAA;;;;CAIC;;;;+BAOYA;;;eAAAA;;;4BALO;2BACqD;6BACnD;AAGf,MAAMA,cAAcC,IAAAA,qBAAU,EACnC,gBACA;IACEC,IAAIC,IAAAA,eAAI,EAAC,MAAM;QAAEC,QAAQ;IAAG,GAAGC,UAAU;IACzCC,SAASC,IAAAA,iBAAM,EAAC,WAAW;QAAEC,MAAM;QAAUC,UAAU;IAAK,GACzDC,UAAU,CAAC,IAAMC,kBAAK,CAACT,EAAE,EAAE;QAAEU,UAAU;IAAU,GACjDC,OAAO;IACVC,OAAOX,IAAAA,eAAI,EAAC,SAAS;QAAEC,QAAQ;IAAG,GAAGS,OAAO;IAC5CE,iBAAiBR,IAAAA,iBAAM,EAAC,mBAAmB;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,OAAO;IACtFG,MAAMC,IAAAA,eAAI,EAAC,QAAQC,KAAK,GAAmBL,OAAO;IAClDM,SAASC,IAAAA,kBAAO,EAAC,WAAWC,OAAO,CAAC,MAAMR,OAAO;IACjDS,WAAWnB,IAAAA,eAAI,EAAC,aAAa;QAAEC,QAAQ;IAAG;IAC1CmB,QAAQpB,IAAAA,eAAI,EAAC,UAAU;QAAEC,QAAQ;IAAG;IACpCoB,eAAeC,IAAAA,mBAAQ,EAAC,iBAAiB;QAAEjB,MAAM;IAAO;IACxDkB,YAAYD,IAAAA,mBAAQ,EAAC,cAAc;QAAEjB,MAAM;IAAO;IAClDmB,WAAWF,IAAAA,mBAAQ,EAAC,aAAa;QAAEjB,MAAM;IAAO,GAC7Ca,OAAO,CAACO,IAAAA,eAAG,CAAA,CAAC,iBAAiB,CAAC,EAC9Bf,OAAO;AACZ,GACA,CAACgB,QAAU;QAACC,IAAAA,gBAAK,EAAC,aAAaC,EAAE,CAACF,MAAMvB,OAAO;QAAGwB,IAAAA,gBAAK,EAAC,aAAaC,EAAE,CAACF,MAAMf,KAAK;KAAE"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/schemas/sync-clients.schema.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { sql } from 'drizzle-orm'\nimport { bigint, boolean, char, datetime, index, json, mysqlTable, varchar } from 'drizzle-orm/mysql-core'\nimport { users } from '../../users/schemas/users.schema'\nimport type { SyncClientInfo } from '../interfaces/sync-client.interface'\n\nexport const syncClients = mysqlTable(\n 'sync_clients',\n {\n id: char('id', { length: 36 }).primaryKey(),\n ownerId: bigint('ownerId', { mode: 'number', unsigned: true })\n .references(() => users.id, { onDelete: 'cascade' })\n .notNull(),\n token: char('token', { length: 36 }).notNull(),\n tokenExpiration: bigint('tokenExpiration', { mode: 'number', unsigned: true }).notNull(),\n info: json('info').$type<SyncClientInfo>().notNull(),\n enabled: boolean('enabled').default(true).notNull(),\n currentIp: varchar('currentIp', { length: 45 }),\n lastIp: varchar('lastIp', { length: 45 }),\n currentAccess: datetime('currentAccess', { mode: 'date' }),\n lastAccess: datetime('lastAccess', { mode: 'date' }),\n createdAt: datetime('createdAt', { mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull()\n },\n (table) => [index('owner_idx').on(table.ownerId), index('token_idx').on(table.token)]\n)\n"],"names":["syncClients","mysqlTable","id","char","length","primaryKey","ownerId","bigint","mode","unsigned","references","users","onDelete","notNull","token","tokenExpiration","info","json","$type","enabled","boolean","default","currentIp","varchar","lastIp","currentAccess","datetime","lastAccess","createdAt","sql","table","index","on"],"mappings":"AAAA;;;;CAIC;;;;+BAOYA;;;eAAAA;;;4BALO;2BAC8D;6BAC5D;AAGf,MAAMA,cAAcC,IAAAA,qBAAU,EACnC,gBACA;IACEC,IAAIC,IAAAA,eAAI,EAAC,MAAM;QAAEC,QAAQ;IAAG,GAAGC,UAAU;IACzCC,SAASC,IAAAA,iBAAM,EAAC,WAAW;QAAEC,MAAM;QAAUC,UAAU;IAAK,GACzDC,UAAU,CAAC,IAAMC,kBAAK,CAACT,EAAE,EAAE;QAAEU,UAAU;IAAU,GACjDC,OAAO;IACVC,OAAOX,IAAAA,eAAI,EAAC,SAAS;QAAEC,QAAQ;IAAG,GAAGS,OAAO;IAC5CE,iBAAiBR,IAAAA,iBAAM,EAAC,mBAAmB;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,OAAO;IACtFG,MAAMC,IAAAA,eAAI,EAAC,QAAQC,KAAK,GAAmBL,OAAO;IAClDM,SAASC,IAAAA,kBAAO,EAAC,WAAWC,OAAO,CAAC,MAAMR,OAAO;IACjDS,WAAWC,IAAAA,kBAAO,EAAC,aAAa;QAAEnB,QAAQ;IAAG;IAC7CoB,QAAQD,IAAAA,kBAAO,EAAC,UAAU;QAAEnB,QAAQ;IAAG;IACvCqB,eAAeC,IAAAA,mBAAQ,EAAC,iBAAiB;QAAElB,MAAM;IAAO;IACxDmB,YAAYD,IAAAA,mBAAQ,EAAC,cAAc;QAAElB,MAAM;IAAO;IAClDoB,WAAWF,IAAAA,mBAAQ,EAAC,aAAa;QAAElB,MAAM;IAAO,GAC7Ca,OAAO,CAACQ,IAAAA,eAAG,CAAA,CAAC,iBAAiB,CAAC,EAC9BhB,OAAO;AACZ,GACA,CAACiB,QAAU;QAACC,IAAAA,gBAAK,EAAC,aAAaC,EAAE,CAACF,MAAMxB,OAAO;QAAGyB,IAAAA,gBAAK,EAAC,aAAaC,EAAE,CAACF,MAAMhB,KAAK;KAAE"}
@@ -69,11 +69,11 @@ const users = (0, _mysqlcore.mysqlTable)('users', {
69
69
  onlineStatus: (0, _mysqlcore.tinyint)('onlineStatus', {
70
70
  unsigned: true
71
71
  }).default(0).notNull(),
72
- currentIp: (0, _mysqlcore.char)('currentIp', {
73
- length: 15
72
+ currentIp: (0, _mysqlcore.varchar)('currentIp', {
73
+ length: 45
74
74
  }),
75
- lastIp: (0, _mysqlcore.char)('lastIp', {
76
- length: 15
75
+ lastIp: (0, _mysqlcore.varchar)('lastIp', {
76
+ length: 45
77
77
  }),
78
78
  currentAccess: (0, _mysqlcore.datetime)('currentAccess', {
79
79
  mode: 'date'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/users/schemas/users.schema.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { SQL, sql } from 'drizzle-orm'\nimport { bigint, boolean, char, datetime, index, mysqlTable, tinyint, uniqueIndex, varchar } from 'drizzle-orm/mysql-core'\n\n/*\n role:\n 0: administrator\n 1: user\n 2: guest\n 3: link\n notification:\n 0: application\n 1: application + mail\n onlineStatus:\n 0: available\n 1: busy\n 2: absent\n 3: offline\n storageQuota:\n 0 : no storage\n null : unlimited\n other: limited to value\n*/\n\nexport const users = mysqlTable(\n 'users',\n {\n id: bigint('id', { mode: 'number', unsigned: true }).autoincrement().primaryKey(),\n email: varchar('email', { length: 255 }).notNull(),\n login: varchar('login', { length: 255 }).notNull(),\n firstName: varchar('firstName', { length: 255 }),\n lastName: varchar('lastName', { length: 255 }),\n password: varchar('password', { length: 255 }).notNull(),\n passwordAttempts: tinyint('passwordAttempts', { unsigned: true }).default(0).notNull(),\n role: tinyint('role', { unsigned: true }).default(1).notNull(),\n isActive: boolean('isActive').default(true).notNull(),\n language: char('language', { length: 2 }),\n permissions: varchar('permissions', { length: 255 }).default('').notNull(),\n storageUsage: bigint('storageUsage', { mode: 'number', unsigned: true }).default(0),\n storageQuota: bigint('storageQuota', { mode: 'number', unsigned: true }),\n notification: tinyint('notification', { unsigned: true }).default(1).notNull(),\n onlineStatus: tinyint('onlineStatus', { unsigned: true }).default(0).notNull(),\n currentIp: char('currentIp', { length: 15 }),\n lastIp: char('lastIp', { length: 15 }),\n currentAccess: datetime('currentAccess', { mode: 'date' }),\n lastAccess: datetime('lastAccess', { mode: 'date' }),\n createdAt: datetime('createdAt', { mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull()\n },\n (table) => [uniqueIndex('email_idx').on(table.email), uniqueIndex('login_idx').on(table.login), index('role_idx').on(table.role)]\n)\n\nexport const userFullNameSQL = (user: any): SQL<string> => sql`TRIM(CONCAT(${user.firstName}, ' ', ${user.lastName}))`\n"],"names":["userFullNameSQL","users","mysqlTable","id","bigint","mode","unsigned","autoincrement","primaryKey","email","varchar","length","notNull","login","firstName","lastName","password","passwordAttempts","tinyint","default","role","isActive","boolean","language","char","permissions","storageUsage","storageQuota","notification","onlineStatus","currentIp","lastIp","currentAccess","datetime","lastAccess","createdAt","sql","table","uniqueIndex","on","index","user"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAsDYA;eAAAA;;QA7BAC;eAAAA;;;4BAvBY;2BACyE;AAsB3F,MAAMA,QAAQC,IAAAA,qBAAU,EAC7B,SACA;IACEC,IAAIC,IAAAA,iBAAM,EAAC,MAAM;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGC,aAAa,GAAGC,UAAU;IAC/EC,OAAOC,IAAAA,kBAAO,EAAC,SAAS;QAAEC,QAAQ;IAAI,GAAGC,OAAO;IAChDC,OAAOH,IAAAA,kBAAO,EAAC,SAAS;QAAEC,QAAQ;IAAI,GAAGC,OAAO;IAChDE,WAAWJ,IAAAA,kBAAO,EAAC,aAAa;QAAEC,QAAQ;IAAI;IAC9CI,UAAUL,IAAAA,kBAAO,EAAC,YAAY;QAAEC,QAAQ;IAAI;IAC5CK,UAAUN,IAAAA,kBAAO,EAAC,YAAY;QAAEC,QAAQ;IAAI,GAAGC,OAAO;IACtDK,kBAAkBC,IAAAA,kBAAO,EAAC,oBAAoB;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IACpFQ,MAAMF,IAAAA,kBAAO,EAAC,QAAQ;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IAC5DS,UAAUC,IAAAA,kBAAO,EAAC,YAAYH,OAAO,CAAC,MAAMP,OAAO;IACnDW,UAAUC,IAAAA,eAAI,EAAC,YAAY;QAAEb,QAAQ;IAAE;IACvCc,aAAaf,IAAAA,kBAAO,EAAC,eAAe;QAAEC,QAAQ;IAAI,GAAGQ,OAAO,CAAC,IAAIP,OAAO;IACxEc,cAActB,IAAAA,iBAAM,EAAC,gBAAgB;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGa,OAAO,CAAC;IACjFQ,cAAcvB,IAAAA,iBAAM,EAAC,gBAAgB;QAAEC,MAAM;QAAUC,UAAU;IAAK;IACtEsB,cAAcV,IAAAA,kBAAO,EAAC,gBAAgB;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IAC5EiB,cAAcX,IAAAA,kBAAO,EAAC,gBAAgB;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IAC5EkB,WAAWN,IAAAA,eAAI,EAAC,aAAa;QAAEb,QAAQ;IAAG;IAC1CoB,QAAQP,IAAAA,eAAI,EAAC,UAAU;QAAEb,QAAQ;IAAG;IACpCqB,eAAeC,IAAAA,mBAAQ,EAAC,iBAAiB;QAAE5B,MAAM;IAAO;IACxD6B,YAAYD,IAAAA,mBAAQ,EAAC,cAAc;QAAE5B,MAAM;IAAO;IAClD8B,WAAWF,IAAAA,mBAAQ,EAAC,aAAa;QAAE5B,MAAM;IAAO,GAC7Cc,OAAO,CAACiB,IAAAA,eAAG,CAAA,CAAC,iBAAiB,CAAC,EAC9BxB,OAAO;AACZ,GACA,CAACyB,QAAU;QAACC,IAAAA,sBAAW,EAAC,aAAaC,EAAE,CAACF,MAAM5B,KAAK;QAAG6B,IAAAA,sBAAW,EAAC,aAAaC,EAAE,CAACF,MAAMxB,KAAK;QAAG2B,IAAAA,gBAAK,EAAC,YAAYD,EAAE,CAACF,MAAMjB,IAAI;KAAE;AAG5H,MAAMpB,kBAAkB,CAACyC,OAA2BL,IAAAA,eAAG,CAAA,CAAC,YAAY,EAAEK,KAAK3B,SAAS,CAAC,OAAO,EAAE2B,KAAK1B,QAAQ,CAAC,EAAE,CAAC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/users/schemas/users.schema.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { SQL, sql } from 'drizzle-orm'\nimport { bigint, boolean, char, datetime, index, mysqlTable, tinyint, uniqueIndex, varchar } from 'drizzle-orm/mysql-core'\n\n/*\n role:\n 0: administrator\n 1: user\n 2: guest\n 3: link\n notification:\n 0: application\n 1: application + mail\n onlineStatus:\n 0: available\n 1: busy\n 2: absent\n 3: offline\n storageQuota:\n 0 : no storage\n null : unlimited\n other: limited to value\n*/\n\nexport const users = mysqlTable(\n 'users',\n {\n id: bigint('id', { mode: 'number', unsigned: true }).autoincrement().primaryKey(),\n email: varchar('email', { length: 255 }).notNull(),\n login: varchar('login', { length: 255 }).notNull(),\n firstName: varchar('firstName', { length: 255 }),\n lastName: varchar('lastName', { length: 255 }),\n password: varchar('password', { length: 255 }).notNull(),\n passwordAttempts: tinyint('passwordAttempts', { unsigned: true }).default(0).notNull(),\n role: tinyint('role', { unsigned: true }).default(1).notNull(),\n isActive: boolean('isActive').default(true).notNull(),\n language: char('language', { length: 2 }),\n permissions: varchar('permissions', { length: 255 }).default('').notNull(),\n storageUsage: bigint('storageUsage', { mode: 'number', unsigned: true }).default(0),\n storageQuota: bigint('storageQuota', { mode: 'number', unsigned: true }),\n notification: tinyint('notification', { unsigned: true }).default(1).notNull(),\n onlineStatus: tinyint('onlineStatus', { unsigned: true }).default(0).notNull(),\n currentIp: varchar('currentIp', { length: 45 }),\n lastIp: varchar('lastIp', { length: 45 }),\n currentAccess: datetime('currentAccess', { mode: 'date' }),\n lastAccess: datetime('lastAccess', { mode: 'date' }),\n createdAt: datetime('createdAt', { mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull()\n },\n (table) => [uniqueIndex('email_idx').on(table.email), uniqueIndex('login_idx').on(table.login), index('role_idx').on(table.role)]\n)\n\nexport const userFullNameSQL = (user: any): SQL<string> => sql`TRIM(CONCAT(${user.firstName}, ' ', ${user.lastName}))`\n"],"names":["userFullNameSQL","users","mysqlTable","id","bigint","mode","unsigned","autoincrement","primaryKey","email","varchar","length","notNull","login","firstName","lastName","password","passwordAttempts","tinyint","default","role","isActive","boolean","language","char","permissions","storageUsage","storageQuota","notification","onlineStatus","currentIp","lastIp","currentAccess","datetime","lastAccess","createdAt","sql","table","uniqueIndex","on","index","user"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAsDYA;eAAAA;;QA7BAC;eAAAA;;;4BAvBY;2BACyE;AAsB3F,MAAMA,QAAQC,IAAAA,qBAAU,EAC7B,SACA;IACEC,IAAIC,IAAAA,iBAAM,EAAC,MAAM;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGC,aAAa,GAAGC,UAAU;IAC/EC,OAAOC,IAAAA,kBAAO,EAAC,SAAS;QAAEC,QAAQ;IAAI,GAAGC,OAAO;IAChDC,OAAOH,IAAAA,kBAAO,EAAC,SAAS;QAAEC,QAAQ;IAAI,GAAGC,OAAO;IAChDE,WAAWJ,IAAAA,kBAAO,EAAC,aAAa;QAAEC,QAAQ;IAAI;IAC9CI,UAAUL,IAAAA,kBAAO,EAAC,YAAY;QAAEC,QAAQ;IAAI;IAC5CK,UAAUN,IAAAA,kBAAO,EAAC,YAAY;QAAEC,QAAQ;IAAI,GAAGC,OAAO;IACtDK,kBAAkBC,IAAAA,kBAAO,EAAC,oBAAoB;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IACpFQ,MAAMF,IAAAA,kBAAO,EAAC,QAAQ;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IAC5DS,UAAUC,IAAAA,kBAAO,EAAC,YAAYH,OAAO,CAAC,MAAMP,OAAO;IACnDW,UAAUC,IAAAA,eAAI,EAAC,YAAY;QAAEb,QAAQ;IAAE;IACvCc,aAAaf,IAAAA,kBAAO,EAAC,eAAe;QAAEC,QAAQ;IAAI,GAAGQ,OAAO,CAAC,IAAIP,OAAO;IACxEc,cAActB,IAAAA,iBAAM,EAAC,gBAAgB;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGa,OAAO,CAAC;IACjFQ,cAAcvB,IAAAA,iBAAM,EAAC,gBAAgB;QAAEC,MAAM;QAAUC,UAAU;IAAK;IACtEsB,cAAcV,IAAAA,kBAAO,EAAC,gBAAgB;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IAC5EiB,cAAcX,IAAAA,kBAAO,EAAC,gBAAgB;QAAEZ,UAAU;IAAK,GAAGa,OAAO,CAAC,GAAGP,OAAO;IAC5EkB,WAAWpB,IAAAA,kBAAO,EAAC,aAAa;QAAEC,QAAQ;IAAG;IAC7CoB,QAAQrB,IAAAA,kBAAO,EAAC,UAAU;QAAEC,QAAQ;IAAG;IACvCqB,eAAeC,IAAAA,mBAAQ,EAAC,iBAAiB;QAAE5B,MAAM;IAAO;IACxD6B,YAAYD,IAAAA,mBAAQ,EAAC,cAAc;QAAE5B,MAAM;IAAO;IAClD8B,WAAWF,IAAAA,mBAAQ,EAAC,aAAa;QAAE5B,MAAM;IAAO,GAC7Cc,OAAO,CAACiB,IAAAA,eAAG,CAAA,CAAC,iBAAiB,CAAC,EAC9BxB,OAAO;AACZ,GACA,CAACyB,QAAU;QAACC,IAAAA,sBAAW,EAAC,aAAaC,EAAE,CAACF,MAAM5B,KAAK;QAAG6B,IAAAA,sBAAW,EAAC,aAAaC,EAAE,CAACF,MAAMxB,KAAK;QAAG2B,IAAAA,gBAAK,EAAC,YAAYD,EAAE,CAACF,MAAMjB,IAAI;KAAE;AAG5H,MAAMpB,kBAAkB,CAACyC,OAA2BL,IAAAA,eAAG,CAAA,CAAC,YAAY,EAAEK,KAAK3B,SAAS,CAAC,OAAO,EAAE2B,KAAK1B,QAAQ,CAAC,EAAE,CAAC"}
@@ -31,9 +31,6 @@ _export(exports, {
31
31
  get ENVIRONMENT_PREFIX () {
32
32
  return ENVIRONMENT_PREFIX;
33
33
  },
34
- get IS_DEV_ENV () {
35
- return IS_DEV_ENV;
36
- },
37
34
  get IS_TEST_ENV () {
38
35
  return IS_TEST_ENV;
39
36
  },
@@ -51,7 +48,6 @@ function _interop_require_default(obj) {
51
48
  default: obj
52
49
  };
53
50
  }
54
- const IS_DEV_ENV = _nodeprocess.default.env['NODE_ENV'] === 'development';
55
51
  const IS_TEST_ENV = _nodeprocess.default.env['NODE_ENV'] === 'test';
56
52
  const ENVIRONMENT_FILE_NAME = 'environment.yaml';
57
53
  const ENVIRONMENT_PATH = `environment/${ENVIRONMENT_FILE_NAME}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/configuration/config.constants.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport path from 'node:path'\nimport process from 'node:process'\n\nexport const IS_DEV_ENV: boolean = process.env['NODE_ENV'] === 'development'\nexport const IS_TEST_ENV: boolean = process.env['NODE_ENV'] === 'test'\nexport const ENVIRONMENT_FILE_NAME = 'environment.yaml'\nexport const ENVIRONMENT_PATH = `environment/${ENVIRONMENT_FILE_NAME}`\nexport const ENVIRONMENT_DIST_FILE_NAME = 'environment.dist.yaml'\nexport const ENVIRONMENT_DIST_PATH = `environment/${ENVIRONMENT_DIST_FILE_NAME}`\nexport const STATIC_PATH = path.resolve(path.join(__dirname, IS_TEST_ENV ? '../../../dist/static' : '../../static'))\nexport const STATIC_ASSETS_PATH = path.join(STATIC_PATH, 'assets')\nexport const DEFAULT_LOG_FILE_PATH = path.join(__dirname, '../../logs/server.log')\nexport const ENVIRONMENT_PREFIX = 'SYNCIN_'\n"],"names":["DEFAULT_LOG_FILE_PATH","ENVIRONMENT_DIST_FILE_NAME","ENVIRONMENT_DIST_PATH","ENVIRONMENT_FILE_NAME","ENVIRONMENT_PATH","ENVIRONMENT_PREFIX","IS_DEV_ENV","IS_TEST_ENV","STATIC_ASSETS_PATH","STATIC_PATH","process","env","path","resolve","join","__dirname"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAaYA;eAAAA;;QAJAC;eAAAA;;QACAC;eAAAA;;QAHAC;eAAAA;;QACAC;eAAAA;;QAMAC;eAAAA;;QATAC;eAAAA;;QACAC;eAAAA;;QAMAC;eAAAA;;QADAC;eAAAA;;;iEATI;oEACG;;;;;;AAEb,MAAMH,aAAsBI,oBAAO,CAACC,GAAG,CAAC,WAAW,KAAK;AACxD,MAAMJ,cAAuBG,oBAAO,CAACC,GAAG,CAAC,WAAW,KAAK;AACzD,MAAMR,wBAAwB;AAC9B,MAAMC,mBAAmB,CAAC,YAAY,EAAED,uBAAuB;AAC/D,MAAMF,6BAA6B;AACnC,MAAMC,wBAAwB,CAAC,YAAY,EAAED,4BAA4B;AACzE,MAAMQ,cAAcG,iBAAI,CAACC,OAAO,CAACD,iBAAI,CAACE,IAAI,CAACC,WAAWR,cAAc,yBAAyB;AAC7F,MAAMC,qBAAqBI,iBAAI,CAACE,IAAI,CAACL,aAAa;AAClD,MAAMT,wBAAwBY,iBAAI,CAACE,IAAI,CAACC,WAAW;AACnD,MAAMV,qBAAqB"}
1
+ {"version":3,"sources":["../../../backend/src/configuration/config.constants.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport path from 'node:path'\nimport process from 'node:process'\n\nexport const IS_TEST_ENV: boolean = process.env['NODE_ENV'] === 'test'\nexport const ENVIRONMENT_FILE_NAME = 'environment.yaml'\nexport const ENVIRONMENT_PATH = `environment/${ENVIRONMENT_FILE_NAME}`\nexport const ENVIRONMENT_DIST_FILE_NAME = 'environment.dist.yaml'\nexport const ENVIRONMENT_DIST_PATH = `environment/${ENVIRONMENT_DIST_FILE_NAME}`\nexport const STATIC_PATH = path.resolve(path.join(__dirname, IS_TEST_ENV ? '../../../dist/static' : '../../static'))\nexport const STATIC_ASSETS_PATH = path.join(STATIC_PATH, 'assets')\nexport const DEFAULT_LOG_FILE_PATH = path.join(__dirname, '../../logs/server.log')\nexport const ENVIRONMENT_PREFIX = 'SYNCIN_'\n"],"names":["DEFAULT_LOG_FILE_PATH","ENVIRONMENT_DIST_FILE_NAME","ENVIRONMENT_DIST_PATH","ENVIRONMENT_FILE_NAME","ENVIRONMENT_PATH","ENVIRONMENT_PREFIX","IS_TEST_ENV","STATIC_ASSETS_PATH","STATIC_PATH","process","env","path","resolve","join","__dirname"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAYYA;eAAAA;;QAJAC;eAAAA;;QACAC;eAAAA;;QAHAC;eAAAA;;QACAC;eAAAA;;QAMAC;eAAAA;;QARAC;eAAAA;;QAMAC;eAAAA;;QADAC;eAAAA;;;iEARI;oEACG;;;;;;AAEb,MAAMF,cAAuBG,oBAAO,CAACC,GAAG,CAAC,WAAW,KAAK;AACzD,MAAMP,wBAAwB;AAC9B,MAAMC,mBAAmB,CAAC,YAAY,EAAED,uBAAuB;AAC/D,MAAMF,6BAA6B;AACnC,MAAMC,wBAAwB,CAAC,YAAY,EAAED,4BAA4B;AACzE,MAAMO,cAAcG,iBAAI,CAACC,OAAO,CAACD,iBAAI,CAACE,IAAI,CAACC,WAAWR,cAAc,yBAAyB;AAC7F,MAAMC,qBAAqBI,iBAAI,CAACE,IAAI,CAACL,aAAa;AAClD,MAAMR,wBAAwBW,iBAAI,CAACE,IAAI,CAACC,WAAW;AACnD,MAAMT,qBAAqB"}
@@ -118,8 +118,8 @@ function hasEnvConfig() {
118
118
  /**
119
119
  * Parse a raw env-string into boolean, number or leave as string.
120
120
  */ function parseEnvValue(value) {
121
- // remove quotes & convert to lowercase
122
- value = value.replace(/^"+|"+$/g, '').toLowerCase();
121
+ // remove first and last quote if exists
122
+ value = value.replace(/^"(.*)"$/, '$1');
123
123
  if (value === 'true') return true;
124
124
  if (value === 'false') return false;
125
125
  if (!isNaN(Number(value))) return Number(value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/configuration/config.loader.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport deepmerge from 'deepmerge'\nimport * as yaml from 'js-yaml'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {\n DEFAULT_LOG_FILE_PATH,\n ENVIRONMENT_DIST_FILE_NAME,\n ENVIRONMENT_DIST_PATH,\n ENVIRONMENT_FILE_NAME,\n ENVIRONMENT_PATH,\n ENVIRONMENT_PREFIX\n} from './config.constants'\nimport type { Configuration } from './config.validation'\n\nexport function configLoader(): any {\n let config: Partial<Configuration> = loadEnvFile(ENVIRONMENT_PATH, ENVIRONMENT_FILE_NAME)\n\n if (hasEnvConfig()) {\n // If any environment vars are found, parse the config model and apply those settings\n const envConfig = getEnvOverrides(loadEnvFile(ENVIRONMENT_DIST_PATH, ENVIRONMENT_DIST_FILE_NAME, true))\n config = deepmerge(config, envConfig)\n }\n\n if (Object.keys(config).length === 0) {\n throw new Error(`Missing configuration: \"${ENVIRONMENT_FILE_NAME}\" not found, or no variables beginning with \"${ENVIRONMENT_PREFIX}\" are set.`)\n }\n\n if (config.logger?.stdout === false) {\n // ensure log directory exists\n const logFilePath = config.logger.filePath || DEFAULT_LOG_FILE_PATH\n const dirLogPath = path.dirname(logFilePath)\n if (!fs.existsSync(dirLogPath)) {\n fs.mkdirSync(dirLogPath, { recursive: true })\n }\n console.log(`Logging to file → ${logFilePath}`)\n }\n\n return config\n}\n\nfunction buildPathsUp(basePath: string, fileName: string, levels = 4): string[] {\n // Generates candidate file paths, optionally walking up from __dirname to a given depth.\n return Array.from({ length: levels + 1 }, (_, i) => path.resolve(basePath, ...Array(i).fill('..'), fileName))\n}\n\nfunction loadEnvFile(envPath: string, envFileName: string, throwIfMissing = false): any {\n const candidates = [envPath, envFileName, ...buildPathsUp(__dirname, envPath), ...buildPathsUp(__dirname, envFileName)]\n for (const envFilePath of candidates) {\n if (fs.existsSync(envFilePath) && fs.lstatSync(envFilePath).isFile()) {\n if (envFileName === ENVIRONMENT_FILE_NAME) {\n console.log(`Load configuration → ${envFilePath}`)\n }\n return yaml.load(fs.readFileSync(envFilePath, 'utf8'))\n }\n }\n if (throwIfMissing) {\n throw new Error(`${envFileName} not found`)\n }\n return {}\n}\n\nfunction hasEnvConfig(): boolean {\n return Object.keys(process.env).some((key) => key.startsWith(ENVIRONMENT_PREFIX))\n}\n\n/**\n * Parse a raw env-string into boolean, number or leave as string.\n */\nfunction parseEnvValue(value: string): any {\n // remove quotes & convert to lowercase\n value = value.replace(/^\"+|\"+$/g, '').toLowerCase()\n if (value === 'true') return true\n if (value === 'false') return false\n if (!isNaN(Number(value))) return Number(value)\n return value\n}\n\n/**\n * Assigns a nested property into obj, creating sub-objects as needed.\n */\nfunction setObjectPropertyFromString(obj: any, property: string, value: any): void {\n const segments = property.split('.')\n let cursor = obj\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]\n if (!(seg in cursor) || typeof cursor[seg] !== 'object') {\n cursor[seg] = {}\n }\n cursor = cursor[seg]\n }\n cursor[segments[segments.length - 1]] = value\n}\n\n/**\n * Returns a new object containing only the env-var overrides\n * that match existing keys in `config`, nested and cased properly.\n */\nfunction getEnvOverrides(config: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (const [envKey, rawValue] of Object.entries(process.env)) {\n if (!envKey.startsWith(ENVIRONMENT_PREFIX) || rawValue === undefined) {\n continue\n }\n\n // [\"APPLICATIONS\",\"FILES\",\"DATAPATH\"] etc.\n const segments = envKey.slice(ENVIRONMENT_PREFIX.length).split('_')\n const secretFromFile = segments[segments.length - 1] === 'FILE'\n if (secretFromFile) {\n // remove FILE attribute\n segments.pop()\n }\n\n // Walk through config to validate path & capture real key names\n let cursorConfig: any = config\n const realSegments: string[] = []\n let pathExists = true\n\n for (const seg of segments) {\n if (cursorConfig == null || typeof cursorConfig !== 'object') {\n pathExists = false\n break\n }\n // Find the actual key (preserving camelCase) whose uppercase matches seg\n const match = Object.keys(cursorConfig).find((k) => k.toUpperCase() === seg)\n if (!match) {\n pathExists = false\n break\n }\n realSegments.push(match)\n cursorConfig = cursorConfig[match]\n }\n\n if (!pathExists) {\n console.warn(`Ignoring unknown environment variable: \"${envKey}\".`)\n continue\n }\n\n // Build the nested override in `result`\n const path = realSegments.join('.')\n if (secretFromFile) {\n try {\n setObjectPropertyFromString(result, path, fs.readFileSync(rawValue, 'utf-8').trim())\n } catch (e) {\n console.error(`Unable to store secret from file ${rawValue} : ${e}`)\n }\n } else {\n setObjectPropertyFromString(result, path, parseEnvValue(rawValue))\n }\n }\n\n return result\n}\n"],"names":["configLoader","config","loadEnvFile","ENVIRONMENT_PATH","ENVIRONMENT_FILE_NAME","hasEnvConfig","envConfig","getEnvOverrides","ENVIRONMENT_DIST_PATH","ENVIRONMENT_DIST_FILE_NAME","deepmerge","Object","keys","length","Error","ENVIRONMENT_PREFIX","logger","stdout","logFilePath","filePath","DEFAULT_LOG_FILE_PATH","dirLogPath","path","dirname","fs","existsSync","mkdirSync","recursive","console","log","buildPathsUp","basePath","fileName","levels","Array","from","_","i","resolve","fill","envPath","envFileName","throwIfMissing","candidates","__dirname","envFilePath","lstatSync","isFile","yaml","load","readFileSync","process","env","some","key","startsWith","parseEnvValue","value","replace","toLowerCase","isNaN","Number","setObjectPropertyFromString","obj","property","segments","split","cursor","seg","result","envKey","rawValue","entries","undefined","slice","secretFromFile","pop","cursorConfig","realSegments","pathExists","match","find","k","toUpperCase","push","warn","join","trim","e","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../backend/src/configuration/config.loader.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport deepmerge from 'deepmerge'\nimport * as yaml from 'js-yaml'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {\n DEFAULT_LOG_FILE_PATH,\n ENVIRONMENT_DIST_FILE_NAME,\n ENVIRONMENT_DIST_PATH,\n ENVIRONMENT_FILE_NAME,\n ENVIRONMENT_PATH,\n ENVIRONMENT_PREFIX\n} from './config.constants'\nimport type { Configuration } from './config.validation'\n\nexport function configLoader(): any {\n let config: Partial<Configuration> = loadEnvFile(ENVIRONMENT_PATH, ENVIRONMENT_FILE_NAME)\n\n if (hasEnvConfig()) {\n // If any environment vars are found, parse the config model and apply those settings\n const envConfig = getEnvOverrides(loadEnvFile(ENVIRONMENT_DIST_PATH, ENVIRONMENT_DIST_FILE_NAME, true))\n config = deepmerge(config, envConfig)\n }\n\n if (Object.keys(config).length === 0) {\n throw new Error(`Missing configuration: \"${ENVIRONMENT_FILE_NAME}\" not found, or no variables beginning with \"${ENVIRONMENT_PREFIX}\" are set.`)\n }\n\n if (config.logger?.stdout === false) {\n // ensure log directory exists\n const logFilePath = config.logger.filePath || DEFAULT_LOG_FILE_PATH\n const dirLogPath = path.dirname(logFilePath)\n if (!fs.existsSync(dirLogPath)) {\n fs.mkdirSync(dirLogPath, { recursive: true })\n }\n console.log(`Logging to file → ${logFilePath}`)\n }\n\n return config\n}\n\nfunction buildPathsUp(basePath: string, fileName: string, levels = 4): string[] {\n // Generates candidate file paths, optionally walking up from __dirname to a given depth.\n return Array.from({ length: levels + 1 }, (_, i) => path.resolve(basePath, ...Array(i).fill('..'), fileName))\n}\n\nfunction loadEnvFile(envPath: string, envFileName: string, throwIfMissing = false): any {\n const candidates = [envPath, envFileName, ...buildPathsUp(__dirname, envPath), ...buildPathsUp(__dirname, envFileName)]\n for (const envFilePath of candidates) {\n if (fs.existsSync(envFilePath) && fs.lstatSync(envFilePath).isFile()) {\n if (envFileName === ENVIRONMENT_FILE_NAME) {\n console.log(`Load configuration → ${envFilePath}`)\n }\n return yaml.load(fs.readFileSync(envFilePath, 'utf8'))\n }\n }\n if (throwIfMissing) {\n throw new Error(`${envFileName} not found`)\n }\n return {}\n}\n\nfunction hasEnvConfig(): boolean {\n return Object.keys(process.env).some((key) => key.startsWith(ENVIRONMENT_PREFIX))\n}\n\n/**\n * Parse a raw env-string into boolean, number or leave as string.\n */\nfunction parseEnvValue(value: string): any {\n // remove first and last quote if exists\n value = value.replace(/^\"(.*)\"$/, '$1')\n if (value === 'true') return true\n if (value === 'false') return false\n if (!isNaN(Number(value))) return Number(value)\n return value\n}\n\n/**\n * Assigns a nested property into obj, creating sub-objects as needed.\n */\nfunction setObjectPropertyFromString(obj: any, property: string, value: any): void {\n const segments = property.split('.')\n let cursor = obj\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]\n if (!(seg in cursor) || typeof cursor[seg] !== 'object') {\n cursor[seg] = {}\n }\n cursor = cursor[seg]\n }\n cursor[segments[segments.length - 1]] = value\n}\n\n/**\n * Returns a new object containing only the env-var overrides\n * that match existing keys in `config`, nested and cased properly.\n */\nfunction getEnvOverrides(config: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (const [envKey, rawValue] of Object.entries(process.env)) {\n if (!envKey.startsWith(ENVIRONMENT_PREFIX) || rawValue === undefined) {\n continue\n }\n\n // [\"APPLICATIONS\",\"FILES\",\"DATAPATH\"] etc.\n const segments = envKey.slice(ENVIRONMENT_PREFIX.length).split('_')\n const secretFromFile = segments[segments.length - 1] === 'FILE'\n if (secretFromFile) {\n // remove FILE attribute\n segments.pop()\n }\n\n // Walk through config to validate path & capture real key names\n let cursorConfig: any = config\n const realSegments: string[] = []\n let pathExists = true\n\n for (const seg of segments) {\n if (cursorConfig == null || typeof cursorConfig !== 'object') {\n pathExists = false\n break\n }\n // Find the actual key (preserving camelCase) whose uppercase matches seg\n const match = Object.keys(cursorConfig).find((k) => k.toUpperCase() === seg)\n if (!match) {\n pathExists = false\n break\n }\n realSegments.push(match)\n cursorConfig = cursorConfig[match]\n }\n\n if (!pathExists) {\n console.warn(`Ignoring unknown environment variable: \"${envKey}\".`)\n continue\n }\n\n // Build the nested override in `result`\n const path = realSegments.join('.')\n if (secretFromFile) {\n try {\n setObjectPropertyFromString(result, path, fs.readFileSync(rawValue, 'utf-8').trim())\n } catch (e) {\n console.error(`Unable to store secret from file ${rawValue} : ${e}`)\n }\n } else {\n setObjectPropertyFromString(result, path, parseEnvValue(rawValue))\n }\n }\n\n return result\n}\n"],"names":["configLoader","config","loadEnvFile","ENVIRONMENT_PATH","ENVIRONMENT_FILE_NAME","hasEnvConfig","envConfig","getEnvOverrides","ENVIRONMENT_DIST_PATH","ENVIRONMENT_DIST_FILE_NAME","deepmerge","Object","keys","length","Error","ENVIRONMENT_PREFIX","logger","stdout","logFilePath","filePath","DEFAULT_LOG_FILE_PATH","dirLogPath","path","dirname","fs","existsSync","mkdirSync","recursive","console","log","buildPathsUp","basePath","fileName","levels","Array","from","_","i","resolve","fill","envPath","envFileName","throwIfMissing","candidates","__dirname","envFilePath","lstatSync","isFile","yaml","load","readFileSync","process","env","some","key","startsWith","parseEnvValue","value","replace","isNaN","Number","setObjectPropertyFromString","obj","property","segments","split","cursor","seg","result","envKey","rawValue","entries","undefined","slice","secretFromFile","pop","cursorConfig","realSegments","pathExists","match","find","k","toUpperCase","push","warn","join","trim","e","error"],"mappings":"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"}
@@ -16,7 +16,7 @@ const _drizzlekit = require("drizzle-kit");
16
16
  const _configloader = require("../../configuration/config.loader");
17
17
  const _constants = require("./constants");
18
18
  const _default = (0, _drizzlekit.defineConfig)({
19
- schema: _constants.SCHEMA_PATH,
19
+ schema: (0, _constants.getSchemaPath)(),
20
20
  out: _constants.MIGRATIONS_PATH,
21
21
  strict: false,
22
22
  dialect: 'mysql',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/infrastructure/database/configuration.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Config, defineConfig } from 'drizzle-kit'\nimport { configLoader } from '../../configuration/config.loader'\nimport { MIGRATIONS_PATH, SCHEMA_PATH } from './constants'\n\nexport default defineConfig({\n schema: SCHEMA_PATH,\n out: MIGRATIONS_PATH,\n strict: false,\n dialect: 'mysql',\n url: configLoader().mysql.url,\n tablesFilter: ['files_content_*']\n} as Config)\n"],"names":["defineConfig","schema","SCHEMA_PATH","out","MIGRATIONS_PATH","strict","dialect","url","configLoader","mysql","tablesFilter"],"mappings":"AAAA;;;;CAIC;;;;+BAMD;;;eAAA;;;4BAJqC;8BACR;2BACgB;MAE7C,WAAeA,IAAAA,wBAAY,EAAC;IAC1BC,QAAQC,sBAAW;IACnBC,KAAKC,0BAAe;IACpBC,QAAQ;IACRC,SAAS;IACTC,KAAKC,IAAAA,0BAAY,IAAGC,KAAK,CAACF,GAAG;IAC7BG,cAAc;QAAC;KAAkB;AACnC"}
1
+ {"version":3,"sources":["../../../../backend/src/infrastructure/database/configuration.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Config, defineConfig } from 'drizzle-kit'\nimport { configLoader } from '../../configuration/config.loader'\nimport { getSchemaPath, MIGRATIONS_PATH } from './constants'\n\nexport default defineConfig({\n schema: getSchemaPath(),\n out: MIGRATIONS_PATH,\n strict: false,\n dialect: 'mysql',\n url: configLoader().mysql.url,\n tablesFilter: ['files_content_*']\n} as Config)\n"],"names":["defineConfig","schema","getSchemaPath","out","MIGRATIONS_PATH","strict","dialect","url","configLoader","mysql","tablesFilter"],"mappings":"AAAA;;;;CAIC;;;;+BAMD;;;eAAA;;;4BAJqC;8BACR;2BACkB;MAE/C,WAAeA,IAAAA,wBAAY,EAAC;IAC1BC,QAAQC,IAAAA,wBAAa;IACrBC,KAAKC,0BAAe;IACpBC,QAAQ;IACRC,SAAS;IACTC,KAAKC,IAAAA,0BAAY,IAAGC,KAAK,CAACF,GAAG;IAC7BG,cAAc;QAAC;KAAkB;AACnC"}
@@ -22,12 +22,12 @@ _export(exports, {
22
22
  get MIGRATIONS_PATH () {
23
23
  return MIGRATIONS_PATH;
24
24
  },
25
- get SCHEMA_PATH () {
26
- return SCHEMA_PATH;
25
+ get getSchemaPath () {
26
+ return getSchemaPath;
27
27
  }
28
28
  });
29
29
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
30
- const _configconstants = require("../../configuration/config.constants");
30
+ const _nodefs = /*#__PURE__*/ _interop_require_default(require("node:fs"));
31
31
  function _interop_require_default(obj) {
32
32
  return obj && obj.__esModule ? obj : {
33
33
  default: obj
@@ -35,7 +35,21 @@ function _interop_require_default(obj) {
35
35
  }
36
36
  const DB_CHARSET = 'utf8mb4';
37
37
  const DB_TOKEN_PROVIDER = 'DB';
38
- const SCHEMA_PATH = _nodepath.default.join(__dirname, `schema${_configconstants.IS_DEV_ENV ? '.ts' : '.js'}`);
39
- const MIGRATIONS_PATH = _nodepath.default.join(__dirname, '../../../migrations');
38
+ const MIGRATIONS_PATH = _nodepath.default.relative(process.cwd(), _nodepath.default.join(__dirname, '../../../migrations'));
39
+ function getSchemaPath() {
40
+ // Look for schema.ts (dev) or schema.js (production), throw if none is found
41
+ const extensions = [
42
+ 'js',
43
+ 'ts'
44
+ ];
45
+ for (const ext of extensions){
46
+ const filePath = _nodepath.default.join(__dirname, `schema.${ext}`);
47
+ if (_nodefs.default.existsSync(filePath)) {
48
+ console.log('USE SCHEMA PATH', filePath);
49
+ return filePath;
50
+ }
51
+ }
52
+ throw new Error('No schema.ts or schema.js file found !');
53
+ }
40
54
 
41
55
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/infrastructure/database/constants.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport path from 'node:path'\nimport { IS_DEV_ENV } from '../../configuration/config.constants'\n\nexport const DB_CHARSET = 'utf8mb4'\nexport const DB_TOKEN_PROVIDER = 'DB'\nexport const SCHEMA_PATH = path.join(__dirname, `schema${IS_DEV_ENV ? '.ts' : '.js'}`)\nexport const MIGRATIONS_PATH = path.join(__dirname, '../../../migrations')\n"],"names":["DB_CHARSET","DB_TOKEN_PROVIDER","MIGRATIONS_PATH","SCHEMA_PATH","path","join","__dirname","IS_DEV_ENV"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAKYA;eAAAA;;QACAC;eAAAA;;QAEAC;eAAAA;;QADAC;eAAAA;;;iEALI;iCACU;;;;;;AAEpB,MAAMH,aAAa;AACnB,MAAMC,oBAAoB;AAC1B,MAAME,cAAcC,iBAAI,CAACC,IAAI,CAACC,WAAW,CAAC,MAAM,EAAEC,2BAAU,GAAG,QAAQ,OAAO;AAC9E,MAAML,kBAAkBE,iBAAI,CAACC,IAAI,CAACC,WAAW"}
1
+ {"version":3,"sources":["../../../../backend/src/infrastructure/database/constants.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nexport const DB_CHARSET = 'utf8mb4'\nexport const DB_TOKEN_PROVIDER = 'DB'\nexport const MIGRATIONS_PATH = path.relative(process.cwd(), path.join(__dirname, '../../../migrations'))\n\nexport function getSchemaPath(): string {\n // Look for schema.ts (dev) or schema.js (production), throw if none is found\n const extensions = ['js', 'ts']\n\n for (const ext of extensions) {\n const filePath = path.join(__dirname, `schema.${ext}`)\n if (fs.existsSync(filePath)) {\n console.log('USE SCHEMA PATH', filePath)\n return filePath\n }\n }\n\n throw new Error('No schema.ts or schema.js file found !')\n}\n"],"names":["DB_CHARSET","DB_TOKEN_PROVIDER","MIGRATIONS_PATH","getSchemaPath","path","relative","process","cwd","join","__dirname","extensions","ext","filePath","fs","existsSync","console","log","Error"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAKYA;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QAEGC;eAAAA;;;iEAPC;+DACF;;;;;;AAER,MAAMH,aAAa;AACnB,MAAMC,oBAAoB;AAC1B,MAAMC,kBAAkBE,iBAAI,CAACC,QAAQ,CAACC,QAAQC,GAAG,IAAIH,iBAAI,CAACI,IAAI,CAACC,WAAW;AAE1E,SAASN;IACd,6EAA6E;IAC7E,MAAMO,aAAa;QAAC;QAAM;KAAK;IAE/B,KAAK,MAAMC,OAAOD,WAAY;QAC5B,MAAME,WAAWR,iBAAI,CAACI,IAAI,CAACC,WAAW,CAAC,OAAO,EAAEE,KAAK;QACrD,IAAIE,eAAE,CAACC,UAAU,CAACF,WAAW;YAC3BG,QAAQC,GAAG,CAAC,mBAAmBJ;YAC/B,OAAOA;QACT;IACF;IAEA,MAAM,IAAIK,MAAM;AAClB"}
@@ -1 +1 @@
1
- import{a as Se}from"./chunk-MWPC5XQW.js";import{a as Q}from"./chunk-FNO4KAYG.js";import"./chunk-Z6S7RFGN.js";import{a as N,b as O,c as ye,d as be}from"./chunk-XN4TXQKE.js";import{b as we,c as ve,d as Te,e as Le}from"./chunk-3PB73RWL.js";import"./chunk-CIGVDQPA.js";import"./chunk-WSVE6EWB.js";import"./chunk-HXRRMHEX.js";import"./chunk-DJRILQTU.js";import{Hb as ge,Ja as Ce,Jb as ke,Xa as fe,kb as xe,pa as de,qa as me,ra as ue,v as X,w as Z,xb as he}from"./chunk-EDLO4Y5E.js";import"./chunk-ZZ3LHYOY.js";import{b as K}from"./chunk-J6YSVODR.js";import{Cb as C,Eb as l,Ed as Y,Fd as J,Ga as D,Gc as q,Ib as L,If as se,Jb as S,Kb as V,L as U,Ma as r,Mb as F,Nb as P,Ob as M,Oe as oe,Pb as u,Qb as v,Rb as I,Sb as B,Ue as re,Uf as ce,Vf as pe,Wd as ee,Xa as W,Xb as R,Yb as H,Zc as j,Zf as _e,ab as T,ce as te,dc as k,fc as y,ha as w,ib as z,ie,jb as x,kb as h,ma as d,na as m,nb as A,ob as $,of as ae,pb as _,qb as s,rb as c,sb as f,te as ne,tf as le,yd as G,zb as b}from"./chunk-JQOMI5VI.js";import"./chunk-RTRJ3KFH.js";var Me=["MainContextMenu"],Ee=["TargetContextMenu"],Ve=(t,a)=>a.id,Fe=(t,a)=>a.key;function Ae(t,a){if(t&1&&(s(0,"span",30),u(1),c()),t&2){let e=l().$implicit,i=l(2);F("font-size",i.galleryMode.textSize,"px"),r(),I(" ",e.hTimeAccessAgo," ")}}function $e(t,a){if(t&1){let e=b();s(0,"div",21),C("click",function(){let o=d(e).$implicit,n=l(2);return m(n.onSelect(o))})("contextmenu",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("pressup",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("tap",function(){d(e);let o=l(2);return m(o.openLinkDialog())}),s(1,"div",22)(2,"img",23),C("error",function(){let o=d(e).$implicit;return m(o.fallBackMimeUrl())}),c(),s(3,"span",24),x(4,Ae,2,3,"span",25),c(),s(5,"span",26),f(6,"app-share-repository",27),c()(),s(7,"div",28)(8,"span",29),u(9),c()()()}if(t&2){let e=a.$implicit,i=a.$index,o=l(2);F("height",o.galleryMode.dimensions,"px")("width",o.galleryMode.dimensions,"px"),P("selected",e.id===(o.selected==null?null:o.selected.id))("disabled",!e.link.isActive),r(),z("rowIndex",i),r(),_("src",e.mimeUrl,D)("height",o.galleryMode.image)("width",o.galleryMode.image),r(2),h(e.newly?4:-1),r(2),_("share",e)("galleryMode",o.galleryMode),r(2),F("font-size",o.galleryMode.textSize,"px"),r(),v(e.name)}}function Pe(t,a){if(t&1){let e=b();s(0,"div",13)(1,"app-virtual-scroll",18),k(2,"searchFilter"),C("contextmenu",function(o){d(e);let n=l();return m(n.onContextMenu(o))}),s(3,"div",19),A(4,$e,10,18,"div",20,Ve),c()()()}if(t&2){let e=l();r(),_("childHeight",e.galleryMode.dimensions)("childWidth",e.galleryMode.dimensions)("items",y(2,5,e.shares,e.inputFilter.search()))("galleryMode",!0)("resizeOffset",110),r(3),$(e.scrollView==null?null:e.scrollView.viewPortItems)}}function Ie(t,a){if(t&1&&f(0,"fa-icon",37),t&2){let e=l(4);_("icon",e.sortTable.sortParam.asc?e.icons.faArrowDown:e.icons.faArrowUp)("fixedWidth",!1)}}function Be(t,a){if(t&1){let e=b();s(0,"th",36),C("click",function(){d(e);let o=l().$implicit,n=l(2);return m(n.sortBy(o.key))}),u(1),x(2,Ie,1,2,"fa-icon",37),c()}if(t&2){let e=l().$implicit,i=l(2);M(e.value.class),F("width",e.value.width,"%"),P("text-align-center",e.value.textCenter)("cursor-pointer",e.value.sortable),r(),I(" ",e.value.label," "),r(),h(i.sortTable.sortParam.column===e.key?2:-1)}}function Re(t,a){if(t&1&&x(0,Be,3,10,"th",35),t&2){let e=a.$implicit;h(e.value.show?0:-1)}}function De(t,a){if(t&1){let e=b();s(0,"div",40)(1,"img",43),C("error",function(){d(e);let o=l(3).$implicit;return m(o.fallBackMimeUrl())}),c(),s(2,"div",44)(3,"span",29),u(4),c(),s(5,"span",45),u(6),c()()()}if(t&2){let e=l(3).$implicit;r(),_("src",e.mimeUrl,D),r(3),v(e.name),r(2),v(e.description)}}function Ne(t,a){if(t&1&&(s(0,"span"),u(1),c()),t&2){let e=l(4).$implicit;r(),v(e.link.email||"")}}function Oe(t,a){if(t&1&&(s(0,"span",41)(1,"span"),u(2),c(),x(3,Ne,2,1,"span"),c()),t&2){let e=l(3).$implicit;r(2),v(e.link.name),r(),h(e.link.email?3:-1)}}function Qe(t,a){if(t&1&&f(0,"app-share-repository",42),t&2){let e=l(3).$implicit;_("share",e)}}function Ue(t,a){if(t&1&&(s(0,"span"),u(1),c()),t&2){let e=l(4).$implicit;M(R("badge rounded-pill ",e.link.nbAccess>=e.link.limitAccess?"bg-danger":"bg-success")),r(),B(" ",e.link.nbAccess,"/",e.link.limitAccess," ")}}function We(t,a){if(t&1&&(s(0,"span",47),u(1),c()),t&2){let e=l(4).$implicit;r(),v(e.link.nbAccess)}}function ze(t,a){if(t&1&&(s(0,"span",49),u(1),k(2,"translate"),c()),t&2){let e=l(5).$implicit,i=l(2);r(),B("",e.hTimeExpirationAgo,"\xA0",y(2,2,e.hTimeExpirationAgo===1?"day":"days",i.locale.language))}}function He(t,a){if(t&1&&(s(0,"span"),f(1,"fa-icon",37),x(2,ze,3,5,"span",49),c()),t&2){let e=l(4).$implicit,i=l(2);M(R("badge rounded-pill bg-",e.hTimeExpirationAgo>=1?"warning":"danger"," ms-1")),r(),_("icon",i.icons.faClock)("fixedWidth",!1),r(),h(e.hTimeExpirationAgo>=1?2:-1)}}function qe(t,a){if(t&1&&(s(0,"span",48),f(1,"fa-icon",6),c()),t&2){let e=l(6);r(),_("icon",e.icons.faLock)}}function Ke(t,a){if(t&1&&(x(0,Ue,2,5,"span",46)(1,We,2,1,"span",47),x(2,He,3,6,"span",46),x(3,qe,2,1,"span",48)),t&2){let e=l(3).$implicit;h(e.link.limitAccess?0:1),r(2),h(e.link.expiresAt?2:-1),r(),h(e.link.requireAuth?3:-1)}}function je(t,a){if(t&1&&f(0,"app-file-permissions",50),t&2){let e=l(4).$implicit;_("permissions",e.hPerms)}}function Ge(t,a){if(t&1&&x(0,je,1,1,"app-file-permissions",50),t&2){let e=l(3).$implicit;h(e.link.permissions?0:-1)}}function Ye(t,a){if(t&1&&u(0),t&2){let e=l(4).$implicit;I(" ",e.hTimeAccessAgo," ")}}function Je(t,a){t&1&&(s(0,"span",51),u(1,"never"),c())}function Xe(t,a){if(t&1&&x(0,Ye,1,1)(1,Je,2,0,"span",51),t&2){let e=l(3).$implicit;h(e.link.currentAccess?0:1)}}function Ze(t,a){if(t&1&&(s(0,"td"),x(1,De,7,3,"div",40)(2,Oe,4,2,"span",41)(3,Qe,1,1,"app-share-repository",42)(4,Ke,4,3)(5,Ge,1,1)(6,Xe,2,1),c()),t&2){let e,i=l().$implicit,o=l().$implicit;M(H("",i.value.class," ",i.value.newly!==void 0?"props-newly-"+o[i.value.newly]:"")),F("width",i.value.width,"%"),P("text-align-center",i.value.textCenter),r(),h((e=i.key)==="name"?1:e==="link"?2:e==="from"?3:e==="infos"?4:e==="permissions"?5:e==="accessed"?6:-1)}}function et(t,a){if(t&1&&x(0,Ze,7,9,"td",39),t&2){let e=a.$implicit;h(e.value.show?0:-1)}}function tt(t,a){if(t&1){let e=b();s(0,"tr",38),C("click",function(){let o=d(e).$implicit,n=l(2);return m(n.onSelect(o))})("contextmenu",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("pressup",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("tap",function(){d(e);let o=l(2);return m(o.openLinkDialog())}),A(1,et,1,1,null,null,Fe),k(3,"keyvalue"),c()}if(t&2){let e=a.$implicit,i=l(2);P("selected",e.id===(i.selected==null?null:i.selected.id))("disabled",!e.link.isActive),r(),$(y(3,4,i.tableHeaders,i.originalOrderKeyValue))}}function it(t,a){if(t&1){let e=b();s(0,"table",31)(1,"thead")(2,"tr"),A(3,Re,1,1,null,null,Fe),k(5,"keyvalue"),c()()(),s(6,"app-virtual-scroll",32),k(7,"searchFilter"),C("contextmenu",function(o){d(e);let n=l();return m(n.onContextMenu(o))}),s(8,"table",31)(9,"tbody",33),A(10,tt,4,7,"tr",34,Ve),c()()()}if(t&2){let e=l();r(3),$(y(5,2,e.tableHeaders,e.originalOrderKeyValue)),r(3),_("bufferAmount",5)("items",y(7,5,e.shares,e.inputFilter.search())),r(4),$(e.scrollView==null?null:e.scrollView.viewPortItems)}}function nt(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Refresh"),c()),t&2){let e=l();r(),_("icon",e.icons.faArrowRotateRight)}}function ot(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Go to"),c()),t&2){let e=l();r(),_("icon",e.icons.faMapMarkerAlt)}}function rt(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Edit link"),c()),t&2){let e=l();r(),_("icon",e.icons.faPen)}}function at(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Copy link"),c()),t&2){let e=l();r(),_("icon",e.icons.faClipboard)}}function lt(t,a){}function st(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Informations"),c()),t&2){let e=l();r(),_("icon",e.icons.faCircleInfo)}}var Dt=(()=>{let a=class a{constructor(){this.locale=w(G),this.layout=w(he),this.icons={faLink:oe,faArrowRotateRight:se,faArrowDown:ce,faArrowUp:re,faMapMarkerAlt:pe,faPen:ae,faEllipsisH:ee,faClock:ie,faLock:le,faClipboard:ne,faClipboardCheck:te,faCircleInfo:_e},this.originalOrderKeyValue=fe,this.TAB_MENU=Ce,this.loading=!1,this.linkWasCopied=!1,this.shares=[],this.selected=null,this.tableHeaders={name:{label:"Name",width:30,textCenter:!1,class:"",show:!0,sortable:!0},link:{label:"Link",width:15,textCenter:!1,class:"d-none d-sm-table-cell",show:!0,sortable:!0},from:{label:"Shared from",width:15,textCenter:!1,class:"d-none d-md-table-cell",show:!0},infos:{label:"Infos",width:15,textCenter:!0,class:"d-none d-lg-table-cell",show:!0,sortable:!0},permissions:{label:"Permissions",width:10,textCenter:!0,class:"d-none d-lg-table-cell",show:!0,sortable:!0},accessed:{label:"Accessed",width:10,textCenter:!0,class:"d-none d-lg-table-cell",newly:"newly",show:!0,sortable:!0}},this.btnSortFields={name:"Name",link:"Link",accessed:"Accessed"},this.activatedRoute=w(K),this.store=w(xe),this.linksService=w(Le),this.sharesService=w(ve),this.sortSettings={default:[{prop:"name",type:"string"}],link:[{prop:"link.name",type:"string"}],name:[{prop:"name",type:"string"}],infos:[{prop:"link.nbAccess",type:"number"}],permissions:[{prop:"link.permissions",type:"length"}],accessed:[{prop:"link.currentAccess",type:"date"}]},this.sortTable=new be(this.constructor.name,this.sortSettings),this.loadShareLinks(),this.activatedRoute.queryParams.subscribe(i=>this.focusOnSelect=i.select),this.layout.setBreadcrumbIcon(this.icons.faLink),this.layout.setBreadcrumbNav({url:`/${ke.LINKS}/${ge.SHARED_BY_LINKS}`,translating:!0,sameLink:!0})}ngOnInit(){this.galleryMode=this.btnNavigationView.currentView()}loadShareLinks(){this.loading=!0,this.onSelect(),this.linksService.shareLinksList().subscribe({next:i=>{this.sortBy(this.sortTable.sortParam.column,!1,i),this.loading=!1,this.focusOnSelect?this.focusOn(this.focusOnSelect):this.scrollView.scrollInto(-1)},error:i=>{this.shares=[],this.loading=!1,this.layout.sendNotification("error","Links",i.error.message)}})}sortBy(i,o=!0,n){this.shares=this.sortTable.sortBy(i,o,n||this.shares)}onSelect(i=null){this.selected=i,this.store.linkSelection.set(this.selected)}openLinkDialog(){this.linksService.shareLink(this.selected.id).subscribe(i=>{this.layout.openDialog(Te,"md",{initialState:{share:i}}).content.shareChange.pipe(U(1)).subscribe(n=>{let[p,g]=n;p==="update"?this.selected=Object.assign(this.selected,g):p==="delete"&&(this.onSelect(),this.sortBy(this.sortTable.sortParam.column,!1,this.shares.filter(E=>E.id!==g.id)))})})}onContextMenu(i){i.preventDefault(),i.stopPropagation(),this.layout.openContextMenu(i,this.mainContextMenu)}onTargetContextMenu(i,o){i.preventDefault(),i.type==="contextmenu"&&i.stopPropagation(),this.onSelect(o),this.layout.openContextMenu(i,this.targetContextMenu)}copyToClipboard(){this.selected&&(this.linksService.copyLinkToClipboard(this.selected.link.uuid),this.linkWasCopied=!0,this.layout.sendNotification("info","Link copied",this.selected.file.name||this.selected.name),setTimeout(()=>this.linkWasCopied=!1,3e3))}goTo(i){i=i||this.selected,this.sharesService.goTo(i).catch(console.error)}focusOn(i){let o=this.shares.find(n=>n.name===i);o&&(setTimeout(()=>this.scrollView.scrollInto(o),100),this.onSelect(o))}};a.\u0275fac=function(o){return new(o||a)},a.\u0275cmp=W({type:a,selectors:[["app-shared-links"]],viewQuery:function(o,n){if(o&1&&(L(O,5),L(N,7),L(Q,7),L(Me,7),L(Ee,7)),o&2){let p;S(p=V())&&(n.scrollView=p.first),S(p=V())&&(n.inputFilter=p.first),S(p=V())&&(n.btnNavigationView=p.first),S(p=V())&&(n.mainContextMenu=p.first),S(p=V())&&(n.targetContextMenu=p.first)}},decls:33,vars:36,consts:[["MainContextMenu",""],["TargetContextMenu",""],[1,"app-top-menu"],["container","body","type","button",1,"d-none","d-sm-block","btn","btn-sm","btn-secondary","me-1",3,"click","tooltip"],[3,"icon","animation"],["container","body","type","button",1,"btn","btn-sm","btn-secondary","me-1",3,"click","disabled","tooltip"],[3,"icon"],["container","body","type","button",3,"click","disabled","tooltip"],["container","body","type","button",1,"btn","btn-sm","btn-secondary",3,"click","disabled","tooltip"],[1,"ms-auto"],[1,"btn-group","btn-group-sm","me-1"],[1,"d-none","d-sm-block"],[3,"sortBy","switchView","sortParams","sortFields"],[1,"app-thumbs"],[1,"app-foot-menu"],[1,"mx-auto"],["contextMenuItem","",3,"execute"],["contextMenuItem","",3,"divider"],[3,"contextmenu","childHeight","childWidth","items","galleryMode","resizeOffset"],["tabindex","-1",1,"row","g-0"],[1,"card",3,"selected","disabled","height","width"],[1,"card",3,"click","contextmenu","pressup","tap"],[1,"card-body"],["alt","","draggable","true",3,"error","src","height","width"],[1,"label-top-right"],[1,"badge","rounded-pill","bg-warning",3,"font-size"],[1,"label-bottom-left"],[3,"share","galleryMode"],[1,"card-footer","text-center","text-truncate","p-1"],["draggable","false",1,"no-pointer-events"],[1,"badge","rounded-pill","bg-warning"],[1,"app-table"],[3,"contextmenu","bufferAmount","items"],["tabindex","-1"],[3,"selected","disabled"],["l10nTranslate","",3,"width","text-align-center","cursor-pointer","class"],["l10nTranslate","",3,"click"],[3,"icon","fixedWidth"],[3,"click","contextmenu","pressup","tap"],[3,"width","text-align-center","class"],[1,"d-flex","align-items-center"],[1,"d-flex","flex-column"],[3,"share"],["alt","","draggable","false","height","30","width","30",3,"error","src"],[1,"d-flex","flex-column","text-truncate"],["draggable","false",1,"no-pointer-events","text-muted","fs-xxxs"],[3,"class"],[1,"badge","rounded-pill","bg-success"],[1,"badge","rounded-pill","bg-gray-dark","ms-1"],[1,"ms-2"],["tooltipPlacement","auto",3,"permissions"],["l10nTranslate",""]],template:function(o,n){if(o&1){let p=b();s(0,"div",2)(1,"button",3),k(2,"translate"),C("click",function(){return d(p),m(n.loadShareLinks())}),f(3,"fa-icon",4),c(),s(4,"button",5),k(5,"translate"),C("click",function(){return d(p),m(n.openLinkDialog())}),f(6,"fa-icon",6),c(),s(7,"button",7),k(8,"translate"),C("click",function(){return d(p),m(n.copyToClipboard())}),f(9,"fa-icon",6),c(),s(10,"button",8),k(11,"translate"),C("click",function(){return d(p),m(n.goTo())}),f(12,"fa-icon",6),c(),s(13,"div",9)(14,"div",10),f(15,"app-input-filter",11),c(),s(16,"app-navigation-view",12),C("sortBy",function(E){return d(p),m(n.sortBy(E))})("switchView",function(E){return d(p),m(n.galleryMode=E)}),c()()(),x(17,Pe,6,8,"div",13)(18,it,12,8),s(19,"div",14)(20,"span",15),u(21),k(22,"translate"),c()(),s(23,"context-menu",null,0),T(25,nt,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.loadShareLinks())}),c(),s(26,"context-menu",null,1),T(28,ot,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.goTo())}),T(29,rt,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.openLinkDialog())}),T(30,at,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.copyToClipboard())}),T(31,lt,0,0,"ng-template",17)(32,st,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.layout.showRSideBarTab(n.TAB_MENU.SELECTION))}),c()}o&2&&(r(),_("tooltip",y(2,21,"Refresh",n.locale.language)),r(2),_("icon",n.icons.faArrowRotateRight)("animation",n.loading?"spin":null),r(),_("disabled",!n.selected)("tooltip",y(5,24,"Edit link",n.locale.language)),r(2),_("icon",n.icons.faPen),r(),M(R("btn btn-sm me-1 ",n.linkWasCopied?"btn-info":"btn-secondary")),_("disabled",!n.selected)("tooltip",y(8,27,"Copy link",n.locale.language)),r(2),_("icon",n.linkWasCopied?n.icons.faClipboardCheck:n.icons.faClipboard),r(),_("disabled",!n.selected)("tooltip",y(11,30,"Go to",n.locale.language)),r(2),_("icon",n.icons.faMapMarkerAlt),r(4),_("sortParams",n.sortTable.sortParam)("sortFields",n.btnSortFields),r(),h(n.galleryMode!=null&&n.galleryMode.enabled?17:18),r(4),B("",n.shares.length," ",y(22,33,"shares",n.locale.language)),r(10),_("divider",!0))},dependencies:[ue,me,de,j,J,Q,Z,X,N,O,we,Se,q,Y,ye],encapsulation:2});let t=a;return t})();export{Dt as LinksComponent};
1
+ import{a as Se}from"./chunk-ZFKCGL6X.js";import{a as Q}from"./chunk-O4AQBQBF.js";import"./chunk-MK7WZG3F.js";import{a as N,b as O,c as ye,d as be}from"./chunk-MWFRZBJD.js";import{b as we,c as ve,d as Te,e as Le}from"./chunk-4TEHM3AS.js";import"./chunk-ZTXJC5IC.js";import"./chunk-SRLMFJ7C.js";import"./chunk-FJFNDK67.js";import"./chunk-4KESSWTF.js";import{Gb as ge,Ib as ke,Ja as Ce,Xa as fe,kb as xe,pa as de,qa as me,ra as ue,v as X,w as Z,wb as he}from"./chunk-WL65GYD5.js";import"./chunk-ZZ3LHYOY.js";import{b as K}from"./chunk-XE5YHU5J.js";import{Cb as C,Eb as l,Ed as Y,Fd as J,Ga as D,Gc as q,Ib as L,If as se,Jb as S,Kb as V,L as U,Ma as r,Mb as F,Nb as P,Ob as M,Oe as oe,Pb as u,Qb as v,Rb as I,Sb as B,Ue as re,Uf as ce,Vf as pe,Wd as ee,Xa as W,Xb as R,Yb as H,Zc as j,Zf as _e,ab as T,ce as te,dc as k,fc as y,ha as w,ib as z,ie,jb as x,kb as h,ma as d,na as m,nb as A,ob as $,of as ae,pb as _,qb as s,rb as c,sb as f,te as ne,tf as le,yd as G,zb as b}from"./chunk-RSNLYAN6.js";import"./chunk-RTRJ3KFH.js";var Me=["MainContextMenu"],Ee=["TargetContextMenu"],Ve=(t,a)=>a.id,Fe=(t,a)=>a.key;function Ae(t,a){if(t&1&&(s(0,"span",30),u(1),c()),t&2){let e=l().$implicit,i=l(2);F("font-size",i.galleryMode.textSize,"px"),r(),I(" ",e.hTimeAccessAgo," ")}}function $e(t,a){if(t&1){let e=b();s(0,"div",21),C("click",function(){let o=d(e).$implicit,n=l(2);return m(n.onSelect(o))})("contextmenu",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("pressup",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("tap",function(){d(e);let o=l(2);return m(o.openLinkDialog())}),s(1,"div",22)(2,"img",23),C("error",function(){let o=d(e).$implicit;return m(o.fallBackMimeUrl())}),c(),s(3,"span",24),x(4,Ae,2,3,"span",25),c(),s(5,"span",26),f(6,"app-share-repository",27),c()(),s(7,"div",28)(8,"span",29),u(9),c()()()}if(t&2){let e=a.$implicit,i=a.$index,o=l(2);F("height",o.galleryMode.dimensions,"px")("width",o.galleryMode.dimensions,"px"),P("selected",e.id===(o.selected==null?null:o.selected.id))("disabled",!e.link.isActive),r(),z("rowIndex",i),r(),_("src",e.mimeUrl,D)("height",o.galleryMode.image)("width",o.galleryMode.image),r(2),h(e.newly?4:-1),r(2),_("share",e)("galleryMode",o.galleryMode),r(2),F("font-size",o.galleryMode.textSize,"px"),r(),v(e.name)}}function Pe(t,a){if(t&1){let e=b();s(0,"div",13)(1,"app-virtual-scroll",18),k(2,"searchFilter"),C("contextmenu",function(o){d(e);let n=l();return m(n.onContextMenu(o))}),s(3,"div",19),A(4,$e,10,18,"div",20,Ve),c()()()}if(t&2){let e=l();r(),_("childHeight",e.galleryMode.dimensions)("childWidth",e.galleryMode.dimensions)("items",y(2,5,e.shares,e.inputFilter.search()))("galleryMode",!0)("resizeOffset",110),r(3),$(e.scrollView==null?null:e.scrollView.viewPortItems)}}function Ie(t,a){if(t&1&&f(0,"fa-icon",37),t&2){let e=l(4);_("icon",e.sortTable.sortParam.asc?e.icons.faArrowDown:e.icons.faArrowUp)("fixedWidth",!1)}}function Be(t,a){if(t&1){let e=b();s(0,"th",36),C("click",function(){d(e);let o=l().$implicit,n=l(2);return m(n.sortBy(o.key))}),u(1),x(2,Ie,1,2,"fa-icon",37),c()}if(t&2){let e=l().$implicit,i=l(2);M(e.value.class),F("width",e.value.width,"%"),P("text-align-center",e.value.textCenter)("cursor-pointer",e.value.sortable),r(),I(" ",e.value.label," "),r(),h(i.sortTable.sortParam.column===e.key?2:-1)}}function Re(t,a){if(t&1&&x(0,Be,3,10,"th",35),t&2){let e=a.$implicit;h(e.value.show?0:-1)}}function De(t,a){if(t&1){let e=b();s(0,"div",40)(1,"img",43),C("error",function(){d(e);let o=l(3).$implicit;return m(o.fallBackMimeUrl())}),c(),s(2,"div",44)(3,"span",29),u(4),c(),s(5,"span",45),u(6),c()()()}if(t&2){let e=l(3).$implicit;r(),_("src",e.mimeUrl,D),r(3),v(e.name),r(2),v(e.description)}}function Ne(t,a){if(t&1&&(s(0,"span"),u(1),c()),t&2){let e=l(4).$implicit;r(),v(e.link.email||"")}}function Oe(t,a){if(t&1&&(s(0,"span",41)(1,"span"),u(2),c(),x(3,Ne,2,1,"span"),c()),t&2){let e=l(3).$implicit;r(2),v(e.link.name),r(),h(e.link.email?3:-1)}}function Qe(t,a){if(t&1&&f(0,"app-share-repository",42),t&2){let e=l(3).$implicit;_("share",e)}}function Ue(t,a){if(t&1&&(s(0,"span"),u(1),c()),t&2){let e=l(4).$implicit;M(R("badge rounded-pill ",e.link.nbAccess>=e.link.limitAccess?"bg-danger":"bg-success")),r(),B(" ",e.link.nbAccess,"/",e.link.limitAccess," ")}}function We(t,a){if(t&1&&(s(0,"span",47),u(1),c()),t&2){let e=l(4).$implicit;r(),v(e.link.nbAccess)}}function ze(t,a){if(t&1&&(s(0,"span",49),u(1),k(2,"translate"),c()),t&2){let e=l(5).$implicit,i=l(2);r(),B("",e.hTimeExpirationAgo,"\xA0",y(2,2,e.hTimeExpirationAgo===1?"day":"days",i.locale.language))}}function He(t,a){if(t&1&&(s(0,"span"),f(1,"fa-icon",37),x(2,ze,3,5,"span",49),c()),t&2){let e=l(4).$implicit,i=l(2);M(R("badge rounded-pill bg-",e.hTimeExpirationAgo>=1?"warning":"danger"," ms-1")),r(),_("icon",i.icons.faClock)("fixedWidth",!1),r(),h(e.hTimeExpirationAgo>=1?2:-1)}}function qe(t,a){if(t&1&&(s(0,"span",48),f(1,"fa-icon",6),c()),t&2){let e=l(6);r(),_("icon",e.icons.faLock)}}function Ke(t,a){if(t&1&&(x(0,Ue,2,5,"span",46)(1,We,2,1,"span",47),x(2,He,3,6,"span",46),x(3,qe,2,1,"span",48)),t&2){let e=l(3).$implicit;h(e.link.limitAccess?0:1),r(2),h(e.link.expiresAt?2:-1),r(),h(e.link.requireAuth?3:-1)}}function je(t,a){if(t&1&&f(0,"app-file-permissions",50),t&2){let e=l(4).$implicit;_("permissions",e.hPerms)}}function Ge(t,a){if(t&1&&x(0,je,1,1,"app-file-permissions",50),t&2){let e=l(3).$implicit;h(e.link.permissions?0:-1)}}function Ye(t,a){if(t&1&&u(0),t&2){let e=l(4).$implicit;I(" ",e.hTimeAccessAgo," ")}}function Je(t,a){t&1&&(s(0,"span",51),u(1,"never"),c())}function Xe(t,a){if(t&1&&x(0,Ye,1,1)(1,Je,2,0,"span",51),t&2){let e=l(3).$implicit;h(e.link.currentAccess?0:1)}}function Ze(t,a){if(t&1&&(s(0,"td"),x(1,De,7,3,"div",40)(2,Oe,4,2,"span",41)(3,Qe,1,1,"app-share-repository",42)(4,Ke,4,3)(5,Ge,1,1)(6,Xe,2,1),c()),t&2){let e,i=l().$implicit,o=l().$implicit;M(H("",i.value.class," ",i.value.newly!==void 0?"props-newly-"+o[i.value.newly]:"")),F("width",i.value.width,"%"),P("text-align-center",i.value.textCenter),r(),h((e=i.key)==="name"?1:e==="link"?2:e==="from"?3:e==="infos"?4:e==="permissions"?5:e==="accessed"?6:-1)}}function et(t,a){if(t&1&&x(0,Ze,7,9,"td",39),t&2){let e=a.$implicit;h(e.value.show?0:-1)}}function tt(t,a){if(t&1){let e=b();s(0,"tr",38),C("click",function(){let o=d(e).$implicit,n=l(2);return m(n.onSelect(o))})("contextmenu",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("pressup",function(o){let n=d(e).$implicit,p=l(2);return m(p.onTargetContextMenu(o,n))})("tap",function(){d(e);let o=l(2);return m(o.openLinkDialog())}),A(1,et,1,1,null,null,Fe),k(3,"keyvalue"),c()}if(t&2){let e=a.$implicit,i=l(2);P("selected",e.id===(i.selected==null?null:i.selected.id))("disabled",!e.link.isActive),r(),$(y(3,4,i.tableHeaders,i.originalOrderKeyValue))}}function it(t,a){if(t&1){let e=b();s(0,"table",31)(1,"thead")(2,"tr"),A(3,Re,1,1,null,null,Fe),k(5,"keyvalue"),c()()(),s(6,"app-virtual-scroll",32),k(7,"searchFilter"),C("contextmenu",function(o){d(e);let n=l();return m(n.onContextMenu(o))}),s(8,"table",31)(9,"tbody",33),A(10,tt,4,7,"tr",34,Ve),c()()()}if(t&2){let e=l();r(3),$(y(5,2,e.tableHeaders,e.originalOrderKeyValue)),r(3),_("bufferAmount",5)("items",y(7,5,e.shares,e.inputFilter.search())),r(4),$(e.scrollView==null?null:e.scrollView.viewPortItems)}}function nt(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Refresh"),c()),t&2){let e=l();r(),_("icon",e.icons.faArrowRotateRight)}}function ot(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Go to"),c()),t&2){let e=l();r(),_("icon",e.icons.faMapMarkerAlt)}}function rt(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Edit link"),c()),t&2){let e=l();r(),_("icon",e.icons.faPen)}}function at(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Copy link"),c()),t&2){let e=l();r(),_("icon",e.icons.faClipboard)}}function lt(t,a){}function st(t,a){if(t&1&&(s(0,"span",51),f(1,"fa-icon",6),u(2,"Informations"),c()),t&2){let e=l();r(),_("icon",e.icons.faCircleInfo)}}var Dt=(()=>{let a=class a{constructor(){this.locale=w(G),this.layout=w(he),this.icons={faLink:oe,faArrowRotateRight:se,faArrowDown:ce,faArrowUp:re,faMapMarkerAlt:pe,faPen:ae,faEllipsisH:ee,faClock:ie,faLock:le,faClipboard:ne,faClipboardCheck:te,faCircleInfo:_e},this.originalOrderKeyValue=fe,this.TAB_MENU=Ce,this.loading=!1,this.linkWasCopied=!1,this.shares=[],this.selected=null,this.tableHeaders={name:{label:"Name",width:30,textCenter:!1,class:"",show:!0,sortable:!0},link:{label:"Link",width:15,textCenter:!1,class:"d-none d-sm-table-cell",show:!0,sortable:!0},from:{label:"Shared from",width:15,textCenter:!1,class:"d-none d-md-table-cell",show:!0},infos:{label:"Infos",width:15,textCenter:!0,class:"d-none d-lg-table-cell",show:!0,sortable:!0},permissions:{label:"Permissions",width:10,textCenter:!0,class:"d-none d-lg-table-cell",show:!0,sortable:!0},accessed:{label:"Accessed",width:10,textCenter:!0,class:"d-none d-lg-table-cell",newly:"newly",show:!0,sortable:!0}},this.btnSortFields={name:"Name",link:"Link",accessed:"Accessed"},this.activatedRoute=w(K),this.store=w(xe),this.linksService=w(Le),this.sharesService=w(ve),this.sortSettings={default:[{prop:"name",type:"string"}],link:[{prop:"link.name",type:"string"}],name:[{prop:"name",type:"string"}],infos:[{prop:"link.nbAccess",type:"number"}],permissions:[{prop:"link.permissions",type:"length"}],accessed:[{prop:"link.currentAccess",type:"date"}]},this.sortTable=new be(this.constructor.name,this.sortSettings),this.loadShareLinks(),this.activatedRoute.queryParams.subscribe(i=>this.focusOnSelect=i.select),this.layout.setBreadcrumbIcon(this.icons.faLink),this.layout.setBreadcrumbNav({url:`/${ke.LINKS}/${ge.SHARED_BY_LINKS}`,translating:!0,sameLink:!0})}ngOnInit(){this.galleryMode=this.btnNavigationView.currentView()}loadShareLinks(){this.loading=!0,this.onSelect(),this.linksService.shareLinksList().subscribe({next:i=>{this.sortBy(this.sortTable.sortParam.column,!1,i),this.loading=!1,this.focusOnSelect?this.focusOn(this.focusOnSelect):this.scrollView.scrollInto(-1)},error:i=>{this.shares=[],this.loading=!1,this.layout.sendNotification("error","Links",i.error.message)}})}sortBy(i,o=!0,n){this.shares=this.sortTable.sortBy(i,o,n||this.shares)}onSelect(i=null){this.selected=i,this.store.linkSelection.set(this.selected)}openLinkDialog(){this.linksService.shareLink(this.selected.id).subscribe(i=>{this.layout.openDialog(Te,"md",{initialState:{share:i}}).content.shareChange.pipe(U(1)).subscribe(n=>{let[p,g]=n;p==="update"?this.selected=Object.assign(this.selected,g):p==="delete"&&(this.onSelect(),this.sortBy(this.sortTable.sortParam.column,!1,this.shares.filter(E=>E.id!==g.id)))})})}onContextMenu(i){i.preventDefault(),i.stopPropagation(),this.layout.openContextMenu(i,this.mainContextMenu)}onTargetContextMenu(i,o){i.preventDefault(),i.type==="contextmenu"&&i.stopPropagation(),this.onSelect(o),this.layout.openContextMenu(i,this.targetContextMenu)}copyToClipboard(){this.selected&&(this.linksService.copyLinkToClipboard(this.selected.link.uuid),this.linkWasCopied=!0,this.layout.sendNotification("info","Link copied",this.selected.file.name||this.selected.name),setTimeout(()=>this.linkWasCopied=!1,3e3))}goTo(i){i=i||this.selected,this.sharesService.goTo(i).catch(console.error)}focusOn(i){let o=this.shares.find(n=>n.name===i);o&&(setTimeout(()=>this.scrollView.scrollInto(o),100),this.onSelect(o))}};a.\u0275fac=function(o){return new(o||a)},a.\u0275cmp=W({type:a,selectors:[["app-shared-links"]],viewQuery:function(o,n){if(o&1&&(L(O,5),L(N,7),L(Q,7),L(Me,7),L(Ee,7)),o&2){let p;S(p=V())&&(n.scrollView=p.first),S(p=V())&&(n.inputFilter=p.first),S(p=V())&&(n.btnNavigationView=p.first),S(p=V())&&(n.mainContextMenu=p.first),S(p=V())&&(n.targetContextMenu=p.first)}},decls:33,vars:36,consts:[["MainContextMenu",""],["TargetContextMenu",""],[1,"app-top-menu"],["container","body","type","button",1,"d-none","d-sm-block","btn","btn-sm","btn-secondary","me-1",3,"click","tooltip"],[3,"icon","animation"],["container","body","type","button",1,"btn","btn-sm","btn-secondary","me-1",3,"click","disabled","tooltip"],[3,"icon"],["container","body","type","button",3,"click","disabled","tooltip"],["container","body","type","button",1,"btn","btn-sm","btn-secondary",3,"click","disabled","tooltip"],[1,"ms-auto"],[1,"btn-group","btn-group-sm","me-1"],[1,"d-none","d-sm-block"],[3,"sortBy","switchView","sortParams","sortFields"],[1,"app-thumbs"],[1,"app-foot-menu"],[1,"mx-auto"],["contextMenuItem","",3,"execute"],["contextMenuItem","",3,"divider"],[3,"contextmenu","childHeight","childWidth","items","galleryMode","resizeOffset"],["tabindex","-1",1,"row","g-0"],[1,"card",3,"selected","disabled","height","width"],[1,"card",3,"click","contextmenu","pressup","tap"],[1,"card-body"],["alt","","draggable","true",3,"error","src","height","width"],[1,"label-top-right"],[1,"badge","rounded-pill","bg-warning",3,"font-size"],[1,"label-bottom-left"],[3,"share","galleryMode"],[1,"card-footer","text-center","text-truncate","p-1"],["draggable","false",1,"no-pointer-events"],[1,"badge","rounded-pill","bg-warning"],[1,"app-table"],[3,"contextmenu","bufferAmount","items"],["tabindex","-1"],[3,"selected","disabled"],["l10nTranslate","",3,"width","text-align-center","cursor-pointer","class"],["l10nTranslate","",3,"click"],[3,"icon","fixedWidth"],[3,"click","contextmenu","pressup","tap"],[3,"width","text-align-center","class"],[1,"d-flex","align-items-center"],[1,"d-flex","flex-column"],[3,"share"],["alt","","draggable","false","height","30","width","30",3,"error","src"],[1,"d-flex","flex-column","text-truncate"],["draggable","false",1,"no-pointer-events","text-muted","fs-xxxs"],[3,"class"],[1,"badge","rounded-pill","bg-success"],[1,"badge","rounded-pill","bg-gray-dark","ms-1"],[1,"ms-2"],["tooltipPlacement","auto",3,"permissions"],["l10nTranslate",""]],template:function(o,n){if(o&1){let p=b();s(0,"div",2)(1,"button",3),k(2,"translate"),C("click",function(){return d(p),m(n.loadShareLinks())}),f(3,"fa-icon",4),c(),s(4,"button",5),k(5,"translate"),C("click",function(){return d(p),m(n.openLinkDialog())}),f(6,"fa-icon",6),c(),s(7,"button",7),k(8,"translate"),C("click",function(){return d(p),m(n.copyToClipboard())}),f(9,"fa-icon",6),c(),s(10,"button",8),k(11,"translate"),C("click",function(){return d(p),m(n.goTo())}),f(12,"fa-icon",6),c(),s(13,"div",9)(14,"div",10),f(15,"app-input-filter",11),c(),s(16,"app-navigation-view",12),C("sortBy",function(E){return d(p),m(n.sortBy(E))})("switchView",function(E){return d(p),m(n.galleryMode=E)}),c()()(),x(17,Pe,6,8,"div",13)(18,it,12,8),s(19,"div",14)(20,"span",15),u(21),k(22,"translate"),c()(),s(23,"context-menu",null,0),T(25,nt,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.loadShareLinks())}),c(),s(26,"context-menu",null,1),T(28,ot,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.goTo())}),T(29,rt,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.openLinkDialog())}),T(30,at,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.copyToClipboard())}),T(31,lt,0,0,"ng-template",17)(32,st,3,1,"ng-template",16),C("execute",function(){return d(p),m(n.layout.showRSideBarTab(n.TAB_MENU.SELECTION))}),c()}o&2&&(r(),_("tooltip",y(2,21,"Refresh",n.locale.language)),r(2),_("icon",n.icons.faArrowRotateRight)("animation",n.loading?"spin":null),r(),_("disabled",!n.selected)("tooltip",y(5,24,"Edit link",n.locale.language)),r(2),_("icon",n.icons.faPen),r(),M(R("btn btn-sm me-1 ",n.linkWasCopied?"btn-info":"btn-secondary")),_("disabled",!n.selected)("tooltip",y(8,27,"Copy link",n.locale.language)),r(2),_("icon",n.linkWasCopied?n.icons.faClipboardCheck:n.icons.faClipboard),r(),_("disabled",!n.selected)("tooltip",y(11,30,"Go to",n.locale.language)),r(2),_("icon",n.icons.faMapMarkerAlt),r(4),_("sortParams",n.sortTable.sortParam)("sortFields",n.btnSortFields),r(),h(n.galleryMode!=null&&n.galleryMode.enabled?17:18),r(4),B("",n.shares.length," ",y(22,33,"shares",n.locale.language)),r(10),_("divider",!0))},dependencies:[ue,me,de,j,J,Q,Z,X,N,O,we,Se,q,Y,ye],encapsulation:2});let t=a;return t})();export{Dt as LinksComponent};
@@ -0,0 +1,7 @@
1
+ import{f as _e,g as Ce}from"./chunk-BW5PQAKK.js";import{f as ge}from"./chunk-4KESSWTF.js";import{Lb as fe,Qb as z,ua as me,wb as he}from"./chunk-WL65GYD5.js";import{$b as Z,Cb as h,Dc as Y,Eb as c,Fa as E,Fd as ae,J as L,Jd as le,Lb as D,Ma as r,N as R,Nb as y,Ob as J,Pb as m,Qb as k,Re as pe,Tb as F,Ub as V,Vb as G,Xa as M,Xb as K,Xc as ee,Za as U,Zb as X,Zc as P,_c as te,ab as w,ac as $,ad as ie,ba as I,bb as x,bf as de,dc as A,ed as ne,fc as H,ha as O,hc as j,jb as f,jd as oe,kb as g,lb as q,ma as C,na as v,nb as B,ob as Q,of as ue,pb as d,pe as ce,qb as l,rb as a,sb as _,wd as se,xd as re,ya as W,yb as T,zb as b}from"./chunk-RSNLYAN6.js";var be=(function(i){return i[i.USER=0]="USER",i[i.PERSONAL=1]="PERSONAL",i})(be||{}),ye=(function(i){return i[i.VISIBLE=0]="VISIBLE",i[i.PRIVATE=1]="PRIVATE",i[i.ISOLATED=2]="ISOLATED",i})(ye||{});function ke(i,n){if(i&1&&(l(0,"span"),m(1),a()),i&2){let s=c();r(),k(s.group.name)}}function Se(i,n){i&1&&(l(0,"span",3),m(1,"New personal group"),a())}function Me(i,n){if(i&1&&_(0,"fa-icon",4),i&2){let s=c();d("icon",s.icons.faSpinner)}}function we(i,n){i&1&&(l(0,"span",3),m(1,"Edit personal group"),a())}function Pe(i,n){i&1&&(l(0,"span",3),m(1,"Edit group"),a())}function Ee(i,n){if(i&1&&(l(0,"h4",5),f(1,we,2,0,"span",3)(2,Pe,2,0,"span",3),a()),i&2){let s=c();r(),g(s.isPersonalGroup?1:2)}}var st=(()=>{let n=class n{constructor(){this.groupChange=new x,this.layout=O(he),this.icons={GROUPS:me.GROUPS,faSpinner:de,faCog:pe,faUsers:ce,faPen:ue},this.isPersonalGroup=!0,this.submitted=!1,this.loading=!1,this.userService=O(ge),this.user=this.userService.user}ngOnInit(){this.originalGroup?.id?(this.isPersonalGroup=this.originalGroup.isPersonalGroup,this.group=new z({id:this.originalGroup.id,name:this.originalGroup.name,description:this.originalGroup.description,createdAt:this.originalGroup.createdAt,modifiedAt:this.originalGroup.modifiedAt,type:this.originalGroup.type})):this.group=new z({id:0,name:"",description:"",createdAt:null,modifiedAt:null,type:fe.PGROUP})}onCancel(){this.layout.closeDialog()}onSubmit(){if(this.loading=!0,this.submitted=!0,this.group.id===0)this.userService.createPersonalGroup(this.makeDto(!0)).subscribe({next:e=>{this.loading=!1,this.groupChange.emit(["add",e]),this.layout.sendNotification("success","Group created",e.name),this.layout.closeDialog()},error:e=>this.onError(e)});else{let e=this.makeDto();if(!Object.keys(e).length){this.loading=!1,this.submitted=!1;return}this.userService.updatePersonalGroup(this.originalGroup.id,this.makeDto()).subscribe({next:t=>{this.loading=!1,this.groupChange.emit(["update",t]),this.layout.sendNotification("success","Group updated",t.name),this.layout.closeDialog()},error:t=>this.onError(t)})}}makeDto(e=!1){return{name:e?this.group.name:this.group.name!==this.originalGroup.name?this.group.name:void 0,description:e?this.group.description:this.group.description!==this.originalGroup.description?this.group.description:void 0}}onError(e){this.layout.sendNotification("error","Group error",this.group.name,e),this.submitted=!1,this.loading=!1}};n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=M({type:n,selectors:[["app-user-group-dialog"]],inputs:{originalGroup:"originalGroup"},outputs:{groupChange:"groupChange"},decls:23,vars:15,consts:[[1,"modal-header","align-items-center"],[1,"modal-title"],[1,"me-2",3,"icon"],["l10nTranslate",""],["animation","spin","size","sm",1,"ms-2",3,"icon"],[1,"modal-title","ms-auto"],["aria-label","Close","type","button",3,"click"],[1,"modal-body"],[1,"d-flex","col-12","pb-3"],[1,"flex-fill","col-6","pe-4"],["for","name","l10nTranslate",""],["id","name","appAutofocus","","autocomplete","off","type","text",1,"form-control","form-control-sm",3,"ngModelChange","disabled","autoSelect","ngModel"],[1,"flex-fill","col-6","ps-4"],["for","description","l10nTranslate",""],["id","description","autocomplete","off","type","text",1,"form-control","form-control-sm",3,"ngModelChange","ngModel","disabled"],[1,"modal-footer"],["data-dismiss","modal","type","button","l10nTranslate","",1,"btn","btn-sm","btn-secondary","ms-auto",3,"click"],["type","button","l10nTranslate","",1,"btn","btn-sm","btn-primary",3,"click","disabled"]],template:function(t,o){t&1&&(l(0,"div",0)(1,"h4",1),_(2,"fa-icon",2),f(3,ke,2,1,"span")(4,Se,2,0,"span",3),f(5,Me,1,1,"fa-icon",4),a(),f(6,Ee,3,1,"h4",5),l(7,"button",6),h("click",function(){return o.layout.closeDialog()}),a()(),l(8,"div",7)(9,"div",8)(10,"div",9)(11,"label",10),m(12,"Name"),a(),l(13,"input",11),G("ngModelChange",function(u){return V(o.group.name,u)||(o.group.name=u),u}),a()(),l(14,"div",12)(15,"label",13),m(16,"Description"),a(),l(17,"input",14),G("ngModelChange",function(u){return V(o.group.description,u)||(o.group.description=u),u}),a()()()(),l(18,"div",15)(19,"button",16),h("click",function(){return o.onCancel()}),m(20,"Cancel"),a(),l(21,"button",17),h("click",function(){return o.onSubmit()}),m(22," Confirm "),a()()),t&2&&(r(2),d("icon",o.icons.GROUPS),r(),g(o.group.id?3:4),r(2),g(o.loading?5:-1),r(),g(o.group.id?6:-1),r(),J(K("btn-close btn-close-white ",o.group.id?"ms-2":"ms-auto"," ms-2")),r(6),y("is-invalid",!o.group.name),d("disabled",!o.isPersonalGroup)("autoSelect",!1),F("ngModel",o.group.name),r(4),F("ngModel",o.group.description),d("disabled",!o.isPersonalGroup),r(4),d("disabled",!o.group.name||o.submitted))},dependencies:[re,ie,ne,se,oe,P,ae,_e],encapsulation:2});let i=n;return i})();var xe=(()=>{let n=class n{onClick(e){e.stopPropagation()}ngOnInit(){setTimeout(()=>{typeof document<"u"&&document.addEventListener("click",this.offClickHandler)},0)}ngOnDestroy(){typeof document<"u"&&document.removeEventListener("click",this.offClickHandler)}};n.\u0275fac=function(t){return new(t||n)},n.\u0275dir=U({type:n,selectors:[["","offClick",""]],hostBindings:function(t,o){t&1&&h("click",function(u){return o.onClick(u)})},inputs:{offClickHandler:[0,"offClick","offClickHandler"]}});let i=n;return i})();var S=class{constructor(n){typeof n=="string"&&(this.id=this.name=n,this.description=""),typeof n=="object"&&(this.id=n.id||n.name,this.name=n.name,this.description=n.description||"")}};var Te=i=>({active:i}),De=(i,n)=>({o:i,i:n});function Fe(i,n){if(i&1){let s=b();l(0,"input",6),h("keydown",function(t){C(s);let o=c();return v(o.inputEvent(t))})("keyup",function(t){C(s);let o=c();return v(o.inputEvent(t,!0))}),a()}if(i&2){let s=c();d("disabled",s.disabled)}}function Ve(i,n){i&1&&T(0)}function Ge(i,n){if(i&1&&(l(0,"span",12),w(1,Ve,1,0,"ng-container",13),a()),i&2){let s=c(2),e=D(6);y("ui-select-allow-clear",s.allowClear&&s.active),r(),d("ngTemplateOutlet",s.customTemplateSelect||e)("ngTemplateOutletContext",Z(4,Te,s.active))}}function Ae(i,n){if(i&1&&(l(0,"span",9),m(1),a()),i&2){let s=c(2);r(),k(s.placeholder)}}function He(i,n){if(i&1){let s=b();l(0,"button",14),h("click",function(t){C(s);let o=c(2);return v(o.removeClick(o.active,t))}),a()}}function je(i,n){if(i&1){let s=b();l(0,"div",4)(1,"span",7),h("click",function(t){C(s);let o=c();return v(o.matchClick(t))}),f(2,Ge,2,6,"span",8)(3,Ae,2,1,"span",9),f(4,He,1,0,"button",10),_(5,"i",11),a()()}if(i&2){let s=c();r(2),g(s.active?2:3),r(2),g(s.allowClear&&s.active?4:-1)}}function ze(i,n){i&1&&T(0)}function Ne(i,n){if(i&1){let s=b();l(0,"li",15)(1,"div",16),h("click",function(t){let o=C(s).$implicit,p=c(2);return v(p.selectMatch(o,t))})("mouseenter",function(){let t=C(s).$implicit,o=c(2);return v(o.selectActive(t))}),w(2,ze,1,0,"ng-container",13),a()()}if(i&2){let s=n.$implicit,e=c(2),t=D(8);r(),y("active",e.isActive(s)),r(),d("ngTemplateOutlet",e.customTemplateOptions||t)("ngTemplateOutletContext",$(4,De,s,e.inputValue))}}function Le(i,n){if(i&1&&(l(0,"ul",5),B(1,Ne,3,7,"li",15,q),a()),i&2){let s=c();r(),Q(s.options)}}function Re(i,n){if(i&1&&(l(0,"div",17)(1,"span",18),_(2,"fa-icon",19),a(),l(3,"span"),m(4),a(),l(5,"div",20),m(6),a()()),i&2){let s=n.active,e=c();r(2),d("icon",e.itemIcon)("fixedWidth",!1),r(2),k(s.name),r(2),k(s.description)}}function Ie(i,n){if(i&1&&(l(0,"a",21)(1,"div",17)(2,"span",18),_(3,"fa-icon",19),a(),_(4,"span",22),A(5,"highlight"),_(6,"span",23),A(7,"highlight"),a()()),i&2){let s=n.i,e=n.o,t=c();r(3),d("icon",t.itemIcon)("fixedWidth",!1),r(),d("innerHtml",t.sanitize(H(5,4,e.name,s)),E),r(2),d("innerHtml",t.sanitize(H(7,7,e.description,s)),E)}}var bt=(()=>{let n=class n{constructor(){this.element=O(W),this.itemIcon=le,this.allowClear=!0,this.placeholder="",this.idField="id",this.nameField="name",this.descriptionField="description",this.data=new x,this.selected=new x,this.removed=new x,this.typed=new x,this.opened=new x,this.options=[],this.itemObjects=[],this.inputMode=!1,this.inputValue="",this.onChange=Function.prototype,this.onTouched=Function.prototype,this.sanitizer=O(ee),this._items=[],this._optionsOpened=!1,this._disabled=!1,this._active=null,this.clickedOutside=this.clickedOutside.bind(this)}set items(e){if(!e.length){this._items=this.itemObjects=[],this.itemObjects=[];return}this._items=e.filter(t=>{if(typeof t=="string"||typeof t=="object"&&t&&t[this.nameField]&&t[this.idField])return t}),this.itemObjects=this._items.map(t=>typeof t=="string"?new S(t):new S({id:t[this.idField],name:t[this.nameField],description:t[this.descriptionField]}))}get optionsOpened(){return this._optionsOpened}set optionsOpened(e){this._optionsOpened=e,this.opened.emit(e)}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this._disabled===!0&&this.hideOptions()}get active(){return this._active}set active(e){e?this._active=typeof e=="string"?e:new S({id:e[this.idField],name:e[this.nameField],description:e[this.descriptionField]}):this._active=null}sanitize(e){return this.sanitizer.bypassSecurityTrustHtml(e)}inputEvent(e,t=!1){if(e.keyCode===9)return;if(t&&(e.keyCode===37||e.keyCode===39||e.keyCode===38||e.keyCode===40||e.keyCode===13)){e.preventDefault();return}if(!t&&e.keyCode===8){let p=this.element.nativeElement.querySelector("div.ui-select-container > input");(!p.value||p.value.length<=0)&&(this.active&&this.remove(this.active),e.preventDefault())}if(!t&&e.keyCode===27){this.hideOptions(),e.preventDefault();return}if(!t&&e.keyCode===46&&(this.active&&this.remove(this.active),e.preventDefault()),!t&&e.keyCode===37&&this._items.length>0){this.behavior.first(),e.preventDefault();return}if(!t&&e.keyCode===39&&this._items.length>0){this.behavior.last(),e.preventDefault();return}if(!t&&e.keyCode===38){this.behavior.prev(),e.preventDefault();return}if(!t&&e.keyCode===40){this.behavior.next(),e.preventDefault();return}if(!t&&e.keyCode===13){(!this.active||this.active.id!==this.activeOption.id)&&(this.selectActiveMatch(),this.behavior.next()),e.preventDefault();return}let o=e.target||e.srcElement;o?(this.inputValue=o.value,this.doEvent("typed",this.inputValue||" ")):this.open()}ngOnInit(){this.subscription=this.typed.asObservable().pipe(L(200),R()).subscribe(e=>this.doSearch(e)),this.behavior=new N(this),this.doEvent("typed"," ")}ngOnDestroy(){this.subscription.unsubscribe()}remove(e){this._disabled!==!0&&(this.active=null,this.data.next(this.active),this.doEvent("removed",e),this.inputValue="",this.doEvent("typed"," "))}doEvent(e,t){this[e]&&t&&this[e].next(t),this.onTouched(),(e==="selected"||e==="removed")&&this.onChange(this.active)}clickedOutside(){this.inputMode=!1,this.optionsOpened=!1}writeValue(e){this.active=e,this.data.emit(this.active)}registerOnChange(e){this.onChange=e}registerOnTouched(e){this.onTouched=e}matchClick(e){this._disabled!==!0&&(this.inputMode=!this.inputMode,this.inputMode===!0&&(this.focusToInput(),this.open()))}mainClick(e){if(this.inputMode===!0||this._disabled===!0)return;if(e.keyCode===46){e.preventDefault(),this.inputEvent(e);return}if(e.keyCode===8){e.preventDefault(),this.inputEvent(e,!0);return}if(e.keyCode===9||e.keyCode===13||e.keyCode===27||e.keyCode>=37&&e.keyCode<=40){e.preventDefault();return}this.inputMode=!0;let t=String.fromCharCode(96<=e.keyCode&&e.keyCode<=105?e.keyCode-48:e.keyCode).toLowerCase();this.focusToInput(t),this.open();let o=e.target||e.srcElement;o.value=t,this.inputEvent(e)}selectActive(e){this.activeOption=e}isActive(e){return this.activeOption.id===e.id}removeClick(e,t){t.stopPropagation(),this.remove(e)}focusToInput(e=""){setTimeout(()=>{let t=this.element.nativeElement.querySelector("div.ui-select-container > input");t&&(t.focus(),t.value=e)},0)}selectMatch(e,t=void 0){t&&(t.stopPropagation(),t.preventDefault()),!(this.options.length<=0)&&(this.active=e,this.data.next(this.active),this.doEvent("selected",e),this.hideOptions(),this.focusToInput(e.name),this.element.nativeElement.querySelector(".ui-select-container").focus())}doSearch(e){this.searchFunction(e).subscribe({next:t=>{this.items=t},error:t=>{console.error(t),this.items=[]},complete:()=>this.behavior.filter()})}open(){this.options=this.itemObjects,this.options.length>0&&this.behavior.first(),this.optionsOpened=!0}hideOptions(){this.inputMode=!1,this.optionsOpened=!1}selectActiveMatch(){this.selectMatch(this.activeOption)}};n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=M({type:n,selectors:[["app-select"]],inputs:{searchFunction:"searchFunction",customTemplateOptions:"customTemplateOptions",customTemplateSelect:"customTemplateSelect",itemIcon:"itemIcon",allowClear:"allowClear",placeholder:"placeholder",idField:"idField",nameField:"nameField",descriptionField:"descriptionField",disabled:"disabled",active:"active"},outputs:{data:"data",selected:"selected",removed:"removed",typed:"typed",opened:"opened"},features:[X([{provide:te,useExisting:I(()=>n),multi:!0}])],decls:9,vars:5,consts:[["DefaultSelect",""],["DefaultOptions",""],[1,"ui-select-container","dropdown","open",3,"keyup","offClick"],["autocomplete","false","tabindex","-1","type","text",1,"form-control","form-control-sm","ui-select-search",3,"disabled"],[1,"ui-select-match","form-control","form-control-sm"],["role","menu",1,"ui-select-choices","dropdown-menu"],["autocomplete","false","tabindex","-1","type","text",1,"form-control","form-control-sm","ui-select-search",3,"keydown","keyup","disabled"],["tabindex","-1",1,"ui-select-toggle","no-select",2,"outline","0",3,"click"],[1,"ui-select-match-text","w-100",3,"ui-select-allow-clear"],[1,"ui-select-placeholder"],["aria-label","close","type","button",1,"btn-close"],[1,"dropdown-toggle"],[1,"ui-select-match-text","w-100"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],["aria-label","close","type","button",1,"btn-close",3,"click"],["role","menuitem"],[1,"ui-select-choices-row",3,"click","mouseenter"],[1,"d-flex","align-items-center"],[1,"ui-icon","circle-primary-icon","me-2"],[3,"icon","fixedWidth"],[1,"d-flex","ms-auto","me-4","fs-xxxs","text-muted"],["href","javascript:void(0)",1,"dropdown-item","cursor-pointer",2,"padding","3px 5px"],[3,"innerHtml"],[1,"d-flex","ms-auto","fs-xxxs","text-muted",3,"innerHtml"]],template:function(t,o){if(t&1){let p=b();l(0,"div",2),h("keyup",function(Oe){return C(p),v(o.mainClick(Oe))}),_(1,"div"),f(2,Fe,1,1,"input",3)(3,je,6,2,"div",4),f(4,Le,3,0,"ul",5),a(),w(5,Re,7,4,"ng-template",null,0,j)(7,Ie,8,10,"ng-template",null,1,j)}t&2&&(d("offClick",o.clickedOutside),r(),y("ui-disabled",o.disabled),r(),g(o.inputMode?2:3),r(2),g(o.optionsOpened&&o.options&&o.options.length>0?4:-1))},dependencies:[xe,P,Y,Ce],styles:[`.ui-select-container[_ngcontent-%COMP%]{background-color:transparent;border-radius:4px}.ui-select-container.open[_ngcontent-%COMP%] > .dropdown-menu[_ngcontent-%COMP%]{display:block}.ui-select-container.open[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]{outline:none}.ui-select-container[_ngcontent-%COMP%] .ui-icon[_ngcontent-%COMP%]{min-width:26px;min-height:26px;font-size:.85rem}.ui-select-container[_ngcontent-%COMP%] .ui-disabled[_ngcontent-%COMP%]{background-color:#d4dbe8;border-radius:4px;position:absolute;width:100%;height:100%;z-index:5;opacity:.6;top:0;left:0;cursor:not-allowed}.ui-select-container[_ngcontent-%COMP%] .ui-select-search[_ngcontent-%COMP%]{line-height:26px}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%]{padding-left:.3rem}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{text-align:start!important}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .caret[_ngcontent-%COMP%]{position:absolute;top:45%;right:15px}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]{font-size:1.6em;line-height:.75}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .ui-select-toggle[_ngcontent-%COMP%]{display:flex;align-items:center}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .ui-select-toggle[_ngcontent-%COMP%] > .caret[_ngcontent-%COMP%]{position:absolute;height:10px;top:50%;right:10px;margin-top:-2px}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .ui-select-placeholder[_ngcontent-%COMP%]{float:left;line-height:26px;color:#8c8c8c;width:100%}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .dropdown-toggle[_ngcontent-%COMP%]{cursor:pointer}.ui-select-container[_ngcontent-%COMP%] .ui-select-match[_ngcontent-%COMP%] .dropdown-toggle[_ngcontent-%COMP%]:after{display:inline-block!important}.ui-select-container[_ngcontent-%COMP%] .ui-select-choices[_ngcontent-%COMP%]{width:100%;height:auto;max-height:200px;overflow-x:hidden;margin-top:0}.ui-select-container[_ngcontent-%COMP%] .ui-select-choices[_ngcontent-%COMP%] .ui-select-choices-row[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]{display:block;padding:3px 5px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.ui-select-container[_ngcontent-%COMP%] .ui-select-choices[_ngcontent-%COMP%] .ui-select-choices-row[_ngcontent-%COMP%] .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]{text-decoration:none;outline:0}.ui-select-container[_ngcontent-%COMP%] .ui-select-choices[_ngcontent-%COMP%] .ui-select-choices-row[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{pointer-events:none}
2
+
3
+
4
+
5
+
6
+
7
+ `]});let i=n;return i})(),N=class{constructor(n){this.actor=n}first(){this.actor.activeOption=this.actor.options[0],this.ensureHighlightVisible()}last(){this.actor.activeOption=this.actor.options[this.actor.options.length-1],this.ensureHighlightVisible()}prev(){let n=this.actor.options.indexOf(this.actor.activeOption);this.actor.activeOption=this.actor.options[n-1<0?this.actor.options.length-1:n-1],this.ensureHighlightVisible()}next(){let n=this.actor.options.indexOf(this.actor.activeOption);this.actor.activeOption=this.actor.options[n+1>this.actor.options.length-1?0:n+1],this.ensureHighlightVisible()}ensureHighlightVisible(n=void 0){let s=this.actor.element.nativeElement.querySelector(".ui-select-choices-content");if(!s)return;let e=s.querySelectorAll(".ui-select-choices-row");if(e.length<1)return;let t=this.getActiveIndex(n);if(t<0)return;let o=e[t];if(!o)return;let p=o.offsetTop+o.clientHeight-s.scrollTop,u=s.offsetHeight;p>u?s.scrollTop+=p-u:p<o.clientHeight&&(s.scrollTop-=o.clientHeight-p)}filter(){this.actor.options=[...this.actor.itemObjects],this.actor.options.length>0&&(this.actor.activeOption=this.actor.options[0],this.ensureHighlightVisible())}getActiveIndex(n=void 0){let s=this.actor.options.indexOf(this.actor.activeOption);return s<0&&n!==void 0&&(s=n.get(this.actor.activeOption.id)),s}};export{be as a,ye as b,st as c,bt as d};