diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fe46ad1..2bde0251 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.2.0 release on 2023-06-03 + +1. appmanage docker 镜像更新到 0.2.0 +2. Portainer 插件修复自动登录 bug +3. My Apps 插件修复首次使用获取容器 bug + ## 0.1.0 release on 2023-05-26 1. stackhub 预发布,基本功能实现 diff --git a/cockpit/myapps/build/asset-manifest.json b/cockpit/myapps/build/asset-manifest.json index 9601e97d..c32b1e38 100644 --- a/cockpit/myapps/build/asset-manifest.json +++ b/cockpit/myapps/build/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "./static/css/main.751babb1.css", - "main.js": "./static/js/main.ffda1723.js", - "static/js/145.796bcadc.chunk.js": "./static/js/145.796bcadc.chunk.js", + "main.js": "./static/js/main.9813c239.js", + "static/js/145.13333720.chunk.js": "./static/js/145.13333720.chunk.js", "static/js/376.bc0e5568.chunk.js": "./static/js/376.bc0e5568.chunk.js", "static/js/426.46c5e949.chunk.js": "./static/js/426.46c5e949.chunk.js", "static/js/603.8e18e7fa.chunk.js": "./static/js/603.8e18e7fa.chunk.js", @@ -64,8 +64,8 @@ "static/media/logo-sm.svg": "./static/media/logo-sm.53b8ca70620b0b2968874a3660f195dd.svg", "index.html": "./index.html", "main.751babb1.css.map": "./static/css/main.751babb1.css.map", - "main.ffda1723.js.map": "./static/js/main.ffda1723.js.map", - "145.796bcadc.chunk.js.map": "./static/js/145.796bcadc.chunk.js.map", + "main.9813c239.js.map": "./static/js/main.9813c239.js.map", + "145.13333720.chunk.js.map": "./static/js/145.13333720.chunk.js.map", "376.bc0e5568.chunk.js.map": "./static/js/376.bc0e5568.chunk.js.map", "426.46c5e949.chunk.js.map": "./static/js/426.46c5e949.chunk.js.map", "603.8e18e7fa.chunk.js.map": "./static/js/603.8e18e7fa.chunk.js.map", @@ -78,6 +78,6 @@ }, "entrypoints": [ "static/css/main.751babb1.css", - "static/js/main.ffda1723.js" + "static/js/main.9813c239.js" ] } \ No newline at end of file diff --git a/cockpit/myapps/build/config.json b/cockpit/myapps/build/config.json index 141ea470..03cfe1c3 100644 --- a/cockpit/myapps/build/config.json +++ b/cockpit/myapps/build/config.json @@ -1,7 +1,7 @@ { "PORTAINER": { "PORTAINER_AUTH_URL": "/portainer/api/auth", - "PORTAINER_HOME_PAGE": "/portainer", + "PORTAINER_HOME_PAGE": "/portainer/#!/home", "PORTAINER_USERNAME": "admin", "PORTAINER_PASSWORD": "websoft9@2023" }, diff --git a/cockpit/myapps/build/index.html b/cockpit/myapps/build/index.html index 963f8793..e3ca4d1b 100644 --- a/cockpit/myapps/build/index.html +++ b/cockpit/myapps/build/index.html @@ -1 +1 @@ -
\n This app is pre-setup with an admin account,Please change the admin password immediately. The initial credentials are:\n
*/}\nName | \nState | \nActions | \nImage | \nCreated | \nIp Address | \nPublished Ports | \n
---|---|---|---|---|---|---|
{container.Names?.[0]?.replace(/^\\/|\\/$/g, '')} | \n\n | \n \n \n {' '}\n \n {\n container.State === \"running\" && (\n \n {' '}\n \n )\n }\n\n | \n{container.Image} | \n{new Date(container.Created * 1000).toLocaleString()} | \n{container.NetworkSettings.Networks[container.HostConfig.NetworkMode].IPAddress} | \n{container.Ports.find(port => port.IP && /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(port.IP))?.PublicPort}:{container.Ports.find(port => port.IP && /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(port.IP))?.PrivatePort} | \n
{_(\"App Name\")}: | \n{props.data?.app_name} | \n
{_(\"App Version\")}: | \n{props.data?.app_version} | \n
{_(\"App Port\")}: | \n{props.data?.config?.port} | \n
{_(\"Created Time\")}: | \n{props.data?.create_time} | \n
{_(\"Config Path\")}: | \n{props.data?.config_path} | \n
{_(\"Data Path\")}: | \n{props.data?.volume_data} | \n
\n {_(\"Apps can be stopped to conserve server resources instead of uninstalling.\")}\n
\n {props.data.status === \"running\" ?\n \n :\n \n }\n \n\n {_(\"This will uninstall the app immediately and remove all its data.The app will be inaccessible.\")}\n
\n \n \nCode : ${code}
;\n if (error) returnError : ${error}
;\n\n //用于根据应用“状态”过滤应用\n const changeStatus = (selectedStatus) => {\n setSelectedStatus(selectedStatus);\n };\n\n //用于根据用户输入搜索应用\n const handleInputChange = (searchString) => {\n setSearchString(searchString);\n }\n\n //用于用户点击应用详情\n const handleClick = (app) => {\n setSelectedApp(app);\n setShowModal(true);\n };\n\n //用于应用为failed时删除应用\n const deleteApp = (app) => {\n setSelectedApp(app);\n setShowUninstallConform(true);\n };\n\n //用于应用为failed时显示错误信息弹窗\n const showError = (app) => {\n setSelectedApp(app);\n setShowErrorInfo(true);\n };\n\n //用于关闭显示错误消息弹窗\n const cancelShowError = () => {\n setShowErrorInfo(false);\n };\n\n //用于取消删除应用\n const canceldeleteApp = () => {\n setShowUninstallConform(false);\n };\n\n //用于关闭应用详情的弹窗\n const handleClose = () => {\n setShowModal(false);\n setSelectedApp(null);\n };\n\n const handleAlertClose = (event, reason) => {\n if (reason === 'clickaway') {\n return;\n }\n setShowAlert(false);\n setAlertMessage(\"\");\n };\n\n //用于立即刷新数据\n const handleDataChange = () => {\n getAllAppsOnce();\n };\n\n //非官方应用的操作\n const appActions = {\n \"Stop\": {\n api: AppStop,\n },\n \"Start\": {\n api: AppStart,\n },\n \"Restart\": {\n api: AppRestart,\n },\n \"Uninstall\": {\n api: AppUninstall,\n }\n }\n\n //处理非官方应用的操作\n const NoOfficialAppClick = async (label, app) => {\n if (label === \"Uninstall\") {\n setSelectedApp(app);\n setShowUninstallConform(true);\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await appActions[label].api({ app_id: app.app_id });\n if (response.data.Error) {\n setShowAlert(true);\n setAlertType(\"error\")\n setAlertMessage(response.data.Error.Message);\n }\n else {\n setShowAlert(true);\n setAlertType(\"success\")\n setAlertMessage(\"执行成功\");\n handleDataChange();\n }\n }\n catch (error) {\n navigate(\"/error-500\");\n }\n finally {\n setIsLoading(false);\n }\n }\n\n return (\n <>\n\n This app is pre-setup with an admin account,Please change the admin password immediately. The initial credentials are:\n
*/}\nName | \nState | \nActions | \nImage | \nCreated | \nIp Address | \nPublished Ports | \n
---|---|---|---|---|---|---|
{container.Names?.[0]?.replace(/^\\/|\\/$/g, '')} | \n\n | \n \n \n {' '}\n \n {\n container.State === \"running\" && (\n \n {' '}\n \n )\n }\n\n | \n{container.Image} | \n{new Date(container.Created * 1000).toLocaleString()} | \n{container.NetworkSettings.Networks[container.HostConfig.NetworkMode].IPAddress} | \n{container.Ports.find(port => port.IP && /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(port.IP))?.PublicPort}:{container.Ports.find(port => port.IP && /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(port.IP))?.PrivatePort} | \n
{_(\"App Name\")}: | \n{props.data?.app_name} | \n
{_(\"App Version\")}: | \n{props.data?.app_version} | \n
{_(\"App Port\")}: | \n{props.data?.config?.port} | \n
{_(\"Created Time\")}: | \n{props.data?.create_time} | \n
{_(\"Config Path\")}: | \n{props.data?.config_path} | \n
{_(\"Data Path\")}: | \n{props.data?.volume_data} | \n
\n {_(\"Apps can be stopped to conserve server resources instead of uninstalling.\")}\n
\n {props.data.status === \"running\" ?\n \n :\n \n }\n \n\n {_(\"This will uninstall the app immediately and remove all its data.The app will be inaccessible.\")}\n
\n \n \nCode : ${code}
;\n if (error) returnError : ${error}
;\n\n //用于根据应用“状态”过滤应用\n const changeStatus = (selectedStatus) => {\n setSelectedStatus(selectedStatus);\n };\n\n //用于根据用户输入搜索应用\n const handleInputChange = (searchString) => {\n setSearchString(searchString);\n }\n\n //用于用户点击应用详情\n const handleClick = (app) => {\n setSelectedApp(app);\n setShowModal(true);\n };\n\n //用于应用为failed时删除应用\n const deleteApp = (app) => {\n setSelectedApp(app);\n setShowUninstallConform(true);\n };\n\n //用于应用为failed时显示错误信息弹窗\n const showError = (app) => {\n setSelectedApp(app);\n setShowErrorInfo(true);\n };\n\n //用于关闭显示错误消息弹窗\n const cancelShowError = () => {\n setShowErrorInfo(false);\n };\n\n //用于取消删除应用\n const canceldeleteApp = () => {\n setShowUninstallConform(false);\n };\n\n //用于关闭应用详情的弹窗\n const handleClose = () => {\n setShowModal(false);\n setSelectedApp(null);\n };\n\n const handleAlertClose = (event, reason) => {\n if (reason === 'clickaway') {\n return;\n }\n setShowAlert(false);\n setAlertMessage(\"\");\n };\n\n //用于立即刷新数据\n const handleDataChange = () => {\n getAllAppsOnce();\n };\n\n //非官方应用的操作\n const appActions = {\n \"Stop\": {\n api: AppStop,\n },\n \"Start\": {\n api: AppStart,\n },\n \"Restart\": {\n api: AppRestart,\n },\n \"Uninstall\": {\n api: AppUninstall,\n }\n }\n\n //处理非官方应用的操作\n const NoOfficialAppClick = async (label, app) => {\n if (label === \"Uninstall\") {\n setSelectedApp(app);\n setShowUninstallConform(true);\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await appActions[label].api({ app_id: app.app_id });\n if (response.data.Error) {\n setShowAlert(true);\n setAlertType(\"error\")\n setAlertMessage(response.data.Error.Message);\n }\n else {\n setShowAlert(true);\n setAlertType(\"success\")\n setAlertMessage(\"执行成功\");\n handleDataChange();\n }\n }\n catch (error) {\n navigate(\"/error-500\");\n }\n finally {\n setIsLoading(false);\n }\n }\n\n return (\n <>\n