AdminDashboard.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <template lang='pug'>
  2. q-page.admin-dashboard
  3. .row.q-pa-md.items-center
  4. .col-auto
  5. img.admin-icon.animated.fadeInLeft(src='/_assets/icons/fluent-apps-tab.svg')
  6. .col.q-pl-md
  7. .text-h5.text-primary.animated.fadeInLeft {{ t('admin.dashboard.title') }}
  8. .text-subtitle1.text-grey.animated.fadeInLeft.wait-p2s {{ t('admin.dashboard.subtitle') }}
  9. .row.q-px-md.q-col-gutter-sm
  10. .col-12.col-sm-6.col-lg-3
  11. q-card
  12. q-card-section.admin-dashboard-card
  13. img(src='/_assets/icons/fluent-change-theme.svg')
  14. div
  15. strong {{ t('admin.sites.title') }}
  16. span {{adminStore.sites.length}}
  17. q-separator
  18. q-card-actions(align='right')
  19. q-btn(
  20. flat
  21. color='primary'
  22. icon='las la-plus-circle'
  23. :label='t(`common.actions.new`)'
  24. :disable='!userStore.can(`manage:sites`)'
  25. @click='newSite'
  26. )
  27. q-separator.q-mx-sm(vertical)
  28. q-btn(
  29. flat
  30. color='primary'
  31. icon='las la-sitemap'
  32. :label='t(`common.actions.manage`)'
  33. :disable='!userStore.can(`manage:sites`)'
  34. to='/_admin/sites'
  35. )
  36. .col-12.col-sm-6.col-lg-3
  37. q-card
  38. q-card-section.admin-dashboard-card
  39. img(src='/_assets/icons/fluent-people.svg')
  40. div
  41. strong {{ t('admin.groups.title') }}
  42. span {{adminStore.info.groupsTotal}}
  43. q-separator
  44. q-card-actions(align='right')
  45. q-btn(
  46. flat
  47. color='primary'
  48. icon='las la-plus-circle'
  49. :label='t(`common.actions.new`)'
  50. :disable='!userStore.can(`manage:users`)'
  51. @click='newGroup'
  52. )
  53. q-separator.q-mx-sm(vertical)
  54. q-btn(
  55. flat
  56. color='primary'
  57. icon='las la-users'
  58. :label='t(`common.actions.manage`)'
  59. :disable='!userStore.can(`manage:users`)'
  60. to='/_admin/groups'
  61. )
  62. .col-12.col-sm-6.col-lg-3
  63. q-card
  64. q-card-section.admin-dashboard-card
  65. img(src='/_assets/icons/fluent-account.svg')
  66. div
  67. strong {{ t('admin.users.title') }}
  68. span {{adminStore.info.usersTotal}}
  69. q-separator
  70. q-card-actions(align='right')
  71. q-btn(
  72. flat
  73. color='primary'
  74. icon='las la-user-plus'
  75. :label='t(`common.actions.new`)'
  76. :disable='!userStore.can(`manage:users`)'
  77. @click='newUser'
  78. )
  79. q-separator.q-mx-sm(vertical)
  80. q-btn(
  81. flat
  82. color='primary'
  83. icon='las la-user-friends'
  84. :label='t(`common.actions.manage`)'
  85. :disable='!userStore.can(`manage:users`)'
  86. to='/_admin/users'
  87. )
  88. .col-12.col-sm-6.col-lg-3
  89. q-card
  90. q-card-section.admin-dashboard-card
  91. img(src='/_assets/icons/fluent-tag.svg')
  92. div
  93. strong {{ t('admin.tags.title') }}
  94. span {{adminStore.info.tagsTotal}}
  95. q-separator
  96. q-card-actions(align='right')
  97. q-btn(
  98. flat
  99. color='primary'
  100. icon='las la-tags'
  101. :label='t(`common.actions.manage`)'
  102. :disable='!userStore.can(`manage:sites`)'
  103. :to='`/_admin/` + adminStore.currentSiteId + `/tags`'
  104. )
  105. .col-12.col-sm-6.col-lg-3
  106. q-card
  107. q-card-section.admin-dashboard-card
  108. img(src='/_assets/icons/fluent-female-working-with-a-laptop.svg')
  109. div
  110. strong Logins
  111. small {{adminStore.info.loginsPastDay}} #[i / past 24h]
  112. q-separator
  113. q-card-actions(align='right')
  114. q-btn(
  115. flat
  116. color='primary'
  117. icon='las la-chart-area'
  118. :label='t(`admin.analytics.title`)'
  119. :disable='!userStore.can(`manage:sites`)'
  120. :to='`/_admin/` + adminStore.currentSiteId + `/analytics`'
  121. )
  122. .col-12.col-lg-9
  123. q-card
  124. q-card-section ---
  125. .col-12
  126. q-banner.bg-positive.text-white(
  127. :class='adminStore.isVersionLatest ? `bg-positive` : `bg-warning`'
  128. inline-actions
  129. rounded
  130. )
  131. i.las.la-check.q-mr-sm
  132. span.text-weight-medium(v-if='adminStore.isVersionLatest') Your Wiki.js server is running the latest version!
  133. span.text-weight-medium(v-else) A new version of Wiki.js is available. Please update to the latest version.
  134. template(#action, v-if='userStore.can(`manage:system`)')
  135. q-btn(
  136. flat
  137. :label='t(`admin.system.checkForUpdates`)'
  138. @click='checkForUpdates'
  139. )
  140. q-separator.q-mx-sm(vertical, dark)
  141. q-btn(
  142. flat
  143. :label='t(`admin.system.title`)'
  144. to='/_admin/system'
  145. )
  146. </template>
  147. <script setup>
  148. import { useMeta, useQuasar } from 'quasar'
  149. import { useI18n } from 'vue-i18n'
  150. import { useRouter } from 'vue-router'
  151. import { useAdminStore } from '../stores/admin'
  152. import { useUserStore } from 'src/stores/user'
  153. // COMPONENTS
  154. import CheckUpdateDialog from 'src/components/CheckUpdateDialog.vue'
  155. import SiteCreateDialog from 'src/components/SiteCreateDialog.vue'
  156. import UserCreateDialog from 'src/components/UserCreateDialog.vue'
  157. import GroupCreateDialog from 'src/components/GroupCreateDialog.vue'
  158. // QUASAR
  159. const $q = useQuasar()
  160. // STORES
  161. const adminStore = useAdminStore()
  162. const userStore = useUserStore()
  163. // ROUTER
  164. const router = useRouter()
  165. // I18N
  166. const { t } = useI18n()
  167. // META
  168. useMeta({
  169. title: t('admin.dashboard.title')
  170. })
  171. // METHODS
  172. function newSite () {
  173. $q.dialog({
  174. component: SiteCreateDialog
  175. }).onOk(() => {
  176. router.push('/_admin/sites')
  177. })
  178. }
  179. function newUser () {
  180. $q.dialog({
  181. component: UserCreateDialog
  182. }).onOk(() => {
  183. router.push('/_admin/users')
  184. })
  185. }
  186. function newGroup () {
  187. $q.dialog({
  188. component: GroupCreateDialog
  189. }).onOk(() => {
  190. router.push('/_admin/groups')
  191. })
  192. }
  193. function checkForUpdates () {
  194. $q.dialog({
  195. component: CheckUpdateDialog
  196. })
  197. }
  198. </script>
  199. <style lang='scss'>
  200. .admin-dashboard {
  201. &-card {
  202. display: flex;
  203. align-items: center;
  204. img {
  205. width: 64px;
  206. margin-right: 12px;
  207. }
  208. strong {
  209. font-size: 1.1rem;
  210. font-weight: 300;
  211. display: block;
  212. line-height: 1.2rem;
  213. padding-left: 2px;
  214. }
  215. span {
  216. font-size: 2rem;
  217. line-height: 2rem;
  218. font-weight: 500;
  219. color: var(--q-secondary);
  220. display: block;
  221. }
  222. small {
  223. font-size: 1.4rem;
  224. line-height: 2rem;
  225. font-weight: 400;
  226. color: var(--q-secondary);
  227. display: block;
  228. i {
  229. font-size: 1rem;
  230. font-style: normal;
  231. }
  232. }
  233. }
  234. .q-card__actions {
  235. background: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,.03));
  236. @at-root .body--dark & {
  237. background: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,.2));
  238. }
  239. }
  240. }
  241. </style>