user-area.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. const app = require('../app')
  2. const { logo, menuIcon, userIcon, dashboardIcon, roleIcon, dropdownIcon, dropupIcon } = require('../assets')
  3. const assets = require('../assets')
  4. app.component('appUserArea', {
  5. transclude: true,
  6. template: html`
  7. <div layout="row" flex>
  8. <md-sidenav flex
  9. md-component-id="left"
  10. class="md-sidenav-left"
  11. md-is-locked-open="$mdMedia('gt-md')"
  12. md-whiteframe="4"
  13. layout="column"
  14. md-theme="nav">
  15. <md-content md-theme="nav">
  16. <header>
  17. <div class="logo-container">
  18. <img class="logo" src="${logo}" />
  19. </div>
  20. </header>
  21. <app-user-area-nav></app-user-area-nav>
  22. <md-menu-item ng-repeat="crud in $ctrl.cruds">
  23. <md-button ng-href="/{{crud.paramPlural}}">
  24. <md-icon md-svg-icon="{{assets[crud.iconAsset]}}"></md-icon>
  25. {{crud.titlePlural}}
  26. </md-button>
  27. </md-menu-item>
  28. <div ng-if="$ctrl.api.claims.USER_VIEW || $ctrl.api.claims.ROLE_VIEW">
  29. <h3>
  30. Administration
  31. </h3>
  32. <md-menu-item ng-if="$ctrl.api.claims.USER_VIEW">
  33. <md-button ng-href="/users">
  34. <md-icon md-svg-icon="${userIcon}"></md-icon>
  35. Users
  36. </md-button>
  37. </md-menu-item>
  38. <md-menu-item ng-if="$ctrl.api.claims.ROLE_VIEW">
  39. <md-button ng-href="/roles">
  40. <md-icon md-svg-icon="${roleIcon}"></md-icon>
  41. Roles
  42. </md-button>
  43. </md-menu-item>
  44. </div>
  45. <!-- <md-menu-item>
  46. <md-button ng-href="/roles">
  47. <md-icon md-svg-icon="${roleIcon}"></md-icon>
  48. Roles
  49. </md-button>
  50. </md-menu-item> -->
  51. </md-content>
  52. </md-sidenav>
  53. <md-content flex>
  54. <md-toolbar>
  55. <div class="md-toolbar-tools">
  56. <md-button class="md-icon-button" aria-label="Settings" ng-hide="$mdMedia('gt-md')" ng-click="$ctrl.toggleNav()">
  57. <md-icon md-svg-icon="${menuIcon}"></md-icon>
  58. </md-button>
  59. <h1 flex>{{$ctrl.titleText}}</h1>
  60. <md-menu md-position-mode="target-right target">
  61. <md-button class="md-raised md-accent hue-10" ng-click="$mdMenu.open($event)">
  62. <md-icon md-svg-icon="${userIcon}"></md-icon>
  63. {{$ctrl.api.user.name}}
  64. <md-icon md-svg-icon="${dropdownIcon}"></md-icon>
  65. </md-button>
  66. <md-menu-content>
  67. <md-menu-item>
  68. <md-button ng-click="$mdMenu.close($event)">
  69. <md-icon md-svg-icon="${userIcon}"></md-icon>
  70. {{$ctrl.api.user.name}}
  71. <md-icon md-svg-icon="${dropupIcon}"></md-icon>
  72. </md-button>
  73. </md-menu-item>
  74. <md-menu-item>
  75. <md-button class="md-warn" ng-click="$ctrl.logout()">
  76. Log out
  77. </md-button>
  78. </md-menu-item>
  79. </md-menu-content>
  80. </md-menu>
  81. </div>
  82. </md-toolbar>
  83. <div layout-padding>
  84. <div ng-transclude></div>
  85. </div>
  86. </md-content>
  87. </div>
  88. `,
  89. bindings: {
  90. titleText: '@'
  91. },
  92. controller: function($mdSidenav, $mdMedia, $scope, cruds, api, $location) {
  93. this.api = api
  94. if (!api.user || !api.token) {
  95. $location.url('/login')
  96. }
  97. this.cruds = cruds.filter(crud => crud.showNav !== false)
  98. $scope.assets = assets
  99. $scope.$mdMedia = $mdMedia
  100. this.showNav = false
  101. this.toggleNav = () => {
  102. $mdSidenav('left').toggle()
  103. }
  104. this.logout = async () => {
  105. await api.logout()
  106. $location.url('/login')
  107. }
  108. }
  109. })