---
# System prepended metadata

title: "\U0001F4CC[R]2020/05/27前端會議"
tags: [會議紀錄]

---

###### tags: `會議紀錄`
###### Thunder:`行動版 #日期區間JSON放型別Date時區問題`
###### CodeReview :`工時系統 更新機制 service worker json`
###### CodeReview A1: `special.gaurd` `getExportColumnKeys`
###### CodeReview OSS: `OSS EDM Editer`
###### Announcement:
###### Attendee: 政儀、永佳、偉恩、弘翊、政儒
# 📌[R]2020/05/27前端會議
## 踩雷事件
### ⚡行動版 #日期區間JSON放型別Date時區問題
在開發行動版上的應收帳款對帳單時，發現資料會有異常的問題(資料與WEB版不一致)。我比對了WEB版與行動版傳給後端的參數，發現行動版的日期會與選擇的不一致。

**#行動版concole值與實際傳給後端的值👇**
> console出來的日期與API傳送的日期，起訖相差了一天。
* [console] 前端要給後端的參數
![console前端要給後端的參數](https://i.imgur.com/tam42Im.png)
`起始日期: 2020 05 00 00:00:00 GMT+0800`
`結束日期: 2020 05 31 00:00:00 GMT+0800`

* [Network] Post API 前端給後端的參數
![Network前端給後端的參數](https://i.imgur.com/RyqtsWZ.png)
`起始日期: 2020-04-30 T16:00:00.000Z`
`結束日期: 2020-05-30 T16:00:00.000Z`

JSON為了可以支持用戶在不同的時區，因此會忽略日期的時區資訊轉並為UTC標準時間，才造成日期不一致的問題。
> JSON使用Date.prototype.toISOString不代表本地時間而是未經修改的UTC時間

> (給大家參考網路上的解決方法)
> 1.存入的日期與顯示的日期分開處理，顯示日期在取得日期後再加上時區。
> 2.改寫Date.prototype.toISOString

但目前我是直接把日期轉成字串😂

[JSON Stringify changes time of date because of UTC](https://stackoverflow.com/questions/1486476/json-stringify-changes-time-of-date-because-of-utc)
[JSON日期轉換的時區陷阱](https://blog.darkthread.net/blog/json-date-timezone-issue/)

## 寫法交流
### ⛏special.gaurd
永佳寫的新路由元件，目前已經可以拿來使用。
### ⛏OSS EDM Editer
由於舊的Editer太老舊，所以服務希望可以換一個新的套件。
弘翊在做EDM的時候覺得一個按鈕樣式可以分享給大家，這樣式需要做許多個class來呈現。


```css=
.flexBtns {
    display: flex;
    justify-content: space-between;
}
.editBtn {
    position: relative;
    padding: 5px 15px;
    border-radius: 4px;
    border: none;
    background-size: 200% auto;
    font-size: 110%;
    color: #FFF;
    background-image: linear-gradient(to right, #a4b8da 0%, #7190c5 51%, #a4b8da 100%);
    outline: none;
    cursor: pointer;
    transition: 0.2s;
}
.editBtn:hover::before {
    background: rgba(255, 255, 255, 0.2);
}
.editBtn:active::before {
    background: rgba(0, 0, 0, 0.05);
    box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.5);
}
.editBtn::before {
    content: '';
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    background: transparent;
    border-radius: 4px;
    transition: 0.2s;
    pointer-events: none;
}
.editBtn.purple {
    background-image: linear-gradient(to right, #cda4da 0%, #b271c5 51%, #cda4da 100%);
}

.editBtn.blue {
  background-image: linear-gradient(to right, #a4b8da 0%, #7190c5 51%, #a4b8da 100%);
}

/* Auto Save */
.autoSave {
    display: flex;
    align-items: center;
}
.autoSave p {
    margin: 0 5px 0 20px;
}
.autoSave input {
    display: none;
}
.autoSave input:checked ~ .checkBoxHolder {
    background: #afc6ee;
}
.autoSave input:checked ~ .checkBoxHolder .circle {
    left: 20px;
}
.autoSave input:checked ~ .checkBoxHolder::before {
    border: solid 1px #7190c5;
}
.autoSave input:checked ~ .checkBoxHolder .circle::before {
    animation: circle 0.4s linear forwards;
}
.autoSave .checkBoxHolder {
    position: relative;
    width: 43px;
    height: 26px;
    background: #FFFFFF;
    border-radius: 50px;
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5);
    /* overflow: hidden; */
    transition: 0.5s 0.1s;
    cursor: pointer;
}
.autoSave .checkBoxHolder::before {
    content: '';
    position: absolute;
    width: 30px;
    height: 16px;
    top: 50%;
    left: 50%;
    opacity: 0.5;
    border: solid 1px #c7c7c7;
    border-radius: 50px;
    transform: translate(-50%, -50%);
    transition: 0.5s 0.1s;
}
.autoSave .checkBoxHolder .circle {
    position: absolute;
    top: 3px;
    left: 3px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #FFFFFF;
    box-shadow: 0 1px 5px #252525;
    transition: 0.5s 0.1s;
}
.autoSave .checkBoxHolder .circle::before {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background: rgba(16, 103, 253, 0.9);
    transform: translate(-50%, -50%);
}
.autoSave .checkBoxHolder .circle::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background: #FFFFFF;
    transform: translate(-50%, -50%);
}

@keyframes circle {
    0% {
        transform: translate(-50%, -50%) scale(1);
        opacity: 1;
    }
    100% {
        transform: translate(-50%, -50%) scale(3);
        opacity: 0;
    }
}

```
### ⛏工時系統 更新機制 service worker json
政儀嘗試新更新機制，調整在工時系統裡，所以最近才會看到右下角有奇怪的訊息跑出來(但要升級V9才可以使用此套件，所以政儀將工時系統升級到9)。

希望可以嘗試讓A1不需要有轉圈圈的東西

* 這部分講了很多東西，但我有點忘記+不太了解，所以沒有詳細記錄QQ

### ⛏getExportColumnKeys
在許多作業裡會使用到轉出的功能，但我們在後續維護作業時，很容易在增減欄位時忘記修改輸出的欄位，因此政儀建議可以直接拿grid的header，就不用怕在調整欄位的時候忘記調整轉出這部分。

==舊寫法 #將要轉出的欄位加到陣列裡==
```typescript
/** 取得轉出的column */
getExportColumnKeys(): string[] {
    const columnKeys = ['ShowSeq_'];
    return columnKeys;
}
```
==新寫法 #畫面上的欄位都加到陣列裡==
```typescript
/** 取得轉出的column */
getExportColumnKeys(): string[] {
    const columnKeys: string[] = [];
    this.gridColumnDefs.forEach((x) => {
      if (x.colId !== 'isSelected' && x.colId !== 'action') {
        columnKeys.push(x.colId);
      }
    });
    return columnKeys;
}
```

## 事情公告
### 📢無事情公告