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.
- package/dist/cli/commands/install.js +1 -106
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.js +1 -90
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pull.js +1 -16
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -33
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/uninstall.js +1 -46
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.js +1 -65
- package/dist/cli/index.js.map +1 -0
- package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
- package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstaller.js +1 -163
- package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
- package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
- package/dist/core/installers/clients/ClineInstaller.js +1 -30
- package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
- package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
- package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
- package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
- package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
- package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
- package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
- package/dist/core/installers/index.js +1 -8
- package/dist/core/installers/index.js.map +1 -0
- package/dist/core/installers/requirements/BaseInstaller.js +1 -56
- package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
- package/dist/core/installers/requirements/CommandInstaller.js +1 -213
- package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
- package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
- package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
- package/dist/core/installers/requirements/InstallerFactory.js +1 -99
- package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
- package/dist/core/installers/requirements/NpmInstaller.js +1 -235
- package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
- package/dist/core/installers/requirements/NugetInstaller.js +1 -188
- package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
- package/dist/core/installers/requirements/PipInstaller.js +1 -192
- package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
- package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
- package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
- package/dist/core/loaders/ConfigurationLoader.js +1 -256
- package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
- package/dist/core/loaders/ConfigurationProvider.js +1 -383
- package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
- package/dist/core/loaders/InstallOperationManager.js +1 -310
- package/dist/core/loaders/InstallOperationManager.js.map +1 -0
- package/dist/core/loaders/ServerSchemaLoader.js +1 -108
- package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
- package/dist/core/loaders/ServerSchemaProvider.js +1 -89
- package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
- package/dist/core/loaders/SystemSettingsManager.js +1 -256
- package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
- package/dist/core/metadatas/constants.js +1 -100
- package/dist/core/metadatas/constants.js.map +1 -0
- package/dist/core/metadatas/recordingConstants.js +1 -46
- package/dist/core/metadatas/recordingConstants.js.map +1 -0
- package/dist/core/metadatas/types.js +1 -15
- package/dist/core/metadatas/types.js.map +1 -0
- package/dist/core/onboard/FeedOnboardService.js +1 -422
- package/dist/core/onboard/FeedOnboardService.js.map +1 -0
- package/dist/core/onboard/OnboardProcessor.js +1 -333
- package/dist/core/onboard/OnboardProcessor.js.map +1 -0
- package/dist/core/onboard/OnboardStatus.js +1 -9
- package/dist/core/onboard/OnboardStatus.js.map +1 -0
- package/dist/core/onboard/OnboardStatusManager.js +1 -360
- package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
- package/dist/core/validators/FeedValidator.js +1 -133
- package/dist/core/validators/FeedValidator.js.map +1 -0
- package/dist/core/validators/IServerValidator.js +1 -1
- package/dist/core/validators/IServerValidator.js.map +1 -0
- package/dist/core/validators/SSEServerValidator.js +1 -38
- package/dist/core/validators/SSEServerValidator.js.map +1 -0
- package/dist/core/validators/ServerValidatorFactory.js +1 -44
- package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
- package/dist/core/validators/StdioServerValidator.js +1 -281
- package/dist/core/validators/StdioServerValidator.js.map +1 -0
- package/dist/index.js +1 -18
- package/dist/index.js.map +1 -0
- package/dist/services/InstallationService.js +1 -81
- package/dist/services/InstallationService.js.map +1 -0
- package/dist/services/MCPManager.js +1 -197
- package/dist/services/MCPManager.js.map +1 -0
- package/dist/services/RequirementService.js +1 -548
- package/dist/services/RequirementService.js.map +1 -0
- package/dist/services/ServerService.js +1 -127
- package/dist/services/ServerService.js.map +1 -0
- package/dist/services/TelemetryService.js +1 -53
- package/dist/services/TelemetryService.js.map +1 -0
- package/dist/utils/UpdateCheckTracker.js +1 -79
- package/dist/utils/UpdateCheckTracker.js.map +1 -0
- package/dist/utils/adoUtils.js +1 -254
- package/dist/utils/adoUtils.js.map +1 -0
- package/dist/utils/clientUtils.js +1 -65
- package/dist/utils/clientUtils.js.map +1 -0
- package/dist/utils/feedUtils.js +1 -28
- package/dist/utils/feedUtils.js.map +1 -0
- package/dist/utils/githubAuth.js +1 -177
- package/dist/utils/githubAuth.js.map +1 -0
- package/dist/utils/githubUtils.js +1 -125
- package/dist/utils/githubUtils.js.map +1 -0
- package/dist/utils/logger.js +1 -176
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/macroExpressionUtils.js +1 -93
- package/dist/utils/macroExpressionUtils.js.map +1 -0
- package/dist/utils/osUtils.js +1 -664
- package/dist/utils/osUtils.js.map +1 -0
- package/dist/utils/versionUtils.js +1 -101
- package/dist/utils/versionUtils.js.map +1 -0
- package/dist/web/contract/serverContract.js +1 -1
- package/dist/web/contract/serverContract.js.map +1 -0
- package/dist/web/public/js/api.js +2 -132
- package/dist/web/public/js/api.js.map +1 -0
- package/dist/web/public/js/detailsWidget.js +2 -264
- package/dist/web/public/js/detailsWidget.js.map +1 -0
- package/dist/web/public/js/flights/flights.js +2 -127
- package/dist/web/public/js/flights/flights.js.map +1 -0
- package/dist/web/public/js/modal/index.js +2 -52
- package/dist/web/public/js/modal/index.js.map +1 -0
- package/dist/web/public/js/modal/installModal.js +2 -162
- package/dist/web/public/js/modal/installModal.js.map +1 -0
- package/dist/web/public/js/modal/installation.js +2 -266
- package/dist/web/public/js/modal/installation.js.map +1 -0
- package/dist/web/public/js/modal/loadingModal.js +2 -182
- package/dist/web/public/js/modal/loadingModal.js.map +1 -0
- package/dist/web/public/js/modal/modalSetup.js +2 -595
- package/dist/web/public/js/modal/modalSetup.js.map +1 -0
- package/dist/web/public/js/modal/modalUtils.js +2 -37
- package/dist/web/public/js/modal/modalUtils.js.map +1 -0
- package/dist/web/public/js/modal/versionUtils.js +2 -20
- package/dist/web/public/js/modal/versionUtils.js.map +1 -0
- package/dist/web/public/js/modal.js +2 -42
- package/dist/web/public/js/modal.js.map +1 -0
- package/dist/web/public/js/notifications.js +2 -137
- package/dist/web/public/js/notifications.js.map +1 -0
- package/dist/web/public/js/onboard/formProcessor.js +2 -1037
- package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
- package/dist/web/public/js/onboard/index.js +2 -374
- package/dist/web/public/js/onboard/index.js.map +1 -0
- package/dist/web/public/js/onboard/publishHandler.js +2 -172
- package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
- package/dist/web/public/js/onboard/state.js +2 -76
- package/dist/web/public/js/onboard/state.js.map +1 -0
- package/dist/web/public/js/onboard/templates.js +2 -342
- package/dist/web/public/js/onboard/templates.js.map +1 -0
- package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
- package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
- package/dist/web/public/js/onboard/validationHandlers.js +2 -493
- package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
- package/dist/web/public/js/serverCategoryDetails.js +2 -364
- package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
- package/dist/web/public/js/serverCategoryList.js +2 -241
- package/dist/web/public/js/serverCategoryList.js.map +1 -0
- package/dist/web/public/js/settings.js +2 -314
- package/dist/web/public/js/settings.js.map +1 -0
- package/dist/web/server.js +1 -404
- package/dist/web/server.js.map +1 -0
- package/package.json +8 -2
- package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
- package/.github/acl/access.yml +0 -20
- package/.github/compliance/inventory.yml +0 -5
- package/.github/policies/jit.yml +0 -19
- package/.github/workflows/build.yml +0 -28
- package/.roo/rules-code/rules.md +0 -88
- package/dist/cli/commands/start.d.ts +0 -2
- package/dist/cli/commands/start.js +0 -32
- package/dist/cli/commands/sync.d.ts +0 -2
- package/dist/cli/commands/sync.js +0 -17
- package/dist/core/ConfigurationLoader.d.ts +0 -32
- package/dist/core/ConfigurationLoader.js +0 -236
- package/dist/core/ConfigurationProvider.d.ts +0 -35
- package/dist/core/ConfigurationProvider.js +0 -375
- package/dist/core/InstallationService.d.ts +0 -50
- package/dist/core/InstallationService.js +0 -350
- package/dist/core/MCPManager.d.ts +0 -28
- package/dist/core/MCPManager.js +0 -188
- package/dist/core/RequirementService.d.ts +0 -40
- package/dist/core/RequirementService.js +0 -110
- package/dist/core/ServerSchemaLoader.d.ts +0 -11
- package/dist/core/ServerSchemaLoader.js +0 -43
- package/dist/core/ServerSchemaProvider.d.ts +0 -17
- package/dist/core/ServerSchemaProvider.js +0 -120
- package/dist/core/constants.d.ts +0 -47
- package/dist/core/constants.js +0 -94
- package/dist/core/installers/BaseInstaller.d.ts +0 -74
- package/dist/core/installers/BaseInstaller.js +0 -253
- package/dist/core/installers/ClientInstaller.d.ts +0 -23
- package/dist/core/installers/ClientInstaller.js +0 -564
- package/dist/core/installers/CommandInstaller.d.ts +0 -37
- package/dist/core/installers/CommandInstaller.js +0 -173
- package/dist/core/installers/GeneralInstaller.d.ts +0 -33
- package/dist/core/installers/GeneralInstaller.js +0 -85
- package/dist/core/installers/InstallerFactory.d.ts +0 -54
- package/dist/core/installers/InstallerFactory.js +0 -97
- package/dist/core/installers/NpmInstaller.d.ts +0 -26
- package/dist/core/installers/NpmInstaller.js +0 -127
- package/dist/core/installers/PipInstaller.d.ts +0 -28
- package/dist/core/installers/PipInstaller.js +0 -127
- package/dist/core/installers/RequirementInstaller.d.ts +0 -33
- package/dist/core/installers/RequirementInstaller.js +0 -3
- package/dist/core/types.d.ts +0 -166
- package/dist/core/types.js +0 -16
- package/dist/services/InstallRequestValidator.d.ts +0 -21
- package/dist/services/InstallRequestValidator.js +0 -99
- package/dist/web/public/js/modal/installHandler.js +0 -227
- package/dist/web/public/js/modal/loadingUI.js +0 -74
- package/dist/web/public/js/modal/messageQueue.js +0 -112
- package/dist/web/public/js/modal/modalUI.js +0 -214
- package/dist/web/public/js/modal/version.js +0 -20
- package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
- package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
- package/docs/Telemetry.md +0 -136
- package/memory-bank/activeContext.md +0 -26
- package/memory-bank/decisionLog.md +0 -91
- package/memory-bank/productContext.md +0 -41
- package/memory-bank/progress.md +0 -35
- package/memory-bank/systemPatterns.md +0 -10
- package/src/cli/commands/install.ts +0 -139
- package/src/cli/commands/list.ts +0 -113
- package/src/cli/commands/pull.ts +0 -16
- package/src/cli/commands/serve.ts +0 -39
- package/src/cli/commands/uninstall.ts +0 -64
- package/src/cli/index.ts +0 -82
- package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
- package/src/core/installers/clients/ClientInstaller.ts +0 -222
- package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
- package/src/core/installers/clients/ClineInstaller.ts +0 -35
- package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
- package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
- package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
- package/src/core/installers/index.ts +0 -11
- package/src/core/installers/requirements/BaseInstaller.ts +0 -85
- package/src/core/installers/requirements/CommandInstaller.ts +0 -231
- package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
- package/src/core/installers/requirements/InstallerFactory.ts +0 -114
- package/src/core/installers/requirements/NpmInstaller.ts +0 -271
- package/src/core/installers/requirements/NugetInstaller.ts +0 -203
- package/src/core/installers/requirements/PipInstaller.ts +0 -207
- package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
- package/src/core/loaders/ConfigurationLoader.ts +0 -298
- package/src/core/loaders/ConfigurationProvider.ts +0 -462
- package/src/core/loaders/InstallOperationManager.ts +0 -367
- package/src/core/loaders/ServerSchemaLoader.ts +0 -117
- package/src/core/loaders/ServerSchemaProvider.ts +0 -99
- package/src/core/loaders/SystemSettingsManager.ts +0 -278
- package/src/core/metadatas/constants.ts +0 -122
- package/src/core/metadatas/recordingConstants.ts +0 -65
- package/src/core/metadatas/types.ts +0 -202
- package/src/core/onboard/FeedOnboardService.ts +0 -501
- package/src/core/onboard/OnboardProcessor.ts +0 -356
- package/src/core/onboard/OnboardStatus.ts +0 -60
- package/src/core/onboard/OnboardStatusManager.ts +0 -416
- package/src/core/validators/FeedValidator.ts +0 -135
- package/src/core/validators/IServerValidator.ts +0 -21
- package/src/core/validators/SSEServerValidator.ts +0 -43
- package/src/core/validators/ServerValidatorFactory.ts +0 -51
- package/src/core/validators/StdioServerValidator.ts +0 -313
- package/src/index.ts +0 -44
- package/src/services/InstallationService.ts +0 -102
- package/src/services/MCPManager.ts +0 -249
- package/src/services/RequirementService.ts +0 -627
- package/src/services/ServerService.ts +0 -161
- package/src/services/TelemetryService.ts +0 -59
- package/src/utils/UpdateCheckTracker.ts +0 -86
- package/src/utils/adoUtils.ts +0 -293
- package/src/utils/clientUtils.ts +0 -72
- package/src/utils/feedUtils.ts +0 -31
- package/src/utils/githubAuth.ts +0 -212
- package/src/utils/githubUtils.ts +0 -164
- package/src/utils/logger.ts +0 -195
- package/src/utils/macroExpressionUtils.ts +0 -104
- package/src/utils/osUtils.ts +0 -700
- package/src/utils/versionUtils.ts +0 -114
- package/src/web/contract/serverContract.ts +0 -74
- package/src/web/public/css/detailsWidget.css +0 -235
- package/src/web/public/css/modal.css +0 -757
- package/src/web/public/css/notifications.css +0 -101
- package/src/web/public/css/onboard.css +0 -107
- package/src/web/public/css/serverCategoryList.css +0 -120
- package/src/web/public/css/serverDetails.css +0 -139
- package/src/web/public/index.html +0 -359
- package/src/web/public/js/api.js +0 -132
- package/src/web/public/js/detailsWidget.js +0 -264
- package/src/web/public/js/flights/flights.js +0 -127
- package/src/web/public/js/modal/index.js +0 -52
- package/src/web/public/js/modal/installModal.js +0 -162
- package/src/web/public/js/modal/installation.js +0 -266
- package/src/web/public/js/modal/loadingModal.js +0 -182
- package/src/web/public/js/modal/modalSetup.js +0 -595
- package/src/web/public/js/modal/modalUtils.js +0 -37
- package/src/web/public/js/modal/versionUtils.js +0 -20
- package/src/web/public/js/modal.js +0 -42
- package/src/web/public/js/notifications.js +0 -137
- package/src/web/public/js/onboard/formProcessor.js +0 -1037
- package/src/web/public/js/onboard/index.js +0 -374
- package/src/web/public/js/onboard/publishHandler.js +0 -172
- package/src/web/public/js/onboard/state.js +0 -76
- package/src/web/public/js/onboard/templates.js +0 -342
- package/src/web/public/js/onboard/uiHandlers.js +0 -1076
- package/src/web/public/js/onboard/validationHandlers.js +0 -493
- package/src/web/public/js/serverCategoryDetails.js +0 -364
- package/src/web/public/js/serverCategoryList.js +0 -241
- package/src/web/public/js/settings.js +0 -314
- package/src/web/public/modal.html +0 -84
- package/src/web/public/onboard.html +0 -296
- package/src/web/public/settings.html +0 -135
- package/src/web/public/styles.css +0 -277
- package/src/web/server.ts +0 -478
- package/tsconfig.json +0 -18
- package/wiki/Installation.md +0 -3
- package/wiki/Publish.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["showToast","showConfirm"],"sources":["0"],"sourcesContent":["import { showToast, showConfirm } from '../notifications.js';\r\nimport { showInstallLoadingModal, updateOverallInstallStatus } from './loadingModal.js';\r\n// import { delayedAppendInstallLoadingMessage } from './messageQueue.js'; // No longer used\r\nimport { uninstallTools } from './installation.js';\r\nimport { handleBulkClientInstall } from './installation.js';\r\nimport { compareVersions } from './versionUtils.js';\r\n\r\n/**\r\n * Set up client items in the modal\r\n */\r\nexport function setupClientItems(targets, serverStatus, categoryName, serverName, targetDiv) {\r\n targets.forEach(target => {\r\n const operationStatus = serverStatus.installedStatus[target] || { status: 'not-installed', type: 'check', target: 'server' };\r\n\r\n // Determine client status\r\n let statusText = '';\r\n let statusClass = '';\r\n\r\n if (operationStatus.status === 'completed' && operationStatus.type === 'install') {\r\n statusText = 'Installed';\r\n statusClass = 'installed';\r\n } else if (operationStatus.status === 'pending') {\r\n statusText = 'Pending Requirements';\r\n statusClass = 'pending';\r\n } else if (operationStatus.status === 'in-progress') {\r\n statusText = 'In Progress';\r\n statusClass = 'pending';\r\n } else if (operationStatus.status === 'failed') {\r\n statusText = 'Failed';\r\n statusClass = 'not-installed';\r\n }\r\n\r\n const isConfigured = operationStatus.status === 'completed' && operationStatus.type === 'install';\r\n const isInProgress = operationStatus.status === 'in-progress';\r\n const isSelectable = !isConfigured && !isInProgress;\r\n\r\n const clientItem = createClientItem(target, statusText, statusClass, isSelectable, isConfigured, isInProgress);\r\n setupClientItemListeners(clientItem, target, isSelectable);\r\n setupUninstallButton(clientItem, statusText, operationStatus, target, categoryName, serverName, statusClass);\r\n targetDiv.appendChild(clientItem);\r\n });\r\n\r\n addSectionTitle(targetDiv);\r\n}\r\n\r\n/**\r\n * Set up environment variables section in the modal\r\n */\r\nexport function setupEnvironmentVariables(mcpServer, envInputsDiv, targetData) {\r\n // For SSE mode, don't show env section at all\r\n if (mcpServer.mode === 'sse') {\r\n envInputsDiv.style.display = 'none';\r\n return;\r\n }\r\n\r\n const envRequirements = mcpServer.installation?.['env'] || mcpServer.installation?.env || {};\r\n addEnvironmentTitle(envInputsDiv);\r\n\r\n // Fetch system settings to get userConfigurations for env defaults\r\n fetch('/api/settings')\r\n .then(response => response.json())\r\n .then(data => {\r\n const userConfigurations = (data && data.data && data.data.userConfigurations) ? data.data.userConfigurations : {};\r\n if (Object.keys(envRequirements).length === 0) {\r\n addNoEnvMessage(envInputsDiv);\r\n } else {\r\n createEnvironmentInputs(envRequirements, envInputsDiv, targetData.clientMcpSettings, mcpServer.name, userConfigurations);\r\n }\r\n })\r\n .catch(() => {\r\n // fallback to old logic if fetch fails\r\n if (Object.keys(envRequirements).length === 0) {\r\n addNoEnvMessage(envInputsDiv);\r\n } else {\r\n createEnvironmentInputs(envRequirements, envInputsDiv, targetData.clientMcpSettings, mcpServer.name, {});\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Set up installation arguments section in the modal\r\n */\r\nexport function setupInstallationArguments(installation, modalArguments, categoryName, mcpServer) {\r\n // For SSE mode, don't show arguments section at all\r\n if (mcpServer?.mode === 'sse') {\r\n modalArguments.style.display = 'none';\r\n return;\r\n }\r\n\r\n if (!installation) return;\r\n\r\n addArgumentsTitle(modalArguments);\r\n const container = createArgumentsContainer();\r\n modalArguments.appendChild(container);\r\n\r\n if (installation.args && Array.isArray(installation.args)) {\r\n installation.args.forEach(arg => {\r\n container.appendChild(createArgumentInput(arg));\r\n });\r\n } else {\r\n container.appendChild(createArgumentInput());\r\n }\r\n\r\n if (installation.command === 'python' || installation.command.includes('python')) {\r\n addPythonEnvironmentInput(categoryName, mcpServer.name, modalArguments);\r\n }\r\n}\r\n\r\n/**\r\n * Set up server requirements section in the modal\r\n */\r\nexport function setupServerRequirements(mcpServer, serverData, categoryName, serverName, modalRequirements) {\r\n // For SSE mode, don't show requirements section at all\r\n if (mcpServer.mode === 'sse') {\r\n modalRequirements.style.display = 'none';\r\n return;\r\n }\r\n\r\n const serverRequirements = mcpServer.dependencies?.requirements || [];\r\n const requirements = serverData.data.installationStatus?.requirementsStatus || {};\r\n\r\n if (serverRequirements.length > 0) {\r\n const reqHtml = renderRequirements(serverRequirements, requirements, categoryName, serverName);\r\n modalRequirements.innerHTML = `\r\n <h3 class=\"text-lg font-semibold text-gray-700 mb-3\">Dependencies</h3>\r\n <p class=\"text-sm text-gray-600 mb-4\">These dependencies will be automatically installed when installing the server</p>\r\n ${reqHtml}\r\n `;\r\n\r\n setupUpdateToggles(modalRequirements);\r\n } else {\r\n modalRequirements.innerHTML = '<p class=\"text-gray-600\">No additional dependencies required.</p>';\r\n }\r\n}\r\n\r\n/**\r\n * Set up the form submit handler\r\n */\r\nexport function setupFormSubmitHandler(form, envInputsDiv, modalArguments, modalRequirements, categoryName, serverName, serverStatuses, serverData, mcpServer) {\r\n form.onsubmit = (e) => {\r\n e.preventDefault();\r\n\r\n const envVars = {};\r\n const args = [];\r\n const requirementsToUpdate = [];\r\n let pythonEnv = undefined;\r\n\r\n // Only collect env, args and requirements if not in SSE mode\r\n if (mcpServer?.mode !== 'sse') {\r\n const inputs = envInputsDiv.querySelectorAll('input');\r\n inputs.forEach(input => {\r\n if (input.name && input.value) {\r\n envVars[input.name] = input.value;\r\n }\r\n });\r\n\r\n const argInputs = modalArguments.querySelectorAll('.arg-input');\r\n args.push(...Array.from(argInputs)\r\n .map(input => input.value.trim())\r\n .filter(val => val !== ''));\r\n\r\n const pythonEnvInput = document.getElementById('python_env');\r\n pythonEnv = pythonEnvInput?.value?.trim();\r\n\r\n const updateToggles = modalRequirements.querySelectorAll('.toggle-update:checked');\r\n updateToggles.forEach(toggle => {\r\n requirementsToUpdate.push({\r\n name: toggle.dataset.name,\r\n version: toggle.dataset.version\r\n });\r\n });\r\n }\r\n\r\n // Only POST userConfigurations and/or pythonEnvs if there is a difference, then proceed with install\r\n fetch('/api/settings')\r\n .then(response => response.json())\r\n .then(data => {\r\n const userConfigurations = (data && data.data && data.data.userConfigurations) ? data.data.userConfigurations : {};\r\n const pythonEnvs = (data && data.data && data.data.pythonEnvs) ? data.data.pythonEnvs : {};\r\n const updatedUserConfigurations = { ...userConfigurations };\r\n const updatedPythonEnvs = { ...pythonEnvs };\r\n\r\n Object.keys(envVars).forEach(key => {\r\n updatedUserConfigurations[key] = envVars[key];\r\n });\r\n\r\n // Check for userConfigurations difference\r\n let needsUserConfigUpdate = false;\r\n const allUserConfigKeys = new Set([...Object.keys(userConfigurations), ...Object.keys(envVars)]);\r\n for (const key of allUserConfigKeys) {\r\n if (userConfigurations[key] !== updatedUserConfigurations[key]) {\r\n needsUserConfigUpdate = true;\r\n break;\r\n }\r\n }\r\n\r\n // Check for pythonEnvs difference\r\n let needsPythonEnvUpdate = false;\r\n if (pythonEnv !== undefined && pythonEnv !== pythonEnvs[`${categoryName}:${serverName}`]) {\r\n updatedPythonEnvs[`${categoryName}:${serverName}`] = pythonEnv;\r\n needsPythonEnvUpdate = true;\r\n }\r\n\r\n // If either needs update, POST the merged object\r\n if (needsUserConfigUpdate || needsPythonEnvUpdate) {\r\n const postBody = {};\r\n if (needsUserConfigUpdate) postBody.userConfigurations = updatedUserConfigurations;\r\n if (needsPythonEnvUpdate) postBody.pythonEnvs = updatedPythonEnvs;\r\n fetch('/api/settings', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(postBody)\r\n }).then(() => {\r\n proceedInstall();\r\n }).catch(() => {\r\n proceedInstall();\r\n });\r\n } else {\r\n proceedInstall();\r\n }\r\n })\r\n .catch(() => {\r\n proceedInstall();\r\n });\r\n\r\n function proceedInstall() {\r\n const hasRequirementsToUpdate = requirementsToUpdate.length > 0;\r\n\r\n const uninstallBtn = document.querySelector('.uninstall-btn');\r\n if (!uninstallBtn || !uninstallBtn.matches(':active')) {\r\n const selectedTargets = window.selectedClients;\r\n if (selectedTargets.length === 0 && !hasRequirementsToUpdate) {\r\n showToast('Please select at least one client to configure.', 'error');\r\n return;\r\n }\r\n\r\n let installingMessage = \"Starting installation...\";\r\n const serverStatus = serverStatuses[serverName] || { installedStatus: {} };\r\n if (selectedTargets.length > 0) {\r\n const target = selectedTargets[0];\r\n const msg = serverStatus.installedStatus?.[target]?.message;\r\n if (msg) installingMessage = msg;\r\n }\r\n\r\n const serverInstallOptions = {\r\n targetClients: selectedTargets,\r\n env: envVars,\r\n args: args,\r\n settings: pythonEnv ? { pythonEnv: pythonEnv } : {}\r\n };\r\n\r\n if (requirementsToUpdate.length > 0) {\r\n serverInstallOptions.requirements = requirementsToUpdate;\r\n }\r\n\r\n handleBulkClientInstall(categoryName, serverName, selectedTargets, envVars, installingMessage, serverData, serverInstallOptions);\r\n }\r\n }\r\n };\r\n}\r\n\r\n// Helper functions\r\nfunction createClientItem(target, statusText, statusClass, isSelectable, isConfigured, isInProgress) {\r\n const clientItem = document.createElement('div');\r\n clientItem.className = 'client-item';\r\n clientItem.dataset.target = target;\r\n clientItem.dataset.selected = 'false';\r\n\r\n // Create client info (name)\r\n const clientInfo = document.createElement('div');\r\n clientInfo.className = 'client-info';\r\n\r\n // Client name label\r\n const clientName = document.createElement('span');\r\n clientName.className = 'text-sm font-medium text-gray-900';\r\n clientName.textContent = target;\r\n\r\n // Add elements to client info\r\n clientInfo.appendChild(clientName);\r\n\r\n // Add client info to client item\r\n clientItem.appendChild(clientInfo);\r\n\r\n if (!isSelectable) {\r\n clientItem.classList.add('non-selectable');\r\n if (isConfigured) {\r\n clientItem.classList.add('installed-item');\r\n clientItem.title = 'Already installed';\r\n } else if (isInProgress) {\r\n clientItem.classList.add('in-progress-item');\r\n clientItem.title = 'Installation in progress';\r\n }\r\n }\r\n\r\n return clientItem;\r\n}\r\n\r\nfunction setupClientItemListeners(clientItem, target, isSelectable) {\r\n if (isSelectable) {\r\n clientItem.addEventListener('click', () => {\r\n const isSelected = clientItem.dataset.selected === 'true';\r\n clientItem.dataset.selected = isSelected ? 'false' : 'true';\r\n\r\n if (isSelected) {\r\n clientItem.classList.remove('selected');\r\n window.selectedClients = window.selectedClients.filter(c => c !== target);\r\n } else {\r\n clientItem.classList.add('selected');\r\n if (!window.selectedClients.includes(target)) {\r\n window.selectedClients.push(target);\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction setupUninstallButton(clientItem, statusText, operationStatus, target, categoryName, serverName, statusClass) {\r\n if (statusText) {\r\n const statusContainer = document.createElement('div');\r\n statusContainer.className = 'status-container';\r\n\r\n const statusBadge = document.createElement('span');\r\n statusBadge.className = `status-badge ${statusClass}`;\r\n statusBadge.textContent = statusText;\r\n statusContainer.appendChild(statusBadge);\r\n\r\n if (operationStatus.status === 'completed' && operationStatus.type === 'install') {\r\n const uninstallBtn = createUninstallButton(target, categoryName, serverName);\r\n statusContainer.appendChild(uninstallBtn);\r\n }\r\n\r\n clientItem.appendChild(statusContainer);\r\n }\r\n}\r\n\r\nfunction createUninstallButton(target, categoryName, serverName) {\r\n const uninstallBtn = document.createElement('button');\r\n uninstallBtn.className = 'uninstall-btn text-red-600 hover:text-red-800 ml-2';\r\n uninstallBtn.innerHTML = '<i class=\"bx bx-trash\"></i>';\r\n uninstallBtn.title = 'Uninstall from this client';\r\n\r\n uninstallBtn.onclick = async (e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n const confirmed = await showConfirm('Uninstall Confirmation',\r\n `Are you sure you want to uninstall ${serverName} from ${target}?`);\r\n\r\n if (confirmed) {\r\n window.selectedClients = [target];\r\n showInstallLoadingModal('Uninstalling');\r\n const serverList = {\r\n [serverName]: {\r\n removeData: true\r\n }\r\n };\r\n\r\n try {\r\n updateOverallInstallStatus('in-progress', `Uninstalling ${serverName} from ${target}...`);\r\n await uninstallTools(categoryName, serverList, [target]);\r\n // uninstallTools will now handle its own final status update via updateOverallInstallStatus\r\n } catch (error) {\r\n updateOverallInstallStatus('failed', `Error during uninstall: ${error.message}`);\r\n // No need to throw here if uninstallTools handles its errors by updating status\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n return uninstallBtn;\r\n}\r\n\r\nfunction addSectionTitle(targetDiv) {\r\n if (!targetDiv.querySelector('.section-title')) {\r\n const titleElement = document.createElement('h3');\r\n titleElement.className = 'section-title text-lg font-semibold text-gray-700 mb-3';\r\n titleElement.textContent = 'Client Status';\r\n targetDiv.insertBefore(titleElement, targetDiv.firstChild);\r\n }\r\n}\r\n\r\nfunction addEnvironmentTitle(envInputsDiv) {\r\n if (!envInputsDiv.querySelector('.section-title')) {\r\n const envTitle = document.createElement('h3');\r\n envTitle.className = 'section-title text-lg font-semibold text-gray-700 mb-3';\r\n envTitle.textContent = 'Environment Variables';\r\n envInputsDiv.insertBefore(envTitle, envInputsDiv.firstChild);\r\n }\r\n}\r\n\r\nfunction addNoEnvMessage(envInputsDiv) {\r\n const noEnvMessage = document.createElement('p');\r\n noEnvMessage.className = 'text-gray-600';\r\n noEnvMessage.textContent = 'No environment variables required for this MCP server.';\r\n envInputsDiv.appendChild(noEnvMessage);\r\n}\r\n\r\nfunction createEnvironmentInputs(envRequirements, envInputsDiv, clientSettings, serverName, userConfigurations = {}) {\r\n Object.keys(envRequirements).forEach(key => {\r\n const req = envRequirements[key];\r\n const inputId = `env_${key}`;\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.className = 'mb-3';\r\n\r\n const label = document.createElement('label');\r\n label.htmlFor = inputId;\r\n label.className = 'block text-sm font-medium text-gray-700 mb-1';\r\n label.innerHTML = `${key} ${req.Required ? '<span class=\"text-red-500\">*</span>' : ''}`;\r\n\r\n const input = document.createElement('input');\r\n input.type = req.isSecret ? 'password' : 'text';\r\n input.id = inputId;\r\n input.name = key;\r\n input.placeholder = req.Description || key;\r\n input.required = req.Required;\r\n input.className = 'input-field';\r\n\r\n // For default value, first check userConfigurations, then client settings, then provided default\r\n let defaultValue = req.Default || '';\r\n\r\n // Use userConfigurations if present\r\n if (userConfigurations && userConfigurations[key]) {\r\n defaultValue = userConfigurations[key];\r\n } else if (clientSettings && clientSettings.MSRooCode &&\r\n clientSettings.MSRooCode.mcpServers &&\r\n clientSettings.MSRooCode.mcpServers[serverName] &&\r\n clientSettings.MSRooCode.mcpServers[serverName].env &&\r\n clientSettings.MSRooCode.mcpServers[serverName].env[key]) {\r\n defaultValue = clientSettings.MSRooCode.mcpServers[serverName].env[key];\r\n }\r\n\r\n input.value = defaultValue;\r\n\r\n inputWrapper.appendChild(label);\r\n inputWrapper.appendChild(input);\r\n\r\n if (req.Description) {\r\n const description = document.createElement('p');\r\n description.className = 'text-xs text-gray-500 mt-1';\r\n description.textContent = req.Description;\r\n inputWrapper.appendChild(description);\r\n }\r\n\r\n envInputsDiv.appendChild(inputWrapper);\r\n });\r\n}\r\n\r\nfunction addArgumentsTitle(modalArguments) {\r\n const argsTitle = document.createElement('h3');\r\n argsTitle.className = 'section-title text-lg font-semibold text-gray-700 mb-3';\r\n argsTitle.textContent = 'Arguments';\r\n modalArguments.appendChild(argsTitle);\r\n}\r\n\r\nfunction createArgumentsContainer() {\r\n const container = document.createElement('div');\r\n container.className = 'args-container mb-3';\r\n\r\n const addButton = document.createElement('button');\r\n addButton.type = 'button';\r\n addButton.className = 'add-arg-button px-3 py-1 text-sm text-blue-600 hover:text-blue-800 border border-blue-600 hover:border-blue-800 rounded-md mb-2';\r\n addButton.innerHTML = '<i class=\"bx bx-plus\"></i> Add Argument';\r\n addButton.onclick = () => container.appendChild(createArgumentInput());\r\n\r\n container.appendChild(addButton);\r\n return container;\r\n}\r\n\r\nfunction createArgumentInput(value = '') {\r\n const argWrapper = document.createElement('div');\r\n argWrapper.className = 'arg-wrapper flex items-center gap-2 mb-2';\r\n\r\n const input = document.createElement('input');\r\n input.type = 'text';\r\n input.className = 'arg-input flex-grow';\r\n input.value = value;\r\n input.placeholder = 'Enter argument value';\r\n\r\n const removeButton = document.createElement('button');\r\n removeButton.type = 'button';\r\n removeButton.className = 'remove-arg-button text-red-600 hover:text-red-800';\r\n removeButton.innerHTML = '<i class=\"bx bx-trash\"></i>';\r\n removeButton.onclick = () => argWrapper.remove();\r\n\r\n argWrapper.appendChild(input);\r\n argWrapper.appendChild(removeButton);\r\n return argWrapper;\r\n}\r\n\r\nfunction addPythonEnvironmentInput(categoryName, serverName, modalArguments) {\r\n const pythonEnvWrapper = document.createElement('div');\r\n pythonEnvWrapper.className = 'mt-4';\r\n\r\n const pythonEnvLabel = document.createElement('label');\r\n pythonEnvLabel.htmlFor = 'python_env';\r\n pythonEnvLabel.className = 'block text-sm font-medium text-gray-700 mb-1';\r\n pythonEnvLabel.textContent = 'Python Environment';\r\n\r\n const pythonEnvInput = document.createElement('input');\r\n pythonEnvInput.type = 'text';\r\n pythonEnvInput.id = 'python_env';\r\n pythonEnvInput.className = 'input-field';\r\n pythonEnvInput.placeholder = 'Enter Python environment path (optional)';\r\n\r\n const envDescription = document.createElement('p');\r\n envDescription.className = 'text-xs text-gray-500 mt-1';\r\n envDescription.textContent = 'Specify the Python exectable file(e.g. C:/python312/python) to use for installation. Leave empty to use system default. You can specify value in Settings page';\r\n\r\n pythonEnvWrapper.appendChild(pythonEnvLabel);\r\n pythonEnvWrapper.appendChild(pythonEnvInput);\r\n pythonEnvWrapper.appendChild(envDescription);\r\n modalArguments.appendChild(pythonEnvWrapper);\r\n // Fetch system settings and set default value for python_env\r\n fetch('/api/settings')\r\n .then(response => response.json())\r\n .then(data => {\r\n if (data && data.data && data.data.pythonEnvs) {\r\n pythonEnvInput.value = data.data.pythonEnvs[`${categoryName}:${serverName}`] || data.data.pythonEnvs['system'] || '';\r\n }\r\n })\r\n .catch(() => {\r\n // Ignore errors, leave input empty\r\n });\r\n}\r\n\r\nfunction renderRequirements(serverRequirements, requirements, categoryName, serverName) {\r\n return serverRequirements.map(req => {\r\n const status = requirements[req.name] || {};\r\n let statusClass = status.installed\r\n ? 'text-green-600 bg-green-50'\r\n : 'text-yellow-600 bg-yellow-50';\r\n let statusText = status.installed ? 'Installed' : 'Required';\r\n let versionDisplay = status.version ? ` • <span class=\"font-medium\">${status.version}</span>` : '';\r\n let updateToggle = '';\r\n\r\n // Check if there's an available update\r\n if (status.installed && status.availableUpdate && status.availableUpdate.version) {\r\n if (status.version && compareVersions(status.availableUpdate.version, status.version) > 0) {\r\n // Show version update information with yellow color and icon\r\n statusClass = 'text-yellow-600 bg-yellow-50';\r\n statusText = `<span style=\"color: #f59e0b; font-weight: bold; margin-right: 5px;\">↑</span>${status.availableUpdate.version}`;\r\n\r\n // Create a toggle switch for update\r\n updateToggle = `\r\n <label class=\"inline-flex items-center cursor-pointer ml-2\">\r\n <input type=\"checkbox\" class=\"toggle-update sr-only\"\r\n data-name=\"${req.name}\"\r\n data-version=\"${status.availableUpdate.version}\"\r\n data-category=\"${categoryName}\"\r\n data-server=\"${serverName}\">\r\n <div class=\"relative w-10 h-5 bg-gray-200 rounded-full toggle-bg\">\r\n <div class=\"absolute inset-y-0 left-0 w-5 h-5 bg-white rounded-full transition-transform duration-300 transform\"></div>\r\n </div>\r\n <span class=\"ml-2 text-sm text-gray-700\">Update</span>\r\n </label>\r\n `;\r\n }\r\n }\r\n\r\n return `\r\n <div class=\"border border-gray-200 p-3 rounded-lg mb-2 hover:bg-gray-50\">\r\n <div class=\"flex justify-between items-center\">\r\n <div>\r\n <div class=\"font-semibold text-gray-800\">${req.name}</div>\r\n <div class=\"text-sm text-gray-600 shadow-sm p-1 rounded bg-gray-50\">\r\n <span class=\"font-medium\">${status.type || 'package'}</span>${versionDisplay}\r\n </div>\r\n </div>\r\n <div class=\"flex items-center\">\r\n <span class=\"${statusClass} inline-flex items-center px-3 py-1 rounded-full text-sm\">\r\n ${statusText}\r\n </span>\r\n ${updateToggle}\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }).join('');\r\n}\r\n\r\nfunction setupUpdateToggles(modalRequirements) {\r\n const updateToggles = modalRequirements.querySelectorAll('.toggle-update');\r\n updateToggles.forEach(toggle => {\r\n toggle.addEventListener('change', function () {\r\n const toggleBg = this.parentElement.querySelector('.toggle-bg');\r\n if (this.checked) {\r\n toggleBg.classList.add('bg-blue-500');\r\n toggleBg.querySelector('div').classList.add('translate-x-5');\r\n } else {\r\n toggleBg.classList.remove('bg-blue-500');\r\n toggleBg.querySelector('div').classList.remove('translate-x-5');\r\n }\r\n });\r\n });\r\n}"],"mappings":"OAASA,UAAWC,gBAAmB,6B","ignoreList":[]}
|
|
@@ -1,37 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
export function closeModal() {
|
|
5
|
-
document.getElementById('installModal').style.display = "none";
|
|
6
|
-
|
|
7
|
-
// Get the last selected category from localStorage
|
|
8
|
-
const lastSelected = localStorage.getItem('lastSelectedCategory');
|
|
9
|
-
|
|
10
|
-
// Refresh page and restore selection
|
|
11
|
-
if (lastSelected) {
|
|
12
|
-
setTimeout(() => {
|
|
13
|
-
window.location.href = window.location.pathname + '?category=' + encodeURIComponent(lastSelected);
|
|
14
|
-
}, 100);
|
|
15
|
-
} else {
|
|
16
|
-
location.reload();
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Setup toggle switch styles
|
|
22
|
-
*/
|
|
23
|
-
export function setupToggleStyles() {
|
|
24
|
-
const styleElement = document.createElement('style');
|
|
25
|
-
styleElement.textContent = `
|
|
26
|
-
.toggle-bg.bg-blue-500 {
|
|
27
|
-
background-color: #3b82f6;
|
|
28
|
-
}
|
|
29
|
-
.toggle-bg {
|
|
30
|
-
transition: background-color 0.3s;
|
|
31
|
-
}
|
|
32
|
-
.toggle-bg div {
|
|
33
|
-
transition: transform 0.3s;
|
|
34
|
-
}
|
|
35
|
-
`;
|
|
36
|
-
document.head.appendChild(styleElement);
|
|
37
|
-
}
|
|
1
|
+
export function closeModal(){document.getElementById("installModal").style.display="none";const o=localStorage.getItem("lastSelectedCategory");o?setTimeout((()=>{window.location.href=window.location.pathname+"?category="+encodeURIComponent(o)}),100):location.reload()}export function setupToggleStyles(){const o=document.createElement("style");o.textContent="\n .toggle-bg.bg-blue-500 {\n background-color: #3b82f6;\n }\n .toggle-bg {\n transition: background-color 0.3s;\n }\n .toggle-bg div {\n transition: transform 0.3s;\n }\n ",document.head.appendChild(o)}
|
|
2
|
+
//# sourceMappingURL=modalUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1,20 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* @param {string} v1 First version
|
|
4
|
-
* @param {string} v2 Second version
|
|
5
|
-
* @returns {number} 1 if v1 > v2, -1 if v1 < v2, 0 if equal
|
|
6
|
-
*/
|
|
7
|
-
export function compareVersions(v1, v2) {
|
|
8
|
-
const v1Parts = v1.split('.').map(Number);
|
|
9
|
-
const v2Parts = v2.split('.').map(Number);
|
|
10
|
-
|
|
11
|
-
for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
|
|
12
|
-
const v1Part = v1Parts[i] || 0;
|
|
13
|
-
const v2Part = v2Parts[i] || 0;
|
|
14
|
-
|
|
15
|
-
if (v1Part > v2Part) return 1;
|
|
16
|
-
if (v1Part < v2Part) return -1;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return 0;
|
|
20
|
-
}
|
|
1
|
+
export function compareVersions(t,r){const e=t.split(".").map(Number),n=r.split(".").map(Number);for(let t=0;t<Math.max(e.length,n.length);t++){const r=e[t]||0,o=n[t]||0;if(r>o)return 1;if(r<o)return-1}return 0}
|
|
2
|
+
//# sourceMappingURL=versionUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1,42 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
showInstallModal,
|
|
4
|
-
closeModal,
|
|
5
|
-
uninstallTools,
|
|
6
|
-
showInstallLoadingModal,
|
|
7
|
-
// appendInstallLoadingMessage, // Removed
|
|
8
|
-
hideInstallLoadingModal,
|
|
9
|
-
// Potentially add updateOverallInstallStatus, addInstallationStep if needed from ./modal/index.js
|
|
10
|
-
} from './modal/index.js';
|
|
11
|
-
|
|
12
|
-
// Re-export all modal functionality
|
|
13
|
-
export {
|
|
14
|
-
showInstallModal,
|
|
15
|
-
closeModal,
|
|
16
|
-
uninstallTools,
|
|
17
|
-
showInstallLoadingModal, // Added to exports
|
|
18
|
-
hideInstallLoadingModal // Added to exports
|
|
19
|
-
// Potentially add updateOverallInstallStatus, addInstallationStep to exports
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// Make certain functions available globally
|
|
23
|
-
window.showInstallModal = showInstallModal;
|
|
24
|
-
window.showInstallLoadingModal = showInstallLoadingModal;
|
|
25
|
-
// window.appendInstallLoadingMessage = appendInstallLoadingMessage; // Removed
|
|
26
|
-
window.hideInstallLoadingModal = hideInstallLoadingModal;
|
|
27
|
-
|
|
28
|
-
// Listen for the custom event to refresh the main modal content
|
|
29
|
-
document.addEventListener('refreshMainModalContent', () => {
|
|
30
|
-
console.log('[ModalJS] Received refreshMainModalContent event. Refreshing main modal.');
|
|
31
|
-
const lastSelectedCategory = localStorage.getItem('lastSelectedCategory');
|
|
32
|
-
const lastSelectedServerName = localStorage.getItem('lastSelectedServerName');
|
|
33
|
-
|
|
34
|
-
const isCategoryValid = lastSelectedCategory && lastSelectedCategory.trim() !== '' && lastSelectedCategory !== 'undefined' && lastSelectedCategory !== 'null';
|
|
35
|
-
const isServerNameValid = lastSelectedServerName && lastSelectedServerName.trim() !== '' && lastSelectedServerName !== 'undefined' && lastSelectedServerName !== 'null';
|
|
36
|
-
|
|
37
|
-
if (isCategoryValid && isServerNameValid) {
|
|
38
|
-
window.showInstallModal(lastSelectedCategory, lastSelectedServerName);
|
|
39
|
-
} else {
|
|
40
|
-
console.warn(`[ModalJS] Not refreshing modal. Category valid: ${isCategoryValid} (value: "${lastSelectedCategory}"), ServerName valid: ${isServerNameValid} (value: "${lastSelectedServerName}")`);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
1
|
+
import{showInstallModal,closeModal,uninstallTools,showInstallLoadingModal,hideInstallLoadingModal}from"./modal/index.js";export{showInstallModal,closeModal,uninstallTools,showInstallLoadingModal,hideInstallLoadingModal};window.showInstallModal=showInstallModal,window.showInstallLoadingModal=showInstallLoadingModal,window.hideInstallLoadingModal=hideInstallLoadingModal,document.addEventListener("refreshMainModalContent",(()=>{const l=localStorage.getItem("lastSelectedCategory"),o=localStorage.getItem("lastSelectedServerName"),a=l&&""!==l.trim()&&"undefined"!==l&&"null"!==l,d=o&&""!==o.trim()&&"undefined"!==o&&"null"!==o;a&&d&&window.showInstallModal(l,o)}));
|
|
2
|
+
//# sourceMappingURL=modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1,137 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const alertContainer = document.querySelector('.alert-container');
|
|
4
|
-
if (!alertContainer) {
|
|
5
|
-
console.error('Alert container not found. Notifications will not be displayed.');
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
const alertId = `alert-${Date.now()}`;
|
|
9
|
-
|
|
10
|
-
let iconHtml = '';
|
|
11
|
-
switch (type) {
|
|
12
|
-
case 'success':
|
|
13
|
-
iconHtml = '<i class="bi bi-check-circle-fill alert-icon"></i>';
|
|
14
|
-
break;
|
|
15
|
-
case 'error':
|
|
16
|
-
iconHtml = '<i class="bi bi-x-octagon-fill alert-icon"></i>'; // Changed icon for error
|
|
17
|
-
break;
|
|
18
|
-
case 'info':
|
|
19
|
-
iconHtml = '<i class="bi bi-info-circle-fill alert-icon"></i>';
|
|
20
|
-
break;
|
|
21
|
-
case 'warning':
|
|
22
|
-
iconHtml = '<i class="bi bi-exclamation-triangle-fill alert-icon"></i>';
|
|
23
|
-
break;
|
|
24
|
-
default:
|
|
25
|
-
iconHtml = '<i class="bi bi-bell-fill alert-icon"></i>'; // Default icon
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const alertHtml = `
|
|
29
|
-
<div id="${alertId}" class="alert alert-${type}" role="alert">
|
|
30
|
-
${iconHtml}
|
|
31
|
-
<span>${message}</span>
|
|
32
|
-
<button type="button" class="btn-close" aria-label="Close"></button>
|
|
33
|
-
</div>
|
|
34
|
-
`;
|
|
35
|
-
|
|
36
|
-
alertContainer.insertAdjacentHTML('beforeend', alertHtml);
|
|
37
|
-
|
|
38
|
-
const alertElement = document.getElementById(alertId);
|
|
39
|
-
if (!alertElement) return;
|
|
40
|
-
|
|
41
|
-
// Trigger the slide-in animation
|
|
42
|
-
// Adding a slight delay to ensure the element is in the DOM before adding the 'show' class
|
|
43
|
-
requestAnimationFrame(() => {
|
|
44
|
-
requestAnimationFrame(() => { // Double requestAnimationFrame for more reliable transition start
|
|
45
|
-
alertElement.classList.add('show');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const closeButton = alertElement.querySelector('.btn-close');
|
|
51
|
-
|
|
52
|
-
const dismissAlert = () => {
|
|
53
|
-
alertElement.classList.remove('show'); // Trigger slide-out animation
|
|
54
|
-
// Wait for fade out animation to complete before removing
|
|
55
|
-
alertElement.addEventListener('transitionend', () => {
|
|
56
|
-
alertElement.remove();
|
|
57
|
-
}, { once: true }); // Ensure event listener is removed after execution
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
if (closeButton) {
|
|
61
|
-
closeButton.addEventListener('click', dismissAlert);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Auto-dismiss after 5 seconds (increased from 3)
|
|
65
|
-
setTimeout(dismissAlert, 5000);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Function to show a confirmation dialog using custom modal system
|
|
69
|
-
function showConfirm(title, message) {
|
|
70
|
-
return new Promise((resolve) => {
|
|
71
|
-
const modalId = `confirm-modal-${Date.now()}`;
|
|
72
|
-
const modalHtml = `
|
|
73
|
-
<div id="${modalId}" class="modal" style="display: none;">
|
|
74
|
-
<div class="modal-content" style="max-width: 400px; margin: 15% auto;">
|
|
75
|
-
<div class="modal-header">
|
|
76
|
-
<h3 class="text-lg font-semibold text-gray-700">${title}</h3>
|
|
77
|
-
</div>
|
|
78
|
-
<div style="margin: 1rem 0;">
|
|
79
|
-
${message}
|
|
80
|
-
</div>
|
|
81
|
-
<div style="display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1rem;">
|
|
82
|
-
<button type="button" class="cancel-button px-4 py-2 text-gray-600 hover:text-gray-800 font-medium rounded-lg hover:bg-gray-100 transition-colors">
|
|
83
|
-
Cancel
|
|
84
|
-
</button>
|
|
85
|
-
<button type="button" class="confirm-button submit-button">
|
|
86
|
-
Confirm
|
|
87
|
-
</button>
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
`;
|
|
92
|
-
|
|
93
|
-
document.body.insertAdjacentHTML('beforeend', modalHtml);
|
|
94
|
-
|
|
95
|
-
const modalElement = document.getElementById(modalId);
|
|
96
|
-
// Trigger display after a short delay to allow CSS transitions if any are added later for modals
|
|
97
|
-
requestAnimationFrame(() => {
|
|
98
|
-
modalElement.style.display = 'block';
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
// Handle confirm button click
|
|
103
|
-
modalElement.querySelector('.confirm-button').addEventListener('click', () => {
|
|
104
|
-
modalElement.style.display = 'none';
|
|
105
|
-
modalElement.remove();
|
|
106
|
-
resolve(true);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// Handle cancel button click
|
|
110
|
-
modalElement.querySelector('.cancel-button').addEventListener('click', () => {
|
|
111
|
-
modalElement.style.display = 'none';
|
|
112
|
-
modalElement.remove();
|
|
113
|
-
resolve(false);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
// Handle click outside modal
|
|
117
|
-
modalElement.addEventListener('click', (event) => {
|
|
118
|
-
if (event.target === modalElement) {
|
|
119
|
-
modalElement.style.display = 'none';
|
|
120
|
-
modalElement.remove();
|
|
121
|
-
resolve(false);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export { showToast, showConfirm };
|
|
128
|
-
|
|
129
|
-
// Display install notification after page reload
|
|
130
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
131
|
-
const data = sessionStorage.getItem('installNotification');
|
|
132
|
-
if (data) {
|
|
133
|
-
const { message, type } = JSON.parse(data);
|
|
134
|
-
showToast(message, type);
|
|
135
|
-
sessionStorage.removeItem('installNotification');
|
|
136
|
-
}
|
|
137
|
-
});
|
|
1
|
+
function showToast(e,t="success"){const n=document.querySelector(".alert-container");if(!n)return;const o=`alert-${Date.now()}`;let i="";switch(t){case"success":i='<i class="bi bi-check-circle-fill alert-icon"></i>';break;case"error":i='<i class="bi bi-x-octagon-fill alert-icon"></i>';break;case"info":i='<i class="bi bi-info-circle-fill alert-icon"></i>';break;case"warning":i='<i class="bi bi-exclamation-triangle-fill alert-icon"></i>';break;default:i='<i class="bi bi-bell-fill alert-icon"></i>'}const s=`\n <div id="${o}" class="alert alert-${t}" role="alert">\n ${i}\n <span>${e}</span>\n <button type="button" class="btn-close" aria-label="Close"></button>\n </div>\n `;n.insertAdjacentHTML("beforeend",s);const a=document.getElementById(o);if(!a)return;requestAnimationFrame((()=>{requestAnimationFrame((()=>{a.classList.add("show")}))}));const l=a.querySelector(".btn-close"),r=()=>{a.classList.remove("show"),a.addEventListener("transitionend",(()=>{a.remove()}),{once:!0})};l&&l.addEventListener("click",r),setTimeout(r,5e3)}function showConfirm(e,t){return new Promise((n=>{const o=`confirm-modal-${Date.now()}`,i=`\n <div id="${o}" class="modal" style="display: none;">\n <div class="modal-content" style="max-width: 400px; margin: 15% auto;">\n <div class="modal-header">\n <h3 class="text-lg font-semibold text-gray-700">${e}</h3>\n </div>\n <div style="margin: 1rem 0;">\n ${t}\n </div>\n <div style="display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1rem;">\n <button type="button" class="cancel-button px-4 py-2 text-gray-600 hover:text-gray-800 font-medium rounded-lg hover:bg-gray-100 transition-colors">\n Cancel\n </button>\n <button type="button" class="confirm-button submit-button">\n Confirm\n </button>\n </div>\n </div>\n </div>\n `;document.body.insertAdjacentHTML("beforeend",i);const s=document.getElementById(o);requestAnimationFrame((()=>{s.style.display="block"})),s.querySelector(".confirm-button").addEventListener("click",(()=>{s.style.display="none",s.remove(),n(!0)})),s.querySelector(".cancel-button").addEventListener("click",(()=>{s.style.display="none",s.remove(),n(!1)})),s.addEventListener("click",(e=>{e.target===s&&(s.style.display="none",s.remove(),n(!1))}))}))}export{showToast,showConfirm};document.addEventListener("DOMContentLoaded",(()=>{const e=sessionStorage.getItem("installNotification");if(e){const{message:t,type:n}=JSON.parse(e);showToast(t,n),sessionStorage.removeItem("installNotification")}}));
|
|
2
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|