diff --git a/packages/frontend/package-lock.json b/packages/frontend/package-lock.json index 8676d565a..063ea5842 100644 --- a/packages/frontend/package-lock.json +++ b/packages/frontend/package-lock.json @@ -2968,6 +2968,19 @@ "picomatch": "^2.0.4" } }, + "apexcharts": { + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.26.3.tgz", + "integrity": "sha512-zbP7RBBV2CGffoVMIuTCUG64YbEUzV8IIT7iNVLMtY/OAVXTjPksDxSqKIniTvgJoscKe6sx4P56qDpBSU19VA==", + "requires": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, "apollo": { "version": "2.28.0", "resolved": "https://registry.npmjs.org/apollo/-/apollo-2.28.0.tgz", @@ -13408,6 +13421,70 @@ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", "dev": true }, + "svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "requires": { + "svg.js": "^2.0.1" + } + }, + "svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha1-iqmUawqOJ4V6XEChDrpAkeVpHxI=", + "requires": { + "svg.js": ">=2.3.x" + } + }, + "svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha1-kQCOFROJ3ZIwd5/L5uLJo2LRwgM=", + "requires": { + "svg.js": "^2.2.5" + } + }, + "svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "requires": { + "svg.js": "^2.4.0" + } + }, + "svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "requires": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "dependencies": { + "svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "requires": { + "svg.js": "^2.2.5" + } + } + } + }, + "svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "requires": { + "svg.js": "^2.6.5" + } + }, "svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", @@ -14357,6 +14434,11 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" }, + "vue-apexcharts": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vue-apexcharts/-/vue-apexcharts-1.6.1.tgz", + "integrity": "sha512-ILn3/55IvZQUgsc7+jKDjPfHfGUlcUQi/lDrLjRe5g7gfjj99o8otXoHwMeib3CBHYdQXNG9foe1vzv7RdUzXA==" + }, "vue-apollo": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/vue-apollo/-/vue-apollo-3.0.5.tgz", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index dd18127dc..29d950efd 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -13,6 +13,7 @@ "@speckle/viewer": "^2.0.5", "@vuejs-community/vue-filter-date-format": "^1.6.3", "@vuejs-community/vue-filter-date-parse": "^1.1.6", + "apexcharts": "^3.26.3", "crypto-random-string": "^3.3.0", "dompurify": "^2.2.4", "lodash.debounce": "^4.0.8", @@ -20,6 +21,7 @@ "marked": "^1.2.6", "v-tooltip": "^2.0.3", "vue": "^2.6.12", + "vue-apexcharts": "^1.6.1", "vue-apollo": "^3.0.5", "vue-infinite-loading": "^2.4.5", "vue-matomo": "^3.14.0-0", diff --git a/packages/frontend/src/app.js b/packages/frontend/src/app.js index ca4a7c1cb..7ff02cfcb 100644 --- a/packages/frontend/src/app.js +++ b/packages/frontend/src/app.js @@ -30,6 +30,11 @@ Vue.use(VueMatomo, { userId: localStorage.getItem('suuid') }) +import VueApexCharts from 'vue-apexcharts' +Vue.use(VueApexCharts) + +Vue.component('apexchart', VueApexCharts) + let AuthToken = localStorage.getItem('AuthToken') let RefreshToken = localStorage.getItem('RefreshToken') diff --git a/packages/frontend/src/components/admin/AdminCard.vue b/packages/frontend/src/components/admin/AdminCard.vue new file mode 100644 index 000000000..7aef60c15 --- /dev/null +++ b/packages/frontend/src/components/admin/AdminCard.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/packages/frontend/src/components/admin/ServerInfoCard.vue b/packages/frontend/src/components/admin/ServerInfoCard.vue new file mode 100644 index 000000000..85b5145bb --- /dev/null +++ b/packages/frontend/src/components/admin/ServerInfoCard.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/packages/frontend/src/components/admin/UsageInfoCard.vue b/packages/frontend/src/components/admin/UsageInfoCard.vue new file mode 100644 index 000000000..64f307320 --- /dev/null +++ b/packages/frontend/src/components/admin/UsageInfoCard.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/packages/frontend/src/components/admin/VersionInfoCard.vue b/packages/frontend/src/components/admin/VersionInfoCard.vue new file mode 100644 index 000000000..6f574473c --- /dev/null +++ b/packages/frontend/src/components/admin/VersionInfoCard.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/packages/frontend/src/router/index.js b/packages/frontend/src/router/index.js index d6dd84589..8459dacc2 100644 --- a/packages/frontend/src/router/index.js +++ b/packages/frontend/src/router/index.js @@ -140,6 +140,31 @@ const routes = [ title: 'User Profile | Speckle' }, component: () => import('../views/ProfileUser.vue') + }, + { + path: 'admin', + meta: { + title: 'Admin | Overview' + }, + children: [ + { + name: 'Admin | Overview', + path: '', + component: () => import('../views/admin/AdminOverview.vue') + }, + { + name: "Admin | Users", + path: "users", + component: () => import('../views/admin/AdminUsers.vue') + + }, + { + name: "Admin | Streams", + path: "streams", + component: () => import('../views/admin/AdminStreams.vue') + } + ], + component: () => import('../views/admin/AdminPanel.vue') } ] }, diff --git a/packages/frontend/src/views/admin/AdminOverview.vue b/packages/frontend/src/views/admin/AdminOverview.vue new file mode 100644 index 000000000..c0677db04 --- /dev/null +++ b/packages/frontend/src/views/admin/AdminOverview.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/packages/frontend/src/views/admin/AdminPanel.vue b/packages/frontend/src/views/admin/AdminPanel.vue new file mode 100644 index 000000000..2c11cd939 --- /dev/null +++ b/packages/frontend/src/views/admin/AdminPanel.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/packages/frontend/src/views/admin/AdminStreams.vue b/packages/frontend/src/views/admin/AdminStreams.vue new file mode 100644 index 000000000..b3e76a2c0 --- /dev/null +++ b/packages/frontend/src/views/admin/AdminStreams.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/packages/frontend/src/views/admin/AdminUsers.vue b/packages/frontend/src/views/admin/AdminUsers.vue new file mode 100644 index 000000000..dfcebd5f2 --- /dev/null +++ b/packages/frontend/src/views/admin/AdminUsers.vue @@ -0,0 +1,15 @@ + + + + +