@qwickapps/server 1.7.0 → 1.7.2
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/CHANGELOG.md +66 -0
- package/README.md +13 -116
- package/dist/src/core/control-panel.d.ts.map +1 -1
- package/dist/src/core/control-panel.js +6 -4
- package/dist/src/core/control-panel.js.map +1 -1
- package/dist/src/core/gateway.d.ts.map +1 -1
- package/dist/src/core/gateway.js +24 -2
- package/dist/src/core/gateway.js.map +1 -1
- package/dist/src/core/plugin-registry.d.ts +15 -2
- package/dist/src/core/plugin-registry.d.ts.map +1 -1
- package/dist/src/core/plugin-registry.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/api-keys/api-keys-plugin.d.ts +5 -2
- package/dist/src/plugins/api-keys/api-keys-plugin.d.ts.map +1 -1
- package/dist/src/plugins/api-keys/api-keys-plugin.js +61 -19
- package/dist/src/plugins/api-keys/api-keys-plugin.js.map +1 -1
- package/dist/src/plugins/api-keys/index.d.ts +0 -4
- package/dist/src/plugins/api-keys/index.d.ts.map +1 -1
- package/dist/src/plugins/api-keys/index.js +2 -3
- package/dist/src/plugins/api-keys/index.js.map +1 -1
- package/dist/src/plugins/api-keys/stores/postgres-store.d.ts.map +1 -1
- package/dist/src/plugins/api-keys/stores/postgres-store.js +29 -0
- package/dist/src/plugins/api-keys/stores/postgres-store.js.map +1 -1
- package/dist/src/plugins/api-keys/types.d.ts +9 -3
- package/dist/src/plugins/api-keys/types.d.ts.map +1 -1
- package/dist/src/plugins/api-keys/types.js.map +1 -1
- package/dist/src/plugins/auth/auth-plugin.d.ts.map +1 -1
- package/dist/src/plugins/auth/auth-plugin.js +4 -2
- package/dist/src/plugins/auth/auth-plugin.js.map +1 -1
- package/dist/src/plugins/auth/env-config.d.ts.map +1 -1
- package/dist/src/plugins/auth/env-config.js +1 -0
- package/dist/src/plugins/auth/env-config.js.map +1 -1
- package/dist/src/plugins/auth/index.d.ts +0 -4
- package/dist/src/plugins/auth/index.d.ts.map +1 -1
- package/dist/src/plugins/auth/index.js +2 -3
- package/dist/src/plugins/auth/index.js.map +1 -1
- package/dist/src/plugins/bans/bans-plugin.d.ts +5 -2
- package/dist/src/plugins/bans/bans-plugin.d.ts.map +1 -1
- package/dist/src/plugins/bans/bans-plugin.js +71 -25
- package/dist/src/plugins/bans/bans-plugin.js.map +1 -1
- package/dist/src/plugins/bans/index.d.ts +1 -5
- package/dist/src/plugins/bans/index.d.ts.map +1 -1
- package/dist/src/plugins/bans/index.js +3 -4
- package/dist/src/plugins/bans/index.js.map +1 -1
- package/dist/src/plugins/bans/stores/in-memory-store.d.ts +34 -0
- package/dist/src/plugins/bans/stores/in-memory-store.d.ts.map +1 -0
- package/dist/src/plugins/bans/stores/in-memory-store.js +97 -0
- package/dist/src/plugins/bans/stores/in-memory-store.js.map +1 -0
- package/dist/src/plugins/bans/stores/index.d.ts +1 -0
- package/dist/src/plugins/bans/stores/index.d.ts.map +1 -1
- package/dist/src/plugins/bans/stores/index.js +1 -0
- package/dist/src/plugins/bans/stores/index.js.map +1 -1
- package/dist/src/plugins/bans/types.d.ts +13 -6
- package/dist/src/plugins/bans/types.d.ts.map +1 -1
- package/dist/src/plugins/cache-plugin.d.ts +35 -16
- package/dist/src/plugins/cache-plugin.d.ts.map +1 -1
- package/dist/src/plugins/cache-plugin.js +299 -20
- package/dist/src/plugins/cache-plugin.js.map +1 -1
- package/dist/src/plugins/cms/cms-plugin.d.ts.map +1 -1
- package/dist/src/plugins/cms/cms-plugin.js +3 -1
- package/dist/src/plugins/cms/cms-plugin.js.map +1 -1
- package/dist/src/plugins/devices/devices-plugin.d.ts +5 -2
- package/dist/src/plugins/devices/devices-plugin.d.ts.map +1 -1
- package/dist/src/plugins/devices/devices-plugin.js +62 -26
- package/dist/src/plugins/devices/devices-plugin.js.map +1 -1
- package/dist/src/plugins/devices/index.d.ts +0 -4
- package/dist/src/plugins/devices/index.d.ts.map +1 -1
- package/dist/src/plugins/devices/index.js +2 -3
- package/dist/src/plugins/devices/index.js.map +1 -1
- package/dist/src/plugins/entitlements/entitlements-plugin.d.ts +5 -2
- package/dist/src/plugins/entitlements/entitlements-plugin.d.ts.map +1 -1
- package/dist/src/plugins/entitlements/entitlements-plugin.js +78 -41
- package/dist/src/plugins/entitlements/entitlements-plugin.js.map +1 -1
- package/dist/src/plugins/entitlements/index.d.ts +1 -5
- package/dist/src/plugins/entitlements/index.d.ts.map +1 -1
- package/dist/src/plugins/entitlements/index.js +3 -4
- package/dist/src/plugins/entitlements/index.js.map +1 -1
- package/dist/src/plugins/entitlements/sources/in-memory-source.d.ts +9 -0
- package/dist/src/plugins/entitlements/sources/in-memory-source.d.ts.map +1 -0
- package/dist/src/plugins/entitlements/sources/in-memory-source.js +65 -0
- package/dist/src/plugins/entitlements/sources/in-memory-source.js.map +1 -0
- package/dist/src/plugins/entitlements/sources/index.d.ts +1 -0
- package/dist/src/plugins/entitlements/sources/index.d.ts.map +1 -1
- package/dist/src/plugins/entitlements/sources/index.js +1 -0
- package/dist/src/plugins/entitlements/sources/index.js.map +1 -1
- package/dist/src/plugins/entitlements/types.d.ts +9 -2
- package/dist/src/plugins/entitlements/types.d.ts.map +1 -1
- package/dist/src/plugins/health-plugin.d.ts.map +1 -1
- package/dist/src/plugins/health-plugin.js +1 -0
- package/dist/src/plugins/health-plugin.js.map +1 -1
- package/dist/src/plugins/index.d.ts +4 -4
- package/dist/src/plugins/index.d.ts.map +1 -1
- package/dist/src/plugins/index.js +4 -4
- package/dist/src/plugins/index.js.map +1 -1
- package/dist/src/plugins/logs-plugin.d.ts.map +1 -1
- package/dist/src/plugins/logs-plugin.js +49 -1
- package/dist/src/plugins/logs-plugin.js.map +1 -1
- package/dist/src/plugins/maintenance-plugin.d.ts.map +1 -1
- package/dist/src/plugins/maintenance-plugin.js +39 -0
- package/dist/src/plugins/maintenance-plugin.js.map +1 -1
- package/dist/src/plugins/notifications/index.d.ts +0 -4
- package/dist/src/plugins/notifications/index.d.ts.map +1 -1
- package/dist/src/plugins/notifications/index.js +2 -3
- package/dist/src/plugins/notifications/index.js.map +1 -1
- package/dist/src/plugins/notifications/notifications-plugin.d.ts +5 -2
- package/dist/src/plugins/notifications/notifications-plugin.d.ts.map +1 -1
- package/dist/src/plugins/notifications/notifications-plugin.js +46 -13
- package/dist/src/plugins/notifications/notifications-plugin.js.map +1 -1
- package/dist/src/plugins/parental/index.d.ts +0 -4
- package/dist/src/plugins/parental/index.d.ts.map +1 -1
- package/dist/src/plugins/parental/index.js +2 -3
- package/dist/src/plugins/parental/index.js.map +1 -1
- package/dist/src/plugins/parental/parental-plugin.d.ts +5 -2
- package/dist/src/plugins/parental/parental-plugin.d.ts.map +1 -1
- package/dist/src/plugins/parental/parental-plugin.js +60 -24
- package/dist/src/plugins/parental/parental-plugin.js.map +1 -1
- package/dist/src/plugins/postgres-plugin.d.ts +3 -1
- package/dist/src/plugins/postgres-plugin.d.ts.map +1 -1
- package/dist/src/plugins/postgres-plugin.js +18 -8
- package/dist/src/plugins/postgres-plugin.js.map +1 -1
- package/dist/src/plugins/preferences/index.d.ts +0 -4
- package/dist/src/plugins/preferences/index.d.ts.map +1 -1
- package/dist/src/plugins/preferences/index.js +2 -3
- package/dist/src/plugins/preferences/index.js.map +1 -1
- package/dist/src/plugins/preferences/preferences-plugin.d.ts +5 -2
- package/dist/src/plugins/preferences/preferences-plugin.d.ts.map +1 -1
- package/dist/src/plugins/preferences/preferences-plugin.js +63 -19
- package/dist/src/plugins/preferences/preferences-plugin.js.map +1 -1
- package/dist/src/plugins/profiles/index.d.ts +0 -4
- package/dist/src/plugins/profiles/index.d.ts.map +1 -1
- package/dist/src/plugins/profiles/index.js +2 -3
- package/dist/src/plugins/profiles/index.js.map +1 -1
- package/dist/src/plugins/profiles/profiles-plugin.d.ts +5 -2
- package/dist/src/plugins/profiles/profiles-plugin.d.ts.map +1 -1
- package/dist/src/plugins/profiles/profiles-plugin.js +60 -26
- package/dist/src/plugins/profiles/profiles-plugin.js.map +1 -1
- package/dist/src/plugins/profiles/types.d.ts +9 -2
- package/dist/src/plugins/profiles/types.d.ts.map +1 -1
- package/dist/src/plugins/qwickbrain/index.d.ts +0 -4
- package/dist/src/plugins/qwickbrain/index.d.ts.map +1 -1
- package/dist/src/plugins/qwickbrain/index.js +2 -3
- package/dist/src/plugins/qwickbrain/index.js.map +1 -1
- package/dist/src/plugins/qwickbrain/qwickbrain-plugin.d.ts.map +1 -1
- package/dist/src/plugins/qwickbrain/qwickbrain-plugin.js +117 -0
- package/dist/src/plugins/qwickbrain/qwickbrain-plugin.js.map +1 -1
- package/dist/src/plugins/rate-limit/index.d.ts +0 -4
- package/dist/src/plugins/rate-limit/index.d.ts.map +1 -1
- package/dist/src/plugins/rate-limit/index.js +2 -3
- package/dist/src/plugins/rate-limit/index.js.map +1 -1
- package/dist/src/plugins/subscriptions/index.d.ts +0 -4
- package/dist/src/plugins/subscriptions/index.d.ts.map +1 -1
- package/dist/src/plugins/subscriptions/index.js +2 -3
- package/dist/src/plugins/subscriptions/index.js.map +1 -1
- package/dist/src/plugins/subscriptions/subscriptions-plugin.d.ts +5 -2
- package/dist/src/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -1
- package/dist/src/plugins/subscriptions/subscriptions-plugin.js +63 -29
- package/dist/src/plugins/subscriptions/subscriptions-plugin.js.map +1 -1
- package/dist/src/plugins/subscriptions/types.d.ts +8 -2
- package/dist/src/plugins/subscriptions/types.d.ts.map +1 -1
- package/dist/src/plugins/tenants/index.d.ts +1 -1
- package/dist/src/plugins/tenants/index.d.ts.map +1 -1
- package/dist/src/plugins/tenants/index.js +1 -1
- package/dist/src/plugins/tenants/index.js.map +1 -1
- package/dist/src/plugins/tenants/stores/in-memory-store.d.ts +59 -0
- package/dist/src/plugins/tenants/stores/in-memory-store.d.ts.map +1 -0
- package/dist/src/plugins/tenants/stores/in-memory-store.js +257 -0
- package/dist/src/plugins/tenants/stores/in-memory-store.js.map +1 -0
- package/dist/src/plugins/tenants/stores/index.d.ts +8 -0
- package/dist/src/plugins/tenants/stores/index.d.ts.map +1 -0
- package/dist/src/plugins/tenants/stores/index.js +8 -0
- package/dist/src/plugins/tenants/stores/index.js.map +1 -0
- package/dist/src/plugins/tenants/tenants-plugin.d.ts +5 -2
- package/dist/src/plugins/tenants/tenants-plugin.d.ts.map +1 -1
- package/dist/src/plugins/tenants/tenants-plugin.js +93 -60
- package/dist/src/plugins/tenants/tenants-plugin.js.map +1 -1
- package/dist/src/plugins/tenants/types.d.ts +8 -2
- package/dist/src/plugins/tenants/types.d.ts.map +1 -1
- package/dist/src/plugins/usage/index.d.ts +0 -4
- package/dist/src/plugins/usage/index.d.ts.map +1 -1
- package/dist/src/plugins/usage/index.js +2 -3
- package/dist/src/plugins/usage/index.js.map +1 -1
- package/dist/src/plugins/usage/usage-plugin.d.ts +5 -2
- package/dist/src/plugins/usage/usage-plugin.d.ts.map +1 -1
- package/dist/src/plugins/usage/usage-plugin.js +57 -23
- package/dist/src/plugins/usage/usage-plugin.js.map +1 -1
- package/dist/src/plugins/users/index.d.ts +1 -1
- package/dist/src/plugins/users/index.d.ts.map +1 -1
- package/dist/src/plugins/users/index.js +1 -1
- package/dist/src/plugins/users/index.js.map +1 -1
- package/dist/src/plugins/users/stores/in-memory-store.d.ts +36 -0
- package/dist/src/plugins/users/stores/in-memory-store.d.ts.map +1 -0
- package/dist/src/plugins/users/stores/in-memory-store.js +122 -0
- package/dist/src/plugins/users/stores/in-memory-store.js.map +1 -0
- package/dist/src/plugins/users/stores/index.d.ts +1 -0
- package/dist/src/plugins/users/stores/index.d.ts.map +1 -1
- package/dist/src/plugins/users/stores/index.js +1 -0
- package/dist/src/plugins/users/stores/index.js.map +1 -1
- package/dist/src/plugins/users/types.d.ts +7 -2
- package/dist/src/plugins/users/types.d.ts.map +1 -1
- package/dist/src/plugins/users/users-plugin.d.ts +5 -2
- package/dist/src/plugins/users/users-plugin.d.ts.map +1 -1
- package/dist/src/plugins/users/users-plugin.js +56 -23
- package/dist/src/plugins/users/users-plugin.js.map +1 -1
- package/dist/ui/src/api/controlPanelApi.d.ts +10 -1
- package/dist/ui/src/api/controlPanelApi.d.ts.map +1 -1
- package/dist/ui/src/api/controlPanelApi.js.map +1 -1
- package/dist/ui/src/dashboard/PluginWidgetRenderer.d.ts +3 -1
- package/dist/ui/src/dashboard/PluginWidgetRenderer.d.ts.map +1 -1
- package/dist/ui/src/dashboard/PluginWidgetRenderer.js +5 -1
- package/dist/ui/src/dashboard/PluginWidgetRenderer.js.map +1 -1
- package/dist/ui/src/dashboard/builtInWidgets.d.ts.map +1 -1
- package/dist/ui/src/dashboard/builtInWidgets.js +13 -1
- package/dist/ui/src/dashboard/builtInWidgets.js.map +1 -1
- package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.d.ts +11 -0
- package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.d.ts.map +1 -0
- package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.js +77 -0
- package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.js.map +1 -0
- package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.d.ts +10 -0
- package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.d.ts.map +1 -0
- package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.js +14 -0
- package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.js.map +1 -0
- package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.d.ts +10 -0
- package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.d.ts.map +1 -0
- package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.js +14 -0
- package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.js.map +1 -0
- package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.d.ts +11 -0
- package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.d.ts.map +1 -0
- package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.js +96 -0
- package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.js.map +1 -0
- package/dist/ui/src/dashboard/widgets/SeedManagementWidget.d.ts +10 -0
- package/dist/ui/src/dashboard/widgets/SeedManagementWidget.d.ts.map +1 -0
- package/dist/ui/src/dashboard/widgets/SeedManagementWidget.js +55 -0
- package/dist/ui/src/dashboard/widgets/SeedManagementWidget.js.map +1 -0
- package/dist/ui/src/dashboard/widgets/ServiceControlWidget.d.ts +10 -0
- package/dist/ui/src/dashboard/widgets/ServiceControlWidget.d.ts.map +1 -0
- package/dist/ui/src/dashboard/widgets/ServiceControlWidget.js +14 -0
- package/dist/ui/src/dashboard/widgets/ServiceControlWidget.js.map +1 -0
- package/dist/ui/src/dashboard/widgets/index.d.ts +6 -0
- package/dist/ui/src/dashboard/widgets/index.d.ts.map +1 -1
- package/dist/ui/src/dashboard/widgets/index.js +6 -0
- package/dist/ui/src/dashboard/widgets/index.js.map +1 -1
- package/dist/ui/src/pages/DashboardPage.js +1 -1
- package/dist/ui/src/pages/DashboardPage.js.map +1 -1
- package/dist-ui/assets/index-0gzisPdy.js +528 -0
- package/dist-ui/assets/{index-lm1yX6UD.js.map → index-0gzisPdy.js.map} +1 -1
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/index.js +3109 -2774
- package/dist-ui-lib/index.js.map +1 -1
- package/dist-ui-lib/src/api/controlPanelApi.d.ts +10 -1
- package/dist-ui-lib/src/dashboard/PluginWidgetRenderer.d.ts +3 -1
- package/dist-ui-lib/src/dashboard/widgets/CacheMaintenanceWidget.d.ts +10 -0
- package/dist-ui-lib/src/dashboard/widgets/DatabaseOpsWidget.d.ts +9 -0
- package/dist-ui-lib/src/dashboard/widgets/EnvironmentConfigWidget.d.ts +9 -0
- package/dist-ui-lib/src/dashboard/widgets/LogsMaintenanceWidget.d.ts +10 -0
- package/dist-ui-lib/src/dashboard/widgets/SeedManagementWidget.d.ts +9 -0
- package/dist-ui-lib/src/dashboard/widgets/ServiceControlWidget.d.ts +9 -0
- package/dist-ui-lib/src/dashboard/widgets/index.d.ts +6 -0
- package/package.json +12 -6
- package/src/core/control-panel.ts +6 -4
- package/src/core/gateway.ts +25 -2
- package/src/core/plugin-registry.ts +15 -2
- package/src/index.ts +53 -0
- package/src/plugins/api-keys/api-keys-plugin.ts +64 -20
- package/src/plugins/api-keys/index.ts +2 -5
- package/src/plugins/api-keys/stores/postgres-store.ts +30 -0
- package/src/plugins/api-keys/types.ts +9 -3
- package/src/plugins/auth/auth-plugin.ts +4 -2
- package/src/plugins/auth/env-config.ts +1 -0
- package/src/plugins/auth/index.ts +3 -5
- package/src/plugins/bans/bans-plugin.ts +71 -26
- package/src/plugins/bans/index.ts +4 -6
- package/src/plugins/bans/stores/in-memory-store.ts +106 -0
- package/src/plugins/bans/stores/index.ts +1 -0
- package/src/plugins/bans/types.ts +13 -6
- package/src/plugins/cache-plugin.test.ts +2 -2
- package/src/plugins/cache-plugin.ts +331 -30
- package/src/plugins/cms/cms-plugin.ts +3 -1
- package/src/plugins/devices/devices-plugin.ts +62 -27
- package/src/plugins/devices/index.ts +3 -5
- package/src/plugins/entitlements/entitlements-plugin.ts +81 -43
- package/src/plugins/entitlements/index.ts +4 -6
- package/src/plugins/entitlements/sources/in-memory-source.ts +76 -0
- package/src/plugins/entitlements/sources/index.ts +1 -0
- package/src/plugins/entitlements/types.ts +9 -2
- package/src/plugins/health-plugin.ts +1 -0
- package/src/plugins/index.ts +4 -1
- package/src/plugins/logs-plugin.ts +55 -1
- package/src/plugins/maintenance-plugin.ts +43 -0
- package/src/plugins/notifications/index.ts +3 -5
- package/src/plugins/notifications/notifications-plugin.ts +49 -19
- package/src/plugins/parental/index.ts +3 -5
- package/src/plugins/parental/parental-plugin.ts +63 -25
- package/src/plugins/postgres-plugin.test.ts +2 -2
- package/src/plugins/postgres-plugin.ts +20 -9
- package/src/plugins/preferences/index.ts +3 -5
- package/src/plugins/preferences/preferences-plugin.ts +66 -20
- package/src/plugins/profiles/index.ts +3 -5
- package/src/plugins/profiles/profiles-plugin.ts +60 -27
- package/src/plugins/profiles/types.ts +9 -2
- package/src/plugins/qwickbrain/index.ts +3 -5
- package/src/plugins/qwickbrain/qwickbrain-plugin.ts +135 -0
- package/src/plugins/rate-limit/index.ts +3 -5
- package/src/plugins/subscriptions/index.ts +3 -5
- package/src/plugins/subscriptions/subscriptions-plugin.ts +63 -30
- package/src/plugins/subscriptions/types.ts +8 -2
- package/src/plugins/tenants/index.ts +1 -1
- package/src/plugins/tenants/stores/in-memory-store.ts +335 -0
- package/src/plugins/tenants/stores/index.ts +13 -0
- package/src/plugins/tenants/tenants-plugin.ts +97 -62
- package/src/plugins/tenants/types.ts +8 -2
- package/src/plugins/usage/index.ts +3 -5
- package/src/plugins/usage/usage-plugin.ts +60 -26
- package/src/plugins/users/index.ts +1 -1
- package/src/plugins/users/stores/in-memory-store.ts +140 -0
- package/src/plugins/users/stores/index.ts +1 -0
- package/src/plugins/users/types.ts +7 -2
- package/src/plugins/users/users-plugin.ts +56 -24
- package/src/testing/index.ts +1 -0
- package/src/testing/pg-mem-pool.ts +33 -0
- package/ui/src/api/controlPanelApi.ts +10 -1
- package/ui/src/dashboard/PluginWidgetRenderer.tsx +8 -0
- package/ui/src/dashboard/builtInWidgets.tsx +19 -1
- package/ui/src/dashboard/widgets/CacheMaintenanceWidget.tsx +195 -0
- package/ui/src/dashboard/widgets/DatabaseOpsWidget.tsx +29 -0
- package/ui/src/dashboard/widgets/EnvironmentConfigWidget.tsx +29 -0
- package/ui/src/dashboard/widgets/LogsMaintenanceWidget.tsx +247 -0
- package/ui/src/dashboard/widgets/SeedManagementWidget.tsx +128 -0
- package/ui/src/dashboard/widgets/ServiceControlWidget.tsx +29 -0
- package/ui/src/dashboard/widgets/index.ts +6 -0
- package/ui/src/pages/DashboardPage.tsx +2 -2
- package/ui/src/pages/MaintenancePage.tsx +1 -1
- package/dist-ui/assets/index-lm1yX6UD.js +0 -528
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Maintenance Widget
|
|
3
|
+
*
|
|
4
|
+
* Provides cache management operations:
|
|
5
|
+
* - View cache statistics
|
|
6
|
+
* - Clear cache (flush all keys)
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { useState, useEffect } from 'react';
|
|
12
|
+
import {
|
|
13
|
+
Card,
|
|
14
|
+
CardContent,
|
|
15
|
+
Typography,
|
|
16
|
+
Button,
|
|
17
|
+
Alert,
|
|
18
|
+
Box,
|
|
19
|
+
Dialog,
|
|
20
|
+
DialogTitle,
|
|
21
|
+
DialogContent,
|
|
22
|
+
DialogContentText,
|
|
23
|
+
DialogActions,
|
|
24
|
+
CircularProgress,
|
|
25
|
+
Chip,
|
|
26
|
+
} from '@mui/material';
|
|
27
|
+
import DeleteIcon from '@mui/icons-material/Delete';
|
|
28
|
+
import RefreshIcon from '@mui/icons-material/Refresh';
|
|
29
|
+
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
|
|
30
|
+
import ErrorIcon from '@mui/icons-material/Error';
|
|
31
|
+
|
|
32
|
+
interface CacheStats {
|
|
33
|
+
connected: boolean;
|
|
34
|
+
keyCount: number;
|
|
35
|
+
usedMemory?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function CacheMaintenanceWidget() {
|
|
39
|
+
const [stats, setStats] = useState<CacheStats | null>(null);
|
|
40
|
+
const [loading, setLoading] = useState(true);
|
|
41
|
+
const [flushing, setFlushing] = useState(false);
|
|
42
|
+
const [error, setError] = useState<string | null>(null);
|
|
43
|
+
const [success, setSuccess] = useState<string | null>(null);
|
|
44
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
45
|
+
|
|
46
|
+
const fetchStats = async () => {
|
|
47
|
+
setLoading(true);
|
|
48
|
+
setError(null);
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch('/api/cache:default/stats');
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
if (response.status === 404) {
|
|
53
|
+
throw new Error('Cache plugin not configured');
|
|
54
|
+
}
|
|
55
|
+
throw new Error('Failed to fetch cache stats');
|
|
56
|
+
}
|
|
57
|
+
const data = await response.json();
|
|
58
|
+
setStats(data);
|
|
59
|
+
} catch (err) {
|
|
60
|
+
setError(err instanceof Error ? err.message : 'Failed to fetch cache stats');
|
|
61
|
+
setStats(null);
|
|
62
|
+
} finally {
|
|
63
|
+
setLoading(false);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
fetchStats();
|
|
69
|
+
}, []);
|
|
70
|
+
|
|
71
|
+
const handleFlushCache = async () => {
|
|
72
|
+
setConfirmOpen(false);
|
|
73
|
+
setFlushing(true);
|
|
74
|
+
setError(null);
|
|
75
|
+
setSuccess(null);
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const response = await fetch('/api/cache:default/flush', {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
headers: { 'Content-Type': 'application/json' },
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
const data = await response.json();
|
|
85
|
+
throw new Error(data.error || 'Failed to flush cache');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const data = await response.json();
|
|
89
|
+
setSuccess(
|
|
90
|
+
data.message + (data.deletedCount !== undefined ? ` (${data.deletedCount} keys deleted)` : '')
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Refresh stats
|
|
94
|
+
await fetchStats();
|
|
95
|
+
} catch (err) {
|
|
96
|
+
setError(err instanceof Error ? err.message : 'Failed to flush cache');
|
|
97
|
+
} finally {
|
|
98
|
+
setFlushing(false);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<Card>
|
|
104
|
+
<CardContent>
|
|
105
|
+
<Typography variant="h6" gutterBottom>
|
|
106
|
+
Cache Management
|
|
107
|
+
</Typography>
|
|
108
|
+
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
|
|
109
|
+
View cache statistics and clear cache
|
|
110
|
+
</Typography>
|
|
111
|
+
|
|
112
|
+
{error && (
|
|
113
|
+
<Alert severity="error" sx={{ mb: 2 }} onClose={() => setError(null)}>
|
|
114
|
+
{error}
|
|
115
|
+
</Alert>
|
|
116
|
+
)}
|
|
117
|
+
|
|
118
|
+
{success && (
|
|
119
|
+
<Alert severity="success" sx={{ mb: 2 }} onClose={() => setSuccess(null)}>
|
|
120
|
+
{success}
|
|
121
|
+
</Alert>
|
|
122
|
+
)}
|
|
123
|
+
|
|
124
|
+
{loading ? (
|
|
125
|
+
<Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}>
|
|
126
|
+
<CircularProgress size={30} />
|
|
127
|
+
</Box>
|
|
128
|
+
) : stats ? (
|
|
129
|
+
<Box sx={{ mb: 2 }}>
|
|
130
|
+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>
|
|
131
|
+
<Typography variant="body2" color="text.secondary">
|
|
132
|
+
<strong>Status:</strong>
|
|
133
|
+
</Typography>
|
|
134
|
+
<Chip
|
|
135
|
+
size="small"
|
|
136
|
+
icon={stats.connected ? <CheckCircleIcon /> : <ErrorIcon />}
|
|
137
|
+
label={stats.connected ? 'Connected' : 'Disconnected'}
|
|
138
|
+
color={stats.connected ? 'success' : 'error'}
|
|
139
|
+
/>
|
|
140
|
+
</Box>
|
|
141
|
+
|
|
142
|
+
<Typography variant="body2" color="text.secondary">
|
|
143
|
+
<strong>Key Count:</strong> {stats.keyCount.toLocaleString()}
|
|
144
|
+
</Typography>
|
|
145
|
+
|
|
146
|
+
{stats.usedMemory && (
|
|
147
|
+
<Typography variant="body2" color="text.secondary">
|
|
148
|
+
<strong>Memory Used:</strong> {stats.usedMemory}
|
|
149
|
+
</Typography>
|
|
150
|
+
)}
|
|
151
|
+
</Box>
|
|
152
|
+
) : null}
|
|
153
|
+
|
|
154
|
+
<Box sx={{ display: 'flex', gap: 1 }}>
|
|
155
|
+
<Button
|
|
156
|
+
variant="outlined"
|
|
157
|
+
color="primary"
|
|
158
|
+
size="small"
|
|
159
|
+
startIcon={<RefreshIcon />}
|
|
160
|
+
onClick={fetchStats}
|
|
161
|
+
disabled={loading}
|
|
162
|
+
>
|
|
163
|
+
Refresh
|
|
164
|
+
</Button>
|
|
165
|
+
<Button
|
|
166
|
+
variant="contained"
|
|
167
|
+
color="error"
|
|
168
|
+
size="small"
|
|
169
|
+
startIcon={flushing ? <CircularProgress size={16} color="inherit" /> : <DeleteIcon />}
|
|
170
|
+
onClick={() => setConfirmOpen(true)}
|
|
171
|
+
disabled={!stats || !stats.connected || flushing || loading}
|
|
172
|
+
>
|
|
173
|
+
Flush Cache
|
|
174
|
+
</Button>
|
|
175
|
+
</Box>
|
|
176
|
+
|
|
177
|
+
<Dialog open={confirmOpen} onClose={() => setConfirmOpen(false)}>
|
|
178
|
+
<DialogTitle>Flush Cache</DialogTitle>
|
|
179
|
+
<DialogContent>
|
|
180
|
+
<DialogContentText>
|
|
181
|
+
Are you sure you want to flush the cache? This will delete{' '}
|
|
182
|
+
{stats?.keyCount.toLocaleString()} keys. This action cannot be undone.
|
|
183
|
+
</DialogContentText>
|
|
184
|
+
</DialogContent>
|
|
185
|
+
<DialogActions>
|
|
186
|
+
<Button onClick={() => setConfirmOpen(false)}>Cancel</Button>
|
|
187
|
+
<Button onClick={handleFlushCache} color="error" variant="contained">
|
|
188
|
+
Flush
|
|
189
|
+
</Button>
|
|
190
|
+
</DialogActions>
|
|
191
|
+
</Dialog>
|
|
192
|
+
</CardContent>
|
|
193
|
+
</Card>
|
|
194
|
+
);
|
|
195
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Operations Widget
|
|
3
|
+
*
|
|
4
|
+
* Provides database backup, restore, and maintenance operations.
|
|
5
|
+
* Part of the maintenance plugin.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Card, CardContent, Typography, Alert } from '@mui/material';
|
|
11
|
+
|
|
12
|
+
export function DatabaseOpsWidget() {
|
|
13
|
+
return (
|
|
14
|
+
<Card>
|
|
15
|
+
<CardContent>
|
|
16
|
+
<Typography variant="h6" gutterBottom>
|
|
17
|
+
Database Operations
|
|
18
|
+
</Typography>
|
|
19
|
+
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
|
|
20
|
+
Backup, restore, and maintain database
|
|
21
|
+
</Typography>
|
|
22
|
+
|
|
23
|
+
<Alert severity="info">
|
|
24
|
+
Database operations UI coming soon. This will allow you to backup and restore your database.
|
|
25
|
+
</Alert>
|
|
26
|
+
</CardContent>
|
|
27
|
+
</Card>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Configuration Widget
|
|
3
|
+
*
|
|
4
|
+
* Displays and allows editing environment variables.
|
|
5
|
+
* Part of the maintenance plugin.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Card, CardContent, Typography, Alert } from '@mui/material';
|
|
11
|
+
|
|
12
|
+
export function EnvironmentConfigWidget() {
|
|
13
|
+
return (
|
|
14
|
+
<Card>
|
|
15
|
+
<CardContent>
|
|
16
|
+
<Typography variant="h6" gutterBottom>
|
|
17
|
+
Environment Configuration
|
|
18
|
+
</Typography>
|
|
19
|
+
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
|
|
20
|
+
View and manage environment variables
|
|
21
|
+
</Typography>
|
|
22
|
+
|
|
23
|
+
<Alert severity="info">
|
|
24
|
+
Environment configuration UI coming soon. This will allow you to view and edit environment variables.
|
|
25
|
+
</Alert>
|
|
26
|
+
</CardContent>
|
|
27
|
+
</Card>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logs Maintenance Widget
|
|
3
|
+
*
|
|
4
|
+
* Provides log management operations:
|
|
5
|
+
* - View log statistics
|
|
6
|
+
* - Clear log files
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { useState, useEffect } from 'react';
|
|
12
|
+
import {
|
|
13
|
+
Card,
|
|
14
|
+
CardContent,
|
|
15
|
+
Typography,
|
|
16
|
+
Button,
|
|
17
|
+
Alert,
|
|
18
|
+
Box,
|
|
19
|
+
Select,
|
|
20
|
+
MenuItem,
|
|
21
|
+
FormControl,
|
|
22
|
+
InputLabel,
|
|
23
|
+
Dialog,
|
|
24
|
+
DialogTitle,
|
|
25
|
+
DialogContent,
|
|
26
|
+
DialogContentText,
|
|
27
|
+
DialogActions,
|
|
28
|
+
CircularProgress,
|
|
29
|
+
} from '@mui/material';
|
|
30
|
+
import DeleteIcon from '@mui/icons-material/Delete';
|
|
31
|
+
import RefreshIcon from '@mui/icons-material/Refresh';
|
|
32
|
+
|
|
33
|
+
interface LogSource {
|
|
34
|
+
name: string;
|
|
35
|
+
type: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface LogStats {
|
|
39
|
+
totalLogs: number;
|
|
40
|
+
byLevel: {
|
|
41
|
+
debug: number;
|
|
42
|
+
info: number;
|
|
43
|
+
warn: number;
|
|
44
|
+
error: number;
|
|
45
|
+
};
|
|
46
|
+
fileSize: number;
|
|
47
|
+
fileSizeFormatted: string;
|
|
48
|
+
oldestLog: string | null;
|
|
49
|
+
newestLog: string | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function LogsMaintenanceWidget() {
|
|
53
|
+
const [sources, setSources] = useState<LogSource[]>([]);
|
|
54
|
+
const [selectedSource, setSelectedSource] = useState<string>('');
|
|
55
|
+
const [stats, setStats] = useState<LogStats | null>(null);
|
|
56
|
+
const [loading, setLoading] = useState(true);
|
|
57
|
+
const [clearing, setClearing] = useState(false);
|
|
58
|
+
const [error, setError] = useState<string | null>(null);
|
|
59
|
+
const [success, setSuccess] = useState<string | null>(null);
|
|
60
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
61
|
+
|
|
62
|
+
const fetchSources = async () => {
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch('/api/logs/sources');
|
|
65
|
+
if (!response.ok) throw new Error('Failed to fetch log sources');
|
|
66
|
+
const data = await response.json();
|
|
67
|
+
setSources(data.sources || []);
|
|
68
|
+
if (data.sources && data.sources.length > 0 && !selectedSource) {
|
|
69
|
+
setSelectedSource(data.sources[0].name);
|
|
70
|
+
}
|
|
71
|
+
} catch (err) {
|
|
72
|
+
setError(err instanceof Error ? err.message : 'Failed to fetch log sources');
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const fetchStats = async () => {
|
|
77
|
+
if (!selectedSource) return;
|
|
78
|
+
|
|
79
|
+
setLoading(true);
|
|
80
|
+
setError(null);
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch(`/api/logs/stats?source=${selectedSource}`);
|
|
83
|
+
if (!response.ok) throw new Error('Failed to fetch log stats');
|
|
84
|
+
const data = await response.json();
|
|
85
|
+
setStats(data);
|
|
86
|
+
} catch (err) {
|
|
87
|
+
setError(err instanceof Error ? err.message : 'Failed to fetch log stats');
|
|
88
|
+
setStats(null);
|
|
89
|
+
} finally {
|
|
90
|
+
setLoading(false);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
fetchSources();
|
|
96
|
+
}, []);
|
|
97
|
+
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
if (selectedSource) {
|
|
100
|
+
fetchStats();
|
|
101
|
+
}
|
|
102
|
+
}, [selectedSource]);
|
|
103
|
+
|
|
104
|
+
const handleClearLogs = async () => {
|
|
105
|
+
setConfirmOpen(false);
|
|
106
|
+
setClearing(true);
|
|
107
|
+
setError(null);
|
|
108
|
+
setSuccess(null);
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const response = await fetch('/api/logs/clear', {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers: { 'Content-Type': 'application/json' },
|
|
114
|
+
body: JSON.stringify({ source: selectedSource }),
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const data = await response.json();
|
|
119
|
+
throw new Error(data.error || 'Failed to clear logs');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const data = await response.json();
|
|
123
|
+
setSuccess(data.message || 'Logs cleared successfully');
|
|
124
|
+
|
|
125
|
+
// Refresh stats
|
|
126
|
+
await fetchStats();
|
|
127
|
+
} catch (err) {
|
|
128
|
+
setError(err instanceof Error ? err.message : 'Failed to clear logs');
|
|
129
|
+
} finally {
|
|
130
|
+
setClearing(false);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<Card>
|
|
136
|
+
<CardContent>
|
|
137
|
+
<Typography variant="h6" gutterBottom>
|
|
138
|
+
Log Management
|
|
139
|
+
</Typography>
|
|
140
|
+
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
|
|
141
|
+
View log statistics and clear log files
|
|
142
|
+
</Typography>
|
|
143
|
+
|
|
144
|
+
{error && (
|
|
145
|
+
<Alert severity="error" sx={{ mb: 2 }} onClose={() => setError(null)}>
|
|
146
|
+
{error}
|
|
147
|
+
</Alert>
|
|
148
|
+
)}
|
|
149
|
+
|
|
150
|
+
{success && (
|
|
151
|
+
<Alert severity="success" sx={{ mb: 2 }} onClose={() => setSuccess(null)}>
|
|
152
|
+
{success}
|
|
153
|
+
</Alert>
|
|
154
|
+
)}
|
|
155
|
+
|
|
156
|
+
<Box sx={{ mb: 2 }}>
|
|
157
|
+
<FormControl fullWidth size="small">
|
|
158
|
+
<InputLabel>Log Source</InputLabel>
|
|
159
|
+
<Select
|
|
160
|
+
value={selectedSource}
|
|
161
|
+
label="Log Source"
|
|
162
|
+
onChange={(e) => setSelectedSource(e.target.value)}
|
|
163
|
+
disabled={sources.length === 0}
|
|
164
|
+
>
|
|
165
|
+
{sources.map((source) => (
|
|
166
|
+
<MenuItem key={source.name} value={source.name}>
|
|
167
|
+
{source.name} ({source.type})
|
|
168
|
+
</MenuItem>
|
|
169
|
+
))}
|
|
170
|
+
</Select>
|
|
171
|
+
</FormControl>
|
|
172
|
+
</Box>
|
|
173
|
+
|
|
174
|
+
{loading ? (
|
|
175
|
+
<Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}>
|
|
176
|
+
<CircularProgress size={30} />
|
|
177
|
+
</Box>
|
|
178
|
+
) : stats ? (
|
|
179
|
+
<Box sx={{ mb: 2 }}>
|
|
180
|
+
<Typography variant="body2" color="text.secondary">
|
|
181
|
+
<strong>Total Logs:</strong> {stats.totalLogs.toLocaleString()}
|
|
182
|
+
</Typography>
|
|
183
|
+
<Typography variant="body2" color="text.secondary">
|
|
184
|
+
<strong>File Size:</strong> {stats.fileSizeFormatted}
|
|
185
|
+
</Typography>
|
|
186
|
+
<Typography variant="body2" color="text.secondary" sx={{ mt: 1 }}>
|
|
187
|
+
<strong>By Level:</strong>
|
|
188
|
+
</Typography>
|
|
189
|
+
<Box sx={{ pl: 2 }}>
|
|
190
|
+
<Typography variant="body2" color="text.secondary">
|
|
191
|
+
Debug: {stats.byLevel.debug.toLocaleString()}
|
|
192
|
+
</Typography>
|
|
193
|
+
<Typography variant="body2" color="text.secondary">
|
|
194
|
+
Info: {stats.byLevel.info.toLocaleString()}
|
|
195
|
+
</Typography>
|
|
196
|
+
<Typography variant="body2" color="text.secondary">
|
|
197
|
+
Warn: {stats.byLevel.warn.toLocaleString()}
|
|
198
|
+
</Typography>
|
|
199
|
+
<Typography variant="body2" color="error">
|
|
200
|
+
Error: {stats.byLevel.error.toLocaleString()}
|
|
201
|
+
</Typography>
|
|
202
|
+
</Box>
|
|
203
|
+
</Box>
|
|
204
|
+
) : null}
|
|
205
|
+
|
|
206
|
+
<Box sx={{ display: 'flex', gap: 1 }}>
|
|
207
|
+
<Button
|
|
208
|
+
variant="outlined"
|
|
209
|
+
color="primary"
|
|
210
|
+
size="small"
|
|
211
|
+
startIcon={<RefreshIcon />}
|
|
212
|
+
onClick={fetchStats}
|
|
213
|
+
disabled={!selectedSource || loading}
|
|
214
|
+
>
|
|
215
|
+
Refresh
|
|
216
|
+
</Button>
|
|
217
|
+
<Button
|
|
218
|
+
variant="contained"
|
|
219
|
+
color="error"
|
|
220
|
+
size="small"
|
|
221
|
+
startIcon={clearing ? <CircularProgress size={16} color="inherit" /> : <DeleteIcon />}
|
|
222
|
+
onClick={() => setConfirmOpen(true)}
|
|
223
|
+
disabled={!selectedSource || clearing || loading}
|
|
224
|
+
>
|
|
225
|
+
Clear Logs
|
|
226
|
+
</Button>
|
|
227
|
+
</Box>
|
|
228
|
+
|
|
229
|
+
<Dialog open={confirmOpen} onClose={() => setConfirmOpen(false)}>
|
|
230
|
+
<DialogTitle>Clear Log File</DialogTitle>
|
|
231
|
+
<DialogContent>
|
|
232
|
+
<DialogContentText>
|
|
233
|
+
Are you sure you want to clear the "{selectedSource}" log file? This action cannot
|
|
234
|
+
be undone.
|
|
235
|
+
</DialogContentText>
|
|
236
|
+
</DialogContent>
|
|
237
|
+
<DialogActions>
|
|
238
|
+
<Button onClick={() => setConfirmOpen(false)}>Cancel</Button>
|
|
239
|
+
<Button onClick={handleClearLogs} color="error" variant="contained">
|
|
240
|
+
Clear
|
|
241
|
+
</Button>
|
|
242
|
+
</DialogActions>
|
|
243
|
+
</Dialog>
|
|
244
|
+
</CardContent>
|
|
245
|
+
</Card>
|
|
246
|
+
);
|
|
247
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed Management Widget
|
|
3
|
+
*
|
|
4
|
+
* Displays available seed scripts and allows executing them.
|
|
5
|
+
* Part of the maintenance plugin.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useState, useEffect } from 'react';
|
|
11
|
+
import {
|
|
12
|
+
Card,
|
|
13
|
+
CardContent,
|
|
14
|
+
Typography,
|
|
15
|
+
Button,
|
|
16
|
+
List,
|
|
17
|
+
ListItem,
|
|
18
|
+
ListItemText,
|
|
19
|
+
CircularProgress,
|
|
20
|
+
Alert,
|
|
21
|
+
Box,
|
|
22
|
+
} from '@mui/material';
|
|
23
|
+
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
|
|
24
|
+
|
|
25
|
+
interface SeedScript {
|
|
26
|
+
name: string;
|
|
27
|
+
path: string;
|
|
28
|
+
size: number;
|
|
29
|
+
createdAt: string;
|
|
30
|
+
modifiedAt: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function SeedManagementWidget() {
|
|
34
|
+
const [seeds, setSeeds] = useState<SeedScript[]>([]);
|
|
35
|
+
const [loading, setLoading] = useState(true);
|
|
36
|
+
const [error, setError] = useState<string | null>(null);
|
|
37
|
+
const [executing, setExecuting] = useState<string | null>(null);
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
fetchSeeds();
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
const fetchSeeds = async () => {
|
|
44
|
+
try {
|
|
45
|
+
// TODO: Add proper API endpoint for seed discovery
|
|
46
|
+
// const response = await api.get('/maintenance/seeds/discover');
|
|
47
|
+
// setSeeds(response.seeds || []);
|
|
48
|
+
setSeeds([]);
|
|
49
|
+
setError(null);
|
|
50
|
+
} catch (err) {
|
|
51
|
+
setError(err instanceof Error ? err.message : 'Failed to fetch seeds');
|
|
52
|
+
} finally {
|
|
53
|
+
setLoading(false);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const executeSeed = async (seedName: string) => {
|
|
58
|
+
setExecuting(seedName);
|
|
59
|
+
try {
|
|
60
|
+
// TODO: Add proper API endpoint for seed execution
|
|
61
|
+
// await api.post(`/maintenance/seeds/execute`, { name: seedName });
|
|
62
|
+
alert(`Seed ${seedName} executed successfully`);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
alert(`Failed to execute seed: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
65
|
+
} finally {
|
|
66
|
+
setExecuting(null);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
if (loading) {
|
|
71
|
+
return (
|
|
72
|
+
<Card>
|
|
73
|
+
<CardContent>
|
|
74
|
+
<Box sx={{ display: 'flex', justifyContent: 'center', py: 2 }}>
|
|
75
|
+
<CircularProgress size={24} />
|
|
76
|
+
</Box>
|
|
77
|
+
</CardContent>
|
|
78
|
+
</Card>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<Card>
|
|
84
|
+
<CardContent>
|
|
85
|
+
<Typography variant="h6" gutterBottom>
|
|
86
|
+
Seed Management
|
|
87
|
+
</Typography>
|
|
88
|
+
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
|
|
89
|
+
Manage and execute seed scripts
|
|
90
|
+
</Typography>
|
|
91
|
+
|
|
92
|
+
{error && (
|
|
93
|
+
<Alert severity="error" sx={{ mb: 2 }}>
|
|
94
|
+
{error}
|
|
95
|
+
</Alert>
|
|
96
|
+
)}
|
|
97
|
+
|
|
98
|
+
{seeds.length === 0 ? (
|
|
99
|
+
<Alert severity="info">No seed scripts found</Alert>
|
|
100
|
+
) : (
|
|
101
|
+
<List>
|
|
102
|
+
{seeds.map((seed) => (
|
|
103
|
+
<ListItem
|
|
104
|
+
key={seed.name}
|
|
105
|
+
secondaryAction={
|
|
106
|
+
<Button
|
|
107
|
+
variant="contained"
|
|
108
|
+
size="small"
|
|
109
|
+
startIcon={executing === seed.name ? <CircularProgress size={16} /> : <PlayArrowIcon />}
|
|
110
|
+
onClick={() => executeSeed(seed.name)}
|
|
111
|
+
disabled={executing !== null}
|
|
112
|
+
>
|
|
113
|
+
Execute
|
|
114
|
+
</Button>
|
|
115
|
+
}
|
|
116
|
+
>
|
|
117
|
+
<ListItemText
|
|
118
|
+
primary={seed.name}
|
|
119
|
+
secondary={`Modified: ${new Date(seed.modifiedAt).toLocaleDateString()}`}
|
|
120
|
+
/>
|
|
121
|
+
</ListItem>
|
|
122
|
+
))}
|
|
123
|
+
</List>
|
|
124
|
+
)}
|
|
125
|
+
</CardContent>
|
|
126
|
+
</Card>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Control Widget
|
|
3
|
+
*
|
|
4
|
+
* Provides controls for starting, stopping, and restarting services.
|
|
5
|
+
* Part of the maintenance plugin.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Card, CardContent, Typography, Alert } from '@mui/material';
|
|
11
|
+
|
|
12
|
+
export function ServiceControlWidget() {
|
|
13
|
+
return (
|
|
14
|
+
<Card>
|
|
15
|
+
<CardContent>
|
|
16
|
+
<Typography variant="h6" gutterBottom>
|
|
17
|
+
Service Control
|
|
18
|
+
</Typography>
|
|
19
|
+
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
|
|
20
|
+
Start, stop, and restart services
|
|
21
|
+
</Typography>
|
|
22
|
+
|
|
23
|
+
<Alert severity="info">
|
|
24
|
+
Service control functionality coming soon. This will allow you to manage service lifecycle.
|
|
25
|
+
</Alert>
|
|
26
|
+
</CardContent>
|
|
27
|
+
</Card>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -10,3 +10,9 @@ export { AuthStatusWidget } from './AuthStatusWidget';
|
|
|
10
10
|
export { NotificationsStatsWidget } from './NotificationsStatsWidget';
|
|
11
11
|
export { CMSStatusWidget } from './CMSStatusWidget';
|
|
12
12
|
export { CMSMaintenanceWidget } from './CMSMaintenanceWidget';
|
|
13
|
+
export { SeedManagementWidget } from './SeedManagementWidget';
|
|
14
|
+
export { ServiceControlWidget } from './ServiceControlWidget';
|
|
15
|
+
export { EnvironmentConfigWidget } from './EnvironmentConfigWidget';
|
|
16
|
+
export { DatabaseOpsWidget } from './DatabaseOpsWidget';
|
|
17
|
+
export { LogsMaintenanceWidget } from './LogsMaintenanceWidget';
|
|
18
|
+
export { CacheMaintenanceWidget } from './CacheMaintenanceWidget';
|
|
@@ -133,8 +133,8 @@ export function DashboardPage() {
|
|
|
133
133
|
</CardActionArea>
|
|
134
134
|
</Card>
|
|
135
135
|
|
|
136
|
-
{/* Plugin widgets (from server-side widget contributions) */}
|
|
137
|
-
<PluginWidgetRenderer />
|
|
136
|
+
{/* Plugin widgets (from server-side widget contributions) - status widgets only */}
|
|
137
|
+
<PluginWidgetRenderer widgetType="status" />
|
|
138
138
|
|
|
139
139
|
{/* Legacy widgets from context (for backwards compatibility) */}
|
|
140
140
|
<DashboardWidgetRenderer />
|