imcp 0.1.7 → 0.1.8-dev

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 (314) hide show
  1. package/dist/cli/commands/install.js +1 -106
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js +1 -90
  4. package/dist/cli/commands/list.js.map +1 -0
  5. package/dist/cli/commands/pull.js +1 -16
  6. package/dist/cli/commands/pull.js.map +1 -0
  7. package/dist/cli/commands/serve.js +1 -33
  8. package/dist/cli/commands/serve.js.map +1 -0
  9. package/dist/cli/commands/uninstall.js +1 -46
  10. package/dist/cli/commands/uninstall.js.map +1 -0
  11. package/dist/cli/index.js +1 -65
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
  14. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  15. package/dist/core/installers/clients/ClientInstaller.js +1 -163
  16. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  17. package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
  18. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  19. package/dist/core/installers/clients/ClineInstaller.js +1 -30
  20. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  21. package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
  22. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  23. package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
  24. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  25. package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
  26. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  27. package/dist/core/installers/index.js +1 -8
  28. package/dist/core/installers/index.js.map +1 -0
  29. package/dist/core/installers/requirements/BaseInstaller.js +1 -56
  30. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  31. package/dist/core/installers/requirements/CommandInstaller.js +1 -213
  32. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  33. package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
  34. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  35. package/dist/core/installers/requirements/InstallerFactory.js +1 -99
  36. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  37. package/dist/core/installers/requirements/NpmInstaller.js +1 -235
  38. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  39. package/dist/core/installers/requirements/NugetInstaller.js +1 -188
  40. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  41. package/dist/core/installers/requirements/PipInstaller.js +1 -192
  42. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  43. package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
  44. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  45. package/dist/core/loaders/ConfigurationLoader.js +1 -256
  46. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  47. package/dist/core/loaders/ConfigurationProvider.js +1 -383
  48. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  49. package/dist/core/loaders/InstallOperationManager.js +1 -310
  50. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  51. package/dist/core/loaders/ServerSchemaLoader.js +1 -108
  52. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  53. package/dist/core/loaders/ServerSchemaProvider.js +1 -89
  54. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  55. package/dist/core/loaders/SystemSettingsManager.js +1 -256
  56. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  57. package/dist/core/metadatas/constants.js +1 -100
  58. package/dist/core/metadatas/constants.js.map +1 -0
  59. package/dist/core/metadatas/recordingConstants.js +1 -46
  60. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  61. package/dist/core/metadatas/types.js +1 -15
  62. package/dist/core/metadatas/types.js.map +1 -0
  63. package/dist/core/onboard/FeedOnboardService.js +1 -422
  64. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  65. package/dist/core/onboard/OnboardProcessor.js +1 -333
  66. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  67. package/dist/core/onboard/OnboardStatus.js +1 -9
  68. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  69. package/dist/core/onboard/OnboardStatusManager.js +1 -360
  70. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  71. package/dist/core/validators/FeedValidator.js +1 -133
  72. package/dist/core/validators/FeedValidator.js.map +1 -0
  73. package/dist/core/validators/IServerValidator.js +1 -1
  74. package/dist/core/validators/IServerValidator.js.map +1 -0
  75. package/dist/core/validators/SSEServerValidator.js +1 -38
  76. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  77. package/dist/core/validators/ServerValidatorFactory.js +1 -44
  78. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  79. package/dist/core/validators/StdioServerValidator.js +1 -281
  80. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  81. package/dist/index.js +1 -18
  82. package/dist/index.js.map +1 -0
  83. package/dist/services/InstallationService.js +1 -81
  84. package/dist/services/InstallationService.js.map +1 -0
  85. package/dist/services/MCPManager.js +1 -197
  86. package/dist/services/MCPManager.js.map +1 -0
  87. package/dist/services/RequirementService.js +1 -548
  88. package/dist/services/RequirementService.js.map +1 -0
  89. package/dist/services/ServerService.js +1 -127
  90. package/dist/services/ServerService.js.map +1 -0
  91. package/dist/services/TelemetryService.js +1 -53
  92. package/dist/services/TelemetryService.js.map +1 -0
  93. package/dist/utils/UpdateCheckTracker.js +1 -79
  94. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  95. package/dist/utils/adoUtils.js +1 -254
  96. package/dist/utils/adoUtils.js.map +1 -0
  97. package/dist/utils/clientUtils.js +1 -65
  98. package/dist/utils/clientUtils.js.map +1 -0
  99. package/dist/utils/feedUtils.js +1 -28
  100. package/dist/utils/feedUtils.js.map +1 -0
  101. package/dist/utils/githubAuth.js +1 -177
  102. package/dist/utils/githubAuth.js.map +1 -0
  103. package/dist/utils/githubUtils.js +1 -125
  104. package/dist/utils/githubUtils.js.map +1 -0
  105. package/dist/utils/logger.js +1 -176
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/macroExpressionUtils.js +1 -93
  108. package/dist/utils/macroExpressionUtils.js.map +1 -0
  109. package/dist/utils/osUtils.js +1 -664
  110. package/dist/utils/osUtils.js.map +1 -0
  111. package/dist/utils/versionUtils.js +1 -101
  112. package/dist/utils/versionUtils.js.map +1 -0
  113. package/dist/web/contract/serverContract.js +1 -1
  114. package/dist/web/contract/serverContract.js.map +1 -0
  115. package/dist/web/public/js/api.js +2 -132
  116. package/dist/web/public/js/api.js.map +1 -0
  117. package/dist/web/public/js/detailsWidget.js +2 -264
  118. package/dist/web/public/js/detailsWidget.js.map +1 -0
  119. package/dist/web/public/js/flights/flights.js +2 -127
  120. package/dist/web/public/js/flights/flights.js.map +1 -0
  121. package/dist/web/public/js/modal/index.js +2 -52
  122. package/dist/web/public/js/modal/index.js.map +1 -0
  123. package/dist/web/public/js/modal/installModal.js +2 -162
  124. package/dist/web/public/js/modal/installModal.js.map +1 -0
  125. package/dist/web/public/js/modal/installation.js +2 -266
  126. package/dist/web/public/js/modal/installation.js.map +1 -0
  127. package/dist/web/public/js/modal/loadingModal.js +2 -182
  128. package/dist/web/public/js/modal/loadingModal.js.map +1 -0
  129. package/dist/web/public/js/modal/modalSetup.js +2 -595
  130. package/dist/web/public/js/modal/modalSetup.js.map +1 -0
  131. package/dist/web/public/js/modal/modalUtils.js +2 -37
  132. package/dist/web/public/js/modal/modalUtils.js.map +1 -0
  133. package/dist/web/public/js/modal/versionUtils.js +2 -20
  134. package/dist/web/public/js/modal/versionUtils.js.map +1 -0
  135. package/dist/web/public/js/modal.js +2 -42
  136. package/dist/web/public/js/modal.js.map +1 -0
  137. package/dist/web/public/js/notifications.js +2 -137
  138. package/dist/web/public/js/notifications.js.map +1 -0
  139. package/dist/web/public/js/onboard/formProcessor.js +2 -1037
  140. package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
  141. package/dist/web/public/js/onboard/index.js +2 -374
  142. package/dist/web/public/js/onboard/index.js.map +1 -0
  143. package/dist/web/public/js/onboard/publishHandler.js +2 -172
  144. package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
  145. package/dist/web/public/js/onboard/state.js +2 -76
  146. package/dist/web/public/js/onboard/state.js.map +1 -0
  147. package/dist/web/public/js/onboard/templates.js +2 -342
  148. package/dist/web/public/js/onboard/templates.js.map +1 -0
  149. package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
  150. package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
  151. package/dist/web/public/js/onboard/validationHandlers.js +2 -493
  152. package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
  153. package/dist/web/public/js/serverCategoryDetails.js +2 -364
  154. package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
  155. package/dist/web/public/js/serverCategoryList.js +2 -241
  156. package/dist/web/public/js/serverCategoryList.js.map +1 -0
  157. package/dist/web/public/js/settings.js +2 -314
  158. package/dist/web/public/js/settings.js.map +1 -0
  159. package/dist/web/server.js +1 -404
  160. package/dist/web/server.js.map +1 -0
  161. package/package.json +8 -2
  162. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  163. package/.github/acl/access.yml +0 -20
  164. package/.github/compliance/inventory.yml +0 -5
  165. package/.github/policies/jit.yml +0 -19
  166. package/.github/workflows/build.yml +0 -28
  167. package/.roo/rules-code/rules.md +0 -88
  168. package/dist/cli/commands/start.d.ts +0 -2
  169. package/dist/cli/commands/start.js +0 -32
  170. package/dist/cli/commands/sync.d.ts +0 -2
  171. package/dist/cli/commands/sync.js +0 -17
  172. package/dist/core/ConfigurationLoader.d.ts +0 -32
  173. package/dist/core/ConfigurationLoader.js +0 -236
  174. package/dist/core/ConfigurationProvider.d.ts +0 -35
  175. package/dist/core/ConfigurationProvider.js +0 -375
  176. package/dist/core/InstallationService.d.ts +0 -50
  177. package/dist/core/InstallationService.js +0 -350
  178. package/dist/core/MCPManager.d.ts +0 -28
  179. package/dist/core/MCPManager.js +0 -188
  180. package/dist/core/RequirementService.d.ts +0 -40
  181. package/dist/core/RequirementService.js +0 -110
  182. package/dist/core/ServerSchemaLoader.d.ts +0 -11
  183. package/dist/core/ServerSchemaLoader.js +0 -43
  184. package/dist/core/ServerSchemaProvider.d.ts +0 -17
  185. package/dist/core/ServerSchemaProvider.js +0 -120
  186. package/dist/core/constants.d.ts +0 -47
  187. package/dist/core/constants.js +0 -94
  188. package/dist/core/installers/BaseInstaller.d.ts +0 -74
  189. package/dist/core/installers/BaseInstaller.js +0 -253
  190. package/dist/core/installers/ClientInstaller.d.ts +0 -23
  191. package/dist/core/installers/ClientInstaller.js +0 -564
  192. package/dist/core/installers/CommandInstaller.d.ts +0 -37
  193. package/dist/core/installers/CommandInstaller.js +0 -173
  194. package/dist/core/installers/GeneralInstaller.d.ts +0 -33
  195. package/dist/core/installers/GeneralInstaller.js +0 -85
  196. package/dist/core/installers/InstallerFactory.d.ts +0 -54
  197. package/dist/core/installers/InstallerFactory.js +0 -97
  198. package/dist/core/installers/NpmInstaller.d.ts +0 -26
  199. package/dist/core/installers/NpmInstaller.js +0 -127
  200. package/dist/core/installers/PipInstaller.d.ts +0 -28
  201. package/dist/core/installers/PipInstaller.js +0 -127
  202. package/dist/core/installers/RequirementInstaller.d.ts +0 -33
  203. package/dist/core/installers/RequirementInstaller.js +0 -3
  204. package/dist/core/types.d.ts +0 -166
  205. package/dist/core/types.js +0 -16
  206. package/dist/services/InstallRequestValidator.d.ts +0 -21
  207. package/dist/services/InstallRequestValidator.js +0 -99
  208. package/dist/web/public/js/modal/installHandler.js +0 -227
  209. package/dist/web/public/js/modal/loadingUI.js +0 -74
  210. package/dist/web/public/js/modal/messageQueue.js +0 -112
  211. package/dist/web/public/js/modal/modalUI.js +0 -214
  212. package/dist/web/public/js/modal/version.js +0 -20
  213. package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
  214. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  215. package/docs/Telemetry.md +0 -136
  216. package/memory-bank/activeContext.md +0 -26
  217. package/memory-bank/decisionLog.md +0 -91
  218. package/memory-bank/productContext.md +0 -41
  219. package/memory-bank/progress.md +0 -35
  220. package/memory-bank/systemPatterns.md +0 -10
  221. package/src/cli/commands/install.ts +0 -139
  222. package/src/cli/commands/list.ts +0 -113
  223. package/src/cli/commands/pull.ts +0 -16
  224. package/src/cli/commands/serve.ts +0 -39
  225. package/src/cli/commands/uninstall.ts +0 -64
  226. package/src/cli/index.ts +0 -82
  227. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  228. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  229. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  230. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  231. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  232. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  233. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  234. package/src/core/installers/index.ts +0 -11
  235. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  236. package/src/core/installers/requirements/CommandInstaller.ts +0 -231
  237. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  238. package/src/core/installers/requirements/InstallerFactory.ts +0 -114
  239. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  240. package/src/core/installers/requirements/NugetInstaller.ts +0 -203
  241. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  242. package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
  243. package/src/core/loaders/ConfigurationLoader.ts +0 -298
  244. package/src/core/loaders/ConfigurationProvider.ts +0 -462
  245. package/src/core/loaders/InstallOperationManager.ts +0 -367
  246. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  247. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  248. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  249. package/src/core/metadatas/constants.ts +0 -122
  250. package/src/core/metadatas/recordingConstants.ts +0 -65
  251. package/src/core/metadatas/types.ts +0 -202
  252. package/src/core/onboard/FeedOnboardService.ts +0 -501
  253. package/src/core/onboard/OnboardProcessor.ts +0 -356
  254. package/src/core/onboard/OnboardStatus.ts +0 -60
  255. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  256. package/src/core/validators/FeedValidator.ts +0 -135
  257. package/src/core/validators/IServerValidator.ts +0 -21
  258. package/src/core/validators/SSEServerValidator.ts +0 -43
  259. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  260. package/src/core/validators/StdioServerValidator.ts +0 -313
  261. package/src/index.ts +0 -44
  262. package/src/services/InstallationService.ts +0 -102
  263. package/src/services/MCPManager.ts +0 -249
  264. package/src/services/RequirementService.ts +0 -627
  265. package/src/services/ServerService.ts +0 -161
  266. package/src/services/TelemetryService.ts +0 -59
  267. package/src/utils/UpdateCheckTracker.ts +0 -86
  268. package/src/utils/adoUtils.ts +0 -293
  269. package/src/utils/clientUtils.ts +0 -72
  270. package/src/utils/feedUtils.ts +0 -31
  271. package/src/utils/githubAuth.ts +0 -212
  272. package/src/utils/githubUtils.ts +0 -164
  273. package/src/utils/logger.ts +0 -195
  274. package/src/utils/macroExpressionUtils.ts +0 -104
  275. package/src/utils/osUtils.ts +0 -700
  276. package/src/utils/versionUtils.ts +0 -114
  277. package/src/web/contract/serverContract.ts +0 -74
  278. package/src/web/public/css/detailsWidget.css +0 -235
  279. package/src/web/public/css/modal.css +0 -757
  280. package/src/web/public/css/notifications.css +0 -101
  281. package/src/web/public/css/onboard.css +0 -107
  282. package/src/web/public/css/serverCategoryList.css +0 -120
  283. package/src/web/public/css/serverDetails.css +0 -139
  284. package/src/web/public/index.html +0 -359
  285. package/src/web/public/js/api.js +0 -132
  286. package/src/web/public/js/detailsWidget.js +0 -264
  287. package/src/web/public/js/flights/flights.js +0 -127
  288. package/src/web/public/js/modal/index.js +0 -52
  289. package/src/web/public/js/modal/installModal.js +0 -162
  290. package/src/web/public/js/modal/installation.js +0 -266
  291. package/src/web/public/js/modal/loadingModal.js +0 -182
  292. package/src/web/public/js/modal/modalSetup.js +0 -595
  293. package/src/web/public/js/modal/modalUtils.js +0 -37
  294. package/src/web/public/js/modal/versionUtils.js +0 -20
  295. package/src/web/public/js/modal.js +0 -42
  296. package/src/web/public/js/notifications.js +0 -137
  297. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  298. package/src/web/public/js/onboard/index.js +0 -374
  299. package/src/web/public/js/onboard/publishHandler.js +0 -172
  300. package/src/web/public/js/onboard/state.js +0 -76
  301. package/src/web/public/js/onboard/templates.js +0 -342
  302. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  303. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  304. package/src/web/public/js/serverCategoryDetails.js +0 -364
  305. package/src/web/public/js/serverCategoryList.js +0 -241
  306. package/src/web/public/js/settings.js +0 -314
  307. package/src/web/public/modal.html +0 -84
  308. package/src/web/public/onboard.html +0 -296
  309. package/src/web/public/settings.html +0 -135
  310. package/src/web/public/styles.css +0 -277
  311. package/src/web/server.ts +0 -478
  312. package/tsconfig.json +0 -18
  313. package/wiki/Installation.md +0 -3
  314. package/wiki/Publish.md +0 -3
@@ -1,374 +0,0 @@
1
- import {
2
- addServer,
3
- // removeServer, // Not directly used by index.js listeners, uiHandlers makes it global
4
- // addEnvVariable, // Not directly used by index.js listeners, uiHandlers makes it global
5
- // removeEnvVariable, // Not directly used by index.js listeners, uiHandlers makes it global
6
- toggleViewMode,
7
- saveJsonData,
8
- copyJsonToClipboard,
9
- toggleSectionContent
10
- } from './uiHandlers.js';
11
-
12
- import {
13
- // submitForm, // Will be replaced by handlePublish for async behavior
14
- populateForm,
15
- resetOnboardFormDynamicContent,
16
- // getFormData // Used internally by validation/publish handlers
17
- } from './formProcessor.js';
18
-
19
- // state and setServerCounter are likely not needed directly in index.js anymore
20
- // import { state, setServerCounter } from './state.js';
21
- import { showToast } from '../notifications.js';
22
- import { handleValidation } from './validationHandlers.js';
23
- import { handlePublish } from './publishHandler.js'; // Moved handlePublish to its own file
24
-
25
- // Modal functions (as per original)
26
- export function showOnboardModal() {
27
- window.location.href = 'onboard.html';
28
- }
29
-
30
- // Make functions available globally (as per original)
31
- window.showOnboardModal = showOnboardModal;
32
-
33
- let activeTab = 'create-category'; // 'create-category' or 'create-server'
34
- let categoriesLoaded = false;
35
- let currentSelectedCategoryData = null;
36
- window.isEditingCategory = false; // Flag to indicate if editing an existing category on the first tab
37
-
38
- // Load existing category data if editing (primarily for "Create New Category" tab in edit mode)
39
- async function loadExistingCategoryForEdit() {
40
- const urlParams = new URLSearchParams(window.location.search);
41
- const categoryName = urlParams.get('category');
42
- const editMode = urlParams.get('action') === 'edit';
43
-
44
- window.isEditingCategory = false; // Reset flag
45
-
46
- if (categoryName && editMode) {
47
- // This implies editing a whole category, so activate the first tab.
48
- document.getElementById('tab-create-category').click();
49
- try {
50
- const response = await fetch(`/api/categories/${categoryName}`);
51
- if (!response.ok) {
52
- throw new Error(`HTTP error! status: ${response.status}`);
53
- }
54
- const result = await response.json();
55
- if (result.success && result.data) {
56
- // populateForm for the 'Create New Category' tab
57
- populateForm(result.data.feedConfiguration, 'onboardForm');
58
- // Set category name input as readonly if it's an update
59
- const categoryNameInput = document.querySelector('#panel-create-category input[name="name"]');
60
- if (categoryNameInput) {
61
- categoryNameInput.readOnly = true;
62
- categoryNameInput.classList.add('bg-gray-100', 'cursor-not-allowed');
63
- }
64
- window.isEditingCategory = true; // Set flag as we are editing
65
- } else {
66
- throw new Error(result.error || 'Failed to load category data.');
67
- }
68
- } catch (error) {
69
- console.error('Error loading category for editing:', error);
70
- showToast(`Error loading category for editing: ${error.message}`, 'error');
71
- window.isEditingCategory = false;
72
- }
73
- } else if (categoryName && !editMode) {
74
- // This could imply pre-selecting a category in the "Create New Server in Existing Category" tab
75
- // For now, we handle this by just loading the categories and letting the user select.
76
- // Future enhancement: pre-select if categoryName is provided without 'action=edit'.
77
- if (document.getElementById('tab-create-server')) {
78
- document.getElementById('tab-create-server').click(); // Switch to the correct tab
79
- }
80
- }
81
- }
82
-
83
-
84
- async function loadAndPopulateCategoriesDropdown() {
85
- if (categoriesLoaded) return;
86
-
87
- const selectElement = document.getElementById('existingCategorySelect');
88
- if (!selectElement) return;
89
-
90
- selectElement.innerHTML = '<option value="">Loading categories...</option>';
91
- try {
92
- const response = await fetch('/api/categories?local=true'); // Assuming local=true fetches editable categories
93
- if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
94
- const result = await response.json();
95
-
96
- if (result.success && Array.isArray(result.data)) {
97
- selectElement.innerHTML = '<option value="">Select a category</option>';
98
- result.data.forEach(category => {
99
- const option = document.createElement('option');
100
- option.value = category.name;
101
- option.textContent = category.displayName || category.name;
102
- selectElement.appendChild(option);
103
- });
104
- categoriesLoaded = true;
105
- } else {
106
- throw new Error(result.error || 'Failed to load categories.');
107
- }
108
- } catch (error) {
109
- console.error('Error loading categories:', error);
110
- selectElement.innerHTML = '<option value="">Error loading categories</option>';
111
- showToast(`Error loading categories: ${error.message}`, 'error');
112
- }
113
- }
114
-
115
- async function handleExistingCategorySelection(event) {
116
- const categoryName = event.target.value;
117
- // const selectElement = event.target; // Removed diagnostic log related variable
118
- // console.log(`[index.js] handleExistingCategorySelection: Category '${categoryName}' selected. Dropdown display value: ${selectElement.options[selectElement.selectedIndex].text}, actual value: ${categoryName}`); // Removed diagnostic log
119
- const basicInfoContainer = document.getElementById('existingCategoryBasicInfoContainer');
120
- const mcpServersContainer = document.getElementById('existingCategoryMcpServersContainer');
121
- const serversList = document.getElementById('existingCategoryServersList'); // Target for servers
122
- // console.log(`[index.js] Before changes - mcpServersContainer hidden: ${mcpServersContainer.classList.contains('hidden')}, serversList children: ${serversList.children.length}`); // Removed diagnostic log
123
- // Clear previous category details
124
- serversList.innerHTML = ''; // Clear out old servers
125
- document.querySelector('#existingCategoryBasicInfoContainer input[name="name"]').value = '';
126
- document.querySelector('#existingCategoryBasicInfoContainer input[name="displayName"]').value = '';
127
- document.querySelector('#existingCategoryBasicInfoContainer textarea[name="description"]').value = '';
128
- document.querySelector('#existingCategoryBasicInfoContainer input[name="repository"]').value = '';
129
-
130
-
131
- if (!categoryName) {
132
- basicInfoContainer.classList.add('hidden');
133
- mcpServersContainer.classList.add('hidden');
134
- currentSelectedCategoryData = null;
135
- return;
136
- }
137
-
138
- try {
139
- const response = await fetch(`/api/categories/${categoryName}`);
140
- if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
141
- const result = await response.json();
142
-
143
- if (result.success && result.data && result.data.feedConfiguration) {
144
- currentSelectedCategoryData = result.data.feedConfiguration;
145
-
146
- // Populate Basic Information (read-only)
147
- const form = document.getElementById('onboardServerForm'); // Form for the second tab
148
- form.querySelector('input[name="name"]').value = currentSelectedCategoryData.name || '';
149
- form.querySelector('input[name="displayName"]').value = currentSelectedCategoryData.displayName || '';
150
- form.querySelector('textarea[name="description"]').value = currentSelectedCategoryData.description || '';
151
- form.querySelector('input[name="repository"]').value = currentSelectedCategoryData.repository || '';
152
-
153
- basicInfoContainer.classList.remove('hidden');
154
- mcpServersContainer.classList.remove('hidden');
155
- // console.log(`[index.js] After making containers visible - mcpServersContainer hidden: ${mcpServersContainer.classList.contains('hidden')}`); // Ensure this is removed
156
-
157
- // Populate MCP Servers (existing ones as read-only)
158
- // populateForm will need to be adapted or a new function created to handle read-only state
159
- // and target the correct server list.
160
- // For now, let's assume populateForm can handle this or we'll call a specialized version.
161
- if (currentSelectedCategoryData.mcpServers && currentSelectedCategoryData.mcpServers.length > 0) {
162
- // This will call populateForm which needs to be aware of the context (read-only for existing servers)
163
- // We pass 'onboardServerForm' to indicate the target form context.
164
- // And 'existingCategoryServersList' for where servers should be rendered.
165
- // The 'true' flag indicates these are existing servers and should be read-only.
166
- populateForm(currentSelectedCategoryData, 'onboardServerForm', true); // This calls reset and then populates
167
-
168
- // Ensure the container is visible after populating. This was the key fix.
169
- mcpServersContainer.classList.remove('hidden');
170
- // const isMcpContainerHiddenAfterPopulate = mcpServersContainer.classList.contains('hidden'); // Removed diagnostic log variable
171
- // console.log(`[index.js] After populateForm AND EXPLICIT RE-SHOW - mcpServersContainer hidden: ${isMcpContainerHiddenAfterPopulate}, serversList children: ${serversList.children.length}`); // Removed diagnostic log
172
-
173
- // const firstServerItem = serversList.querySelector('.server-item'); // Removed diagnostic log block
174
- // if (firstServerItem) {
175
- // const styles = window.getComputedStyle(firstServerItem);
176
- // console.log(`[index.js] First server item in serversList computed display: ${styles.display}, visibility: ${styles.visibility}`);
177
- // } else if (currentSelectedCategoryData.mcpServers && currentSelectedCategoryData.mcpServers.length > 0) {
178
- // console.warn("[index.js] populateForm was called for servers, but no .server-item found in serversList afterwards.");
179
- // }
180
- } else {
181
- serversList.innerHTML = '<p class="text-gray-500">No servers defined in this category yet. You can add new ones.</p>';
182
- // console.log("[index.js] No MCP servers in this category (innerHTML set)."); // Removed diagnostic log
183
- }
184
- // Ensure "Add MCP Server" button is enabled for this tab
185
- const addServerBtnExisting = mcpServersContainer.querySelector('button[onclick*="addServer"]');
186
- if (addServerBtnExisting) addServerBtnExisting.disabled = false;
187
-
188
- } else {
189
- throw new Error(result.error || 'Failed to load category details.');
190
- }
191
- } catch (error) {
192
- console.error('[index.js] Error in handleExistingCategorySelection (fetch/parse block):', error); // Keep this more specific error log
193
- showToast(`Error fetching category details: ${error.message}`, 'error');
194
- basicInfoContainer.classList.add('hidden');
195
- mcpServersContainer.classList.add('hidden');
196
- currentSelectedCategoryData = null;
197
- }
198
- }
199
-
200
- // Initialize event listeners
201
- document.addEventListener('DOMContentLoaded', async () => {
202
- // Load existing category data if URL indicates edit mode for the first tab
203
- await loadExistingCategoryForEdit();
204
-
205
- // Remove old form submit handlers, as publish buttons will now handle submission with polling
206
- // const onboardForm = document.getElementById('onboardForm');
207
- // if (onboardForm) {
208
- // onboardForm.addEventListener('submit', (event) => submitForm(event, 'create-category', currentSelectedCategoryData));
209
- // }
210
- // const onboardServerForm = document.getElementById('onboardServerForm');
211
- // if (onboardServerForm) {
212
- // onboardServerForm.addEventListener('submit', (event) => submitForm(event, 'create-server', currentSelectedCategoryData));
213
- // }
214
-
215
- const existingCategorySelect = document.getElementById('existingCategorySelect');
216
- if (existingCategorySelect) {
217
- existingCategorySelect.addEventListener('change', handleExistingCategorySelection);
218
- }
219
-
220
- // Setup tab switching functionality
221
- const tabCreateCategory = document.getElementById('tab-create-category');
222
- const tabCreateServer = document.getElementById('tab-create-server');
223
- const panelCreateCategory = document.getElementById('panel-create-category');
224
- const panelCreateServer = document.getElementById('panel-create-server');
225
-
226
- if (tabCreateCategory && tabCreateServer && panelCreateCategory && panelCreateServer) {
227
- function switchTab(targetTab) {
228
- if (targetTab === activeTab) {
229
- // If the clicked tab is already the active tab, do nothing.
230
- return;
231
- }
232
- const viewModeToggle = document.getElementById('viewModeToggle');
233
- const isJsonView = viewModeToggle.checked;
234
-
235
- if (isJsonView) {
236
- // If JSON view is active, switch back to form view first.
237
- // This will hide the JSON panel and show the form panel of the *currently active* tab.
238
- const currentFormIdForJsonExit = activeTab === 'create-category' ? 'onboardForm' : 'onboardServerForm';
239
- const currentServersListIdForJsonExit = activeTab === 'create-category' ? 'serversList' : 'existingCategoryServersList';
240
- const baseDataForJsonExit = activeTab === 'create-server' ? currentSelectedCategoryData : null;
241
- const isExistingCategoryForJsonExit = activeTab === 'create-server';
242
-
243
- toggleViewMode(false, currentFormIdForJsonExit, currentServersListIdForJsonExit, baseDataForJsonExit, isExistingCategoryForJsonExit);
244
- // Ensure the toggle reflects the change back to form view
245
- viewModeToggle.checked = false;
246
- }
247
-
248
- if (targetTab === 'create-category') {
249
- activeTab = 'create-category';
250
- tabCreateCategory.classList.add('text-blue-600', 'border-blue-600');
251
- tabCreateCategory.classList.remove('text-gray-600', 'border-transparent', 'hover:border-blue-600');
252
- tabCreateServer.classList.remove('text-blue-600', 'border-blue-600');
253
- tabCreateServer.classList.add('text-gray-600', 'border-transparent', 'hover:border-blue-600');
254
-
255
- panelCreateCategory.classList.remove('hidden');
256
- panelCreateServer.classList.add('hidden');
257
- // Removed automatic reset of 'onboardForm' when switching to 'create-category' tab
258
- // to preserve form content when tabbing away and back in non-edit scenarios.
259
- // The form is reset by default on page load if not editing,
260
- // or specifically when loading an existing category for edit.
261
- } else if (targetTab === 'create-server') {
262
- activeTab = 'create-server';
263
- tabCreateServer.classList.add('text-blue-600', 'border-blue-600');
264
- tabCreateServer.classList.remove('text-gray-600', 'border-transparent', 'hover:border-blue-600');
265
- tabCreateCategory.classList.remove('text-blue-600', 'border-blue-600');
266
- tabCreateCategory.classList.add('text-gray-600', 'border-transparent', 'hover:border-blue-600');
267
-
268
- panelCreateServer.classList.remove('hidden');
269
- panelCreateCategory.classList.add('hidden');
270
- // console.log(`[index.js] switchTab to 'create-server': panelCreateServer hidden: ${panelCreateServer.classList.contains('hidden')}, existingCategoryMcpServersContainer hidden: ${document.getElementById('existingCategoryMcpServersContainer').classList.contains('hidden')}`); // Ensure this is removed
271
- loadAndPopulateCategoriesDropdown(); // Load categories if not already loaded
272
- }
273
- // At this point, we are definitely in a form view (either switched from JSON or was already in form view).
274
- // The JSON editor panel should be hidden.
275
- const jsonEditorPanel = document.getElementById('panel-json-editor');
276
- if (jsonEditorPanel) { // Ensure it exists
277
- jsonEditorPanel.classList.add('hidden');
278
- }
279
- }
280
-
281
- tabCreateCategory.addEventListener('click', () => switchTab('create-category'));
282
- tabCreateServer.addEventListener('click', () => switchTab('create-server'));
283
-
284
- // Set initial tab based on activeTab (default 'create-category')
285
- // switchTab(activeTab); // Initial call might be problematic if DOM isn't fully ready for it.
286
- // loadExistingCategoryForEdit might click a tab, making this redundant or causing issues.
287
- // Let's rely on default HTML state or explicit clicks.
288
- }
289
-
290
- // Initialize button handlers
291
- // const addRequirementBtn = document.getElementById('addRequirementBtn');
292
- // if (addRequirementBtn) {
293
- // addRequirementBtn.addEventListener('click', addRequirement); // addRequirement from uiHandlers.js
294
- // }
295
-
296
- const addServerBtnNewCategory = document.getElementById('addServerBtnNewCategory'); // For "Create New Category" tab
297
- if (addServerBtnNewCategory) {
298
- // addServer in uiHandlers defaults serversListId to 'serversList', which is correct for this button.
299
- // It also defaults isReadOnly to false.
300
- addServerBtnNewCategory.addEventListener('click', () => window.addServer('serversList', false, null));
301
- }
302
-
303
- const addServerBtnExistingCategory = document.getElementById('addServerToExistingCategoryBtn'); // For "Create Server in Existing Category" tab
304
- if (addServerBtnExistingCategory) {
305
- addServerBtnExistingCategory.addEventListener('click', () => {
306
- // console.log('[index.js] "Add MCP Server" button clicked for EXISTING CATEGORY tab.'); // Kept for verbosity if needed
307
- console.log('[index.js] "Add MCP Server" button clicked for EXISTING CATEGORY tab.');
308
- // Explicitly pass the correct serversListId and ensure isReadOnly is false for new servers.
309
- addServer('existingCategoryServersList', false, null);
310
- });
311
- }
312
-
313
- // Validation buttons
314
- const validateButtonNewCategory = document.getElementById('validateButtonNewCategory');
315
- if (validateButtonNewCategory) {
316
- validateButtonNewCategory.addEventListener('click', (event) => handleValidation(event, 'create-category', currentSelectedCategoryData));
317
- }
318
- const validateButtonExistingCategory = document.getElementById('validateButtonExistingCategory');
319
- if (validateButtonExistingCategory) {
320
- validateButtonExistingCategory.addEventListener('click', (event) => handleValidation(event, 'create-server', currentSelectedCategoryData));
321
- }
322
-
323
- // Publish buttons
324
- const publishButtonNewCategory = document.getElementById('publishButtonNewCategory');
325
- if (publishButtonNewCategory) {
326
- publishButtonNewCategory.addEventListener('click', (event) => {
327
- handlePublish(event, 'create-category', currentSelectedCategoryData, window.isEditingCategory);
328
- });
329
- }
330
- const publishButtonExistingCategory = document.getElementById('publishButtonExistingCategory');
331
- if (publishButtonExistingCategory) {
332
- publishButtonExistingCategory.addEventListener('click', (event) => {
333
- // Publishing from "Create Server in Existing Category" tab is always an update to that category.
334
- handlePublish(event, 'create-server', currentSelectedCategoryData, true);
335
- });
336
- }
337
-
338
- const viewModeToggle = document.getElementById('viewModeToggle');
339
- if (viewModeToggle) {
340
- viewModeToggle.addEventListener('change', (event) => {
341
- const currentFormId = activeTab === 'create-category' ? 'onboardForm' : 'onboardServerForm';
342
- const currentServersListId = activeTab === 'create-category' ? 'serversList' : 'existingCategoryServersList';
343
- toggleViewMode(event.target.checked, currentFormId, currentServersListId, activeTab === 'create-server' ? currentSelectedCategoryData : null, activeTab === 'create-server');
344
- });
345
- }
346
-
347
- const saveJsonButton = document.getElementById('saveJsonButton');
348
- if (saveJsonButton) {
349
- saveJsonButton.addEventListener('click', () => saveJsonData(activeTab, currentSelectedCategoryData));
350
- }
351
-
352
- // A button to trigger copyJsonToClipboard might exist, e.g.
353
- const copyJsonBtn = document.getElementById('copyJsonButton'); // Assuming an ID like 'copyJsonButton'
354
- if (copyJsonBtn) {
355
- copyJsonBtn.addEventListener('click', copyJsonToClipboard); // copyJsonToClipboard from uiHandlers.js
356
- }
357
-
358
- // Expose necessary functions to window for HTML event handlers.
359
- // Functions from uiHandlers.js (addServer, removeServer, etc., toggleSectionContent, copyJsonToClipboard)
360
- // are already made global by uiHandlers.js itself.
361
- // We only need to expose functions imported by index.js that were previously global
362
- // and might still be called directly from HTML, and are not made global by their source module.
363
- Object.assign(window, {
364
- // handleValidation was originally in index.js and exposed.
365
- // It's used by an event listener here, but exposing it maintains compatibility if HTML calls it.
366
- handleValidation,
367
- handlePublish, // Expose handlePublish globally
368
-
369
- // showOnboardModal is defined in this file and already explicitly put on window.
370
-
371
- // Other functions like addServer, copyJsonToClipboard, toggleSectionContent etc.
372
- // are made global by uiHandlers.js.
373
- });
374
- });
@@ -1,172 +0,0 @@
1
- // src/web/public/js/onboard/publishHandler.js
2
- import { showToast } from '../notifications.js';
3
- import { getFormData } from './formProcessor.js';
4
- import {
5
- validateFormFields,
6
- pollOperationStatus,
7
- updateOperationDisplay,
8
- getElementIdsByTab,
9
- ensureStatusPanelVisible
10
- } from './validationHandlers.js';
11
-
12
- const POLLING_INTERVAL = 3000; // 3 seconds
13
- let pollingIntervalId = null;
14
-
15
- /**
16
- * Handles the publish process for the onboarding form.
17
- * @param {Event} event - The click event.
18
- * @param {string} activeTab - Identifier for the active tab ('create-category' or 'create-server').
19
- * @param {object|null} currentSelectedCategoryData - Data for the currently selected category if activeTab is 'create-server'.
20
- * @param {boolean} isUpdate - Flag indicating if this is an update to an existing category.
21
- */
22
- export async function handlePublish(event, activeTab, currentSelectedCategoryData = null, isUpdate = false) {
23
- const { panelId, contentId, formId, validateButtonId, publishButtonId } = getElementIdsByTab(activeTab);
24
-
25
- const statusContentElement = document.getElementById(contentId);
26
- // Ensure the progress toggle listener is attached when handlePublish is called
27
- if (typeof ensureProgressToggleListener === 'function') { // Check if imported correctly
28
- ensureProgressToggleListener(statusContentElement);
29
- }
30
-
31
- const onboardForm = document.getElementById(formId);
32
- const validateButton = document.getElementById(validateButtonId);
33
- const publishButton = document.getElementById(publishButtonId);
34
-
35
- if (!onboardForm || !statusContentElement || !validateButton || !publishButton) {
36
- console.error('Required form or panel elements not found for publishing.');
37
- showToast('Required form or panel elements not found for publishing.', 'error');
38
- return;
39
- }
40
-
41
- // Validate form fields
42
- const validationResult = validateFormFields(onboardForm, activeTab);
43
- if (!validationResult.isValid) {
44
- showToast('Please fix all validation errors before proceeding.', 'error');
45
- return;
46
- }
47
-
48
- let hasErrors = false;
49
-
50
- if (activeTab === 'create-category') {
51
- const formData = getFormData(onboardForm, false);
52
- if (!formData.mcpServers || formData.mcpServers.length === 0) {
53
- showToast('At least one MCP server must be configured for a new category.', 'error');
54
- return;
55
- }
56
-
57
- // Check category name format
58
- const nameInput = onboardForm.querySelector('input[name="name"]');
59
- if (nameInput && nameInput.value.trim()) {
60
- if (!/^[a-zA-Z0-9-_]+$/.test(nameInput.value.trim())) {
61
- showValidationMessage(nameInput, 'Only alphanumeric characters, hyphens, and underscores allowed', true);
62
- hasErrors = true;
63
- }
64
- }
65
- }
66
-
67
- if (hasErrors) {
68
- showToast('Please fix all validation errors before proceeding.', 'error');
69
- return;
70
- }
71
-
72
- publishButton.disabled = true;
73
- publishButton.innerHTML = "<i class='bx bx-loader-alt bx-spin mr-2'></i>Publishing...";
74
- validateButton.disabled = true; // Also disable validate button during publish
75
-
76
- if (pollingIntervalId) {
77
- clearInterval(pollingIntervalId);
78
- pollingIntervalId = null;
79
- }
80
-
81
- const forExistingCategoryTab = activeTab === 'create-server';
82
- const newServersData = getFormData(onboardForm, forExistingCategoryTab, currentSelectedCategoryData);
83
- let finalFeedConfiguration;
84
-
85
- if (forExistingCategoryTab && currentSelectedCategoryData) {
86
- finalFeedConfiguration = JSON.parse(JSON.stringify(currentSelectedCategoryData)); // Deep clone
87
-
88
- // Replace MCP Servers and Requirements with the current state from the form (newServersData)
89
- // This aligns with the logic in handleValidation
90
- finalFeedConfiguration.mcpServers = newServersData.mcpServers || [];
91
- finalFeedConfiguration.requirements = newServersData.requirements || [];
92
- } else {
93
- finalFeedConfiguration = newServersData;
94
- }
95
-
96
- statusContentElement.innerHTML = '<p class="text-gray-500">Initiating publish...</p>';
97
- ensureStatusPanelVisible(panelId, contentId);
98
-
99
- try {
100
- const payload = {
101
- categoryData: finalFeedConfiguration,
102
- isUpdate: isUpdate,
103
- forExistingCategory: forExistingCategoryTab
104
- };
105
-
106
- const response = await fetch('/api/categories/onboard', {
107
- method: 'POST',
108
- headers: { 'Content-Type': 'application/json' },
109
- body: JSON.stringify(payload),
110
- });
111
-
112
- const result = await response.json();
113
-
114
- if (result.success && result.data) {
115
- updateOperationDisplay(result.data, statusContentElement);
116
- const categoryName = finalFeedConfiguration.name; // Use the original category name for polling
117
- const operationTypeForPolling = 'FULL_ONBOARDING'; // Publish always initiates 'FULL_ONBOARDING'
118
- const initialStatus = result.data.status;
119
-
120
- if (categoryName && typeof initialStatus === 'string' && initialStatus.toUpperCase() !== 'COMPLETED' && initialStatus.toUpperCase() !== 'FAILED' && initialStatus.toUpperCase() !== 'SUCCEEDED') {
121
- pollingIntervalId = setInterval(async () => {
122
- const shouldContinue = await pollOperationStatus(categoryName, contentId, validateButtonId, publishButtonId, 'publish', operationTypeForPolling);
123
- if (!shouldContinue) {
124
- clearInterval(pollingIntervalId);
125
- pollingIntervalId = null;
126
- }
127
- }, POLLING_INTERVAL);
128
- } else {
129
- // Restore buttons to their original state fully
130
- publishButton.disabled = false;
131
- publishButton.innerHTML = "<i class='bx bx-cloud-upload mr-2'></i>Publish";
132
- publishButton.classList.remove('opacity-50');
133
- validateButton.disabled = false;
134
- validateButton.innerHTML = "<i class='bx bx-check-shield mr-2'></i>Validate";
135
- validateButton.classList.remove('opacity-50');
136
- if (initialStatus.toUpperCase() === 'COMPLETED' || initialStatus.toUpperCase() === 'SUCCEEDED') {
137
- showToast(result.data.message || 'Publish successful!', 'success');
138
- } else if (initialStatus.toUpperCase() === 'FAILED') {
139
- showToast(result.data.errorMessage || result.data.message || 'Publish failed.', 'error');
140
- }
141
- }
142
- } else {
143
- // Handle cases where result.success is false or result.data is missing
144
- const errorMessage = (result.data && result.data.message) || result.error || result.message || 'Publish request failed: Unknown error';
145
- if (result.data) { // If data is present (even if success is false), update display
146
- updateOperationDisplay(result.data, statusContentElement);
147
- } else {
148
- statusContentElement.innerHTML = `<p class="text-red-500">${errorMessage}</p>`;
149
- }
150
- showToast(errorMessage, 'error');
151
-
152
- // Restore buttons to their original state fully
153
- publishButton.disabled = false;
154
- publishButton.innerHTML = "<i class='bx bx-cloud-upload mr-2'></i>Publish";
155
- publishButton.classList.remove('opacity-50');
156
- validateButton.disabled = false;
157
- validateButton.innerHTML = "<i class='bx bx-check-shield mr-2'></i>Validate";
158
- validateButton.classList.remove('opacity-50');
159
- }
160
- } catch (error) {
161
- console.error('Error during publish:', error);
162
- statusContentElement.innerHTML = `<p class="text-red-500">An error occurred while initiating publish. Please check the console.</p>`;
163
- showToast('An error occurred during publish. Check console.', 'error');
164
- // Restore buttons to their original state fully
165
- publishButton.disabled = false;
166
- publishButton.innerHTML = "<i class='bx bx-cloud-upload mr-2'></i>Publish";
167
- publishButton.classList.remove('opacity-50');
168
- validateButton.disabled = false;
169
- validateButton.innerHTML = "<i class='bx bx-check-shield mr-2'></i>Validate";
170
- validateButton.classList.remove('opacity-50');
171
- }
172
- }
@@ -1,76 +0,0 @@
1
- // Global state management
2
- export const state = {
3
- serverCounters: new Map(), // Tracks server count per serversListId: serversListId -> serverCount
4
- envCountersPerTab: new Map(), // Tracks env var count per server per tab: serversListId -> Map(serverIndex -> envCount)
5
- serverRequirementCountersPerTab: new Map() // Tracks requirement count per server per tab: serversListId -> Map(serverIndex -> reqCount)
6
- };
7
-
8
- // export const incrementRequirementCounter = () => state.requirementCounter++; // Removed
9
- // export const incrementServerCounter = () => state.serverCounter++; // Will be managed by counting elements
10
- /**
11
- * Sets the server counter for a specific serversListId.
12
- * @param {string} serversListId - The ID of the server list.
13
- * @param {number} count - The new server count for this list.
14
- */
15
- export const setServerCounter = (serversListId, count) => {
16
- state.serverCounters.set(serversListId, count);
17
- };
18
-
19
- /**
20
- * Gets the server counter for a specific serversListId.
21
- * @param {string} serversListId - The ID of the server list.
22
- * @returns {number} The server count for this list.
23
- */
24
- export const getServerCounter = (serversListId) => {
25
- return state.serverCounters.get(serversListId) || 0;
26
- };
27
-
28
- export const setEnvCounter = (serversListId, serverIndex, value) => {
29
- if (!state.envCountersPerTab.has(serversListId)) {
30
- state.envCountersPerTab.set(serversListId, new Map());
31
- }
32
- state.envCountersPerTab.get(serversListId).set(serverIndex, value);
33
- };
34
-
35
- export const getEnvCounter = (serversListId, serverIndex) => {
36
- const tabCounters = state.envCountersPerTab.get(serversListId);
37
- return tabCounters ? tabCounters.get(serverIndex) || 0 : 0;
38
- };
39
-
40
- export const deleteEnvCounter = (serversListId, serverIndex) => {
41
- const tabCounters = state.envCountersPerTab.get(serversListId);
42
- if (tabCounters) {
43
- tabCounters.delete(serverIndex);
44
- }
45
- };
46
-
47
- export const clearEnvCountersForTab = (serversListId) => {
48
- if (state.envCountersPerTab.has(serversListId)) {
49
- state.envCountersPerTab.get(serversListId).clear();
50
- }
51
- };
52
-
53
- export const setServerRequirementCounter = (serversListId, serverIndex, value) => {
54
- if (!state.serverRequirementCountersPerTab.has(serversListId)) {
55
- state.serverRequirementCountersPerTab.set(serversListId, new Map());
56
- }
57
- state.serverRequirementCountersPerTab.get(serversListId).set(serverIndex, value);
58
- };
59
-
60
- export const getServerRequirementCounter = (serversListId, serverIndex) => {
61
- const tabCounters = state.serverRequirementCountersPerTab.get(serversListId);
62
- return tabCounters ? tabCounters.get(serverIndex) || 0 : 0;
63
- };
64
-
65
- export const deleteServerRequirementCounter = (serversListId, serverIndex) => {
66
- const tabCounters = state.serverRequirementCountersPerTab.get(serversListId);
67
- if (tabCounters) {
68
- tabCounters.delete(serverIndex);
69
- }
70
- };
71
-
72
- export const clearServerRequirementCountersForTab = (serversListId) => {
73
- if (state.serverRequirementCountersPerTab.has(serversListId)) {
74
- state.serverRequirementCountersPerTab.get(serversListId).clear();
75
- }
76
- };