# 匯出PDF 程式碼 11/24
### export.component.html
```
<div class="body-content">
<div class="left">
<input type="checkbox" name="" id="sideMenu-active">
<div class="sideMenu">
<label for="sideMenu-active" class="close">
<i class="material-icons">east</i>
</label>
<div class="sideMenu__content">
<div class="sideMenu__content__subscribe" routerLink="/add-subscribe">
<i class="material-icons">
bookmarks
</i>
<span>新增訂閱</span>
</div>
<div class="sideMenu__content__userTeach" routerLink="/user-teach">
<i class="material-icons">
help_outline
</i>
<span>使用說明</span>
</div>
<ul>
<li>
<div class="sideMenu__content__title active">
<div class="title">
<i class="material-icons">
library_add
</i>
<h1>行程管理</h1>
</div>
<div class="form-group row">
<i class="material-icons sideMenu__content__arrow" (click)="isOpen = !isOpen"
[attr.aria-expanded]="!isOpen" aria-controls="collapseBasic">
arrow_left
</i>
</div>
</div>
<div id="collapseBasic" [collapse]="isOpen" [isAnimated]="true">
<ul class="sideMenu__content__list">
<li>
<div class="sideMenu__content__add" routerLink="/add-schedule">
<span>新增行程</span>
</div>
<div class="sideMenu__content__add" routerLink="/meeting">
<span>查看會議</span>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul>
<li>
<div class="sideMenu__content__title active">
<div class="title">
<i class="material-icons">
open_in_new
</i>
<h1>匯出入管理</h1>
</div>
<div class="form-group row">
<i class="material-icons sideMenu__content__arrow" (click)="isTrue = !isTrue"
[attr.aria-expanded]="!isTrue" aria-controls="collapseBasic">
arrow_left
</i>
</div>
</div>
<div id="collapseBasic" [collapse]="isTrue" [isAnimated]="true">
<ul class="sideMenu__content__list">
<li *ngIf="staff === 'true'">
<div class="sideMenu__content__add" routerLink="/official-add">
<span>匯出修改</span>
</div>
<div class="sideMenu__content__add" routerLink="/official-change">
<span>匯入建立</span>
</div>
</li>
<li>
<div class="sideMenu__content__add" routerLink="/opendata">
<span>OpenData</span>
</div>
<div class="sideMenu__content__add" routerLink="/export" *ngIf="staff === 'true'">
<span>匯出PDF</span>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<label for="sideMenu-active" class="open">
<i class="material-icons">menu</i>
</label>
</div>
<div class="right">
<app-navbar></app-navbar>
<main #main>
<article>
<section class="container">
<div class="item-categories">
<div class="item-categories__title active">
<div class="name">
<i class="material-icons">
picture_as_pdf
</i>
<span>匯出學校行事曆</span>
</div>
</div>
<div id="collapseBasic" [collapse]="isCollapsed" [isAnimated]="true">
<div class="year">
<span>學年度</span>
<select class="form-control" [(ngModel)]="setYear" (change)="changeYear()">
<option *ngFor="let year of year">{{year}}</option>
</select>
</div>
</div>
</div>
</section>
<section class="body">
<ul class="event-list" #screen id="screen">
<div class="event-list__header">
<h1>國立臺北商業大學{{setYear}}學年度第1學期行事曆</h1>
</div>
<div class="event-list__calendarName_all">
<div class="event-list__calendarName_empty"></div>
<div class="event-list__calendarName_empty2"></div>
<div class="event-list__calendarName">日間部行事摘要</div>
<div class="event-list__calendarName_nd">進修部行事摘要</div>
</div>
<div class="event-list__phase">
<div class="event-list__month">8月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate8">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_8">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_8_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">9月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate9">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_9">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_9_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">10月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate10">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_10">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_10_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">11月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate11">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_11">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_11_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">12月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate12">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_12">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_12_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">1月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate1">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_1">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_1_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__header">
<h1>國立臺北商業大學{{setYear}}學年度第2學期行事曆</h1>
</div>
<div class="event-list__calendarName_all">
<div class="event-list__calendarName_empty"></div>
<div class="event-list__calendarName_empty2"></div>
<div class="event-list__calendarName">日間部行事摘要</div>
<div class="event-list__calendarName_nd">進修部行事摘要</div>
</div>
<div class="event-list__phase">
<div class="event-list__month">2月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate2">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_2">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_2_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">3月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate3">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_3">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_3_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">4月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate4">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_4">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_4_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">5月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate5">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_5">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_5_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">6月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate6">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_6">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_6_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
<div class="event-list__phase">
<div class="event-list__month">7月</div>
<div class="event-list__datapicker">
<full-calendar #header [header]=false [plugins]="calendarPlugins" [defaultDate]="setDate7">
</full-calendar>
</div>
<li *ngFor="let calendar of eventMonth_7">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
<li *ngFor="let calendar of eventMonth_7_nd">
<div class="event-list__content">
<div class="event-list__title" *ngFor="let event of calendar.events">
<span class="date">{{event.startMonth}} / {{event.startDay}}</span>
<span>{{event.title}}</span>
</div>
</div>
</li>
</div>
</ul>
<div class="subBtn" (click)="savePdf(main)">
<i class="material-icons">
download
</i>
<span>下載</span>
</div>
</section>
<div id="nodownload">
<img #canvas>
<a #downloadLink></a>
</div>
</article>
</main>
</div>
</div>
```
### export.component.scss
```
@import '../../styles.scss';
@media screen {
.body-content {
.left {
.sideMenu {
width : 270px;
transform : translateX(-270px);
position : absolute;
top : 0;
background-color: $color_table-header;
bottom : 0;
}
#sideMenu-active,
.close,
.open {
display: none;
}
}
.right {
width: 100%;
article {
padding-top : $height_header;
padding-left: $content-size_left-right*2 ;
section.container{
width : 90%;
margin : $content-size_left-right auto;
margin-top : $content-size_top-bottom*4;
padding : $content-size_left-right;
background-color: $color_white;
box-shadow : $box-shadow--container;
.item-categories {
display : flex;
align-items : center;
width : 70%;
margin-left : auto;
margin-right: auto;
i {
color : $color_icon;
cursor: pointer;
}
&__title {
display : flex;
align-items : center;
justify-content: space-between;
padding : $content-size_left-right/1.5 0;
font-size : 1.2rem;
&:hover,
&.active {
.item-categories__arrow {
transform: rotate(-90deg);
}
}
.name {
display : flex;
align-items: center;
span {
margin-left: $content-size_left-right/2;
}
}
}
.year{
display : flex;
align-items: center;
margin-left: $content-size_left-right*3;
span {
margin-left: $content-size_left-right;
}
select {
width : 200px;
margin-left: $content-size_left-right;
}
}
}
&__arrow {
transition: $transition_short;
}
&__list {
display : flex;
flex-flow: column;
padding : $content-size_left-right/2 0;
li {
display : inline-flex;
align-items: center;
padding : 0;
margin-top : $content-size_top-bottom/2;
cursor : pointer;
}
}
h3 {
width : 37%;
margin-left : auto;
font-size : 13px;
font-weight : 600;
color : $color_text;
letter-spacing: 1px;
cursor : pointer;
}
h3:hover {
color : $color_accent;
border-bottom: $color_accent 1px solid;
}
}
section.body {
margin : $content-size_left-right;
margin-top : $content-size_top-bottom*4;
padding : $content-size_left-right;
background-color: $color_white;
box-shadow : $box-shadow--container;
.item-categories {
display: inline-block;
i {
color : $color_icon;
cursor: pointer;
}
&__title {
display : flex;
align-items : center;
justify-content: space-between;
padding : $content-size_left-right/1.5 0;
font-size : 1.2rem;
&:hover,
&.active {
.item-categories__arrow {
transform: rotate(-90deg);
}
}
.name {
display : flex;
align-items: center;
float: left;
span {
margin-left: $content-size_left-right/2;
}
}
.year{
display : flex;
align-items: center;
span {
display: flex;
margin-left: $content-size_left-right;
}
select {
display: flex;
margin-left: $content-size_left-right;
}
}
}
&__arrow {
transition: $transition_short;
}
&__list {
display : flex;
flex-flow: column;
padding : $content-size_left-right/2 0;
li {
display : inline-flex;
align-items: center;
padding : 0;
margin-top : $content-size_top-bottom/2;
cursor : pointer;
}
}
h3 {
width : 37%;
margin-left : auto;
font-size : 13px;
font-weight : 600;
color : $color_text;
letter-spacing: 1px;
cursor : pointer;
}
h3:hover {
color : $color_accent;
border-bottom: $color_accent 1px solid;
}
}
.header {
display: none;
}
.event-list {
&__header {
color : $color_text;
font-size : 1rem;
font-weight : 600;
letter-spacing: 1px;
padding : $content-size_top-bottom $content-size_left-right/2;
text-align: center;
}
li {
display : flex;
flex-flow : row nowrap;
line-height: 1;
max-width:355.88px;
border-left: 1.5px solid $color_text;
&:not(.event-list__header):not(.event-list__phase) {
min-height : 5rem;
border-bottom: $color_border solid 1px;
}
>div {
padding: $content-size_top-bottom $content-size_left-right;
}
h1 {
width : 100%;
text-align: center;
}
}
&__month {
font-size: 16px;
height: max-content;
display : inline-block;
text-align : center;
padding: $content-size_top-bottom*2 $content-size_left-right;
}
&__datapicker{
border-left:1.5px solid $color_text;
display: center;
.full-calendar{
box-shadow: 0px 0px 0px ;
}
}
&__content {
display: inline-block;
text-align: left;
}
&__title {
display : inline-block;
font-size: 13px;
padding: $content-size_top-bottom/2 $content-size_left-right/4;
span {
font-size : 14px;
margin-left: $content-size_left-right/4;
}
span.date {
margin-left: $content-size_left-right/2;
}
}
&__calendarName_all{
display: grid;
grid-template-columns: 80px 1fr 1fr 1fr;
text-align: center;
grid-gap: 1.5px;
background-color: $color_text;
padding: 1.5px;
>div {
background-color: #ffffff;
}
.calendarName_empty{
display: inline-block;
text-align : center;
font-size : 12px;
font-weight: 600;
}
.calendarName_empty2{
display: inline-block;
text-align : center;
font-size : 12px;
font-weight: 600;
}
.calendarName {
display: inline-block;
text-align : center;
font-size : 12px;
font-weight: 600;
}
.calendarName_nd {
display:inline-block ;
text-align : center;
font-size : 12px;
font-weight: 600;
}
}
&__phase {
display: grid !important;
grid-template-columns: 80px 1fr 1fr 1fr;
text-align: left;
border-top: 1px solid $color_text;
border-bottom: 1px solid $color_text;
border-left: 1.5px solid $color_text;
border-right: 1.5px solid $color_text;
}
}
.subBtn {
display : flex;
align-items : center;
width : 10%;
background-color: $color_accent;
border-radius : 5px;
padding : $content-size_top-bottom/2 $content-size_left-right/2;
justify-content : center;
color : white;
letter-spacing : 1px;
margin-top : $content-size_top-bottom*3;
margin-left : auto;
cursor : pointer;
i {
color: white;
}
span {
margin-left: $content-size_left-right/2;
}
}
}
#nodownload {
display: none;
}
}
}
}
}
@media screen and (max-width:480px) {
.body-content {
display: flex;
height : 100vh;
.left {
.sideMenu {
width : 270px;
display : flex;
flex-direction: column;
padding : 50px 0;
position : fixed;
transform : translateX(-100%);
transition : 0.4s;
z-index : 1000;
label.close {
display : block;
width : 20px;
height : 40px;
position : fixed;
right : 10%;
top : 3%;
line-height: 40px;
text-align : center;
i {
cursor : pointer;
color : $color_text;
font-weight: 600;
}
}
&__content {
overflow: auto;
padding : $content-size_top-bottom $content-size_left-right;
&__list {
display : flex;
flex-flow: column;
padding : $content-size_left-right/2 0;
li {
display : inline-flex;
align-items: center;
padding : $content-size_left-right/2 0;
cursor : pointer;
}
}
&__item {
flex : auto;
margin-left: $content-size_left-right/2;
}
&__status {
width : 10px;
height : 10px;
border-radius: 50%;
}
&__title {
display : flex;
align-items : center;
justify-content: space-between;
padding : $content-size_left-right/1.5 0;
border-bottom : $color_border solid 1px;
font-size : 1.2rem;
margin-top : $content-size_top-bottom;
&:hover,
&.active {
.sideMenu__content__arrow {
transform: rotate(-90deg);
}
}
.title {
display : flex;
align-items: center;
h1 {
margin-left: $content-size_left-right/2;
}
}
}
&__arrow {
transition: $transition_short;
}
&__subscribe,
&__userTeach {
display : flex;
align-items : center;
width : 100%;
justify-content : center;
padding : $content-size_top-bottom $content-size_left-right;
background-color: $color_accent;
border-radius : 5px;
color : white;
letter-spacing : 1px;
i {
color: white;
}
span {
margin-left: $content-size_left-right/2;
}
}
&__userTeach {
margin-top: $content-size_top-bottom/2;
}
&__add {
display : flex;
align-items : center;
width : 48%;
justify-content : center;
padding : $content-size_top-bottom $content-size_left-right;
background-color: $color_accent;
border-radius : 5px;
color : white;
letter-spacing : 1px;
}
&__add:nth-child(2) {
margin-left: 4%;
}
}
}
#sideMenu-active:checked+.sideMenu {
transform: translateX(0);
}
label.open {
display : block;
width : 20px;
height : 40px;
position : fixed;
left : 10%;
top : 3%;
line-height: 40px;
text-align : center;
z-index : 999;
i {
color : $color_accent;
cursor: pointer;
}
}
}
.right {
.aside {
display: none;
}
article {
padding: $height_header $content-size_left-right;
section.container {
width : 100%;
margin : 0;
margin-top: $content-size_top-bottom*3;
padding : $content-size_top-bottom*2 $content-size_top-bottom;
.header {
font-size: 14px;
display : block;
height : 200px;
border : 1px solid $color_border;
padding : $content-size_top-bottom $content-size_left-right;
.item-categories {
i {
color : $color_icon;
cursor: pointer;
}
&__title {
display : flex;
align-items : center;
justify-content: space-between;
padding : $content-size_left-right/1.5 0;
border-bottom : $color_border solid 1px;
font-size : 1.2rem;
&:hover,
&.active {
.item-categories__arrow {
transform: rotate(-90deg);
}
}
.name {
display : flex;
align-items: center;
span {
margin-left: $content-size_left-right/2;
}
}
}
&__arrow {
transition: $transition_short;
}
&__list {
display : flex;
flex-flow: column;
height : 100px;
overflow : auto;
li {
display : inline-flex;
align-items: center;
cursor : pointer;
margin-top : $content-size_top-bottom/2;
}
}
h3 {
width : 37%;
margin-left : auto;
font-size : 13px;
font-weight : 600;
color : $color_text;
letter-spacing: 1px;
cursor : pointer;
}
h3:hover {
color : $color_accent;
border-bottom: $color_accent 1px solid;
}
}
.year {
display : flex;
align-items: center;
select {
margin-left: $content-size_left-right/2;
}
span {
width: 80px;
}
}
}
.event-list {
margin-top: $content-size_top-bottom;
&__header {
font-size: 11px;
padding : $content-size_top-bottom/2;
}
&__phase {
font-size: 11px;
}
&__title,
&__content,
&__date {
padding: $content-size_top-bottom/2 $content-size_left-right/4;
}
&__title {
flex: 1.5;
}
&__content {
flex: 2;
}
&__date {
flex: 1;
}
}
.subBtn {
width: 90px;
}
}
}
}
}
}
```
### export.component.ts
```
import { EventService } from './../services/event.service';
import { CalendarService } from './../services/calendar.service';
import { Component, ViewChild, OnInit, ElementRef } from '@angular/core';
import html2canvas from 'html2canvas';
import * as jsPDF from 'jspdf';
import { FullCalendarComponent } from '@fullcalendar/angular';
import dayGridPlugin from '@fullcalendar/daygrid';
@Component({
selector: 'app-export',
templateUrl: './export.component.html',
styleUrls: ['./export.component.scss']
})
export class ExportComponent implements OnInit {
isCollapsed = false;
isTrue = false;
isOpen = false;
openCalendar = [];
allEvents = [];
year = [];
staff = localStorage.getItem('staff');
setYear = new Date().getFullYear() - 1911;
showTitle = false;
eventMonth_1 = [];
eventMonth_2 = [];
eventMonth_3 = [];
eventMonth_4 = [];
eventMonth_5 = [];
eventMonth_6 = [];
eventMonth_7 = [];
eventMonth_8 = [];
eventMonth_9 = [];
eventMonth_10 = [];
eventMonth_11 = [];
eventMonth_12 = [];
eventMonth_1_nd = [];
eventMonth_2_nd = [];
eventMonth_3_nd = [];
eventMonth_4_nd = [];
eventMonth_5_nd = [];
eventMonth_6_nd = [];
eventMonth_7_nd = [];
eventMonth_8_nd = [];
eventMonth_9_nd = [];
eventMonth_10_nd = [];
eventMonth_11_nd = [];
eventMonth_12_nd = [];
@ViewChild('calendar') calendarComponent: FullCalendarComponent; // the #calendar in the template
@ViewChild('screen') screen: ElementRef;
@ViewChild('canvas') canvas: ElementRef;
@ViewChild('downloadLink') downloadLink: ElementRef;
constructor(
private calendarService: CalendarService,
private eventService: EventService
) { }
calendarPlugins = [dayGridPlugin];
setDate8 = '2020-08-01';
setDate9 = '2020-09-01';
setDate10 = '2020-10-01';
setDate11 = '2020-11-01';
setDate12 = '2020-12-01';
setDate1 = '2020-01-01';
setDate2 = '2020-02-01';
setDate3 = '2020-03-01';
setDate4 = '2020-04-01';
setDate5 = '2020-05-01';
setDate6 = '2020-06-01';
setDate7 = '2020-07-01';
ngOnInit(): void {
this.year.push(this.setYear);
this.calendarService.getCalendar().subscribe(
data => {
data.forEach(calendar => {
this.openCalendar.push({
id: calendar.id, name: calendar.name, display: calendar.display,
color: calendar.color //isChecked: false
});
});
}
);
this.eventService.getEvents().subscribe(
data => {
data.forEach(event => {
this.allEvents.push({
id: event.id, title: event.title, description: event.description, startDate: event.startAt.substr(0, 10),
calendars: event.eventinvitecalendarSet, startMonth: event.startAt.substr(5, 2), startDay: event.startAt.substr(8, 2),
mainCalendar: event.eventinvitecalendarSet[0].mainCalendar.name
});
});
this.allEvents.forEach(event => {
this.year.push(Number(event.startDate.substr(0, 4)) - 1911);
});
this.yearSort();
this.resetDate();
this.showEventSort();
}
);
}
yearSort() {
this.year = this.year.filter((el, i, arr) => {
return arr.indexOf(el) === i;
});
this.year.sort((a, b) => {
if (a < b) {
return 1;
}
if (a > b) {
return -1;
}
return 0;
});
}
async savePdf(main: HTMLElement) {
for (let i = 0; i < 2; i++) {
await new Promise(resolve => {
setTimeout(() => {
main.scrollIntoView();
resolve();
}, 500);
});
}
html2canvas(this.screen.nativeElement).then(canvas => {
const contentWidth = canvas.width;
const contentHeight = canvas.height;
const pageHeight = contentWidth / 592.28 * 841.89;
let leftHeight = contentHeight;
let position = 0;
const imgWidth = 595.28;
const imgHeight = 592.28 / contentWidth * contentHeight;
const pageData = canvas.toDataURL('image/jpeg', 1.0);
const pdf = new jsPDF('', 'pt', 'a4');
if (leftHeight <= pageHeight) {
pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
} else {
while (leftHeight > 0) {
pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
leftHeight -= pageHeight;
position -= 881;
if (leftHeight > 0) {
pdf.addPage();
}
}
}
pdf.save('demo.pdf');
});
}
changeYear() {
this.resetDate();
this.showEventSort();
}
resetDate() {
this.showTitle = true;
this.eventMonth_1 = [];
this.eventMonth_2 = [];
this.eventMonth_3 = [];
this.eventMonth_4 = [];
this.eventMonth_5 = [];
this.eventMonth_6 = [];
this.eventMonth_7 = [];
this.eventMonth_8 = [];
this.eventMonth_9 = [];
this.eventMonth_10 = [];
this.eventMonth_11 = [];
this.eventMonth_12 = [];
const eventMonth_1 = [];
const eventMonth_2 = [];
const eventMonth_3 = [];
const eventMonth_4 = [];
const eventMonth_5 = [];
const eventMonth_6 = [];
const eventMonth_7 = [];
const eventMonth_8 = [];
const eventMonth_9 = [];
const eventMonth_10 = [];
const eventMonth_11 = [];
const eventMonth_12 = [];
this.eventMonth_1_nd = [];
this.eventMonth_2_nd = [];
this.eventMonth_3_nd = [];
this.eventMonth_4_nd = [];
this.eventMonth_5_nd = [];
this.eventMonth_6_nd = [];
this.eventMonth_7_nd = [];
this.eventMonth_8_nd = [];
this.eventMonth_9_nd = [];
this.eventMonth_10_nd = [];
this.eventMonth_11_nd = [];
this.eventMonth_12_nd = [];
const eventMonth_1_nd = [];
const eventMonth_2_nd = [];
const eventMonth_3_nd = [];
const eventMonth_4_nd = [];
const eventMonth_5_nd = [];
const eventMonth_6_nd = [];
const eventMonth_7_nd = [];
const eventMonth_8_nd = [];
const eventMonth_9_nd = [];
const eventMonth_10_nd = [];
const eventMonth_11_nd = [];
const eventMonth_12_nd = [];
this.openCalendar.forEach(calendar => {
this.allEvents.forEach(event => {
if (calendar.id === event.calendars[0].mainCalendar.id &&
calendar.name === '日間部行事曆') {
// if內 calendar.isChecked === true
if ( Number(this.setYear) + 1 === Number(event.startDate.substr(0, 4) - 1911) &&
event.startDate.substr(5, 2) <= 7 && event.startDate.substr(5, 2) > 1) {
switch (event.startDate.substr(5, 2)) {
case '02':
eventMonth_2.push(event);
break;
case '03':
eventMonth_3.push(event);
break;
case '04':
eventMonth_4.push(event);
break;
case '05':
eventMonth_5.push(event);
break;
case '06':
eventMonth_6.push(event);
break;
case '07':
eventMonth_7.push(event);
break;
}
return 0;
} else if ( Number(this.setYear) === Number(event.startDate.substr(0, 4) - 1911) &&
event.startDate.substr(5, 2) > 7) {
switch (event.startDate.substr(5, 2)) {
case '08':
eventMonth_8.push(event);
break;
case '09':
eventMonth_9.push(event);
break;
case '10':
eventMonth_10.push(event);
break;
case '11':
eventMonth_11.push(event);
break;
case '12':
eventMonth_12.push(event);
break;
}
return 0;
} else if ( Number(this.setYear) + 1 === Number(event.startDate.substr(0, 4) - 1911) && event.startDate.substr(5, 2) < 2) {
switch (event.startDate.substr(5, 2)) {
case '01':
eventMonth_1.push(event);
break;
}
return 0;
}
} else if (calendar.id === event.calendars[0].mainCalendar.id &&
calendar.name === '進修部行事曆') {
if ( Number(this.setYear)+1 === Number(event.startDate.substr(0, 4) - 1911)&& event.startDate.substr(5, 2) <= 7 && event.startDate.substr(5, 2) > 1) {
switch (event.startDate.substr(5, 2)) {
case '02':
eventMonth_2_nd.push(event);
break;
case '03':
eventMonth_3_nd.push(event);
break;
case '04':
eventMonth_4_nd.push(event);
break;
case '05':
eventMonth_5_nd.push(event);
break;
case '06':
eventMonth_6_nd.push(event);
break;
case '07':
eventMonth_7_nd.push(event);
break;
}
return 0;
} else if ( Number(this.setYear) === Number(event.startDate.substr(0, 4) - 1911)&& event.startDate.substr(5, 2) > 7) {
switch (event.startDate.substr(5, 2)) {
case '08':
eventMonth_8_nd.push(event);
break;
case '09':
eventMonth_9_nd.push(event);
break;
case '10':
eventMonth_10_nd.push(event);
break;
case '11':
eventMonth_11_nd.push(event);
break;
case '12':
eventMonth_12_nd.push(event);
break;
}
return 0;
} else if ( Number(this.setYear) + 1 === Number(event.startDate.substr(0, 4) - 1911)&& event.startDate.substr(5, 2) < 2) {
switch (event.startDate.substr(5, 2)) {
case '01':
eventMonth_1_nd.push(event);
break;
}
return 0;
}
}
});
});
this.eventMonth_1.push({ events: eventMonth_1 });
this.eventMonth_2.push({ events: eventMonth_2 });
this.eventMonth_3.push({ events: eventMonth_3 });
this.eventMonth_4.push({ events: eventMonth_4 });
this.eventMonth_5.push({ events: eventMonth_5 });
this.eventMonth_6.push({ events: eventMonth_6 });
this.eventMonth_7.push({ events: eventMonth_7 });
this.eventMonth_8.push({ events: eventMonth_8 });
this.eventMonth_9.push({ events: eventMonth_9 });
this.eventMonth_10.push({ events: eventMonth_10 });
this.eventMonth_11.push({ events: eventMonth_11 });
this.eventMonth_12.push({ events: eventMonth_12 });
this.eventMonth_1_nd.push({ events: eventMonth_1_nd });
this.eventMonth_2_nd.push({ events: eventMonth_2_nd });
this.eventMonth_3_nd.push({ events: eventMonth_3_nd });
this.eventMonth_4_nd.push({ events: eventMonth_4_nd });
this.eventMonth_5_nd.push({ events: eventMonth_5_nd });
this.eventMonth_6_nd.push({ events: eventMonth_6_nd });
this.eventMonth_7_nd.push({ events: eventMonth_7_nd });
this.eventMonth_8_nd.push({ events: eventMonth_8_nd });
this.eventMonth_9_nd.push({ events: eventMonth_9_nd });
this.eventMonth_10_nd.push({ events: eventMonth_10_nd });
this.eventMonth_11_nd.push({ events: eventMonth_11_nd });
this.eventMonth_12_nd.push({ events: eventMonth_12_nd });
this.showEventSort();
}
showEventSort() {
// 日間部
this.eventMonth_1[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_2[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_3[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_4[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_5[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_6[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_7[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_8[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_9[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_10[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_11[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_12[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
// 進修部
this.eventMonth_1_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_2_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_3_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_4_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_5_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_6_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_7_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_8_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_9_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_10_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_11_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
this.eventMonth_12_nd[0].events.sort((a, b) => {
const startA = a.startDate.toUpperCase();
const startB = b.startDate.toUpperCase();
if (startA < startB) {
return -1;
}
if (startA > startB) {
return 1;
}
return 0;
});
}
}
```