UNPKG

ngx-firebase-cms

Version:

Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)

537 lines (526 loc) 568 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/fire/firestore'), require('@angular/fire/storage'), require('@angular/fire/auth'), require('@angular/common'), require('ng-zorro-antd'), require('@ant-design/icons-angular/icons'), require('@angular/common/locales/en'), require('@angular/animations'), require('@angular/router'), require('rxjs'), require('rxjs/operators'), require('firebase/app'), require('@angular/forms'), require('@angular/common/http')) : typeof define === 'function' && define.amd ? define('ngx-firebase-cms', ['exports', '@angular/core', '@angular/fire/firestore', '@angular/fire/storage', '@angular/fire/auth', '@angular/common', 'ng-zorro-antd', '@ant-design/icons-angular/icons', '@angular/common/locales/en', '@angular/animations', '@angular/router', 'rxjs', 'rxjs/operators', 'firebase/app', '@angular/forms', '@angular/common/http'], factory) : (global = global || self, factory(global['ngx-firebase-cms'] = {}, global.ng.core, global.ng.fire.firestore, global.ng.fire.storage, global.ng.fire.auth, global.ng.common, global['^7']['0']['0-rc']['3'], global.icons$1, global.ng.common.locales.en, global.ng.animations, global.ng.router, global.rxjs, global.rxjs.operators, global.app, global.ng.forms, global.ng.common.http)); }(this, function (exports, core, firestore, storage, auth, common, ngZorroAntd, icons$1, en, animations, router, rxjs, operators, app, forms, http) { 'use strict'; en = en && en.hasOwnProperty('default') ? en['default'] : en; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __values(o) { var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; if (m) return m.call(o); return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var DynamicBuilderComponent = /** @class */ (function () { function DynamicBuilderComponent() { } /** * @return {?} */ DynamicBuilderComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; DynamicBuilderComponent.decorators = [ { type: core.Component, args: [{ selector: 'aq-dynamic-builder', template: "<p>\n dynamic-builder works!\n</p>\n", styles: [""] }] } ]; /** @nocollapse */ DynamicBuilderComponent.ctorParameters = function () { return []; }; return DynamicBuilderComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var DynamicFormComponent = /** @class */ (function () { function DynamicFormComponent() { } /** * @return {?} */ DynamicFormComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; DynamicFormComponent.decorators = [ { type: core.Component, args: [{ selector: 'aq-dynamic-form', template: "<p>\n dynamic-form works!\n</p>\n", styles: [""] }] } ]; /** @nocollapse */ DynamicFormComponent.ctorParameters = function () { return []; }; return DynamicFormComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var AuthService = /** @class */ (function () { function AuthService(config, afAuth, message, router, afs) { var _this = this; this.config = config; this.afAuth = afAuth; this.message = message; this.router = router; this.afs = afs; this.user$ = this.afAuth.authState.pipe(operators.tap((/** * @param {?} res * @return {?} */ function (res) { if (res) { _this.uid = res["uid"]; _this.email = res["email"]; _this.emailVerified = res["emailVerified"]; _this.lastLogin = new Date(res["metadata"]["lastSignInTime"]); } })), operators.switchMap((/** * @param {?} user * @return {?} */ function (user) { if (user) { return _this.afs.doc("users/" + user.uid).valueChanges(); } else { return rxjs.of(null); } })), operators.tap((/** * @param {?} user * @return {?} */ function (user) { if (user) { _this.displayName = user["displayName"]; _this.profileURL = user["profileURL"]; _this.role = user["roles"]; } }))); } /** * @param {?} username * @param {?} password * @return {?} */ AuthService.prototype.login = /** * @param {?} username * @param {?} password * @return {?} */ function (username, password) { var _this = this; /** @type {?} */ var adminURL = this.config.adminURL || 'admin'; this.afAuth.auth.signInWithEmailAndPassword(username, password) .then((/** * @param {?} res * @return {?} */ function (res) { _this.router.navigate([adminURL + "/dashboard"]); })).catch((/** * @param {?} err * @return {?} */ function (err) { _this.message.error(err); })); }; /** * @param {?} username * @param {?} password * @return {?} */ AuthService.prototype.signup = /** * @param {?} username * @param {?} password * @return {?} */ function (username, password) { var _this = this; /** @type {?} */ var adminURL = this.config.adminURL || 'admin'; this.afAuth.auth.createUserWithEmailAndPassword(username, password).then((/** * @param {?} res * @return {?} */ function (res) { /** @type {?} */ var data = { uid: res['user']['uid'], email: res['user']['email'], displayName: res['user']['email'], emailVerified: false, createdTime: app.firestore.FieldValue.serverTimestamp(), updatedTime: app.firestore.FieldValue.serverTimestamp(), lastLoginTime: app.firestore.FieldValue.serverTimestamp(), roles: ["Contributor"] }; if (res['user']['uid']) { _this.afs.collection("users").doc(res['user']['uid']).set(data) .then((/** * @param {?} res * @return {?} */ function (res) { _this.router.navigate([adminURL + "/dashboard"]); })) .catch((/** * @param {?} err * @return {?} */ function (err) { _this.message.error(err); })); } })); }; /** * @return {?} */ AuthService.prototype.signOut = /** * @return {?} */ function () { return this.afAuth.auth.signOut(); }; /** * @private * @param {?} user * @return {?} */ AuthService.prototype.updateUserData = /** * @private * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var userRef = this.afs.doc("users/" + user.uid); /** @type {?} */ var data = { uid: user.uid, email: user.email, roles: ["Contributor"] }; return userRef.set(data, { merge: true }); }; ///// Role-based Authorization ////// ///// Role-based Authorization ////// /** * @param {?} user * @return {?} */ AuthService.prototype.canRead = ///// Role-based Authorization ////// /** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var allowed = ['Administrator', 'Editor', 'Author', 'Contributor']; return this.checkAuthorization(user, allowed); }; /** * @param {?} user * @return {?} */ AuthService.prototype.canEdit = /** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var allowed = ['Administrator', 'Editor']; return this.checkAuthorization(user, allowed); }; /** * @param {?} user * @return {?} */ AuthService.prototype.canDelete = /** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var allowed = ['Administrator']; return this.checkAuthorization(user, allowed); }; // determines if user has matching role // determines if user has matching role /** * @private * @param {?} user * @param {?} allowedRoles * @return {?} */ AuthService.prototype.checkAuthorization = // determines if user has matching role /** * @private * @param {?} user * @param {?} allowedRoles * @return {?} */ function (user, allowedRoles) { var e_1, _a; if (!user) return false; try { for (var allowedRoles_1 = __values(allowedRoles), allowedRoles_1_1 = allowedRoles_1.next(); !allowedRoles_1_1.done; allowedRoles_1_1 = allowedRoles_1.next()) { var role = allowedRoles_1_1.value; if (user.roles[role]) { return true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (allowedRoles_1_1 && !allowedRoles_1_1.done && (_a = allowedRoles_1.return)) _a.call(allowedRoles_1); } finally { if (e_1) throw e_1.error; } } return false; }; /** * @param {?} description * @return {?} */ AuthService.prototype.log = /** * @param {?} description * @return {?} */ function (description) { if (this.uid) { this.afs.collection('log').add({ "description": description, "uid": this.uid, "createdTime": app.firestore.FieldValue.serverTimestamp() }); } }; AuthService.decorators = [ { type: core.Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ AuthService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: core.Inject, args: ['env',] }] }, { type: auth.AngularFireAuth }, { type: ngZorroAntd.NzMessageService }, { type: router.Router }, { type: firestore.AngularFirestore } ]; }; /** @nocollapse */ AuthService.ngInjectableDef = core.defineInjectable({ factory: function AuthService_Factory() { return new AuthService(core.inject("env"), core.inject(auth.AngularFireAuth), core.inject(ngZorroAntd.NzMessageService), core.inject(router.Router), core.inject(firestore.AngularFirestore)); }, token: AuthService, providedIn: "root" }); return AuthService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var UnsubscriptionService = /** @class */ (function () { function UnsubscriptionService() { } /** * @param {?} component * @return {?} */ UnsubscriptionService.prototype.componentDestroyed = /** * @param {?} component * @return {?} */ function (component) { /** @type {?} */ var modifiedComponent = (/** @type {?} */ (component)); if (modifiedComponent.__componentDestroyed$) { return modifiedComponent.__componentDestroyed$; } /** @type {?} */ var oldNgOnDestroy = component.ngOnDestroy; /** @type {?} */ var stop$ = new rxjs.ReplaySubject(); modifiedComponent.ngOnDestroy = (/** * @return {?} */ function () { oldNgOnDestroy && oldNgOnDestroy.apply(component); stop$.next(true); stop$.complete(); }); return modifiedComponent.__componentDestroyed$ = stop$.asObservable(); }; /** * @template T * @param {?} component * @return {?} */ UnsubscriptionService.prototype.untilComponentDestroyed = /** * @template T * @param {?} component * @return {?} */ function (component) { var _this = this; return (/** * @param {?} source * @return {?} */ function (source) { return source.pipe(operators.takeUntil(_this.componentDestroyed(component))); }); }; UnsubscriptionService.decorators = [ { type: core.Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ UnsubscriptionService.ctorParameters = function () { return []; }; /** @nocollapse */ UnsubscriptionService.ngInjectableDef = core.defineInjectable({ factory: function UnsubscriptionService_Factory() { return new UnsubscriptionService(); }, token: UnsubscriptionService, providedIn: "root" }); return UnsubscriptionService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var DashboardComponent = /** @class */ (function () { function DashboardComponent(config, afs, unsubscription, modal, router, auth, message) { this.config = config; this.afs = afs; this.unsubscription = unsubscription; this.modal = modal; this.router = router; this.auth = auth; this.message = message; this.now = new Date(); this.brand = ""; this.brandURL = "#"; this.isCollapsed = false; this.isReverseArrow = false; this.width = 200; this.isLoginPage = false; this.brand = this.config.brand || "AppQuick.co"; this.brandURL = this.config.brandURL || "https://appquick.co"; } /** * @return {?} */ DashboardComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.auth.user$ .pipe(this.unsubscription.untilComponentDestroyed(this)) .subscribe((/** * @param {?} user * @return {?} */ function (user) { _this.user = user; }), (/** * @param {?} err * @return {?} */ function (err) { })); }; /** * @return {?} */ DashboardComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { }; /** * @return {?} */ DashboardComponent.prototype.logout = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var adminURL = this.config.adminURL || 'admin'; this.modal.confirm({ "nzTitle": '<i>Logout</i>', "nzIconType": "logout", "nzContent": "<b>Are you sure?</b>", "nzOnOk": (/** * @return {?} */ function () { return _this.auth.signOut().then((/** * @param {?} res * @return {?} */ function (res) { _this.router.navigate([adminURL + "/login"]); })); }) }); }; /** * @return {?} */ DashboardComponent.prototype.getProfilePic = /** * @return {?} */ function () { return (this.user.profileURL) ? { 'background-image': 'url(\'' + this.user.profileURL + '\')' } : {}; }; DashboardComponent.decorators = [ { type: core.Component, args: [{ selector: 'aq-dashboard', template: "<nz-layout>\n <nz-sider *ngIf=\"user\" [@enterAnimation] nzCollapsible [(nzCollapsed)]=\"isCollapsed\" [nzWidth]=\"width\" [nzReverseArrow]=\"isReverseArrow\">\n <div nz-tooltip=\"Dashboard\" routerLink=\"dashboard\" class=\"logo pointer\" [ngStyle]=\"getProfilePic()\" [ngClass]=\"{'open': !isCollapsed}\"></div>\n <ul nz-menu [nzTheme]=\"'dark'\" [nzMode]=\"'inline'\" [nzInlineCollapsed]=\"isCollapsed\">\n <li nz-submenu nzOpen=\"true\">\n <span title>\n <i nz-icon type=\"form\"></i>\n <span class=\"nav-text\">Content</span>\n </span>\n <ul>\n <li nz-menu-item routerLink=\"posts\">\n <span>\n <i nz-icon type=\"form\" theme=\"outline\"></i>\n <span class=\"nav-text\">Pages</span>\n </span>\n </li>\n <li nz-menu-item routerLink=\"files\">\n <span>\n <i nz-icon type=\"picture\" theme=\"outline\"></i>\n <span class=\"nav-text\">Media</span>\n </span>\n </li>\n <li nz-menu-item routerLink=\"forms\">\n <span>\n <i nz-icon type=\"hdd\" theme=\"outline\"></i>\n <span class=\"nav-text\">Form</span>\n </span>\n </li>\n <li nz-menu-item routerLink=\"emails\">\n <span>\n <i nz-icon type=\"mail\" theme=\"outline\"></i>\n <span class=\"nav-text\">Emails</span>\n </span>\n </li>\n <li nz-menu-item routerLink=\"users\">\n <span title>\n <i nz-icon type=\"team\" theme=\"outline\"></i>\n <span class=\"nav-text\">Users</span>\n </span>\n </li>\n </ul>\n </li>\n <li nz-submenu nzOpen=\"true\">\n <span title>\n <i nz-icon type=\"setting\"></i>\n <span class=\"nav-text\">Account</span>\n </span>\n <ul>\n <li nz-menu-item routerLink=\"profile\">\n <span>\n <i nz-icon type=\"team\" theme=\"outline\"></i>\n <span class=\"nav-text\">Profile</span>\n </span>\n </li>\n <li nz-menu-item (click)=\"logout()\">\n <span title>\n <i nz-icon type=\"unlock\" theme=\"outline\"></i>\n <span class=\"nav-text\">Sign Out</span>\n </span>\n </li>\n </ul>\n </li>\n </ul>\n </nz-sider>\n <nz-layout>\n <nz-content>\n <router-outlet></router-outlet>\n </nz-content>\n <nz-footer>\n <p class=\"text-center footer\">\n <a target=\"_blank\" href=\"{{ brandURL }}\">{{ brand }}</a> \u00A9 {{ now | date : 'yyyy'}}\n </p>\n </nz-footer>\n </nz-layout>\n</nz-layout>", animations: [ animations.trigger('enterAnimation', [ animations.transition(':enter', [ animations.style({ transform: 'translateX(-100%)', opacity: 0 }), animations.animate('500ms', animations.style({ transform: 'translateX(0)', opacity: 1 })) ]), animations.transition(':leave', [ animations.style({ transform: 'translateX(0)', opacity: 1 }), animations.animate('500ms', animations.style({ transform: 'translateX(-100%)', opacity: 0 })) ]) ]) ], encapsulation: core.ViewEncapsulation.None, styles: ["dl,ol,p,pre,ul{margin-top:0}address,dl,ol,p,pre,ul{margin-bottom:1em}button,hr,input{overflow:visible}pre,textarea{overflow:auto}article,aside,dialog,figcaption,figure,footer,header,hgroup,legend,main,nav,section{display:block}dd,h1,h2,h3,h4,h5,h6,legend{margin-bottom:.5em}address,legend{line-height:inherit}progress,sub,sup{vertical-align:baseline}[ant-click-animating-without-extra-node=true],[ant-click-animating=true],sub,sup{position:relative}.ant-btn,[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}.ant-fullcalendar table,table{border-collapse:collapse}.ant-calendar-range .ant-calendar-date-panel::after,.ant-card-actions::after,.ant-card-body::after,.ant-card-head .ant-tabs,.ant-card-head::after,.ant-card-meta::after,.ant-carousel .slick-track::after,.ant-divider-horizontal,.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title,.ant-form-explain,.ant-form-extra,.ant-form-item-control::after,.ant-menu-horizontal::after,.ant-menu::after,.ant-modal-confirm-body-wrapper::after,.ant-pagination::after,.ant-row::after,.ant-select-selection--multiple::after,.ant-spin-blur,.ant-table,.ant-table-wrapper::after,.ant-tabs-nav-container::after,.ant-tabs-nav::after,.ant-tabs::after,.ant-time-picker-panel-combobox::after,.ant-upload-list::after,.clearfix::after{clear:both}.ant-carousel .slick-loading .slick-slide,.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slider,.cdk-overlay-backdrop,html{-webkit-tap-highlight-color:transparent}body,html{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar}@-ms-viewport{width:device-width}body{margin:0;color:rgba(0,0,0,.65);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-variant:tabular-nums;line-height:1.5;background-color:#fff;-webkit-font-feature-settings:'tnum';font-feature-settings:'tnum'}[tabindex='-1']:focus{outline:0!important}hr{box-sizing:content-box;height:0}h1,h2,h3,h4,h5,h6{margin-top:0;color:rgba(0,0,0,.85);font-weight:500}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;border-bottom:0;cursor:help}address{font-style:normal}input[type=number],input[type=password],input[type=text],textarea{-webkit-appearance:none}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-left:0}blockquote,figure{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0}sub{bottom:-.25em}sup{top:-.5em}a{color:#1890ff;text-decoration:none;background-color:transparent;outline:0;cursor:pointer;transition:color .3s;-webkit-text-decoration-skip:objects}a:focus{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}a:hover{color:#40a9ff}a:active{color:#096dd9}a:active,a:hover{text-decoration:none;outline:0}a[disabled]{color:rgba(0,0,0,.25);cursor:not-allowed;pointer-events:none}code,kbd,pre,samp{font-size:1em;font-family:SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}caption{padding-top:.75em;padding-bottom:.3em;color:rgba(0,0,0,.45);text-align:left;caption-side:bottom}th{text-align:inherit}.ant-avatar,.ant-badge-count,.ant-btn,.anticon{text-align:center}button,input,optgroup,select,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{width:100%;max-width:100%;padding:0;color:inherit;font-size:1.5em;white-space:normal}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}.ant-alert,.ant-anchor,.ant-select-auto-complete{box-sizing:border-box;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:'tnum';font-feature-settings:'tnum'}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow,.ant-input-number-handler-down-inner,.ant-input-number-handler-up-inner,.anticon{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;text-transform:none}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}::-moz-selection{color:#fff;background:#1890ff}::selection{color:#fff;background:#1890ff}.clearfix{zoom:1}.clearfix::after,.clearfix::before{content:'';display:table}.anticon,.anticon svg{display:inline-block}.anticon{line-height:0;vertical-align:-.125em}.anticon>*{line-height:1}.anticon::before{display:none}.anticon .anticon-icon{display:block}.anticon[tabindex]{cursor:pointer}.anticon-spin,.anticon-spin::before{display:inline-block;-webkit-animation:1s linear infinite loadingCircle;animation:1s linear infinite loadingCircle}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-appear.fade-appear-active,.fade-enter.fade-enter-active{-webkit-animation-name:antFadeIn;animation-name:antFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.fade-leave.fade-leave-active{-webkit-animation-name:antFadeOut;animation-name:antFadeOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.fade-appear,.fade-enter{opacity:0}@-webkit-keyframes antFadeIn{0%{opacity:0}100%{opacity:1}}@keyframes antFadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes antFadeOut{0%{opacity:1}100%{opacity:0}}@keyframes antFadeOut{0%{opacity:1}100%{opacity:0}}.move-up-appear,.move-up-enter,.move-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-appear.move-up-appear-active,.move-up-enter.move-up-enter-active{-webkit-animation-name:antMoveUpIn;animation-name:antMoveUpIn;-webkit-animation-play-state:running;animation-play-state:running}.move-up-leave.move-up-leave-active{-webkit-animation-name:antMoveUpOut;animation-name:antMoveUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-up-appear,.move-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-up-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-down-appear,.move-down-enter,.move-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-appear.move-down-appear-active,.move-down-enter.move-down-enter-active{-webkit-animation-name:antMoveDownIn;animation-name:antMoveDownIn;-webkit-animation-play-state:running;animation-play-state:running}.move-down-leave.move-down-leave-active{-webkit-animation-name:antMoveDownOut;animation-name:antMoveDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-down-appear,.move-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-down-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-left-appear,.move-left-enter,.move-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-appear.move-left-appear-active,.move-left-enter.move-left-enter-active{-webkit-animation-name:antMoveLeftIn;animation-name:antMoveLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.move-left-leave.move-left-leave-active{-webkit-animation-name:antMoveLeftOut;animation-name:antMoveLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-left-appear,.move-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-left-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-right-appear,.move-right-enter,.move-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-appear.move-right-appear-active,.move-right-enter.move-right-enter-active{-webkit-animation-name:antMoveRightIn;animation-name:antMoveRightIn;-webkit-animation-play-state:running;animation-play-state:running}.move-right-leave.move-right-leave-active{-webkit-animation-name:antMoveRightOut;animation-name:antMoveRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-right-appear,.move-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-right-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@-webkit-keyframes antMoveDownIn{0%{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveDownIn{0%{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveDownOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveDownOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antMoveLeftIn{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveLeftIn{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveLeftOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveLeftOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antMoveRightIn{0%{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveRightIn{0%{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveRightOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveRightOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antMoveUpIn{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveUpIn{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveUpOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveUpOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes loadingCircle{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loadingCircle{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ant-click-animating-node,[ant-click-animating-without-extra-node=true]::after{position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;display:block;border:0 solid #1890ff;border-radius:inherit;opacity:.2;-webkit-animation:2s cubic-bezier(.08,.82,.17,1) fadeEffect,.4s cubic-bezier(.08,.82,.17,1) waveEffect;animation:2s cubic-bezier(.08,.82,.17,1) fadeEffect,.4s cubic-bezier(.08,.82,.17,1) waveEffect;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;pointer-events:none;content:''}@-webkit-keyframes waveEffect{100%{top:-6px;right:-6px;bottom:-6px;left:-6px;border-width:6px}}@keyframes waveEffect{100%{top:-6px;right:-6px;bottom:-6px;left:-6px;border-width:6px}}.ant-alert-close-icon,.ant-alert-close-text{right:16px;position:absolute}@-webkit-keyframes fadeEffect{100%{opacity:0}}@keyframes fadeEffect{100%{opacity:0}}.slide-up-appear,.slide-up-enter,.slide-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-appear.slide-up-appear-active,.slide-up-enter.slide-up-enter-active{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-leave.slide-up-leave-active{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-up-appear,.slide-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-up-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-down-appear,.slide-down-enter,.slide-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-appear.slide-down-appear-active,.slide-down-enter.slide-down-enter-active{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-leave.slide-down-leave-active{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-down-appear,.slide-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-down-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-left-appear,.slide-left-enter,.slide-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-appear.slide-left-appear-active,.slide-left-enter.slide-left-enter-active{-webkit-animation-name:antSlideLeftIn;animation-name:antSlideLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-leave.slide-left-leave-active{-webkit-animation-name:antSlideLeftOut;animation-name:antSlideLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-left-appear,.slide-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-left-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-right-appear,.slide-right-enter,.slide-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-appear.slide-right-appear-active,.slide-right-enter.slide-right-enter-active{-webkit-animation-name:antSlideRightIn;animation-name:antSlideRightIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-leave.slide-right-leave-active{-webkit-animation-name:antSlideRightOut;animation-name:antSlideRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-right-appear,.slide-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-right-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@-webkit-keyframes antSlideUpIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antSlideUpIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antSlideUpOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antSlideUpOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antSlideDownIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}100%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}}@keyframes antSlideDownIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}100%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}}@-webkit-keyframes antSlideDownOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}100%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}}@keyframes antSlideDownOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}100%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}}@-webkit-keyframes antSlideLeftIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antSlideLeftIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antSlideLeftOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antSlideLeftOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}100%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antSlideRightIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}}@keyframes antSlideRightIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}}@-webkit-keyframes antSlideRightOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}100%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}}@keyframes antSlideRightOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}100%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}}.swing-appear,.swing-enter{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.swing-appear.swing-appear-active,.swing-enter.swing-enter-active{-webkit-animation-name:antSwingIn;animation-name:antSwingIn;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes antSwingIn{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}@keyframes antSwingIn{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}.zoom-appear,.zoom-enter,.zoom-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-appear.zoom-appear-active,.zoom-enter.zoom-enter-active{-webkit-animation-name:antZoomIn;animation-name:antZoomIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-leave.zoom-leave-active{-webkit-animation-name:antZoomOut;animation-name:antZoomOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-appear,.zoom-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-appear,.zoom-big-enter,.zoom-big-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-appear.zoom-big-appear-active,.zoom-big-enter.zoom-big-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-leave.zoom-big-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-big-appear,.zoom-big-enter{-