|
|
@@ -0,0 +1,277 @@
|
|
|
+<template>
|
|
|
+ <div class="tab">
|
|
|
+ <h1 class="title">
|
|
|
+ 消息通知
|
|
|
+ <template
|
|
|
+ v-if="(unreadMessage && !showRead && unreadMessage.length) || (readMessage && showRead && readMessage.length)">
|
|
|
+ <icon ripple="red" :class="editMode ? 'icon-active' : ''" @click="handleToggleEditMode"
|
|
|
+ :unicode="iconMap['list_check']" title="点击启动 / 关闭编辑模式"></icon>
|
|
|
+ <span>{{editMode ? '编辑模式' : '浏览模式'}}</span>
|
|
|
+ </template>
|
|
|
+ </h1>
|
|
|
+ <discussion-tab-tool-bar :read="false" @refresh="handleRefresh"></discussion-tab-tool-bar>
|
|
|
+ <div v-show="editMode" class="confirm-area">
|
|
|
+ <!-- <c-button class="secondary" @click="handleChooseAllArchive"><span>{{iconMap['archive']}}</span> 全选</c-button>-->
|
|
|
+ <!-- <c-button class="error" @click="handleChooseAllDelete"><span>{{iconMap['delete']}}</span> 全选</c-button>-->
|
|
|
+ <div class="confirm" @click="handleSubmit">
|
|
|
+ <icon :unicode="iconMap['done']" ripple="green"></icon>
|
|
|
+ 确定
|
|
|
+ </div>
|
|
|
+ <div class="cancel" @click="cancel">
|
|
|
+ <icon :unicode="iconMap['close']" ripple="red"></icon>
|
|
|
+ 取消
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template v-if="!showRead">
|
|
|
+ <div class="no-content-warning" v-if="unreadMessage === null">
|
|
|
+ 加载中...
|
|
|
+ </div>
|
|
|
+ <div class="no-content-warning" v-else-if="unreadMessage.length === 0">
|
|
|
+ 无未读消息
|
|
|
+ </div>
|
|
|
+ <template v-else>
|
|
|
+ <template v-for="message of unreadMessage">
|
|
|
+ <c-message :delete-prop="deleteIds.has(message.id)"
|
|
|
+ :archive-prop="archiveIds.has(message.id)"
|
|
|
+ @archive-state-change="handleArchiveStateChange"
|
|
|
+ @delete-state-change="handleDeleteStateChange"
|
|
|
+ :key="message.id"
|
|
|
+ :message="message"
|
|
|
+ :edit="editMode"></c-message>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <template v-if="showRead">
|
|
|
+ <div class="no-content-warning" v-if="readMessage === null">
|
|
|
+ 加载中...
|
|
|
+ </div>
|
|
|
+ <div class="no-content-warning" v-else-if="readMessage.length === 0">
|
|
|
+ 无已读消息
|
|
|
+ </div>
|
|
|
+ <template v-for="message of readMessage">
|
|
|
+ <c-message :delete-prop="deleteIds.has(message.id)"
|
|
|
+ :archive-prop="archiveIds.has(message.id)"
|
|
|
+ @delete-state-change="handleDeleteStateChange"
|
|
|
+ :key="message.id"
|
|
|
+ :message="message"
|
|
|
+ :read="true"
|
|
|
+ :edit="editMode">
|
|
|
+ </c-message>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import iconMap from '@/utils/icon-map'
|
|
|
+import DiscussionTabToolBar from '@/components/DiscussionTab/DiscussionTabToolBar'
|
|
|
+import CMessage from '@/components/DiscussionTab/CMessage'
|
|
|
+import { deleteMessages, getReadMessages, getUnreadMessages, readMessages } from '@/server/message'
|
|
|
+import Icon from '@/components/Icon'
|
|
|
+
|
|
|
+export default {
|
|
|
+ components: { Icon, DiscussionTabToolBar, CMessage },
|
|
|
+ data () {
|
|
|
+ return {
|
|
|
+ iconMap,
|
|
|
+ unreadMessage: null,
|
|
|
+ readMessage: null,
|
|
|
+ showRead: false,
|
|
|
+ editMode: false,
|
|
|
+ archiveIds: new Set([]),
|
|
|
+ deleteIds: new Set([])
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted () {
|
|
|
+ this.getUnread(20, '').then(() => {
|
|
|
+ this.getUnread(10000)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ handleRefresh (condition) {
|
|
|
+ this.cancel()
|
|
|
+ this.showRead = condition.showRead
|
|
|
+
|
|
|
+ if (condition.showRead) {
|
|
|
+ this.readMessage = null
|
|
|
+ this.getRead(20).then(() => {
|
|
|
+ this.getRead(10000, condition.key)
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.unreadMessage = null
|
|
|
+ this.getUnread(20).then(() => {
|
|
|
+ this.getUnread(10000, condition.key)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleToggleEditMode () {
|
|
|
+ this.editMode = !this.editMode
|
|
|
+ },
|
|
|
+ handleArchiveStateChange ({ value, id }) {
|
|
|
+ value ? (this.archiveIds.add(id)) : (this.archiveIds.delete(id))
|
|
|
+ console.log(Array.from(this.archiveIds))
|
|
|
+ },
|
|
|
+ handleDeleteStateChange ({ value, id }) {
|
|
|
+ value ? (this.deleteIds.add(id)) : (this.deleteIds.delete(id))
|
|
|
+ console.log(Array.from(this.archiveIds))
|
|
|
+ },
|
|
|
+ // handleChooseAllArchive () {
|
|
|
+ // this.unreadMessage.map(message => this.archiveIds.add(message.id))
|
|
|
+ // },
|
|
|
+ // handleChooseAllDelete () {
|
|
|
+ // this.unreadMessage.map(message => this.deleteIds.add(message.id))
|
|
|
+ // },
|
|
|
+ getUnread (size, key) {
|
|
|
+ return getUnreadMessages({ size, key }).then(res => {
|
|
|
+ this.unreadMessage = res.data
|
|
|
+ }).catch(err => {
|
|
|
+ this.$setErrorMessage(err.response.data.msg)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ getRead (size, key) {
|
|
|
+ return getReadMessages({ size, key }).then(res => {
|
|
|
+ this.readMessage = res.data
|
|
|
+ }).catch(err => {
|
|
|
+ this.$setErrorMessage(err.response.data.msg)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleSubmit () {
|
|
|
+ const deleteArr = Array.from(this.deleteIds)
|
|
|
+ const readArr = Array.from(this.archiveIds)
|
|
|
+ const handler = () => {
|
|
|
+ readArr.length > 0 && readMessages({ ids: readArr }).then(res => {
|
|
|
+ this.$setSuccessMessage('设置已读成功')
|
|
|
+ this.handleRefresh({ showRead: this.showRead })
|
|
|
+ }).catch(err => {
|
|
|
+ this.$setErrorMessage('设置已读过程中:' + err.response.data.msg)
|
|
|
+ })
|
|
|
+ deleteArr.length > 0 && deleteMessages({ ids: deleteArr }).then(res => {
|
|
|
+ this.$setSuccessMessage('删除成功')
|
|
|
+ this.handleRefresh({ showRead: this.showRead })
|
|
|
+ }).catch(err => {
|
|
|
+ this.$setErrorMessage('删除过程中:' + err.response.data.msg)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ if (deleteArr.length > 0) {
|
|
|
+ const msg = '即将删除' + deleteArr.length + '条信息,请确认。'
|
|
|
+ if (confirm(msg)) {
|
|
|
+ handler()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ handler()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ cancel () {
|
|
|
+ this.editMode = false
|
|
|
+ this.archiveIds = new Set([])
|
|
|
+ this.deleteIds = new Set([])
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+@import "~@/views/shared/tab-common.scss";
|
|
|
+@import "~@/style/theme.scss";
|
|
|
+
|
|
|
+@media (min-width: 800px) {
|
|
|
+ .tab {
|
|
|
+ max-width: 520px;
|
|
|
+ min-width: 520px;
|
|
|
+ position: relative;
|
|
|
+ box-sizing: border-box;
|
|
|
+ min-height: 450px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.no-content-warning {
|
|
|
+ height: 180px;
|
|
|
+}
|
|
|
+
|
|
|
+.title {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ margin-left: 8px;
|
|
|
+ color: #aabaca;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon-active {
|
|
|
+ color: $theme-red;
|
|
|
+ }
|
|
|
+
|
|
|
+ span {
|
|
|
+ margin-left: 4px;
|
|
|
+ font-size: 16px;
|
|
|
+ color: #aabaca;
|
|
|
+ transition: .2s;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.confirm-area {
|
|
|
+ opacity: 0;
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ margin: 20px -6px 0 -6px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: flex;
|
|
|
+ justify-content: left;
|
|
|
+ animation: .2s .2s show forwards;
|
|
|
+
|
|
|
+ .c-button {
|
|
|
+ margin: 0 6px;
|
|
|
+ width: unset;
|
|
|
+ min-width: unset;
|
|
|
+
|
|
|
+ span {
|
|
|
+ display: inline-block;
|
|
|
+ margin-right: 2px;
|
|
|
+ font-family: 'iconfont', sans-serif;
|
|
|
+ transform: scale(1.2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .confirm, .cancel {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #6a7a8a;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ .confirm {
|
|
|
+ color: $theme-green;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ opacity: .8;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ color: $theme-green;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .cancel {
|
|
|
+ color: $theme-red;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ opacity: .8;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ color: $theme-red;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes show {
|
|
|
+ from {
|
|
|
+ opacity: 0;
|
|
|
+ }
|
|
|
+ to {
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|