From b4d6944076f1df6eedaae35c4c2a7072fe988e8a Mon Sep 17 00:00:00 2001
From: Tomas <tomasysh@gmail.com>
Date: 星期二, 30 四月 2024 15:34:02 +0800
Subject: [PATCH] update: package-lock.json

---
 PAMapp/components/NavBar.vue |  380 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 320 insertions(+), 60 deletions(-)

diff --git a/PAMapp/components/NavBar.vue b/PAMapp/components/NavBar.vue
index 89a9b4c..992f570 100644
--- a/PAMapp/components/NavBar.vue
+++ b/PAMapp/components/NavBar.vue
@@ -1,76 +1,336 @@
 <template>
-    <header class="pam-header">
-      <img class="pam-header__logo" src="~/assets/images/logo.png" alt="" @click="$router.push('/login')">
-        <div class="pam-header__title">
-          ���兢蝳��蜓
-          <div class="pam-header__sub-title">
-            �����兢蝳�風��
+  <header class="pam-header">
+    <div class="pam-header__logo"
+      @click="pushRouterByLoginRole"></div>
+    <div class="pam-header__title">
+      <div class="pam-header__title--main">�憿找�����</div>
+      <div class="pam-header__title--sub">��������“���</div>
+    </div>
+    <div class="pam-header__action-bar">
+      <i
+        v-if="isShowNotification"
+        class="icon-bell text--dark-blue cursor--pointer"
+        @click="$router.push('/notification')"
+      >
+        <span :class="{'newNotification': isNewNotification}"></span>
+      </i>
+
+        <el-dropdown :class="{'is-open':isOpenDropdown}"
+          ref="dropdown"
+          trigger="click"
+          @command="routerNavigateTo">
+          <div
+            @click="isOpenDropdown =!isOpenDropdown"
+            @blur="isOpenDropdown =false">
+            <template v-if="isAdminLogin">
+              <UiAvatar
+              :size="30"
+              :agentNo="consultantId"
+              class="admin-avatar"
+              ></UiAvatar>
+            </template>
+            <template v-else>
+              <i class="icon-avatar text--dark-blue cursor--pointer fix-chrome-click--issue"></i>
+            </template>
           </div>
-        </div>
-        <div class="pam-header__action-bar">
-          <i class="icon-bell text--dark-blue cursor--pointer" @click="$router.push('/notification')"></i>
-          <el-dropdown @command="handleCommand">
-            <i class="icon-avatar text--dark-blue cursor--pointer"></i>
-            <el-dropdown-menu slot="dropdown" class="pam-header__dropdown">
-              <li class="pam-header__dropdown-item" @click="$router.push('/accountSetting')">�犖撣唾�身摰�</li>
-              <li class="pam-header__dropdown-item" @click="$router.push('/record/contactRecord')">�������</li>
-              <li class="pam-header__dropdown-item" @click="$router.push('/contactList/consultantList')">���“���</li>
-              <li class="pam-header__dropdown-item">��</li>
-              <li class="pam-header__dropdown-item pam-header__dropdown-divider" @click="$router.push('/login')">憿批��</li>
-            </el-dropdown-menu>
-          </el-dropdown>
-        </div>
-    </header>
+          <el-dropdown-menu
+            class="pam-header__dropdown">
+            <template v-for="(item,index) in navBarList">
+              <el-dropdown-item :key="index"
+                v-if="item.authorityOfRoleList.includes(loginRole)"
+                class="fix-chrome-click--issue"
+                :class="{'pam-header__dropdown-divider':item.title === '憿批��'}"
+                :command="item.routeUrl">
+                {{item.title}}
+              </el-dropdown-item>
+            </template>
+          </el-dropdown-menu>
+        </el-dropdown>
+    </div>
+  </header>
 </template>
 
 <script lang="ts">
-import { Vue, Component } from 'vue-property-decorator';
+  import { Vue, Component } from 'vue-property-decorator';
+  import { Action, namespace, State, Watch } from 'nuxt-property-decorator';
+  import { Role } from '~/shared/models/enum/Role';
+  import { NotificationList } from '~/shared/models/reviews.model';
+  import { AppointmentLog } from '~/shared/models/appointment.model';
+  import loginService from '~/shared/services/login.service'
 
-@Component
-export default class NavBar extends Vue {
-  handleCommand() {
+  const roleStorage = namespace('localStorage');
+  @Component
+  export default class NavBar extends Vue {
+
+    @roleStorage.Getter
+    idToken!: string | null;
+
+    @roleStorage.Getter
+    currentRole!: string | null;
+
+    @roleStorage.Getter
+    consultantId!: string | null;
+
+    @roleStorage.Mutation
+    storageClear!: () => void;
+
+    @roleStorage.Getter
+    isAdminLogin!: boolean;
+
+    @roleStorage.Getter
+    isUserLogin!: boolean;
+
+    @Action
+    storeMyPersonalNotification!: () => void;
+
+    @State
+    notificationList!: NotificationList[];
+
+    @Action
+    storeMyAppointmentReviewLog!: () => void;
+
+    @State
+    unReviewLogList!: AppointmentLog[];
+
+    isOpenDropdown = false;
+
+    navBarList = [{
+        authorityOfRoleList: [Role.NOT_LOGIN],
+        routeUrl: '/login',
+        title: '�� | 閮餃��',
+      },
+      {
+        authorityOfRoleList: [Role.USER],
+        routeUrl: '/accountSetting',
+        title: '�犖撣唾�身摰�',
+      },
+      {
+        authorityOfRoleList:[Role.ADMIN],
+        routeUrl: '/agentInfo/',
+        title: '���董�����',
+      },
+      {
+        authorityOfRoleList:[Role.ADMIN],
+        routeUrl: '/record',
+        title: '�������',
+      },
+      {
+        authorityOfRoleList: [Role.USER],
+        routeUrl: '/userReviewsRecord',
+        title: '�������',
+      },
+      {
+        authorityOfRoleList: [Role.NOT_LOGIN, Role.USER],
+        routeUrl: '/myConsultantList/consultantList',
+        title: '���“���',
+      },
+      {
+        authorityOfRoleList: [Role.NOT_LOGIN, Role.USER],
+        routeUrl: '/faq',
+        title: 'FAQ 撣貉����',
+      },
+      {
+        authorityOfRoleList: [Role.USER, Role.ADMIN],
+        routeUrl: '',
+        title: '��',
+      },
+      {
+        authorityOfRoleList: [Role.NOT_LOGIN],
+        routeUrl: '/consultantLogin',
+        title: '憿批��',
+      },
+    ];
+
+    //////////////////////////////////////////////////////////////////////
+
+    @Watch('$route', {immediate: true})
+    onRouterChange() {
+        if (this.currentRole) {
+          this.storeMyPersonalNotification();
+          this.storeMyAppointmentReviewLog();
+        }
+    }
+
+    //////////////////////////////////////////////////////////////////////
+
+    routerNavigateTo(url: string): void {
+      (this.$refs.dropdown as any).hide();
+      url === ''
+        ? this.logout()
+        : this.$router.push(url === '/agentInfo/' ? url+this.consultantId : url);
+    }
+
+    pushRouterByLoginRole(): void {
+      const link = this.currentRole === Role.ADMIN ? '/myAppointmentList/appointmentList' : '/';
+      this.$router.push(link);
+    }
+
+    logout(): void {
+      loginService.logout().then(() => {
+        this.storageClear();
+        this.$route.name === 'index' ? location.reload() : this.$router.push('/');
+      });
+    }
+
+    get loginRole(): Role {
+      return this.idToken && this.currentRole ? (this.currentRole as Role): Role.NOT_LOGIN;
+    }
+
+    get isShowNotification() {
+      if (this.isUserLogin) {
+        return this.notificationList.length || this.unReviewLogList.length;
+      }
+      if (this.isAdminLogin) {
+        return this.notificationList.length
+      }
+    }
+
+    get isNewNotification() {
+      if (this.currentRole) {
+        return this.notificationList.filter(item => !item.readDate).length;
+      }
+    }
 
   }
-}
+
 </script>
 
 <style lang="scss" scoped>
-.pam-header {
-  height: 53px;
-  display: flex;
-  align-items: center;
-  .pam-header__logo {
-    height: 100%;
-  }
-  .pam-header__title {
-    flex: 1;
-    margin: 10px 0;
-    padding-left: 10px;
-    border-left: 1px solid #CCCCCC;
-    font-size: 16px;
-    font-weight: bold;
-    color: #68737A;
-    letter-spacing: 3.6px;
-    flex-basis: 140px;
-    .pam-header__sub-title {
-      padding-top: 2px;
-      font-size: 13px;
-      font-weight: bold;
-      color: #F09491;
-      letter-spacing: 1.2px
-    }
-  }
-  .pam-header__action-bar {
+  .pam-header {
+    position: fixed;
+    top: 0;
+    height: $MOB_NAV_BAR;
+    width: 100%;
     display: flex;
-    font-size: 24px;
-    font-weight: bold;
-    justify-content: space-around;
-    i {
-      padding: 0 15px;
-      @media screen and (max-width: 320px) {
-        padding: 0 5px;
+    align-items: center;
+    background-color: $PRIMARY_WHITE;
+    z-index: 6;
+
+    .pam-header__logo {
+      height: 30px;
+      width: 115px;
+      margin: 0 10px;
+      background-image: url('~/assets/images/taiwan-logo.png');
+      background-repeat: no-repeat;
+      background-size: contain;
+      background-position: center;
+    }
+
+    .pam-header__title {
+      flex: 1;
+      flex-basis: 160px;
+      border-left: 1px #CCCCCC solid;
+      padding-left: 10px;
+
+    .pam-header__title--main {
+      font-size: 16px;
+      font-weight: bold;
+      color: $PRUDENTIAL_GREY;
+      letter-spacing: 0.8px;
+
+      @media screen and (max-width: 352px) {
+        font-size: 12px;
+      }
+    }
+
+    .pam-header__title--sub {
+      padding-top: 2px;
+        font-size: 12px;
+        transform: scale(0.9);
+        -webkit-transform-origin-x: 0;
+        font-weight: bold;
+        color: $CORAL;
+        letter-spacing: 1.2px;
+      }
+    }
+
+
+    .pam-header__action-bar {
+      position: relative;
+      display: flex;
+      height: 100%;
+      font-size: 24px;
+      font-weight: bold;
+      align-items: center;
+      justify-content: space-around;
+
+      i {
+        padding: 0px 15px;
+        @extend .fix-chrome-click--issue;
+
+        @media screen and (max-width: 352px) {
+          padding: 0px 10px;
+        }
+      }
+
+      .admin-avatar {
+        margin: 0px 15px;
+        @media screen and (max-width: 352px) {
+          margin: 0px 10px;
+        }
+      }
+
+      .icon-bell {
+        position: relative;
+        .newNotification {
+          position: absolute;
+          width: 10px;
+          height: 10px;
+          top: 0;
+          right: 15px;
+          border-radius: 50px;
+          background: $PRIMARY_RED;
+        }
       }
     }
   }
-}
+
+  .el-dropdown{
+    height: 100%;
+    display: flex;
+    align-items: center;
+    &.is-open {
+        background-color: $PEACH;
+      i {
+        color: $PRIMARY_WHITE;
+      }
+    }
+  }
+
+  @include desktop {
+    .pam-header {
+      height: $DESKTOP_NAV_BAR;
+
+      .pam-header__logo {
+        width: 160px;
+        height: 70px;
+        margin: 0;
+        background-image: url('~/assets/images/logo.png');
+        background-size: contain;
+        background-repeat: no-repeat;
+        background-position: center;
+      }
+
+      .pam-header__title {
+        display: flex;
+        justify-content: flex-start;
+        align-items: center;
+        border: none;
+        padding-left: 30px;
+
+        .pam-header__title--main {
+          font-size: 30px;
+          letter-spacing: 1.5px;
+        }
+
+        .pam-header__title--sub {
+          font-size: 20px;
+          letter-spacing: 2px;
+          transform: none;
+          margin-left: 30px;
+        }
+      }
+    }
+  }
+
 </style>

--
Gitblit v1.8.0