calendar.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. // 日历组件
  2. <template>
  3. <div class="calendar-container">
  4. <header class="calendar-header">
  5. <!-- 头部左插槽 -->
  6. <div class="left">
  7. <slot name="left"></slot>
  8. </div>
  9. <div class="center">
  10. <el-button type="primary" @click="toogelDate('prev')"
  11. ><i class="el-icon-arrow-left" /> 上一周</el-button
  12. >
  13. <el-button type="primary" @click="toogelDate('today')">本周</el-button>
  14. <el-button type="primary" @click="toogelDate('next')"
  15. >下一周 <i class="el-icon-arrow-right"
  16. /></el-button>
  17. </div>
  18. <!-- 头部右插槽 -->
  19. <div class="right">
  20. <slot name="right"></slot>
  21. </div>
  22. </header>
  23. <FullCalendar
  24. ref="fullCalendar"
  25. class="calendar-body"
  26. :options="calendarOptions"
  27. >
  28. <template #eventContent="arg">
  29. <div class="popper-content">
  30. <template v-if="fromCode!=='meet'">
  31. <p>{{ arg.timeText }}</p>
  32. <p>{{ arg.event.title }}</p>
  33. </template>
  34. <div v-else-if="arg.event.extendedProps.titleArr.length">
  35. <p v-for="item in arg.event.extendedProps.titleArr" :key="item.title">{{ item.title }}</p>
  36. </div>
  37. </div>
  38. </template>
  39. </FullCalendar>
  40. <!-- 日历详情 旧版 -->
  41. <!-- <el-popover
  42. placement="bottom-start"
  43. width="250"
  44. popper-class="calendar-eventinfo-popover"
  45. ref="popover"
  46. >
  47. <div class="popover-body" v-if="fromCode!=='meet'">
  48. <p>
  49. <template v-if="selectEventInfo.StartDate === selectEventInfo.EndDate">
  50. {{
  51. `${$moment(selectEventInfo.StartDate).format("MM.DD")}
  52. (${$moment(selectEventInfo.StartDate).format('ddd')})
  53. ${selectEventInfo.StartTime&&selectEventInfo.StartTime.substr(0,5)} -
  54. ${selectEventInfo.EndTime&&selectEventInfo.EndTime.substr(0,5)}`
  55. }}
  56. </template>
  57. <template v-else>
  58. {{
  59. `${$moment(selectEventInfo.StartDate).format("MM.DD")}
  60. (${$moment(selectEventInfo.StartDate).format('ddd')})
  61. ${selectEventInfo.StartTime&&selectEventInfo.StartTime.substr(0,5)} -
  62. ${$moment(selectEventInfo.EndDate).format("MM.DD")}
  63. (${$moment(selectEventInfo.EndDate).format('ddd')})
  64. ${selectEventInfo.EndTime&&selectEventInfo.EndTime.substr(0,5)}`
  65. }}
  66. </template>
  67. </p>
  68. <p v-if="isSeller">{{ selectEventInfo.ResearcherName }}</p>
  69. <p>{{ selectEventInfo.title }}</p>
  70. <p v-if="selectEventInfo.CompanyName" >{{ `${selectEventInfo.CompanyName}${selectEventInfo.CompanyStatus ? '('+ selectEventInfo.CompanyStatus + ')' : ''}` }}</p>
  71. <p v-if="selectEventInfo.Theme">{{ selectEventInfo.Theme }}</p>
  72. <p v-if="selectEventInfo.CooperationName">{{ selectEventInfo.CooperationName }}</p>
  73. <p v-if="['公开会议','内部会议','路演'].includes(selectEventInfo.ActivityType)">发起人:{{selectEventInfo.SysUserRealName}}</p>
  74. </div>
  75. <div class="popover-body" v-else>
  76. <div v-for="item in selectEventInfo" :key="item.RsCalendarId" class="popover-event-item">
  77. <p>
  78. <template v-if="$moment(item.minTime).format('YYYY-MM-DD') === $moment(item.maxTime).format('YYYY-MM-DD')">
  79. {{
  80. `${$moment(item.minTime).format("MM.DD")}
  81. (${$moment(item.minTime).format('ddd')})
  82. ${$moment(item.minTime).format('HH:mm')} -
  83. ${$moment(item.maxTime).format('HH:mm')}`
  84. }}
  85. </template>
  86. <template v-else>
  87. {{
  88. `${$moment(item.minTime).format("MM.DD")}
  89. (${$moment(item.minTime).format('ddd')})
  90. ${$moment(item.minTime).format('HH:mm')} -
  91. ${$moment(item.maxTime).format("MM.DD")}
  92. (${$moment(item.maxTime).format('ddd')})
  93. ${$moment(item.maxTime).format('HH:mm')}`
  94. }}
  95. </template>
  96. </p>
  97. <p>{{ item.total_rs_name }}</p>
  98. <p>{{ item.title }}</p>
  99. <p v-if="item.CompanyName" >{{ `${item.CompanyName}${item.CompanyStatus ? '('+ item.CompanyStatus + ')' : ''}` }}</p>
  100. <p v-if="item.Theme">{{ item.Theme }}</p>
  101. <p v-if="item.CooperationName">{{ item.CooperationName }}</p>
  102. <p>发起人:{{item.SysUserRealName}}</p>
  103. </div>
  104. </div>
  105. <i
  106. class="close-icon el-icon-close"
  107. @click="closeIconClick"
  108. ></i>
  109. </el-popover> -->
  110. <!-- 日历详情弹窗 新版 -->
  111. <el-popover
  112. placement="bottom-start"
  113. width="300"
  114. popper-class="calendar-eventinfo-popover"
  115. ref="popover"
  116. >
  117. <div class="pop-header">
  118. <template v-if="fromCode==='meet'">
  119. <p>{{selectEventInfo[0]?selectEventInfo[0].ActivityType:''}}</p>
  120. </template>
  121. <template v-else>
  122. <p>{{selectEventInfo.ActivityType?`${selectEventInfo.RoadshowType}${selectEventInfo.ActivityType}`:'事项'}}</p>
  123. </template>
  124. <i
  125. class="close-icon el-icon-close"
  126. @click="closeIconClick"
  127. ></i>
  128. </div>
  129. <div class="popover-body">
  130. <template v-if="fromCode==='meet'">
  131. <div v-for="item in selectEventInfo" :key="item.RsCalendarId" class="popover-event-item">
  132. <p>
  133. <template v-if="$moment(item.minTime).format('YYYY-MM-DD') === $moment(item.maxTime).format('YYYY-MM-DD')">
  134. {{
  135. `${$moment(item.minTime).format("MM.DD")}
  136. (${$moment(item.minTime).format('ddd')})
  137. ${$moment(item.minTime).format('HH:mm')} -
  138. ${$moment(item.maxTime).format('HH:mm')}`
  139. }}
  140. </template>
  141. <template v-else>
  142. {{
  143. `${$moment(item.minTime).format("MM.DD")}
  144. (${$moment(item.minTime).format('ddd')})
  145. ${$moment(item.minTime).format('HH:mm')} -
  146. ${$moment(item.maxTime).format("MM.DD")}
  147. (${$moment(item.maxTime).format('ddd')})
  148. ${$moment(item.maxTime).format('HH:mm')}`
  149. }}
  150. </template>
  151. </p>
  152. <p>{{ item.title }}</p>
  153. <p>研究员:{{ item.total_rs_name }}</p>
  154. <p v-if="item.CompanyName" >{{ `${item.CompanyName}${item.CompanyStatus ? '('+ item.CompanyStatus + ')' : ''}` }}</p>
  155. <p v-if="item.Theme">会议主题:{{ item.Theme }}</p>
  156. <p v-if="item.CooperationName">合作方名称:{{ item.CooperationName }}</p>
  157. <p>发起人:{{item.SysUserRealName}}</p>
  158. </div>
  159. </template>
  160. <template v-else>
  161. <!-- 换行的内容需要对齐,所以dom结构设置成了下面这样 -->
  162. <div class="content-item" v-for="item in popContentArr" :key="item.key">
  163. <span class="label">{{item.label}}</span>
  164. <div class="content">
  165. <p>{{item.content}}</p>
  166. <p v-if="item.otherContent" class="other-text">{{item.otherContent}}</p>
  167. </div>
  168. </div>
  169. </template>
  170. </div>
  171. </el-popover>
  172. </div>
  173. </template>
  174. <script>
  175. import { roadshowInterence } from "@/api/api.js";
  176. import FullCalendar from "@fullcalendar/vue"; // 提供一个vue组件
  177. import interactionPlugin from "@fullcalendar/interaction"; // 检测dateClick操作、 可选操作和 事件拖放和调整大小所需的
  178. import timeGridPlugin from "@fullcalendar/timegrid"; // 提供TimeGrid视图
  179. export default {
  180. name: "Calendar",
  181. components: {
  182. FullCalendar,
  183. },
  184. props: {
  185. eventList: {
  186. type: Array,
  187. default: [],
  188. },
  189. fromCode: {
  190. type: String,
  191. default: ''
  192. }
  193. },
  194. computed: {
  195. roleId() {
  196. return Number(localStorage.getItem("AdminId"));
  197. },
  198. isSeller() {
  199. return ['ficc_seller', 'rai_seller', 'ficc_group', 'rai_group'].includes(localStorage.getItem('Role'))
  200. }
  201. },
  202. data() {
  203. return {
  204. calendarOptions: {
  205. height: 'auto', // 组件高度
  206. plugins: [interactionPlugin, timeGridPlugin], // 引入插件
  207. headerToolbar: false, // 顶部工具栏
  208. allDaySlot: false, // 全天日程(不需要)
  209. nowIndicator: true, //周/日视图中显示今天当前时间点(以红线标记),默认false不显示
  210. selectable: true,
  211. initialView: "timeGridWeek", // 设置默认显示周,可选月、日
  212. dateClick: this.handleDateClick,
  213. eventClick: this.handleEventClick,
  214. eventsSet: this.handleEvents,
  215. select: this.handleDateSelect,
  216. // 日程列表
  217. events: [],
  218. eventTimeFormat: {
  219. // 格式化日程显示时间,如'14:30'
  220. hour: "2-digit",
  221. minute: "2-digit",
  222. hour12: false,
  223. },
  224. slotMinTime:'08:00:00',//每天最早8点
  225. slotLabelFormat: {
  226. //格式化左侧显示时间
  227. hour12: false, // 14:00 true = 2pm
  228. hour: "2-digit", //'06:xx'
  229. minute: "2-digit", // 'xx:10'
  230. },
  231. eventColor: "#ECF5FF", // 默认日程背景色
  232. eventTextColor: "#333", // 默认日程文本颜色
  233. // eventClassNames: [ 'myclassname', 'otherclassname' ], // 自定义日程类名
  234. locale: "zh-cn", // 语言
  235. weekNumberCalculation: "ISO", // 周次的显示格式(ISO表示从周一开始)
  236. // slotEventOverlap: false, // 日程是否重叠
  237. // eventMaxStack: 1, // 堆叠最大日程数
  238. },
  239. // 用来存放组件api
  240. calendarApi: null,
  241. // 用来存放弹出框
  242. eventInfoPopoverApi: null,
  243. // 选中的日程信息
  244. selectEventInfo: {
  245. id: 0,
  246. title: "",
  247. userId: 0,
  248. beginDate: "",
  249. endDate: "",
  250. remark: "",
  251. status: "",
  252. },
  253. //弹窗展示的日程信息
  254. popContentArr:[
  255. {
  256. key:'',
  257. label:'',
  258. content:'',
  259. otherContent:''
  260. }
  261. ]
  262. };
  263. },
  264. methods: {
  265. // 获取组件api,存放到data中
  266. getCalendarApi() {
  267. this.calendarApi = this.$refs.fullCalendar.getApi();
  268. },
  269. // /* 切换日期 */
  270. toogelDate(type) {
  271. switch(type) {
  272. case 'prev':
  273. this.calendarApi.prev();
  274. break;
  275. case 'today':
  276. this.calendarApi.today();
  277. break;
  278. case 'next':
  279. this.calendarApi.next();
  280. break;
  281. }
  282. this.$emit('weekChange');
  283. },
  284. // 点击某一区域事件
  285. handleDateClick(arg) {
  286. this.$emit("cellClick", arg.date);
  287. },
  288. // 点击某一日程事件
  289. handleEventClick(calEvent) {
  290. let id = calEvent.event.id; // 获取当前点击日程的ID
  291. let info = this.eventList.find((item) => item.id == id);
  292. const { clientX,clientY } = calEvent.jsEvent;
  293. this.selectEventInfo = this.fromCode==='meet'
  294. ? info.filterArr.map(item => ({ ...item,title: this.setDynamicTitle(item) }))
  295. : {...info,title: this.setDynamicTitle(info)};
  296. // console.log(this.selectEventInfo)
  297. //鼠标点击的位置
  298. const popoverBounding = {width:300,height:270}
  299. const {innerWidth,innerHeight} = window
  300. let currentPosition = {left:clientX,top:clientY}
  301. if(clientX+popoverBounding.width>=innerWidth){
  302. currentPosition.left = innerWidth - popoverBounding.width
  303. }
  304. if(clientY+popoverBounding.height>=innerHeight){
  305. //currentPosition.top = innerHeight - popoverBounding.height
  306. currentPosition.bottom = 0
  307. }
  308. //获取popover展示的内容
  309. this.getPopoverContent()
  310. //popover的宽高
  311. //限制popover的位置不会超出屏幕,否则点不到关闭按钮
  312. $('.calendar-eventinfo-popover')[0].style.left = currentPosition.left + 'px';
  313. //$('.calendar-eventinfo-popover')[0].style.top = currentPosition.top + 'px';
  314. if(currentPosition.bottom === 0){
  315. $('.calendar-eventinfo-popover')[0].style.bottom=40+'px';
  316. $('.calendar-eventinfo-popover')[0].style.top='auto';
  317. }else{
  318. $('.calendar-eventinfo-popover')[0].style.top = currentPosition.top + 'px'
  319. $('.calendar-eventinfo-popover')[0].style.bottom='auto';
  320. }
  321. this.$refs.popover.doShow();
  322. // 禁止日历选择
  323. this.calendarApi.setOption("selectable", false);
  324. },
  325. getPopoverContent(){
  326. const {StartDate,StartTime,StartWeek,EndDate,EndTime,EndWeek} = this.selectEventInfo
  327. //前两项默认是开始时间和结束时间
  328. const popContent = [{
  329. key:'StartDate',
  330. label:'开始时间:',
  331. content:`${StartDate} ${StartTime} (${StartWeek})`,
  332. },{
  333. key:'EndDate',
  334. label:'结束时间:',
  335. content:`${EndDate} ${EndTime} (${EndWeek})`,
  336. }]
  337. //根据ActivityType判断是什么类型,根据RoadshowType展示对应信息
  338. const {ActivityType,RoadshowType} = this.selectEventInfo
  339. const {Province,City} = this.selectEventInfo
  340. //ActivityType为路演时,需要显示的内容
  341. const {RoadshowPlatform,CompanyName,CompanyStatus} = this.selectEventInfo
  342. const RoadshowContent = [{
  343. key:'RoadshowPlatform',
  344. label:'路演平台:',
  345. content:`${RoadshowPlatform}`,
  346. RoadshowType:'线上'
  347. },{
  348. key:'RoadshowCity',
  349. label:'路演城市:',
  350. content:`${Province}${City}`,
  351. RoadshowType:'线下'
  352. },{
  353. key:'CompanyName',
  354. label:'客户名称:',
  355. content:`${CompanyName}${CompanyStatus ? '('+ CompanyStatus + ')' : ''}`,
  356. RoadshowType:RoadshowType,
  357. }].filter(item=>item.RoadshowType===RoadshowType)
  358. //ActivityType为公开会议时,需要显示的内容
  359. const {Theme,CooperationName} = this.selectEventInfo
  360. const MeetingContent = [
  361. {
  362. key:'RoadshowPlatform',
  363. label:'会议平台:',
  364. content:`${RoadshowPlatform}`,
  365. RoadshowType:'线上'
  366. },{
  367. key:'RoadshowCity',
  368. label:'会议城市:',
  369. content:`${Province}${City}`,
  370. RoadshowType:'线下'
  371. },{
  372. key:'Theme',
  373. label:'会议主题:',
  374. content:`${Theme}`,
  375. RoadshowType:RoadshowType
  376. },{
  377. key:'CooperationName',
  378. label:'合作方名称:',
  379. content:`${CooperationName}`,
  380. RoadshowType:RoadshowType
  381. }].filter(item=>item.RoadshowType===RoadshowType)
  382. ////ActivityType不为空时,需要显示的内容
  383. const {ResearcherName,SysUserRealName} = this.selectEventInfo
  384. const SuppleContent=[{
  385. key:'ResearcherName',
  386. label:'研究员:',
  387. content:`${ResearcherName}`,
  388. },{
  389. key:'SysUserRealName',
  390. label:'发起人:',
  391. content:`${SysUserRealName}`,
  392. }]
  393. //ActivityType为空时,需要显示的内容
  394. const {MatterContent,EditReason,ModifyTime} = this.selectEventInfo
  395. const MattersContent=[{
  396. key:'MatterContent',
  397. label:'事项内容:',
  398. content:`${MatterContent}`,
  399. },{
  400. key:'EditReason',
  401. label:'最近修改记录:',
  402. content:`${EditReason}`,
  403. otherContent:`${this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')}`
  404. }].filter(item=>{return item.content.length})
  405. const contentMap = {
  406. '路演':RoadshowContent,
  407. '公开会议':MeetingContent,
  408. }
  409. if(ActivityType){
  410. this.popContentArr = [...popContent,...contentMap[ActivityType]||[],...SuppleContent]
  411. }else{
  412. this.popContentArr = [...popContent,...MattersContent]
  413. }
  414. //console.log('check',this.popContentArr)
  415. },
  416. // 点击日程信息弹窗关闭按钮
  417. closeIconClick() {
  418. this.calendarApi.setOption("selectable", true);
  419. // this.$refs["popover-" + id].doClose();
  420. this.$refs.popover.doClose();
  421. },
  422. // 点击日程信息弹窗修改按钮
  423. editIconClick(id) {
  424. this.closeIconClick(id);
  425. this.$emit('editCallback',this.selectEventInfo);
  426. },
  427. // 点击日程信息弹窗删除按钮
  428. delIconClick(id) {
  429. const { RsCalendarId,RsCalendarResearcherId,RsMattersId, ActivityType } = this.selectEventInfo;
  430. !['公开会议','路演'].includes(ActivityType) && this.$confirm("删除该活动后,将从日历中移除,确定继续吗?", "删除", {
  431. type: "warning"
  432. }).then( async() => {
  433. //删除事项
  434. let { Ret } = RsMattersId ? await roadshowInterence.delMatters({ RsMattersId })
  435. //删除活动
  436. : await roadshowInterence.deleteRoadshow({ RsCalendarId, RsCalendarResearcherId });
  437. if(Ret !== 200) return;
  438. this.$message.success('删除成功');
  439. this.$emit('weekChange');
  440. })
  441. .catch(() => {});
  442. ['公开会议','路演'].includes(ActivityType) && this.$emit('delAuthHandle',this.selectEventInfo);
  443. this.closeIconClick(id);
  444. },
  445. // 处理赋值函数
  446. getReservationList() {
  447. const arr = this.eventList.map((item) => {
  448. let title = (this.isSeller && item.ActivityType==='路演')
  449. ? `${item.CompanyName}${item.CompanyStatus ? '('+ item.CompanyStatus + ')' : ''}`
  450. : (this.isSeller && item.ActivityType==='公开会议')
  451. ? item.Theme
  452. : this.setDynamicTitle(item);
  453. let start = item.StartDate ? `${item.StartDate}T${item.StartTime}` : item.MinTime.replace(/ /,'T');
  454. let end = item.EndDate ? `${item.EndDate}T${item.EndTime}` : item.MaxTime.replace(/ /,'T');
  455. //合并公开会议显示
  456. item.CalendarList && this.filterSameIdArr(item);
  457. let titleArr = item.filterArr ? item.filterArr.map(sub_item => ({
  458. title: sub_item.title
  459. })) : [];
  460. return {
  461. start,
  462. end,
  463. event_id: item.RsCalendarId || item.RsMattersId,
  464. id: item.id,
  465. title,
  466. titleArr
  467. };
  468. });
  469. this.calendarOptions.events = arr
  470. console.log(this.eventList)
  471. },
  472. /* 拆分出活动id相同的数组和不同的数组 */
  473. filterSameIdArr(obj){
  474. let public_arr = [], id_arr = [];
  475. obj.CalendarList && obj.CalendarList.forEach(item => {
  476. if(!id_arr.includes(item.RsCalendarId)) {
  477. public_arr.push({
  478. id: item.RsCalendarId,
  479. ActivityType: item.ActivityType,
  480. Theme: item.Theme,
  481. CompanyName: item.CompanyName,
  482. CompanyStatus: item.CompanyStatus,
  483. CooperationName: item.CooperationName,
  484. SysUserRealName: item.SysUserRealName,
  485. RoadshowType: item.RoadshowType,
  486. RoadshowPlatform: item.RoadshowPlatform,
  487. Province: item.Province,
  488. City: item.City,
  489. children: [{
  490. name: item.ResearcherName,
  491. start: `${item.StartDate} ${item.StartTime}`,
  492. end: `${item.EndDate} ${item.EndTime}`,
  493. }]
  494. })
  495. id_arr.push(item.RsCalendarId)
  496. }else {
  497. public_arr.forEach(_item => {
  498. if(_item.id === item.RsCalendarId) {
  499. _item.children.push({
  500. name: item.ResearcherName,
  501. start: `${item.StartDate} ${item.StartTime}`,
  502. end: `${item.EndDate} ${item.EndTime}`,
  503. })
  504. }
  505. })
  506. }
  507. })
  508. //拼接活动id标题 获取活动公用最早时间和最晚时间
  509. public_arr.forEach(item => {
  510. let str = '';
  511. item.children.forEach(sub_item => {
  512. str += sub_item.name+','
  513. })
  514. str = str.substr(0, str.length-1)
  515. item.title = `${item.Theme}(${str})`;
  516. item.total_rs_name = str;
  517. let startDateArr = item.children.map(sub_item => this.$moment(sub_item.start).valueOf());
  518. let endDateArr = item.children.map(sub_item => this.$moment(sub_item.end).valueOf());
  519. let minTime = this.$moment(Math.min(...startDateArr)).format('YYYY-MM-DD HH:mm:ss');
  520. let maxTime = this.$moment(Math.max(...endDateArr)).format('YYYY-MM-DD HH:mm:ss');
  521. item.minTime = minTime;
  522. item.maxTime = maxTime;
  523. })
  524. this.$set(obj,'filterArr',public_arr)
  525. // console.log(public_arr)
  526. },
  527. // 拼接标题 type 内部会议 公开会议 路演 报告电话会 事项
  528. setDynamicTitle({ActivityType,RsMattersId,MatterContent,RoadshowType,RoadshowPlatform,Province,City,ActivityCategory,Source,Title}) {
  529. //第三方添加的日历活动
  530. if(Source === 1) return Title;
  531. switch(ActivityType || RsMattersId) {
  532. case '内部会议': return ActivityType;
  533. case '公开会议': return `${RoadshowType}${ActivityType}(${RoadshowType==='线上' ? RoadshowPlatform : Province+City})`;
  534. case '路演': return `${RoadshowType}${ActivityType}(${RoadshowType==='线上' ? RoadshowPlatform : Province+City})`;
  535. case '报告电话会': return `${ActivityCategory}电话会`;
  536. case RsMattersId: return MatterContent;
  537. }
  538. },
  539. // 格式化日期YYYY-MM-DD
  540. formateDate(date){
  541. return this.$moment(date).format('YYYY-MM-DD')
  542. },
  543. },
  544. mounted() {
  545. this.getCalendarApi();
  546. // this.today()
  547. this.toogelDate('today');
  548. },
  549. watch: {
  550. eventList() {
  551. this.getReservationList();
  552. },
  553. },
  554. };
  555. </script>
  556. <style lang="scss">
  557. .calendar-container {
  558. .calendar-header {
  559. display: flex;
  560. .left,
  561. .right {
  562. flex: 1;
  563. }
  564. .right {
  565. display: flex;
  566. justify-content: end;
  567. }
  568. .center .el-button{
  569. width: 140px;
  570. }
  571. }
  572. .calendar-body {
  573. height: 100%;
  574. margin-top: 10px;
  575. .fc-scrollgrid {
  576. colgroup col {
  577. width: 150px !important;
  578. }
  579. .fc-timegrid-slots table {
  580. line-height: 40px;
  581. .fc-timegrid-slot-label-frame {
  582. text-align: center;
  583. }
  584. }
  585. .fc-timegrid-cols table {
  586. .fc-day-today {
  587. background-color: #fee1cc66;
  588. }
  589. }
  590. .fc-col-header {
  591. line-height: 40px;
  592. .fc-col-header-cell {
  593. background-color: #ecf5ff;
  594. }
  595. .fc-day-today {
  596. background-color: #fee1cc66;
  597. }
  598. }
  599. }
  600. .fc-timegrid-col-events {
  601. cursor: pointer;
  602. margin: 0;
  603. .fc-event-main .popper-content {
  604. height: 100%;
  605. overflow: hidden;
  606. position: relative;
  607. left:-3px;
  608. &::before{
  609. content: '';
  610. position: absolute;
  611. top:0;left:0;
  612. height: 100%;
  613. width: 4px;
  614. background-color: #409EFF;
  615. }
  616. p {
  617. overflow: hidden;
  618. margin: 2px 10px;
  619. /* text-overflow: ellipsis; */
  620. display: -webkit-box;
  621. -webkit-line-clamp: 2;
  622. line-clamp: 2;
  623. -webkit-box-orient: vertical;
  624. }
  625. }
  626. }
  627. }
  628. }
  629. </style>
  630. <style lang="scss" scoped>
  631. .calendar-eventinfo-popover {
  632. position: relative !important;
  633. padding: 10px;
  634. border-radius: 5px;
  635. border: 1px solid #ebeef5;
  636. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  637. .popover-body {
  638. padding: 0 14px;
  639. max-height: 270px;
  640. overflow-y: auto;
  641. margin-top: 25px;
  642. /* p {
  643. margin-top: 5px;
  644. } */
  645. /* .close-icon {
  646. position: absolute;
  647. top: 5px;
  648. right: 5px;
  649. font-size: 20px;
  650. } */
  651. .content-item{
  652. display: flex;
  653. margin-top: 5px;
  654. .content{
  655. .other-text{
  656. color:#999;
  657. }
  658. }
  659. }
  660. }
  661. .pop-header{
  662. display: flex;
  663. justify-content: space-between;
  664. align-items: center;
  665. background-color: #5882EF;
  666. color: #fff;
  667. margin:-14px 0;
  668. padding:12px;
  669. .close-icon{
  670. cursor: pointer;
  671. font-size: 16px;
  672. }
  673. }
  674. .handle-btn-icon {
  675. display: flex;
  676. justify-content: end;
  677. i {
  678. margin: 5px;
  679. font-size: 20px;
  680. cursor: pointer;
  681. color: #3385ff;
  682. }
  683. }
  684. .popover-event-item {
  685. margin-bottom: 10px;
  686. padding-bottom: 10px;
  687. border-bottom: 1px dashed #666;
  688. &:last-child {
  689. border: none;
  690. }
  691. }
  692. }
  693. </style>
  694. <style lang="scss">
  695. .calendar-eventinfo-popover {
  696. position: fixed !important;
  697. top: 0;
  698. z-index: 99;
  699. padding: 14px 0;
  700. }
  701. </style>