fontastic 0.1.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/.editorconfig +16 -16
  2. package/.github/FUNDING.yml +3 -12
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +41 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.yml +29 -0
  5. package/.github/dependabot.yml +6 -6
  6. package/.github/pull_request_template.md +21 -21
  7. package/.github/workflows/claude-code-review.yml +45 -0
  8. package/.github/workflows/claude.yml +46 -0
  9. package/.github/workflows/macos.yml +77 -58
  10. package/.github/workflows/release.yml +165 -0
  11. package/.github/workflows/ubuntu.yml +87 -70
  12. package/.github/workflows/windows.yml +81 -64
  13. package/.husky/pre-commit +1 -0
  14. package/.lintstagedrc.json +6 -0
  15. package/.node-version +1 -1
  16. package/.postcssrc.json +5 -0
  17. package/.prettierignore +8 -0
  18. package/.prettierrc +18 -0
  19. package/.vscode/launch.json +42 -45
  20. package/.vscode/tasks.json +48 -48
  21. package/CODE_OF_CONDUCT.md +128 -45
  22. package/HOW_TO.md +39 -0
  23. package/LICENSE.md +7 -0
  24. package/README.md +103 -111
  25. package/angular.json +166 -202
  26. package/app/Application.js +39 -39
  27. package/app/Application.ts +38 -38
  28. package/app/config/alert.ts +31 -31
  29. package/app/config/database.js +194 -202
  30. package/app/config/database.ts +194 -202
  31. package/app/config/index.js +19 -19
  32. package/app/config/index.ts +2 -2
  33. package/app/config/mimes.js +48 -48
  34. package/app/config/mimes.ts +53 -53
  35. package/app/config/system.js +578 -496
  36. package/app/config/system.ts +580 -498
  37. package/app/config/themes.ts +38 -38
  38. package/app/core/AppLogger.js +30 -30
  39. package/app/core/AppLogger.ts +37 -37
  40. package/app/core/ConfigManager.js +129 -113
  41. package/app/core/ConfigManager.ts +150 -137
  42. package/app/core/ConnectionManager.js +93 -82
  43. package/app/core/ConnectionManager.ts +107 -95
  44. package/app/core/FontCatalog.js +32 -50
  45. package/app/core/FontCatalog.ts +20 -42
  46. package/app/core/FontFinder.js +72 -85
  47. package/app/core/FontFinder.ts +75 -96
  48. package/app/core/FontManager.js +128 -164
  49. package/app/core/FontManager.ts +136 -172
  50. package/app/core/FontObject.js +53 -53
  51. package/app/core/FontObject.ts +62 -62
  52. package/app/core/MessageHandler.js +270 -271
  53. package/app/core/MessageHandler.ts +330 -337
  54. package/app/core/SystemManager.js +132 -139
  55. package/app/core/SystemManager.ts +160 -171
  56. package/app/core/menu/Example.ts +279 -279
  57. package/app/core/menu/MenuBuilder.js +43 -44
  58. package/app/core/menu/MenuBuilder.ts +51 -53
  59. package/app/core/menu/templates/DarwinTemplate.js +124 -126
  60. package/app/core/menu/templates/DarwinTemplate.ts +144 -142
  61. package/app/core/menu/templates/SystemTemplate.js +121 -123
  62. package/app/core/menu/templates/SystemTemplate.ts +136 -139
  63. package/app/database/entity/Collection.schema.js +98 -98
  64. package/app/database/entity/Collection.schema.ts +68 -68
  65. package/app/database/entity/Logger.schema.js +49 -49
  66. package/app/database/entity/Logger.schema.ts +26 -26
  67. package/app/database/entity/Store.schema.js +159 -164
  68. package/app/database/entity/Store.schema.ts +110 -116
  69. package/app/database/entity/index.js +19 -19
  70. package/app/database/entity/index.ts +2 -2
  71. package/app/database/repository/Collection.repository.js +277 -180
  72. package/app/database/repository/Collection.repository.ts +291 -190
  73. package/app/database/repository/Logger.repository.js +24 -24
  74. package/app/database/repository/Logger.repository.ts +10 -10
  75. package/app/database/repository/Store.repository.js +324 -327
  76. package/app/database/repository/Store.repository.ts +349 -358
  77. package/app/database/repository/User.repository.js +11 -11
  78. package/app/database/repository/User.repository.ts +8 -8
  79. package/app/database/repository/index.js +19 -19
  80. package/app/database/repository/index.ts +2 -2
  81. package/app/enums/ChannelType.js +62 -61
  82. package/app/enums/ChannelType.ts +67 -65
  83. package/app/enums/StorageType.js +19 -18
  84. package/app/enums/{storageType.ts → StorageType.ts} +15 -14
  85. package/app/enums/index.js +18 -18
  86. package/app/enums/index.ts +2 -2
  87. package/app/helpers/command.js +27 -27
  88. package/app/helpers/command.ts +19 -19
  89. package/app/helpers/random.js +15 -15
  90. package/app/helpers/random.ts +12 -12
  91. package/app/main.js +97 -81
  92. package/app/main.ts +114 -94
  93. package/app/package-lock.json +2240 -2649
  94. package/app/package.json +23 -35
  95. package/app/types/AppAlert.js +2 -2
  96. package/app/types/AppAlert.ts +8 -8
  97. package/app/types/AuthUser.js +6 -6
  98. package/app/types/AuthUser.ts +5 -5
  99. package/app/types/Breadcrumb.js +2 -2
  100. package/app/types/Breadcrumb.ts +4 -4
  101. package/app/types/FontMetrics.ts +7 -0
  102. package/app/types/ImportOptions.js +6 -6
  103. package/app/types/ImportOptions.ts +3 -3
  104. package/app/types/QueryOptions.js +2 -2
  105. package/app/types/QueryOptions.ts +12 -12
  106. package/app/types/SystemConfig.js +2 -2
  107. package/app/types/SystemConfig.ts +127 -132
  108. package/app/types/SystemStats.js +2 -2
  109. package/app/types/SystemStats.ts +6 -7
  110. package/app/types/SystemTheme.js +2 -2
  111. package/app/types/SystemTheme.ts +5 -5
  112. package/app/types/index.js +24 -24
  113. package/app/types/index.ts +9 -8
  114. package/commitlint.config.mjs +3 -0
  115. package/e2e/main.spec.ts +57 -59
  116. package/e2e/playwright.config.ts +20 -19
  117. package/e2e/tsconfig.e2e.json +13 -13
  118. package/electron-builder.json +34 -71
  119. package/eslint.config.mjs +111 -0
  120. package/package.json +122 -123
  121. package/src/app/app.component.html +1 -2
  122. package/src/app/app.component.spec.ts +21 -0
  123. package/src/app/app.component.ts +40 -37
  124. package/src/app/core/core.module.ts +8 -11
  125. package/src/app/core/services/database/database.service.ts +410 -286
  126. package/src/app/core/services/electron/electron.service.spec.ts +12 -12
  127. package/src/app/core/services/electron/electron.service.ts +62 -62
  128. package/src/app/core/services/index.ts +5 -14
  129. package/src/app/core/services/message/message.service.ts +291 -289
  130. package/src/app/core/services/news/news.service.ts +52 -94
  131. package/src/app/core/services/presentation/presentation.service.ts +253 -341
  132. package/src/app/home/home.component.html +7 -0
  133. package/src/app/home/home.component.spec.ts +31 -0
  134. package/src/app/home/home.component.ts +15 -0
  135. package/src/app/layout/aside/aside.component.html +35 -9
  136. package/src/app/layout/aside/aside.component.ts +60 -26
  137. package/src/app/layout/footer/footer.component.html +5 -11
  138. package/src/app/layout/footer/footer.component.ts +13 -32
  139. package/src/app/layout/header/header.component.html +118 -35
  140. package/src/app/layout/header/header.component.ts +52 -229
  141. package/src/app/layout/layout.component.html +32 -14
  142. package/src/app/layout/layout.component.ts +19 -23
  143. package/src/app/layout/main/main.component.html +46 -0
  144. package/src/app/layout/main/main.component.ts +20 -0
  145. package/src/app/layout/navigation/library/library.component.ts +51 -0
  146. package/src/app/layout/navigation/navigation.component.html +126 -142
  147. package/src/app/layout/navigation/navigation.component.ts +372 -302
  148. package/src/app/layout/navigation/stats/stats.component.ts +56 -0
  149. package/src/app/settings/ai-keys/ai-keys.component.html +56 -0
  150. package/src/app/settings/ai-keys/ai-keys.component.ts +44 -0
  151. package/src/app/settings/danger-zone/danger-zone.component.html +22 -0
  152. package/src/app/settings/danger-zone/danger-zone.component.ts +37 -0
  153. package/src/app/settings/logs/logs.component.html +41 -0
  154. package/src/app/settings/logs/logs.component.ts +43 -0
  155. package/src/app/settings/news-api/news-api.component.html +40 -0
  156. package/src/app/settings/news-api/news-api.component.ts +57 -0
  157. package/src/app/settings/pages/general/general.component.html +7 -0
  158. package/src/app/settings/pages/general/general.component.ts +20 -0
  159. package/src/app/settings/pages/logs/logs.component.html +1 -0
  160. package/src/app/settings/pages/logs/logs.component.ts +10 -0
  161. package/src/app/settings/pages/system/system.component.html +1 -0
  162. package/src/app/settings/pages/system/system.component.ts +10 -0
  163. package/src/app/settings/quick-actions/quick-actions.component.html +49 -0
  164. package/src/app/settings/quick-actions/quick-actions.component.ts +40 -0
  165. package/src/app/settings/settings.component.html +47 -0
  166. package/src/app/settings/settings.component.ts +10 -0
  167. package/src/app/settings/system-info/system-info.component.html +21 -0
  168. package/src/app/settings/system-info/system-info.component.ts +42 -0
  169. package/src/app/settings/theme/theme.component.html +15 -0
  170. package/src/app/settings/theme/theme.component.ts +22 -0
  171. package/src/app/shared/components/collapsible-panel/collapsible-panel.component.ts +43 -0
  172. package/src/app/shared/components/context-menu/context-menu.component.ts +67 -0
  173. package/src/app/shared/components/datagrid/datagrid.component.html +96 -0
  174. package/src/app/shared/components/datagrid/datagrid.component.ts +49 -0
  175. package/src/app/shared/components/index.ts +11 -17
  176. package/src/app/shared/components/inspector/inspector.component.html +140 -0
  177. package/src/app/shared/components/inspector/inspector.component.ts +41 -0
  178. package/src/app/shared/components/page-not-found/page-not-found.component.html +1 -3
  179. package/src/app/shared/components/page-not-found/page-not-found.component.spec.ts +22 -0
  180. package/src/app/shared/components/page-not-found/page-not-found.component.ts +14 -12
  181. package/src/app/shared/components/panel/panel.component.html +5 -0
  182. package/src/app/shared/components/panel/panel.component.ts +8 -0
  183. package/src/app/shared/components/preview/preview.component.html +36 -0
  184. package/src/app/shared/components/preview/preview.component.ts +68 -0
  185. package/src/app/shared/components/prompt-dialog/prompt-dialog.component.html +36 -0
  186. package/src/app/shared/components/prompt-dialog/prompt-dialog.component.ts +39 -0
  187. package/src/app/shared/components/search/search.component.html +329 -54
  188. package/src/app/shared/components/search/search.component.ts +221 -77
  189. package/src/app/shared/components/spinner/spinner.component.ts +10 -26
  190. package/src/app/shared/components/toolbar/toolbar.component.html +207 -0
  191. package/src/app/shared/components/toolbar/toolbar.component.ts +99 -0
  192. package/src/app/shared/components/waterfall/waterfall.component.html +119 -0
  193. package/src/app/shared/components/waterfall/waterfall.component.ts +119 -0
  194. package/src/app/shared/directives/autofocus/autofocus.directive.ts +14 -0
  195. package/src/app/shared/directives/index.ts +2 -2
  196. package/src/app/shared/directives/webview/webview.directive.spec.ts +8 -0
  197. package/src/app/shared/directives/webview/webview.directive.ts +9 -8
  198. package/src/app/shared/shared.module.ts +13 -94
  199. package/src/assets/background.jpg +0 -0
  200. package/src/assets/fonts/md/MaterialIcons-Regular.woff2 +0 -0
  201. package/src/assets/fonts/md/MaterialSymbolsOutlined.woff2 +0 -0
  202. package/src/assets/i18n/en.json +12 -12
  203. package/src/assets/icons/electron.bmp +0 -0
  204. package/src/assets/icons/favicon.256x256.png +0 -0
  205. package/src/assets/icons/favicon.512x512.png +0 -0
  206. package/src/assets/icons/favicon.icns +0 -0
  207. package/src/assets/icons/favicon.ico +0 -0
  208. package/src/assets/icons/favicon.png +0 -0
  209. package/src/environments/environment.dev.ts +4 -4
  210. package/src/environments/environment.prod.ts +4 -4
  211. package/src/environments/environment.ts +4 -4
  212. package/src/favicon.ico +0 -0
  213. package/src/index.html +19 -13
  214. package/src/main.ts +65 -15
  215. package/src/styles/base/reset.css +41 -0
  216. package/src/styles/base/variables.css +356 -0
  217. package/src/styles/components/buttons.css +108 -0
  218. package/src/styles/components/cards.css +60 -0
  219. package/src/styles/components/forms.css +70 -0
  220. package/src/styles/components/navigation.css +24 -0
  221. package/src/styles/components/scrollbox.css +50 -0
  222. package/src/styles/components/spinner.css +7 -0
  223. package/src/styles/components/splash.css +47 -0
  224. package/src/styles/components/toolbar.css +92 -0
  225. package/src/styles/fonts/md.css +39 -0
  226. package/src/styles/themes/dashboard.scss +293 -294
  227. package/src/styles/themes/euphoria.scss +284 -283
  228. package/src/styles/themes/mellow.scss +281 -280
  229. package/src/styles/themes/midnight.scss +284 -283
  230. package/src/styles/themes/passion.scss +281 -280
  231. package/src/styles/themes/swiss.scss +284 -283
  232. package/src/styles.css +17 -0
  233. package/src/tsconfig.app.json +11 -20
  234. package/src/tsconfig.spec.json +10 -23
  235. package/src/typings.d.ts +9 -9
  236. package/src/vitest.d.ts +1 -0
  237. package/tsconfig.json +38 -44
  238. package/tsconfig.serve.json +27 -27
  239. package/.eslintrc.json +0 -54
  240. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -29
  241. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  242. package/.github/stale.yml +0 -17
  243. package/CONTRIBUTING.md +0 -72
  244. package/LICENSE +0 -21
  245. package/angular.webpack.js +0 -35
  246. package/app/core/FontInstaller.js +0 -67
  247. package/app/core/FontInstaller.ts +0 -63
  248. package/docs/logo.png +0 -0
  249. package/docs/screenshots/readme.md +0 -7
  250. package/docs/screenshots/screen-grab1.png +0 -0
  251. package/docs/screenshots/screen-grab2.png +0 -0
  252. package/docs/screenshots/screen-grab3.png +0 -0
  253. package/src/app/app-routing.module.ts +0 -15
  254. package/src/app/app.component.scss +0 -0
  255. package/src/app/app.component.spec.ts.dist +0 -33
  256. package/src/app/app.module.ts +0 -63
  257. package/src/app/core/model/AuthUserModel.ts +0 -7
  258. package/src/app/core/model/CustomThemeModel.ts +0 -7
  259. package/src/app/core/model/DbConnectionModel.ts +0 -16
  260. package/src/app/core/model/ImportOptionsModel.ts +0 -5
  261. package/src/app/core/model/LatestNewsModel.ts +0 -7
  262. package/src/app/core/model/SearchFormModel.ts +0 -10
  263. package/src/app/core/model/index.ts +0 -6
  264. package/src/app/core/services/alert/alert.service.spec.ts +0 -22
  265. package/src/app/core/services/alert/alert.service.ts +0 -71
  266. package/src/app/core/services/auth/auth.service.ts +0 -30
  267. package/src/app/core/services/boot/boot.service.ts +0 -33
  268. package/src/app/core/services/breadcrumb/breadcrumb.service.spec.ts +0 -22
  269. package/src/app/core/services/breadcrumb/breadcrumb.service.ts +0 -30
  270. package/src/app/core/services/config/config.service.ts +0 -63
  271. package/src/app/core/services/font/font.service.ts +0 -79
  272. package/src/app/core/services/gravatar/gravatar.service.spec.ts +0 -16
  273. package/src/app/core/services/gravatar/gravatar.service.ts +0 -18
  274. package/src/app/core/services/modal/modal.service.spec.ts +0 -16
  275. package/src/app/core/services/modal/modal.service.ts +0 -34
  276. package/src/app/core/services/utils/utils.service.spec.ts +0 -12
  277. package/src/app/core/services/utils/utils.service.ts +0 -144
  278. package/src/app/layout/aside/aside.component.scss +0 -1
  279. package/src/app/layout/footer/footer.component.scss +0 -27
  280. package/src/app/layout/header/header.component.scss +0 -60
  281. package/src/app/layout/layout.component.scss +0 -119
  282. package/src/app/layout/layout.module.ts +0 -32
  283. package/src/app/layout/layout.service.ts +0 -13
  284. package/src/app/layout/navigation/navigation.component.scss +0 -0
  285. package/src/app/pages/main/grid/grid.component.html +0 -183
  286. package/src/app/pages/main/grid/grid.component.scss +0 -3
  287. package/src/app/pages/main/grid/grid.component.ts +0 -98
  288. package/src/app/pages/main/inspect/inspect.component.html +0 -7
  289. package/src/app/pages/main/inspect/inspect.component.scss +0 -3
  290. package/src/app/pages/main/inspect/inspect.component.ts +0 -66
  291. package/src/app/pages/main/main-routing.module.ts +0 -30
  292. package/src/app/pages/main/main.component.html +0 -6
  293. package/src/app/pages/main/main.component.scss +0 -191
  294. package/src/app/pages/main/main.component.ts +0 -35
  295. package/src/app/pages/main/main.module.ts +0 -28
  296. package/src/app/pages/main/preview/preview.component.html +0 -46
  297. package/src/app/pages/main/preview/preview.component.scss +0 -0
  298. package/src/app/pages/main/preview/preview.component.ts +0 -239
  299. package/src/app/pages/main/toolbar/toolbar.component.html +0 -78
  300. package/src/app/pages/main/toolbar/toolbar.component.scss +0 -3
  301. package/src/app/pages/main/toolbar/toolbar.component.ts +0 -132
  302. package/src/app/shared/components/alert/alert.component.html +0 -9
  303. package/src/app/shared/components/alert/alert.component.scss +0 -0
  304. package/src/app/shared/components/alert/alert.component.ts +0 -37
  305. package/src/app/shared/components/breadcrumbs/breadcrumbs.component.html +0 -14
  306. package/src/app/shared/components/breadcrumbs/breadcrumbs.component.scss +0 -0
  307. package/src/app/shared/components/breadcrumbs/breadcrumbs.component.ts +0 -36
  308. package/src/app/shared/components/button/button.component.html +0 -3
  309. package/src/app/shared/components/button/button.component.scss +0 -2
  310. package/src/app/shared/components/button/button.component.ts +0 -22
  311. package/src/app/shared/components/collection/create-collection/create-collection.component.html +0 -41
  312. package/src/app/shared/components/collection/create-collection/create-collection.component.scss +0 -0
  313. package/src/app/shared/components/collection/create-collection/create-collection.component.ts +0 -68
  314. package/src/app/shared/components/collection/form-collection/form-collection.component.html +0 -1
  315. package/src/app/shared/components/collection/form-collection/form-collection.component.scss +0 -0
  316. package/src/app/shared/components/collection/form-collection/form-collection.component.ts +0 -15
  317. package/src/app/shared/components/collection/update-collection/update-collection.component.html +0 -40
  318. package/src/app/shared/components/collection/update-collection/update-collection.component.scss +0 -0
  319. package/src/app/shared/components/collection/update-collection/update-collection.component.ts +0 -71
  320. package/src/app/shared/components/glyph-list/glyph-list.component.html +0 -40
  321. package/src/app/shared/components/glyph-list/glyph-list.component.scss +0 -1
  322. package/src/app/shared/components/glyph-list/glyph-list.component.ts +0 -165
  323. package/src/app/shared/components/glyph-view/glyph-view.component.html +0 -23
  324. package/src/app/shared/components/glyph-view/glyph-view.component.scss +0 -0
  325. package/src/app/shared/components/glyph-view/glyph-view.component.ts +0 -228
  326. package/src/app/shared/components/loading/loading.component.html +0 -1
  327. package/src/app/shared/components/loading/loading.component.scss +0 -0
  328. package/src/app/shared/components/loading/loading.component.ts +0 -26
  329. package/src/app/shared/components/modal/modal.component.html +0 -31
  330. package/src/app/shared/components/modal/modal.component.scss +0 -0
  331. package/src/app/shared/components/modal/modal.component.ts +0 -51
  332. package/src/app/shared/components/page-not-found/page-not-found.component.scss +0 -0
  333. package/src/app/shared/components/paginator/paginator.component.html +0 -21
  334. package/src/app/shared/components/paginator/paginator.component.scss +0 -3
  335. package/src/app/shared/components/paginator/paginator.component.ts +0 -133
  336. package/src/app/shared/components/pairing/pairing.component.html +0 -20
  337. package/src/app/shared/components/pairing/pairing.component.scss +0 -0
  338. package/src/app/shared/components/pairing/pairing.component.ts +0 -33
  339. package/src/app/shared/components/search/search.component.scss +0 -10
  340. package/src/app/shared/components/settings/database/database.component.html +0 -151
  341. package/src/app/shared/components/settings/database/database.component.scss +0 -0
  342. package/src/app/shared/components/settings/database/database.component.ts +0 -145
  343. package/src/app/shared/components/settings/general/general.component.html +0 -170
  344. package/src/app/shared/components/settings/general/general.component.scss +0 -0
  345. package/src/app/shared/components/settings/general/general.component.ts +0 -150
  346. package/src/app/shared/components/settings/logs/logs.component.html +0 -44
  347. package/src/app/shared/components/settings/logs/logs.component.scss +0 -0
  348. package/src/app/shared/components/settings/logs/logs.component.ts +0 -37
  349. package/src/app/shared/components/settings/news/news.component.html +0 -41
  350. package/src/app/shared/components/settings/news/news.component.scss +0 -0
  351. package/src/app/shared/components/settings/news/news.component.ts +0 -52
  352. package/src/app/shared/components/settings/settings.component.html +0 -46
  353. package/src/app/shared/components/settings/settings.component.scss +0 -0
  354. package/src/app/shared/components/settings/settings.component.ts +0 -23
  355. package/src/app/shared/components/settings/system/system.component.html +0 -30
  356. package/src/app/shared/components/settings/system/system.component.scss +0 -0
  357. package/src/app/shared/components/settings/system/system.component.ts +0 -43
  358. package/src/app/shared/components/settings/theme/theme.component.html +0 -22
  359. package/src/app/shared/components/settings/theme/theme.component.scss +0 -0
  360. package/src/app/shared/components/settings/theme/theme.component.ts +0 -50
  361. package/src/app/shared/components/spinner/spinner.component.html +0 -1
  362. package/src/app/shared/components/spinner/spinner.component.scss +0 -0
  363. package/src/app/shared/components/splash-screen/splash-screen.component.html +0 -5
  364. package/src/app/shared/components/splash-screen/splash-screen.component.scss +0 -31
  365. package/src/app/shared/components/splash-screen/splash-screen.component.ts +0 -17
  366. package/src/app/shared/components/store/store.component.html +0 -22
  367. package/src/app/shared/components/store/store.component.scss +0 -10
  368. package/src/app/shared/components/store/store.component.ts +0 -58
  369. package/src/app/shared/components/tables/tables.component.html +0 -47
  370. package/src/app/shared/components/tables/tables.component.scss +0 -10
  371. package/src/app/shared/components/tables/tables.component.ts +0 -81
  372. package/src/app/shared/components/typescale/typescale.component.html +0 -53
  373. package/src/app/shared/components/typescale/typescale.component.scss +0 -0
  374. package/src/app/shared/components/typescale/typescale.component.ts +0 -168
  375. package/src/app/shared/directives/gravatar/gravatar.directive.ts +0 -29
  376. package/src/app/shared/pipes/installable.pipe.ts +0 -10
  377. package/src/app/shared/pipes/prettybytes.pipe.ts +0 -10
  378. package/src/app/shared/pipes/safehtml.pipe.ts +0 -10
  379. package/src/assets/fonts/fa/fa-brands-400.eot +0 -0
  380. package/src/assets/fonts/fa/fa-brands-400.svg +0 -3535
  381. package/src/assets/fonts/fa/fa-brands-400.ttf +0 -0
  382. package/src/assets/fonts/fa/fa-brands-400.woff +0 -0
  383. package/src/assets/fonts/fa/fa-brands-400.woff2 +0 -0
  384. package/src/assets/fonts/fa/fa-regular-400.eot +0 -0
  385. package/src/assets/fonts/fa/fa-regular-400.svg +0 -803
  386. package/src/assets/fonts/fa/fa-regular-400.ttf +0 -0
  387. package/src/assets/fonts/fa/fa-regular-400.woff +0 -0
  388. package/src/assets/fonts/fa/fa-regular-400.woff2 +0 -0
  389. package/src/assets/fonts/fa/fa-solid-900.eot +0 -0
  390. package/src/assets/fonts/fa/fa-solid-900.svg +0 -4700
  391. package/src/assets/fonts/fa/fa-solid-900.ttf +0 -0
  392. package/src/assets/fonts/fa/fa-solid-900.woff +0 -0
  393. package/src/assets/fonts/fa/fa-solid-900.woff2 +0 -0
  394. package/src/assets/fonts/md/MaterialIcons-Regular.eot +0 -0
  395. package/src/assets/fonts/md/MaterialIcons-Regular.ijmap +0 -1
  396. package/src/assets/fonts/md/MaterialIcons-Regular.svg +0 -2373
  397. package/src/assets/fonts/md/MaterialIcons-Regular.ttf +0 -0
  398. package/src/assets/fonts/md/MaterialIcons-Regular.woff +0 -0
  399. package/src/assets/fonts/md/README.md +0 -9
  400. package/src/assets/fonts/md/codepoints +0 -932
  401. package/src/assets/fonts/md/material-icons.css +0 -36
  402. package/src/assets/fonts/octicon/octicon.eot +0 -0
  403. package/src/assets/fonts/octicon/octicon.svg +0 -378
  404. package/src/assets/fonts/octicon/octicon.ttf +0 -0
  405. package/src/assets/fonts/octicon/octicon.woff +0 -0
  406. package/src/assets/fonts/octicon/octicon.woff2 +0 -0
  407. package/src/assets/fonts/roboto/Roboto-Bold-webfont.eot +0 -0
  408. package/src/assets/fonts/roboto/Roboto-Bold-webfont.svg +0 -607
  409. package/src/assets/fonts/roboto/Roboto-Bold-webfont.ttf +0 -0
  410. package/src/assets/fonts/roboto/Roboto-Bold-webfont.woff +0 -0
  411. package/src/assets/fonts/roboto/Roboto-Medium-webfont.eot +0 -0
  412. package/src/assets/fonts/roboto/Roboto-Medium-webfont.svg +0 -607
  413. package/src/assets/fonts/roboto/Roboto-Medium-webfont.ttf +0 -0
  414. package/src/assets/fonts/roboto/Roboto-Medium-webfont.woff +0 -0
  415. package/src/assets/fonts/roboto/Roboto-Regular-webfont.eot +0 -0
  416. package/src/assets/fonts/roboto/Roboto-Regular-webfont.svg +0 -635
  417. package/src/assets/fonts/roboto/Roboto-Regular-webfont.ttf +0 -0
  418. package/src/assets/fonts/roboto/Roboto-Regular-webfont.woff +0 -0
  419. package/src/assets/icons/android-chrome-192x192.png +0 -0
  420. package/src/assets/icons/android-chrome-512x512.png +0 -0
  421. package/src/assets/icons/apple-touch-icon.png +0 -0
  422. package/src/assets/icons/favicon-16x16.png +0 -0
  423. package/src/assets/icons/favicon-32x32.png +0 -0
  424. package/src/assets/icons/site.webmanifest +0 -1
  425. package/src/assets/images/electron.bmp +0 -0
  426. package/src/bin/activator +0 -0
  427. package/src/bin/activator.exe +0 -0
  428. package/src/environments/environment.web.prod.ts +0 -4
  429. package/src/environments/environment.web.ts +0 -4
  430. package/src/karma.conf.js +0 -50
  431. package/src/polyfills-test.ts +0 -1
  432. package/src/polyfills.ts +0 -53
  433. package/src/styles/base/loading.scss +0 -87
  434. package/src/styles/base/reset.scss +0 -408
  435. package/src/styles/components/alert.scss +0 -54
  436. package/src/styles/components/buttons.scss +0 -93
  437. package/src/styles/components/forms.scss +0 -96
  438. package/src/styles/components/inputs.scss +0 -113
  439. package/src/styles/components/modal.scss +0 -52
  440. package/src/styles/components/paginator.scss +0 -108
  441. package/src/styles/components/scrollbox.scss +0 -71
  442. package/src/styles/components/spinner.scss +0 -11
  443. package/src/styles/components/tables.scss +0 -42
  444. package/src/styles/components/tabs.scss +0 -44
  445. package/src/styles/components/toolbar.scss +0 -130
  446. package/src/styles/fonts/md.scss +0 -54
  447. package/src/styles/fonts/octicons.scss +0 -1351
  448. package/src/styles/fonts/roboto.scss +0 -32
  449. package/src/styles/tools/_functions.scss +0 -5
  450. package/src/styles/tools/_mixins.scss +0 -159
  451. package/src/styles/tools/_placeholders.scss +0 -17
  452. package/src/styles/tools/_variables.scss +0 -67
  453. package/src/styles.scss +0 -37
  454. package/src/test.ts +0 -17
  455. package/tailwind.config.js +0 -67
@@ -1,286 +1,410 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { FontService } from '@app/core/services/font/font.service';
4
- import { MessageService } from '@app/core/services/message/message.service';
5
- import { PresentationService } from '@app/core/services/presentation/presentation.service';
6
- import { ElectronService } from '@app/core/services/electron/electron.service';
7
- import { Store } from '@main/database/entity/Store.schema';
8
- import { Collection } from '@main/database/entity/Collection.schema';
9
- import { QueryOptions, SystemStats } from '@main/types';
10
- import { StorageType } from '@main/enums';
11
-
12
- @Injectable({
13
- providedIn: 'root'
14
- })
15
- export class DatabaseService {
16
-
17
- _activePage = new BehaviorSubject<number>(1);
18
- watchActivePage$ = this._activePage.asObservable();
19
-
20
- // STORE
21
- _storeId = new BehaviorSubject<number>(0);
22
- watchStoreId$ = this._storeId.asObservable();
23
-
24
- _storeResult = new BehaviorSubject<Store>(null);
25
- watchStoreResult$ = this._storeResult.asObservable();
26
-
27
- _storeResultSet = new BehaviorSubject<Store[]>([]);
28
- watchStoreResultSet$ = this._storeResultSet.asObservable();
29
-
30
- // COLLECTION
31
- _collectionId = new BehaviorSubject<number>(0);
32
- watchCollectionId$ = this._collectionId.asObservable();
33
-
34
- _collectionResult = new BehaviorSubject<Collection>(null);
35
- watchCollectionResult$ = this._collectionResult.asObservable();
36
-
37
- _collectionResultSet = new BehaviorSubject<Collection[]>([]);
38
- watchCollectionResultSet$ = this._collectionResultSet.asObservable();
39
-
40
- // COUNTS
41
- _resultSetCount = new BehaviorSubject<number>(0);
42
- watchResultSetCount$ = this._resultSetCount.asObservable();
43
-
44
- _resultSetTotal = new BehaviorSubject<number>(0);
45
- watchResultSetTotal$ = this._resultSetTotal.asObservable();
46
-
47
- _queryOptions = new BehaviorSubject<QueryOptions>({
48
- order: {
49
- column: 'id',
50
- direction: 'ASC',
51
- },
52
- where: [],
53
- skip: 0,
54
- take: 100,
55
- run: false
56
- });
57
- watchQueryOptions$ = this._queryOptions.asObservable();
58
-
59
- order = { column: 'file_name', direction: 'ASC' };
60
- where = [];
61
- skip = 0;
62
- take = 100;
63
-
64
- search = false;
65
- stats = false;
66
-
67
- _systemStats = new BehaviorSubject<SystemStats>({
68
- rowCount: 0,
69
- favoriteCount: 0,
70
- systemCount: 0,
71
- activatedCount: 0,
72
- temporaryCount: 0
73
- });
74
- watchSystemStats$ = this._systemStats.asObservable();
75
-
76
- constructor(
77
- public fontService: FontService,
78
- public messageService: MessageService,
79
- public presentationService: PresentationService,
80
- public electronService: ElectronService
81
- ) {
82
-
83
- if (electronService.isElectron) {
84
-
85
- if (this.electronService.store.has(StorageType.CollectionId)) {
86
- const id = this.electronService.store.get(StorageType.CollectionId);
87
- if (id) {
88
- this.setCollectionId(id);
89
- }
90
- }
91
-
92
- if (this.electronService.store.has(StorageType.StoreId)) {
93
- const id = this.electronService.store.get(StorageType.StoreId);
94
- if (id) {
95
- this.setStoreId(id);
96
- }
97
- }
98
-
99
- this.watchQueryOptions$.subscribe((options: QueryOptions) => {
100
- if (options.run) {
101
- this.execute(options);
102
- }
103
- });
104
-
105
- this.watchStoreId$.subscribe((id: number) => {
106
- if (Number.isInteger(id)) {
107
- messageService.storeFindOne({ where: { id } }).then((result: Store) => {
108
- if (result) {
109
- this.setStoreResult(result);
110
- const resource = this.fontService.withTransferProtocol(result.file_path, 'file');
111
- this.fontService.load(resource).then((font: opentype.Font) => this.fontService.setFontObject(font));
112
- }
113
- });
114
- }
115
- });
116
-
117
- // System boot
118
- this.fetchCollections();
119
-
120
- this.fetchSystemStats();
121
- }
122
- }
123
-
124
- fetchCollections() {
125
- this.messageService.collectionFetch({}).then((result: Collection[]) => this.setCollectionResultSet(result));
126
- }
127
-
128
- getResultSetCount(): number {
129
- return this._resultSetCount.getValue();
130
- }
131
-
132
- getResultSetTotal(): number {
133
- return this._resultSetTotal.getValue();
134
- }
135
-
136
- /**
137
- * BEGIN STORE
138
- */
139
-
140
- setStoreId(id: number): void {
141
- this._storeId.next(id);
142
- this.electronService.store.set(StorageType.StoreId, id);
143
- }
144
-
145
- getStoreId(): number {
146
- return this._storeId.getValue();
147
- }
148
-
149
- setStoreResult(result: Store) {
150
- this._storeResult.next(result);
151
- }
152
-
153
- getStoreResult(): Store {
154
- return this._storeResult.getValue();
155
- }
156
-
157
- setStoreResultSet(results: Store[]): void {
158
- this._storeResultSet.next(results);
159
- }
160
-
161
- getStoreResultSet(): Store[] {
162
- return this._storeResultSet.getValue();
163
- }
164
-
165
- /**
166
- * BEGIN SYSTEM STATS
167
- */
168
-
169
- setSystemStats(results: SystemStats): void {
170
- this._systemStats.next(results);
171
- }
172
-
173
- getSystemStats(): SystemStats {
174
- return this._systemStats.getValue();
175
- }
176
-
177
- fetchSystemStats(): void {
178
- this.messageService.fetchSystemStats().then((result: SystemStats) => this.setSystemStats(result));
179
- }
180
-
181
- /**
182
- * BEGIN COLLECTION
183
- */
184
-
185
- setCollectionId(id: number): void {
186
- this._collectionId.next(id);
187
- this.electronService.store.set(StorageType.CollectionId, id);
188
- }
189
-
190
- getCollectionId(): number {
191
- return this._collectionId.getValue();
192
- }
193
-
194
- setCollectionResult(result: Collection) {
195
- this._collectionResult.next(result);
196
- }
197
-
198
- getCollectionResult(): Collection {
199
- return this._collectionResult.getValue();
200
- }
201
-
202
- setCollectionResultSet(results: Collection[]) {
203
- this._collectionResultSet.next(results);
204
- }
205
-
206
- getCollectionResultSet(): Collection[] {
207
- return this._collectionResultSet.getValue();
208
- }
209
-
210
- /**
211
- * BEGIN QUERY OPTIONS
212
- */
213
-
214
- setQueryOptions(options: any): DatabaseService {
215
- this._queryOptions.next(options);
216
- return this;
217
- }
218
-
219
- getQueryOptions(): QueryOptions {
220
- return this._queryOptions.getValue();
221
- }
222
-
223
- setOrder(column: string, direction: string): DatabaseService {
224
- this.order = { column, direction };
225
- return this;
226
- }
227
-
228
- setWhere(key: string, value: any): DatabaseService {
229
- this.where.push({ key, value });
230
- return this;
231
- }
232
-
233
- setSkip(skip: number): DatabaseService {
234
- this.skip = skip;
235
- return this;
236
- }
237
-
238
- setTake(take: number): DatabaseService {
239
- this.take = take;
240
- return this;
241
- }
242
-
243
- setSearch(search: boolean): DatabaseService {
244
- this.search = search;
245
- return this;
246
- }
247
-
248
- run(): void {
249
- this.setQueryOptions({
250
- order: this.order,
251
- where: this.where,
252
- skip: this.skip,
253
- take: this.take,
254
- run: true
255
- }).resetWhere();
256
- }
257
-
258
- resetWhere(): DatabaseService {
259
- this.where = [];
260
- return this;
261
- }
262
-
263
- resetPage(page: number): DatabaseService {
264
- this._activePage.next(page);
265
- return this;
266
- }
267
-
268
- async execute(options: QueryOptions) {
269
- const t0 = performance.now();
270
- const [results, total]: any = (this.search) ? await this.fetchSearch(options) : await this.fetchStore(options);
271
- const t1 = performance.now();
272
- this._resultSetCount.next(results.length);
273
- this._resultSetTotal.next(total);
274
- this._storeResultSet.next(results);
275
- this.presentationService.setSystemLoading(false);
276
- console.warn(t1 - t0, 'milliseconds');
277
- }
278
-
279
- async fetchStore(options: QueryOptions) {
280
- return await this.messageService.storeFetch((this.getCollectionId() && this.stats === false) ? { ...options, collectionId: this.getCollectionId() } : options);
281
- }
282
-
283
- async fetchSearch(options: QueryOptions) {
284
- return await this.messageService.storeSearch(options);
285
- }
286
- }
1
+ import { Injectable, inject, signal, computed, effect } from '@angular/core';
2
+ import { ElectronService } from '../electron/electron.service';
3
+ import { MessageService } from '../message/message.service';
4
+ import { PresentationService } from '../presentation/presentation.service';
5
+ import { StorageType } from '@main/enums';
6
+ import type { Collection } from '@main/database/entity/Collection.schema';
7
+ import type { Logger } from '@main/database/entity/Logger.schema';
8
+ import type { Store, StoreManyAndCountType } from '@main/database/entity/Store.schema';
9
+ import type { FontMetrics, SystemStats } from '@main/types';
10
+
11
+ @Injectable({
12
+ providedIn: 'root',
13
+ })
14
+ export class DatabaseService {
15
+ private electron = inject(ElectronService);
16
+ private message = inject(MessageService);
17
+ private presentation = inject(PresentationService);
18
+
19
+ // Reactive state
20
+ readonly collections = signal<Collection[]>([]);
21
+ readonly parentId = signal<number | null>(null);
22
+ readonly collectionId = signal<number | null>(null);
23
+ readonly stores = signal<Store[]>([]);
24
+ readonly storeCount = signal(0);
25
+ readonly systemStats = signal<SystemStats | null>(null);
26
+
27
+ readonly storeId = signal<number | null>(null);
28
+ readonly store = signal<Store | null>(null);
29
+ readonly fontMetrics = signal<FontMetrics | null>(null);
30
+ readonly glyphs = signal<number[]>([]);
31
+ readonly activeFilter = signal<string | null>(null);
32
+ readonly activeSearchWhere = signal<{ key: string; value: any }[] | null>(null);
33
+ readonly collectionCount = computed(() => this.collections().length);
34
+ readonly collection = computed(() => this.collections().find((c) => c.id === this.collectionId()) ?? null);
35
+
36
+ // Pagination
37
+ readonly currentPage = signal(1);
38
+ readonly pageSize = signal(50);
39
+ readonly totalPages = computed(() => {
40
+ const count = this.storeCount();
41
+ const size = this.pageSize();
42
+ return Math.max(1, Math.ceil(count / size));
43
+ });
44
+
45
+ private async track<T>(operation: Promise<T>): Promise<T> {
46
+ this.presentation.startLoading();
47
+ try {
48
+ return await operation;
49
+ } finally {
50
+ this.presentation.stopLoading();
51
+ }
52
+ }
53
+
54
+ selectParent(parentId: number) {
55
+ this.parentId.set(parentId);
56
+ this.collectionId.set(parentId);
57
+ this.activeFilter.set(null);
58
+ this.activeSearchWhere.set(null);
59
+ this.currentPage.set(1);
60
+ }
61
+
62
+ selectChild(child: Collection) {
63
+ this.parentId.set(this.findRootParentId(child));
64
+ this.collectionId.set(child.id);
65
+ this.activeFilter.set(null);
66
+ this.activeSearchWhere.set(null);
67
+ this.currentPage.set(1);
68
+ }
69
+
70
+ private findRootParentId(collection: Collection): number {
71
+ const all = this.collections();
72
+ let current = collection;
73
+ while (current.parent_id !== 0) {
74
+ const parent = all.find((c) => c.id === current.parent_id);
75
+ if (!parent) break;
76
+ current = parent;
77
+ }
78
+ return current.id;
79
+ }
80
+
81
+ selectFilter(filter: string) {
82
+ this.parentId.set(null);
83
+ this.collectionId.set(null);
84
+ this.activeFilter.set(filter);
85
+ this.activeSearchWhere.set(null);
86
+ this.currentPage.set(1);
87
+
88
+ const whereMap: Record<string, { key: string; value: number }[]> = {
89
+ all: [],
90
+ favorites: [{ key: 'store.favorite', value: 1 }],
91
+ system: [{ key: 'store.system', value: 1 }],
92
+ };
93
+
94
+ this.fetchCurrentPage({ where: whereMap[filter] ?? [] });
95
+ }
96
+
97
+ goToPage(page: number) {
98
+ const clamped = Math.max(1, Math.min(page, this.totalPages()));
99
+ if (clamped !== this.currentPage()) {
100
+ this.currentPage.set(clamped);
101
+ this.fetchCurrentPage();
102
+ }
103
+ }
104
+
105
+ nextPage() {
106
+ this.goToPage(this.currentPage() + 1);
107
+ }
108
+
109
+ prevPage() {
110
+ this.goToPage(this.currentPage() - 1);
111
+ }
112
+
113
+ firstPage() {
114
+ this.goToPage(1);
115
+ }
116
+
117
+ lastPage() {
118
+ this.goToPage(this.totalPages());
119
+ }
120
+
121
+ private fetchCurrentPage(extraOptions: any = {}) {
122
+ const skip = (this.currentPage() - 1) * this.pageSize();
123
+ const take = this.pageSize();
124
+
125
+ const searchWhere = this.activeSearchWhere();
126
+ if (searchWhere) {
127
+ const searchOrder = this.activeSearchOrder();
128
+ this.storeSearch({ where: searchWhere, skip, take, ...(searchOrder ? { order: searchOrder } : {}) });
129
+ return;
130
+ }
131
+
132
+ const collectionId = this.collectionId();
133
+ const filter = this.activeFilter();
134
+
135
+ const options: any = { skip, take, ...extraOptions };
136
+
137
+ if (collectionId) {
138
+ options.collectionId = collectionId;
139
+ } else if (filter) {
140
+ const whereMap: Record<string, { key: string; value: number }[]> = {
141
+ all: [],
142
+ favorites: [{ key: 'store.favorite', value: 1 }],
143
+ system: [{ key: 'store.system', value: 1 }],
144
+ };
145
+ options.where = whereMap[filter] ?? [];
146
+ }
147
+
148
+ this.storeFetch(options);
149
+ }
150
+
151
+ constructor() {
152
+ this.electron.ready.then(async () => {
153
+ const [collections, savedCollectionId, savedStoreId] = await Promise.all([
154
+ this.message.collectionFetch({}),
155
+ this.message.get(StorageType.CollectionId, null),
156
+ this.message.get(StorageType.StoreId, null),
157
+ ]);
158
+
159
+ this.collections.set(collections);
160
+ console.log('System Boot:', collections);
161
+
162
+ if (savedCollectionId) {
163
+ this.collectionId.set(savedCollectionId);
164
+ }
165
+
166
+ if (savedStoreId) {
167
+ this.storeId.set(savedStoreId);
168
+ }
169
+
170
+ this.fetchSystemStats();
171
+ });
172
+
173
+ effect(() => {
174
+ const collectionId = this.collectionId();
175
+ if (Number.isInteger(collectionId)) {
176
+ this.message.set(StorageType.CollectionId, collectionId);
177
+ this.fetchCurrentPage();
178
+ } else if (!this.activeSearchWhere() && !this.activeFilter()) {
179
+ this.stores.set([]);
180
+ this.storeCount.set(0);
181
+ }
182
+ });
183
+
184
+ effect(() => {
185
+ const storeId = this.storeId();
186
+ if (Number.isInteger(storeId)) {
187
+ this.message.set(StorageType.StoreId, storeId);
188
+ this.message.storeFindOneBy({ id: storeId }).then((store) => {
189
+ this.store.set(store);
190
+ if (store?.file_path) {
191
+ this.message.fontMetrics(store.file_path).then((metrics) => this.fontMetrics.set(metrics));
192
+ this.message.fontGlyphs(store.file_path).then((glyphs) => this.glyphs.set(glyphs));
193
+ } else {
194
+ this.fontMetrics.set(null);
195
+ this.glyphs.set([]);
196
+ }
197
+ });
198
+ } else {
199
+ this.store.set(null);
200
+ this.fontMetrics.set(null);
201
+ this.glyphs.set([]);
202
+ }
203
+ });
204
+ }
205
+
206
+ // Collection
207
+
208
+ collectionFind(args: any): Promise<Collection[]> {
209
+ return this.track(this.message.collectionFind(args));
210
+ }
211
+
212
+ collectionFindOne(args: any): Promise<Collection> {
213
+ return this.track(this.message.collectionFindOne(args));
214
+ }
215
+
216
+ collectionFindOneBy(args: any): Promise<Collection> {
217
+ return this.track(this.message.collectionFindOneBy(args));
218
+ }
219
+
220
+ collectionFetch(args: any): Promise<Collection[]> {
221
+ return this.track(this.message.collectionFetch(args));
222
+ }
223
+
224
+ collectionCreate(args: any): Promise<Collection[]> {
225
+ return this.track(
226
+ this.message.collectionCreate(args).then((result) => {
227
+ this.collections.set(result);
228
+ console.log('Collection Created:', result);
229
+ return result;
230
+ }),
231
+ );
232
+ }
233
+
234
+ collectionUpdate(collectionId: number, data: any): Promise<Collection[]> {
235
+ return this.track(
236
+ this.message.collectionUpdate(collectionId, data).then((result) => {
237
+ this.collections.set(result);
238
+ return result;
239
+ }),
240
+ );
241
+ }
242
+
243
+ collectionUpdateIds(ids: any[], data: any): Promise<Collection[]> {
244
+ return this.track(
245
+ this.message.collectionUpdateIds(ids, data).then((result) => {
246
+ this.collections.set(result);
247
+ return result;
248
+ }),
249
+ );
250
+ }
251
+
252
+ collectionDelete(collectionId: number): Promise<Collection[]> {
253
+ return this.track(
254
+ this.message.collectionDelete(collectionId).then((result) => {
255
+ this.collections.set(result);
256
+ return result;
257
+ }),
258
+ );
259
+ }
260
+
261
+ collectionEnable(collectionId: number, data: any): Promise<Collection[]> {
262
+ return this.track(
263
+ this.message.collectionEnable(collectionId, data).then((result) => {
264
+ this.collections.set(result);
265
+ return result;
266
+ }),
267
+ );
268
+ }
269
+
270
+ collectionUpdateCount(id: number): Promise<Collection[]> {
271
+ return this.track(
272
+ this.message.collectionUpdateCount(id).then((result) => {
273
+ this.collections.set(result);
274
+ return result;
275
+ }),
276
+ );
277
+ }
278
+
279
+ collectionUpdateCounts(): Promise<Collection[]> {
280
+ return this.track(
281
+ this.message.collectionUpdateCounts().then((result) => {
282
+ this.collections.set(result);
283
+ return result;
284
+ }),
285
+ );
286
+ }
287
+
288
+ collectionMove(collectionId: number, newParentId: number, newIndex: number): Promise<Collection[]> {
289
+ return this.track(
290
+ this.message.collectionMove(collectionId, newParentId, newIndex).then((result) => {
291
+ this.collections.set(result);
292
+ return result;
293
+ }),
294
+ );
295
+ }
296
+
297
+ // Store
298
+
299
+ storeFind(args: any): Promise<Store[]> {
300
+ return this.track(this.message.storeFind(args));
301
+ }
302
+
303
+ storeFindOne(args: any): Promise<Store> {
304
+ return this.track(this.message.storeFindOne(args));
305
+ }
306
+
307
+ storeFindOneBy(args: any): Promise<Store> {
308
+ return this.track(this.message.storeFindOneBy(args));
309
+ }
310
+
311
+ storeFetch(options: any): Promise<StoreManyAndCountType> {
312
+ return this.track(
313
+ this.message.storeFetch(options).then((result) => {
314
+ this.stores.set(result[0] as Store[]);
315
+ this.storeCount.set(result[1] as number);
316
+ return result;
317
+ }),
318
+ );
319
+ }
320
+
321
+ storeSearch(options: any): Promise<StoreManyAndCountType> {
322
+ return this.track(
323
+ this.message.storeSearch(options).then((result) => {
324
+ this.stores.set(result[0] as Store[]);
325
+ this.storeCount.set(result[1] as number);
326
+ return result;
327
+ }),
328
+ );
329
+ }
330
+
331
+ readonly activeSearchOrder = signal<{ column: string; direction: string } | null>(null);
332
+
333
+ selectSearch(where: { key: string; value: any }[], order?: { column: string; direction: string }) {
334
+ this.parentId.set(null);
335
+ this.collectionId.set(null);
336
+ this.activeFilter.set(null);
337
+ this.activeSearchWhere.set(where);
338
+ this.activeSearchOrder.set(order ?? null);
339
+ this.currentPage.set(1);
340
+ this.fetchCurrentPage();
341
+ }
342
+
343
+ clearSearch() {
344
+ this.activeSearchWhere.set(null);
345
+ this.activeSearchOrder.set(null);
346
+ this.stores.set([]);
347
+ this.storeCount.set(0);
348
+ }
349
+
350
+ storeUpdate(id: number, data: any): Promise<Store> {
351
+ return this.track(this.message.storeUpdate(id, data));
352
+ }
353
+
354
+ syncSystemFonts(): Promise<SystemStats> {
355
+ return this.track(
356
+ this.message.syncSystemFonts().then((result) => {
357
+ this.systemStats.set(result);
358
+ return result;
359
+ }),
360
+ );
361
+ }
362
+
363
+ resetFavorites(): Promise<SystemStats> {
364
+ return this.track(
365
+ this.message.resetFavorites().then((result) => {
366
+ this.systemStats.set(result);
367
+ return result;
368
+ }),
369
+ );
370
+ }
371
+
372
+ fetchSystemStats(): Promise<SystemStats> {
373
+ return this.track(
374
+ this.message.fetchSystemStats().then((result) => {
375
+ this.systemStats.set(result);
376
+ return result;
377
+ }),
378
+ );
379
+ }
380
+
381
+ // Logger
382
+
383
+ log(message: string, type: number): Promise<Logger[]> {
384
+ return this.track(this.message.loggerCreate(message, type));
385
+ }
386
+
387
+ loggerFind(args: any): Promise<Logger[]> {
388
+ return this.track(this.message.loggerFind(args));
389
+ }
390
+
391
+ loggerFindOne(args: any): Promise<Logger> {
392
+ return this.track(this.message.loggerFindOne(args));
393
+ }
394
+
395
+ loggerFindOneBy(args: any): Promise<Logger> {
396
+ return this.track(this.message.loggerFindOneBy(args));
397
+ }
398
+
399
+ loggerCreate(message: string, type: number): Promise<Logger[]> {
400
+ return this.track(this.message.loggerCreate(message, type));
401
+ }
402
+
403
+ loggerDelete(id: number): Promise<Logger[]> {
404
+ return this.track(this.message.loggerDelete(id));
405
+ }
406
+
407
+ loggerTruncate(): Promise<Logger[]> {
408
+ return this.track(this.message.loggerTruncate());
409
+ }
410
+ }