diff --git a/cmd b/cmd index 5d9dffbb7..d75d8d4a9 100755 --- a/cmd +++ b/cmd @@ -144,6 +144,7 @@ if [ $# -gt 0 ];then check_node $COMPOSE exec php /bin/bash -c "php bin/run --mode=prod" supervisorctl_restart php + rm -rf "./public/js/build" npm run prod elif [[ "$1" == "super" ]]; then shift 1 diff --git a/docker/php/php.conf b/docker/php/php.conf index b72399d42..74f52c2d1 100644 --- a/docker/php/php.conf +++ b/docker/php/php.conf @@ -2,10 +2,10 @@ directory=/var/www # 生产环境 -#command=php bin/laravels start -i +command=php bin/laravels start -i # 开发环境 -command=./bin/inotify ./app +#command=./bin/inotify ./app numprocs=1 autostart=true diff --git a/package.json b/package.json index 121ff91d8..2b7b290b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "DooTask", - "version": "0.2.28", + "version": "0.2.31", "description": "DooTask is task management system.", "scripts": { "dev": "npm run development", diff --git a/public/.gitignore b/public/.gitignore deleted file mode 100644 index 9fcc0324a..000000000 --- a/public/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -* -!.gitignore -!favicon.ico -!index.php diff --git a/public/audio/call.mp3 b/public/audio/call.mp3 new file mode 100755 index 000000000..7156f0e85 Binary files /dev/null and b/public/audio/call.mp3 differ diff --git a/public/audio/call.wav b/public/audio/call.wav new file mode 100644 index 000000000..a3e89ece6 Binary files /dev/null and b/public/audio/call.wav differ diff --git a/public/audio/message.mp3 b/public/audio/message.mp3 new file mode 100755 index 000000000..99f2833a3 Binary files /dev/null and b/public/audio/message.mp3 differ diff --git a/public/audio/message.wav b/public/audio/message.wav new file mode 100644 index 000000000..b098f3c7d Binary files /dev/null and b/public/audio/message.wav differ diff --git a/public/css/app.css b/public/css/app.css new file mode 100644 index 000000000..544d41031 --- /dev/null +++ b/public/css/app.css @@ -0,0 +1,2 @@ +.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:opacity 200ms linear}.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:opacity 200ms linear}.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all 0.3s cubic-bezier(0.55, 0, 0.1, 1)}.el-fade-in-enter,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all 0.3s cubic-bezier(0.55, 0, 0.1, 1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transition:transform 300ms cubic-bezier(0.23, 1, 0.32, 1),opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transition:transform 300ms cubic-bezier(0.23, 1, 0.32, 1),opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1, 1);transition:transform 300ms cubic-bezier(0.23, 1, 0.32, 1),opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;transform:scale(0.45, 0.45)}.collapse-transition{transition:0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out}.horizontal-collapse-transition{transition:0.3s width ease-in-out, 0.3s padding-left ease-in-out, 0.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;transform:translateY(-30px)}.el-opacity-transition{transition:opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1)}.el-avatar{display:inline-block;box-sizing:border-box;text-align:center;overflow:hidden;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}.el-tooltip:focus:not(.focusing),.el-tooltip:focus:hover{outline-width:0}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:14px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-tooltip__popper[x-placement^="top"]{margin-bottom:12px}.el-tooltip__popper[x-placement^="top"] .popper__arrow{bottom:-6px;border-top-color:#585E6A;border-bottom-width:0}.el-tooltip__popper[x-placement^="top"] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#585E6A;border-bottom-width:0}.el-tooltip__popper[x-placement^="bottom"]{margin-top:12px}.el-tooltip__popper[x-placement^="bottom"] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#585E6A}.el-tooltip__popper[x-placement^="bottom"] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#585E6A}.el-tooltip__popper[x-placement^="right"]{margin-left:12px}.el-tooltip__popper[x-placement^="right"] .popper__arrow{left:-6px;border-right-color:#585E6A;border-left-width:0}.el-tooltip__popper[x-placement^="right"] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#585E6A;border-left-width:0}.el-tooltip__popper[x-placement^="left"]{margin-right:12px}.el-tooltip__popper[x-placement^="left"] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#585E6A}.el-tooltip__popper[x-placement^="left"] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#585E6A}.el-tooltip__popper.is-dark{background:#585E6A;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #585E6A}.el-tooltip__popper.is-light[x-placement^="top"] .popper__arrow{border-top-color:#585E6A}.el-tooltip__popper.is-light[x-placement^="top"] .popper__arrow::after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^="bottom"] .popper__arrow{border-bottom-color:#585E6A}.el-tooltip__popper.is-light[x-placement^="bottom"] .popper__arrow::after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^="left"] .popper__arrow{border-left-color:#585E6A}.el-tooltip__popper.is-light[x-placement^="left"] .popper__arrow::after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^="right"] .popper__arrow{border-right-color:#585E6A}.el-tooltip__popper.is-light[x-placement^="right"] .popper__arrow::after{border-right-color:#fff}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;filter:drop-shadow(0 2px 12px rgba(0,0,0,0.03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^="top"]{margin-bottom:12px}.el-popper[x-placement^="top"] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^="top"] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^="bottom"]{margin-top:12px}.el-popper[x-placement^="bottom"] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^="bottom"] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^="right"]{margin-left:12px}.el-popper[x-placement^="right"] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^="right"] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^="left"]{margin-right:12px}.el-popper[x-placement^="left"] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^="left"] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-popover{position:absolute;background:#fff;min-width:150px;border-radius:4px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,0.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover__reference:focus:not(.focusing),.el-popover__reference:focus:hover{outline-width:0}.el-popover:focus:active,.el-popover:focus{outline-width:0}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #DCDFE6;border-color:#DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:none;margin:0;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button.is-round{padding:12px 20px}.el-button:hover,.el-button:focus{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:none}.el-button::-moz-focus-inner{border:0}.el-button [class*="el-icon-"]+span{margin-left:5px}.el-button.is-plain:hover,.el-button.is-plain:focus{background:#fff;border-color:#409EFF;color:#409EFF}.el-button.is-plain:active{background:#fff;border-color:#3a8ee6;color:#3a8ee6;outline:none}.el-button.is-active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-disabled,.el-button.is-disabled:hover,.el-button.is-disabled:focus{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:hover,.el-button.is-disabled.is-plain:focus{background-color:#fff;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,0.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409EFF;border-color:#409EFF}.el-button--primary:hover,.el-button--primary:focus{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:none}.el-button--primary.is-active{background:#3a8ee6;border-color:#3a8ee6;color:#fff}.el-button--primary.is-disabled,.el-button--primary.is-disabled:hover,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:active{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:hover,.el-button--primary.is-plain:focus{background:#409EFF;border-color:#409EFF;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:none}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:active{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67C23A;border-color:#67C23A}.el-button--success:hover,.el-button--success:focus{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:none}.el-button--success.is-active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success.is-disabled,.el-button--success.is-disabled:hover,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:active{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:hover,.el-button--success.is-plain:focus{background:#67C23A;border-color:#67C23A;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:none}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:active{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:hover,.el-button--warning:focus{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:none}.el-button--warning.is-active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning.is-disabled,.el-button--warning.is-disabled:hover,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:active{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:hover,.el-button--warning.is-plain:focus{background:#E6A23C;border-color:#E6A23C;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:none}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:active{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:hover,.el-button--danger:focus{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:none}.el-button--danger.is-active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger.is-disabled,.el-button--danger.is-disabled:hover,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:active{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:hover,.el-button--danger.is-plain:focus{background:#F56C6C;border-color:#F56C6C;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:none}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:active{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:hover,.el-button--info:focus{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff;outline:none}.el-button--info.is-active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info.is-disabled,.el-button--info.is-disabled:hover,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:active{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:hover,.el-button--info.is-plain:focus{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:none}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:active{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{border-color:transparent;color:#409EFF;background:transparent;padding-left:0;padding-right:0}.el-button--text:hover,.el-button--text:focus{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:hover,.el-button--text.is-disabled:focus{border-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::before,.el-button-group::after{display:table;content:""}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button:hover,.el-button-group>.el-button:focus,.el-button-group>.el-button:active{z-index:1}.el-button-group>.el-button.is-active{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:rgba(255,255,255,0.5)}.el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,0.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,0.5);border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,0.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,0.5);border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,0.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,0.5);border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,0.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,0.5);border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,0.5)}.el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,0.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,0.5);border-right-color:rgba(255,255,255,0.5)}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;filter:drop-shadow(0 2px 12px rgba(0,0,0,0.03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^="top"]{margin-bottom:12px}.el-popper[x-placement^="top"] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^="top"] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^="bottom"]{margin-top:12px}.el-popper[x-placement^="bottom"] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^="bottom"] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^="right"]{margin-left:12px}.el-popper[x-placement^="right"] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^="right"] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^="left"]{margin-right:12px}.el-popper[x-placement^="left"] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^="left"] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,0.5)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,0.5)}.el-dropdown .el-dropdown__caret-button:hover::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing){outline-width:0}.el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #EBEEF5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,0.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:none}.el-dropdown-menu__item:not(.is-disabled):hover,.el-dropdown-menu__item:focus{background-color:#f4f5f7;color:#606266}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #EBEEF5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#fff}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-dropdown-menu__item{min-width:100px;line-height:34px}.el-dropdown-menu__item .item.red{color:#f00}.el-dropdown-menu__item .item.red>i{color:#f00}.el-dropdown-menu__item .item:hover.red>i{color:#f00}.el-dropdown-menu__item--divided:before{height:5px}.el-tooltip__popper.is-light[x-placement^="bottom"]{border-width:0;box-shadow:0 1px 6px rgba(0,0,0,0.2)}.el-tooltip__popper.is-light[x-placement^="bottom"] .popper__arrow{border-bottom-color:rgba(217,217,217,0.5)}@font-face{font-family:zenicon;src:url(../css/fonts/zenicon.woff2) format("woff2")}.ft.icon{font-family:zenicon, serif;line-height:1;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;text-rendering:auto;transform:scale(1.2);transform-origin:50% 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:none;direction:ltr;-webkit-font-feature-settings:"liga";padding-left:1px}.ft+.el-el-button,.ft+.ft,.ft+.z-confirm,.ft+.z-execute,.ft+.z-link,.ft+a{margin-left:.6rem}.ft.l12{margin-left:12px}.ft.r12{margin-right:12px}.ft.hover{cursor:pointer}.ft.hover:hover{color:#0285d7}.ft.dark{color:#0d0d0d}.ft.gray{color:#666}.ft.yellow{color:#f90}.ft.red{color:#ed3f14}.ft.green{color:#19be6b}.ft.blue{color:#2d8cf0}.ft.center{text-align:center}.ft.right{text-align:right}.ft.bold{font-weight:700}.ft.underline{text-decoration:underline}.ft.through{text-decoration:line-through}.ft.italic{font-style:italic}.ft.cursor{cursor:pointer}.ft.h1{font-size:1.3rem}.ft.h2{font-size:1.2rem}.ft.h3{font-size:1.1rem}.ft.h4{font-size:.9rem}.ft.h5{font-size:.8rem}@font-face{font-family:'iconfont';src:url("//at.alicdn.com/t/font_2583385_0n9xtibhf9vq.woff2?t=1625032849662") format("woff2"),url("//at.alicdn.com/t/font_2583385_0n9xtibhf9vq.woff?t=1625032849662") format("woff"),url("//at.alicdn.com/t/font_2583385_0n9xtibhf9vq.ttf?t=1625032849662") format("truetype")}.iconfont{font-family:"iconfont", "serif" !important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0.2px;-moz-osx-font-smoothing:grayscale}.app-view-loading{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999;background-color:rgba(255,255,255,0.7);display:flex;align-items:center;justify-content:center}.app-view-loading>div{text-align:center}.app-view-loading>div>div{color:#ccc;margin:0;font:11px verdana;line-height:16px;text-transform:uppercase;letter-spacing:1px}.app-view-loading>div>span{display:inline-block;vertical-align:middle;width:8px;height:8px;margin:2px;background:#007DB6;border-radius:8px;animation:app-view-loadanim 1s infinite alternate}.app-view-loading>div>span:nth-of-type(2){background:#008FB2;animation-delay:0.2s}.app-view-loading>div>span:nth-of-type(3){background:#009B9E;animation-delay:0.4s}.app-view-loading>div>span:nth-of-type(4){background:#00A77D;animation-delay:0.6s}.app-view-loading>div>span:nth-of-type(5){background:#00B247;animation-delay:0.8s}.app-view-loading>div>span:nth-of-type(6){background:#5AB027;animation-delay:1.0s}.app-view-loading>div>span:nth-of-type(7){background:#A0B61E;animation-delay:1.2s}@keyframes app-view-loadanim{0%{opacity:0}100%{opacity:1}}.overlay-y{overflow-y:overlay !important}.overlay-y::-webkit-scrollbar{width:10px;height:10px}.overlay-y::-webkit-scrollbar-thumb{border-radius:10px;background:rgba(0,0,0,0)}.overlay-y::-webkit-scrollbar-thumb:active{border-radius:10px;background:rgba(0,0,0,0.5)}.overlay-y:hover::-webkit-scrollbar-thumb{border:2px solid transparent;background:rgba(0,0,0,0.2);background-clip:content-box}.overlay-y:hover::-webkit-scrollbar-thumb:hover{border-top-width:0;border-bottom-width:0}.overlay-y::-webkit-scrollbar-track{border-radius:10px;background:rgba(0,0,0,0)}.common-auto-tip{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.common-circle{border-radius:50%}.common-circle .common-circle-path{fill:transparent}.common-circle .common-circle-g-path-ring{stroke:#8bcf70}.common-circle .common-circle-g-path-core{fill:#8bcf70;transform:scale(0.56);transform-origin:50%}.img-upload-modal .ivu-modal-mask{z-index:1001}.img-upload-modal .ivu-modal-no-mask{background-color:rgba(55,55,55,0.2)}.img-upload-modal .ivu-modal-wrap{z-index:1001}.imgcomp-upload-list{display:inline-block;width:60px;height:60px;text-align:center;line-height:60px;border:1px solid transparent;border-radius:4px;overflow:hidden;background:#fff;position:relative;box-shadow:0 1px 1px rgba(0,0,0,0.2);margin-right:4px;vertical-align:top}.imgcomp-upload-list .imgcomp-upload-img{position:absolute;top:0;left:0;width:100%;height:100%;background-position:center;background-size:cover}.imgcomp-upload-list .imgcomp-upload-list-cover{display:none;position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,0.6)}.imgcomp-upload-list .imgcomp-upload-list-cover i{color:#fff;font-size:24px;cursor:pointer;vertical-align:middle;margin:0;transition:all .2s}.imgcomp-upload-list .imgcomp-upload-list-cover i:hover{font-size:28px}.imgcomp-upload-list .ivu-progress{height:100%}.imgcomp-upload-list .ivu-progress .ivu-progress-outer{background-color:rgba(0,0,0,0.68);height:100%}.imgcomp-upload-list .ivu-progress .ivu-progress-outer .ivu-progress-inner{width:88%;margin:0 auto}.imgcomp-upload-list:hover .imgcomp-upload-list-cover{display:block}.img-upload-foot{display:flex;align-items:center;justify-content:flex-end}.img-upload-foot .img-upload-foot-input{flex:1;text-align:left;display:flex;align-items:center;justify-content:flex-end}.img-upload-foot .img-upload-foot-input .img-upload-foot-httptitle{cursor:pointer;padding-left:3px;margin-right:22px}.add-box{width:60px;height:60px;line-height:60px;display:inline-block;background:#fff;border:1px dashed #dddee1;border-radius:4px;text-align:center;position:relative;overflow:hidden;vertical-align:top}.add-box .add-box-icon i{vertical-align:middle;padding-bottom:2px}.add-box .add-box-upload{display:none;position:absolute;top:0;left:0;height:100%;width:100%;color:#ffffff;padding-top:9px;background:rgba(0,0,0,0.6)}.add-box .add-box-upload .add-box-item{height:22px;line-height:22px;cursor:pointer}.add-box .add-box-upload .add-box-item .ivu-upload-drag,.add-box .add-box-upload .add-box-item .ivu-upload-drag:hover{background:transparent;border:0;border-radius:0}.add-box .add-box-upload .add-box-item span{transition:all .2s;font-size:12px}.add-box .add-box-upload .add-box-item:hover span{font-size:14px}.add-box em{font-style:normal}.add-box:hover{border-color:rgba(0,0,0,0.6)}.add-box:hover .add-box-upload{display:block}.callback-add-box{display:block;width:auto;height:25px;line-height:25px;border:0;background:transparent}.callback-add-box .add-box-icon{display:none}.callback-add-box .add-box-upload{display:block;width:auto;background:transparent;color:#333;padding:0}.callback-add-box .add-box-upload>div{display:inline-block;padding-right:10px}.browse-load{margin:20px;text-align:center}.browse-list{max-height:540px;overflow:auto}.browse-list .browse-item{margin:10px 15px;display:inline-block;text-align:center;cursor:pointer;position:relative}.browse-list .browse-item .browse-img{width:64px;height:64px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKoAAABxCAAAAABg5GeyAAACW0lEQVR4Ae3XVRLjMBAE0L3/rSwKM3OcSNPyLVYOLvM6UD0Bd03LVe9XH+RlhlRSSSWVVFJJJZVUUkkllVRSSSWVVFJJJZVUUkl9WyqppJJKKqmkkgpURP17xngOAR5NxW5wlJ9MaLQh83F4NHWmd/gZtdVBaOldfDB1bq5UpJFbFOC6LKnYrkRO209PAw+hIuzWB8Ep5es8HvYo4z4tE1X8UeRwlMM2D5Bzkc7kj6Bi3VTKDDwEeUcrMxrUvGDXTnHa6kK69SDN9sgq1clxKSbNHqqnYmdri81Q9QHf1JPt1Frncaib2XbiTKL2GkHaurnY9LOulMV0O7G6Kw+g9sw2ohhm62KezVJaaufjWC1TnOkr1exilJ7Ji0vxCCqO9V4UwV4PYr9+apouhGYLKfnahdpqegjmeoXOpXgANe70pKT6Zhu19qkY2nC0PZS527lQOyInqr8Uvc5jqfUb1X+PGh5IhW90S2quh3FQC2XRcF66TUkTXPcLKm5FtdR9RJq+2hWII7UpFtmsQLEyzsdJtkxxpr6gLotbUSlV9yeT0Trmzk2XPdUThLYarUbWOY9j04xXQ2u+pMZLYSumGmNUH3HbM9qOAwSHodN2Pks25F2j3aI7+IxqNsB+YLWb16ukSjiW4xNB0gMoMfApBS/XZQgi3p9/5RsiKNKZEOwYFVIF5VyTyD19sbyjIJiNJRZxpNbx2S8sGKvGZNHJBniBu9Wy5WxjGuQFqIAcBHiRGyt4ua5gSCWVVFJJJZVUUkkllVRSSSWVVFJJJZVUUkkllVRSSSWVVFI/AgO0SXIVYHeGAAAAAElFTkSuQmCC);background-position:center;background-repeat:no-repeat;background-size:cover}.browse-list .browse-item .browse-title{display:block;width:64px;margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.browse-list .browse-item .browse-icon{position:absolute;top:0;left:0;width:100%;height:64px;font-size:36px;padding-top:15px;color:#ffffff;background-color:rgba(0,0,0,0.5)}.browse-list-disabled{position:relative}.browse-list-disabled:after{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.9);z-index:1}.common-loading{transform-origin:center center;width:30px;height:30px;max-width:100%;max-height:100%;margin:auto;overflow:hidden;animation:rotate 2s linear infinite}.common-loading .common-path{stroke-dasharray:1, 200;stroke-dashoffset:0;stroke-linecap:round;animation:dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite}@keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1, 200;stroke-dashoffset:0}50%{stroke-dasharray:89, 200;stroke-dashoffset:-35}to{stroke-dasharray:89, 200;stroke-dashoffset:-124}}@keyframes color{0%,to{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}.app-scroller-y{position:absolute;top:0;left:0;right:0;bottom:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.app-scroller-y .app-scroller-bottom{height:0;margin:0;padding:0}.app-scroller-y.static{position:static;flex:1}.common-spinner{display:none;position:fixed;z-index:9999;bottom:20px;right:20px;margin:0 auto;width:30px;height:30px}.common-spinner .common-circular{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%}.teditor-box .tox.tox-silver-sink,.teditor-transfer .tox.tox-silver-sink{z-index:13000}.teditor-box textarea{opacity:0}.teditor-box .tox-tinymce{box-shadow:none;box-sizing:border-box;border-color:#dddee1;border-radius:4px;overflow:hidden}.teditor-box .tox-tinymce .tox-statusbar span.tox-statusbar__branding a{display:none}.teditor-transfer{background-color:#ffffff}.teditor-transfer .tox-toolbar>div:last-child>button:last-child{margin-right:64px}.teditor-transfer .ivu-modal-header{display:none}.teditor-transfer .ivu-modal-close{top:7px;z-index:2}.teditor-transfer .teditor-transfer-body{position:absolute;top:0;left:0;width:100%;height:100%;padding:0;margin:0}.teditor-transfer .teditor-transfer-body textarea{opacity:0}.teditor-transfer .teditor-transfer-body .tox-tinymce{border:0}.teditor-transfer .teditor-transfer-body .tox-tinymce .tox-statusbar span.tox-statusbar__branding a{display:none}.teditor-loadstyle{width:100%;height:180px;overflow:hidden;position:relative}.teditor-loadedstyle{width:100%;max-height:inherit;overflow:inherit;position:relative}.upload-control{display:none;width:0;height:0;overflow:hidden}.tox-tinymce-inline{z-index:100000}.quick-edit{display:flex;align-items:center;max-width:100%}.quick-edit .quick-input{flex:1;position:relative}.quick-edit .quick-input .quick-loading{position:absolute;top:0;right:8px;bottom:0;display:flex;align-items:center}.quick-edit .quick-input .quick-loading .common-loading{margin:0;width:14px;height:14px}.quick-edit .quick-text{overflow:hidden;text-overflow:ellipsis;align-items:center;white-space:nowrap;height:20px;line-height:20px;margin-right:6px}.quick-edit .quick-icon{display:none;font-size:16px;cursor:pointer}.quick-edit:hover .quick-icon{display:inline-block}.common-tag-input{display:inline-block;width:100%;min-height:32px;padding:2px 7px;border:1px solid #dddee1;border-radius:4px;color:#495060;background:#fff;position:relative;cursor:text;vertical-align:middle;line-height:normal;-webkit-transition:border .2s ease-in-out, background .2s ease-in-out, -webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out, background .2s ease-in-out, -webkit-box-shadow .2s ease-in-out}.common-tag-input .tags-item,.common-tag-input .tags-input{position:relative;float:left;color:#495060;background-color:#f1f8ff;border-radius:3px;line-height:22px;margin:2px 6px 2px 0;padding:0 20px 0 6px}.common-tag-input .tags-item .tags-content,.common-tag-input .tags-input .tags-content{line-height:22px}.common-tag-input .tags-item .tags-del,.common-tag-input .tags-input .tags-del{width:20px;height:22px;text-align:center;cursor:pointer;position:absolute;top:-1px;right:0}.common-tag-input .tags-input{max-width:80%;padding:0;background-color:inherit;border:none;color:inherit;height:22px;line-height:22px;-webkit-appearance:none;outline:none;resize:none;overflow:hidden}.common-tag-input .tags-input::placeholder{color:#bbbbbb}.common-tag-input .tags-placeholder{position:absolute;left:0;top:0;z-index:-1;color:#ffffff00}.common-tag-input::after{content:"";display:block;height:0;clear:both}.common-avatar{position:relative}.common-avatar.avatar-wrapper{display:flex;align-items:center}.common-avatar.avatar-wrapper .avatar-box{position:relative;border-radius:50%;display:flex;align-items:center}.common-avatar.avatar-wrapper .avatar-box .avatar-text{background-color:#8bcf70}.common-avatar.avatar-wrapper .avatar-box .avatar-text>span{display:inline-block;font-size:15px;line-height:1}.common-avatar.avatar-wrapper .avatar-box>em{position:absolute;right:0;bottom:0;width:8px;height:8px;border-radius:50%;background-color:#ff0000;border:1px solid #ffffff;transform-origin:right bottom;z-index:1}.common-avatar.avatar-wrapper .avatar-box.online>em{background-color:#8bcf70}.common-avatar.avatar-wrapper .avatar-name{padding-left:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.common-avatar-transfer{padding:4px 2px;line-height:1.5}.common-avatar-transfer>p{padding:1px 2px}.common-avatar-transfer .avatar-icons{margin-top:12px;border-top:1px solid rgba(244,244,245,0.5);padding:8px 0 2px;display:flex;align-items:center}.common-avatar-transfer .avatar-icons>i{cursor:pointer;font-size:22px;margin-right:12px;color:#F4F4F5}.common-avatar-transfer .avatar-icons>i:last-child{margin-right:0}.common-avatar-transfer .avatar-icons>i:hover{color:#ffffff}.common-user{position:relative;white-space:normal}.common-user .common-user-loading{position:absolute;top:2px;bottom:0;right:10px;display:flex;align-items:center}.common-user .common-user-loading .common-loading{width:14px;height:14px}.common-user.hidden-input .ivu-select-selection{padding:0 4px}.common-user.hidden-input .ivu-select-selection .ivu-select-input{display:none}.common-user-transfer .user-input-option{display:flex;align-items:center}.common-user-transfer .user-input-option .user-input-avatar{display:flex;align-items:center}.common-user-transfer .user-input-option .user-input-avatar .avatar{width:26px;height:26px}.common-user-transfer .user-input-option .user-input-nickname{margin-left:10px;flex:1}.common-user-transfer .user-input-option .user-input-userid{margin-left:10px;font-size:12px;color:#cccccc;transition:margin 0.1s}.common-user-transfer .ivu-select-item.ivu-select-item-selected:after{top:8px}.common-user-transfer .ivu-select-item.ivu-select-item-selected .user-input-option .user-input-userid{margin-right:16px}.common-user-transfer .user-drop-prepend{text-align:center;color:#c5c8ce;line-height:20px;padding-bottom:5px;font-size:12px;border-bottom:1px solid #f1f1f1;margin-bottom:5px}body{overflow:hidden}body .ivu-input,body .ivu-select-selection{border-color:#e8e8e8}body .ivu-select-dropdown{max-height:360px}body .ivu-select-dropdown.select-node .ivu-select-item{display:flex;align-items:center;justify-content:space-between}body .ivu-select-dropdown.select-node .ivu-select-item .option-title{flex:1}body .ivu-select-dropdown.select-node .ivu-select-item .ivu-tag{margin-left:18px;margin-right:0;transform:scale(0.9);transform-origin:right center}body .ivu-tooltip-popper .ivu-tooltip-inner{white-space:normal}body .ivu-table table{width:100% !important}body .ivu-table table .ivu-table-cell{padding-left:12px;padding-right:12px}body .ivu-table table thead .ivu-table-cell{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}body .ivu-table table tbody .tree-icon-loading .ivu-table-cell{display:flex;align-items:center}body .ivu-table table tbody .tree-icon-loading .ivu-table-cell .ivu-table-cell-tree{margin-right:6px}body .ivu-table .td-ellipsis{display:flex;align-items:center;max-width:100%}body .ivu-table .td-ellipsis .remark-text{overflow:hidden;text-overflow:ellipsis;align-items:center;white-space:nowrap;height:20px;line-height:20px;margin-right:6px}body .ivu-table .td-ellipsis .remark-icon{display:none;font-size:16px;cursor:pointer}body .ivu-table .td-ellipsis .remark-tag{display:inline-block;height:22px;line-height:22px;margin:2px 4px 2px 0;border:1px solid #e8eaec;border-radius:3px;background:#f7f7f7;font-size:12px;vertical-align:middle;opacity:1;color:#515a6e;padding:0 4px;white-space:nowrap;overflow:visible}body .ivu-table .td-ellipsis .remark-tag.pointer-tag{cursor:pointer;color:#1890ff;background:#e6f7ff;border-color:#91d5ff}body .ivu-table .td-ellipsis .icon-tooltip .ivu-tooltip-rel{display:flex;align-items:center}body .ivu-table .td-action{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;vertical-align:middle}body .ivu-table .td-action .td-action-container{display:inline-block}body .ivu-table .td-action .td-action-container a{font-size:12px;padding:0 5px}body .ivu-table .ivu-table-row-hover:hover .td-ellipsis .remark-icon{display:inline-block}body .ivu-table:before{background-color:#efefef}body .ivu-modal-wrap{overflow:overlay}body .ivu-modal-wrap .ivu-modal{top:100px;padding-bottom:100px}@media (max-height: 900px){body .ivu-modal-wrap .ivu-modal{top:35px;padding-bottom:35px}}body .ivu-modal-wrap .ivu-modal.ivu-modal-fullscreen{top:0}body .ivu-modal-wrap .ivu-modal .ivu-modal-header,body .ivu-modal-wrap .ivu-modal .ivu-modal-footer{border-color:transparent}body .ivu-modal-wrap .ivu-modal .ivu-modal-header{padding:22px 24px 20px}body .ivu-modal-wrap .ivu-modal .ivu-modal-header .ivu-modal-header-inner{font-size:18px}body .ivu-modal-wrap .ivu-modal .ivu-modal-body{padding:16px 32px 2px}body .ivu-modal-wrap .ivu-modal .ivu-modal-footer{padding:20px 30px 22px}body .ivu-modal-wrap .ivu-modal .ivu-modal-footer .ivu-btn{height:34px;line-height:32px;min-width:94px}body .ivu-modal-wrap .ivu-modal .ivu-modal-content{border-radius:18px}body .ivu-modal-wrap .ivu-modal .ivu-modal-content .ivu-modal-close .ivu-icon-ios-close{font-size:38px;top:3px;right:2px;transition:all 0.2s}body .ivu-modal-wrap .ivu-modal .ivu-modal-content .ivu-modal-close:hover .ivu-icon-ios-close{transform:rotate(-90deg)}body .ivu-modal-wrap .ivu-modal-confirm{padding:6px 0 20px}body .ivu-modal-wrap .ivu-modal-confirm .ivu-modal-confirm-body>div{word-break:break-all}body .ivu-modal-wrap .form-network-add-tabs .ivu-tabs-tabpane{padding:10px 6px 0}body .ivu-modal-wrap .form-network-add-in-out{padding:0 6px}body .ivu-modal-wrap .form-network-add-in-out .select-in-type span.ivu-radio{display:none}body .ivu-modal-wrap .form-network-add-in-out .select-in-type .select-in-type-item-checked{color:#8bcf70;border:1px solid #8bcf70 !important}body .ivu-modal-wrap .form-network-add-in-out .select-in-type .select-in-type-item{display:flex;align-items:center;min-width:90px;border:1px solid #E8EBEE;border-radius:4px;padding:0 12px;margin:0 8px 0 0}body .ivu-modal-wrap .form-network-add-in-out .select-in-type .select-in-type-item>span{flex:1}body .ivu-modal-wrap .form-network-add-in-out .select-in-type .select-in-type-item:hover{cursor:pointer}body .ivu-modal-wrap .form-network-add-in-out .select-in-type .select-in-type-item .select-in-type-icon{margin-left:12px}body .ivu-modal-wrap .form-network-add-in-out .select-in-node{margin-top:18px}body .ivu-progress{display:flex;align-items:center}body .ivu-progress .ivu-progress-outer{display:flex;align-items:center}body .ivu-progress.ivu-progress-show-info .ivu-progress-outer{margin:0;padding:0}body .ivu-progress.ivu-progress-show-info .ivu-progress-text{flex-shrink:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}body .ivu-drawer-right .ivu-drawer-content{border-radius:18px 0 0 18px}body .ivu-drawer-right .ivu-drawer-content .ivu-drawer-header{padding-top:16px;padding-bottom:6px;border-bottom:1px solid transparent}body .ivu-drawer-right .ivu-drawer-content .ivu-drawer-header .ivu-drawer-header-inner{font-size:18px;padding:0 4px;height:32px;line-height:32px}body .ivu-drawer-right .ivu-drawer-content .ivu-drawer-body{padding:10px 20px}body .ivu-drawer-bottom .ivu-drawer-content{border-radius:18px 18px 0 0}body .ivu-drawer-bottom .ivu-drawer-content .ivu-drawer-close{top:-40px}body .ivu-drawer-bottom .ivu-drawer-content .ivu-drawer-close .ivu-icon{font-size:40px;color:#ffffff}*[hidden="hidden"]{display:none !important}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}.page-box{text-align:center;padding:20px 0}.search-box{margin-bottom:24px}.search-box>ul{display:flex;align-items:flex-end}.search-box>ul>li{flex:1;flex-shrink:0;margin-right:12px;list-style:none;display:flex;flex-direction:column}.search-box>ul>li:last-child{margin-right:0}.search-box>ul>li .search-label{font-weight:600}.search-box>ul>li .search-content{margin-top:6px}.search-box>ul>li.search-button{flex:none}.search-box.auto{display:flex}.search-box.auto>ul>li:not(.search-button){min-width:180px}.icon-loading{animation:icon-loading-load 0.6s infinite linear}@keyframes icon-loading-load{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.page-calendar .calendar-head{display:flex;align-items:flex-start;margin:32px 32px 16px;border-bottom:1px solid #F4F4F5}.page-calendar .calendar-head .calendar-titbox{flex:1;display:flex;align-items:center;margin-bottom:16px}.page-calendar .calendar-head .calendar-titbox .calendar-title{display:flex;align-items:center;margin-right:36px}.page-calendar .calendar-head .calendar-titbox .calendar-title>h1{color:#333333;font-size:28px;font-weight:600}.page-calendar .calendar-head .calendar-titbox .calendar-arrow{margin-right:12px}.page-calendar .calendar-head .calendar-titbox .calendar-arrow>button{color:#888888;font-size:12px}.page-calendar .calendar-head .calendar-titbox .calendar-arrow>button:focus{box-shadow:none}.page-calendar .calendar-head .calendar-titbox .calendar-view{flex:1;display:flex;justify-content:flex-end}.page-calendar .calendar-head .calendar-titbox .calendar-view>button:focus{box-shadow:none}.page-calendar .calendar-box{padding:0 48px}.page-calendar .calendar-box .calendar-wrapper{flex:1;position:relative}.page-calendar .calendar-box .calendar-wrapper:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background-color:#ffffff;z-index:1}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup{box-shadow:none}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup .tui-full-calendar-popup-container{border:0;box-shadow:0 1px 6px rgba(0,0,0,0.2);border-radius:6px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup .tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-border{top:-8px;border-bottom-color:rgba(217,217,217,0.5)}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-icon.tui-full-calendar-ic-title,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-icon.tui-full-calendar-calendar-dot{display:none}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-icon.tui-full-calendar-ic-date{background-image:url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjIzODU5NjcwNjA3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2Mzg4IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTk2MCAxMjhIODMzYzAtNTMtNDMtOTYtOTYtOTZoLTE2Yy01MyAwLTk2IDQzLTk2IDk2SDQwMGMwLTI2LjUtMTAuNy01MC41LTI4LjEtNjcuOUMzNTQuNSA0Mi43IDMzMC41IDMyIDMwNCAzMmgtMTZjLTUzIDAtOTYgNDMtOTYgOTZINjRjLTM1LjMgMC02NCAyOC42LTY0IDY0djczNmMwIDM1LjMgMjguNyA2NCA2NCA2NGg4OTZjMzUuMyAwIDY0LTI4LjcgNjQtNjRWMTkyYzAtMzUuNC0yOC43LTY0LTY0LTY0eiBtLTI3MSA4YzAtMjIuMSAxNy45LTQwIDQwLTQwczQwIDE3LjkgNDAgNDB2ODBjMCAyMi4xLTE3LjkgNDAtNDAgNDAtMTEgMC0yMS00LjUtMjguMy0xMS43QzY5My41IDIzNyA2ODkgMjI3IDY4OSAyMTZ2LTgweiBtLTQzMyAwYzAtMjIuMSAxNy45LTQwIDQwLTQwczQwIDE3LjkgNDAgNDB2ODBjMCAyMi4xLTE3LjkgNDAtNDAgNDAtMTEgMC0yMS00LjUtMjguMy0xMS43QzI2MC41IDIzNyAyNTYgMjI3IDI1NiAyMTZ2LTgweiBtNzA0IDc2MGMwIDE3LjctMTQuMyAzMi0zMiAzMkg5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJWNDQ4aDg5NnY0NDh6IiBwLWlkPSIxNjM4OSIgZmlsbD0iIzUxNTE1MSI+PC9wYXRoPjwvc3ZnPg==");background-size:contain}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-content{padding-left:0}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-popup-section{display:flex;justify-content:space-between;margin-bottom:10px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-popup-section .tui-full-calendar-popup-section-item{height:36px;border-color:#e8e8e8;border-radius:4px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-popup-section .tui-full-calendar-popup-section-item input{height:34px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-title{width:100%}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-title input{width:100%}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-start-date,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-end-date{width:210px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-start-date .tui-full-calendar-content,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-end-date .tui-full-calendar-content{padding-left:8px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-popup-location,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-private,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-allday,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-creation .tui-full-calendar-section-state{display:none}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .priority{color:#ffffff;padding:2px 4px;border-radius:4px;margin-right:6px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .overdue{color:#f5222d;background:#fff1f0;border:1px solid #ffa39e;padding:1px 3px;border-radius:4px;margin-right:6px}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .tui-full-calendar-calendar-dot,.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .tui-full-calendar-ic-priority{opacity:0}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .tui-full-calendar-ic-edit{top:-2px;background-image:url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjIzODU5MzY4MTg5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjExMTkiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNODMzLjQyODU3MTY4IDYySDE5MC41NzE0MjgzMmExMjguNTcxNDI4MzIgMTI4LjU3MTQyODMyIDAgMCAwLTEyOC41NzE0MjgzMiAxMjguNTcxNDI4MzJ2NjQyLjg1NzE0MzM2YTEyOC41NzE0MjgzMiAxMjguNTcxNDI4MzIgMCAwIDAgMTI4LjU3MTQyODMyIDEyOC41NzE0MjgzMmg2NDIuODU3MTQzMzZhMTI4LjU3MTQyODMyIDEyOC41NzE0MjgzMiAwIDAgMCAxMjguNTcxNDI4MzItMTI4LjU3MTQyODMyVjE5MC41NzE0MjgzMmExMjguNTcxNDI4MzIgMTI4LjU3MTQyODMyIDAgMCAwLTEyOC41NzE0MjgzMi0xMjguNTcxNDI4MzJ6IG02NC4yODU3MTQxNiA3NzEuNDI4NTcxNjhhNjQuMjg1NzE0MTYgNjQuMjg1NzE0MTYgMCAwIDEtNjQuMjg1NzE0MTcgNjQuMjg1NzE0MTZIMTkwLjU3MTQyODMyYTY0LjI4NTcxNDE2IDY0LjI4NTcxNDE2IDAgMCAxLTY0LjI4NTcxNDE2LTY0LjI4NTcxNDE2VjE5MC41NzE0MjgzMmE2NC4yODU3MTQxNiA2NC4yODU3MTQxNiAwIDAgMSA2NC4yODU3MTQxNy02NC4yODU3MTQxNmg2NDIuODU3MTQzMzVhNjQuMjg1NzE0MTYgNjQuMjg1NzE0MTYgMCAwIDEgNjQuMjg1NzE0MTYgNjQuMjg1NzE0MTd6IiBwLWlkPSIxMTIwIiBmaWxsPSIjNTE1MTUxIj48L3BhdGg+PHBhdGggZD0iTTE5MC41NzE0MjgzMiAyNTQuODU3MTQyNDhoNjQuMjg1NzE0MTZ2NjQuMjg1NzE1MDRIMTkwLjU3MTQyODMyek0zMTkuMTQyODU3NTIgMjU0Ljg1NzE0MjQ4aDQ1MHY2NC4yODU3MTUwNEgzMTkuMTQyODU3NTJ6TTE5MC41NzE0MjgzMiA0NDcuNzE0Mjg1ODRoNjQuMjg1NzE0MTZ2NjQuMjg1NzE0MTZIMTkwLjU3MTQyODMyek0zMTkuMTQyODU3NTIgNDQ3LjcxNDI4NTg0aDQ1MHY2NC4yODU3MTQxNkgzMTkuMTQyODU3NTJ6TTE5MC41NzE0MjgzMiA2NDAuNTcxNDI4MzJoNjQuMjg1NzE0MTZ2NjQuMjg1NzE0MTZIMTkwLjU3MTQyODMyek0zMTkuMTQyODU3NTIgNjQwLjU3MTQyODMyaDMyMS40Mjg1NzA4djY0LjI4NTcxNDE2SDMxOS4xNDI4NTc1MnoiIHAtaWQ9IjExMjEiIGZpbGw9IiM1MTUxNTEiPjwvcGF0aD48L3N2Zz4=")}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .tui-full-calendar-ic-delete{top:-2px;background-image:url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjIzODU5MzMwMTc2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9Ijc5MiIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPjxwYXRoIGQ9Ik04OTIuMjg4IDI1NmgtMTkxLjE2OEEyMDIuMjQgMjAyLjI0IDAgMCAwIDUwOS42MzIgNjIuMDggMjAxLjIxNiAyMDEuMjE2IDAgMCAwIDMxOC44NDggMjU2SDEyOGMtMTguNjg4IDAtNjYuMDQ4LTQuMjI0LTY2LjA0OCAyNC43NjhDNjEuOTUyIDMyNy43NDQgMTA5LjM3NiAzMjAgMTI4IDMyMGg2NHY1MTJhMTQ2LjQ5NiAxNDYuNDk2IDAgMCAwIDEyNy40MjQgMTI4aDM4Mi4yNzJBMTUwLjAxNiAxNTAuMDE2IDAgMCAwIDgzMiA4MzJsLTMuMzkyLTUxMmg2NGMxOC4zNjggMCA2NS4wMjQgMS40NzIgNjUuMDI0LTM5Ljc0NEE3Mi4zODQgNzIuMzg0IDAgMCAwIDg5Mi4yODggMjU2ek01MDkuNjMyIDEyOC41MTJBMTM4LjE3NiAxMzguMTc2IDAgMCAxIDYzNy40NCAyNTZIMzgyLjU5MmExMzcuOTIgMTM3LjkyIDAgMCAxIDEyNy4wNC0xMjcuNDg4ek03NjggODMyYTk3Ljk4NCA5Ny45ODQgMCAwIDEtNjYuODggNjRIMzE4Ljg0OGE5My41NjggOTMuNTY4IDAgMCAxLTY0LTY0VjMyMEg3Njh2NTEyeiBtLTM4NS40MDgtNjRWNTEyYzAtMTguNDk2IDAuOTYtNjAuOTkyIDM2LjczNi02MC45OTIgMjcuMzI4IDAgMjYuNDk2IDQzLjAwOCAyNi45NDQgNjAuOTkydjI1NmMwIDE4LjQ5Ni02LjQgMjAuMDMyLTI0Ljk2IDIwLjAzMnMtMzguNzItMS41MzYtMzguNzItMjAuMDMyeiBtMTkxLjE2OCAwVjUxMmE2NCA2NCAwIDAgMSAyMy44MDgtNjAuOTkyYzQyLjQzMiAwIDM5LjM2IDQzLjAwOCAzOS44NzIgNjAuOTkydjI1NmMwIDE4LjQ5Ni0xOS41ODQgMjAuMDMyLTM3Ljk1MiAyMC4wMzJzLTI1Ljc5Mi0xLjUzNi0yNS43OTItMjAuMDMyeiIgcC1pZD0iNzkzIiBmaWxsPSIjNTE1MTUxIj48L3BhdGg+PC9zdmc+")}.page-calendar .calendar-box .calendar-wrapper .tui-full-calendar-popup-task .tui-full-calendar-popup-detail-item-separate{padding-left:22px}.page-calendar .calendar-box .calendar-wrapper .tui-datepicker{border-color:#e8e8e8}.page-calendar .calendar-box .calendar-wrapper .tui-datepicker .tui-calendar th,.page-calendar .calendar-box .calendar-wrapper .tui-datepicker .tui-calendar td{height:32px}.page-calendar .calendar-box .calendar-wrapper .tui-datepicker .tui-calendar .tui-calendar-prev-month.tui-calendar-date,.page-calendar .calendar-box .calendar-wrapper .tui-datepicker .tui-calendar .tui-calendar-next-month.tui-calendar-date{visibility:visible}.page-calendar .calendar-box .calendar-wrapper .tui-datepicker .tui-datepicker-body .tui-timepicker,.page-calendar .calendar-box .calendar-wrapper .tui-datepicker .tui-datepicker-footer .tui-timepicker{padding:16px 46px 16px 47px}.page-dashboard{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center}.page-dashboard .dashboard-wrapper{width:664px;max-width:80%;max-height:80%;margin-bottom:2%;display:flex;flex-direction:column}.page-dashboard .dashboard-wrapper .dashboard-hello{padding:0 12px;color:#333333;font-size:24px;font-weight:600}.page-dashboard .dashboard-wrapper .dashboard-desc{margin-top:18px;padding:0 12px;color:#888888;font-size:13px}.page-dashboard .dashboard-wrapper .dashboard-block{margin-top:18px;padding:0 12px;display:flex}.page-dashboard .dashboard-wrapper .dashboard-block>li{flex:1;flex-shrink:0;list-style:none;margin-right:24px;border-radius:8px;padding:16px 24px;background-color:#fa8e8c;display:flex;flex-direction:column;justify-content:center;cursor:pointer;transition:box-shadow 0.3s}.page-dashboard .dashboard-wrapper .dashboard-block>li:hover{box-shadow:0 0 10px #cccccc}.page-dashboard .dashboard-wrapper .dashboard-block>li:first-child{background-color:#6f9ef6}.page-dashboard .dashboard-wrapper .dashboard-block>li:last-child{background-color:#98de6e;margin-right:0;cursor:default;box-shadow:none}.page-dashboard .dashboard-wrapper .dashboard-block>li .block-title{color:rgba(255,255,255,0.6);font-size:12px}.page-dashboard .dashboard-wrapper .dashboard-block>li .block-data{display:flex;align-items:center;padding-top:10px;line-height:1}.page-dashboard .dashboard-wrapper .dashboard-block>li .block-data .block-num{flex:1;color:#ffffff;font-weight:600;font-size:32px}.page-dashboard .dashboard-wrapper .dashboard-block>li .block-data .iconfont{color:rgba(255,255,255,0.7);font-size:20px}.page-dashboard .dashboard-wrapper .dashboard-title{margin-top:60px;padding:0 12px;font-weight:600;font-size:15px}.page-dashboard .dashboard-wrapper .dashboard-list{margin-top:4px;padding:0 12px;overflow:auto}.page-dashboard .dashboard-wrapper .dashboard-list>li{position:relative;list-style:none;display:flex;background:#F9FAFB;margin-top:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:box-shadow 0.3s}.page-dashboard .dashboard-wrapper .dashboard-list>li:hover{box-shadow:0 0 6px #dfdfdf}.page-dashboard .dashboard-wrapper .dashboard-list>li:last-child{margin-bottom:12px}.page-dashboard .dashboard-wrapper .dashboard-list>li .priority-color{position:absolute;top:50%;transform:translateY(-50%);left:0;height:12px;width:2px}.page-dashboard .dashboard-wrapper .dashboard-list>li .el-dropdown{flex-shrink:0;width:22px;height:22px;line-height:22px}.page-dashboard .dashboard-wrapper .dashboard-list>li .el-dropdown .iconfont{color:#bbbbbb;font-size:18px}.page-dashboard .dashboard-wrapper .dashboard-list>li .item-title{flex:1;padding-left:6px;line-height:22px}.page-dashboard .dashboard-wrapper .dashboard-list>li .item-icon{display:flex;align-items:center;font-size:13px;margin-left:16px;height:22px;color:#aaaaaa;cursor:pointer}.page-dashboard .dashboard-wrapper .dashboard-list>li .item-icon .iconfont{font-size:13px}.page-dashboard .dashboard-wrapper .dashboard-list>li .item-icon>em{font-style:normal;margin-left:4px}.page-dashboard .dashboard-wrapper .dashboard-list>li .item-icon.overdue{color:#ed4014}.page-dashboard .dashboard-wrapper .dashboard-list>li .item-icon.today{color:#ff9900}.page-dashboard .nopage{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center}.page-dashboard .nopage .nopage-icon{background-color:#f4f5f7;padding:20px;border-radius:50%}.page-dashboard .nopage .nopage-icon .ivu-icon{color:#d1d8dd;font-size:46px}.page-dashboard .nopage .nopage-text{margin-top:16px;color:#bec6cc;background-color:#f4f5f7;padding:4px 15px;border-radius:14px}.page-file{width:100%;height:100%;display:flex;flex-direction:column}.page-file .file-wrapper{flex:1;height:0;display:flex;flex-direction:column}.page-file .file-wrapper .file-head{display:flex;align-items:center;padding-bottom:16px;margin:32px 32px 16px;border-bottom:1px solid #F4F4F5}.page-file .file-wrapper .file-head .file-nav{flex:1;display:flex;align-items:center}.page-file .file-wrapper .file-head .file-nav>h1{color:#333333;font-size:28px;font-weight:600}.page-file .file-wrapper .file-head .file-search{flex-shrink:0;margin-left:22px;cursor:pointer;width:140px;transition:width 0.3s}.page-file .file-wrapper .file-head .file-search.has-value{width:180px}.page-file .file-wrapper .file-head .file-add{flex-shrink:0;margin-left:22px;cursor:pointer}.page-file .file-wrapper .file-head .file-add .iconfont{font-size:18px}.page-file .file-wrapper .file-no{flex:1;display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:5%;opacity:0.8}.page-file .file-wrapper .file-no>i{font-size:64px}.page-file .file-wrapper .file-no>p{margin-top:18px;font-size:14px;font-weight:500;line-height:1}.page-file .file-wrapper .file-navigator{display:flex;align-items:center;height:24px;line-height:24px;margin:0 32px 0}.page-file .file-wrapper .file-navigator>ul{display:flex;align-items:center;overflow:auto}.page-file .file-wrapper .file-navigator>ul>li{display:flex;list-style:none;align-items:center;padding-left:8px;font-size:14px;color:#8bcf70;cursor:pointer}.page-file .file-wrapper .file-navigator>ul>li:last-child{color:#515a6e;cursor:default}.page-file .file-wrapper .file-navigator>ul>li+li:before{content:"\203a";margin-top:-2px;padding-right:8px;color:#515a6e;line-height:1;font-size:16px;font-weight:500;font-family:system-ui, sans-serif}.page-file .file-wrapper .file-navigator>ul>li>span{display:inline-block;max-width:180px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.page-file .file-wrapper .file-navigator .ivu-btn{font-size:12px;margin-left:12px}.page-file .file-wrapper .file-navigator .file-shear{display:flex;align-items:center}.page-file .file-wrapper .file-navigator .file-shear>span{padding-right:3px}.page-file .file-wrapper .file-navigator .file-shear>em{display:inline-block;max-width:120px;font-style:normal;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.page-file .file-wrapper .file-navigator .flex-full{flex:1}.page-file .file-wrapper .file-navigator .switch-button{display:flex;align-items:center;background-color:#ffffff;border-radius:6px;position:relative;transition:box-shadow 0.2s}.page-file .file-wrapper .file-navigator .switch-button:hover{box-shadow:0 0 10px #e6ecfa}.page-file .file-wrapper .file-navigator .switch-button:before{content:"";position:absolute;top:0;left:0;width:50%;height:100%;z-index:0;color:#8bcf70;border-radius:6px;border:1px solid #8bcf70;background-color:rgba(139,207,112,0.1);transition:left 0.2s}.page-file .file-wrapper .file-navigator .switch-button>div{z-index:1;width:32px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:6px;cursor:pointer;color:#515a6e}.page-file .file-wrapper .file-navigator .switch-button>div>i{font-size:17px}.page-file .file-wrapper .file-navigator .switch-button>div:first-child{color:#8bcf70}.page-file .file-wrapper .file-navigator .switch-button.table:before{left:50%}.page-file .file-wrapper .file-navigator .switch-button.table>div:first-child{color:#515a6e}.page-file .file-wrapper .file-navigator .switch-button.table>div:last-child{color:#8bcf70}.page-file .file-wrapper .file-table{flex:1;cursor:default;margin:16px 32px 32px}.page-file .file-wrapper .file-table .ivu-table:before{display:none}.page-file .file-wrapper .file-table .ivu-table .ivu-table-tip{opacity:0.8}.page-file .file-wrapper .file-table .ivu-table .ivu-table-tip span{font-size:14px;font-weight:500;line-height:1.8}.page-file .file-wrapper .file-table .ivu-table .ivu-table-tip span:before{display:block;content:"\e60b";font-family:"iconfont", "serif" !important;font-size:64px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0.2px}.page-file .file-wrapper .file-table .file-name{display:flex;align-items:center;position:relative;padding-right:26px}.page-file .file-wrapper .file-table .file-name:before{flex-shrink:0;content:"";width:18px;height:18px;background-repeat:no-repeat;background-size:contain;margin-right:8px}.page-file .file-wrapper .file-table .file-name.folder:before{background-image:url("../images/file/folder.svg")}.page-file .file-wrapper .file-table .file-name.document:before{background-image:url("../images/file/document.svg")}.page-file .file-wrapper .file-table .file-name.mind:before{background-image:url("../images/file/mind.svg")}.page-file .file-wrapper .file-table .file-name.sheet:before{background-image:url("../images/file/sheet.svg")}.page-file .file-wrapper .file-table .file-name.flow:before{background-image:url("../images/file/flow.svg")}.page-file .file-wrapper .file-list{flex:1;padding:0 20px 20px;margin-top:16px;overflow:auto}.page-file .file-wrapper .file-list>ul{margin-top:-12px}.page-file .file-wrapper .file-list>ul>li{list-style:none;float:left;margin:12px;width:100px;height:110px;position:relative;border-radius:5px;display:flex;flex-direction:column;align-items:center;justify-content:space-between;cursor:pointer}.page-file .file-wrapper .file-list>ul>li .file-input{margin:0 4px 4px;position:relative}.page-file .file-wrapper .file-list>ul>li .file-input input{margin:0;padding:1px 5px;font-size:13px}.page-file .file-wrapper .file-list>ul>li .file-input .file-load{position:absolute;top:0;right:6px;bottom:0;display:flex}.page-file .file-wrapper .file-list>ul>li .file-input .file-load .common-loading{width:10px;height:10px}.page-file .file-wrapper .file-list>ul>li .file-name{display:block;width:100%;height:20px;line-height:20px;color:#515a6e;font-size:12px;text-align:center;margin-bottom:5px;padding:0 6px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.page-file .file-wrapper .file-list>ul>li .file-menu{opacity:0;position:absolute;top:0;right:0;transition:opacity 0.2s;display:flex}.page-file .file-wrapper .file-list>ul>li .file-menu .ivu-icon{font-size:16px;color:#aaaaaa;transition:color 0.2s;padding:2px 5px}.page-file .file-wrapper .file-list>ul>li .file-menu .ivu-icon:hover{color:#515a6e}.page-file .file-wrapper .file-list>ul>li .file-icon{display:inline-block;width:64px;height:64px;background-repeat:no-repeat;background-size:contain;margin-top:12px}.page-file .file-wrapper .file-list>ul>li.shear{opacity:0.38}.page-file .file-wrapper .file-list>ul>li.folder .file-icon{background-image:url("../images/file/folder.svg")}.page-file .file-wrapper .file-list>ul>li.document .file-icon{background-image:url("../images/file/document.svg")}.page-file .file-wrapper .file-list>ul>li.mind .file-icon{background-image:url("../images/file/mind.svg")}.page-file .file-wrapper .file-list>ul>li.sheet .file-icon{background-image:url("../images/file/sheet.svg")}.page-file .file-wrapper .file-list>ul>li.flow .file-icon{background-image:url("../images/file/flow.svg")}.page-file .file-wrapper .file-list>ul>li:hover{background-color:#f4f5f7}.page-file .file-wrapper .file-list>ul>li:hover .file-menu{opacity:1}.page-file-dropdown-menu .file-item{display:flex;align-items:center;position:relative}.page-file-dropdown-menu .file-item:before{flex-shrink:0;content:"";width:18px;height:18px;background-repeat:no-repeat;background-size:contain;margin-right:8px}.page-file-dropdown-menu .file-item.folder:before{background-image:url("../images/file/folder.svg")}.page-file-dropdown-menu .file-item.document:before{background-image:url("../images/file/document.svg")}.page-file-dropdown-menu .file-item.mind:before{background-image:url("../images/file/mind.svg")}.page-file-dropdown-menu .file-item.sheet:before{background-image:url("../images/file/sheet.svg")}.page-file-dropdown-menu .file-item.flow:before{background-image:url("../images/file/flow.svg")}.page-login{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background-color:#F3F6FE}.page-login .login-body{display:flex;flex-direction:column;align-items:center;padding:32px 0;width:100%;max-height:100%;overflow:auto}.page-login .login-body .login-logo{flex-shrink:0;width:68px;height:68px;background:url("../images/logo.svg") no-repeat center center;background-size:contain}.page-login .login-body .login-box{margin-top:32px;width:400px;border-radius:12px;background-color:#ffffff;box-shadow:0 0 10px #e6ecfa}.page-login .login-body .login-box .login-title{font-size:24px;font-weight:600;text-align:center;margin-top:36px}.page-login .login-body .login-box .login-subtitle{font-size:14px;text-align:center;margin-top:12px;color:#AAAAAA}.page-login .login-body .login-box .login-input{margin:32px 40px}.page-login .login-body .login-box .login-input>*{margin-top:26px}.page-login .login-body .login-box .login-input .ivu-input{border-color:#f1f1f1}.page-login .login-body .login-box .login-input .ivu-input-large{font-size:15px}.page-login .login-body .login-box .login-input .login-code .ivu-input-group-prepend,.page-login .login-body .login-box .login-input .login-code .ivu-input-group-append{background:transparent;border-color:#f1f1f1}.page-login .login-body .login-box .login-input .login-code .ivu-input{border-left-color:transparent;border-right-color:transparent}.page-login .login-body .login-box .login-input .login-code .login-code-end{margin:-6px -7px;height:38px;overflow:hidden;cursor:pointer}.page-login .login-body .login-box .login-input .login-code .login-code-end img{height:100%}.page-login .login-body .login-box .login-input .login-switch{color:#aaaaaa}.page-login .login-body .login-forgot{color:#aaaaaa;margin-top:36px}.page-manage{position:absolute;top:0;left:0;right:0;bottom:0;display:flex}.page-manage .manage-box-menu{position:relative;flex-grow:0;flex-shrink:0;width:255px;height:100%;background:#F4F5F7;display:flex;flex-direction:column;align-items:center;transition:all 0.2s}.page-manage .manage-box-menu .manage-box-dropdown{flex-shrink:0;width:86%}.page-manage .manage-box-menu .manage-box-dropdown .ivu-select-dropdown{padding:7px 0}.page-manage .manage-box-menu .manage-box-dropdown .ivu-select-dropdown .ivu-dropdown-item{padding:9px 16px}.page-manage .manage-box-menu .manage-box-dropdown .ivu-select-dropdown .ivu-dropdown-item-divided{margin-top:7px}.page-manage .manage-box-menu .manage-box-dropdown .ivu-select-dropdown .ivu-dropdown-item-divided:before{top:-9px}.page-manage .manage-box-menu .manage-box-dropdown .manage-box-title{display:flex;align-items:center;flex-shrink:0;padding:6px 10px;margin-top:27px;border-radius:8px;background-color:#ffffff;cursor:pointer;transition:box-shadow 0.3s}.page-manage .manage-box-menu .manage-box-dropdown .manage-box-title.menu-visible{box-shadow:0 1px 6px rgba(0,0,0,0.2)}.page-manage .manage-box-menu .manage-box-dropdown .manage-box-title .manage-box-avatar{width:36px;height:36px}.page-manage .manage-box-menu .manage-box-dropdown .manage-box-title>span{flex:1;padding-left:12px;font-size:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-manage .manage-box-menu .manage-box-dropdown .manage-box-title .manage-box-arrow{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-left:16px;padding-right:2px}.page-manage .manage-box-menu .manage-box-dropdown .manage-box-title .manage-box-arrow>i{font-size:12px;margin:-1px}.page-manage .manage-box-menu>ul{flex:1;width:100%;margin-top:16px;overflow:auto}.page-manage .manage-box-menu>ul>li{display:flex;align-items:center;height:38px;color:#6C7D8C;cursor:pointer;position:relative;width:80%;max-width:100%;margin:8px auto;padding:0 4%;border-radius:4px}.page-manage .manage-box-menu>ul>li>i{opacity:0.3;font-size:20px;margin-right:10px}.page-manage .manage-box-menu>ul>li .menu-title{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-manage .manage-box-menu>ul>li .menu-badge{margin-left:12px;transform:scale(0.9)}.page-manage .manage-box-menu>ul>li.menu-project{display:flex;flex-direction:column;align-items:center;height:auto;padding:14px 0 0;cursor:default}.page-manage .manage-box-menu>ul>li.menu-project>ul{width:100%}.page-manage .manage-box-menu>ul>li.menu-project>ul>li{display:flex;flex-direction:column;margin:4px auto;list-style:none;cursor:pointer}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h1{position:relative;display:flex;align-items:center;justify-content:space-between;padding:0 8px 0 30px;border-radius:4px}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h1>em{position:absolute;top:50%;left:2px;width:24px;height:24px;cursor:pointer;transform:translateY(-50%);display:flex;align-items:center;justify-content:center}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h1>em:before{content:"";width:12px;height:12px;background:url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjIyMzkwODExNTQxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI0OTk3IiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiPjxwYXRoIGQ9Ik0zNjYuMTgyNCAxMDguMjM2OEw4MTIuMDMyIDQyOC4wMzJhMTAyLjQgMTAyLjQgMCAwIDEgMCAxNjYuNTAyNEwzNjYuMTgyNCA5MTQuMzI5NmExMDIuNCAxMDIuNCAwIDAgMS0xNjIuMDk5Mi04My4yNTEyVjE5MS40ODhhMTAyLjQgMTAyLjQgMCAwIDEgMTYyLjA5OTItODMuMjUxMnoiIHAtaWQ9IjI0OTk4IiBmaWxsPSIjOTk5OTk5Ij48L3BhdGg+PC9zdmc+") no-repeat center center;background-size:contain;transition:transform 0.2s}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h1 .title{flex:1;color:#333333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:38px;line-height:38px}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h1 .num{font-size:12px;padding-left:16px}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h2{display:none;margin:16px 4px;padding:0 8px 0 26px;cursor:default}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h2>p{display:flex;align-items:center;padding:4px 0;height:36px}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h2>p em,.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h2>p span{font-style:normal;font-size:12px;flex-shrink:0;padding-right:6px}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h2>p .ivu-progress{margin-right:-18px}.page-manage .manage-box-menu>ul>li.menu-project>ul>li .project-h2>p .ivu-progress .ivu-progress-inner{background-color:#e4e4e4}.page-manage .manage-box-menu>ul>li.menu-project>ul>li.active .project-h1{background-color:#ffffff}.page-manage .manage-box-menu>ul>li.menu-project>ul>li.open-menu .project-h1>em:before{transform:rotate(90deg)}.page-manage .manage-box-menu>ul>li.menu-project>ul>li.open-menu .project-h2{display:block}.page-manage .manage-box-menu>ul>li.menu-project .common-loading{margin:6px;width:22px;height:22px}.page-manage .manage-box-menu>ul>li.active{background-color:#ffffff}.page-manage .manage-box-menu .manage-box-new{width:80%;height:38px;margin-top:16px;margin-bottom:20px}.page-manage .manage-box-main{flex:1;position:relative}.page-manage .manage-box-main .manage-box-view{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto}.page-messenger{display:flex}.page-messenger .messenger-wrapper{flex:1;display:flex;align-items:flex-start}.page-messenger .messenger-wrapper .messenger-select{position:relative;height:100%;width:30%;min-width:240px;max-width:320px;flex-shrink:0;display:flex;flex-direction:column}.page-messenger .messenger-wrapper .messenger-select:after{content:"";position:absolute;top:0;right:0;height:100%;width:1px;background-color:#f4f5f5}.page-messenger .messenger-wrapper .messenger-select .messenger-search{display:flex;align-items:center;justify-content:center;height:54px;padding:0 12px;flex-shrink:0}.page-messenger .messenger-wrapper .messenger-select .messenger-search .search-wrapper{flex:1;background-color:#F7F7F7;padding:0 8px;margin:0 4px;border-radius:12px;overflow:hidden}.page-messenger .messenger-wrapper .messenger-select .messenger-search .search-wrapper .ivu-input{border-color:transparent;background-color:transparent}.page-messenger .messenger-wrapper .messenger-select .messenger-search .search-wrapper .ivu-input:hover,.page-messenger .messenger-wrapper .messenger-select .messenger-search .search-wrapper .ivu-input:focus{box-shadow:none}.page-messenger .messenger-wrapper .messenger-select .messenger-nav{display:flex;align-items:center;justify-content:center;padding:2px 0 12px}.page-messenger .messenger-wrapper .messenger-select .messenger-nav>p{line-height:1;padding:0 16px;color:#888888;cursor:pointer}.page-messenger .messenger-wrapper .messenger-select .messenger-nav>p.active{color:#555555;font-weight:500}.page-messenger .messenger-wrapper .messenger-select .messenger-nav>p:hover{color:#777777}.page-messenger .messenger-wrapper .messenger-select .messenger-list{flex:1;height:0;width:100%;overflow-x:hidden;overflow-y:auto}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li{display:flex;flex-direction:row;align-items:flex-start;padding:16px 12px;position:relative;cursor:pointer;list-style:none}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .user-avatar,.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .icon-avatar{width:42px;height:42px;margin:2px;flex-grow:0;flex-shrink:0}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .icon-avatar{display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:26px;background-color:#61B2F9;color:#ffffff}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .icon-avatar.project{background-color:#6E99EB}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .icon-avatar.task{background-color:#9B96DF;font-size:24px}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-box{flex:1;width:0;display:flex;flex-direction:column;padding-left:12px}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-box .dialog-title{display:flex;flex-direction:row;align-items:center;justify-content:space-between;line-height:24px}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-box .dialog-title>span{flex:1;color:#333333;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-box .dialog-title>i{flex-shrink:0;margin-left:8px;transform:scale(0.9);font-size:12px;color:#8bcf70}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-box .dialog-title>em{flex-shrink:0;margin-left:8px;font-style:normal;color:#999999;font-size:12px}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-box .dialog-text{max-width:170px;color:#999999;font-size:12px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li .dialog-num{position:absolute;top:10px;left:42px;font-size:12px;transform:scale(0.8)}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li.active{background-color:#F4F5F7}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li.loading{margin:0;height:52px;display:flex;align-items:center;justify-content:center}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.dialog>li.loading .common-loading{width:20px;height:20px;margin:0}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li{list-style:none;margin-left:24px;position:relative}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li .label{padding-left:4px;margin-top:6px;margin-bottom:6px;height:34px;line-height:34px;border-bottom:1px solid #efefef}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li.loading{margin:0;height:52px;display:flex;align-items:center;justify-content:center}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li.loading .common-loading{width:20px;height:20px;margin:0}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li>ul>li{list-style:none;display:flex;flex-direction:row;align-items:center;height:52px;cursor:pointer}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li>ul>li .avatar{flex-grow:0;flex-shrink:0;width:30px;height:30px}.page-messenger .messenger-wrapper .messenger-select .messenger-list>ul.contacts>li>ul>li .nickname{padding:0 12px;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-messenger .messenger-wrapper .messenger-select .messenger-menu{display:flex;align-items:center;justify-content:center;height:52px;flex-shrink:0;border-top:1px solid #f4f5f5}.page-messenger .messenger-wrapper .messenger-select .messenger-menu>i{cursor:pointer;font-size:24px;margin:0 24px;color:#aaaaaa;opacity:0.9}.page-messenger .messenger-wrapper .messenger-select .messenger-menu>i.active{opacity:1;color:#8bcf70}.page-messenger .messenger-wrapper .messenger-select .messenger-menu>i:hover{opacity:1}.page-messenger .messenger-wrapper .messenger-msg{flex:1;width:0;height:100%;display:flex;position:relative}.page-messenger .messenger-wrapper .messenger-msg .dialog-no{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.page-messenger .messenger-wrapper .messenger-msg .dialog-no .dialog-no-icon{background-color:#f4f5f7;padding:20px;border-radius:50%}.page-messenger .messenger-wrapper .messenger-msg .dialog-no .dialog-no-icon .ivu-icon{color:#d1d8dd;font-size:46px}.page-messenger .messenger-wrapper .messenger-msg .dialog-no .dialog-no-text{margin-top:16px;color:#bec6cc;background-color:#f4f5f7;padding:4px 15px;border-radius:14px}.page-project{flex:1;display:flex;align-items:flex-start}.page-project .project-list{flex:1;width:0;height:100%;background-color:#fafafa}.page-project .project-dialog{position:relative;height:100%;width:35%;min-width:320px;max-width:520px;flex-shrink:0}.page-setting{display:flex;flex-direction:column}.page-setting .setting-head{display:flex;align-items:center;margin:32px 32px 16px;border-bottom:1px solid #F4F4F5}.page-setting .setting-head .setting-titbox{flex:1;margin-bottom:16px}.page-setting .setting-head .setting-titbox .setting-title{display:flex;align-items:center}.page-setting .setting-head .setting-titbox .setting-title>h1{color:#333333;font-size:28px;font-weight:600}.page-setting .setting-box{flex:1;height:0;display:flex;margin-bottom:16px}.page-setting .setting-box .setting-menu{width:200px;flex-shrink:0;border-right:1px solid #F4F4F5;overflow:auto}.page-setting .setting-box .setting-menu>ul{padding:12px 0 0 32px}.page-setting .setting-box .setting-menu>ul>li{cursor:pointer;color:#6C7D8C;list-style:none;line-height:42px;padding:0 20px;margin:5px 0;position:relative}.page-setting .setting-box .setting-menu>ul>li.active,.page-setting .setting-box .setting-menu>ul>li:hover{background-color:#F4F5F7}.page-setting .setting-box .setting-content{flex:1;overflow:auto;position:relative;display:flex;flex-direction:column}.page-setting .setting-box .setting-content .setting-content-title{font-size:20px;font-weight:500;padding:12px 32px}.page-setting .setting-box .setting-content .setting-content-view{flex:1;position:relative}.page-setting .setting-box .setting-content .setting-content-view .setting-router-view{padding:24px 40px}.page-setting .setting-item .ivu-input,.page-setting .setting-item .ivu-select-selection{max-width:460px}.page-setting .setting-item .form-tip{color:#999999}.page-setting .setting-item .setting-color{max-width:600px;margin-bottom:12px}.page-setting .setting-item .setting-color>div{text-align:center;padding-right:12px}.page-setting .setting-item .setting-color>div:first-child{text-align:left}.page-setting .setting-item .setting-color>div:last-child{padding-right:0;width:60px;flex:auto;flex-shrink:0;max-width:60px}.page-setting .setting-item .setting-color>div .ivu-color-picker{width:100%}.page-setting .setting-item .setting-color .information{color:#999999}.page-setting .setting-item .setting-footer>button{height:34px;line-height:32px;min-width:94px}.page-setting .setting-item.submit{position:absolute;top:0;left:0;right:0;bottom:0}.page-setting .setting-item.submit .setting-footer{position:absolute;left:0;right:0;bottom:0;z-index:1;padding:16px 24px 0;border-top:1px solid #F4F4F5}.dialog-wrapper{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;background-color:#ffffff;z-index:1}.dialog-wrapper .dialog-title{display:flex;flex-direction:column;justify-content:center;padding:0 30px;height:68px;position:relative}.dialog-wrapper .dialog-title:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#f4f5f5}.dialog-wrapper .dialog-title .main-title{display:flex;align-items:center;line-height:22px}.dialog-wrapper .dialog-title .main-title>h2{font-size:17px;font-weight:600}.dialog-wrapper .dialog-title .main-title>em{font-style:normal;font-size:17px;font-weight:500;padding-left:6px}.dialog-wrapper .dialog-title .sub-title{flex-shrink:0;font-size:12px;line-height:20px;color:#aaaaaa}.dialog-wrapper .dialog-title .sub-title.pointer{cursor:pointer}.dialog-wrapper .dialog-title .sub-title.pointer:hover{color:#888888}.dialog-wrapper .dialog-scroller{position:relative;flex:1;padding:0 32px;overflow:auto}.dialog-wrapper .dialog-scroller .dialog-list>ul>li{display:flex;flex-direction:row;align-items:flex-end;list-style:none;margin-bottom:16px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li:first-child{margin-top:16px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-avatar{position:relative;margin-bottom:20px;flex-shrink:0;width:30px;height:30px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view{max-width:70%;display:flex;flex-direction:column;align-items:flex-start;margin:0 0 0 8px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content{color:#333333;background-color:#F4F5F7;padding:8px;min-width:32px;border-radius:6px 6px 6px 0}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.loading{display:flex}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.loading .common-loading{width:20px;height:20px;margin:4px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.file{display:inline-block}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.file .file-box{background-color:#ffffff;display:flex;align-items:center;padding:10px 14px;border-radius:3px;width:220px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.file .file-box .file-thumb{width:36px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.file .file-box .file-info{margin-left:12px;display:flex;flex-direction:column;justify-content:center}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.file .file-box .file-info .file-name{color:#333333;font-size:14px;line-height:18px;word-break:break-all;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.file .file-box .file-info .file-size{padding-top:4px;color:#666666;font-size:14px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.img{padding:0;display:flex;max-width:220px;max-height:220px;border-radius:6px;background-color:transparent;overflow:hidden}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.img .file-img{display:flex}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-content.unknown{text-decoration:underline}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-foot{display:flex;align-items:center;padding-top:4px;height:21px;line-height:1}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-foot .common-loading{margin:0 2px;width:10px;height:10px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-foot .time{color:#bbbbbb;font-size:12px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-foot .done{display:none;margin-left:4px;transform:scale(0.9);font-size:12px;color:#8bcf70}.dialog-wrapper .dialog-scroller .dialog-list>ul>li .dialog-view .dialog-foot .percent{display:none;margin-left:4px;cursor:pointer}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.history{cursor:pointer;justify-content:center;font-size:13px;padding:3px 0;margin:12px 0;opacity:0.6;transition:opacity 0.2s}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.history:hover{opacity:1}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.history-tip{position:relative;padding-top:60px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.history-tip .history-text{font-style:normal;position:absolute;top:10px;left:50%;height:22px;line-height:22px;padding:0 48px;text-align:center;font-size:12px;border-radius:2px;background:#f5f5f5;transform:translateX(-50%)}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.loading{padding:12px 0;justify-content:center}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.loading .common-loading{margin:0;width:18px;height:18px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.nothing{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#999999}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.bottom{height:0;margin:0;padding:0}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self{flex-direction:row-reverse}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self .dialog-view{align-items:flex-end;margin:0 8px 0 0}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self .dialog-view .dialog-content{color:#ffffff;background-color:#8bcf70;border-radius:6px 6px 0 6px}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self .dialog-view .dialog-content.file{background-color:#F4F5F7}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self .dialog-view .dialog-content.img{border-radius:6px;background-color:transparent}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self .dialog-view .dialog-foot .done{display:inline-block}.dialog-wrapper .dialog-scroller .dialog-list>ul>li.self .dialog-view .dialog-foot .percent{display:inline-block}.dialog-wrapper .dialog-footer{display:flex;flex-direction:column;align-items:flex-end;padding:0 28px;margin-bottom:20px}.dialog-wrapper .dialog-footer .dialog-newmsg{display:none;height:30px;line-height:30px;color:#ffffff;font-size:12px;background-color:rgba(0,0,0,0.6);padding:0 12px;margin-bottom:20px;margin-right:10px;border-radius:16px;cursor:pointer;z-index:2}.dialog-wrapper .dialog-footer .dialog-input{background-color:#F4F5F7;padding:10px 12px;border-radius:10px}.dialog-wrapper .dialog-footer .dialog-input .ivu-input{border:0;resize:none;background-color:transparent}.dialog-wrapper .dialog-footer .dialog-input .ivu-input:focus{box-shadow:none}.dialog-wrapper .dialog-footer .chat-upload{display:none;width:0;height:0;overflow:hidden}.dialog-wrapper .dialog-footer.newmsg{margin-top:-50px}.dialog-wrapper .dialog-footer.newmsg .dialog-newmsg{display:block}.dialog-wrapper .drag-over{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;background-color:rgba(255,255,255,0.78);display:flex;align-items:center;justify-content:center}.dialog-wrapper .drag-over:before{content:"";position:absolute;top:16px;left:16px;right:16px;bottom:16px;border:2px dashed #7b7b7b;border-radius:12px}.dialog-wrapper .drag-over .drag-text{padding:12px;font-size:18px;color:#666666}.dialog-wrapper-read-poptip-content{display:flex;position:relative}.dialog-wrapper-read-poptip-content .read,.dialog-wrapper-read-poptip-content .unread{flex:1;max-height:300px;overflow:auto}.dialog-wrapper-read-poptip-content .read>li,.dialog-wrapper-read-poptip-content .unread>li{list-style:none;margin-bottom:12px}.dialog-wrapper-read-poptip-content .read>li .common-avatar,.dialog-wrapper-read-poptip-content .unread>li .common-avatar{width:100%}.dialog-wrapper-read-poptip-content .read>li:last-child,.dialog-wrapper-read-poptip-content .unread>li:last-child{margin-bottom:6px}.dialog-wrapper-read-poptip-content .read>li.read-title>em,.dialog-wrapper-read-poptip-content .unread>li.read-title>em{font-size:18px;font-weight:600;font-style:normal;padding-right:6px}.dialog-wrapper-read-poptip-content .unread>li{padding-left:16px}.dialog-wrapper-read-poptip-content:before{content:"";position:absolute;left:50%;top:0;bottom:0;width:1px;background-color:#F4F4F5}.file-content{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;border-radius:18px 18px 0 0;overflow:hidden}.file-content .edit-header{display:flex;flex-direction:row;align-items:center;width:100%;height:42px;min-width:900px;background-color:#ffffff;box-shadow:0 1px 5px 0 rgba(0,0,0,0.05);position:relative;z-index:99}.file-content .edit-header .header-title{flex:1;color:#333333;padding-left:24px;padding-right:24px;line-height:24px;font-size:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-content .edit-header .header-title .file-unsave-tip{color:#333333;padding-right:6px;font-weight:500;cursor:pointer;transition:color 0.3s}.file-content .edit-header .header-title .file-unsave-tip:hover{color:#000000}.file-content .edit-header .header-hint{padding-right:22px;font-size:12px;color:#666;white-space:nowrap}.file-content .edit-header .header-hint .ivu-btn{font-size:12px;padding:0 10px}.file-content .edit-header .header-hint .ivu-dropdown-item{font-size:12px !important}.file-content .edit-header .header-button{font-size:12px;margin-right:24px}.file-content .content-body{flex:1;display:flex;position:relative}.file-content .content-body .teditor-wrapper,.file-content .content-body .mdeditor-wrapper{flex:1;display:flex}.file-content .content-body .mdeditor-box{position:relative;width:100%}.file-content .content-body .mdeditor-box .markdown{position:absolute;top:0;left:0;bottom:0;right:0;overflow:auto;transform:translateZ(0)}.file-content .content-body .mdeditor-box .markdown .markdown-toolbars{border-bottom:1px solid #eeeeee}.file-content .content-body .mdeditor-box .markdown.border{border:0 !important}.file-content .content-body .teditor-loadedstyle{height:100%}.file-content .content-body .teditor-loadedstyle .tox-tinymce{border:0;border-radius:0}.file-content .content-body .teditor-loadedstyle .tox-mbtn{height:36px}.file-content .content-body .teditor-loadedstyle .tox-menubar,.file-content .content-body .teditor-loadedstyle .tox-toolbar-overlord{padding:0 12%;background:#ffffff}.file-content .content-body .teditor-loadedstyle .tox-toolbar__overflow,.file-content .content-body .teditor-loadedstyle .tox-toolbar__primary{background:none !important;border-top:1px solid #eaeaea !important}.file-content .content-body .teditor-loadedstyle .tox-toolbar-overlord{border-bottom:1px solid #E9E9E9 !important}.file-content .content-body .teditor-loadedstyle .tox-toolbar__group:not(:last-of-type){border-right:1px solid #eaeaea !important}.file-content .content-body .teditor-loadedstyle .tox-sidebar-wrap{margin:22px 12%;border:1px solid #e8e8e8;border-radius:2px;box-shadow:0 4px 8px 0 rgba(0,0,0,0.08)}.file-content .content-body .teditor-loadedstyle .tox-sidebar-wrap .tox-edit-area{border-top:0}.file-content .content-body .teditor-loadedstyle .tox-statusbar{border-top:1px solid #E9E9E9}.file-content .content-body .teditor-loadedstyle .tox-statusbar .tox-statusbar__resize-handle{display:none}.file-content .content-body .luckysheet{border:0}.luckysheet-input-box{z-index:99999 !important}.project-dialog{display:flex;flex-direction:column;background-color:#ffffff;border-left:1px solid #f4f5f5;z-index:1;position:relative}.project-dialog .project-dialog-wrapper .dialog-user{margin-top:36px;padding:0 32px}.project-dialog .project-dialog-wrapper .dialog-user .member-head{display:flex;align-items:center}.project-dialog .project-dialog-wrapper .dialog-user .member-head .member-title{flex:1;font-size:18px;font-weight:600}.project-dialog .project-dialog-wrapper .dialog-user .member-head .member-title>span{padding-left:6px;color:#8bcf70}.project-dialog .project-dialog-wrapper .dialog-user .member-head .member-view-all{color:#999;font-size:13px;cursor:pointer}.project-dialog .project-dialog-wrapper .dialog-user .member-head .member-view-all:hover{color:#777}.project-dialog .project-dialog-wrapper .dialog-user .member-list{display:flex;align-items:center;margin-top:14px;overflow:auto}.project-dialog .project-dialog-wrapper .dialog-user .member-list>li{position:relative;list-style:none;margin-right:14px;margin-bottom:8px}.project-dialog .project-dialog-wrapper .dialog-user .member-list.member-all{display:block}.project-dialog .project-dialog-wrapper .dialog-user .member-list.member-all>li{display:inline-block}.project-list{display:flex;flex-direction:column}.project-list .project-head{display:flex;flex-direction:column;align-items:flex-start;margin:32px 32px 0}.project-list .project-head .project-titbox{width:100%;display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px}.project-list .project-head .project-titbox .project-title{display:flex;align-items:center}.project-list .project-head .project-titbox .project-title>h1{color:#333333;font-size:28px;font-weight:600}.project-list .project-head .project-titbox .project-title .project-load{display:flex;align-items:center;margin-left:18px}.project-list .project-head .project-titbox .project-title .project-load .common-loading{width:22px;height:22px}.project-list .project-head .project-titbox .project-icons{display:flex;align-items:center;flex-shrink:0;margin-top:3px}.project-list .project-head .project-titbox .project-icons>li{list-style:none;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;position:relative;margin-left:16px;cursor:pointer;transition:box-shadow 0.3s}.project-list .project-head .project-titbox .project-icons>li:hover{box-shadow:0 0 6px #cccccc}.project-list .project-head .project-titbox .project-icons>li.project-icon{border-radius:50%;background-color:#F2F3F5}.project-list .project-head .project-titbox .project-icons>li.project-icon .menu-icon{font-size:20px;width:36px;height:36px;line-height:36px}.project-list .project-head .project-titbox .project-icons>li.project-icon .menu-badge{position:absolute;top:-6px;left:20px;transform:scale(0.8)}.project-list .project-head .project-titbox .project-icons>li.project-icon .search-input{margin:2px 0;width:170px}.project-list .project-head .project-titbox .project-icons>li.project-icon.active{color:#ffffff;background-color:#8bcf70}.project-list .project-head .project-subtitle{width:100%;color:#999999;line-height:24px;margin-top:-6px;margin-bottom:-18px;padding-right:260px}.project-list .project-head .project-switch{width:100%;display:flex;justify-content:flex-end}.project-list .project-head .project-switch .project-checkbox{display:flex;align-items:center;margin-right:14px;opacity:0.9}.project-list .project-head .project-switch .project-checkbox .ivu-checkbox-focus{box-shadow:none}.project-list .project-head .project-switch .project-switch-button{display:flex;align-items:center;background-color:#ffffff;border-radius:6px;position:relative;transition:box-shadow 0.2s}.project-list .project-head .project-switch .project-switch-button:hover{box-shadow:0 0 10px #e6ecfa}.project-list .project-head .project-switch .project-switch-button:before{content:"";position:absolute;top:0;left:0;width:50%;height:100%;z-index:0;color:#8bcf70;border-radius:6px;border:1px solid #8bcf70;background-color:rgba(139,207,112,0.1);transition:left 0.2s}.project-list .project-head .project-switch .project-switch-button>div{z-index:1;width:32px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:6px;cursor:pointer;color:#515a6e}.project-list .project-head .project-switch .project-switch-button>div>i{font-size:17px}.project-list .project-head .project-switch .project-switch-button>div:first-child{color:#8bcf70}.project-list .project-head .project-switch .project-switch-button.menu:before{left:50%}.project-list .project-head .project-switch .project-switch-button.menu>div:first-child{color:#515a6e}.project-list .project-head .project-switch .project-switch-button.menu>div:last-child{color:#8bcf70}.project-list .project-column{display:flex;height:100%;padding-top:18px;overflow-x:auto;overflow-y:hidden}.project-list .project-column>ul{display:inline-flex;justify-content:space-between;align-items:flex-start}.project-list .project-column>ul>li{flex-shrink:0;list-style:none;width:260px;height:100%;display:flex;flex-direction:column}.project-list .project-column>ul>li:first-child{margin-left:22px}.project-list .project-column>ul>li:last-child{margin-right:22px}.project-list .project-column>ul>li.add-column{height:36px;color:#888888;cursor:pointer;background-color:#F2F3F5;border-radius:4px}.project-list .project-column>ul>li.add-column .add-column-text{display:flex;flex-direction:row;align-items:center;line-height:36px;padding:0 12px}.project-list .project-column>ul>li.add-column .add-column-text>i{font-size:16px;padding-right:8px}.project-list .project-column>ul>li.add-column .add-column-text:hover{color:#777777}.project-list .project-column>ul>li.add-column .add-column-input{display:none;align-items:center;height:36px}.project-list .project-column>ul>li.add-column .add-column-input .ivu-input{height:36px;padding:4px 10px}.project-list .project-column>ul>li.add-column .add-column-input .ivu-input-icon{width:36px;height:36px;line-height:36px}.project-list .project-column>ul>li.add-column.show-input .add-column-text{display:none}.project-list .project-column>ul>li.add-column.show-input .add-column-input{display:flex}.project-list .project-column>ul>li .column-head{display:flex;align-items:center;padding:7px 10px;margin:0 10px;background-color:#F2F3F5;border-radius:4px}.project-list .project-column>ul>li .column-head .column-head-title{flex:1;width:0;display:flex;align-items:center;font-weight:500}.project-list .project-column>ul>li .column-head .column-head-title>span{font-size:15px}.project-list .project-column>ul>li .column-head .column-head-title>em{color:#888888;font-style:normal;font-size:14px;padding-left:6px}.project-list .project-column>ul>li .column-head .column-head-icon{display:flex;align-items:center;margin-left:16px}.project-list .project-column>ul>li .column-head .column-head-icon .loading,.project-list .project-column>ul>li .column-head .column-head-icon .ivu-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;padding-right:8px}.project-list .project-column>ul>li .column-head .column-head-icon .loading .common-loading,.project-list .project-column>ul>li .column-head .column-head-icon .ivu-icon .common-loading{width:16px;height:16px;margin:0}.project-list .project-column>ul>li .column-head .column-head-icon .ivu-icon{cursor:pointer;font-size:16px;color:#aaaaaa;font-weight:600;transition:color 0.3s}.project-list .project-column>ul>li .column-head .column-head-icon .ivu-icon:hover{color:#888888}.project-list .project-column>ul>li .column-head .column-head-icon .last{padding-right:0}.project-list .project-column>ul>li .column-head.custom-color{color:#ffffff}.project-list .project-column>ul>li .column-head.custom-color .column-head-title>em{color:rgba(255,255,255,0.6)}.project-list .project-column>ul>li .column-head.custom-color .ivu-icon{color:rgba(255,255,255,0.5)}.project-list .project-column>ul>li .column-head.custom-color .ivu-icon:hover{color:rgba(255,255,255,0.9)}.project-list .project-column>ul>li .column-task{flex:1;display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}.project-list .project-column>ul>li .column-task .task-list>div:last-child{margin-bottom:16px}.project-list .project-column>ul>li .column-task .task-item{cursor:pointer;margin:16px 10px 0;background-color:#ffffff;border-radius:12px;padding:12px;transition:box-shadow 0.3s, opacity 0.3s;position:relative}.project-list .project-column>ul>li .column-task .task-item:hover{box-shadow:0 0 10px #e6ecfa}.project-list .project-column>ul>li .column-task .task-item .task-head{display:flex;align-items:flex-start}.project-list .project-column>ul>li .column-task .task-item .task-head .task-title{flex:1;padding-top:1px}.project-list .project-column>ul>li .column-task .task-item .task-head .task-title>pre{margin:0;padding:0;line-height:1.5;white-space:pre-wrap;word-wrap:break-word}.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu{margin-left:8px;width:22px;height:22px}.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu .loading,.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu .ivu-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu .loading .common-loading,.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu .ivu-icon .common-loading{width:16px;height:16px;margin:0}.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu .ivu-icon{font-size:22px;color:#777777;cursor:pointer}.project-list .project-column>ul>li .column-task .task-item .task-head .task-menu .ivu-icon:hover{color:#555555}.project-list .project-column>ul>li .column-task .task-item .task-head.has-desc .task-title{font-weight:600}.project-list .project-column>ul>li .column-task .task-item .task-desc{color:#999999;margin-top:10px;line-height:20px;word-break:break-all}.project-list .project-column>ul>li .column-task .task-item .task-tags{margin-top:10px}.project-list .project-column>ul>li .column-task .task-item .task-users{margin-top:10px;display:flex;align-items:center}.project-list .project-column>ul>li .column-task .task-item .task-users>ul{flex:1;width:0;display:flex;align-items:center;overflow:auto;margin-right:24px}.project-list .project-column>ul>li .column-task .task-item .task-users>ul>li{list-style:none;margin-left:-6px;width:32px;height:32px}.project-list .project-column>ul>li .column-task .task-item .task-users>ul>li:first-child{margin-left:0}.project-list .project-column>ul>li .column-task .task-item .task-users>ul>li.no-owner{width:auto}.project-list .project-column>ul>li .column-task .task-item .task-users>ul>li.no-owner .ivu-btn-small{font-size:12px}.project-list .project-column>ul>li .column-task .task-item .task-users .task-icon{margin-left:6px;font-size:12px}.project-list .project-column>ul>li .column-task .task-item .task-users .task-icon .ivu-icon{margin-left:1px;font-size:14px}.project-list .project-column>ul>li .column-task .task-item .task-progress{margin-top:10px;display:flex;align-items:center;justify-content:flex-end}.project-list .project-column>ul>li .column-task .task-item .task-progress .task-sub-num{font-size:12px;margin-right:8px;color:#777777}.project-list .project-column>ul>li .column-task .task-item .task-progress .task-time{flex-shrink:0;color:#777777;background-color:#EAEDF2;padding:1px 4px;margin-left:18px;font-size:12px;border-radius:3px;display:flex;align-items:center}.project-list .project-column>ul>li .column-task .task-item .task-progress .task-time.overdue{font-weight:600;color:#ffffff;background-color:#ed4014}.project-list .project-column>ul>li .column-task .task-item .task-progress .task-time.today{font-weight:500;color:#ffffff;background-color:#ff9900}.project-list .project-column>ul>li .column-task .task-item .task-progress .task-time .iconfont{margin-right:3px;font-size:12px}.project-list .project-column>ul>li .column-task .task-item .priority-color{position:absolute;top:12px;left:0;width:3px;height:42px;max-height:50%;border-radius:2px}.project-list .project-column>ul>li .column-task .task-item.additem{cursor:default;padding:0}.project-list .project-column>ul>li .column-task .task-item.complete{opacity:0.5}.project-list .project-column>ul>li .column-task .task-item.complete:hover{opacity:0.8}.project-list .project-column>ul>li .column-task .task-item.complete .task-head .task-title{text-decoration:line-through}.project-list .project-column>ul>li .column-task .task-item.complete .task-desc,.project-list .project-column>ul>li .column-task .task-item.complete .task-tags,.project-list .project-column>ul>li .column-task .task-item.complete .task-users,.project-list .project-column>ul>li .column-task .task-item.complete .task-progress,.project-list .project-column>ul>li .column-task .task-item.complete .priority-color{display:none}.project-list .project-column>ul>li .column-task .task-item.hidden{display:none}.project-list .project-table{height:100%;margin-top:18px;overflow-x:hidden;overflow-y:auto}.project-list .project-table .task-row{background-color:#ffffff;border-bottom:1px solid #F4F4F5;position:relative}.project-list .project-table .task-row>div{display:flex;align-items:center;padding:8px 12px;border-right:1px solid #F4F4F5}.project-list .project-table .task-row>div:first-child{padding-left:32px}.project-list .project-table .task-row>div:last-child{border-right:0}.project-list .project-table .task-row>div.complete .item-title{color:#aaaaaa;text-decoration:line-through}.project-list .project-table .task-row .priority-color{position:absolute;top:0;left:0;bottom:-1px;width:3px}.project-list .project-table .project-table-head,.project-list .project-table .project-table-body{margin:0 32px 12px;border-radius:5px;border:1px solid #F4F4F5;border-bottom:0;overflow:hidden}.project-list .project-table .project-table-head.project-table-hide .task-rows,.project-list .project-table .project-table-body.project-table-hide .task-rows{display:none}.project-list .project-table .project-table-head.project-table-hide .row-title .iconfont,.project-list .project-table .project-table-body.project-table-hide .row-title .iconfont{transform:rotate(-90deg)}.project-list .project-table .project-table-head .task-row>div{color:#888888;font-size:13px;font-weight:500}.project-list .project-table .project-table-body{transition:box-shadow 0.3s}.project-list .project-table .project-table-body:hover{box-shadow:0 0 10px #e6ecfa}.project-list .project-table .project-table-body .task-row>div{padding:10px 12px}.project-list .project-table .project-table-body .task-row>div.row-title{font-size:14px;font-weight:500;color:#333333;padding-left:14px}.project-list .project-table .project-table-body .task-row>div.row-title .iconfont{cursor:pointer;transition:transform 0.3s;font-size:12px}.project-list .project-table .project-table-body .task-row>div.row-title .row-h1{padding-left:18px}.project-list .project-table .project-table-body .task-row>div.row-title .row-num{color:#999999;padding-left:6px}.project-list .project-table .project-table-body .task-row>div.row-name{align-items:flex-start;padding:12px 12px 12px 34px;line-height:24px}.project-list .project-table .project-table-body .task-row>div.row-name .drop-icon{position:relative}.project-list .project-table .project-table-body .task-row>div.row-name .loading{position:absolute;top:0;left:0;bottom:0;width:16px;display:flex;align-items:center;justify-content:center}.project-list .project-table .project-table-body .task-row>div.row-name .loading .common-loading{margin:0;width:14px;height:14px}.project-list .project-table .project-table-body .task-row>div.row-name .ivu-icon{cursor:pointer;font-size:16px;color:#cccccc}.project-list .project-table .project-table-body .task-row>div.row-name .ivu-icon.completed{color:#8bcf70}.project-list .project-table .project-table-body .task-row>div.row-name .ivu-icon.sub-icon{font-size:16px;width:16px;height:16px;margin-top:4px;margin-left:-20px;margin-right:4px;color:#cfcfcf;transition:transform 0.2s}.project-list .project-table .project-table-body .task-row>div.row-name .ivu-icon.sub-icon.active{transform:rotate(90deg)}.project-list .project-table .project-table-body .task-row>div.row-name .item-title{flex:1;padding:0 22px 0 8px;cursor:pointer}.project-list .project-table .project-table-body .task-row>div.row-name .item-icons{display:flex;align-items:center;margin-left:4px;flex-shrink:0}.project-list .project-table .project-table-body .task-row>div.row-name .item-icons .item-icon{display:flex;font-size:12px;margin-left:16px;color:#aaaaaa;cursor:pointer}.project-list .project-table .project-table-body .task-row>div.row-name .item-icons .item-icon .iconfont{font-size:12px}.project-list .project-table .project-table-body .task-row>div.row-name .item-icons .item-icon>em{font-style:normal;margin-left:4px}.project-list .project-table .project-table-body .task-row>div.row-column .task-column{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-list .project-table .project-table-body .task-row>div.row-priority .el-dropdown{display:flex;align-items:center;overflow:hidden}.project-list .project-table .project-table-body .task-row>div.row-user{padding:8px}.project-list .project-table .project-table-body .task-row>div.row-user>ul{height:32px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-list .project-table .project-table-body .task-row>div.row-user>ul>li{list-style:none;display:inline-block;margin-left:-6px}.project-list .project-table .project-table-body .task-row>div.row-user>ul>li:first-child{margin-left:0}.project-list .project-table .project-table-body .task-row>div.row-user>ul>li.no-owner{height:32px;display:flex;align-items:center}.project-list .project-table .project-table-body .task-row>div.row-time .task-time{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-list .project-table .project-table-body .task-row>div.row-time .task-time.overdue,.project-list .project-table .project-table-body .task-row>div.row-time .task-time.today{color:#ffffff;padding:1px 5px;font-size:13px;border-radius:3px}.project-list .project-table .project-table-body .task-row>div.row-time .task-time.overdue{font-weight:600;background-color:#ed4014}.project-list .project-table .project-table-body .task-row>div.row-time .task-time.today{font-weight:500;background-color:#ff9900}.project-list .project-table .project-table-body .task-rows .task-rows{position:relative;overflow:hidden}.project-list .project-table .project-table-body .task-rows .task-rows:before{content:"";position:absolute;top:0;left:0;right:0;box-shadow:rgba(0,0,0,0.08) 0 0 8px 1px;z-index:1}.project-list .project-table .project-table-body .task-rows .task-rows .task-row{background-color:#fcfcfd}.project-list .project-table .project-table-body .task-rows .task-rows .task-row>div.row-name{padding-left:56px}.project-list .project-table .project-table-body .task-rows .task-rows .task-row>div.row-name .item-title{color:#6C7D8C}.project-list .project-table .project-table-body .task-rows .task-rows .task-add-row{background-color:#fcfcfd}.project-list .project-table .project-table-body .task-rows .task-rows .task-add-row>div.row-add{padding-left:56px}.project-list-more-dropdown-menu>li .item{display:flex;align-items:center}.project-list-more-dropdown-menu>li .item>i{width:18px;height:18px;line-height:18px;font-size:18px;margin-right:8px;padding:0;color:#bbbbbb}.project-list-more-dropdown-menu>li .item>i.ivu-icon{font-size:16px}.project-log .logs-activity{position:relative;word-break:break-all;padding:12px 12px}.project-log .logs-activity>li{list-style:none;padding-top:0}.project-log .logs-activity>li.logs-loading,.project-log .logs-activity>li.logs-more,.project-log .logs-activity>li.logs-none{height:22px;line-height:22px}.project-log .logs-activity>li.logs-loading{display:flex}.project-log .logs-activity>li.logs-loading .common-loading{margin:0}.project-log .logs-activity>li.logs-more{cursor:pointer}.project-log .logs-activity>li.logs-more:hover{color:#048be0}.project-log .logs-activity>li.logs-none{cursor:pointer;color:#bbbbbb}.project-log .logs-activity>li .logs-date{color:rgba(0,0,0,0.36);padding-bottom:14px}.project-log .logs-activity>li .logs-section{margin:4px}.project-log .logs-activity>li .logs-section .ivu-timeline>li{padding-bottom:8px}.project-log .logs-activity>li .logs-section .ivu-timeline>li:last-child{padding-bottom:0}.project-log .logs-activity>li .logs-section .ivu-timeline>li .ivu-timeline-item-head-custom{margin-top:8px}.project-log .logs-activity>li .logs-dot{width:18px;height:18px;margin-left:10px}.project-log .logs-activity>li .logs-dot .avatar-box>em{transform-origin:bottom right}.project-log .logs-activity>li .log-summary>span,.project-log .logs-activity>li .log-summary>a{padding-right:6px;word-wrap:break-word;word-break:break-word}.project-log .logs-activity>li .log-summary .log-creator{color:rgba(0,0,0,0.85)}.project-log .logs-activity>li .log-summary .log-text{color:rgba(0,0,0,0.54)}.project-log .logs-activity>li .log-summary .log-time{color:rgba(0,0,0,0.3);font-size:12px}.project-management .project-name{line-height:1}.project-management .project-name .ivu-tag{height:18px;line-height:18px;padding:0 4px;margin:0 -2px 0 0;transform:scale(0.8);transform-origin:left bottom}.project-management .project-percent{line-height:1}.project-management .project-percent .ivu-progress{margin-top:2px}.task-add .task-add-form,.task-add .task-add-advanced{margin:0 0 -18px}.task-add .task-add-form .ivu-form-item-label,.task-add .task-add-advanced .ivu-form-item-label{font-weight:600}.task-add .task-add-form .teditor-box .tox-tinymce,.task-add .task-add-advanced .teditor-box .tox-tinymce{border-color:#e8e8e8}.task-add .task-add-form .teditor-box .tox .tox-statusbar,.task-add .task-add-form .teditor-box .tox .tox-menubar+.tox-toolbar,.task-add .task-add-form .teditor-box .tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary,.task-add .task-add-form .teditor-box .tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type),.task-add .task-add-advanced .teditor-box .tox .tox-statusbar,.task-add .task-add-advanced .teditor-box .tox .tox-menubar+.tox-toolbar,.task-add .task-add-advanced .teditor-box .tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary,.task-add .task-add-advanced .teditor-box .tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-color:#e8e8e8}.task-add .task-add-form .teditor-box .tox .tox-toolbar,.task-add .task-add-form .teditor-box .tox .tox-toolbar__overflow,.task-add .task-add-form .teditor-box .tox .tox-toolbar__primary,.task-add .task-add-advanced .teditor-box .tox .tox-toolbar,.task-add .task-add-advanced .teditor-box .tox .tox-toolbar__overflow,.task-add .task-add-advanced .teditor-box .tox .tox-toolbar__primary{background-image:none;border-bottom:1px solid #e8e8e8}.task-add .task-add-form .advanced-option,.task-add .task-add-advanced .advanced-option{margin-top:-6px;z-index:1;display:flex;align-items:center}.task-add .task-add-form .advanced-option>button,.task-add .task-add-advanced .advanced-option>button{transition:margin 0.2s}.task-add .task-add-form .advanced-option>button.advanced,.task-add .task-add-advanced .advanced-option>button.advanced{margin-left:22px}.task-add .task-add-form .advanced-option>button:focus,.task-add .task-add-advanced .advanced-option>button:focus{box-shadow:none}.task-add .task-add-form .advanced-option .advanced-priority,.task-add .task-add-advanced .advanced-option .advanced-priority{display:flex;align-items:center;margin-left:24px;height:34px}.task-add .task-add-form .advanced-option .advanced-priority>li,.task-add .task-add-advanced .advanced-option .advanced-priority>li{list-style:none;margin-left:3px}.task-add .task-add-form .advanced-option .advanced-priority>li .iconfont,.task-add .task-add-advanced .advanced-option .advanced-priority>li .iconfont{font-size:34px;cursor:pointer}.task-add .task-add-advanced{margin:1px 0 0;padding:34px 32px 6px;border-radius:8px;border:1px solid #e8e8e8}.task-add .task-add-advanced .subtasks{margin-bottom:24px;padding:12px 16px;border-radius:6px;background-color:#f8f8f8}.task-add .task-add-advanced .subtasks .enter-input.empty .ivu-input{background:transparent;border-color:transparent}.task-add .task-add-advanced .subtasks .enter-input.empty .ivu-input:hover,.task-add .task-add-advanced .subtasks .enter-input.empty .ivu-input:focus{box-shadow:none}.task-add .task-add-advanced .subtasks .sublist .ivu-row{margin-bottom:12px}.task-add .task-add-advanced .subtasks .sublist .ivu-row>div{padding-right:7px}.task-add .task-add-advanced .subtasks .sublist .ivu-row>div:last-child{padding-right:0}.task-add .task-add-advanced .ivu-date-picker{width:100%}.task-add-advanced-transfer .task-drop-prepend{text-align:center;color:#c5c8ce;line-height:20px;padding-bottom:5px;font-size:12px;border-bottom:1px solid #f1f1f1;margin-bottom:5px}.task-add-simple{padding:12px}.task-add-simple .ivu-input-wrapper{display:none}.task-add-simple .add-placeholder{cursor:pointer;color:#888888;margin:-12px;padding:12px}.task-add-simple .add-placeholder .ivu-icon{margin-right:4px}.task-add-simple .add-placeholder:hover{color:#666666}.task-add-simple .priority{display:none;align-items:center;min-height:22px;margin-top:10px;margin-bottom:-3px}.task-add-simple .priority>ul{flex:1;display:flex;align-items:center}.task-add-simple .priority>ul>li{list-style:none;margin-right:3px}.task-add-simple .priority>ul>li .iconfont{font-size:22px;cursor:pointer}.task-add-simple .priority .ivu-icon{cursor:pointer;font-size:16px}.task-add-simple.active .ivu-input-wrapper{display:block}.task-add-simple.active .add-placeholder{display:none}.task-add-simple.active .priority{display:flex}.task-add-row{background-color:#ffffff;border-bottom:1px solid #F4F4F5;position:relative}.task-add-row>div{display:flex;padding:8px 12px;border-right:1px solid #F4F4F5}.task-add-row>div:last-child{border-right:0}.task-add-row>div.row-add{display:flex;flex-direction:column;justify-content:center;min-height:48px;padding-left:34px}.task-add-row>div.row-add .add-btn{display:block;cursor:pointer;opacity:0.5;transition:opacity 0.3s}.task-add-row>div.row-add .add-btn .add-icon{font-size:16px;margin-right:8px}.task-add-row>div.row-add .add-btn:hover{opacity:1}.task-add-row>div.row-add .add-input{display:none;align-items:flex-start;border:1px solid #dcdee2;border-radius:4px;color:#515a6e;background-color:#fff}.task-add-row>div.row-add .add-input:hover{border-color:#57a3f3}.task-add-row>div.row-add .add-input textarea{border-color:transparent;resize:none}.task-add-row>div.row-add .add-input textarea:focus{box-shadow:none}.task-add-row>div.row-add .add-input .priority{margin:0 4px;display:flex;align-items:center;height:31px}.task-add-row>div.row-add .add-input .priority>ul{flex:1;display:flex;align-items:center}.task-add-row>div.row-add .add-input .priority>ul>li{list-style:none;margin-right:4px}.task-add-row>div.row-add .add-input .priority>ul>li .iconfont{font-size:17px;cursor:pointer}.task-add-row>div.row-add .add-input .priority .ivu-icon{cursor:pointer;font-size:15px;margin:0 5px 0 3px}.task-add-row>div.row-add.active{padding-top:7px;padding-bottom:7px}.task-add-row>div.row-add.active .add-btn{display:none}.task-add-row>div.row-add.active .add-input{display:flex}.task-detail{display:flex;flex-direction:column;margin:0 -10px 30px}.task-detail .task-info{flex:1;display:flex;flex-direction:column;position:relative}.task-detail .task-info .head{display:flex;align-items:center;height:40px;padding-bottom:10px;color:#888888;position:relative}.task-detail .task-info .head:before{content:"";position:absolute;left:36px;right:0;bottom:0;height:1px;background-color:#f4f5f5}.task-detail .task-info .head .icon{width:18px;font-size:18px;cursor:pointer}.task-detail .task-info .head .icon.completed{color:#8bcf70}.task-detail .task-info .head .nav{flex:1;display:flex;align-items:center;padding-left:18px;font-size:12px}.task-detail .task-info .head .nav>p{display:flex;align-items:center;padding-right:5px}.task-detail .task-info .head .nav>p:after{content:"/";padding-left:5px}.task-detail .task-info .head .nav>p:last-child:after{display:none}.task-detail .task-info .head .pick{margin-left:16px;margin-right:-16px}.task-detail .task-info .head .menu{font-size:22px;margin:0 32px;cursor:pointer}.task-detail .task-info .scroller{margin-left:36px;padding-right:36px;overflow-x:hidden;overflow-y:auto}.task-detail .task-info .scroller .title{margin-top:18px}.task-detail .task-info .scroller .title .ivu-input{font-weight:500;font-size:24px;padding:4px 0;line-height:1.4;resize:none;border-color:transparent}.task-detail .task-info .scroller .title .ivu-input:focus{box-shadow:none}.task-detail .task-info .scroller .desc{margin-top:10px}.task-detail .task-info .scroller .desc div[contenteditable="true"]{outline:none}.task-detail .task-info .scroller .desc .mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:#bbbbbb}.task-detail .task-info .scroller .items{margin-top:12px}.task-detail .task-info .scroller .items .ivu-form-item{margin-bottom:10px}.task-detail .task-info .scroller .items .item-label{display:flex;align-items:center;color:#bbbbbb}.task-detail .task-info .scroller .items .item-label .iconfont{margin-right:4px}.task-detail .task-info .scroller .items .item-content{margin-top:5px;margin-left:12px}.task-detail .task-info .scroller .items .item-content>li{display:flex;align-items:center;list-style:none;line-height:26px}.task-detail .task-info .scroller .items .item-content>li .el-dropdown{display:flex;cursor:pointer}.task-detail .task-info .scroller .items .item-content>li .task-priority{padding:0 7px}.task-detail .task-info .scroller .items .item-content>li .picker-time{display:flex;align-items:center;line-height:26px}.task-detail .task-info .scroller .items .item-content>li .picker-time .time{cursor:pointer}.task-detail .task-info .scroller .items .item-content>li .picker-time .ivu-tag{margin-left:10px;padding:0 4px;height:20px;line-height:18px}.task-detail .task-info .scroller .items .item-content>li .picker-time .ivu-tag .ivu-tag-text{display:flex;align-items:center}.task-detail .task-info .scroller .items .item-content>li .picker-time .ivu-tag .ivu-tag-text .iconfont{transform:scale(0.9);font-size:14px;padding-right:3px}.task-detail .task-info .scroller .items .item-content.user{margin-top:1px;cursor:pointer}.task-detail .task-info .scroller .items .item-content.user .user-list>div{display:inline-block;margin-right:6px}.task-detail .task-info .scroller .items .item-content.file{margin-bottom:-3px}.task-detail .task-info .scroller .items .item-content.file>li{margin-bottom:2px}.task-detail .task-info .scroller .items .item-content.file>li .file-load{margin:0;padding:2px;width:16px;height:16px}.task-detail .task-info .scroller .items .item-content.file>li .file-ext{width:16px}.task-detail .task-info .scroller .items .item-content.file>li .file-name{color:#515a6e;padding-left:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-detail .task-info .scroller .items .item-content.file>li .file-name:hover{color:#8bcf70}.task-detail .task-info .scroller .items .item-content.file>li .file-size{flex-shrink:0;padding-left:10px;height:24px;font-size:12px;color:#bbbbbb}.task-detail .task-info .scroller .items .item-content.file>li .file-delete{padding-left:12px}.task-detail .task-info .scroller .items .item-content.file>li .file-delete .iconfont{display:none;font-size:14px;color:#aaaaaa;transition:color 0.3s;cursor:pointer}.task-detail .task-info .scroller .items .item-content.file>li .file-delete .iconfont:hover{color:#ff0000}.task-detail .task-info .scroller .items .item-content.file>li .file-delete .iconfont.deling{display:inline-block}.task-detail .task-info .scroller .items .item-content.file>li:hover .file-delete .iconfont{display:inline-block}.task-detail .task-info .scroller .items .item-content.subtask>li{align-items:flex-start;margin-bottom:4px}.task-detail .task-info .scroller .items .item-content.subtask>li:last-child{margin-bottom:-6px}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-icon{width:16px;height:26px;line-height:26px;margin-right:6px;cursor:pointer}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-icon .loading{width:16px;height:16px;margin:0;padding:2px}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-icon .ivu-icon{font-size:16px;color:#cccccc}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-icon .ivu-icon.completed{color:#8bcf70}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-icon.sub-icon{font-size:16px;width:16px;height:16px;margin-left:-20px;margin-right:4px;color:#cfcfcf;transition:transform 0.2s}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-icon.sub-icon.active{transform:rotate(90deg)}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-name{flex:1;margin-right:16px;display:flex}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-name .ivu-input{margin:-2px 0;padding:4px 0;resize:none;border-color:transparent;line-height:20px}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-name .ivu-input:focus{box-shadow:none}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-time{margin-right:8px}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-time .time{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;height:26px;line-height:26px;cursor:pointer}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-time .time.overdue{font-weight:600;color:#ed4014}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-time .time.today{font-weight:500;color:#ff9900}.task-detail .task-info .scroller .items .item-content.subtask>li .subtask-avatar{height:26px;line-height:26px;cursor:pointer}.task-detail .task-info .scroller .items .item-content.subtask>li .ivu-icon-ios-loading{animation:icon-loading-load 0.6s infinite linear}.task-detail .task-info .scroller .items .item-content.nosub{margin-top:0}.task-detail .task-info .scroller .items .item-content.nosub>li .add-input,.task-detail .task-info .scroller .items .item-content.nosub>li .add-button{margin-top:-2px}.task-detail .task-info .scroller .add{margin-top:12px;margin-bottom:10px}.task-detail .task-info .scroller .add-input{margin-top:6px}.task-detail .task-info .scroller .add-button{cursor:pointer;color:#bbbbbb;display:flex;align-items:center;margin-top:6px;height:32px}.task-detail .task-info .scroller .add-button>i{font-size:14px;padding-right:8px}.task-detail .task-info .scroller .add-button>em{font-style:normal;padding-left:4px}.task-detail .task-info .scroller .add-button>em:after{content:"/";padding-left:4px}.task-detail .task-info .scroller .add-button>em:last-child:after{display:none}.task-detail .task-info .scroller .add-button:hover{color:#999999}.task-detail .task-info .upload{display:none}.task-detail .task-dialog{flex:1;display:flex;flex-direction:column;margin-top:22px;position:relative}.task-detail .task-dialog .head{display:flex;align-items:center;height:40px;padding-bottom:10px;color:#888888;position:relative}.task-detail .task-dialog .head:before{content:"";position:absolute;left:36px;right:0;bottom:0;height:1px;background-color:#f4f5f5}.task-detail .task-dialog .head .icon{width:18px;font-size:18px}.task-detail .task-dialog .head .nav{flex:1;display:flex;align-items:center;padding-left:18px;font-weight:500;color:#666666}.task-detail .task-dialog .head .nav>p{display:flex;align-items:center;margin-right:24px;cursor:pointer}.task-detail .task-dialog .head .nav>p.active{margin-top:-2px;font-size:16px;font-weight:600;color:#555555;cursor:default}.task-detail .task-dialog .no-dialog{flex:1;display:flex;flex-direction:column}.task-detail .task-dialog .no-dialog .no-tip{flex:1;display:none;margin-left:36px}.task-detail .task-dialog .no-dialog .no-input{margin:32px 0 0 36px;background-color:#F4F5F7;padding:10px 12px;border-radius:10px}.task-detail .task-dialog .no-dialog .no-input .ivu-input{border:0;resize:none;background-color:transparent}.task-detail .task-dialog .no-dialog .no-input .ivu-input:focus{box-shadow:none}.task-detail .task-dialog .project-log{margin-left:36px}.task-detail .task-dialog .project-log .logs-activity{padding:22px 0 0}.task-detail .task-dialog .project-log .logs-activity>li{list-style:none;padding-top:0}.task-detail .task-dialog .project-log .logs-activity>li.logs-loading,.task-detail .task-dialog .project-log .logs-activity>li.logs-more,.task-detail .task-dialog .project-log .logs-activity>li.logs-none{height:59px;line-height:59px}.task-detail .task-dialog .project-log .logs-activity>li.logs-loading{display:flex;align-items:center}.task-detail .task-dialog .project-log .logs-activity>li.logs-loading .common-loading{width:22px;height:22px;margin:0}.task-detail .task-dialog .dialog-wrapper .dialog-scroller{padding:0 16px 0 32px}.task-detail .task-dialog .dialog-wrapper .dialog-footer{padding:0 14px 0 28px}.task-detail.open-dialog{flex-direction:row}.task-detail.open-dialog .task-info{overflow:auto}.task-detail.open-dialog .task-info .head .menu{margin:0 2px}.task-detail.open-dialog .task-dialog{margin:0 0 0 18px;min-width:320px;max-width:450px}.task-detail.open-dialog .task-dialog:before{content:"";position:absolute;top:0;left:0;bottom:0;z-index:1;width:1px;background-color:#f4f5f5}.task-detail.open-dialog .task-dialog .head:before{left:18px}.task-detail.open-dialog .task-dialog .head .icon:before{display:none}.task-detail.open-dialog .task-dialog .head .nav{padding-left:0}.task-detail.open-dialog .task-dialog .head .nav>p{margin-right:28px}.task-detail.open-dialog .task-dialog .head .nav>p.active{font-size:18px}.task-detail.open-dialog .task-dialog .no-dialog .no-tip{display:flex;align-items:center;justify-content:center;margin-left:18px;color:#999999}.task-detail.open-dialog .task-dialog .no-dialog .no-input{margin:0 0 0 18px}.task-detail.open-dialog .task-dialog .dialog-wrapper{z-index:0}.task-detail.open-dialog .task-dialog .dialog-wrapper .dialog-footer{margin-bottom:0}.task-detail.open-dialog .task-dialog .project-log{position:absolute;top:40px;left:0;right:0;bottom:0;z-index:1;padding:8px 8px;margin-left:8px;background-color:#ffffff;overflow:auto}.task-detail.open-dialog .task-dialog .project-log .logs-activity{padding:22px 0 0 10px}.task-detail.completed .task-info:before{content:"\f373";font-family:Ionicons, serif;pointer-events:none;position:absolute;top:0;right:13%;font-size:72px;color:#19be6b;opacity:.2;z-index:1}.task-detail-delete-file-popover{max-width:200px}.task-detail-delete-file-popover .buttons{text-align:right;margin-top:12px}.task-detail-delete-file-popover .buttons .ivu-btn-small{font-size:12px}.task-detail-avatar-buttons{margin-top:12px;margin-bottom:4px;text-align:right;position:absolute;top:5px;right:14px}.task-detail-avatar-buttons>button{font-size:12px;transform:scale(0.9)}.task-priority{font-size:13px;display:inline-block;padding:2px 6px;border-radius:3px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.team-management .team-email{line-height:1}.team-management .team-email .ivu-tag{height:18px;line-height:18px;padding:0 4px;margin:0 -2px 0 0;transform:scale(0.8);transform-origin:left bottom} + diff --git a/public/css/fonts/ionicons.svg b/public/css/fonts/ionicons.svg new file mode 100755 index 000000000..d8812552f --- /dev/null +++ b/public/css/fonts/ionicons.svg @@ -0,0 +1,870 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/css/fonts/ionicons.ttf b/public/css/fonts/ionicons.ttf new file mode 100755 index 000000000..1caa214a3 Binary files /dev/null and b/public/css/fonts/ionicons.ttf differ diff --git a/public/css/fonts/ionicons.woff b/public/css/fonts/ionicons.woff new file mode 100755 index 000000000..c909e51cf Binary files /dev/null and b/public/css/fonts/ionicons.woff differ diff --git a/public/css/fonts/ionicons.woff2 b/public/css/fonts/ionicons.woff2 new file mode 100644 index 000000000..1d6d9c564 Binary files /dev/null and b/public/css/fonts/ionicons.woff2 differ diff --git a/resources/assets/statics/public/fonts/zenicon.woff2 b/public/css/fonts/zenicon.woff2 similarity index 100% rename from resources/assets/statics/public/fonts/zenicon.woff2 rename to public/css/fonts/zenicon.woff2 diff --git a/public/css/iview.css b/public/css/iview.css new file mode 100644 index 000000000..3cbec471e --- /dev/null +++ b/public/css/iview.css @@ -0,0 +1 @@ +.ivu-load-loop{-webkit-animation:ani-load-loop 1s linear infinite;animation:ani-load-loop 1s linear infinite}@-webkit-keyframes ani-load-loop{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes ani-load-loop{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.input-group-error-append,.input-group-error-prepend{background-color:#fff;border:1px solid #ed4014}.input-group-error-append .ivu-select-selection,.input-group-error-prepend .ivu-select-selection{background-color:inherit;border:1px solid transparent}.input-group-error-prepend{border-right:0}.input-group-error-append{border-left:0}/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}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{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}body{font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;font-size:14px;line-height:1.5;color:#515a6e;background-color:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article,aside,blockquote,body,button,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}input::-ms-clear,input::-ms-reveal{display:none}a{color:#8bcf70;background:0 0;text-decoration:none;outline:0;cursor:pointer;-webkit-transition:color .2s ease;transition:color .2s ease}a:hover{color:#57a3f3}a:active{color:#2b85e4}a:active,a:hover{outline:0;text-decoration:none}a[disabled]{color:#ccc;cursor:not-allowed;pointer-events:none}code,kbd,pre,samp{font-family:Consolas,Menlo,Courier,monospace}@font-face{font-family:Ionicons;src:url(fonts/ionicons.woff2?v=3.0.0) format("woff2"),url(fonts/ionicons.woff?v=3.0.0) format("woff"),url(fonts/ionicons.ttf?v=3.0.0) format("truetype"),url(fonts/ionicons.svg?v=3.0.0#Ionicons) format("svg");font-weight:400;font-style:normal}.ivu-icon{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:optimizeLegibility;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:-.125em;text-align:center}.ivu-icon-ios-add-circle-outline:before{content:"\f100"}.ivu-icon-ios-add-circle:before{content:"\f101"}.ivu-icon-ios-add:before{content:"\f102"}.ivu-icon-ios-alarm-outline:before{content:"\f103"}.ivu-icon-ios-alarm:before{content:"\f104"}.ivu-icon-ios-albums-outline:before{content:"\f105"}.ivu-icon-ios-albums:before{content:"\f106"}.ivu-icon-ios-alert-outline:before{content:"\f107"}.ivu-icon-ios-alert:before{content:"\f108"}.ivu-icon-ios-american-football-outline:before{content:"\f109"}.ivu-icon-ios-american-football:before{content:"\f10a"}.ivu-icon-ios-analytics-outline:before{content:"\f10b"}.ivu-icon-ios-analytics:before{content:"\f10c"}.ivu-icon-ios-aperture-outline:before{content:"\f10d"}.ivu-icon-ios-aperture:before{content:"\f10e"}.ivu-icon-ios-apps-outline:before{content:"\f10f"}.ivu-icon-ios-apps:before{content:"\f110"}.ivu-icon-ios-appstore-outline:before{content:"\f111"}.ivu-icon-ios-appstore:before{content:"\f112"}.ivu-icon-ios-archive-outline:before{content:"\f113"}.ivu-icon-ios-archive:before{content:"\f114"}.ivu-icon-ios-arrow-back:before{content:"\f115"}.ivu-icon-ios-arrow-down:before{content:"\f116"}.ivu-icon-ios-arrow-dropdown-circle:before{content:"\f117"}.ivu-icon-ios-arrow-dropdown:before{content:"\f118"}.ivu-icon-ios-arrow-dropleft-circle:before{content:"\f119"}.ivu-icon-ios-arrow-dropleft:before{content:"\f11a"}.ivu-icon-ios-arrow-dropright-circle:before{content:"\f11b"}.ivu-icon-ios-arrow-dropright:before{content:"\f11c"}.ivu-icon-ios-arrow-dropup-circle:before{content:"\f11d"}.ivu-icon-ios-arrow-dropup:before{content:"\f11e"}.ivu-icon-ios-arrow-forward:before{content:"\f11f"}.ivu-icon-ios-arrow-round-back:before{content:"\f120"}.ivu-icon-ios-arrow-round-down:before{content:"\f121"}.ivu-icon-ios-arrow-round-forward:before{content:"\f122"}.ivu-icon-ios-arrow-round-up:before{content:"\f123"}.ivu-icon-ios-arrow-up:before{content:"\f124"}.ivu-icon-ios-at-outline:before{content:"\f125"}.ivu-icon-ios-at:before{content:"\f126"}.ivu-icon-ios-attach:before{content:"\f127"}.ivu-icon-ios-backspace-outline:before{content:"\f128"}.ivu-icon-ios-backspace:before{content:"\f129"}.ivu-icon-ios-barcode-outline:before{content:"\f12a"}.ivu-icon-ios-barcode:before{content:"\f12b"}.ivu-icon-ios-baseball-outline:before{content:"\f12c"}.ivu-icon-ios-baseball:before{content:"\f12d"}.ivu-icon-ios-basket-outline:before{content:"\f12e"}.ivu-icon-ios-basket:before{content:"\f12f"}.ivu-icon-ios-basketball-outline:before{content:"\f130"}.ivu-icon-ios-basketball:before{content:"\f131"}.ivu-icon-ios-battery-charging:before{content:"\f132"}.ivu-icon-ios-battery-dead:before{content:"\f133"}.ivu-icon-ios-battery-full:before{content:"\f134"}.ivu-icon-ios-beaker-outline:before{content:"\f135"}.ivu-icon-ios-beaker:before{content:"\f136"}.ivu-icon-ios-beer-outline:before{content:"\f137"}.ivu-icon-ios-beer:before{content:"\f138"}.ivu-icon-ios-bicycle:before{content:"\f139"}.ivu-icon-ios-bluetooth:before{content:"\f13a"}.ivu-icon-ios-boat-outline:before{content:"\f13b"}.ivu-icon-ios-boat:before{content:"\f13c"}.ivu-icon-ios-body-outline:before{content:"\f13d"}.ivu-icon-ios-body:before{content:"\f13e"}.ivu-icon-ios-bonfire-outline:before{content:"\f13f"}.ivu-icon-ios-bonfire:before{content:"\f140"}.ivu-icon-ios-book-outline:before{content:"\f141"}.ivu-icon-ios-book:before{content:"\f142"}.ivu-icon-ios-bookmark-outline:before{content:"\f143"}.ivu-icon-ios-bookmark:before{content:"\f144"}.ivu-icon-ios-bookmarks-outline:before{content:"\f145"}.ivu-icon-ios-bookmarks:before{content:"\f146"}.ivu-icon-ios-bowtie-outline:before{content:"\f147"}.ivu-icon-ios-bowtie:before{content:"\f148"}.ivu-icon-ios-briefcase-outline:before{content:"\f149"}.ivu-icon-ios-briefcase:before{content:"\f14a"}.ivu-icon-ios-browsers-outline:before{content:"\f14b"}.ivu-icon-ios-browsers:before{content:"\f14c"}.ivu-icon-ios-brush-outline:before{content:"\f14d"}.ivu-icon-ios-brush:before{content:"\f14e"}.ivu-icon-ios-bug-outline:before{content:"\f14f"}.ivu-icon-ios-bug:before{content:"\f150"}.ivu-icon-ios-build-outline:before{content:"\f151"}.ivu-icon-ios-build:before{content:"\f152"}.ivu-icon-ios-bulb-outline:before{content:"\f153"}.ivu-icon-ios-bulb:before{content:"\f154"}.ivu-icon-ios-bus-outline:before{content:"\f155"}.ivu-icon-ios-bus:before{content:"\f156"}.ivu-icon-ios-cafe-outline:before{content:"\f157"}.ivu-icon-ios-cafe:before{content:"\f158"}.ivu-icon-ios-calculator-outline:before{content:"\f159"}.ivu-icon-ios-calculator:before{content:"\f15a"}.ivu-icon-ios-calendar-outline:before{content:"\f15b"}.ivu-icon-ios-calendar:before{content:"\f15c"}.ivu-icon-ios-call-outline:before{content:"\f15d"}.ivu-icon-ios-call:before{content:"\f15e"}.ivu-icon-ios-camera-outline:before{content:"\f15f"}.ivu-icon-ios-camera:before{content:"\f160"}.ivu-icon-ios-car-outline:before{content:"\f161"}.ivu-icon-ios-car:before{content:"\f162"}.ivu-icon-ios-card-outline:before{content:"\f163"}.ivu-icon-ios-card:before{content:"\f164"}.ivu-icon-ios-cart-outline:before{content:"\f165"}.ivu-icon-ios-cart:before{content:"\f166"}.ivu-icon-ios-cash-outline:before{content:"\f167"}.ivu-icon-ios-cash:before{content:"\f168"}.ivu-icon-ios-chatboxes-outline:before{content:"\f169"}.ivu-icon-ios-chatboxes:before{content:"\f16a"}.ivu-icon-ios-chatbubbles-outline:before{content:"\f16b"}.ivu-icon-ios-chatbubbles:before{content:"\f16c"}.ivu-icon-ios-checkbox-outline:before{content:"\f16d"}.ivu-icon-ios-checkbox:before{content:"\f16e"}.ivu-icon-ios-checkmark-circle-outline:before{content:"\f16f"}.ivu-icon-ios-checkmark-circle:before{content:"\f170"}.ivu-icon-ios-checkmark:before{content:"\f171"}.ivu-icon-ios-clipboard-outline:before{content:"\f172"}.ivu-icon-ios-clipboard:before{content:"\f173"}.ivu-icon-ios-clock-outline:before{content:"\f174"}.ivu-icon-ios-clock:before{content:"\f175"}.ivu-icon-ios-close-circle-outline:before{content:"\f176"}.ivu-icon-ios-close-circle:before{content:"\f177"}.ivu-icon-ios-close:before{content:"\f178"}.ivu-icon-ios-closed-captioning-outline:before{content:"\f179"}.ivu-icon-ios-closed-captioning:before{content:"\f17a"}.ivu-icon-ios-cloud-circle-outline:before{content:"\f17b"}.ivu-icon-ios-cloud-circle:before{content:"\f17c"}.ivu-icon-ios-cloud-done-outline:before{content:"\f17d"}.ivu-icon-ios-cloud-done:before{content:"\f17e"}.ivu-icon-ios-cloud-download-outline:before{content:"\f17f"}.ivu-icon-ios-cloud-download:before{content:"\f180"}.ivu-icon-ios-cloud-outline:before{content:"\f181"}.ivu-icon-ios-cloud-upload-outline:before{content:"\f182"}.ivu-icon-ios-cloud-upload:before{content:"\f183"}.ivu-icon-ios-cloud:before{content:"\f184"}.ivu-icon-ios-cloudy-night-outline:before{content:"\f185"}.ivu-icon-ios-cloudy-night:before{content:"\f186"}.ivu-icon-ios-cloudy-outline:before{content:"\f187"}.ivu-icon-ios-cloudy:before{content:"\f188"}.ivu-icon-ios-code-download:before{content:"\f189"}.ivu-icon-ios-code-working:before{content:"\f18a"}.ivu-icon-ios-code:before{content:"\f18b"}.ivu-icon-ios-cog-outline:before{content:"\f18c"}.ivu-icon-ios-cog:before{content:"\f18d"}.ivu-icon-ios-color-fill-outline:before{content:"\f18e"}.ivu-icon-ios-color-fill:before{content:"\f18f"}.ivu-icon-ios-color-filter-outline:before{content:"\f190"}.ivu-icon-ios-color-filter:before{content:"\f191"}.ivu-icon-ios-color-palette-outline:before{content:"\f192"}.ivu-icon-ios-color-palette:before{content:"\f193"}.ivu-icon-ios-color-wand-outline:before{content:"\f194"}.ivu-icon-ios-color-wand:before{content:"\f195"}.ivu-icon-ios-compass-outline:before{content:"\f196"}.ivu-icon-ios-compass:before{content:"\f197"}.ivu-icon-ios-construct-outline:before{content:"\f198"}.ivu-icon-ios-construct:before{content:"\f199"}.ivu-icon-ios-contact-outline:before{content:"\f19a"}.ivu-icon-ios-contact:before{content:"\f19b"}.ivu-icon-ios-contacts-outline:before{content:"\f19c"}.ivu-icon-ios-contacts:before{content:"\f19d"}.ivu-icon-ios-contract:before{content:"\f19e"}.ivu-icon-ios-contrast:before{content:"\f19f"}.ivu-icon-ios-copy-outline:before{content:"\f1a0"}.ivu-icon-ios-copy:before{content:"\f1a1"}.ivu-icon-ios-create-outline:before{content:"\f1a2"}.ivu-icon-ios-create:before{content:"\f1a3"}.ivu-icon-ios-crop-outline:before{content:"\f1a4"}.ivu-icon-ios-crop:before{content:"\f1a5"}.ivu-icon-ios-cube-outline:before{content:"\f1a6"}.ivu-icon-ios-cube:before{content:"\f1a7"}.ivu-icon-ios-cut-outline:before{content:"\f1a8"}.ivu-icon-ios-cut:before{content:"\f1a9"}.ivu-icon-ios-desktop-outline:before{content:"\f1aa"}.ivu-icon-ios-desktop:before{content:"\f1ab"}.ivu-icon-ios-disc-outline:before{content:"\f1ac"}.ivu-icon-ios-disc:before{content:"\f1ad"}.ivu-icon-ios-document-outline:before{content:"\f1ae"}.ivu-icon-ios-document:before{content:"\f1af"}.ivu-icon-ios-done-all:before{content:"\f1b0"}.ivu-icon-ios-download-outline:before{content:"\f1b1"}.ivu-icon-ios-download:before{content:"\f1b2"}.ivu-icon-ios-easel-outline:before{content:"\f1b3"}.ivu-icon-ios-easel:before{content:"\f1b4"}.ivu-icon-ios-egg-outline:before{content:"\f1b5"}.ivu-icon-ios-egg:before{content:"\f1b6"}.ivu-icon-ios-exit-outline:before{content:"\f1b7"}.ivu-icon-ios-exit:before{content:"\f1b8"}.ivu-icon-ios-expand:before{content:"\f1b9"}.ivu-icon-ios-eye-off-outline:before{content:"\f1ba"}.ivu-icon-ios-eye-off:before{content:"\f1bb"}.ivu-icon-ios-eye-outline:before{content:"\f1bc"}.ivu-icon-ios-eye:before{content:"\f1bd"}.ivu-icon-ios-fastforward-outline:before{content:"\f1be"}.ivu-icon-ios-fastforward:before{content:"\f1bf"}.ivu-icon-ios-female:before{content:"\f1c0"}.ivu-icon-ios-filing-outline:before{content:"\f1c1"}.ivu-icon-ios-filing:before{content:"\f1c2"}.ivu-icon-ios-film-outline:before{content:"\f1c3"}.ivu-icon-ios-film:before{content:"\f1c4"}.ivu-icon-ios-finger-print:before{content:"\f1c5"}.ivu-icon-ios-flag-outline:before{content:"\f1c6"}.ivu-icon-ios-flag:before{content:"\f1c7"}.ivu-icon-ios-flame-outline:before{content:"\f1c8"}.ivu-icon-ios-flame:before{content:"\f1c9"}.ivu-icon-ios-flash-outline:before{content:"\f1ca"}.ivu-icon-ios-flash:before{content:"\f1cb"}.ivu-icon-ios-flask-outline:before{content:"\f1cc"}.ivu-icon-ios-flask:before{content:"\f1cd"}.ivu-icon-ios-flower-outline:before{content:"\f1ce"}.ivu-icon-ios-flower:before{content:"\f1cf"}.ivu-icon-ios-folder-open-outline:before{content:"\f1d0"}.ivu-icon-ios-folder-open:before{content:"\f1d1"}.ivu-icon-ios-folder-outline:before{content:"\f1d2"}.ivu-icon-ios-folder:before{content:"\f1d3"}.ivu-icon-ios-football-outline:before{content:"\f1d4"}.ivu-icon-ios-football:before{content:"\f1d5"}.ivu-icon-ios-funnel-outline:before{content:"\f1d6"}.ivu-icon-ios-funnel:before{content:"\f1d7"}.ivu-icon-ios-game-controller-a-outline:before{content:"\f1d8"}.ivu-icon-ios-game-controller-a:before{content:"\f1d9"}.ivu-icon-ios-game-controller-b-outline:before{content:"\f1da"}.ivu-icon-ios-game-controller-b:before{content:"\f1db"}.ivu-icon-ios-git-branch:before{content:"\f1dc"}.ivu-icon-ios-git-commit:before{content:"\f1dd"}.ivu-icon-ios-git-compare:before{content:"\f1de"}.ivu-icon-ios-git-merge:before{content:"\f1df"}.ivu-icon-ios-git-network:before{content:"\f1e0"}.ivu-icon-ios-git-pull-request:before{content:"\f1e1"}.ivu-icon-ios-glasses-outline:before{content:"\f1e2"}.ivu-icon-ios-glasses:before{content:"\f1e3"}.ivu-icon-ios-globe-outline:before{content:"\f1e4"}.ivu-icon-ios-globe:before{content:"\f1e5"}.ivu-icon-ios-grid-outline:before{content:"\f1e6"}.ivu-icon-ios-grid:before{content:"\f1e7"}.ivu-icon-ios-hammer-outline:before{content:"\f1e8"}.ivu-icon-ios-hammer:before{content:"\f1e9"}.ivu-icon-ios-hand-outline:before{content:"\f1ea"}.ivu-icon-ios-hand:before{content:"\f1eb"}.ivu-icon-ios-happy-outline:before{content:"\f1ec"}.ivu-icon-ios-happy:before{content:"\f1ed"}.ivu-icon-ios-headset-outline:before{content:"\f1ee"}.ivu-icon-ios-headset:before{content:"\f1ef"}.ivu-icon-ios-heart-outline:before{content:"\f1f0"}.ivu-icon-ios-heart:before{content:"\f1f1"}.ivu-icon-ios-help-buoy-outline:before{content:"\f1f2"}.ivu-icon-ios-help-buoy:before{content:"\f1f3"}.ivu-icon-ios-help-circle-outline:before{content:"\f1f4"}.ivu-icon-ios-help-circle:before{content:"\f1f5"}.ivu-icon-ios-help:before{content:"\f1f6"}.ivu-icon-ios-home-outline:before{content:"\f1f7"}.ivu-icon-ios-home:before{content:"\f1f8"}.ivu-icon-ios-ice-cream-outline:before{content:"\f1f9"}.ivu-icon-ios-ice-cream:before{content:"\f1fa"}.ivu-icon-ios-image-outline:before{content:"\f1fb"}.ivu-icon-ios-image:before{content:"\f1fc"}.ivu-icon-ios-images-outline:before{content:"\f1fd"}.ivu-icon-ios-images:before{content:"\f1fe"}.ivu-icon-ios-infinite-outline:before{content:"\f1ff"}.ivu-icon-ios-infinite:before{content:"\f200"}.ivu-icon-ios-information-circle-outline:before{content:"\f201"}.ivu-icon-ios-information-circle:before{content:"\f202"}.ivu-icon-ios-information:before{content:"\f203"}.ivu-icon-ios-ionic-outline:before{content:"\f204"}.ivu-icon-ios-ionic:before{content:"\f205"}.ivu-icon-ios-ionitron-outline:before{content:"\f206"}.ivu-icon-ios-ionitron:before{content:"\f207"}.ivu-icon-ios-jet-outline:before{content:"\f208"}.ivu-icon-ios-jet:before{content:"\f209"}.ivu-icon-ios-key-outline:before{content:"\f20a"}.ivu-icon-ios-key:before{content:"\f20b"}.ivu-icon-ios-keypad-outline:before{content:"\f20c"}.ivu-icon-ios-keypad:before{content:"\f20d"}.ivu-icon-ios-laptop:before{content:"\f20e"}.ivu-icon-ios-leaf-outline:before{content:"\f20f"}.ivu-icon-ios-leaf:before{content:"\f210"}.ivu-icon-ios-link-outline:before{content:"\f211"}.ivu-icon-ios-link:before{content:"\f212"}.ivu-icon-ios-list-box-outline:before{content:"\f213"}.ivu-icon-ios-list-box:before{content:"\f214"}.ivu-icon-ios-list:before{content:"\f215"}.ivu-icon-ios-locate-outline:before{content:"\f216"}.ivu-icon-ios-locate:before{content:"\f217"}.ivu-icon-ios-lock-outline:before{content:"\f218"}.ivu-icon-ios-lock:before{content:"\f219"}.ivu-icon-ios-log-in:before{content:"\f21a"}.ivu-icon-ios-log-out:before{content:"\f21b"}.ivu-icon-ios-magnet-outline:before{content:"\f21c"}.ivu-icon-ios-magnet:before{content:"\f21d"}.ivu-icon-ios-mail-open-outline:before{content:"\f21e"}.ivu-icon-ios-mail-open:before{content:"\f21f"}.ivu-icon-ios-mail-outline:before{content:"\f220"}.ivu-icon-ios-mail:before{content:"\f221"}.ivu-icon-ios-male:before{content:"\f222"}.ivu-icon-ios-man-outline:before{content:"\f223"}.ivu-icon-ios-man:before{content:"\f224"}.ivu-icon-ios-map-outline:before{content:"\f225"}.ivu-icon-ios-map:before{content:"\f226"}.ivu-icon-ios-medal-outline:before{content:"\f227"}.ivu-icon-ios-medal:before{content:"\f228"}.ivu-icon-ios-medical-outline:before{content:"\f229"}.ivu-icon-ios-medical:before{content:"\f22a"}.ivu-icon-ios-medkit-outline:before{content:"\f22b"}.ivu-icon-ios-medkit:before{content:"\f22c"}.ivu-icon-ios-megaphone-outline:before{content:"\f22d"}.ivu-icon-ios-megaphone:before{content:"\f22e"}.ivu-icon-ios-menu-outline:before{content:"\f22f"}.ivu-icon-ios-menu:before{content:"\f230"}.ivu-icon-ios-mic-off-outline:before{content:"\f231"}.ivu-icon-ios-mic-off:before{content:"\f232"}.ivu-icon-ios-mic-outline:before{content:"\f233"}.ivu-icon-ios-mic:before{content:"\f234"}.ivu-icon-ios-microphone-outline:before{content:"\f235"}.ivu-icon-ios-microphone:before{content:"\f236"}.ivu-icon-ios-moon-outline:before{content:"\f237"}.ivu-icon-ios-moon:before{content:"\f238"}.ivu-icon-ios-more-outline:before{content:"\f239"}.ivu-icon-ios-more:before{content:"\f23a"}.ivu-icon-ios-move:before{content:"\f23b"}.ivu-icon-ios-musical-note-outline:before{content:"\f23c"}.ivu-icon-ios-musical-note:before{content:"\f23d"}.ivu-icon-ios-musical-notes-outline:before{content:"\f23e"}.ivu-icon-ios-musical-notes:before{content:"\f23f"}.ivu-icon-ios-navigate-outline:before{content:"\f240"}.ivu-icon-ios-navigate:before{content:"\f241"}.ivu-icon-ios-no-smoking-outline:before{content:"\f242"}.ivu-icon-ios-no-smoking:before{content:"\f243"}.ivu-icon-ios-notifications-off-outline:before{content:"\f244"}.ivu-icon-ios-notifications-off:before{content:"\f245"}.ivu-icon-ios-notifications-outline:before{content:"\f246"}.ivu-icon-ios-notifications:before{content:"\f247"}.ivu-icon-ios-nuclear-outline:before{content:"\f248"}.ivu-icon-ios-nuclear:before{content:"\f249"}.ivu-icon-ios-nutrition-outline:before{content:"\f24a"}.ivu-icon-ios-nutrition:before{content:"\f24b"}.ivu-icon-ios-open-outline:before{content:"\f24c"}.ivu-icon-ios-open:before{content:"\f24d"}.ivu-icon-ios-options-outline:before{content:"\f24e"}.ivu-icon-ios-options:before{content:"\f24f"}.ivu-icon-ios-outlet-outline:before{content:"\f250"}.ivu-icon-ios-outlet:before{content:"\f251"}.ivu-icon-ios-paper-outline:before{content:"\f252"}.ivu-icon-ios-paper-plane-outline:before{content:"\f253"}.ivu-icon-ios-paper-plane:before{content:"\f254"}.ivu-icon-ios-paper:before{content:"\f255"}.ivu-icon-ios-partly-sunny-outline:before{content:"\f256"}.ivu-icon-ios-partly-sunny:before{content:"\f257"}.ivu-icon-ios-pause-outline:before{content:"\f258"}.ivu-icon-ios-pause:before{content:"\f259"}.ivu-icon-ios-paw-outline:before{content:"\f25a"}.ivu-icon-ios-paw:before{content:"\f25b"}.ivu-icon-ios-people-outline:before{content:"\f25c"}.ivu-icon-ios-people:before{content:"\f25d"}.ivu-icon-ios-person-add-outline:before{content:"\f25e"}.ivu-icon-ios-person-add:before{content:"\f25f"}.ivu-icon-ios-person-outline:before{content:"\f260"}.ivu-icon-ios-person:before{content:"\f261"}.ivu-icon-ios-phone-landscape:before{content:"\f262"}.ivu-icon-ios-phone-portrait:before{content:"\f263"}.ivu-icon-ios-photos-outline:before{content:"\f264"}.ivu-icon-ios-photos:before{content:"\f265"}.ivu-icon-ios-pie-outline:before{content:"\f266"}.ivu-icon-ios-pie:before{content:"\f267"}.ivu-icon-ios-pin-outline:before{content:"\f268"}.ivu-icon-ios-pin:before{content:"\f269"}.ivu-icon-ios-pint-outline:before{content:"\f26a"}.ivu-icon-ios-pint:before{content:"\f26b"}.ivu-icon-ios-pizza-outline:before{content:"\f26c"}.ivu-icon-ios-pizza:before{content:"\f26d"}.ivu-icon-ios-plane-outline:before{content:"\f26e"}.ivu-icon-ios-plane:before{content:"\f26f"}.ivu-icon-ios-planet-outline:before{content:"\f270"}.ivu-icon-ios-planet:before{content:"\f271"}.ivu-icon-ios-play-outline:before{content:"\f272"}.ivu-icon-ios-play:before{content:"\f273"}.ivu-icon-ios-podium-outline:before{content:"\f274"}.ivu-icon-ios-podium:before{content:"\f275"}.ivu-icon-ios-power-outline:before{content:"\f276"}.ivu-icon-ios-power:before{content:"\f277"}.ivu-icon-ios-pricetag-outline:before{content:"\f278"}.ivu-icon-ios-pricetag:before{content:"\f279"}.ivu-icon-ios-pricetags-outline:before{content:"\f27a"}.ivu-icon-ios-pricetags:before{content:"\f27b"}.ivu-icon-ios-print-outline:before{content:"\f27c"}.ivu-icon-ios-print:before{content:"\f27d"}.ivu-icon-ios-pulse-outline:before{content:"\f27e"}.ivu-icon-ios-pulse:before{content:"\f27f"}.ivu-icon-ios-qr-scanner:before{content:"\f280"}.ivu-icon-ios-quote-outline:before{content:"\f281"}.ivu-icon-ios-quote:before{content:"\f282"}.ivu-icon-ios-radio-button-off:before{content:"\f283"}.ivu-icon-ios-radio-button-on:before{content:"\f284"}.ivu-icon-ios-radio-outline:before{content:"\f285"}.ivu-icon-ios-radio:before{content:"\f286"}.ivu-icon-ios-rainy-outline:before{content:"\f287"}.ivu-icon-ios-rainy:before{content:"\f288"}.ivu-icon-ios-recording-outline:before{content:"\f289"}.ivu-icon-ios-recording:before{content:"\f28a"}.ivu-icon-ios-redo-outline:before{content:"\f28b"}.ivu-icon-ios-redo:before{content:"\f28c"}.ivu-icon-ios-refresh-circle-outline:before{content:"\f28d"}.ivu-icon-ios-refresh-circle:before{content:"\f28e"}.ivu-icon-ios-refresh:before{content:"\f28f"}.ivu-icon-ios-remove-circle-outline:before{content:"\f290"}.ivu-icon-ios-remove-circle:before{content:"\f291"}.ivu-icon-ios-remove:before{content:"\f292"}.ivu-icon-ios-reorder:before{content:"\f293"}.ivu-icon-ios-repeat:before{content:"\f294"}.ivu-icon-ios-resize:before{content:"\f295"}.ivu-icon-ios-restaurant-outline:before{content:"\f296"}.ivu-icon-ios-restaurant:before{content:"\f297"}.ivu-icon-ios-return-left:before{content:"\f298"}.ivu-icon-ios-return-right:before{content:"\f299"}.ivu-icon-ios-reverse-camera-outline:before{content:"\f29a"}.ivu-icon-ios-reverse-camera:before{content:"\f29b"}.ivu-icon-ios-rewind-outline:before{content:"\f29c"}.ivu-icon-ios-rewind:before{content:"\f29d"}.ivu-icon-ios-ribbon-outline:before{content:"\f29e"}.ivu-icon-ios-ribbon:before{content:"\f29f"}.ivu-icon-ios-rose-outline:before{content:"\f2a0"}.ivu-icon-ios-rose:before{content:"\f2a1"}.ivu-icon-ios-sad-outline:before{content:"\f2a2"}.ivu-icon-ios-sad:before{content:"\f2a3"}.ivu-icon-ios-school-outline:before{content:"\f2a4"}.ivu-icon-ios-school:before{content:"\f2a5"}.ivu-icon-ios-search-outline:before{content:"\f2a6"}.ivu-icon-ios-search:before{content:"\f2a7"}.ivu-icon-ios-send-outline:before{content:"\f2a8"}.ivu-icon-ios-send:before{content:"\f2a9"}.ivu-icon-ios-settings-outline:before{content:"\f2aa"}.ivu-icon-ios-settings:before{content:"\f2ab"}.ivu-icon-ios-share-alt-outline:before{content:"\f2ac"}.ivu-icon-ios-share-alt:before{content:"\f2ad"}.ivu-icon-ios-share-outline:before{content:"\f2ae"}.ivu-icon-ios-share:before{content:"\f2af"}.ivu-icon-ios-shirt-outline:before{content:"\f2b0"}.ivu-icon-ios-shirt:before{content:"\f2b1"}.ivu-icon-ios-shuffle:before{content:"\f2b2"}.ivu-icon-ios-skip-backward-outline:before{content:"\f2b3"}.ivu-icon-ios-skip-backward:before{content:"\f2b4"}.ivu-icon-ios-skip-forward-outline:before{content:"\f2b5"}.ivu-icon-ios-skip-forward:before{content:"\f2b6"}.ivu-icon-ios-snow-outline:before{content:"\f2b7"}.ivu-icon-ios-snow:before{content:"\f2b8"}.ivu-icon-ios-speedometer-outline:before{content:"\f2b9"}.ivu-icon-ios-speedometer:before{content:"\f2ba"}.ivu-icon-ios-square-outline:before{content:"\f2bb"}.ivu-icon-ios-square:before{content:"\f2bc"}.ivu-icon-ios-star-half:before{content:"\f2bd"}.ivu-icon-ios-star-outline:before{content:"\f2be"}.ivu-icon-ios-star:before{content:"\f2bf"}.ivu-icon-ios-stats-outline:before{content:"\f2c0"}.ivu-icon-ios-stats:before{content:"\f2c1"}.ivu-icon-ios-stopwatch-outline:before{content:"\f2c2"}.ivu-icon-ios-stopwatch:before{content:"\f2c3"}.ivu-icon-ios-subway-outline:before{content:"\f2c4"}.ivu-icon-ios-subway:before{content:"\f2c5"}.ivu-icon-ios-sunny-outline:before{content:"\f2c6"}.ivu-icon-ios-sunny:before{content:"\f2c7"}.ivu-icon-ios-swap:before{content:"\f2c8"}.ivu-icon-ios-switch-outline:before{content:"\f2c9"}.ivu-icon-ios-switch:before{content:"\f2ca"}.ivu-icon-ios-sync:before{content:"\f2cb"}.ivu-icon-ios-tablet-landscape:before{content:"\f2cc"}.ivu-icon-ios-tablet-portrait:before{content:"\f2cd"}.ivu-icon-ios-tennisball-outline:before{content:"\f2ce"}.ivu-icon-ios-tennisball:before{content:"\f2cf"}.ivu-icon-ios-text-outline:before{content:"\f2d0"}.ivu-icon-ios-text:before{content:"\f2d1"}.ivu-icon-ios-thermometer-outline:before{content:"\f2d2"}.ivu-icon-ios-thermometer:before{content:"\f2d3"}.ivu-icon-ios-thumbs-down-outline:before{content:"\f2d4"}.ivu-icon-ios-thumbs-down:before{content:"\f2d5"}.ivu-icon-ios-thumbs-up-outline:before{content:"\f2d6"}.ivu-icon-ios-thumbs-up:before{content:"\f2d7"}.ivu-icon-ios-thunderstorm-outline:before{content:"\f2d8"}.ivu-icon-ios-thunderstorm:before{content:"\f2d9"}.ivu-icon-ios-time-outline:before{content:"\f2da"}.ivu-icon-ios-time:before{content:"\f2db"}.ivu-icon-ios-timer-outline:before{content:"\f2dc"}.ivu-icon-ios-timer:before{content:"\f2dd"}.ivu-icon-ios-train-outline:before{content:"\f2de"}.ivu-icon-ios-train:before{content:"\f2df"}.ivu-icon-ios-transgender:before{content:"\f2e0"}.ivu-icon-ios-trash-outline:before{content:"\f2e1"}.ivu-icon-ios-trash:before{content:"\f2e2"}.ivu-icon-ios-trending-down:before{content:"\f2e3"}.ivu-icon-ios-trending-up:before{content:"\f2e4"}.ivu-icon-ios-trophy-outline:before{content:"\f2e5"}.ivu-icon-ios-trophy:before{content:"\f2e6"}.ivu-icon-ios-umbrella-outline:before{content:"\f2e7"}.ivu-icon-ios-umbrella:before{content:"\f2e8"}.ivu-icon-ios-undo-outline:before{content:"\f2e9"}.ivu-icon-ios-undo:before{content:"\f2ea"}.ivu-icon-ios-unlock-outline:before{content:"\f2eb"}.ivu-icon-ios-unlock:before{content:"\f2ec"}.ivu-icon-ios-videocam-outline:before{content:"\f2ed"}.ivu-icon-ios-videocam:before{content:"\f2ee"}.ivu-icon-ios-volume-down:before{content:"\f2ef"}.ivu-icon-ios-volume-mute:before{content:"\f2f0"}.ivu-icon-ios-volume-off:before{content:"\f2f1"}.ivu-icon-ios-volume-up:before{content:"\f2f2"}.ivu-icon-ios-walk:before{content:"\f2f3"}.ivu-icon-ios-warning-outline:before{content:"\f2f4"}.ivu-icon-ios-warning:before{content:"\f2f5"}.ivu-icon-ios-watch:before{content:"\f2f6"}.ivu-icon-ios-water-outline:before{content:"\f2f7"}.ivu-icon-ios-water:before{content:"\f2f8"}.ivu-icon-ios-wifi-outline:before{content:"\f2f9"}.ivu-icon-ios-wifi:before{content:"\f2fa"}.ivu-icon-ios-wine-outline:before{content:"\f2fb"}.ivu-icon-ios-wine:before{content:"\f2fc"}.ivu-icon-ios-woman-outline:before{content:"\f2fd"}.ivu-icon-ios-woman:before{content:"\f2fe"}.ivu-icon-logo-android:before{content:"\f2ff"}.ivu-icon-logo-angular:before{content:"\f300"}.ivu-icon-logo-apple:before{content:"\f301"}.ivu-icon-logo-bitcoin:before{content:"\f302"}.ivu-icon-logo-buffer:before{content:"\f303"}.ivu-icon-logo-chrome:before{content:"\f304"}.ivu-icon-logo-codepen:before{content:"\f305"}.ivu-icon-logo-css3:before{content:"\f306"}.ivu-icon-logo-designernews:before{content:"\f307"}.ivu-icon-logo-dribbble:before{content:"\f308"}.ivu-icon-logo-dropbox:before{content:"\f309"}.ivu-icon-logo-euro:before{content:"\f30a"}.ivu-icon-logo-facebook:before{content:"\f30b"}.ivu-icon-logo-foursquare:before{content:"\f30c"}.ivu-icon-logo-freebsd-devil:before{content:"\f30d"}.ivu-icon-logo-github:before{content:"\f30e"}.ivu-icon-logo-google:before{content:"\f30f"}.ivu-icon-logo-googleplus:before{content:"\f310"}.ivu-icon-logo-hackernews:before{content:"\f311"}.ivu-icon-logo-html5:before{content:"\f312"}.ivu-icon-logo-instagram:before{content:"\f313"}.ivu-icon-logo-javascript:before{content:"\f314"}.ivu-icon-logo-linkedin:before{content:"\f315"}.ivu-icon-logo-markdown:before{content:"\f316"}.ivu-icon-logo-nodejs:before{content:"\f317"}.ivu-icon-logo-octocat:before{content:"\f318"}.ivu-icon-logo-pinterest:before{content:"\f319"}.ivu-icon-logo-playstation:before{content:"\f31a"}.ivu-icon-logo-python:before{content:"\f31b"}.ivu-icon-logo-reddit:before{content:"\f31c"}.ivu-icon-logo-rss:before{content:"\f31d"}.ivu-icon-logo-sass:before{content:"\f31e"}.ivu-icon-logo-skype:before{content:"\f31f"}.ivu-icon-logo-snapchat:before{content:"\f320"}.ivu-icon-logo-steam:before{content:"\f321"}.ivu-icon-logo-tumblr:before{content:"\f322"}.ivu-icon-logo-tux:before{content:"\f323"}.ivu-icon-logo-twitch:before{content:"\f324"}.ivu-icon-logo-twitter:before{content:"\f325"}.ivu-icon-logo-usd:before{content:"\f326"}.ivu-icon-logo-vimeo:before{content:"\f327"}.ivu-icon-logo-whatsapp:before{content:"\f328"}.ivu-icon-logo-windows:before{content:"\f329"}.ivu-icon-logo-wordpress:before{content:"\f32a"}.ivu-icon-logo-xbox:before{content:"\f32b"}.ivu-icon-logo-yahoo:before{content:"\f32c"}.ivu-icon-logo-yen:before{content:"\f32d"}.ivu-icon-logo-youtube:before{content:"\f32e"}.ivu-icon-md-add-circle:before{content:"\f32f"}.ivu-icon-md-add:before{content:"\f330"}.ivu-icon-md-alarm:before{content:"\f331"}.ivu-icon-md-albums:before{content:"\f332"}.ivu-icon-md-alert:before{content:"\f333"}.ivu-icon-md-american-football:before{content:"\f334"}.ivu-icon-md-analytics:before{content:"\f335"}.ivu-icon-md-aperture:before{content:"\f336"}.ivu-icon-md-apps:before{content:"\f337"}.ivu-icon-md-appstore:before{content:"\f338"}.ivu-icon-md-archive:before{content:"\f339"}.ivu-icon-md-arrow-back:before{content:"\f33a"}.ivu-icon-md-arrow-down:before{content:"\f33b"}.ivu-icon-md-arrow-dropdown-circle:before{content:"\f33c"}.ivu-icon-md-arrow-dropdown:before{content:"\f33d"}.ivu-icon-md-arrow-dropleft-circle:before{content:"\f33e"}.ivu-icon-md-arrow-dropleft:before{content:"\f33f"}.ivu-icon-md-arrow-dropright-circle:before{content:"\f340"}.ivu-icon-md-arrow-dropright:before{content:"\f341"}.ivu-icon-md-arrow-dropup-circle:before{content:"\f342"}.ivu-icon-md-arrow-dropup:before{content:"\f343"}.ivu-icon-md-arrow-forward:before{content:"\f344"}.ivu-icon-md-arrow-round-back:before{content:"\f345"}.ivu-icon-md-arrow-round-down:before{content:"\f346"}.ivu-icon-md-arrow-round-forward:before{content:"\f347"}.ivu-icon-md-arrow-round-up:before{content:"\f348"}.ivu-icon-md-arrow-up:before{content:"\f349"}.ivu-icon-md-at:before{content:"\f34a"}.ivu-icon-md-attach:before{content:"\f34b"}.ivu-icon-md-backspace:before{content:"\f34c"}.ivu-icon-md-barcode:before{content:"\f34d"}.ivu-icon-md-baseball:before{content:"\f34e"}.ivu-icon-md-basket:before{content:"\f34f"}.ivu-icon-md-basketball:before{content:"\f350"}.ivu-icon-md-battery-charging:before{content:"\f351"}.ivu-icon-md-battery-dead:before{content:"\f352"}.ivu-icon-md-battery-full:before{content:"\f353"}.ivu-icon-md-beaker:before{content:"\f354"}.ivu-icon-md-beer:before{content:"\f355"}.ivu-icon-md-bicycle:before{content:"\f356"}.ivu-icon-md-bluetooth:before{content:"\f357"}.ivu-icon-md-boat:before{content:"\f358"}.ivu-icon-md-body:before{content:"\f359"}.ivu-icon-md-bonfire:before{content:"\f35a"}.ivu-icon-md-book:before{content:"\f35b"}.ivu-icon-md-bookmark:before{content:"\f35c"}.ivu-icon-md-bookmarks:before{content:"\f35d"}.ivu-icon-md-bowtie:before{content:"\f35e"}.ivu-icon-md-briefcase:before{content:"\f35f"}.ivu-icon-md-browsers:before{content:"\f360"}.ivu-icon-md-brush:before{content:"\f361"}.ivu-icon-md-bug:before{content:"\f362"}.ivu-icon-md-build:before{content:"\f363"}.ivu-icon-md-bulb:before{content:"\f364"}.ivu-icon-md-bus:before{content:"\f365"}.ivu-icon-md-cafe:before{content:"\f366"}.ivu-icon-md-calculator:before{content:"\f367"}.ivu-icon-md-calendar:before{content:"\f368"}.ivu-icon-md-call:before{content:"\f369"}.ivu-icon-md-camera:before{content:"\f36a"}.ivu-icon-md-car:before{content:"\f36b"}.ivu-icon-md-card:before{content:"\f36c"}.ivu-icon-md-cart:before{content:"\f36d"}.ivu-icon-md-cash:before{content:"\f36e"}.ivu-icon-md-chatboxes:before{content:"\f36f"}.ivu-icon-md-chatbubbles:before{content:"\f370"}.ivu-icon-md-checkbox-outline:before{content:"\f371"}.ivu-icon-md-checkbox:before{content:"\f372"}.ivu-icon-md-checkmark-circle-outline:before{content:"\f373"}.ivu-icon-md-checkmark-circle:before{content:"\f374"}.ivu-icon-md-checkmark:before{content:"\f375"}.ivu-icon-md-clipboard:before{content:"\f376"}.ivu-icon-md-clock:before{content:"\f377"}.ivu-icon-md-close-circle:before{content:"\f378"}.ivu-icon-md-close:before{content:"\f379"}.ivu-icon-md-closed-captioning:before{content:"\f37a"}.ivu-icon-md-cloud-circle:before{content:"\f37b"}.ivu-icon-md-cloud-done:before{content:"\f37c"}.ivu-icon-md-cloud-download:before{content:"\f37d"}.ivu-icon-md-cloud-outline:before{content:"\f37e"}.ivu-icon-md-cloud-upload:before{content:"\f37f"}.ivu-icon-md-cloud:before{content:"\f380"}.ivu-icon-md-cloudy-night:before{content:"\f381"}.ivu-icon-md-cloudy:before{content:"\f382"}.ivu-icon-md-code-download:before{content:"\f383"}.ivu-icon-md-code-working:before{content:"\f384"}.ivu-icon-md-code:before{content:"\f385"}.ivu-icon-md-cog:before{content:"\f386"}.ivu-icon-md-color-fill:before{content:"\f387"}.ivu-icon-md-color-filter:before{content:"\f388"}.ivu-icon-md-color-palette:before{content:"\f389"}.ivu-icon-md-color-wand:before{content:"\f38a"}.ivu-icon-md-compass:before{content:"\f38b"}.ivu-icon-md-construct:before{content:"\f38c"}.ivu-icon-md-contact:before{content:"\f38d"}.ivu-icon-md-contacts:before{content:"\f38e"}.ivu-icon-md-contract:before{content:"\f38f"}.ivu-icon-md-contrast:before{content:"\f390"}.ivu-icon-md-copy:before{content:"\f391"}.ivu-icon-md-create:before{content:"\f392"}.ivu-icon-md-crop:before{content:"\f393"}.ivu-icon-md-cube:before{content:"\f394"}.ivu-icon-md-cut:before{content:"\f395"}.ivu-icon-md-desktop:before{content:"\f396"}.ivu-icon-md-disc:before{content:"\f397"}.ivu-icon-md-document:before{content:"\f398"}.ivu-icon-md-done-all:before{content:"\f399"}.ivu-icon-md-download:before{content:"\f39a"}.ivu-icon-md-easel:before{content:"\f39b"}.ivu-icon-md-egg:before{content:"\f39c"}.ivu-icon-md-exit:before{content:"\f39d"}.ivu-icon-md-expand:before{content:"\f39e"}.ivu-icon-md-eye-off:before{content:"\f39f"}.ivu-icon-md-eye:before{content:"\f3a0"}.ivu-icon-md-fastforward:before{content:"\f3a1"}.ivu-icon-md-female:before{content:"\f3a2"}.ivu-icon-md-filing:before{content:"\f3a3"}.ivu-icon-md-film:before{content:"\f3a4"}.ivu-icon-md-finger-print:before{content:"\f3a5"}.ivu-icon-md-flag:before{content:"\f3a6"}.ivu-icon-md-flame:before{content:"\f3a7"}.ivu-icon-md-flash:before{content:"\f3a8"}.ivu-icon-md-flask:before{content:"\f3a9"}.ivu-icon-md-flower:before{content:"\f3aa"}.ivu-icon-md-folder-open:before{content:"\f3ab"}.ivu-icon-md-folder:before{content:"\f3ac"}.ivu-icon-md-football:before{content:"\f3ad"}.ivu-icon-md-funnel:before{content:"\f3ae"}.ivu-icon-md-game-controller-a:before{content:"\f3af"}.ivu-icon-md-game-controller-b:before{content:"\f3b0"}.ivu-icon-md-git-branch:before{content:"\f3b1"}.ivu-icon-md-git-commit:before{content:"\f3b2"}.ivu-icon-md-git-compare:before{content:"\f3b3"}.ivu-icon-md-git-merge:before{content:"\f3b4"}.ivu-icon-md-git-network:before{content:"\f3b5"}.ivu-icon-md-git-pull-request:before{content:"\f3b6"}.ivu-icon-md-glasses:before{content:"\f3b7"}.ivu-icon-md-globe:before{content:"\f3b8"}.ivu-icon-md-grid:before{content:"\f3b9"}.ivu-icon-md-hammer:before{content:"\f3ba"}.ivu-icon-md-hand:before{content:"\f3bb"}.ivu-icon-md-happy:before{content:"\f3bc"}.ivu-icon-md-headset:before{content:"\f3bd"}.ivu-icon-md-heart-outline:before{content:"\f3be"}.ivu-icon-md-heart:before{content:"\f3bf"}.ivu-icon-md-help-buoy:before{content:"\f3c0"}.ivu-icon-md-help-circle:before{content:"\f3c1"}.ivu-icon-md-help:before{content:"\f3c2"}.ivu-icon-md-home:before{content:"\f3c3"}.ivu-icon-md-ice-cream:before{content:"\f3c4"}.ivu-icon-md-image:before{content:"\f3c5"}.ivu-icon-md-images:before{content:"\f3c6"}.ivu-icon-md-infinite:before{content:"\f3c7"}.ivu-icon-md-information-circle:before{content:"\f3c8"}.ivu-icon-md-information:before{content:"\f3c9"}.ivu-icon-md-ionic:before{content:"\f3ca"}.ivu-icon-md-ionitron:before{content:"\f3cb"}.ivu-icon-md-jet:before{content:"\f3cc"}.ivu-icon-md-key:before{content:"\f3cd"}.ivu-icon-md-keypad:before{content:"\f3ce"}.ivu-icon-md-laptop:before{content:"\f3cf"}.ivu-icon-md-leaf:before{content:"\f3d0"}.ivu-icon-md-link:before{content:"\f3d1"}.ivu-icon-md-list-box:before{content:"\f3d2"}.ivu-icon-md-list:before{content:"\f3d3"}.ivu-icon-md-locate:before{content:"\f3d4"}.ivu-icon-md-lock:before{content:"\f3d5"}.ivu-icon-md-log-in:before{content:"\f3d6"}.ivu-icon-md-log-out:before{content:"\f3d7"}.ivu-icon-md-magnet:before{content:"\f3d8"}.ivu-icon-md-mail-open:before{content:"\f3d9"}.ivu-icon-md-mail:before{content:"\f3da"}.ivu-icon-md-male:before{content:"\f3db"}.ivu-icon-md-man:before{content:"\f3dc"}.ivu-icon-md-map:before{content:"\f3dd"}.ivu-icon-md-medal:before{content:"\f3de"}.ivu-icon-md-medical:before{content:"\f3df"}.ivu-icon-md-medkit:before{content:"\f3e0"}.ivu-icon-md-megaphone:before{content:"\f3e1"}.ivu-icon-md-menu:before{content:"\f3e2"}.ivu-icon-md-mic-off:before{content:"\f3e3"}.ivu-icon-md-mic:before{content:"\f3e4"}.ivu-icon-md-microphone:before{content:"\f3e5"}.ivu-icon-md-moon:before{content:"\f3e6"}.ivu-icon-md-more:before{content:"\f3e7"}.ivu-icon-md-move:before{content:"\f3e8"}.ivu-icon-md-musical-note:before{content:"\f3e9"}.ivu-icon-md-musical-notes:before{content:"\f3ea"}.ivu-icon-md-navigate:before{content:"\f3eb"}.ivu-icon-md-no-smoking:before{content:"\f3ec"}.ivu-icon-md-notifications-off:before{content:"\f3ed"}.ivu-icon-md-notifications-outline:before{content:"\f3ee"}.ivu-icon-md-notifications:before{content:"\f3ef"}.ivu-icon-md-nuclear:before{content:"\f3f0"}.ivu-icon-md-nutrition:before{content:"\f3f1"}.ivu-icon-md-open:before{content:"\f3f2"}.ivu-icon-md-options:before{content:"\f3f3"}.ivu-icon-md-outlet:before{content:"\f3f4"}.ivu-icon-md-paper-plane:before{content:"\f3f5"}.ivu-icon-md-paper:before{content:"\f3f6"}.ivu-icon-md-partly-sunny:before{content:"\f3f7"}.ivu-icon-md-pause:before{content:"\f3f8"}.ivu-icon-md-paw:before{content:"\f3f9"}.ivu-icon-md-people:before{content:"\f3fa"}.ivu-icon-md-person-add:before{content:"\f3fb"}.ivu-icon-md-person:before{content:"\f3fc"}.ivu-icon-md-phone-landscape:before{content:"\f3fd"}.ivu-icon-md-phone-portrait:before{content:"\f3fe"}.ivu-icon-md-photos:before{content:"\f3ff"}.ivu-icon-md-pie:before{content:"\f400"}.ivu-icon-md-pin:before{content:"\f401"}.ivu-icon-md-pint:before{content:"\f402"}.ivu-icon-md-pizza:before{content:"\f403"}.ivu-icon-md-plane:before{content:"\f404"}.ivu-icon-md-planet:before{content:"\f405"}.ivu-icon-md-play:before{content:"\f406"}.ivu-icon-md-podium:before{content:"\f407"}.ivu-icon-md-power:before{content:"\f408"}.ivu-icon-md-pricetag:before{content:"\f409"}.ivu-icon-md-pricetags:before{content:"\f40a"}.ivu-icon-md-print:before{content:"\f40b"}.ivu-icon-md-pulse:before{content:"\f40c"}.ivu-icon-md-qr-scanner:before{content:"\f40d"}.ivu-icon-md-quote:before{content:"\f40e"}.ivu-icon-md-radio-button-off:before{content:"\f40f"}.ivu-icon-md-radio-button-on:before{content:"\f410"}.ivu-icon-md-radio:before{content:"\f411"}.ivu-icon-md-rainy:before{content:"\f412"}.ivu-icon-md-recording:before{content:"\f413"}.ivu-icon-md-redo:before{content:"\f414"}.ivu-icon-md-refresh-circle:before{content:"\f415"}.ivu-icon-md-refresh:before{content:"\f416"}.ivu-icon-md-remove-circle:before{content:"\f417"}.ivu-icon-md-remove:before{content:"\f418"}.ivu-icon-md-reorder:before{content:"\f419"}.ivu-icon-md-repeat:before{content:"\f41a"}.ivu-icon-md-resize:before{content:"\f41b"}.ivu-icon-md-restaurant:before{content:"\f41c"}.ivu-icon-md-return-left:before{content:"\f41d"}.ivu-icon-md-return-right:before{content:"\f41e"}.ivu-icon-md-reverse-camera:before{content:"\f41f"}.ivu-icon-md-rewind:before{content:"\f420"}.ivu-icon-md-ribbon:before{content:"\f421"}.ivu-icon-md-rose:before{content:"\f422"}.ivu-icon-md-sad:before{content:"\f423"}.ivu-icon-md-school:before{content:"\f424"}.ivu-icon-md-search:before{content:"\f425"}.ivu-icon-md-send:before{content:"\f426"}.ivu-icon-md-settings:before{content:"\f427"}.ivu-icon-md-share-alt:before{content:"\f428"}.ivu-icon-md-share:before{content:"\f429"}.ivu-icon-md-shirt:before{content:"\f42a"}.ivu-icon-md-shuffle:before{content:"\f42b"}.ivu-icon-md-skip-backward:before{content:"\f42c"}.ivu-icon-md-skip-forward:before{content:"\f42d"}.ivu-icon-md-snow:before{content:"\f42e"}.ivu-icon-md-speedometer:before{content:"\f42f"}.ivu-icon-md-square-outline:before{content:"\f430"}.ivu-icon-md-square:before{content:"\f431"}.ivu-icon-md-star-half:before{content:"\f432"}.ivu-icon-md-star-outline:before{content:"\f433"}.ivu-icon-md-star:before{content:"\f434"}.ivu-icon-md-stats:before{content:"\f435"}.ivu-icon-md-stopwatch:before{content:"\f436"}.ivu-icon-md-subway:before{content:"\f437"}.ivu-icon-md-sunny:before{content:"\f438"}.ivu-icon-md-swap:before{content:"\f439"}.ivu-icon-md-switch:before{content:"\f43a"}.ivu-icon-md-sync:before{content:"\f43b"}.ivu-icon-md-tablet-landscape:before{content:"\f43c"}.ivu-icon-md-tablet-portrait:before{content:"\f43d"}.ivu-icon-md-tennisball:before{content:"\f43e"}.ivu-icon-md-text:before{content:"\f43f"}.ivu-icon-md-thermometer:before{content:"\f440"}.ivu-icon-md-thumbs-down:before{content:"\f441"}.ivu-icon-md-thumbs-up:before{content:"\f442"}.ivu-icon-md-thunderstorm:before{content:"\f443"}.ivu-icon-md-time:before{content:"\f444"}.ivu-icon-md-timer:before{content:"\f445"}.ivu-icon-md-train:before{content:"\f446"}.ivu-icon-md-transgender:before{content:"\f447"}.ivu-icon-md-trash:before{content:"\f448"}.ivu-icon-md-trending-down:before{content:"\f449"}.ivu-icon-md-trending-up:before{content:"\f44a"}.ivu-icon-md-trophy:before{content:"\f44b"}.ivu-icon-md-umbrella:before{content:"\f44c"}.ivu-icon-md-undo:before{content:"\f44d"}.ivu-icon-md-unlock:before{content:"\f44e"}.ivu-icon-md-videocam:before{content:"\f44f"}.ivu-icon-md-volume-down:before{content:"\f450"}.ivu-icon-md-volume-mute:before{content:"\f451"}.ivu-icon-md-volume-off:before{content:"\f452"}.ivu-icon-md-volume-up:before{content:"\f453"}.ivu-icon-md-walk:before{content:"\f454"}.ivu-icon-md-warning:before{content:"\f455"}.ivu-icon-md-watch:before{content:"\f456"}.ivu-icon-md-water:before{content:"\f457"}.ivu-icon-md-wifi:before{content:"\f458"}.ivu-icon-md-wine:before{content:"\f459"}.ivu-icon-md-woman:before{content:"\f45a"}.ivu-icon-ios-loading:before{content:"\f45b"}.ivu-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.ivu-row::after,.ivu-row::before{display:-webkit-box;display:-ms-flexbox;display:flex}.ivu-row-no-wrap{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.ivu-row-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ivu-row-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ivu-row-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ivu-row-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.ivu-row-space-around{-ms-flex-pack:distribute;justify-content:space-around}.ivu-row-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.ivu-row-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ivu-row-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.ivu-col{position:relative;max-width:100%;min-height:1px}.ivu-col-span-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-push-24{left:100%}.ivu-col-pull-24{right:100%}.ivu-col-offset-24{margin-left:100%}.ivu-col-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-push-23{left:95.83333333%}.ivu-col-pull-23{right:95.83333333%}.ivu-col-offset-23{margin-left:95.83333333%}.ivu-col-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-push-22{left:91.66666667%}.ivu-col-pull-22{right:91.66666667%}.ivu-col-offset-22{margin-left:91.66666667%}.ivu-col-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-push-21{left:87.5%}.ivu-col-pull-21{right:87.5%}.ivu-col-offset-21{margin-left:87.5%}.ivu-col-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-push-20{left:83.33333333%}.ivu-col-pull-20{right:83.33333333%}.ivu-col-offset-20{margin-left:83.33333333%}.ivu-col-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-push-19{left:79.16666667%}.ivu-col-pull-19{right:79.16666667%}.ivu-col-offset-19{margin-left:79.16666667%}.ivu-col-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-push-18{left:75%}.ivu-col-pull-18{right:75%}.ivu-col-offset-18{margin-left:75%}.ivu-col-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-push-17{left:70.83333333%}.ivu-col-pull-17{right:70.83333333%}.ivu-col-offset-17{margin-left:70.83333333%}.ivu-col-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-push-16{left:66.66666667%}.ivu-col-pull-16{right:66.66666667%}.ivu-col-offset-16{margin-left:66.66666667%}.ivu-col-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-push-15{left:62.5%}.ivu-col-pull-15{right:62.5%}.ivu-col-offset-15{margin-left:62.5%}.ivu-col-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-push-14{left:58.33333333%}.ivu-col-pull-14{right:58.33333333%}.ivu-col-offset-14{margin-left:58.33333333%}.ivu-col-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-push-13{left:54.16666667%}.ivu-col-pull-13{right:54.16666667%}.ivu-col-offset-13{margin-left:54.16666667%}.ivu-col-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-push-12{left:50%}.ivu-col-pull-12{right:50%}.ivu-col-offset-12{margin-left:50%}.ivu-col-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-push-11{left:45.83333333%}.ivu-col-pull-11{right:45.83333333%}.ivu-col-offset-11{margin-left:45.83333333%}.ivu-col-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-push-10{left:41.66666667%}.ivu-col-pull-10{right:41.66666667%}.ivu-col-offset-10{margin-left:41.66666667%}.ivu-col-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-push-9{left:37.5%}.ivu-col-pull-9{right:37.5%}.ivu-col-offset-9{margin-left:37.5%}.ivu-col-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-push-8{left:33.33333333%}.ivu-col-pull-8{right:33.33333333%}.ivu-col-offset-8{margin-left:33.33333333%}.ivu-col-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-push-7{left:29.16666667%}.ivu-col-pull-7{right:29.16666667%}.ivu-col-offset-7{margin-left:29.16666667%}.ivu-col-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-push-6{left:25%}.ivu-col-pull-6{right:25%}.ivu-col-offset-6{margin-left:25%}.ivu-col-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-push-5{left:20.83333333%}.ivu-col-pull-5{right:20.83333333%}.ivu-col-offset-5{margin-left:20.83333333%}.ivu-col-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-push-4{left:16.66666667%}.ivu-col-pull-4{right:16.66666667%}.ivu-col-offset-4{margin-left:16.66666667%}.ivu-col-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-push-3{left:12.5%}.ivu-col-pull-3{right:12.5%}.ivu-col-offset-3{margin-left:12.5%}.ivu-col-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-push-2{left:8.33333333%}.ivu-col-pull-2{right:8.33333333%}.ivu-col-offset-2{margin-left:8.33333333%}.ivu-col-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-push-1{left:4.16666667%}.ivu-col-pull-1{right:4.16666667%}.ivu-col-offset-1{margin-left:4.16666667%}.ivu-col-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-offset-0{margin-left:0}.ivu-col-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.ivu-col-span-xs-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-xs-push-24{left:100%}.ivu-col-xs-pull-24{right:100%}.ivu-col-xs-offset-24{margin-left:100%}.ivu-col-xs-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-xs-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-xs-push-23{left:95.83333333%}.ivu-col-xs-pull-23{right:95.83333333%}.ivu-col-xs-offset-23{margin-left:95.83333333%}.ivu-col-xs-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-xs-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-xs-push-22{left:91.66666667%}.ivu-col-xs-pull-22{right:91.66666667%}.ivu-col-xs-offset-22{margin-left:91.66666667%}.ivu-col-xs-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-xs-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-xs-push-21{left:87.5%}.ivu-col-xs-pull-21{right:87.5%}.ivu-col-xs-offset-21{margin-left:87.5%}.ivu-col-xs-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-xs-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-xs-push-20{left:83.33333333%}.ivu-col-xs-pull-20{right:83.33333333%}.ivu-col-xs-offset-20{margin-left:83.33333333%}.ivu-col-xs-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-xs-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-xs-push-19{left:79.16666667%}.ivu-col-xs-pull-19{right:79.16666667%}.ivu-col-xs-offset-19{margin-left:79.16666667%}.ivu-col-xs-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-xs-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-xs-push-18{left:75%}.ivu-col-xs-pull-18{right:75%}.ivu-col-xs-offset-18{margin-left:75%}.ivu-col-xs-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-xs-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-xs-push-17{left:70.83333333%}.ivu-col-xs-pull-17{right:70.83333333%}.ivu-col-xs-offset-17{margin-left:70.83333333%}.ivu-col-xs-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-xs-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-xs-push-16{left:66.66666667%}.ivu-col-xs-pull-16{right:66.66666667%}.ivu-col-xs-offset-16{margin-left:66.66666667%}.ivu-col-xs-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-xs-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-xs-push-15{left:62.5%}.ivu-col-xs-pull-15{right:62.5%}.ivu-col-xs-offset-15{margin-left:62.5%}.ivu-col-xs-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-xs-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-xs-push-14{left:58.33333333%}.ivu-col-xs-pull-14{right:58.33333333%}.ivu-col-xs-offset-14{margin-left:58.33333333%}.ivu-col-xs-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-xs-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-xs-push-13{left:54.16666667%}.ivu-col-xs-pull-13{right:54.16666667%}.ivu-col-xs-offset-13{margin-left:54.16666667%}.ivu-col-xs-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-xs-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-xs-push-12{left:50%}.ivu-col-xs-pull-12{right:50%}.ivu-col-xs-offset-12{margin-left:50%}.ivu-col-xs-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-xs-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-xs-push-11{left:45.83333333%}.ivu-col-xs-pull-11{right:45.83333333%}.ivu-col-xs-offset-11{margin-left:45.83333333%}.ivu-col-xs-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-xs-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-xs-push-10{left:41.66666667%}.ivu-col-xs-pull-10{right:41.66666667%}.ivu-col-xs-offset-10{margin-left:41.66666667%}.ivu-col-xs-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-xs-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-xs-push-9{left:37.5%}.ivu-col-xs-pull-9{right:37.5%}.ivu-col-xs-offset-9{margin-left:37.5%}.ivu-col-xs-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-xs-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-xs-push-8{left:33.33333333%}.ivu-col-xs-pull-8{right:33.33333333%}.ivu-col-xs-offset-8{margin-left:33.33333333%}.ivu-col-xs-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-xs-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-xs-push-7{left:29.16666667%}.ivu-col-xs-pull-7{right:29.16666667%}.ivu-col-xs-offset-7{margin-left:29.16666667%}.ivu-col-xs-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-xs-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-xs-push-6{left:25%}.ivu-col-xs-pull-6{right:25%}.ivu-col-xs-offset-6{margin-left:25%}.ivu-col-xs-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-xs-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-xs-push-5{left:20.83333333%}.ivu-col-xs-pull-5{right:20.83333333%}.ivu-col-xs-offset-5{margin-left:20.83333333%}.ivu-col-xs-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-xs-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-xs-push-4{left:16.66666667%}.ivu-col-xs-pull-4{right:16.66666667%}.ivu-col-xs-offset-4{margin-left:16.66666667%}.ivu-col-xs-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-xs-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-xs-push-3{left:12.5%}.ivu-col-xs-pull-3{right:12.5%}.ivu-col-xs-offset-3{margin-left:12.5%}.ivu-col-xs-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-xs-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-xs-push-2{left:8.33333333%}.ivu-col-xs-pull-2{right:8.33333333%}.ivu-col-xs-offset-2{margin-left:8.33333333%}.ivu-col-xs-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-xs-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-xs-push-1{left:4.16666667%}.ivu-col-xs-pull-1{right:4.16666667%}.ivu-col-xs-offset-1{margin-left:4.16666667%}.ivu-col-xs-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-xs-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-xs-push-0{left:auto}.ivu-col-xs-pull-0{right:auto}.ivu-col-xs-offset-0{margin-left:0}.ivu-col-xs-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}@media (min-width:576px){.ivu-col-span-sm-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-sm-push-24{left:100%}.ivu-col-sm-pull-24{right:100%}.ivu-col-sm-offset-24{margin-left:100%}.ivu-col-sm-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-sm-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-sm-push-23{left:95.83333333%}.ivu-col-sm-pull-23{right:95.83333333%}.ivu-col-sm-offset-23{margin-left:95.83333333%}.ivu-col-sm-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-sm-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-sm-push-22{left:91.66666667%}.ivu-col-sm-pull-22{right:91.66666667%}.ivu-col-sm-offset-22{margin-left:91.66666667%}.ivu-col-sm-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-sm-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-sm-push-21{left:87.5%}.ivu-col-sm-pull-21{right:87.5%}.ivu-col-sm-offset-21{margin-left:87.5%}.ivu-col-sm-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-sm-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-sm-push-20{left:83.33333333%}.ivu-col-sm-pull-20{right:83.33333333%}.ivu-col-sm-offset-20{margin-left:83.33333333%}.ivu-col-sm-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-sm-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-sm-push-19{left:79.16666667%}.ivu-col-sm-pull-19{right:79.16666667%}.ivu-col-sm-offset-19{margin-left:79.16666667%}.ivu-col-sm-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-sm-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-sm-push-18{left:75%}.ivu-col-sm-pull-18{right:75%}.ivu-col-sm-offset-18{margin-left:75%}.ivu-col-sm-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-sm-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-sm-push-17{left:70.83333333%}.ivu-col-sm-pull-17{right:70.83333333%}.ivu-col-sm-offset-17{margin-left:70.83333333%}.ivu-col-sm-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-sm-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-sm-push-16{left:66.66666667%}.ivu-col-sm-pull-16{right:66.66666667%}.ivu-col-sm-offset-16{margin-left:66.66666667%}.ivu-col-sm-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-sm-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-sm-push-15{left:62.5%}.ivu-col-sm-pull-15{right:62.5%}.ivu-col-sm-offset-15{margin-left:62.5%}.ivu-col-sm-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-sm-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-sm-push-14{left:58.33333333%}.ivu-col-sm-pull-14{right:58.33333333%}.ivu-col-sm-offset-14{margin-left:58.33333333%}.ivu-col-sm-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-sm-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-sm-push-13{left:54.16666667%}.ivu-col-sm-pull-13{right:54.16666667%}.ivu-col-sm-offset-13{margin-left:54.16666667%}.ivu-col-sm-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-sm-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-sm-push-12{left:50%}.ivu-col-sm-pull-12{right:50%}.ivu-col-sm-offset-12{margin-left:50%}.ivu-col-sm-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-sm-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-sm-push-11{left:45.83333333%}.ivu-col-sm-pull-11{right:45.83333333%}.ivu-col-sm-offset-11{margin-left:45.83333333%}.ivu-col-sm-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-sm-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-sm-push-10{left:41.66666667%}.ivu-col-sm-pull-10{right:41.66666667%}.ivu-col-sm-offset-10{margin-left:41.66666667%}.ivu-col-sm-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-sm-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-sm-push-9{left:37.5%}.ivu-col-sm-pull-9{right:37.5%}.ivu-col-sm-offset-9{margin-left:37.5%}.ivu-col-sm-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-sm-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-sm-push-8{left:33.33333333%}.ivu-col-sm-pull-8{right:33.33333333%}.ivu-col-sm-offset-8{margin-left:33.33333333%}.ivu-col-sm-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-sm-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-sm-push-7{left:29.16666667%}.ivu-col-sm-pull-7{right:29.16666667%}.ivu-col-sm-offset-7{margin-left:29.16666667%}.ivu-col-sm-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-sm-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-sm-push-6{left:25%}.ivu-col-sm-pull-6{right:25%}.ivu-col-sm-offset-6{margin-left:25%}.ivu-col-sm-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-sm-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-sm-push-5{left:20.83333333%}.ivu-col-sm-pull-5{right:20.83333333%}.ivu-col-sm-offset-5{margin-left:20.83333333%}.ivu-col-sm-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-sm-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-sm-push-4{left:16.66666667%}.ivu-col-sm-pull-4{right:16.66666667%}.ivu-col-sm-offset-4{margin-left:16.66666667%}.ivu-col-sm-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-sm-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-sm-push-3{left:12.5%}.ivu-col-sm-pull-3{right:12.5%}.ivu-col-sm-offset-3{margin-left:12.5%}.ivu-col-sm-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-sm-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-sm-push-2{left:8.33333333%}.ivu-col-sm-pull-2{right:8.33333333%}.ivu-col-sm-offset-2{margin-left:8.33333333%}.ivu-col-sm-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-sm-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-sm-push-1{left:4.16666667%}.ivu-col-sm-pull-1{right:4.16666667%}.ivu-col-sm-offset-1{margin-left:4.16666667%}.ivu-col-sm-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-sm-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-sm-push-0{left:auto}.ivu-col-sm-pull-0{right:auto}.ivu-col-sm-offset-0{margin-left:0}.ivu-col-sm-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:768px){.ivu-col-span-md-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-md-push-24{left:100%}.ivu-col-md-pull-24{right:100%}.ivu-col-md-offset-24{margin-left:100%}.ivu-col-md-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-md-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-md-push-23{left:95.83333333%}.ivu-col-md-pull-23{right:95.83333333%}.ivu-col-md-offset-23{margin-left:95.83333333%}.ivu-col-md-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-md-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-md-push-22{left:91.66666667%}.ivu-col-md-pull-22{right:91.66666667%}.ivu-col-md-offset-22{margin-left:91.66666667%}.ivu-col-md-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-md-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-md-push-21{left:87.5%}.ivu-col-md-pull-21{right:87.5%}.ivu-col-md-offset-21{margin-left:87.5%}.ivu-col-md-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-md-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-md-push-20{left:83.33333333%}.ivu-col-md-pull-20{right:83.33333333%}.ivu-col-md-offset-20{margin-left:83.33333333%}.ivu-col-md-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-md-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-md-push-19{left:79.16666667%}.ivu-col-md-pull-19{right:79.16666667%}.ivu-col-md-offset-19{margin-left:79.16666667%}.ivu-col-md-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-md-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-md-push-18{left:75%}.ivu-col-md-pull-18{right:75%}.ivu-col-md-offset-18{margin-left:75%}.ivu-col-md-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-md-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-md-push-17{left:70.83333333%}.ivu-col-md-pull-17{right:70.83333333%}.ivu-col-md-offset-17{margin-left:70.83333333%}.ivu-col-md-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-md-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-md-push-16{left:66.66666667%}.ivu-col-md-pull-16{right:66.66666667%}.ivu-col-md-offset-16{margin-left:66.66666667%}.ivu-col-md-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-md-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-md-push-15{left:62.5%}.ivu-col-md-pull-15{right:62.5%}.ivu-col-md-offset-15{margin-left:62.5%}.ivu-col-md-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-md-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-md-push-14{left:58.33333333%}.ivu-col-md-pull-14{right:58.33333333%}.ivu-col-md-offset-14{margin-left:58.33333333%}.ivu-col-md-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-md-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-md-push-13{left:54.16666667%}.ivu-col-md-pull-13{right:54.16666667%}.ivu-col-md-offset-13{margin-left:54.16666667%}.ivu-col-md-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-md-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-md-push-12{left:50%}.ivu-col-md-pull-12{right:50%}.ivu-col-md-offset-12{margin-left:50%}.ivu-col-md-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-md-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-md-push-11{left:45.83333333%}.ivu-col-md-pull-11{right:45.83333333%}.ivu-col-md-offset-11{margin-left:45.83333333%}.ivu-col-md-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-md-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-md-push-10{left:41.66666667%}.ivu-col-md-pull-10{right:41.66666667%}.ivu-col-md-offset-10{margin-left:41.66666667%}.ivu-col-md-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-md-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-md-push-9{left:37.5%}.ivu-col-md-pull-9{right:37.5%}.ivu-col-md-offset-9{margin-left:37.5%}.ivu-col-md-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-md-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-md-push-8{left:33.33333333%}.ivu-col-md-pull-8{right:33.33333333%}.ivu-col-md-offset-8{margin-left:33.33333333%}.ivu-col-md-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-md-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-md-push-7{left:29.16666667%}.ivu-col-md-pull-7{right:29.16666667%}.ivu-col-md-offset-7{margin-left:29.16666667%}.ivu-col-md-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-md-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-md-push-6{left:25%}.ivu-col-md-pull-6{right:25%}.ivu-col-md-offset-6{margin-left:25%}.ivu-col-md-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-md-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-md-push-5{left:20.83333333%}.ivu-col-md-pull-5{right:20.83333333%}.ivu-col-md-offset-5{margin-left:20.83333333%}.ivu-col-md-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-md-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-md-push-4{left:16.66666667%}.ivu-col-md-pull-4{right:16.66666667%}.ivu-col-md-offset-4{margin-left:16.66666667%}.ivu-col-md-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-md-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-md-push-3{left:12.5%}.ivu-col-md-pull-3{right:12.5%}.ivu-col-md-offset-3{margin-left:12.5%}.ivu-col-md-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-md-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-md-push-2{left:8.33333333%}.ivu-col-md-pull-2{right:8.33333333%}.ivu-col-md-offset-2{margin-left:8.33333333%}.ivu-col-md-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-md-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-md-push-1{left:4.16666667%}.ivu-col-md-pull-1{right:4.16666667%}.ivu-col-md-offset-1{margin-left:4.16666667%}.ivu-col-md-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-md-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-md-push-0{left:auto}.ivu-col-md-pull-0{right:auto}.ivu-col-md-offset-0{margin-left:0}.ivu-col-md-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:992px){.ivu-col-span-lg-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-lg-push-24{left:100%}.ivu-col-lg-pull-24{right:100%}.ivu-col-lg-offset-24{margin-left:100%}.ivu-col-lg-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-lg-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-lg-push-23{left:95.83333333%}.ivu-col-lg-pull-23{right:95.83333333%}.ivu-col-lg-offset-23{margin-left:95.83333333%}.ivu-col-lg-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-lg-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-lg-push-22{left:91.66666667%}.ivu-col-lg-pull-22{right:91.66666667%}.ivu-col-lg-offset-22{margin-left:91.66666667%}.ivu-col-lg-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-lg-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-lg-push-21{left:87.5%}.ivu-col-lg-pull-21{right:87.5%}.ivu-col-lg-offset-21{margin-left:87.5%}.ivu-col-lg-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-lg-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-lg-push-20{left:83.33333333%}.ivu-col-lg-pull-20{right:83.33333333%}.ivu-col-lg-offset-20{margin-left:83.33333333%}.ivu-col-lg-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-lg-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-lg-push-19{left:79.16666667%}.ivu-col-lg-pull-19{right:79.16666667%}.ivu-col-lg-offset-19{margin-left:79.16666667%}.ivu-col-lg-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-lg-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-lg-push-18{left:75%}.ivu-col-lg-pull-18{right:75%}.ivu-col-lg-offset-18{margin-left:75%}.ivu-col-lg-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-lg-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-lg-push-17{left:70.83333333%}.ivu-col-lg-pull-17{right:70.83333333%}.ivu-col-lg-offset-17{margin-left:70.83333333%}.ivu-col-lg-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-lg-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-lg-push-16{left:66.66666667%}.ivu-col-lg-pull-16{right:66.66666667%}.ivu-col-lg-offset-16{margin-left:66.66666667%}.ivu-col-lg-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-lg-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-lg-push-15{left:62.5%}.ivu-col-lg-pull-15{right:62.5%}.ivu-col-lg-offset-15{margin-left:62.5%}.ivu-col-lg-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-lg-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-lg-push-14{left:58.33333333%}.ivu-col-lg-pull-14{right:58.33333333%}.ivu-col-lg-offset-14{margin-left:58.33333333%}.ivu-col-lg-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-lg-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-lg-push-13{left:54.16666667%}.ivu-col-lg-pull-13{right:54.16666667%}.ivu-col-lg-offset-13{margin-left:54.16666667%}.ivu-col-lg-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-lg-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-lg-push-12{left:50%}.ivu-col-lg-pull-12{right:50%}.ivu-col-lg-offset-12{margin-left:50%}.ivu-col-lg-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-lg-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-lg-push-11{left:45.83333333%}.ivu-col-lg-pull-11{right:45.83333333%}.ivu-col-lg-offset-11{margin-left:45.83333333%}.ivu-col-lg-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-lg-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-lg-push-10{left:41.66666667%}.ivu-col-lg-pull-10{right:41.66666667%}.ivu-col-lg-offset-10{margin-left:41.66666667%}.ivu-col-lg-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-lg-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-lg-push-9{left:37.5%}.ivu-col-lg-pull-9{right:37.5%}.ivu-col-lg-offset-9{margin-left:37.5%}.ivu-col-lg-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-lg-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-lg-push-8{left:33.33333333%}.ivu-col-lg-pull-8{right:33.33333333%}.ivu-col-lg-offset-8{margin-left:33.33333333%}.ivu-col-lg-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-lg-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-lg-push-7{left:29.16666667%}.ivu-col-lg-pull-7{right:29.16666667%}.ivu-col-lg-offset-7{margin-left:29.16666667%}.ivu-col-lg-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-lg-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-lg-push-6{left:25%}.ivu-col-lg-pull-6{right:25%}.ivu-col-lg-offset-6{margin-left:25%}.ivu-col-lg-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-lg-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-lg-push-5{left:20.83333333%}.ivu-col-lg-pull-5{right:20.83333333%}.ivu-col-lg-offset-5{margin-left:20.83333333%}.ivu-col-lg-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-lg-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-lg-push-4{left:16.66666667%}.ivu-col-lg-pull-4{right:16.66666667%}.ivu-col-lg-offset-4{margin-left:16.66666667%}.ivu-col-lg-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-lg-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-lg-push-3{left:12.5%}.ivu-col-lg-pull-3{right:12.5%}.ivu-col-lg-offset-3{margin-left:12.5%}.ivu-col-lg-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-lg-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-lg-push-2{left:8.33333333%}.ivu-col-lg-pull-2{right:8.33333333%}.ivu-col-lg-offset-2{margin-left:8.33333333%}.ivu-col-lg-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-lg-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-lg-push-1{left:4.16666667%}.ivu-col-lg-pull-1{right:4.16666667%}.ivu-col-lg-offset-1{margin-left:4.16666667%}.ivu-col-lg-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-lg-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-lg-push-0{left:auto}.ivu-col-lg-pull-0{right:auto}.ivu-col-lg-offset-0{margin-left:0}.ivu-col-lg-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:1200px){.ivu-col-span-xl-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-xl-push-24{left:100%}.ivu-col-xl-pull-24{right:100%}.ivu-col-xl-offset-24{margin-left:100%}.ivu-col-xl-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-xl-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-xl-push-23{left:95.83333333%}.ivu-col-xl-pull-23{right:95.83333333%}.ivu-col-xl-offset-23{margin-left:95.83333333%}.ivu-col-xl-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-xl-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-xl-push-22{left:91.66666667%}.ivu-col-xl-pull-22{right:91.66666667%}.ivu-col-xl-offset-22{margin-left:91.66666667%}.ivu-col-xl-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-xl-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-xl-push-21{left:87.5%}.ivu-col-xl-pull-21{right:87.5%}.ivu-col-xl-offset-21{margin-left:87.5%}.ivu-col-xl-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-xl-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-xl-push-20{left:83.33333333%}.ivu-col-xl-pull-20{right:83.33333333%}.ivu-col-xl-offset-20{margin-left:83.33333333%}.ivu-col-xl-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-xl-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-xl-push-19{left:79.16666667%}.ivu-col-xl-pull-19{right:79.16666667%}.ivu-col-xl-offset-19{margin-left:79.16666667%}.ivu-col-xl-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-xl-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-xl-push-18{left:75%}.ivu-col-xl-pull-18{right:75%}.ivu-col-xl-offset-18{margin-left:75%}.ivu-col-xl-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-xl-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-xl-push-17{left:70.83333333%}.ivu-col-xl-pull-17{right:70.83333333%}.ivu-col-xl-offset-17{margin-left:70.83333333%}.ivu-col-xl-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-xl-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-xl-push-16{left:66.66666667%}.ivu-col-xl-pull-16{right:66.66666667%}.ivu-col-xl-offset-16{margin-left:66.66666667%}.ivu-col-xl-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-xl-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-xl-push-15{left:62.5%}.ivu-col-xl-pull-15{right:62.5%}.ivu-col-xl-offset-15{margin-left:62.5%}.ivu-col-xl-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-xl-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-xl-push-14{left:58.33333333%}.ivu-col-xl-pull-14{right:58.33333333%}.ivu-col-xl-offset-14{margin-left:58.33333333%}.ivu-col-xl-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-xl-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-xl-push-13{left:54.16666667%}.ivu-col-xl-pull-13{right:54.16666667%}.ivu-col-xl-offset-13{margin-left:54.16666667%}.ivu-col-xl-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-xl-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-xl-push-12{left:50%}.ivu-col-xl-pull-12{right:50%}.ivu-col-xl-offset-12{margin-left:50%}.ivu-col-xl-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-xl-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-xl-push-11{left:45.83333333%}.ivu-col-xl-pull-11{right:45.83333333%}.ivu-col-xl-offset-11{margin-left:45.83333333%}.ivu-col-xl-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-xl-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-xl-push-10{left:41.66666667%}.ivu-col-xl-pull-10{right:41.66666667%}.ivu-col-xl-offset-10{margin-left:41.66666667%}.ivu-col-xl-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-xl-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-xl-push-9{left:37.5%}.ivu-col-xl-pull-9{right:37.5%}.ivu-col-xl-offset-9{margin-left:37.5%}.ivu-col-xl-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-xl-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-xl-push-8{left:33.33333333%}.ivu-col-xl-pull-8{right:33.33333333%}.ivu-col-xl-offset-8{margin-left:33.33333333%}.ivu-col-xl-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-xl-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-xl-push-7{left:29.16666667%}.ivu-col-xl-pull-7{right:29.16666667%}.ivu-col-xl-offset-7{margin-left:29.16666667%}.ivu-col-xl-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-xl-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-xl-push-6{left:25%}.ivu-col-xl-pull-6{right:25%}.ivu-col-xl-offset-6{margin-left:25%}.ivu-col-xl-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-xl-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-xl-push-5{left:20.83333333%}.ivu-col-xl-pull-5{right:20.83333333%}.ivu-col-xl-offset-5{margin-left:20.83333333%}.ivu-col-xl-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-xl-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-xl-push-4{left:16.66666667%}.ivu-col-xl-pull-4{right:16.66666667%}.ivu-col-xl-offset-4{margin-left:16.66666667%}.ivu-col-xl-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-xl-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-xl-push-3{left:12.5%}.ivu-col-xl-pull-3{right:12.5%}.ivu-col-xl-offset-3{margin-left:12.5%}.ivu-col-xl-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-xl-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-xl-push-2{left:8.33333333%}.ivu-col-xl-pull-2{right:8.33333333%}.ivu-col-xl-offset-2{margin-left:8.33333333%}.ivu-col-xl-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-xl-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-xl-push-1{left:4.16666667%}.ivu-col-xl-pull-1{right:4.16666667%}.ivu-col-xl-offset-1{margin-left:4.16666667%}.ivu-col-xl-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-xl-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-xl-push-0{left:auto}.ivu-col-xl-pull-0{right:auto}.ivu-col-xl-offset-0{margin-left:0}.ivu-col-xl-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:1600px){.ivu-col-span-xxl-24{display:block;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.ivu-col-xxl-push-24{left:100%}.ivu-col-xxl-pull-24{right:100%}.ivu-col-xxl-offset-24{margin-left:100%}.ivu-col-xxl-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-xxl-23{display:block;-webkit-box-flex:0;-ms-flex:0 0 95.83333333%;flex:0 0 95.83333333%;max-width:95.83333333%}.ivu-col-xxl-push-23{left:95.83333333%}.ivu-col-xxl-pull-23{right:95.83333333%}.ivu-col-xxl-offset-23{margin-left:95.83333333%}.ivu-col-xxl-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-xxl-22{display:block;-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.ivu-col-xxl-push-22{left:91.66666667%}.ivu-col-xxl-pull-22{right:91.66666667%}.ivu-col-xxl-offset-22{margin-left:91.66666667%}.ivu-col-xxl-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-xxl-21{display:block;-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.ivu-col-xxl-push-21{left:87.5%}.ivu-col-xxl-pull-21{right:87.5%}.ivu-col-xxl-offset-21{margin-left:87.5%}.ivu-col-xxl-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-xxl-20{display:block;-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.ivu-col-xxl-push-20{left:83.33333333%}.ivu-col-xxl-pull-20{right:83.33333333%}.ivu-col-xxl-offset-20{margin-left:83.33333333%}.ivu-col-xxl-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-xxl-19{display:block;-webkit-box-flex:0;-ms-flex:0 0 79.16666667%;flex:0 0 79.16666667%;max-width:79.16666667%}.ivu-col-xxl-push-19{left:79.16666667%}.ivu-col-xxl-pull-19{right:79.16666667%}.ivu-col-xxl-offset-19{margin-left:79.16666667%}.ivu-col-xxl-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-xxl-18{display:block;-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.ivu-col-xxl-push-18{left:75%}.ivu-col-xxl-pull-18{right:75%}.ivu-col-xxl-offset-18{margin-left:75%}.ivu-col-xxl-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-xxl-17{display:block;-webkit-box-flex:0;-ms-flex:0 0 70.83333333%;flex:0 0 70.83333333%;max-width:70.83333333%}.ivu-col-xxl-push-17{left:70.83333333%}.ivu-col-xxl-pull-17{right:70.83333333%}.ivu-col-xxl-offset-17{margin-left:70.83333333%}.ivu-col-xxl-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-xxl-16{display:block;-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.ivu-col-xxl-push-16{left:66.66666667%}.ivu-col-xxl-pull-16{right:66.66666667%}.ivu-col-xxl-offset-16{margin-left:66.66666667%}.ivu-col-xxl-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-xxl-15{display:block;-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.ivu-col-xxl-push-15{left:62.5%}.ivu-col-xxl-pull-15{right:62.5%}.ivu-col-xxl-offset-15{margin-left:62.5%}.ivu-col-xxl-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-xxl-14{display:block;-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.ivu-col-xxl-push-14{left:58.33333333%}.ivu-col-xxl-pull-14{right:58.33333333%}.ivu-col-xxl-offset-14{margin-left:58.33333333%}.ivu-col-xxl-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-xxl-13{display:block;-webkit-box-flex:0;-ms-flex:0 0 54.16666667%;flex:0 0 54.16666667%;max-width:54.16666667%}.ivu-col-xxl-push-13{left:54.16666667%}.ivu-col-xxl-pull-13{right:54.16666667%}.ivu-col-xxl-offset-13{margin-left:54.16666667%}.ivu-col-xxl-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-xxl-12{display:block;-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ivu-col-xxl-push-12{left:50%}.ivu-col-xxl-pull-12{right:50%}.ivu-col-xxl-offset-12{margin-left:50%}.ivu-col-xxl-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-xxl-11{display:block;-webkit-box-flex:0;-ms-flex:0 0 45.83333333%;flex:0 0 45.83333333%;max-width:45.83333333%}.ivu-col-xxl-push-11{left:45.83333333%}.ivu-col-xxl-pull-11{right:45.83333333%}.ivu-col-xxl-offset-11{margin-left:45.83333333%}.ivu-col-xxl-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-xxl-10{display:block;-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.ivu-col-xxl-push-10{left:41.66666667%}.ivu-col-xxl-pull-10{right:41.66666667%}.ivu-col-xxl-offset-10{margin-left:41.66666667%}.ivu-col-xxl-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-xxl-9{display:block;-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.ivu-col-xxl-push-9{left:37.5%}.ivu-col-xxl-pull-9{right:37.5%}.ivu-col-xxl-offset-9{margin-left:37.5%}.ivu-col-xxl-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-xxl-8{display:block;-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.ivu-col-xxl-push-8{left:33.33333333%}.ivu-col-xxl-pull-8{right:33.33333333%}.ivu-col-xxl-offset-8{margin-left:33.33333333%}.ivu-col-xxl-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-xxl-7{display:block;-webkit-box-flex:0;-ms-flex:0 0 29.16666667%;flex:0 0 29.16666667%;max-width:29.16666667%}.ivu-col-xxl-push-7{left:29.16666667%}.ivu-col-xxl-pull-7{right:29.16666667%}.ivu-col-xxl-offset-7{margin-left:29.16666667%}.ivu-col-xxl-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-xxl-6{display:block;-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.ivu-col-xxl-push-6{left:25%}.ivu-col-xxl-pull-6{right:25%}.ivu-col-xxl-offset-6{margin-left:25%}.ivu-col-xxl-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-xxl-5{display:block;-webkit-box-flex:0;-ms-flex:0 0 20.83333333%;flex:0 0 20.83333333%;max-width:20.83333333%}.ivu-col-xxl-push-5{left:20.83333333%}.ivu-col-xxl-pull-5{right:20.83333333%}.ivu-col-xxl-offset-5{margin-left:20.83333333%}.ivu-col-xxl-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-xxl-4{display:block;-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.ivu-col-xxl-push-4{left:16.66666667%}.ivu-col-xxl-pull-4{right:16.66666667%}.ivu-col-xxl-offset-4{margin-left:16.66666667%}.ivu-col-xxl-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-xxl-3{display:block;-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.ivu-col-xxl-push-3{left:12.5%}.ivu-col-xxl-pull-3{right:12.5%}.ivu-col-xxl-offset-3{margin-left:12.5%}.ivu-col-xxl-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-xxl-2{display:block;-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.ivu-col-xxl-push-2{left:8.33333333%}.ivu-col-xxl-pull-2{right:8.33333333%}.ivu-col-xxl-offset-2{margin-left:8.33333333%}.ivu-col-xxl-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-xxl-1{display:block;-webkit-box-flex:0;-ms-flex:0 0 4.16666667%;flex:0 0 4.16666667%;max-width:4.16666667%}.ivu-col-xxl-push-1{left:4.16666667%}.ivu-col-xxl-pull-1{right:4.16666667%}.ivu-col-xxl-offset-1{margin-left:4.16666667%}.ivu-col-xxl-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-xxl-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-xxl-push-0{left:auto}.ivu-col-xxl-pull-0{right:auto}.ivu-col-xxl-offset-0{margin-left:0}.ivu-col-xxl-order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}.ivu-article h1{font-size:26px;font-weight:400}.ivu-article h2{font-size:20px;font-weight:400}.ivu-article h3{font-size:16px;font-weight:400}.ivu-article h4{font-size:14px;font-weight:400}.ivu-article h5{font-size:12px;font-weight:400}.ivu-article h6{font-size:12px;font-weight:400}.ivu-article blockquote{padding:5px 5px 3px 10px;line-height:1.5;border-left:4px solid #ddd;margin-bottom:20px;color:#666;font-size:14px}.ivu-article ul:not([class^=ivu-]){padding-left:40px;list-style-type:disc}.ivu-article li:not([class^=ivu-]){margin-bottom:5px;font-size:14px}.ivu-article ol ul:not([class^=ivu-]),.ivu-article ul ul:not([class^=ivu-]){list-style-type:circle}.ivu-article p{margin:5px;font-size:14px}.ivu-article a:not([class^=ivu-])[target="_blank"]:after{content:"\F3F2";font-family:Ionicons;color:#aaa;margin-left:3px}.fade-appear,.fade-enter-active{-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-leave-active{-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-appear,.fade-enter-active{-webkit-animation-name:ivuFadeIn;animation-name:ivuFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.fade-leave-active{-webkit-animation-name:ivuFadeOut;animation-name:ivuFadeOut;-webkit-animation-play-state:running;animation-play-state:running}.fade-appear,.fade-enter-active{opacity:0;-webkit-animation-timing-function:linear;animation-timing-function:linear}.fade-leave-active{-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes ivuFadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ivuFadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ivuFadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ivuFadeOut{0%{opacity:1}100%{opacity:0}}.move-up-appear,.move-up-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-appear,.move-up-enter-active{-webkit-animation-name:ivuMoveUpIn;animation-name:ivuMoveUpIn;-webkit-animation-play-state:running;animation-play-state:running}.move-up-leave-active{-webkit-animation-name:ivuMoveUpOut;animation-name:ivuMoveUpOut;-webkit-animation-play-state:running;animation-play-state:running}.move-up-appear,.move-up-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-up-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-down-appear,.move-down-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-appear,.move-down-enter-active{-webkit-animation-name:ivuMoveDownIn;animation-name:ivuMoveDownIn;-webkit-animation-play-state:running;animation-play-state:running}.move-down-leave-active{-webkit-animation-name:ivuMoveDownOut;animation-name:ivuMoveDownOut;-webkit-animation-play-state:running;animation-play-state:running}.move-down-appear,.move-down-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-down-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-left-appear,.move-left-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-appear,.move-left-enter-active{-webkit-animation-name:ivuMoveLeftIn;animation-name:ivuMoveLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.move-left-leave-active{-webkit-animation-name:ivuMoveLeftOut;animation-name:ivuMoveLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.move-left-appear,.move-left-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-left-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-right-appear,.move-right-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-appear,.move-right-enter-active{-webkit-animation-name:ivuMoveRightIn;animation-name:ivuMoveRightIn;-webkit-animation-play-state:running;animation-play-state:running}.move-right-leave-active{-webkit-animation-name:ivuMoveRightOut;animation-name:ivuMoveRightOut;-webkit-animation-play-state:running;animation-play-state:running}.move-right-appear,.move-right-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-right-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes ivuMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes ivuMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes ivuMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@keyframes ivuMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@-webkit-keyframes ivuMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@keyframes ivuMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@-webkit-keyframes ivuMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes ivuMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@-webkit-keyframes ivuMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes ivuMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes ivuMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes ivuMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes ivuMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes ivuMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes ivuMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}@keyframes ivuMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}.move-notice-appear,.move-notice-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-notice-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-notice-appear,.move-notice-enter-active{-webkit-animation-name:ivuMoveNoticeIn;animation-name:ivuMoveNoticeIn;-webkit-animation-play-state:running;animation-play-state:running}.move-notice-leave-active{-webkit-animation-name:ivuMoveNoticeOut;animation-name:ivuMoveNoticeOut;-webkit-animation-play-state:running;animation-play-state:running}.move-notice-appear,.move-notice-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-notice-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes ivuMoveNoticeIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes ivuMoveNoticeIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes ivuMoveNoticeOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}70%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:auto;padding:16px;margin-bottom:10px;opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:0;padding:0;margin-bottom:0;opacity:0}}@keyframes ivuMoveNoticeOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}70%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:auto;padding:16px;margin-bottom:10px;opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:0;padding:0;margin-bottom:0;opacity:0}}.ease-appear,.ease-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.ease-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.ease-appear,.ease-enter-active{-webkit-animation-name:ivuEaseIn;animation-name:ivuEaseIn;-webkit-animation-play-state:running;animation-play-state:running}.ease-leave-active{-webkit-animation-name:ivuEaseOut;animation-name:ivuEaseOut;-webkit-animation-play-state:running;animation-play-state:running}.ease-appear,.ease-enter-active{opacity:0;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s}.ease-leave-active{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes ivuEaseIn{0%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ivuEaseIn{0%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ivuEaseOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes ivuEaseOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition-drop-appear,.transition-drop-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.transition-drop-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.transition-drop-appear,.transition-drop-enter-active{-webkit-animation-name:ivuTransitionDropIn;animation-name:ivuTransitionDropIn;-webkit-animation-play-state:running;animation-play-state:running}.transition-drop-leave-active{-webkit-animation-name:ivuTransitionDropOut;animation-name:ivuTransitionDropOut;-webkit-animation-play-state:running;animation-play-state:running}.transition-drop-appear,.transition-drop-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.transition-drop-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-up-appear,.slide-up-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-appear,.slide-up-enter-active{-webkit-animation-name:ivuSlideUpIn;animation-name:ivuSlideUpIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-leave-active{-webkit-animation-name:ivuSlideUpOut;animation-name:ivuSlideUpOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-appear,.slide-up-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-up-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-down-appear,.slide-down-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-appear,.slide-down-enter-active{-webkit-animation-name:ivuSlideDownIn;animation-name:ivuSlideDownIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-leave-active{-webkit-animation-name:ivuSlideDownOut;animation-name:ivuSlideDownOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-appear,.slide-down-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-down-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-left-appear,.slide-left-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-appear,.slide-left-enter-active{-webkit-animation-name:ivuSlideLeftIn;animation-name:ivuSlideLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-leave-active{-webkit-animation-name:ivuSlideLeftOut;animation-name:ivuSlideLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-appear,.slide-left-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-left-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-right-appear,.slide-right-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-appear,.slide-right-enter-active{-webkit-animation-name:ivuSlideRightIn;animation-name:ivuSlideRightIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-leave-active{-webkit-animation-name:ivuSlideRightOut;animation-name:ivuSlideRightOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-appear,.slide-right-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-right-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes ivuTransitionDropIn{0%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes ivuTransitionDropIn{0%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes ivuTransitionDropOut{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes ivuTransitionDropOut{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes ivuSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes ivuSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes ivuSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes ivuSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes ivuSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes ivuSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes ivuSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes ivuSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes ivuSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes ivuSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes ivuSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes ivuSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@-webkit-keyframes ivuSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes ivuSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes ivuSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes ivuSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}.collapse-transition{-webkit-transition:.2s height ease-in-out,.2s padding-top ease-in-out,.2s padding-bottom ease-in-out;transition:.2s height ease-in-out,.2s padding-top ease-in-out,.2s padding-bottom ease-in-out}.ivu-btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;line-height:1.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:32px;padding:0 15px;font-size:14px;border-radius:4px;-webkit-transition:color .2s linear,background-color .2s linear,border .2s linear,-webkit-box-shadow .2s linear;transition:color .2s linear,background-color .2s linear,border .2s linear,-webkit-box-shadow .2s linear;transition:color .2s linear,background-color .2s linear,border .2s linear,box-shadow .2s linear;transition:color .2s linear,background-color .2s linear,border .2s linear,box-shadow .2s linear,-webkit-box-shadow .2s linear;color:#515a6e;background-color:#fff;border-color:#dcdee2}.ivu-btn>.ivu-icon{line-height:1.5}.ivu-btn-icon-only.ivu-btn-circle>.ivu-icon{vertical-align:baseline}.ivu-btn>i,.ivu-btn>span{display:inline-block}.ivu-btn,.ivu-btn:active,.ivu-btn:focus{outline:0}.ivu-btn:not([disabled]):hover{text-decoration:none}.ivu-btn:not([disabled]):active{outline:0}.ivu-btn.disabled,.ivu-btn[disabled]{cursor:not-allowed}.ivu-btn.disabled>*,.ivu-btn[disabled]>*{pointer-events:none}.ivu-btn-large{height:40px;padding:0 15px;font-size:16px;border-radius:4px}.ivu-btn-small{height:24px;padding:0 7px;font-size:14px;border-radius:3px}.ivu-btn-icon-only{width:32px;height:32px;padding:0;font-size:16px;border-radius:4px}.ivu-btn-icon-only.ivu-btn-large{width:40px;height:40px;padding:0;font-size:18px;border-radius:4px}.ivu-btn-icon-only.ivu-btn-small{width:24px;height:24px;padding:0;font-size:14px;border-radius:4px}.ivu-btn>a:only-child{color:currentColor}.ivu-btn>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn:hover{color:#747b8b;background-color:#fff;border-color:#e3e5e8}.ivu-btn:hover>a:only-child{color:currentColor}.ivu-btn:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn.active,.ivu-btn:active{color:#4d5669;background-color:#f2f2f2;border-color:#f2f2f2}.ivu-btn.active>a:only-child,.ivu-btn:active>a:only-child{color:currentColor}.ivu-btn.active>a:only-child:after,.ivu-btn:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn.disabled,.ivu-btn.disabled.active,.ivu-btn.disabled:active,.ivu-btn.disabled:focus,.ivu-btn.disabled:hover,.ivu-btn[disabled],.ivu-btn[disabled].active,.ivu-btn[disabled]:active,.ivu-btn[disabled]:focus,.ivu-btn[disabled]:hover,fieldset[disabled] .ivu-btn,fieldset[disabled] .ivu-btn.active,fieldset[disabled] .ivu-btn:active,fieldset[disabled] .ivu-btn:focus,fieldset[disabled] .ivu-btn:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn.disabled.active>a:only-child,.ivu-btn.disabled:active>a:only-child,.ivu-btn.disabled:focus>a:only-child,.ivu-btn.disabled:hover>a:only-child,.ivu-btn.disabled>a:only-child,.ivu-btn[disabled].active>a:only-child,.ivu-btn[disabled]:active>a:only-child,.ivu-btn[disabled]:focus>a:only-child,.ivu-btn[disabled]:hover>a:only-child,.ivu-btn[disabled]>a:only-child,fieldset[disabled] .ivu-btn.active>a:only-child,fieldset[disabled] .ivu-btn:active>a:only-child,fieldset[disabled] .ivu-btn:focus>a:only-child,fieldset[disabled] .ivu-btn:hover>a:only-child,fieldset[disabled] .ivu-btn>a:only-child{color:currentColor}.ivu-btn.disabled.active>a:only-child:after,.ivu-btn.disabled:active>a:only-child:after,.ivu-btn.disabled:focus>a:only-child:after,.ivu-btn.disabled:hover>a:only-child:after,.ivu-btn.disabled>a:only-child:after,.ivu-btn[disabled].active>a:only-child:after,.ivu-btn[disabled]:active>a:only-child:after,.ivu-btn[disabled]:focus>a:only-child:after,.ivu-btn[disabled]:hover>a:only-child:after,.ivu-btn[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn.active>a:only-child:after,fieldset[disabled] .ivu-btn:active>a:only-child:after,fieldset[disabled] .ivu-btn:focus>a:only-child:after,fieldset[disabled] .ivu-btn:hover>a:only-child:after,fieldset[disabled] .ivu-btn>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn:hover{color:#a2d98d;background-color:#fff;border-color:#a2d98d}.ivu-btn:hover>a:only-child{color:currentColor}.ivu-btn:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn.active,.ivu-btn:active{color:#84c56a;background-color:#fff;border-color:#84c56a}.ivu-btn.active>a:only-child,.ivu-btn:active>a:only-child{color:currentColor}.ivu-btn.active>a:only-child:after,.ivu-btn:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn:focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-btn-long{width:100%}.ivu-btn>.ivu-icon+span,.ivu-btn>span+.ivu-icon{margin-left:4px}.ivu-btn-primary{color:#fff;background-color:#8bcf70;border-color:#8bcf70}.ivu-btn-primary>a:only-child{color:currentColor}.ivu-btn-primary>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary:hover{color:#fff;background-color:#a2d98d;border-color:#a2d98d}.ivu-btn-primary:hover>a:only-child{color:currentColor}.ivu-btn-primary:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary.active,.ivu-btn-primary:active{color:#f2f2f2;background-color:#84c56a;border-color:#84c56a}.ivu-btn-primary.active>a:only-child,.ivu-btn-primary:active>a:only-child{color:currentColor}.ivu-btn-primary.active>a:only-child:after,.ivu-btn-primary:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary.disabled,.ivu-btn-primary.disabled.active,.ivu-btn-primary.disabled:active,.ivu-btn-primary.disabled:focus,.ivu-btn-primary.disabled:hover,.ivu-btn-primary[disabled],.ivu-btn-primary[disabled].active,.ivu-btn-primary[disabled]:active,.ivu-btn-primary[disabled]:focus,.ivu-btn-primary[disabled]:hover,fieldset[disabled] .ivu-btn-primary,fieldset[disabled] .ivu-btn-primary.active,fieldset[disabled] .ivu-btn-primary:active,fieldset[disabled] .ivu-btn-primary:focus,fieldset[disabled] .ivu-btn-primary:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-primary.disabled.active>a:only-child,.ivu-btn-primary.disabled:active>a:only-child,.ivu-btn-primary.disabled:focus>a:only-child,.ivu-btn-primary.disabled:hover>a:only-child,.ivu-btn-primary.disabled>a:only-child,.ivu-btn-primary[disabled].active>a:only-child,.ivu-btn-primary[disabled]:active>a:only-child,.ivu-btn-primary[disabled]:focus>a:only-child,.ivu-btn-primary[disabled]:hover>a:only-child,.ivu-btn-primary[disabled]>a:only-child,fieldset[disabled] .ivu-btn-primary.active>a:only-child,fieldset[disabled] .ivu-btn-primary:active>a:only-child,fieldset[disabled] .ivu-btn-primary:focus>a:only-child,fieldset[disabled] .ivu-btn-primary:hover>a:only-child,fieldset[disabled] .ivu-btn-primary>a:only-child{color:currentColor}.ivu-btn-primary.disabled.active>a:only-child:after,.ivu-btn-primary.disabled:active>a:only-child:after,.ivu-btn-primary.disabled:focus>a:only-child:after,.ivu-btn-primary.disabled:hover>a:only-child:after,.ivu-btn-primary.disabled>a:only-child:after,.ivu-btn-primary[disabled].active>a:only-child:after,.ivu-btn-primary[disabled]:active>a:only-child:after,.ivu-btn-primary[disabled]:focus>a:only-child:after,.ivu-btn-primary[disabled]:hover>a:only-child:after,.ivu-btn-primary[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-primary.active>a:only-child:after,fieldset[disabled] .ivu-btn-primary:active>a:only-child:after,fieldset[disabled] .ivu-btn-primary:focus>a:only-child:after,fieldset[disabled] .ivu-btn-primary:hover>a:only-child:after,fieldset[disabled] .ivu-btn-primary>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary.active,.ivu-btn-primary:active,.ivu-btn-primary:hover{color:#fff}.ivu-btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:not(:first-child):not(:last-child){border-right-color:#84c56a;border-left-color:#84c56a}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:first-child:not(:last-child){border-right-color:#84c56a}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#dcdee2}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary+.ivu-btn,.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:last-child:not(:first-child){border-left-color:#84c56a}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary+.ivu-btn[disabled],.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#dcdee2}.ivu-btn-group-vertical .ivu-btn-primary:not(:first-child):not(:last-child){border-top-color:#84c56a;border-bottom-color:#84c56a}.ivu-btn-group-vertical .ivu-btn-primary:first-child:not(:last-child){border-bottom-color:#84c56a}.ivu-btn-group-vertical .ivu-btn-primary:first-child:not(:last-child)[disabled]{border-top-color:#dcdee2}.ivu-btn-group-vertical .ivu-btn-primary+.ivu-btn,.ivu-btn-group-vertical .ivu-btn-primary:last-child:not(:first-child){border-top-color:#84c56a}.ivu-btn-group-vertical .ivu-btn-primary+.ivu-btn[disabled],.ivu-btn-group-vertical .ivu-btn-primary:last-child:not(:first-child)[disabled]{border-bottom-color:#dcdee2}.ivu-btn-dashed{color:#515a6e;background-color:#fff;border-color:#dcdee2;border-style:dashed}.ivu-btn-dashed>a:only-child{color:currentColor}.ivu-btn-dashed>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed:hover{color:#747b8b;background-color:#fff;border-color:#e3e5e8}.ivu-btn-dashed:hover>a:only-child{color:currentColor}.ivu-btn-dashed:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed.active,.ivu-btn-dashed:active{color:#4d5669;background-color:#f2f2f2;border-color:#f2f2f2}.ivu-btn-dashed.active>a:only-child,.ivu-btn-dashed:active>a:only-child{color:currentColor}.ivu-btn-dashed.active>a:only-child:after,.ivu-btn-dashed:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed.disabled,.ivu-btn-dashed.disabled.active,.ivu-btn-dashed.disabled:active,.ivu-btn-dashed.disabled:focus,.ivu-btn-dashed.disabled:hover,.ivu-btn-dashed[disabled],.ivu-btn-dashed[disabled].active,.ivu-btn-dashed[disabled]:active,.ivu-btn-dashed[disabled]:focus,.ivu-btn-dashed[disabled]:hover,fieldset[disabled] .ivu-btn-dashed,fieldset[disabled] .ivu-btn-dashed.active,fieldset[disabled] .ivu-btn-dashed:active,fieldset[disabled] .ivu-btn-dashed:focus,fieldset[disabled] .ivu-btn-dashed:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-dashed.disabled.active>a:only-child,.ivu-btn-dashed.disabled:active>a:only-child,.ivu-btn-dashed.disabled:focus>a:only-child,.ivu-btn-dashed.disabled:hover>a:only-child,.ivu-btn-dashed.disabled>a:only-child,.ivu-btn-dashed[disabled].active>a:only-child,.ivu-btn-dashed[disabled]:active>a:only-child,.ivu-btn-dashed[disabled]:focus>a:only-child,.ivu-btn-dashed[disabled]:hover>a:only-child,.ivu-btn-dashed[disabled]>a:only-child,fieldset[disabled] .ivu-btn-dashed.active>a:only-child,fieldset[disabled] .ivu-btn-dashed:active>a:only-child,fieldset[disabled] .ivu-btn-dashed:focus>a:only-child,fieldset[disabled] .ivu-btn-dashed:hover>a:only-child,fieldset[disabled] .ivu-btn-dashed>a:only-child{color:currentColor}.ivu-btn-dashed.disabled.active>a:only-child:after,.ivu-btn-dashed.disabled:active>a:only-child:after,.ivu-btn-dashed.disabled:focus>a:only-child:after,.ivu-btn-dashed.disabled:hover>a:only-child:after,.ivu-btn-dashed.disabled>a:only-child:after,.ivu-btn-dashed[disabled].active>a:only-child:after,.ivu-btn-dashed[disabled]:active>a:only-child:after,.ivu-btn-dashed[disabled]:focus>a:only-child:after,.ivu-btn-dashed[disabled]:hover>a:only-child:after,.ivu-btn-dashed[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-dashed.active>a:only-child:after,fieldset[disabled] .ivu-btn-dashed:active>a:only-child:after,fieldset[disabled] .ivu-btn-dashed:focus>a:only-child:after,fieldset[disabled] .ivu-btn-dashed:hover>a:only-child:after,fieldset[disabled] .ivu-btn-dashed>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed:hover{color:#a2d98d;background-color:#fff;border-color:#a2d98d}.ivu-btn-dashed:hover>a:only-child{color:currentColor}.ivu-btn-dashed:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed.active,.ivu-btn-dashed:active{color:#84c56a;background-color:#fff;border-color:#84c56a}.ivu-btn-dashed.active>a:only-child,.ivu-btn-dashed:active>a:only-child{color:currentColor}.ivu-btn-dashed.active>a:only-child:after,.ivu-btn-dashed:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed:focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-btn-text{color:#515a6e;background-color:transparent;border-color:transparent}.ivu-btn-text>a:only-child{color:currentColor}.ivu-btn-text>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text:hover{color:#747b8b;background-color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.ivu-btn-text:hover>a:only-child{color:currentColor}.ivu-btn-text:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.active,.ivu-btn-text:active{color:#4d5669;background-color:rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.ivu-btn-text.active>a:only-child,.ivu-btn-text:active>a:only-child{color:currentColor}.ivu-btn-text.active>a:only-child:after,.ivu-btn-text:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.disabled,.ivu-btn-text.disabled.active,.ivu-btn-text.disabled:active,.ivu-btn-text.disabled:focus,.ivu-btn-text.disabled:hover,.ivu-btn-text[disabled],.ivu-btn-text[disabled].active,.ivu-btn-text[disabled]:active,.ivu-btn-text[disabled]:focus,.ivu-btn-text[disabled]:hover,fieldset[disabled] .ivu-btn-text,fieldset[disabled] .ivu-btn-text.active,fieldset[disabled] .ivu-btn-text:active,fieldset[disabled] .ivu-btn-text:focus,fieldset[disabled] .ivu-btn-text:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-text.disabled.active>a:only-child,.ivu-btn-text.disabled:active>a:only-child,.ivu-btn-text.disabled:focus>a:only-child,.ivu-btn-text.disabled:hover>a:only-child,.ivu-btn-text.disabled>a:only-child,.ivu-btn-text[disabled].active>a:only-child,.ivu-btn-text[disabled]:active>a:only-child,.ivu-btn-text[disabled]:focus>a:only-child,.ivu-btn-text[disabled]:hover>a:only-child,.ivu-btn-text[disabled]>a:only-child,fieldset[disabled] .ivu-btn-text.active>a:only-child,fieldset[disabled] .ivu-btn-text:active>a:only-child,fieldset[disabled] .ivu-btn-text:focus>a:only-child,fieldset[disabled] .ivu-btn-text:hover>a:only-child,fieldset[disabled] .ivu-btn-text>a:only-child{color:currentColor}.ivu-btn-text.disabled.active>a:only-child:after,.ivu-btn-text.disabled:active>a:only-child:after,.ivu-btn-text.disabled:focus>a:only-child:after,.ivu-btn-text.disabled:hover>a:only-child:after,.ivu-btn-text.disabled>a:only-child:after,.ivu-btn-text[disabled].active>a:only-child:after,.ivu-btn-text[disabled]:active>a:only-child:after,.ivu-btn-text[disabled]:focus>a:only-child:after,.ivu-btn-text[disabled]:hover>a:only-child:after,.ivu-btn-text[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-text.active>a:only-child:after,fieldset[disabled] .ivu-btn-text:active>a:only-child:after,fieldset[disabled] .ivu-btn-text:focus>a:only-child:after,fieldset[disabled] .ivu-btn-text:hover>a:only-child:after,fieldset[disabled] .ivu-btn-text>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.disabled,.ivu-btn-text.disabled.active,.ivu-btn-text.disabled:active,.ivu-btn-text.disabled:focus,.ivu-btn-text.disabled:hover,.ivu-btn-text[disabled],.ivu-btn-text[disabled].active,.ivu-btn-text[disabled]:active,.ivu-btn-text[disabled]:focus,.ivu-btn-text[disabled]:hover,fieldset[disabled] .ivu-btn-text,fieldset[disabled] .ivu-btn-text.active,fieldset[disabled] .ivu-btn-text:active,fieldset[disabled] .ivu-btn-text:focus,fieldset[disabled] .ivu-btn-text:hover{color:#c5c8ce;background-color:#fff;border-color:transparent}.ivu-btn-text.disabled.active>a:only-child,.ivu-btn-text.disabled:active>a:only-child,.ivu-btn-text.disabled:focus>a:only-child,.ivu-btn-text.disabled:hover>a:only-child,.ivu-btn-text.disabled>a:only-child,.ivu-btn-text[disabled].active>a:only-child,.ivu-btn-text[disabled]:active>a:only-child,.ivu-btn-text[disabled]:focus>a:only-child,.ivu-btn-text[disabled]:hover>a:only-child,.ivu-btn-text[disabled]>a:only-child,fieldset[disabled] .ivu-btn-text.active>a:only-child,fieldset[disabled] .ivu-btn-text:active>a:only-child,fieldset[disabled] .ivu-btn-text:focus>a:only-child,fieldset[disabled] .ivu-btn-text:hover>a:only-child,fieldset[disabled] .ivu-btn-text>a:only-child{color:currentColor}.ivu-btn-text.disabled.active>a:only-child:after,.ivu-btn-text.disabled:active>a:only-child:after,.ivu-btn-text.disabled:focus>a:only-child:after,.ivu-btn-text.disabled:hover>a:only-child:after,.ivu-btn-text.disabled>a:only-child:after,.ivu-btn-text[disabled].active>a:only-child:after,.ivu-btn-text[disabled]:active>a:only-child:after,.ivu-btn-text[disabled]:focus>a:only-child:after,.ivu-btn-text[disabled]:hover>a:only-child:after,.ivu-btn-text[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-text.active>a:only-child:after,fieldset[disabled] .ivu-btn-text:active>a:only-child:after,fieldset[disabled] .ivu-btn-text:focus>a:only-child:after,fieldset[disabled] .ivu-btn-text:hover>a:only-child:after,fieldset[disabled] .ivu-btn-text>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text:hover{color:#a2d98d;background-color:#fff;border-color:transparent}.ivu-btn-text:hover>a:only-child{color:currentColor}.ivu-btn-text:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.active,.ivu-btn-text:active{color:#84c56a;background-color:#fff;border-color:transparent}.ivu-btn-text.active>a:only-child,.ivu-btn-text:active>a:only-child{color:currentColor}.ivu-btn-text.active>a:only-child:after,.ivu-btn-text:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text:focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-btn-success{color:#fff;background-color:#19be6b;border-color:#19be6b}.ivu-btn-success>a:only-child{color:currentColor}.ivu-btn-success>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success:hover{color:#fff;background-color:#47cb89;border-color:#47cb89}.ivu-btn-success:hover>a:only-child{color:currentColor}.ivu-btn-success:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success.active,.ivu-btn-success:active{color:#f2f2f2;background-color:#18b566;border-color:#18b566}.ivu-btn-success.active>a:only-child,.ivu-btn-success:active>a:only-child{color:currentColor}.ivu-btn-success.active>a:only-child:after,.ivu-btn-success:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success.disabled,.ivu-btn-success.disabled.active,.ivu-btn-success.disabled:active,.ivu-btn-success.disabled:focus,.ivu-btn-success.disabled:hover,.ivu-btn-success[disabled],.ivu-btn-success[disabled].active,.ivu-btn-success[disabled]:active,.ivu-btn-success[disabled]:focus,.ivu-btn-success[disabled]:hover,fieldset[disabled] .ivu-btn-success,fieldset[disabled] .ivu-btn-success.active,fieldset[disabled] .ivu-btn-success:active,fieldset[disabled] .ivu-btn-success:focus,fieldset[disabled] .ivu-btn-success:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-success.disabled.active>a:only-child,.ivu-btn-success.disabled:active>a:only-child,.ivu-btn-success.disabled:focus>a:only-child,.ivu-btn-success.disabled:hover>a:only-child,.ivu-btn-success.disabled>a:only-child,.ivu-btn-success[disabled].active>a:only-child,.ivu-btn-success[disabled]:active>a:only-child,.ivu-btn-success[disabled]:focus>a:only-child,.ivu-btn-success[disabled]:hover>a:only-child,.ivu-btn-success[disabled]>a:only-child,fieldset[disabled] .ivu-btn-success.active>a:only-child,fieldset[disabled] .ivu-btn-success:active>a:only-child,fieldset[disabled] .ivu-btn-success:focus>a:only-child,fieldset[disabled] .ivu-btn-success:hover>a:only-child,fieldset[disabled] .ivu-btn-success>a:only-child{color:currentColor}.ivu-btn-success.disabled.active>a:only-child:after,.ivu-btn-success.disabled:active>a:only-child:after,.ivu-btn-success.disabled:focus>a:only-child:after,.ivu-btn-success.disabled:hover>a:only-child:after,.ivu-btn-success.disabled>a:only-child:after,.ivu-btn-success[disabled].active>a:only-child:after,.ivu-btn-success[disabled]:active>a:only-child:after,.ivu-btn-success[disabled]:focus>a:only-child:after,.ivu-btn-success[disabled]:hover>a:only-child:after,.ivu-btn-success[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-success.active>a:only-child:after,fieldset[disabled] .ivu-btn-success:active>a:only-child:after,fieldset[disabled] .ivu-btn-success:focus>a:only-child:after,fieldset[disabled] .ivu-btn-success:hover>a:only-child:after,fieldset[disabled] .ivu-btn-success>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success.active,.ivu-btn-success:active,.ivu-btn-success:hover{color:#fff}.ivu-btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(25,190,107,.2);box-shadow:0 0 0 2px rgba(25,190,107,.2)}.ivu-btn-warning{color:#fff;background-color:#f90;border-color:#f90}.ivu-btn-warning>a:only-child{color:currentColor}.ivu-btn-warning>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning:hover{color:#fff;background-color:#ffad33;border-color:#ffad33}.ivu-btn-warning:hover>a:only-child{color:currentColor}.ivu-btn-warning:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning.active,.ivu-btn-warning:active{color:#f2f2f2;background-color:#f29100;border-color:#f29100}.ivu-btn-warning.active>a:only-child,.ivu-btn-warning:active>a:only-child{color:currentColor}.ivu-btn-warning.active>a:only-child:after,.ivu-btn-warning:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning.disabled,.ivu-btn-warning.disabled.active,.ivu-btn-warning.disabled:active,.ivu-btn-warning.disabled:focus,.ivu-btn-warning.disabled:hover,.ivu-btn-warning[disabled],.ivu-btn-warning[disabled].active,.ivu-btn-warning[disabled]:active,.ivu-btn-warning[disabled]:focus,.ivu-btn-warning[disabled]:hover,fieldset[disabled] .ivu-btn-warning,fieldset[disabled] .ivu-btn-warning.active,fieldset[disabled] .ivu-btn-warning:active,fieldset[disabled] .ivu-btn-warning:focus,fieldset[disabled] .ivu-btn-warning:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-warning.disabled.active>a:only-child,.ivu-btn-warning.disabled:active>a:only-child,.ivu-btn-warning.disabled:focus>a:only-child,.ivu-btn-warning.disabled:hover>a:only-child,.ivu-btn-warning.disabled>a:only-child,.ivu-btn-warning[disabled].active>a:only-child,.ivu-btn-warning[disabled]:active>a:only-child,.ivu-btn-warning[disabled]:focus>a:only-child,.ivu-btn-warning[disabled]:hover>a:only-child,.ivu-btn-warning[disabled]>a:only-child,fieldset[disabled] .ivu-btn-warning.active>a:only-child,fieldset[disabled] .ivu-btn-warning:active>a:only-child,fieldset[disabled] .ivu-btn-warning:focus>a:only-child,fieldset[disabled] .ivu-btn-warning:hover>a:only-child,fieldset[disabled] .ivu-btn-warning>a:only-child{color:currentColor}.ivu-btn-warning.disabled.active>a:only-child:after,.ivu-btn-warning.disabled:active>a:only-child:after,.ivu-btn-warning.disabled:focus>a:only-child:after,.ivu-btn-warning.disabled:hover>a:only-child:after,.ivu-btn-warning.disabled>a:only-child:after,.ivu-btn-warning[disabled].active>a:only-child:after,.ivu-btn-warning[disabled]:active>a:only-child:after,.ivu-btn-warning[disabled]:focus>a:only-child:after,.ivu-btn-warning[disabled]:hover>a:only-child:after,.ivu-btn-warning[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-warning.active>a:only-child:after,fieldset[disabled] .ivu-btn-warning:active>a:only-child:after,fieldset[disabled] .ivu-btn-warning:focus>a:only-child:after,fieldset[disabled] .ivu-btn-warning:hover>a:only-child:after,fieldset[disabled] .ivu-btn-warning>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning.active,.ivu-btn-warning:active,.ivu-btn-warning:hover{color:#fff}.ivu-btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(255,153,0,.2);box-shadow:0 0 0 2px rgba(255,153,0,.2)}.ivu-btn-error{color:#fff;background-color:#ed4014;border-color:#ed4014}.ivu-btn-error>a:only-child{color:currentColor}.ivu-btn-error>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error:hover{color:#fff;background-color:#f16643;border-color:#f16643}.ivu-btn-error:hover>a:only-child{color:currentColor}.ivu-btn-error:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error.active,.ivu-btn-error:active{color:#f2f2f2;background-color:#e13d13;border-color:#e13d13}.ivu-btn-error.active>a:only-child,.ivu-btn-error:active>a:only-child{color:currentColor}.ivu-btn-error.active>a:only-child:after,.ivu-btn-error:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error.disabled,.ivu-btn-error.disabled.active,.ivu-btn-error.disabled:active,.ivu-btn-error.disabled:focus,.ivu-btn-error.disabled:hover,.ivu-btn-error[disabled],.ivu-btn-error[disabled].active,.ivu-btn-error[disabled]:active,.ivu-btn-error[disabled]:focus,.ivu-btn-error[disabled]:hover,fieldset[disabled] .ivu-btn-error,fieldset[disabled] .ivu-btn-error.active,fieldset[disabled] .ivu-btn-error:active,fieldset[disabled] .ivu-btn-error:focus,fieldset[disabled] .ivu-btn-error:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-error.disabled.active>a:only-child,.ivu-btn-error.disabled:active>a:only-child,.ivu-btn-error.disabled:focus>a:only-child,.ivu-btn-error.disabled:hover>a:only-child,.ivu-btn-error.disabled>a:only-child,.ivu-btn-error[disabled].active>a:only-child,.ivu-btn-error[disabled]:active>a:only-child,.ivu-btn-error[disabled]:focus>a:only-child,.ivu-btn-error[disabled]:hover>a:only-child,.ivu-btn-error[disabled]>a:only-child,fieldset[disabled] .ivu-btn-error.active>a:only-child,fieldset[disabled] .ivu-btn-error:active>a:only-child,fieldset[disabled] .ivu-btn-error:focus>a:only-child,fieldset[disabled] .ivu-btn-error:hover>a:only-child,fieldset[disabled] .ivu-btn-error>a:only-child{color:currentColor}.ivu-btn-error.disabled.active>a:only-child:after,.ivu-btn-error.disabled:active>a:only-child:after,.ivu-btn-error.disabled:focus>a:only-child:after,.ivu-btn-error.disabled:hover>a:only-child:after,.ivu-btn-error.disabled>a:only-child:after,.ivu-btn-error[disabled].active>a:only-child:after,.ivu-btn-error[disabled]:active>a:only-child:after,.ivu-btn-error[disabled]:focus>a:only-child:after,.ivu-btn-error[disabled]:hover>a:only-child:after,.ivu-btn-error[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-error.active>a:only-child:after,fieldset[disabled] .ivu-btn-error:active>a:only-child:after,fieldset[disabled] .ivu-btn-error:focus>a:only-child:after,fieldset[disabled] .ivu-btn-error:hover>a:only-child:after,fieldset[disabled] .ivu-btn-error>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error.active,.ivu-btn-error:active,.ivu-btn-error:hover{color:#fff}.ivu-btn-error:focus{-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-btn-info{color:#fff;background-color:#2db7f5;border-color:#2db7f5}.ivu-btn-info>a:only-child{color:currentColor}.ivu-btn-info>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info:hover{color:#fff;background-color:#57c5f7;border-color:#57c5f7}.ivu-btn-info:hover>a:only-child{color:currentColor}.ivu-btn-info:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info.active,.ivu-btn-info:active{color:#f2f2f2;background-color:#2baee9;border-color:#2baee9}.ivu-btn-info.active>a:only-child,.ivu-btn-info:active>a:only-child{color:currentColor}.ivu-btn-info.active>a:only-child:after,.ivu-btn-info:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info.disabled,.ivu-btn-info.disabled.active,.ivu-btn-info.disabled:active,.ivu-btn-info.disabled:focus,.ivu-btn-info.disabled:hover,.ivu-btn-info[disabled],.ivu-btn-info[disabled].active,.ivu-btn-info[disabled]:active,.ivu-btn-info[disabled]:focus,.ivu-btn-info[disabled]:hover,fieldset[disabled] .ivu-btn-info,fieldset[disabled] .ivu-btn-info.active,fieldset[disabled] .ivu-btn-info:active,fieldset[disabled] .ivu-btn-info:focus,fieldset[disabled] .ivu-btn-info:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-info.disabled.active>a:only-child,.ivu-btn-info.disabled:active>a:only-child,.ivu-btn-info.disabled:focus>a:only-child,.ivu-btn-info.disabled:hover>a:only-child,.ivu-btn-info.disabled>a:only-child,.ivu-btn-info[disabled].active>a:only-child,.ivu-btn-info[disabled]:active>a:only-child,.ivu-btn-info[disabled]:focus>a:only-child,.ivu-btn-info[disabled]:hover>a:only-child,.ivu-btn-info[disabled]>a:only-child,fieldset[disabled] .ivu-btn-info.active>a:only-child,fieldset[disabled] .ivu-btn-info:active>a:only-child,fieldset[disabled] .ivu-btn-info:focus>a:only-child,fieldset[disabled] .ivu-btn-info:hover>a:only-child,fieldset[disabled] .ivu-btn-info>a:only-child{color:currentColor}.ivu-btn-info.disabled.active>a:only-child:after,.ivu-btn-info.disabled:active>a:only-child:after,.ivu-btn-info.disabled:focus>a:only-child:after,.ivu-btn-info.disabled:hover>a:only-child:after,.ivu-btn-info.disabled>a:only-child:after,.ivu-btn-info[disabled].active>a:only-child:after,.ivu-btn-info[disabled]:active>a:only-child:after,.ivu-btn-info[disabled]:focus>a:only-child:after,.ivu-btn-info[disabled]:hover>a:only-child:after,.ivu-btn-info[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-info.active>a:only-child:after,fieldset[disabled] .ivu-btn-info:active>a:only-child:after,fieldset[disabled] .ivu-btn-info:focus>a:only-child:after,fieldset[disabled] .ivu-btn-info:hover>a:only-child:after,fieldset[disabled] .ivu-btn-info>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info.active,.ivu-btn-info:active,.ivu-btn-info:hover{color:#fff}.ivu-btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(45,183,245,.2);box-shadow:0 0 0 2px rgba(45,183,245,.2)}.ivu-btn-circle,.ivu-btn-circle-outline{border-radius:32px}.ivu-btn-circle-outline.ivu-btn-large,.ivu-btn-circle.ivu-btn-large{border-radius:40px}.ivu-btn-circle-outline.ivu-btn-size,.ivu-btn-circle.ivu-btn-size{border-radius:24px}.ivu-btn-circle-outline.ivu-btn-icon-only,.ivu-btn-circle.ivu-btn-icon-only{width:32px;height:32px;padding:0;font-size:16px;border-radius:50%}.ivu-btn-circle-outline.ivu-btn-icon-only.ivu-btn-large,.ivu-btn-circle.ivu-btn-icon-only.ivu-btn-large{width:40px;height:40px;padding:0;font-size:18px;border-radius:50%}.ivu-btn-circle-outline.ivu-btn-icon-only.ivu-btn-small,.ivu-btn-circle.ivu-btn-icon-only.ivu-btn-small{width:24px;height:24px;padding:0;font-size:14px;border-radius:50%}.ivu-btn:before{position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;background:#fff;opacity:.35;content:'';border-radius:inherit;z-index:1;-webkit-transition:opacity .2s;transition:opacity .2s;pointer-events:none;display:none}.ivu-btn.ivu-btn-loading{pointer-events:none;position:relative}.ivu-btn.ivu-btn-loading:before{display:block}.ivu-btn-group{position:relative;display:inline-block;vertical-align:middle}.ivu-btn-group>.ivu-btn{position:relative;float:left}.ivu-btn-group>.ivu-btn.active,.ivu-btn-group>.ivu-btn:active,.ivu-btn-group>.ivu-btn:hover{z-index:2}.ivu-btn-group-circle .ivu-btn{border-radius:32px}.ivu-btn-group-large.ivu-btn-group-circle .ivu-btn{border-radius:40px}.ivu-btn-group-large>.ivu-btn{height:40px;padding:0 15px;font-size:16px;border-radius:4px}.ivu-btn-group-small.ivu-btn-group-circle .ivu-btn{border-radius:24px}.ivu-btn-group-small>.ivu-btn{height:24px;padding:0 7px;font-size:14px;border-radius:3px}.ivu-btn-group-small>.ivu-btn>.ivu-icon{font-size:14px}.ivu-btn-group-small .ivu-btn-icon-only{width:24px;height:24px;padding:0}.ivu-btn-group-large .ivu-btn-icon-only{width:40px;height:40px;padding:0}.ivu-btn+.ivu-btn-group,.ivu-btn-group .ivu-btn+.ivu-btn,.ivu-btn-group+.ivu-btn,.ivu-btn-group+.ivu-btn-group{margin-left:-1px}.ivu-btn-group .ivu-btn:not(:first-child):not(:last-child){border-radius:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn:first-child{margin-left:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.ivu-btn-group>.ivu-btn-group{float:left}.ivu-btn-group>.ivu-btn-group:not(:first-child):not(:last-child)>.ivu-btn{border-radius:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn-group:first-child:not(:last-child)>.ivu-btn:last-child{border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn-group:last-child:not(:first-child)>.ivu-btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.ivu-btn-group-vertical{display:inline-block;vertical-align:middle}.ivu-btn-group-vertical>.ivu-btn{display:block;width:100%;max-width:100%;float:none;min-width:32px}.ivu-btn-group-vertical.ivu-btn-group-small>.ivu-btn{min-width:24px}.ivu-btn-group-vertical.ivu-btn-group-large>.ivu-btn{min-width:40px}.ivu-btn+.ivu-btn-group-vertical,.ivu-btn-group-vertical .ivu-btn+.ivu-btn,.ivu-btn-group-vertical+.ivu-btn,.ivu-btn-group-vertical+.ivu-btn-group-vertical{margin-top:-1px;margin-left:0}.ivu-btn-group-vertical>.ivu-btn:first-child{margin-top:0}.ivu-btn-group-vertical>.ivu-btn:first-child:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.ivu-btn-group-vertical>.ivu-btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.ivu-btn-group-vertical>.ivu-btn-group-vertical:first-child:not(:last-child)>.ivu-btn:last-child{border-bottom-left-radius:0;border-bottom-right-radius:0;padding-bottom:8px}.ivu-btn-group-vertical>.ivu-btn-group-vertical:last-child:not(:first-child)>.ivu-btn:first-child{border-bottom-right-radius:0;border-bottom-left-radius:0;padding-top:8px}.ivu-btn-ghost{color:#fff;background:0 0}.ivu-btn-ghost:hover{background:0 0}.ivu-btn-ghost.ivu-btn-dashed,.ivu-btn-ghost.ivu-btn-default{color:#fff;border-color:#fff}.ivu-btn-ghost.ivu-btn-dashed:hover,.ivu-btn-ghost.ivu-btn-default:hover{color:#a2d98d;border-color:#a2d98d}.ivu-btn-ghost.ivu-btn-primary{color:#8bcf70}.ivu-btn-ghost.ivu-btn-primary:hover{color:#a2d98d;background:rgba(249,253,248,.5)}.ivu-btn-ghost.ivu-btn-info{color:#2db7f5}.ivu-btn-ghost.ivu-btn-info:hover{color:#57c5f7;background:rgba(245,251,254,.5)}.ivu-btn-ghost.ivu-btn-success{color:#19be6b}.ivu-btn-ghost.ivu-btn-success:hover{color:#47cb89;background:rgba(244,252,248,.5)}.ivu-btn-ghost.ivu-btn-warning{color:#f90}.ivu-btn-ghost.ivu-btn-warning:hover{color:#ffad33;background:rgba(255,250,242,.5)}.ivu-btn-ghost.ivu-btn-error{color:#ed4014}.ivu-btn-ghost.ivu-btn-error:hover{color:#f16643;background:rgba(254,245,243,.5)}.ivu-btn-ghost.ivu-btn-dashed[disabled],.ivu-btn-ghost.ivu-btn-default[disabled],.ivu-btn-ghost.ivu-btn-error[disabled],.ivu-btn-ghost.ivu-btn-info[disabled],.ivu-btn-ghost.ivu-btn-primary[disabled],.ivu-btn-ghost.ivu-btn-success[disabled],.ivu-btn-ghost.ivu-btn-warning[disabled]{background:0 0;color:rgba(0,0,0,.25);border-color:#dcdee2}.ivu-btn-ghost.ivu-btn-text[disabled]{background:0 0;color:rgba(0,0,0,.25)}a.ivu-btn{padding-top:.1px;line-height:30px}a.ivu-btn-large{line-height:38px}a.ivu-btn-small{line-height:22px}.ivu-affix{position:fixed;z-index:10}.ivu-back-top{z-index:10;position:fixed;cursor:pointer;display:none}.ivu-back-top.ivu-back-top-show{display:block}.ivu-back-top-inner{background-color:rgba(0,0,0,.6);border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-back-top-inner:hover{background-color:rgba(0,0,0,.7)}.ivu-back-top i{color:#fff;font-size:24px;padding:8px 12px}.ivu-badge{position:relative;display:inline-block}.ivu-badge-count{font-family:"Monospaced Number";line-height:1;vertical-align:middle;position:absolute;-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);top:-10px;right:0;height:20px;border-radius:10px;min-width:20px;background:#ed4014;border:1px solid transparent;color:#fff;line-height:18px;text-align:center;padding:0 6px;font-size:12px;white-space:nowrap;-webkit-transform-origin:-10% center;-ms-transform-origin:-10% center;transform-origin:-10% center;z-index:10;-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.ivu-badge-count-custom{background:0 0;color:inherit;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ivu-badge-count a,.ivu-badge-count a:hover{color:#fff}.ivu-badge-count-alone{top:auto;display:block;position:relative;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.ivu-badge-count-primary{background:#8bcf70}.ivu-badge-count-success{background:#19be6b}.ivu-badge-count-error{background:#ed4014}.ivu-badge-count-warning{background:#f90}.ivu-badge-count-info{background:#2db7f5}.ivu-badge-count-normal{background:#e6ebf1;color:#808695}.ivu-badge-dot{position:absolute;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);-webkit-transform-origin:0 center;-ms-transform-origin:0 center;transform-origin:0 center;top:-4px;right:-8px;height:8px;width:8px;border-radius:100%;background:#ed4014;z-index:10;-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.ivu-badge-status{line-height:inherit;vertical-align:baseline}.ivu-badge-status-dot{width:6px;height:6px;display:inline-block;border-radius:50%;vertical-align:middle;position:relative;top:-1px}.ivu-badge-status-success{background-color:#19be6b}.ivu-badge-status-processing{background-color:#8bcf70;position:relative}.ivu-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:50%;border:1px solid #8bcf70;content:'';-webkit-animation:aniStatusProcessing 1.2s infinite ease-in-out;animation:aniStatusProcessing 1.2s infinite ease-in-out}.ivu-badge-status-default{background-color:#e6ebf1}.ivu-badge-status-error{background-color:#ed4014}.ivu-badge-status-warning{background-color:#f90}.ivu-badge-status-text{display:inline-block;color:#515a6e;font-size:14px;margin-left:6px}.ivu-badge-status-pink{background-color:#eb2f96}.ivu-badge-status-magenta{background-color:#eb2f96}.ivu-badge-status-red{background-color:#f5222d}.ivu-badge-status-volcano{background-color:#fa541c}.ivu-badge-status-orange{background-color:#fa8c16}.ivu-badge-status-yellow{background-color:#fadb14}.ivu-badge-status-gold{background-color:#faad14}.ivu-badge-status-cyan{background-color:#13c2c2}.ivu-badge-status-lime{background-color:#a0d911}.ivu-badge-status-green{background-color:#52c41a}.ivu-badge-status-blue{background-color:#1890ff}.ivu-badge-status-geekblue{background-color:#2f54eb}.ivu-badge-status-purple{background-color:#722ed1}@-webkit-keyframes aniStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}100%{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}@keyframes aniStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}100%{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}.ivu-chart-circle{display:inline-block;position:relative}.ivu-chart-circle-inner{width:100%;text-align:center;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);line-height:1}.ivu-spin{color:#8bcf70;vertical-align:middle;text-align:center}.ivu-spin-dot{position:relative;display:block;border-radius:50%;background-color:#8bcf70;width:20px;height:20px;-webkit-animation:ani-spin-bounce 1s 0s ease-in-out infinite;animation:ani-spin-bounce 1s 0s ease-in-out infinite}.ivu-spin-large .ivu-spin-dot{width:32px;height:32px}.ivu-spin-small .ivu-spin-dot{width:12px;height:12px}.ivu-spin-fix{position:absolute;top:0;left:0;z-index:8;width:100%;height:100%;background-color:rgba(255,255,255,.9)}.ivu-spin-fullscreen{z-index:2010}.ivu-spin-fullscreen-wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.ivu-spin-fix .ivu-spin-main{position:absolute;top:50%;left:50%;-ms-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ivu-spin-fix .ivu-spin-dot{display:inline-block}.ivu-spin-show-text .ivu-spin-dot,.ivu-spin-text{display:none}.ivu-spin-show-text .ivu-spin-text{display:block}.ivu-table-wrapper>.ivu-spin-fix{border:none}.ivu-table-wrapper-with-border>.ivu-spin-fix{border:1px solid #dcdee2;border-top:0;border-left:0}@-webkit-keyframes ani-spin-bounce{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes ani-spin-bounce{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.ivu-alert{position:relative;padding:8px 48px 8px 16px;border-radius:4px;color:#515a6e;font-size:14px;line-height:16px;margin-bottom:10px}.ivu-alert.ivu-alert-with-icon{padding:8px 48px 8px 38px}.ivu-alert-icon{font-size:16px;top:6px;left:12px;position:absolute}.ivu-alert-desc{font-size:14px;color:#515a6e;line-height:21px;display:none;text-align:justify}.ivu-alert-success{border:1px solid #8ce6b0;background-color:#edfff3}.ivu-alert-success .ivu-alert-icon{color:#19be6b}.ivu-alert-info{border:1px solid #ecf5e6;background-color:#f7fff0}.ivu-alert-info .ivu-alert-icon{color:#8bcf70}.ivu-alert-warning{border:1px solid #ffd77a;background-color:#fff9e6}.ivu-alert-warning .ivu-alert-icon{color:#f90}.ivu-alert-error{border:1px solid #ffb08f;background-color:#ffefe6}.ivu-alert-error .ivu-alert-icon{color:#ed4014}.ivu-alert-close{font-size:12px;position:absolute;right:8px;top:8px;overflow:hidden;cursor:pointer}.ivu-alert-close .ivu-icon-ios-close{font-size:22px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:-3px}.ivu-alert-close .ivu-icon-ios-close:hover{color:#444}.ivu-alert-with-desc{padding:16px;position:relative;border-radius:4px;margin-bottom:10px;color:#515a6e;line-height:1.5}.ivu-alert-with-desc.ivu-alert-with-icon{padding:16px 16px 16px 69px}.ivu-alert-with-desc .ivu-alert-desc{display:block}.ivu-alert-with-desc .ivu-alert-message{font-size:16px;color:#17233d;display:block;margin-bottom:4px}.ivu-alert-with-desc .ivu-alert-icon{top:50%;left:24px;margin-top:-24px;font-size:28px}.ivu-alert-with-banner{border-radius:0}.ivu-collapse{background-color:#f7f7f7;border-radius:3px;border:1px solid #dcdee2}.ivu-collapse-simple{border-left:none;border-right:none;background-color:#fff;border-radius:0}.ivu-collapse>.ivu-collapse-item{border-top:1px solid #dcdee2}.ivu-collapse>.ivu-collapse-item:first-child{border-top:0}.ivu-collapse>.ivu-collapse-item>.ivu-collapse-header{height:38px;line-height:38px;padding-left:16px;color:#666;cursor:pointer;position:relative;border-bottom:1px solid transparent;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-collapse>.ivu-collapse-item>.ivu-collapse-header>i{-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;margin-right:14px}.ivu-collapse>.ivu-collapse-item.ivu-collapse-item-active>.ivu-collapse-header{border-bottom:1px solid #dcdee2}.ivu-collapse-simple>.ivu-collapse-item.ivu-collapse-item-active>.ivu-collapse-header{border-bottom:1px solid transparent}.ivu-collapse>.ivu-collapse-item.ivu-collapse-item-active>.ivu-collapse-header>i{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ivu-collapse-content{color:#515a6e;padding:0 16px;background-color:#fff}.ivu-collapse-content>.ivu-collapse-content-box{padding-top:16px;padding-bottom:16px}.ivu-collapse-simple>.ivu-collapse-item>.ivu-collapse-content>.ivu-collapse-content-box{padding-top:0}.ivu-collapse-item:last-child>.ivu-collapse-content{border-radius:0 0 3px 3px}.ivu-card{display:block;background:#fff;border-radius:4px;font-size:14px;position:relative;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-card-bordered{border:1px solid #dcdee2;border-color:#e8eaec}.ivu-card-shadow{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.ivu-card:hover{-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);border-color:#eee}.ivu-card.ivu-card-dis-hover:hover{-webkit-box-shadow:none;box-shadow:none;border-color:transparent}.ivu-card.ivu-card-dis-hover.ivu-card-bordered:hover{border-color:#e8eaec}.ivu-card.ivu-card-shadow:hover{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.ivu-card-head{border-bottom:1px solid #e8eaec;padding:14px 16px;line-height:1}.ivu-card-head p,.ivu-card-head-inner{display:inline-block;width:100%;height:20px;line-height:20px;font-size:16px;color:#17233d;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-card-extra{position:absolute;right:16px;top:14px}.ivu-card-body{padding:16px}.ivu-message{font-size:14px;position:fixed;z-index:1010;width:100%;top:16px;left:0;pointer-events:none}.ivu-message-notice{padding:8px;text-align:center;-webkit-transition:height .3s ease-in-out,padding .3s ease-in-out;transition:height .3s ease-in-out,padding .3s ease-in-out}.ivu-message-notice:first-child{margin-top:-8px}.ivu-message-notice-close{position:absolute;right:4px;top:10px;color:#999;outline:0}.ivu-message-notice-close i.ivu-icon{font-size:22px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:-3px}.ivu-message-notice-close i.ivu-icon:hover{color:#444}.ivu-message-notice-content{display:inline-block;pointer-events:all;padding:8px 16px;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);background:#fff;position:relative}.ivu-message-notice-content-text{display:inline-block}.ivu-message-notice-closable .ivu-message-notice-content-text{padding-right:32px}.ivu-message-success .ivu-icon{color:#19be6b}.ivu-message-error .ivu-icon{color:#ed4014}.ivu-message-warning .ivu-icon{color:#f90}.ivu-message-info .ivu-icon,.ivu-message-loading .ivu-icon{color:#8bcf70}.ivu-message .ivu-icon{margin-right:4px;font-size:16px;vertical-align:middle}.ivu-message-custom-content span{vertical-align:middle}.ivu-message-notice-with-background .ivu-message-notice-content-background{-webkit-box-shadow:none;box-shadow:none}.ivu-message-notice-with-background .ivu-message-notice-content-info{background:#f7fff0;color:#8acf70;border:1px solid #f6fff0}.ivu-message-notice-with-background .ivu-message-notice-content-success{background:#edfff3;color:#19bf6c;border:1px solid #bbf2cf}.ivu-message-notice-with-background .ivu-message-notice-content-warning{background:#fff9e6;color:#f90;border:1px solid #ffe7a3}.ivu-message-notice-with-background .ivu-message-notice-content-error{background:#ffefe6;color:#ed3f13;border:1px solid #ffcfb8}.ivu-notice{width:335px;margin-right:24px;position:fixed;z-index:1010}.ivu-notice-content-with-icon{margin-left:51px}.ivu-notice-with-desc.ivu-notice-with-icon .ivu-notice-title{margin-left:51px}.ivu-notice-notice{margin-bottom:10px;padding:16px;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);background:#fff;line-height:1;position:relative;overflow:hidden}.ivu-notice-notice-close{position:absolute;right:8px;top:15px;color:#999;outline:0}.ivu-notice-notice-close i{font-size:22px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:-3px}.ivu-notice-notice-close i:hover{color:#444}.ivu-notice-notice-content-with-render .ivu-notice-desc{display:none}.ivu-notice-notice-with-desc .ivu-notice-notice-close{top:11px}.ivu-notice-content-with-render-notitle{margin-left:26px}.ivu-notice-title{font-size:16px;line-height:19px;color:#17233d;padding-right:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-notice-with-desc .ivu-notice-title{margin-bottom:8px}.ivu-notice-desc{font-size:14px;color:#515a6e;text-align:justify;line-height:1.5}.ivu-notice-with-desc.ivu-notice-with-icon .ivu-notice-desc{margin-left:51px}.ivu-notice-with-icon .ivu-notice-title{margin-left:26px}.ivu-notice-icon{position:absolute;top:-2px;font-size:20px}.ivu-notice-icon-success{color:#19be6b}.ivu-notice-icon-info{color:#8bcf70}.ivu-notice-icon-warning{color:#f90}.ivu-notice-icon-error{color:#ed4014}.ivu-notice-with-desc .ivu-notice-icon{font-size:36px;top:-6px}.ivu-notice-custom-content{position:relative}.ivu-radio-focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2);z-index:1}.ivu-radio-group{display:inline-block;font-size:14px;vertical-align:middle}.ivu-radio-group-vertical .ivu-radio-wrapper{display:block;height:30px;line-height:30px}.ivu-radio-wrapper{font-size:14px;vertical-align:middle;display:inline-block;position:relative;white-space:nowrap;margin-right:8px;cursor:pointer}.ivu-radio-wrapper-disabled{cursor:not-allowed}.ivu-radio{display:inline-block;margin-right:4px;white-space:nowrap;position:relative;line-height:1;vertical-align:middle;cursor:pointer}.ivu-radio:hover .ivu-radio-inner{border-color:#bcbcbc}.ivu-radio-inner{display:inline-block;width:16px;height:16px;position:relative;top:0;left:0;background-color:#fff;border:1px solid #dcdee2;border-radius:50%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-inner:after{position:absolute;width:10px;height:10px;left:2px;top:2px;border-radius:6px;display:table;border-top:0;border-left:0;content:' ';background-color:#8bcf70;opacity:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.ivu-radio-large{font-size:16px}.ivu-radio-large .ivu-radio-inner{width:18px;height:18px}.ivu-radio-large .ivu-radio-inner:after{width:12px;height:12px}.ivu-radio-large .ivu-radio-wrapper,.ivu-radio-large.ivu-radio-wrapper{font-size:16px}.ivu-radio-small .ivu-radio-inner{width:14px;height:14px}.ivu-radio-small .ivu-radio-inner:after{width:8px;height:8px}.ivu-radio-input{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;opacity:0;cursor:pointer}.ivu-radio-border{border:1px solid #dcdee2;border-radius:4px;height:32px;line-height:30px;padding:0 15px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.ivu-radio-group-small .ivu-radio-border,.ivu-radio-small.ivu-radio-border{height:24px;line-height:22px;padding:0 7px}.ivu-radio-group-large .ivu-radio-border,.ivu-radio-large.ivu-radio-border{height:40px;line-height:36px;padding:0 15px}.ivu-radio-wrapper-checked.ivu-radio-border{border-color:#8bcf70}.ivu-radio-wrapper-disabled.ivu-radio-border{border-color:#dcdee2}.ivu-radio-checked .ivu-radio-inner{border-color:#8bcf70}.ivu-radio-checked .ivu-radio-inner:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-checked:hover .ivu-radio-inner{border-color:#8bcf70}.ivu-radio-disabled{cursor:not-allowed}.ivu-radio-disabled .ivu-radio-input{cursor:not-allowed}.ivu-radio-disabled:hover .ivu-radio-inner{border-color:#dcdee2}.ivu-radio-disabled .ivu-radio-inner{border-color:#dcdee2;background-color:#f3f3f3}.ivu-radio-disabled .ivu-radio-inner:after{background-color:#ccc}.ivu-radio-disabled .ivu-radio-disabled+span{color:#ccc}span.ivu-radio+*{margin-left:2px;margin-right:2px}.ivu-radio-group-button{font-size:0;-webkit-text-size-adjust:none}.ivu-radio-group-button .ivu-radio{width:0;margin-right:0}.ivu-radio-group-button .ivu-radio-wrapper{display:inline-block;height:32px;line-height:30px;margin:0;padding:0 15px;font-size:14px;color:#515a6e;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;border:1px solid #dcdee2;border-left:0;background:#fff;position:relative}.ivu-radio-group-button .ivu-radio-wrapper>span{margin-left:0}.ivu-radio-group-button .ivu-radio-wrapper:after,.ivu-radio-group-button .ivu-radio-wrapper:before{content:'';display:block;position:absolute;width:1px;height:100%;left:-1px;top:0;background:#dcdee2;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-group-button .ivu-radio-wrapper:after{height:36px;left:-1px;top:-3px;background:rgba(139,207,112,.2);opacity:0}.ivu-radio-group-button .ivu-radio-wrapper:first-child{border-radius:4px 0 0 4px;border-left:1px solid #dcdee2}.ivu-radio-group-button .ivu-radio-wrapper:first-child:after,.ivu-radio-group-button .ivu-radio-wrapper:first-child:before{display:none}.ivu-radio-group-button .ivu-radio-wrapper:last-child{border-radius:0 4px 4px 0}.ivu-radio-group-button .ivu-radio-wrapper:first-child:last-child{border-radius:4px}.ivu-radio-group-button .ivu-radio-wrapper:hover{position:relative;color:#8bcf70}.ivu-radio-group-button .ivu-radio-wrapper:hover .ivu-radio{background-color:#000}.ivu-radio-group-button .ivu-radio-wrapper .ivu-radio-inner,.ivu-radio-group-button .ivu-radio-wrapper input{opacity:0;width:0;height:0}.ivu-radio-group-button .ivu-radio-wrapper-checked{background:#fff;border-color:#8bcf70;color:#8bcf70;-webkit-box-shadow:-1px 0 0 0 #8bcf70;box-shadow:-1px 0 0 0 #8bcf70;z-index:1}.ivu-radio-group-button .ivu-radio-wrapper-checked:before{background:#8bcf70;opacity:.1}.ivu-radio-group-button .ivu-radio-wrapper-checked.ivu-radio-focus{-webkit-box-shadow:-1px 0 0 0 #8bcf70,0 0 0 2px rgba(139,207,112,.2);box-shadow:-1px 0 0 0 #8bcf70,0 0 0 2px rgba(139,207,112,.2);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-group-button .ivu-radio-wrapper-checked.ivu-radio-focus:after{left:-3px;top:-3px;opacity:1;background:rgba(139,207,112,.2)}.ivu-radio-group-button .ivu-radio-wrapper-checked.ivu-radio-focus:first-child{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-radio-group-button .ivu-radio-wrapper-checked:first-child{border-color:#8bcf70;-webkit-box-shadow:none;box-shadow:none}.ivu-radio-group-button .ivu-radio-wrapper-checked:hover{border-color:#a2d98d;color:#a2d98d}.ivu-radio-group-button .ivu-radio-wrapper-checked:active{border-color:#84c56a;color:#84c56a}.ivu-radio-group-button .ivu-radio-wrapper-disabled{border-color:#dcdee2;background-color:#f7f7f7;cursor:not-allowed;color:#ccc}.ivu-radio-group-button .ivu-radio-wrapper-disabled:first-child,.ivu-radio-group-button .ivu-radio-wrapper-disabled:hover{border-color:#dcdee2;background-color:#f7f7f7;color:#ccc}.ivu-radio-group-button .ivu-radio-wrapper-disabled:first-child{border-left-color:#dcdee2}.ivu-radio-group-button .ivu-radio-wrapper-disabled.ivu-radio-wrapper-checked{color:#fff;background-color:#e6e6e6;border-color:#dcdee2;-webkit-box-shadow:none!important;box-shadow:none!important}.ivu-radio-group-button-solid .ivu-radio-wrapper-checked:not(.ivu-radio-wrapper-disabled){background:#8bcf70;color:#fff}.ivu-radio-group-button-solid .ivu-radio-wrapper-checked:not(.ivu-radio-wrapper-disabled):hover{background:#a2d98d;color:#fff}.ivu-radio-group-button.ivu-radio-group-large .ivu-radio-wrapper{height:40px;line-height:38px;font-size:16px}.ivu-radio-group-button.ivu-radio-group-large .ivu-radio-wrapper:after{height:44px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper{height:24px;line-height:22px;padding:0 12px;font-size:14px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper:after{height:28px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper:first-child{border-radius:3px 0 0 3px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper:last-child{border-radius:0 3px 3px 0}.ivu-checkbox-focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2);z-index:1}.ivu-checkbox{display:inline-block;vertical-align:middle;white-space:nowrap;cursor:pointer;line-height:1;position:relative}.ivu-checkbox-disabled{cursor:not-allowed}.ivu-checkbox:hover .ivu-checkbox-inner{border-color:#bcbcbc}.ivu-checkbox-inner{display:inline-block;width:16px;height:16px;position:relative;top:0;left:0;border:1px solid #dcdee2;border-radius:2px;background-color:#fff;-webkit-transition:border-color .2s ease-in-out,background-color .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border-color .2s ease-in-out,background-color .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border-color .2s ease-in-out,background-color .2s ease-in-out,box-shadow .2s ease-in-out;transition:border-color .2s ease-in-out,background-color .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-checkbox-inner:after{content:'';display:table;width:4px;height:8px;position:absolute;top:1px;left:4px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-checkbox-large .ivu-checkbox-inner{width:18px;height:18px}.ivu-checkbox-large .ivu-checkbox-inner:after{width:5px;height:9px}.ivu-checkbox-small{font-size:14px}.ivu-checkbox-small .ivu-checkbox-inner{width:14px;height:14px}.ivu-checkbox-small .ivu-checkbox-inner:after{top:0;left:3px}.ivu-checkbox-input{width:100%;height:100%;position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;cursor:pointer;opacity:0}.ivu-checkbox-input[disabled]{cursor:not-allowed}.ivu-checkbox-border{border:1px solid #dcdee2;border-radius:4px;height:32px;line-height:30px;padding:0 15px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.ivu-checkbox-group.ivu-checkbox-small .ivu-checkbox-border,.ivu-checkbox-small.ivu-checkbox-border{height:24px;line-height:22px;padding:0 7px}.ivu-checkbox-group.ivu-checkbox-large .ivu-checkbox-border,.ivu-checkbox-large.ivu-checkbox-border{height:40px;line-height:36px;padding:0 15px}.ivu-checkbox-wrapper-checked.ivu-checkbox-border{border-color:#8bcf70}.ivu-checkbox-wrapper-disabled.ivu-checkbox-border{border-color:#dcdee2}.ivu-checkbox-checked:hover .ivu-checkbox-inner{border-color:#8bcf70}.ivu-checkbox-checked .ivu-checkbox-inner{border-color:#8bcf70;background-color:#8bcf70}.ivu-checkbox-checked .ivu-checkbox-inner:after{content:'';display:table;width:4px;height:8px;position:absolute;top:2px;left:5px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-checkbox-large .ivu-checkbox-checked .ivu-checkbox-inner:after{width:6px;height:10px}.ivu-checkbox-small .ivu-checkbox-checked .ivu-checkbox-inner:after{top:1px;left:4px}.ivu-checkbox-disabled.ivu-checkbox-checked:hover .ivu-checkbox-inner{border-color:#dcdee2}.ivu-checkbox-disabled.ivu-checkbox-checked .ivu-checkbox-inner{background-color:#f3f3f3;border-color:#dcdee2}.ivu-checkbox-disabled.ivu-checkbox-checked .ivu-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#ccc}.ivu-checkbox-disabled:hover .ivu-checkbox-inner{border-color:#dcdee2}.ivu-checkbox-disabled .ivu-checkbox-inner{border-color:#dcdee2;background-color:#f3f3f3}.ivu-checkbox-disabled .ivu-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f3f3f3}.ivu-checkbox-disabled .ivu-checkbox-inner-input{cursor:default}.ivu-checkbox-disabled+span{color:#ccc;cursor:not-allowed}.ivu-checkbox-indeterminate .ivu-checkbox-inner:after{content:'';width:10px;height:1px;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);position:absolute;left:2px;top:6px}.ivu-checkbox-indeterminate:hover .ivu-checkbox-inner{border-color:#8bcf70}.ivu-checkbox-indeterminate .ivu-checkbox-inner{background-color:#8bcf70;border-color:#8bcf70}.ivu-checkbox-indeterminate.ivu-checkbox-disabled .ivu-checkbox-inner{background-color:#f3f3f3;border-color:#dcdee2}.ivu-checkbox-indeterminate.ivu-checkbox-disabled .ivu-checkbox-inner:after{border-color:#c5c8ce}.ivu-checkbox-large .ivu-checkbox-indeterminate .ivu-checkbox-inner:after{width:12px;top:7px}.ivu-checkbox-small .ivu-checkbox-indeterminate .ivu-checkbox-inner:after{width:8px;top:5px}.ivu-checkbox-wrapper{cursor:pointer;font-size:14px;display:inline-block;margin-right:8px}.ivu-checkbox-wrapper-disabled{cursor:not-allowed}.ivu-checkbox-wrapper.ivu-checkbox-large{font-size:16px}.ivu-checkbox+span,.ivu-checkbox-wrapper+span{margin-right:4px}.ivu-checkbox-group{font-size:14px}.ivu-checkbox-group-item{display:inline-block}.ivu-switch{display:inline-block;width:44px;height:22px;line-height:20px;border-radius:22px;vertical-align:middle;border:1px solid #ccc;background-color:#ccc;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-switch-loading{opacity:.4}.ivu-switch-inner{color:#fff;font-size:12px;position:absolute;left:23px}.ivu-switch-inner i{width:12px;height:12px;text-align:center;position:relative;top:-1px}.ivu-switch:after{content:'';width:18px;height:18px;border-radius:18px;background-color:#fff;position:absolute;left:1px;top:1px;cursor:pointer;-webkit-transition:left .2s ease-in-out,width .2s ease-in-out;transition:left .2s ease-in-out,width .2s ease-in-out}.ivu-switch:active:after{width:26px}.ivu-switch:before{content:'';display:none;width:14px;height:14px;border-radius:50%;background-color:transparent;position:absolute;left:3px;top:3px;z-index:1;border:1px solid #8bcf70;border-color:transparent transparent transparent #8bcf70;-webkit-animation:switch-loading 1s linear;animation:switch-loading 1s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.ivu-switch-loading:before{display:block}.ivu-switch:focus{-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2);outline:0}.ivu-switch:focus:hover{-webkit-box-shadow:none;box-shadow:none}.ivu-switch-small{width:28px;height:16px;line-height:14px}.ivu-switch-small:after{width:12px;height:12px}.ivu-switch-small:active:after{width:14px}.ivu-switch-small:before{width:10px;height:10px;left:2px;top:2px}.ivu-switch-small.ivu-switch-checked:after{left:13px}.ivu-switch-small.ivu-switch-checked:before{left:14px}.ivu-switch-small:active.ivu-switch-checked:after{left:11px}.ivu-switch-large{width:56px}.ivu-switch-large:active:after{width:26px}.ivu-switch-large:active:after{width:30px}.ivu-switch-large.ivu-switch-checked:after{left:35px}.ivu-switch-large.ivu-switch-checked:before{left:37px}.ivu-switch-large:active.ivu-switch-checked:after{left:23px}.ivu-switch-checked{border-color:#8bcf70;background-color:#8bcf70}.ivu-switch-checked .ivu-switch-inner{left:7px}.ivu-switch-checked:after{left:23px}.ivu-switch-checked:before{left:25px}.ivu-switch-checked:active:after{left:15px}.ivu-switch-disabled{cursor:not-allowed;opacity:.4}.ivu-switch-disabled:after{background:#fff;cursor:not-allowed}.ivu-switch-disabled .ivu-switch-inner{color:#fff}.ivu-switch-disabled.ivu-switch-checked{border-color:#8bcf70;background-color:#8bcf70;opacity:.4}.ivu-switch-disabled.ivu-switch-checked:after{background:#fff}.ivu-switch-disabled.ivu-switch-checked .ivu-switch-inner{color:#fff}@-webkit-keyframes switch-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes switch-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ivu-input-number{display:inline-block;width:100%;line-height:1.5;padding:4px 7px;font-size:14px;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;margin:0;padding:0;width:80px;height:32px;line-height:32px;vertical-align:middle;border:1px solid #dcdee2;border-radius:4px;overflow:hidden;cursor:default}.ivu-input-number::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-input-number:-ms-input-placeholder{color:#c5c8ce}.ivu-input-number::-webkit-input-placeholder{color:#c5c8ce}.ivu-input-number:hover{border-color:#a2d98d}.ivu-input-number:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-input-number[disabled],fieldset[disabled] .ivu-input-number{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input-number[disabled]:hover,fieldset[disabled] .ivu-input-number:hover{border-color:#e3e5e8}textarea.ivu-input-number{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-input-number-large{font-size:16px;padding:6px 7px;height:40px}.ivu-input-number-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-input-number-no-border{border-radius:0;border-color:transparent}.ivu-input-number-no-border:hover{border-color:transparent}.ivu-input-number-no-border:focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ivu-input-number-no-border[disabled]{background-color:transparent}.ivu-input-number-no-border[disabled]:hover{border-color:transparent}.ivu-input-number-handler-wrap{width:22px;height:100%;border-left:1px solid #dcdee2;border-radius:0 4px 4px 0;background:#fff;position:absolute;top:0;right:0;opacity:0;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.ivu-input-number:hover .ivu-input-number-handler-wrap{opacity:1}.ivu-input-number-handler-up{cursor:pointer}.ivu-input-number-handler-up-inner{top:1px}.ivu-input-number-handler-down{border-top:1px solid #dcdee2;top:-1px;cursor:pointer}.ivu-input-number-handler{display:block;width:100%;height:16px;line-height:0;text-align:center;overflow:hidden;color:#999;position:relative}.ivu-input-number-handler:hover .ivu-input-number-handler-down-inner,.ivu-input-number-handler:hover .ivu-input-number-handler-up-inner{color:#a2d98d}.ivu-input-number-handler-down-inner,.ivu-input-number-handler-up-inner{width:12px;height:12px;line-height:12px;font-size:14px;color:#999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:5px;-webkit-transition:all .2s linear;transition:all .2s linear}.ivu-input-number:hover{border-color:#a2d98d}.ivu-input-number-focused{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-input-number-disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input-number-disabled:hover{border-color:#e3e5e8}.ivu-input-number-input-wrap{overflow:hidden;height:32px}.ivu-input-number-input{width:100%;height:32px;line-height:32px;padding:0 7px;text-align:left;outline:0;-moz-appearance:textfield;color:#666;border:0;border-radius:4px;-webkit-transition:all .2s linear;transition:all .2s linear}.ivu-input-number-input[disabled]{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input-number-input[disabled]:hover{border-color:#e3e5e8}.ivu-input-number-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-input-number-input::-moz-placeholder{color:#c5c8ce}.ivu-input-number-input::-ms-input-placeholder{color:#c5c8ce}.ivu-input-number-input::placeholder{color:#c5c8ce}.ivu-input-number-large{padding:0}.ivu-input-number-large .ivu-input-number-input-wrap{height:40px}.ivu-input-number-large .ivu-input-number-handler{height:20px}.ivu-input-number-large input{height:40px;line-height:40px}.ivu-input-number-large .ivu-input-number-handler-up-inner{top:2px}.ivu-input-number-large .ivu-input-number-handler-down-inner{bottom:2px}.ivu-input-number-small{padding:0}.ivu-input-number-small .ivu-input-number-input-wrap{height:24px}.ivu-input-number-small .ivu-input-number-handler{height:12px}.ivu-input-number-small input{height:24px;line-height:24px;margin-top:-1px;vertical-align:top}.ivu-input-number-small .ivu-input-number-handler-up-inner{top:-1px}.ivu-input-number-small .ivu-input-number-handler-down-inner{bottom:-1px}.ivu-input-number-disabled .ivu-input-number-handler-down-inner,.ivu-input-number-disabled .ivu-input-number-handler-up-inner,.ivu-input-number-handler-down-disabled .ivu-input-number-handler-down-inner,.ivu-input-number-handler-down-disabled .ivu-input-number-handler-up-inner,.ivu-input-number-handler-up-disabled .ivu-input-number-handler-down-inner,.ivu-input-number-handler-up-disabled .ivu-input-number-handler-up-inner{opacity:.72;color:#ccc!important;cursor:not-allowed}.ivu-input-number-disabled .ivu-input-number-input{opacity:.72;cursor:not-allowed;background-color:#f3f3f3}.ivu-input-number-disabled .ivu-input-number-handler-wrap{display:none}.ivu-input-number-disabled .ivu-input-number-handler{opacity:.72;color:#ccc!important;cursor:not-allowed}.ivu-input-number-controls-outside{width:144px;padding:0 32px}.ivu-input-number-controls-outside .ivu-input-number-input{border-radius:0}.ivu-input-number-controls-outside-btn{display:inline-block;width:32px;height:32px;line-height:30px;position:absolute;top:0;text-align:center;background-color:#f8f8f9;color:#515a6e;cursor:pointer}.ivu-input-number-controls-outside-btn i{font-size:16px}.ivu-input-number-controls-outside-btn:hover i{color:#8bcf70}.ivu-input-number-controls-outside-btn-disabled,.ivu-input-number-controls-outside-btn-disabled:hover{cursor:not-allowed}.ivu-input-number-controls-outside-btn-disabled i,.ivu-input-number-controls-outside-btn-disabled:hover i{color:#ccc}.ivu-input-number-controls-outside-up{right:0;border-left:1px solid #dcdee2}.ivu-input-number-controls-outside-down{left:0;border-right:1px solid #dcdee2}.ivu-input-number-disabled.ivu-input-number-controls-outside .ivu-input-number-controls-outside-btn{cursor:not-allowed}.ivu-input-number-disabled.ivu-input-number-controls-outside .ivu-input-number-controls-outside-btn i{color:#ccc}.ivu-input-number-large.ivu-input-number-controls-outside{width:160px;padding:0 40px}.ivu-input-number-large.ivu-input-number-controls-outside .ivu-input-number-controls-outside-btn{width:40px;height:40px;line-height:38px}.ivu-input-number-large.ivu-input-number-controls-outside .ivu-input-number-controls-outside-btn i{font-size:20px}.ivu-input-number-small.ivu-input-number-controls-outside{width:128px;padding:0 24px}.ivu-input-number-small.ivu-input-number-controls-outside .ivu-input-number-controls-outside-btn{width:24px;height:24px;line-height:22px}.ivu-input-number-small.ivu-input-number-controls-outside .ivu-input-number-controls-outside-btn i{font-size:14px}.ivu-form-item-error .ivu-input-number{border:1px solid #ed4014}.ivu-form-item-error .ivu-input-number:hover{border-color:#ed4014}.ivu-form-item-error .ivu-input-number:focus{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-form-item-error .ivu-input-number-focused{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-scroll-wrapper{width:auto;margin:0 auto;position:relative;outline:0}.ivu-scroll-container{overflow-y:scroll}@-webkit-keyframes ani-stop-slide{from{overflow-y:hidden;tansform:translateZ(0)}to{overflow-y:scroll;tansform:translateZ(0)}}@keyframes ani-stop-slide{from{overflow-y:hidden;tansform:translateZ(0)}to{overflow-y:scroll;tansform:translateZ(0)}}.ivu-scroll-container-loading{-webkit-animation:ani-stop-slide 1.5s;animation:ani-stop-slide 1.5s}.ivu-scroll-content{opacity:1;-webkit-transition:opacity .5s;transition:opacity .5s}.ivu-scroll-content-loading{opacity:.5}.ivu-scroll-loader{text-align:center;padding:0;-webkit-transition:padding .5s;transition:padding .5s}.ivu-scroll-loader-wrapper{padding:5px 0;height:0;background-color:inherit;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transition:opacity .3s,height .5s,-webkit-transform .5s;transition:opacity .3s,height .5s,-webkit-transform .5s;transition:opacity .3s,transform .5s,height .5s;transition:opacity .3s,transform .5s,height .5s,-webkit-transform .5s}.ivu-scroll-loader-wrapper-active{height:40px;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}@-webkit-keyframes ani-demo-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes ani-demo-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ivu-scroll-loader-wrapper .ivu-scroll-spinner{position:relative}.ivu-scroll-loader-wrapper .ivu-scroll-spinner-icon{-webkit-animation:ani-demo-spin 1s linear infinite;animation:ani-demo-spin 1s linear infinite}.ivu-tag{display:inline-block;height:22px;line-height:22px;margin:2px 4px 2px 0;padding:0 8px;border:1px solid #e8eaec;border-radius:3px;background:#f7f7f7;font-size:12px;vertical-align:middle;opacity:1;overflow:hidden}.ivu-tag-size-large{height:32px;line-height:32px;padding:0 12px}.ivu-tag-size-medium{height:28px;line-height:28px;padding:0 10px}.ivu-tag:not(.ivu-tag-border):not(.ivu-tag-dot):not(.ivu-tag-checked){background:0 0;border:0;color:#515a6e}.ivu-tag:not(.ivu-tag-border):not(.ivu-tag-dot):not(.ivu-tag-checked) .ivu-icon-ios-close{color:#515a6e!important}.ivu-tag-color-error{color:#ed4014!important;border-color:#ed4014}.ivu-tag-color-success{color:#19be6b!important;border-color:#19be6b}.ivu-tag-color-primary{color:#8bcf70!important;border-color:#8bcf70}.ivu-tag-color-warning{color:#f90!important;border-color:#f90}.ivu-tag-color-white{color:#fff!important}.ivu-tag-dot{height:32px;line-height:32px;border:1px solid #e8eaec!important;color:#515a6e!important;background:#fff!important;padding:0 12px}.ivu-tag-dot-inner{display:inline-block;width:12px;height:12px;margin-right:8px;border-radius:50%;background:#e8eaec;position:relative;top:1px}.ivu-tag-dot .ivu-icon-ios-close{color:#666!important;margin-left:12px!important}.ivu-tag-border{height:24px;line-height:24px;border:1px solid #e8eaec;color:#e8eaec;background:#fff!important;position:relative}.ivu-tag-border .ivu-icon-ios-close{color:#666;margin-left:12px!important}.ivu-tag-border:after{content:"";display:none;width:1px;background:currentColor;position:absolute;top:0;bottom:0;right:22px}.ivu-tag-border.ivu-tag-closable:after{display:block}.ivu-tag-border.ivu-tag-closable .ivu-icon-ios-close{margin-left:18px!important;left:4px;top:-1px}.ivu-tag-border.ivu-tag-primary{color:#8bcf70!important;border:1px solid #8bcf70!important}.ivu-tag-border.ivu-tag-primary:after{background:#8bcf70}.ivu-tag-border.ivu-tag-primary .ivu-icon-ios-close{color:#8bcf70!important}.ivu-tag-border.ivu-tag-success{color:#19be6b!important;border:1px solid #19be6b!important}.ivu-tag-border.ivu-tag-success:after{background:#19be6b}.ivu-tag-border.ivu-tag-success .ivu-icon-ios-close{color:#19be6b!important}.ivu-tag-border.ivu-tag-warning{color:#f90!important;border:1px solid #f90!important}.ivu-tag-border.ivu-tag-warning:after{background:#f90}.ivu-tag-border.ivu-tag-warning .ivu-icon-ios-close{color:#f90!important}.ivu-tag-border.ivu-tag-error{color:#ed4014!important;border:1px solid #ed4014!important}.ivu-tag-border.ivu-tag-error:after{background:#ed4014}.ivu-tag-border.ivu-tag-error .ivu-icon-ios-close{color:#ed4014!important}.ivu-tag:hover{opacity:.85}.ivu-tag-text{color:#515a6e}.ivu-tag-text a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ivu-tag .ivu-icon-ios-close{display:inline-block;font-size:14px;-webkit-transform:scale(1.42857143) rotate(0);-ms-transform:scale(1.42857143) rotate(0);transform:scale(1.42857143) rotate(0);cursor:pointer;margin-left:2px;color:#666;opacity:.66;position:relative;top:-1px}:root .ivu-tag .ivu-icon-ios-close{font-size:14px}.ivu-tag .ivu-icon-ios-close:hover{opacity:1}.ivu-tag-error,.ivu-tag-primary,.ivu-tag-success,.ivu-tag-warning{border:0}.ivu-tag-error,.ivu-tag-error .ivu-icon-ios-close,.ivu-tag-error .ivu-icon-ios-close:hover,.ivu-tag-error a,.ivu-tag-error a:hover,.ivu-tag-primary,.ivu-tag-primary .ivu-icon-ios-close,.ivu-tag-primary .ivu-icon-ios-close:hover,.ivu-tag-primary a,.ivu-tag-primary a:hover,.ivu-tag-success,.ivu-tag-success .ivu-icon-ios-close,.ivu-tag-success .ivu-icon-ios-close:hover,.ivu-tag-success a,.ivu-tag-success a:hover,.ivu-tag-warning,.ivu-tag-warning .ivu-icon-ios-close,.ivu-tag-warning .ivu-icon-ios-close:hover,.ivu-tag-warning a,.ivu-tag-warning a:hover{color:#fff}.ivu-tag-primary,.ivu-tag-primary.ivu-tag-dot .ivu-tag-dot-inner{background:#8bcf70}.ivu-tag-success,.ivu-tag-success.ivu-tag-dot .ivu-tag-dot-inner{background:#19be6b}.ivu-tag-warning,.ivu-tag-warning.ivu-tag-dot .ivu-tag-dot-inner{background:#f90}.ivu-tag-error,.ivu-tag-error.ivu-tag-dot .ivu-tag-dot-inner{background:#ed4014}.ivu-tag-pink{line-height:20px;background:#fff0f6;border-color:#ffadd2}.ivu-tag-pink .ivu-tag-text{color:#eb2f96!important}.ivu-tag-pink.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-pink{line-height:30px}.ivu-tag-size-medium.ivu-tag-pink{line-height:26px}.ivu-tag-magenta{line-height:20px;background:#fff0f6;border-color:#ffadd2}.ivu-tag-magenta .ivu-tag-text{color:#eb2f96!important}.ivu-tag-magenta.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-magenta{line-height:30px}.ivu-tag-size-medium.ivu-tag-magenta{line-height:26px}.ivu-tag-red{line-height:20px;background:#fff1f0;border-color:#ffa39e}.ivu-tag-red .ivu-tag-text{color:#f5222d!important}.ivu-tag-red.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-red{line-height:30px}.ivu-tag-size-medium.ivu-tag-red{line-height:26px}.ivu-tag-volcano{line-height:20px;background:#fff2e8;border-color:#ffbb96}.ivu-tag-volcano .ivu-tag-text{color:#fa541c!important}.ivu-tag-volcano.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-volcano{line-height:30px}.ivu-tag-size-medium.ivu-tag-volcano{line-height:26px}.ivu-tag-orange{line-height:20px;background:#fff7e6;border-color:#ffd591}.ivu-tag-orange .ivu-tag-text{color:#fa8c16!important}.ivu-tag-orange.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-orange{line-height:30px}.ivu-tag-size-medium.ivu-tag-orange{line-height:26px}.ivu-tag-yellow{line-height:20px;background:#feffe6;border-color:#fffb8f}.ivu-tag-yellow .ivu-tag-text{color:#fadb14!important}.ivu-tag-yellow.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-yellow{line-height:30px}.ivu-tag-size-medium.ivu-tag-yellow{line-height:26px}.ivu-tag-gold{line-height:20px;background:#fffbe6;border-color:#ffe58f}.ivu-tag-gold .ivu-tag-text{color:#faad14!important}.ivu-tag-gold.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-gold{line-height:30px}.ivu-tag-size-medium.ivu-tag-gold{line-height:26px}.ivu-tag-cyan{line-height:20px;background:#e6fffb;border-color:#87e8de}.ivu-tag-cyan .ivu-tag-text{color:#13c2c2!important}.ivu-tag-cyan.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-cyan{line-height:30px}.ivu-tag-size-medium.ivu-tag-cyan{line-height:26px}.ivu-tag-lime{line-height:20px;background:#fcffe6;border-color:#eaff8f}.ivu-tag-lime .ivu-tag-text{color:#a0d911!important}.ivu-tag-lime.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-lime{line-height:30px}.ivu-tag-size-medium.ivu-tag-lime{line-height:26px}.ivu-tag-green{line-height:20px;background:#f6ffed;border-color:#b7eb8f}.ivu-tag-green .ivu-tag-text{color:#52c41a!important}.ivu-tag-green.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-green{line-height:30px}.ivu-tag-size-medium.ivu-tag-green{line-height:26px}.ivu-tag-blue{line-height:20px;background:#e6f7ff;border-color:#91d5ff}.ivu-tag-blue .ivu-tag-text{color:#1890ff!important}.ivu-tag-blue.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-blue{line-height:30px}.ivu-tag-size-medium.ivu-tag-blue{line-height:26px}.ivu-tag-geekblue{line-height:20px;background:#f0f5ff;border-color:#adc6ff}.ivu-tag-geekblue .ivu-tag-text{color:#2f54eb!important}.ivu-tag-geekblue.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-geekblue{line-height:30px}.ivu-tag-size-medium.ivu-tag-geekblue{line-height:26px}.ivu-tag-purple{line-height:20px;background:#f9f0ff;border-color:#d3adf7}.ivu-tag-purple .ivu-tag-text{color:#722ed1!important}.ivu-tag-purple.ivu-tag-dot{line-height:32px}.ivu-tag-size-large.ivu-tag-purple{line-height:30px}.ivu-tag-size-medium.ivu-tag-purple{line-height:26px}.ivu-layout{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex:auto;flex:auto;background:#f5f7f9}.ivu-layout.ivu-layout-has-sider{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ivu-layout.ivu-layout-has-sider>.ivu-layout,.ivu-layout.ivu-layout-has-sider>.ivu-layout-content{overflow-x:hidden}.ivu-layout-footer,.ivu-layout-header{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-layout-header{background:#515a6e;padding:0 50px;height:64px;line-height:64px}.ivu-layout-sider{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;position:relative;background:#515a6e;min-width:0}.ivu-layout-sider-children{height:100%;padding-top:.1px;margin-top:-.1px}.ivu-layout-sider-has-trigger{padding-bottom:48px}.ivu-layout-sider-trigger{position:fixed;bottom:0;text-align:center;cursor:pointer;height:48px;line-height:48px;color:#fff;background:#515a6e;z-index:1000;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-layout-sider-trigger .ivu-icon{font-size:16px}.ivu-layout-sider-trigger>*{-webkit-transition:all .2s;transition:all .2s}.ivu-layout-sider-trigger-collapsed .ivu-layout-sider-trigger-icon{-webkit-transform:rotateZ(180deg);-ms-transform:rotate(180deg);transform:rotateZ(180deg)}.ivu-layout-sider-zero-width>*{overflow:hidden}.ivu-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;text-align:center;width:36px;height:42px;line-height:42px;background:#515a6e;color:#fff;font-size:18px;border-radius:0 6px 6px 0;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease}.ivu-layout-sider-zero-width-trigger:hover{background:#626b7d}.ivu-layout-sider-zero-width-trigger.ivu-layout-sider-zero-width-trigger-left{right:0;left:-36px;border-radius:6px 0 0 6px}.ivu-layout-footer{background:#f5f7f9;padding:24px 50px;color:#515a6e;font-size:14px}.ivu-layout-content{-webkit-box-flex:1;-ms-flex:auto;flex:auto}.ivu-loading-bar{width:100%;position:fixed;top:0;left:0;right:0;z-index:2000}.ivu-loading-bar-inner{-webkit-transition:width .2s linear;transition:width .2s linear}.ivu-loading-bar-inner-color-primary{background-color:#8bcf70}.ivu-loading-bar-inner-failed-color-error{background-color:#ed4014}.ivu-progress{display:inline-block;width:100%;font-size:12px;position:relative}.ivu-progress-vertical{height:100%;width:auto}.ivu-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ivu-progress-show-info .ivu-progress-outer{padding-right:55px;margin-right:-55px}.ivu-progress-vertical .ivu-progress-outer{height:100%;width:auto}.ivu-progress-inner{display:inline-block;width:100%;background-color:#f3f3f3;border-radius:100px;vertical-align:middle;position:relative}.ivu-progress-inner-text{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 6px}.ivu-progress-vertical .ivu-progress-inner{height:100%;width:auto}.ivu-progress-vertical .ivu-progress-inner:after,.ivu-progress-vertical .ivu-progress-inner>*{display:inline-block;vertical-align:bottom}.ivu-progress-vertical .ivu-progress-inner:after{content:'';height:100%}.ivu-progress-bg{text-align:right;border-radius:100px;background-color:#8bcf70;-webkit-transition:all .2s linear;transition:all .2s linear;position:relative}.ivu-progress-bg:after{content:'';display:inline-block;height:100%;vertical-align:middle}.ivu-progress-success-bg{border-radius:100px;background-color:#19be6b;-webkit-transition:all .2s linear;transition:all .2s linear;position:absolute;top:0;left:0}.ivu-progress-text{display:inline-block;margin-left:5px;text-align:left;font-size:1em;vertical-align:middle;color:#808695}.ivu-progress-active .ivu-progress-bg:before{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:10px;-webkit-animation:ivu-progress-active 2s ease-in-out infinite;animation:ivu-progress-active 2s ease-in-out infinite}.ivu-progress-vertical.ivu-progress-active .ivu-progress-bg:before{top:auto;-webkit-animation:ivu-progress-active-vertical 2s ease-in-out infinite;animation:ivu-progress-active-vertical 2s ease-in-out infinite}.ivu-progress-wrong .ivu-progress-bg{background-color:#ed4014}.ivu-progress-wrong .ivu-progress-text{color:#ed4014}.ivu-progress-success .ivu-progress-bg{background-color:#19be6b}.ivu-progress-success .ivu-progress-text{color:#19be6b}@-webkit-keyframes ivu-progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@keyframes ivu-progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@-webkit-keyframes ivu-progress-active-vertical{0%{opacity:.3;height:0}100%{opacity:0;height:100%}}@keyframes ivu-progress-active-vertical{0%{opacity:.3;height:0}100%{opacity:0;height:100%}}.ivu-timeline{list-style:none;margin:0;padding:0}.ivu-timeline-item{margin:0!important;padding:0 0 12px 0;list-style:none;position:relative}.ivu-timeline-item-tail{height:100%;border-left:1px solid #e8eaec;position:absolute;left:6px;top:0}.ivu-timeline-item-pending .ivu-timeline-item-tail{display:none}.ivu-timeline-item-head{width:13px;height:13px;background-color:#fff;border-radius:50%;border:1px solid transparent;position:absolute}.ivu-timeline-item-head-blue{border-color:#8bcf70;color:#8bcf70}.ivu-timeline-item-head-red{border-color:#ed4014;color:#ed4014}.ivu-timeline-item-head-green{border-color:#19be6b;color:#19be6b}.ivu-timeline-item-head-custom{width:40px;height:auto;margin-top:6px;padding:3px 0;text-align:center;line-height:1;border:0;border-radius:0;font-size:14px;position:absolute;left:-13px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ivu-timeline-item-content{padding:1px 1px 10px 24px;font-size:14px;position:relative;top:-3px}.ivu-timeline-item:last-child .ivu-timeline-item-tail{display:none}.ivu-timeline.ivu-timeline-pending .ivu-timeline-item:nth-last-of-type(2) .ivu-timeline-item-tail{border-left:1px dotted #e8eaec}.ivu-timeline.ivu-timeline-pending .ivu-timeline-item:nth-last-of-type(2) .ivu-timeline-item-content{min-height:48px}.ivu-page:after{content:'';display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.ivu-page-item{display:inline-block;vertical-align:middle;min-width:32px;height:32px;line-height:30px;margin-right:4px;text-align:center;list-style:none;background-color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;font-family:Arial;font-weight:500;border:1px solid #dcdee2;border-radius:4px;-webkit-transition:border .2s ease-in-out,color .2s ease-in-out;transition:border .2s ease-in-out,color .2s ease-in-out}.ivu-page-item a{margin:0 6px;text-decoration:none;color:#515a6e}.ivu-page-item:hover{border-color:#8bcf70}.ivu-page-item:hover a{color:#8bcf70}.ivu-page-item-active{border-color:#8bcf70}.ivu-page-item-active a,.ivu-page-item-active:hover a{color:#8bcf70}.ivu-page-with-disabled .ivu-page-disabled,.ivu-page-with-disabled .ivu-page-item{cursor:not-allowed;background-color:#f3f3f3}.ivu-page-with-disabled .ivu-page-disabled a,.ivu-page-with-disabled .ivu-page-item a{color:#ccc}.ivu-page-with-disabled .ivu-page-disabled:hover,.ivu-page-with-disabled .ivu-page-item:hover{border-color:#dcdee2}.ivu-page-with-disabled .ivu-page-disabled:hover a,.ivu-page-with-disabled .ivu-page-item:hover a{color:#ccc;cursor:not-allowed}.ivu-page-with-disabled .ivu-page-disabled-active,.ivu-page-with-disabled .ivu-page-item-active{background-color:#dcdee2;border-color:#dcdee2}.ivu-page-with-disabled .ivu-page-disabled-active a,.ivu-page-with-disabled .ivu-page-disabled-active:hover a,.ivu-page-with-disabled .ivu-page-item-active a,.ivu-page-with-disabled .ivu-page-item-active:hover a{color:#fff}.ivu-page-item-jump-next i,.ivu-page-item-jump-prev i{color:#ccc}.ivu-page-item-jump-next i:first-child,.ivu-page-item-jump-prev i:first-child{display:none}.ivu-page-item-jump-next:hover i:first-child,.ivu-page-item-jump-prev:hover i:first-child{display:inline;color:#8bcf70}.ivu-page-item-jump-next:hover i:last-child,.ivu-page-item-jump-prev:hover i:last-child{display:none}.ivu-page-with-disabled .ivu-page-item-jump-next,.ivu-page-with-disabled .ivu-page-item-jump-prev{cursor:not-allowed}.ivu-page-with-disabled .ivu-page-item-jump-next i,.ivu-page-with-disabled .ivu-page-item-jump-prev i{color:#ccc}.ivu-page-with-disabled .ivu-page-item-jump-next:hover i:first-child,.ivu-page-with-disabled .ivu-page-item-jump-prev:hover i:first-child{display:none}.ivu-page-with-disabled .ivu-page-item-jump-next:hover i:last-child,.ivu-page-with-disabled .ivu-page-item-jump-prev:hover i:last-child{display:inline}.ivu-page-item-jump-prev:hover i:first-child:after{content:"\F115";margin-left:-8px}.ivu-page-item-jump-next:hover i:first-child:after{content:"\F11F";margin-left:-8px}.ivu-page-prev{margin-right:4px}.ivu-page-item-jump-next,.ivu-page-item-jump-prev{margin-right:4px}.ivu-page-item-jump-next,.ivu-page-item-jump-prev,.ivu-page-next,.ivu-page-prev{display:inline-block;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;min-width:32px;height:32px;line-height:30px;list-style:none;text-align:center;cursor:pointer;color:#666;font-family:Arial;border:1px solid #dcdee2;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-page-item-jump-next,.ivu-page-item-jump-prev{border-color:transparent}.ivu-page-next,.ivu-page-prev{background-color:#fff}.ivu-page-next a,.ivu-page-prev a{color:#666;font-size:14px}.ivu-page-next:hover,.ivu-page-prev:hover{border-color:#8bcf70}.ivu-page-next:hover a,.ivu-page-prev:hover a{color:#8bcf70}.ivu-page-disabled{cursor:not-allowed}.ivu-page-disabled a{color:#ccc}.ivu-page-disabled:hover{border-color:#dcdee2}.ivu-page-disabled:hover a{color:#ccc;cursor:not-allowed}.ivu-page-options{display:inline-block;vertical-align:middle;margin-left:15px}.ivu-page-options-sizer{display:inline-block;margin-right:10px}.ivu-page-options-elevator{display:inline-block;vertical-align:middle;height:32px;line-height:32px}.ivu-page-options-elevator input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:14px;border:1px solid #dcdee2;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;border-radius:4px;margin:0 8px;width:50px}.ivu-page-options-elevator input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-page-options-elevator input:-ms-input-placeholder{color:#c5c8ce}.ivu-page-options-elevator input::-webkit-input-placeholder{color:#c5c8ce}.ivu-page-options-elevator input:hover{border-color:#a2d98d}.ivu-page-options-elevator input:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-page-options-elevator input[disabled],fieldset[disabled] .ivu-page-options-elevator input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-page-options-elevator input[disabled]:hover,fieldset[disabled] .ivu-page-options-elevator input:hover{border-color:#e3e5e8}textarea.ivu-page-options-elevator input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-page-options-elevator input-large{font-size:16px;padding:6px 7px;height:40px}.ivu-page-options-elevator input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-page-options-elevator input-no-border{border-radius:0;border-color:transparent}.ivu-page-options-elevator input-no-border:hover{border-color:transparent}.ivu-page-options-elevator input-no-border:focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ivu-page-options-elevator input-no-border[disabled]{background-color:transparent}.ivu-page-options-elevator input-no-border[disabled]:hover{border-color:transparent}.ivu-page-total{display:inline-block;height:32px;line-height:32px;margin-right:10px}.ivu-page-simple .ivu-page-next,.ivu-page-simple .ivu-page-prev{margin:0;border:0;height:24px;line-height:normal;font-size:18px}.ivu-page-simple .ivu-page-simple-pager{display:inline-block;margin-right:8px;vertical-align:middle}.ivu-page-simple .ivu-page-simple-pager input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:14px;color:#515a6e;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;width:30px;height:24px;margin:0 8px;padding:5px 8px;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;outline:0;border:1px solid #dcdee2;border-radius:4px;-webkit-transition:border-color .2s ease-in-out;transition:border-color .2s ease-in-out}.ivu-page-simple .ivu-page-simple-pager input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-page-simple .ivu-page-simple-pager input:-ms-input-placeholder{color:#c5c8ce}.ivu-page-simple .ivu-page-simple-pager input::-webkit-input-placeholder{color:#c5c8ce}.ivu-page-simple .ivu-page-simple-pager input:hover{border-color:#a2d98d}.ivu-page-simple .ivu-page-simple-pager input:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-page-simple .ivu-page-simple-pager input[disabled],fieldset[disabled] .ivu-page-simple .ivu-page-simple-pager input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-page-simple .ivu-page-simple-pager input[disabled]:hover,fieldset[disabled] .ivu-page-simple .ivu-page-simple-pager input:hover{border-color:#e3e5e8}textarea.ivu-page-simple .ivu-page-simple-pager input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-page-simple .ivu-page-simple-pager input-large{font-size:16px;padding:6px 7px;height:40px}.ivu-page-simple .ivu-page-simple-pager input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-page-simple .ivu-page-simple-pager input-no-border{border-radius:0;border-color:transparent}.ivu-page-simple .ivu-page-simple-pager input-no-border:hover{border-color:transparent}.ivu-page-simple .ivu-page-simple-pager input-no-border:focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ivu-page-simple .ivu-page-simple-pager input-no-border[disabled]{background-color:transparent}.ivu-page-simple .ivu-page-simple-pager input-no-border[disabled]:hover{border-color:transparent}.ivu-page-simple .ivu-page-simple-pager input:hover{border-color:#8bcf70}.ivu-page-simple .ivu-page-simple-pager span{padding:0 8px 0 2px}.ivu-page-custom-text,.ivu-page-custom-text:hover{border-color:transparent}.ivu-page.mini .ivu-page-total{height:24px;line-height:24px}.ivu-page.mini .ivu-page-item{border:0;margin:0;min-width:24px;height:24px;line-height:24px;border-radius:3px}.ivu-page.mini .ivu-page-next,.ivu-page.mini .ivu-page-prev{margin:0;min-width:24px;height:24px;line-height:22px;border:0}.ivu-page.mini .ivu-page-next a i:after,.ivu-page.mini .ivu-page-prev a i:after{height:24px;line-height:24px}.ivu-page.mini .ivu-page-item-jump-next,.ivu-page.mini .ivu-page-item-jump-prev{height:24px;line-height:24px;border:none;margin-right:0}.ivu-page.mini .ivu-page-options{margin-left:8px}.ivu-page.mini .ivu-page-options-elevator{height:24px;line-height:24px}.ivu-page.mini .ivu-page-options-elevator input{padding:1px 7px;height:24px;border-radius:3px;width:44px}.ivu-steps{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;font-size:0;line-height:1.5}.ivu-steps-item{display:inline-block;position:relative;vertical-align:top;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.ivu-steps-item:last-child{-webkit-box-flex:0;-ms-flex:0;flex:none}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner{background-color:#fff}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner span,.ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner>.ivu-steps-icon{color:#ccc}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-title{color:#999}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-content{color:#999}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-tail>i{background-color:#e8eaec}.ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner{border-color:#8bcf70;background-color:#8bcf70}.ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner span,.ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner>.ivu-steps-icon{color:#fff}.ivu-steps-item.ivu-steps-status-process .ivu-steps-title{color:#666}.ivu-steps-item.ivu-steps-status-process .ivu-steps-content{color:#666}.ivu-steps-item.ivu-steps-status-process .ivu-steps-tail>i{background-color:#e8eaec}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-head-inner{background-color:#fff;border-color:#8bcf70}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-head-inner span,.ivu-steps-item.ivu-steps-status-finish .ivu-steps-head-inner>.ivu-steps-icon{color:#8bcf70}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-tail>i:after{width:100%;background:#8bcf70;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;opacity:1}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-title{color:#999}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-content{color:#999}.ivu-steps-item.ivu-steps-status-error .ivu-steps-head-inner{background-color:#fff;border-color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-head-inner>.ivu-steps-icon{color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-title{color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-content{color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-tail>i{background-color:#e8eaec}.ivu-steps-item.ivu-steps-next-error .ivu-steps-tail>i,.ivu-steps-item.ivu-steps-next-error .ivu-steps-tail>i:after{background-color:#ed4014}.ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner{background:0 0;border:0;width:auto;height:auto}.ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner>.ivu-steps-icon{font-size:20px;top:2px;width:20px;height:20px}.ivu-steps-item.ivu-steps-custom.ivu-steps-status-process .ivu-steps-head-inner>.ivu-steps-icon{color:#8bcf70}.ivu-steps-item:last-child .ivu-steps-tail{display:none}.ivu-steps .ivu-steps-head,.ivu-steps .ivu-steps-main{position:relative;display:inline-block;vertical-align:top}.ivu-steps .ivu-steps-head{background:#fff}.ivu-steps .ivu-steps-head-inner{display:block;width:26px;height:26px;line-height:24px;margin-right:8px;text-align:center;border:1px solid #ccc;border-radius:50%;font-size:14px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon{line-height:1;position:relative}.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon{font-size:24px}.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon-ios-checkmark-empty,.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon-ios-close-empty{font-weight:700}.ivu-steps .ivu-steps-main{margin-top:2.5px;display:inline}.ivu-steps .ivu-steps-custom .ivu-steps-title{margin-top:2.5px}.ivu-steps .ivu-steps-title{display:inline-block;margin-bottom:4px;padding-right:10px;font-size:14px;font-weight:700;color:#666;background:#fff}.ivu-steps .ivu-steps-title>a:first-child:last-child{color:#666}.ivu-steps .ivu-steps-item-last .ivu-steps-title{padding-right:0;width:100%}.ivu-steps .ivu-steps-content{font-size:12px;color:#999}.ivu-steps .ivu-steps-tail{width:100%;padding:0 10px;position:absolute;left:0;top:13px}.ivu-steps .ivu-steps-tail>i{display:inline-block;width:100%;height:1px;vertical-align:top;background:#e8eaec;border-radius:1px;position:relative}.ivu-steps .ivu-steps-tail>i:after{content:'';width:0;height:100%;background:#e8eaec;opacity:0;position:absolute;top:0}.ivu-steps.ivu-steps-small .ivu-steps-head-inner{width:18px;height:18px;line-height:16px;margin-right:10px;text-align:center;border-radius:50%;font-size:12px}.ivu-steps.ivu-steps-small .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon{font-size:16px;top:0}.ivu-steps.ivu-steps-small .ivu-steps-main{margin-top:0}.ivu-steps.ivu-steps-small .ivu-steps-title{margin-bottom:4px;margin-top:0;color:#666;font-size:12px;font-weight:700}.ivu-steps.ivu-steps-small .ivu-steps-content{font-size:12px;color:#999;padding-left:30px}.ivu-steps.ivu-steps-small .ivu-steps-tail{top:8px;padding:0 8px}.ivu-steps.ivu-steps-small .ivu-steps-tail>i{height:1px;width:100%;border-radius:1px}.ivu-steps .ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner,.ivu-steps.ivu-steps-small .ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner{width:inherit;height:inherit;line-height:inherit;border-radius:0;border:0;background:0 0}.ivu-steps-vertical{display:block}.ivu-steps-vertical .ivu-steps-item{display:block;overflow:visible}.ivu-steps-vertical .ivu-steps-tail{position:absolute;left:13px;top:0;height:100%;width:1px;padding:30px 0 4px 0}.ivu-steps-vertical .ivu-steps-tail>i{height:100%;width:1px}.ivu-steps-vertical .ivu-steps-tail>i:after{height:0;width:100%}.ivu-steps-vertical .ivu-steps-status-finish .ivu-steps-tail>i:after{height:100%}.ivu-steps-vertical .ivu-steps-head{float:left}.ivu-steps-vertical .ivu-steps-head-inner{margin-right:16px}.ivu-steps-vertical .ivu-steps-main{min-height:47px;overflow:hidden;display:block}.ivu-steps-vertical .ivu-steps-main .ivu-steps-title{line-height:26px}.ivu-steps-vertical .ivu-steps-main .ivu-steps-content{padding-bottom:12px;padding-left:0}.ivu-steps-vertical .ivu-steps-custom .ivu-steps-icon{left:4px}.ivu-steps-vertical.ivu-steps-small .ivu-steps-custom .ivu-steps-icon{left:0}.ivu-steps-vertical.ivu-steps-small .ivu-steps-tail{position:absolute;left:9px;top:0;padding:22px 0 4px 0}.ivu-steps-vertical.ivu-steps-small .ivu-steps-tail>i{height:100%}.ivu-steps-vertical.ivu-steps-small .ivu-steps-title{line-height:18px}.ivu-steps-horizontal.ivu-steps-hidden{visibility:hidden}.ivu-steps-horizontal .ivu-steps-content{padding-left:35px}.ivu-steps-horizontal .ivu-steps-item:not(:first-child) .ivu-steps-head{padding-left:10px;margin-left:-10px}.ivu-modal{width:auto;margin:0 auto;position:relative;outline:0;top:100px}.ivu-modal-hidden{display:none!important}.ivu-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.ivu-modal-wrap *{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.ivu-modal-mask{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,55,55,.6);height:100%;z-index:1000}.ivu-modal-mask-hidden{display:none}.ivu-modal-content{position:relative;background-color:#fff;border:0;border-radius:6px;background-clip:padding-box;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15)}.ivu-modal-content-no-mask{pointer-events:auto}.ivu-modal-content-drag{position:absolute}.ivu-modal-content-drag .ivu-modal-header{cursor:move}.ivu-modal-content-dragging{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-modal-header{border-bottom:1px solid #e8eaec;padding:14px 16px;line-height:1}.ivu-modal-header p,.ivu-modal-header-inner{display:inline-block;width:100%;height:20px;line-height:20px;font-size:16px;color:#17233d;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-modal-close{z-index:1;font-size:12px;position:absolute;right:8px;top:8px;overflow:hidden;cursor:pointer}.ivu-modal-close .ivu-icon-ios-close{font-size:31px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:1px}.ivu-modal-close .ivu-icon-ios-close:hover{color:#444}.ivu-modal-body{padding:16px;font-size:14px;line-height:1.5}.ivu-modal-footer{border-top:1px solid #e8eaec;padding:12px 18px 12px 18px;text-align:right}.ivu-modal-footer button+button{margin-left:8px;margin-bottom:0}.ivu-modal-fullscreen{width:100%!important;top:0;bottom:0;position:absolute}.ivu-modal-fullscreen .ivu-modal-content{width:100%;border-radius:0;position:absolute;top:0;bottom:0}.ivu-modal-fullscreen .ivu-modal-body{width:100%;overflow:auto;position:absolute;top:51px;bottom:61px}.ivu-modal-fullscreen-no-header .ivu-modal-body{top:0}.ivu-modal-fullscreen-no-footer .ivu-modal-body{bottom:0}.ivu-modal-fullscreen .ivu-modal-footer{position:absolute;width:100%;bottom:0}.ivu-modal-no-mask{pointer-events:none}@media (max-width:576px){.ivu-modal{width:auto!important;margin:10px}.ivu-modal-fullscreen{width:100%!important;margin:0}.vertical-center-modal .ivu-modal{-webkit-box-flex:1;-ms-flex:1;flex:1}}.ivu-modal-confirm{padding:6px 16px 8px}.ivu-modal-confirm-head{padding:0 12px 0 0}.ivu-modal-confirm-head-icon{display:inline-block;font-size:28px;vertical-align:middle;position:relative;top:-2px}.ivu-modal-confirm-head-icon-info{color:#8bcf70}.ivu-modal-confirm-head-icon-success{color:#19be6b}.ivu-modal-confirm-head-icon-warning{color:#f90}.ivu-modal-confirm-head-icon-error{color:#ed4014}.ivu-modal-confirm-head-icon-confirm{color:#f90}.ivu-modal-confirm-head-title{display:inline-block;vertical-align:middle;margin-left:12px;font-size:16px;color:#17233d;font-weight:500}.ivu-modal-confirm-body{padding-left:40px;font-size:14px;color:#515a6e;position:relative}.ivu-modal-confirm-body-render{margin:0;padding:0}.ivu-modal-confirm-footer{margin-top:20px;text-align:right}.ivu-modal-confirm-footer button+button{margin-left:8px;margin-bottom:0}.ivu-select{display:inline-block;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:middle;color:#515a6e;font-size:14px;line-height:normal}.ivu-select-selection{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;background-color:#fff;border-radius:4px;border:1px solid #dcdee2;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-select-selection-focused,.ivu-select-selection:hover{border-color:#a2d98d}.ivu-select-selection-focused .ivu-select-arrow,.ivu-select-selection:hover .ivu-select-arrow{display:inline-block}.ivu-select-arrow{position:absolute;top:50%;right:8px;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-size:14px;color:#808695;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-select-visible .ivu-select-selection{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-select-visible .ivu-select-arrow{-webkit-transform:translateY(-50%) rotate(180deg);-ms-transform:translateY(-50%) rotate(180deg);transform:translateY(-50%) rotate(180deg);display:inline-block}.ivu-select-disabled .ivu-select-selection{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-select-disabled .ivu-select-selection:hover{border-color:#e3e5e8}.ivu-select-disabled .ivu-select-selection .ivu-select-arrow{color:#ccc}.ivu-select-disabled .ivu-select-selection:hover{border-color:#dcdee2;-webkit-box-shadow:none;box-shadow:none}.ivu-select-disabled .ivu-select-selection:hover .ivu-select-arrow{display:inline-block}.ivu-select-single .ivu-select-selection{height:32px;position:relative}.ivu-select-single .ivu-select-selection .ivu-select-placeholder{color:#c5c8ce}.ivu-select-single .ivu-select-selection .ivu-select-placeholder,.ivu-select-single .ivu-select-selection .ivu-select-selected-value{display:block;height:30px;line-height:30px;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:8px;padding-right:24px}.ivu-select-multiple .ivu-select-selection{padding:0 24px 0 4px}.ivu-select-multiple .ivu-select-selection .ivu-select-placeholder{display:block;height:30px;line-height:30px;color:#c5c8ce;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:4px;padding-right:22px}.ivu-select-default.ivu-select-multiple .ivu-select-selection{min-height:32px}.ivu-select-large.ivu-select-single .ivu-select-selection{height:40px}.ivu-select-large.ivu-select-single .ivu-select-selection .ivu-select-placeholder,.ivu-select-large.ivu-select-single .ivu-select-selection .ivu-select-selected-value{height:38px;line-height:38px;font-size:16px}.ivu-select-large.ivu-select-multiple .ivu-select-selection{min-height:40px}.ivu-select-large.ivu-select-multiple .ivu-select-selection .ivu-select-placeholder,.ivu-select-large.ivu-select-multiple .ivu-select-selection .ivu-select-selected-value{min-height:38px;line-height:38px;font-size:16px}.ivu-select-small.ivu-select-single .ivu-select-selection{height:24px;border-radius:3px}.ivu-select-small.ivu-select-single .ivu-select-selection .ivu-select-placeholder,.ivu-select-small.ivu-select-single .ivu-select-selection .ivu-select-selected-value{height:22px;line-height:22px}.ivu-select-small.ivu-select-multiple .ivu-select-selection{min-height:24px;border-radius:3px}.ivu-select-small.ivu-select-multiple .ivu-select-selection .ivu-select-placeholder,.ivu-select-small.ivu-select-multiple .ivu-select-selection .ivu-select-selected-value{height:auto;min-height:22px;line-height:22px}.ivu-select-input{display:inline-block;height:32px;line-height:32px;padding:0 24px 0 8px;font-size:14px;outline:0;border:none;-webkit-box-sizing:border-box;box-sizing:border-box;color:#515a6e;background-color:transparent;position:relative;cursor:pointer}.ivu-select-input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-select-input:-ms-input-placeholder{color:#c5c8ce}.ivu-select-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-select-input[disabled]{cursor:not-allowed;color:#ccc;-webkit-text-fill-color:#ccc}.ivu-select-single .ivu-select-input{width:100%}.ivu-select-large .ivu-select-input,.ivu-select-large.ivu-select-multiple .ivu-select-input{font-size:16px;height:32px;line-height:32px;top:3px}.ivu-select-small .ivu-select-input,.ivu-select-small.ivu-select-multiple .ivu-select-input{height:18px;line-height:18px;top:2px}.ivu-select-multiple .ivu-select-input{height:26px;line-height:26px;padding:0 0 0 4px;top:2px}.ivu-select-not-found{text-align:center;color:#c5c8ce}.ivu-select-not-found li:not([class^=ivu-]){margin-bottom:0}.ivu-select-loading{text-align:center;color:#c5c8ce}.ivu-select-multiple .ivu-tag{height:24px;line-height:22px;margin:3px 4px 3px 0;max-width:99%;position:relative}.ivu-select-multiple .ivu-tag span:not(.ivu-select-max-tag){display:block;margin-right:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-select-multiple .ivu-tag i{display:block;position:absolute;right:4px;top:4px}.ivu-select-multiple .ivu-tag .tag-ivu-avatar{display:inline-block!important;margin:2px 5px 0 0!important;width:17px;height:17px;line-height:normal;vertical-align:top}.ivu-select-multiple-tag-hidden{margin-right:0!important}.ivu-select-multiple-tag-create{color:#8bcf70}.ivu-select-large.ivu-select-multiple .ivu-tag{height:32px;line-height:30px;font-size:16px}.ivu-select-large.ivu-select-multiple .ivu-tag i{top:9px}.ivu-select-large.ivu-select-multiple .ivu-tag .tag-ivu-avatar{margin-right:8px!important;width:26px;height:26px}.ivu-select-small.ivu-select-multiple .ivu-tag{height:17px;line-height:15px;font-size:12px;padding:0 6px;margin:3px 4px 2px 0}.ivu-select-small.ivu-select-multiple .ivu-tag span{margin-right:14px}.ivu-select-small.ivu-select-multiple .ivu-tag i{top:1px;right:2px}.ivu-select-small.ivu-select-multiple .ivu-tag .tag-ivu-avatar{margin-top:1px!important;width:13px;height:13px}.ivu-select-dropdown-list{min-width:100%;list-style:none}.ivu-select .ivu-select-dropdown{width:auto}.ivu-select-prefix{display:inline-block;vertical-align:middle}.ivu-select-prefix i{vertical-align:top}.ivu-select-head-with-prefix{display:inline-block!important;vertical-align:middle}.ivu-select-single .ivu-select-prefix{padding-left:4px}.ivu-select-multiple .ivu-select-head-with-prefix,.ivu-select-single .ivu-select-head-with-prefix{padding-left:0!important}.ivu-select-head-flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ivu-select-multiple .ivu-select-head-flex .ivu-select-prefix{margin-right:4px}.ivu-select-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-select-item:hover{background:#f3f3f3}.ivu-select-item-focus{background:#f3f3f3}.ivu-select-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-select-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-select-item-selected,.ivu-select-item-selected:hover{color:#8bcf70}.ivu-select-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-select-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-select-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-select-large .ivu-select-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-select-item{white-space:normal}}.ivu-select-multiple .ivu-select-item{position:relative}.ivu-select-multiple .ivu-select-item-selected{color:rgba(139,207,112,.9);background:#fff}.ivu-select-multiple .ivu-select-item-focus,.ivu-select-multiple .ivu-select-item-selected:hover{background:#f3f3f3}.ivu-select-multiple .ivu-select-item-selected.ivu-select-multiple .ivu-select-item-focus{color:rgba(122,182,99,.91);background:#fff}.ivu-select-multiple .ivu-select-item-selected:after{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:optimizeLegibility;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:-.125em;text-align:center;font-size:24px;content:'\F171';color:rgba(139,207,112,.9);position:absolute;top:2px;right:8px}.ivu-select-multiple .ivu-select-item-selected.ivu-select-item-disabled{color:#c5c8ce}.ivu-select-multiple .ivu-select-item-selected.ivu-select-item-disabled:after{color:#c5c8ce}.ivu-select-multiple .ivu-select-item-selected.ivu-select-item-disabled:hover{background-color:#fff}.ivu-select-group{list-style:none;margin:0;padding:0}.ivu-select-group-title{padding-left:8px;font-size:14px;color:#999;height:30px;line-height:30px}.ivu-form-item-error .ivu-select-selection{border:1px solid #ed4014}.ivu-form-item-error .ivu-select-arrow{color:#ed4014}.ivu-form-item-error .ivu-select-visible .ivu-select-selection{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-select-dropdown{width:inherit;max-height:200px;overflow:auto;margin:5px 0;padding:5px 0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);position:absolute;z-index:900}.ivu-select-dropdown-transfer{z-index:1060;width:auto}.ivu-select-dropdown.ivu-transfer-no-max-height{max-height:none}.ivu-modal .ivu-select-dropdown{position:absolute!important}.ivu-split-wrapper{position:relative;width:100%;height:100%}.ivu-split-pane{position:absolute}.ivu-split-pane.left-pane,.ivu-split-pane.right-pane{top:0;bottom:0}.ivu-split-pane.left-pane{left:0}.ivu-split-pane.right-pane{right:0}.ivu-split-pane.bottom-pane,.ivu-split-pane.top-pane{left:0;right:0}.ivu-split-pane.top-pane{top:0}.ivu-split-pane.bottom-pane{bottom:0}.ivu-split-pane-moving{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-split-trigger{border:1px solid #dcdee2}.ivu-split-trigger-con{position:absolute;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10}.ivu-split-trigger-bar-con{position:absolute;overflow:hidden}.ivu-split-trigger-bar-con.vertical{left:1px;top:50%;height:32px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.ivu-split-trigger-bar-con.horizontal{left:50%;top:1px;width:32px;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.ivu-split-trigger-vertical{width:6px;height:100%;background:#f8f8f9;border-top:none;border-bottom:none;cursor:col-resize}.ivu-split-trigger-vertical .ivu-split-trigger-bar{width:4px;height:1px;background:rgba(23,35,61,.25);float:left;margin-top:3px}.ivu-split-trigger-horizontal{height:6px;width:100%;background:#f8f8f9;border-left:none;border-right:none;cursor:row-resize}.ivu-split-trigger-horizontal .ivu-split-trigger-bar{height:4px;width:1px;background:rgba(23,35,61,.25);float:left;margin-right:3px}.ivu-split-horizontal>.ivu-split-trigger-con{top:50%;height:100%;width:0}.ivu-split-vertical>.ivu-split-trigger-con{left:50%;height:0;width:100%}.ivu-split .no-select{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-tooltip{display:inline-block}.ivu-tooltip-rel{display:inline-block;position:relative;width:inherit}.ivu-tooltip-popper{display:block;visibility:visible;font-size:14px;line-height:1.5;position:absolute;z-index:1060}.ivu-tooltip-popper[x-placement^=top]{padding:5px 0 8px 0}.ivu-tooltip-popper[x-placement^=right]{padding:0 5px 0 8px}.ivu-tooltip-popper[x-placement^=bottom]{padding:8px 0 5px 0}.ivu-tooltip-popper[x-placement^=left]{padding:0 8px 0 5px}.ivu-tooltip-popper[x-placement^=top] .ivu-tooltip-arrow{bottom:3px;border-width:5px 5px 0;border-top-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=top] .ivu-tooltip-arrow{left:50%;margin-left:-5px}.ivu-tooltip-popper[x-placement=top-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-popper[x-placement=top-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-popper[x-placement^=right] .ivu-tooltip-arrow{left:3px;border-width:5px 5px 5px 0;border-right-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=right] .ivu-tooltip-arrow{top:50%;margin-top:-5px}.ivu-tooltip-popper[x-placement=right-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-popper[x-placement=right-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-popper[x-placement^=left] .ivu-tooltip-arrow{right:3px;border-width:5px 0 5px 5px;border-left-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=left] .ivu-tooltip-arrow{top:50%;margin-top:-5px}.ivu-tooltip-popper[x-placement=left-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-popper[x-placement=left-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-popper[x-placement^=bottom] .ivu-tooltip-arrow{top:3px;border-width:0 5px 5px;border-bottom-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=bottom] .ivu-tooltip-arrow{left:50%;margin-left:-5px}.ivu-tooltip-popper[x-placement=bottom-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-popper[x-placement=bottom-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-light.ivu-tooltip-popper{display:block;visibility:visible;font-size:14px;line-height:1.5;position:absolute;z-index:1060}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=top]{padding:7px 0 10px 0}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=right]{padding:0 7px 0 10px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=bottom]{padding:10px 0 7px 0}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=left]{padding:0 10px 0 7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=top] .ivu-tooltip-arrow{bottom:3px;border-width:7px 7px 0;border-top-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=top] .ivu-tooltip-arrow{left:50%;margin-left:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=top-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=top-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=right] .ivu-tooltip-arrow{left:3px;border-width:7px 7px 7px 0;border-right-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=right] .ivu-tooltip-arrow{top:50%;margin-top:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=right-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=right-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=left] .ivu-tooltip-arrow{right:3px;border-width:7px 0 7px 7px;border-left-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=left] .ivu-tooltip-arrow{top:50%;margin-top:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=left-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=left-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=bottom] .ivu-tooltip-arrow{top:3px;border-width:0 7px 7px;border-bottom-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=bottom] .ivu-tooltip-arrow{left:50%;margin-left:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=bottom-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=bottom-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=top] .ivu-tooltip-arrow:after{content:" ";bottom:1px;margin-left:-7px;border-bottom-width:0;border-top-width:7px;border-top-color:#fff}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=right] .ivu-tooltip-arrow:after{content:" ";left:1px;bottom:-7px;border-left-width:0;border-right-width:7px;border-right-color:#fff}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=bottom] .ivu-tooltip-arrow:after{content:" ";top:1px;margin-left:-7px;border-top-width:0;border-bottom-width:7px;border-bottom-color:#fff}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=left] .ivu-tooltip-arrow:after{content:" ";right:1px;border-right-width:0;border-left-width:7px;border-left-color:#fff;bottom:-7px}.ivu-tooltip-inner{max-width:250px;min-height:34px;padding:8px 12px;color:#fff;text-align:left;text-decoration:none;background-color:rgba(70,76,91,.9);border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);white-space:nowrap}.ivu-tooltip-inner-with-width{white-space:pre-wrap;text-align:justify;word-wrap:break-word;word-break:break-all}.ivu-tooltip-light .ivu-tooltip-inner{background-color:#fff;color:#515a6e}.ivu-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.ivu-tooltip-light .ivu-tooltip-arrow{border-width:8px}.ivu-tooltip-light .ivu-tooltip-arrow:after{display:block;width:0;height:0;position:absolute;border-color:transparent;border-style:solid;content:"";border-width:7px}.ivu-poptip{display:inline-block}.ivu-poptip-rel{display:inline-block;position:relative}.ivu-poptip-title{margin:0;padding:8px 16px;position:relative}.ivu-poptip-title:after{content:'';display:block;height:1px;position:absolute;left:8px;right:8px;bottom:0;background-color:#e8eaec}.ivu-poptip-title-inner{color:#17233d;font-size:14px;font-weight:500}.ivu-poptip-body{padding:8px 16px}.ivu-poptip-body-content{overflow:auto}.ivu-poptip-body-content-word-wrap{white-space:pre-wrap;text-align:justify}.ivu-poptip-body-content-inner{color:#515a6e}.ivu-poptip-inner{width:100%;background-color:#fff;background-clip:padding-box;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);white-space:nowrap}.ivu-poptip-popper{min-width:150px;display:block;visibility:visible;font-size:14px;line-height:1.5;position:absolute;z-index:1060}.ivu-poptip-popper[x-placement^=top]{padding:7px 0 10px 0}.ivu-poptip-popper[x-placement^=right]{padding:0 7px 0 10px}.ivu-poptip-popper[x-placement^=bottom]{padding:10px 0 7px 0}.ivu-poptip-popper[x-placement^=left]{padding:0 10px 0 7px}.ivu-poptip-popper[x-placement^=top] .ivu-poptip-arrow{bottom:3px;border-width:7px 7px 0;border-top-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=top] .ivu-poptip-arrow{left:50%;margin-left:-7px}.ivu-poptip-popper[x-placement=top-start] .ivu-poptip-arrow{left:16px}.ivu-poptip-popper[x-placement=top-end] .ivu-poptip-arrow{right:16px}.ivu-poptip-popper[x-placement^=right] .ivu-poptip-arrow{left:3px;border-width:7px 7px 7px 0;border-right-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=right] .ivu-poptip-arrow{top:50%;margin-top:-7px}.ivu-poptip-popper[x-placement=right-start] .ivu-poptip-arrow{top:8px}.ivu-poptip-popper[x-placement=right-end] .ivu-poptip-arrow{bottom:8px}.ivu-poptip-popper[x-placement^=left] .ivu-poptip-arrow{right:3px;border-width:7px 0 7px 7px;border-left-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=left] .ivu-poptip-arrow{top:50%;margin-top:-7px}.ivu-poptip-popper[x-placement=left-start] .ivu-poptip-arrow{top:8px}.ivu-poptip-popper[x-placement=left-end] .ivu-poptip-arrow{bottom:8px}.ivu-poptip-popper[x-placement^=bottom] .ivu-poptip-arrow{top:3px;border-width:0 7px 7px;border-bottom-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=bottom] .ivu-poptip-arrow{left:50%;margin-left:-7px}.ivu-poptip-popper[x-placement=bottom-start] .ivu-poptip-arrow{left:16px}.ivu-poptip-popper[x-placement=bottom-end] .ivu-poptip-arrow{right:16px}.ivu-poptip-popper[x-placement^=top] .ivu-poptip-arrow:after{content:" ";bottom:1px;margin-left:-7px;border-bottom-width:0;border-top-width:7px;border-top-color:#fff}.ivu-poptip-popper[x-placement^=right] .ivu-poptip-arrow:after{content:" ";left:1px;bottom:-7px;border-left-width:0;border-right-width:7px;border-right-color:#fff}.ivu-poptip-popper[x-placement^=bottom] .ivu-poptip-arrow:after{content:" ";top:1px;margin-left:-7px;border-top-width:0;border-bottom-width:7px;border-bottom-color:#fff}.ivu-poptip-popper[x-placement^=left] .ivu-poptip-arrow:after{content:" ";right:1px;border-right-width:0;border-left-width:7px;border-left-color:#fff;bottom:-7px}.ivu-poptip-arrow,.ivu-poptip-arrow:after{display:block;width:0;height:0;position:absolute;border-color:transparent;border-style:solid}.ivu-poptip-arrow{border-width:8px}.ivu-poptip-arrow:after{content:"";border-width:7px}.ivu-poptip-confirm .ivu-poptip-popper{max-width:300px}.ivu-poptip-confirm .ivu-poptip-inner{white-space:normal}.ivu-poptip-confirm .ivu-poptip-body{padding:16px 16px 8px}.ivu-poptip-confirm .ivu-poptip-body .ivu-icon{font-size:16px;color:#f90;line-height:18px;position:absolute}.ivu-poptip-confirm .ivu-poptip-body-message{padding-left:20px}.ivu-poptip-confirm .ivu-poptip-footer{text-align:right;padding:8px 16px 16px}.ivu-poptip-confirm .ivu-poptip-footer button{margin-left:4px}.ivu-input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:14px;border:1px solid #dcdee2;border-radius:4px;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-input:-ms-input-placeholder{color:#c5c8ce}.ivu-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-input:hover{border-color:#a2d98d}.ivu-input:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-input[disabled],fieldset[disabled] .ivu-input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input[disabled]:hover,fieldset[disabled] .ivu-input:hover{border-color:#e3e5e8}textarea.ivu-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-input-large{font-size:16px;padding:6px 7px;height:40px}.ivu-input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-input-no-border{border-radius:0;border-color:transparent}.ivu-input-no-border:hover{border-color:transparent}.ivu-input-no-border:focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ivu-input-no-border[disabled]{background-color:transparent}.ivu-input-no-border[disabled]:hover{border-color:transparent}.ivu-input-wrapper{display:inline-block;width:100%;position:relative;vertical-align:middle;line-height:normal}.ivu-input-icon{width:32px;height:32px;line-height:32px;font-size:16px;text-align:center;color:#808695;position:absolute;right:0;z-index:3}.ivu-input-hide-icon .ivu-input-icon{display:none}.ivu-input-icon-validate{display:none}.ivu-input-icon-clear{display:none}.ivu-input-wrapper:hover .ivu-input-icon-clear{display:inline-block}.ivu-input-icon-normal+.ivu-input{padding-right:32px}.ivu-input-hide-icon .ivu-input-icon-normal+.ivu-input{padding-right:7px}.ivu-input-wrapper-large .ivu-input-icon{font-size:18px;height:40px;line-height:40px}.ivu-input-wrapper-small .ivu-input-icon{width:24px;font-size:14px;height:24px;line-height:24px}.ivu-input-prefix,.ivu-input-suffix{width:32px;height:100%;text-align:center;position:absolute;left:0;top:0;z-index:1}.ivu-input-prefix i,.ivu-input-suffix i{font-size:16px;line-height:32px;color:#808695}.ivu-input-suffix{left:auto;right:0}.ivu-input-wrapper-small .ivu-input-prefix i,.ivu-input-wrapper-small .ivu-input-suffix i{font-size:14px;line-height:24px}.ivu-input-wrapper-large .ivu-input-prefix i,.ivu-input-wrapper-large .ivu-input-suffix i{font-size:18px;line-height:40px}.ivu-input-with-prefix{padding-left:32px}.ivu-input-with-suffix{padding-right:32px}.ivu-input-search{cursor:pointer;padding:0 16px!important;background:#8bcf70!important;color:#fff!important;border-color:#8bcf70!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;position:relative;z-index:2}.ivu-input-search i{font-size:16px}.ivu-input-search:hover{background:#a2d98d!important;border-color:#a2d98d!important}.ivu-input-search:active{background:#84c56a!important;border-color:#84c56a!important}.ivu-input-search-icon{cursor:pointer;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-input-search-icon:hover{color:inherit}.ivu-input-search:before{content:'';display:block;width:1px;position:absolute;top:-1px;bottom:-1px;left:-1px;background:inherit}.ivu-input-wrapper-small .ivu-input-search{padding:0 12px!important}.ivu-input-wrapper-small .ivu-input-search i{font-size:14px}.ivu-input-wrapper-large .ivu-input-search{padding:0 20px!important}.ivu-input-wrapper-large .ivu-input-search i{font-size:18px}.ivu-input-with-search:hover .ivu-input{border-color:#a2d98d}.ivu-input-word-count{text-align:center;position:absolute;right:7px;top:2px;bottom:2px;padding-left:7px;background:#fff;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#808695;font-size:12px}.ivu-input-wrapper-disabled .ivu-input-word-count{background:#f3f3f3}.ivu-input-type-textarea .ivu-input-word-count{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;top:auto}.ivu-input-group{display:table;width:100%;border-collapse:separate;position:relative;font-size:14px}.ivu-form-inline .ivu-input-group{top:1px}.ivu-input-group-large{font-size:16px}.ivu-input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.ivu-input-group>[class*=col-]{padding-right:8px}.ivu-input-group-append,.ivu-input-group-prepend,.ivu-input-group>.ivu-input{display:table-cell}.ivu-input-group-with-prepend .ivu-input,.ivu-input-group-with-prepend.ivu-input-group-small .ivu-input{border-top-left-radius:0;border-bottom-left-radius:0}.ivu-input-group-with-append .ivu-input,.ivu-input-group-with-append.ivu-input-group-small .ivu-input{border-top-right-radius:0;border-bottom-right-radius:0}.ivu-input-group-append .ivu-btn,.ivu-input-group-prepend .ivu-btn{border-color:transparent;background-color:transparent;color:inherit;margin:-6px -7px}.ivu-input-group-append,.ivu-input-group-prepend{width:1px;white-space:nowrap;vertical-align:middle}.ivu-input-group .ivu-input{width:100%;float:left;margin-bottom:0;position:relative;z-index:2}.ivu-input-group-append,.ivu-input-group-prepend{padding:4px 7px;font-size:inherit;font-weight:400;line-height:1;color:#515a6e;text-align:center;background-color:#f8f8f9;border:1px solid #dcdee2;border-radius:4px}.ivu-input-group-append .ivu-select,.ivu-input-group-prepend .ivu-select{margin:-5px -7px}.ivu-input-group-append .ivu-select-selection,.ivu-input-group-prepend .ivu-select-selection{background-color:inherit;margin:-1px;border:1px solid transparent}.ivu-input-group-append .ivu-select-visible .ivu-select-selection,.ivu-input-group-prepend .ivu-select-visible .ivu-select-selection{-webkit-box-shadow:none;box-shadow:none}.ivu-input-group-prepend,.ivu-input-group>.ivu-input:first-child,.ivu-input-group>span>.ivu-input:first-child{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.ivu-input-group-prepend .ivu--select .ivu--select-selection,.ivu-input-group>.ivu-input:first-child .ivu--select .ivu--select-selection,.ivu-input-group>span>.ivu-input:first-child .ivu--select .ivu--select-selection{border-bottom-right-radius:0;border-top-right-radius:0}.ivu-input-group-prepend{border-right:0}.ivu-input-group-append{border-left:0}.ivu-input-group-append,.ivu-input-group>.ivu-input:last-child{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.ivu-input-group-append .ivu--select .ivu--select-selection,.ivu-input-group>.ivu-input:last-child .ivu--select .ivu--select-selection{border-bottom-left-radius:0;border-top-left-radius:0}.ivu-input-group-large .ivu-input,.ivu-input-group-large>.ivu-input-group-append,.ivu-input-group-large>.ivu-input-group-prepend{font-size:16px;padding:6px 7px;height:40px}.ivu-input-group-small .ivu-input,.ivu-input-group-small>.ivu-input-group-append,.ivu-input-group-small>.ivu-input-group-prepend{padding:1px 7px;height:24px;border-radius:3px}.ivu-form-item-error .ivu-input{border:1px solid #ed4014}.ivu-form-item-error .ivu-input:hover{border-color:#ed4014}.ivu-form-item-error .ivu-input:focus{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-form-item-error .ivu-input-icon{color:#ed4014}.ivu-form-item-error .ivu-input-group-append,.ivu-form-item-error .ivu-input-group-prepend{background-color:#fff;border:1px solid #ed4014}.ivu-form-item-error .ivu-input-group-append .ivu-select-selection,.ivu-form-item-error .ivu-input-group-prepend .ivu-select-selection{background-color:inherit;border:1px solid transparent}.ivu-form-item-error .ivu-input-group-prepend{border-right:0}.ivu-form-item-error .ivu-input-group-append{border-left:0}.ivu-form-item-error .ivu-transfer .ivu-input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:14px;border:1px solid #dcdee2;border-radius:4px;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-form-item-error .ivu-transfer .ivu-input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-form-item-error .ivu-transfer .ivu-input:-ms-input-placeholder{color:#c5c8ce}.ivu-form-item-error .ivu-transfer .ivu-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-form-item-error .ivu-transfer .ivu-input:hover{border-color:#a2d98d}.ivu-form-item-error .ivu-transfer .ivu-input:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-form-item-error .ivu-transfer .ivu-input[disabled],fieldset[disabled] .ivu-form-item-error .ivu-transfer .ivu-input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-form-item-error .ivu-transfer .ivu-input[disabled]:hover,fieldset[disabled] .ivu-form-item-error .ivu-transfer .ivu-input:hover{border-color:#e3e5e8}textarea.ivu-form-item-error .ivu-transfer .ivu-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-form-item-error .ivu-transfer .ivu-input-large{font-size:16px;padding:6px 7px;height:40px}.ivu-form-item-error .ivu-transfer .ivu-input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-form-item-error .ivu-transfer .ivu-input-no-border{border-radius:0;border-color:transparent}.ivu-form-item-error .ivu-transfer .ivu-input-no-border:hover{border-color:transparent}.ivu-form-item-error .ivu-transfer .ivu-input-no-border:focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ivu-form-item-error .ivu-transfer .ivu-input-no-border[disabled]{background-color:transparent}.ivu-form-item-error .ivu-transfer .ivu-input-no-border[disabled]:hover{border-color:transparent}.ivu-form-item-error .ivu-transfer .ivu-input-icon{color:#808695}.ivu-form-item-validating .ivu-input-icon-validate{display:inline-block}.ivu-form-item-validating .ivu-input-icon+.ivu-input{padding-right:32px}.ivu-slider{line-height:normal}.ivu-slider-wrap{width:100%;height:4px;margin:16px 0;background-color:#e8eaec;border-radius:3px;vertical-align:middle;position:relative;cursor:pointer}.ivu-slider-button-wrap{width:18px;height:18px;text-align:center;background-color:transparent;position:absolute;top:-5px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ivu-slider-button-wrap .ivu-tooltip{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-slider-button{width:12px;height:12px;border:2px solid #a2d98d;border-radius:50%;background-color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear;outline:0}.ivu-slider-button-dragging,.ivu-slider-button:focus,.ivu-slider-button:hover{border-color:#8bcf70;-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.ivu-slider-button:hover{cursor:-webkit-grab;cursor:grab}.ivu-slider-button-dragging,.ivu-slider-button-dragging:hover{cursor:-webkit-grabbing;cursor:grabbing}.ivu-slider-bar{height:4px;background:#a2d98d;border-radius:3px;position:absolute}.ivu-slider-stop{position:absolute;width:4px;height:4px;border-radius:50%;background-color:#fff;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ivu-slider-marks{top:0;left:12px;width:18px;height:100%}.ivu-slider-marks-item{position:absolute;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#808695;margin-top:15px}.ivu-slider-disabled{cursor:not-allowed}.ivu-slider-disabled .ivu-slider-wrap{background-color:#ccc;cursor:not-allowed}.ivu-slider-disabled .ivu-slider-bar{background-color:#ccc}.ivu-slider-disabled .ivu-slider-button{border-color:#ccc}.ivu-slider-disabled .ivu-slider-button-dragging,.ivu-slider-disabled .ivu-slider-button:hover{border-color:#ccc}.ivu-slider-disabled .ivu-slider-button:hover{cursor:not-allowed}.ivu-slider-disabled .ivu-slider-button-dragging,.ivu-slider-disabled .ivu-slider-button-dragging:hover{cursor:not-allowed}.ivu-slider-input .ivu-slider-wrap{width:auto;margin-right:100px}.ivu-slider-input .ivu-input-number{float:right;margin-top:-14px}.selectDropDown{width:auto;padding:0;white-space:nowrap;overflow:visible}.ivu-cascader{line-height:normal}.ivu-cascader-rel{display:inline-block;width:100%;position:relative}.ivu-cascader .ivu-input{padding-right:24px;display:block;cursor:pointer}.ivu-cascader-disabled .ivu-input{cursor:not-allowed}.ivu-cascader-label{width:100%;height:100%;line-height:32px;padding:0 7px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;cursor:pointer;font-size:14px;position:absolute;left:0;top:0}.ivu-cascader-size-large .ivu-cascader-label{line-height:36px;font-size:14px}.ivu-cascader-size-small .ivu-cascader-label{line-height:26px}.ivu-cascader .ivu-cascader-arrow:nth-of-type(1){display:none;cursor:pointer}.ivu-cascader:hover .ivu-cascader-arrow:nth-of-type(1){display:inline-block}.ivu-cascader-show-clear:hover .ivu-cascader-arrow:nth-of-type(2){display:none}.ivu-cascader-arrow{position:absolute;top:50%;right:8px;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-size:14px;color:#808695;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-cascader-visible .ivu-cascader-arrow:nth-of-type(2){-webkit-transform:translateY(-50%) rotate(180deg);-ms-transform:translateY(-50%) rotate(180deg);transform:translateY(-50%) rotate(180deg)}.ivu-cascader .ivu-select-dropdown{width:auto;padding:0;white-space:nowrap;overflow:visible}.ivu-cascader .ivu-cascader-menu-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-cascader .ivu-cascader-menu-item:hover{background:#f3f3f3}.ivu-cascader .ivu-cascader-menu-item-focus{background:#f3f3f3}.ivu-cascader .ivu-cascader-menu-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-cascader .ivu-cascader-menu-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-cascader .ivu-cascader-menu-item-selected,.ivu-cascader .ivu-cascader-menu-item-selected:hover{color:#8bcf70}.ivu-cascader .ivu-cascader-menu-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-cascader .ivu-cascader-menu-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-cascader .ivu-cascader-menu-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-cascader .ivu-cascader-large .ivu-cascader-menu-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-cascader .ivu-cascader-menu-item{white-space:normal}}.ivu-cascader .ivu-select-item span{color:#ed4014}.ivu-cascader-dropdown{padding:5px 0}.ivu-cascader-dropdown .ivu-select-dropdown-list{max-height:190px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.ivu-cascader-not-found-tip{padding:5px 0;text-align:center;color:#c5c8ce}.ivu-cascader-not-found-tip li:not([class^=ivu-]){list-style:none;margin-bottom:0}.ivu-cascader-not-found .ivu-select-dropdown{width:inherit}.ivu-cascader-menu{display:inline-block;min-width:100px;height:180px;margin:0;padding:5px 0!important;vertical-align:top;list-style:none;border-right:1px solid #e8eaec;overflow:auto}.ivu-cascader-menu:last-child{border-right-color:transparent;margin-right:-1px}.ivu-cascader-menu .ivu-cascader-menu-item{position:relative;padding-right:36px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-cascader-menu .ivu-cascader-menu-item i{font-size:12px;position:absolute;right:15px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ivu-cascader-menu .ivu-cascader-menu-item-loading{margin-top:-6px}.ivu-cascader-menu .ivu-cascader-menu-item-active{background-color:#f3f3f3;color:#8bcf70}.ivu-cascader-transfer{z-index:1060;width:auto;padding:0;white-space:nowrap;overflow:visible}.ivu-cascader-transfer .ivu-cascader-menu-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-cascader-transfer .ivu-cascader-menu-item:hover{background:#f3f3f3}.ivu-cascader-transfer .ivu-cascader-menu-item-focus{background:#f3f3f3}.ivu-cascader-transfer .ivu-cascader-menu-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-cascader-transfer .ivu-cascader-menu-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-cascader-transfer .ivu-cascader-menu-item-selected,.ivu-cascader-transfer .ivu-cascader-menu-item-selected:hover{color:#8bcf70}.ivu-cascader-transfer .ivu-cascader-menu-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-cascader-transfer .ivu-cascader-menu-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-cascader-transfer .ivu-cascader-menu-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-cascader-transfer .ivu-cascader-large .ivu-cascader-menu-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-cascader-transfer .ivu-cascader-menu-item{white-space:normal}}.ivu-cascader-transfer .ivu-select-item span{color:#ed4014}.ivu-cascader-transfer .ivu-cascader-menu-item{padding-right:24px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-cascader-transfer .ivu-cascader-menu-item-active{background-color:#f3f3f3;color:#8bcf70}.ivu-form-item-error .ivu-cascader-arrow{color:#ed4014}.ivu-transfer{position:relative;line-height:1.5}.ivu-transfer-list{display:inline-block;width:180px;height:210px;font-size:14px;vertical-align:middle;position:relative;padding-top:35px}.ivu-transfer-list-with-footer{padding-bottom:35px}.ivu-transfer-list-header{padding:8px 16px;background:#f9fafc;color:#515a6e;border:1px solid #dcdee2;border-bottom:1px solid #e8eaec;border-radius:6px 6px 0 0;overflow:hidden;position:absolute;top:0;left:0;width:100%}.ivu-transfer-list-header-title{cursor:pointer}.ivu-transfer-list-header>span{padding-left:4px}.ivu-transfer-list-header-count{margin:0!important;float:right}.ivu-transfer-list-body{height:100%;border:1px solid #dcdee2;border-top:none;border-radius:0 0 6px 6px;position:relative;overflow:hidden}.ivu-transfer-list-body-with-search{padding-top:34px}.ivu-transfer-list-body-with-footer{border-radius:0}.ivu-transfer-list-content{height:100%;padding:4px 0;overflow:auto}.ivu-transfer-list-content-item{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ivu-transfer-list-content-item>span{padding-left:4px}.ivu-transfer-list-content-not-found{display:none;text-align:center;color:#c5c8ce}li.ivu-transfer-list-content-not-found:only-child{display:block}.ivu-transfer-list-body-with-search .ivu-transfer-list-content{padding:6px 0 0}.ivu-transfer-list-body-search-wrapper{padding:8px 8px 0;position:absolute;top:0;left:0;right:0}.ivu-transfer-list-search{position:relative}.ivu-transfer-list-footer{border:1px solid #dcdee2;border-top:none;border-radius:0 0 6px 6px;position:absolute;bottom:0;left:0;right:0;zoom:1}.ivu-transfer-list-footer:after,.ivu-transfer-list-footer:before{content:"";display:table}.ivu-transfer-list-footer:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-transfer-operation{display:inline-block;margin:0 16px;vertical-align:middle}.ivu-transfer-operation .ivu-btn{display:block;min-width:24px}.ivu-transfer-operation .ivu-btn:first-child{margin-bottom:12px}.ivu-transfer-operation .ivu-btn span i,.ivu-transfer-operation .ivu-btn span span{vertical-align:middle}.ivu-transfer-list-content-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-transfer-list-content-item:hover{background:#f3f3f3}.ivu-transfer-list-content-item-focus{background:#f3f3f3}.ivu-transfer-list-content-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-transfer-list-content-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-transfer-list-content-item-selected,.ivu-transfer-list-content-item-selected:hover{color:#8bcf70}.ivu-transfer-list-content-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-transfer-list-content-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-transfer-list-content-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-transfer-large .ivu-transfer-list-content-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-transfer-list-content-item{white-space:normal}}.ivu-table{width:inherit;height:100%;max-width:100%;overflow:hidden;color:#515a6e;font-size:14px;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.ivu-table-wrapper{position:relative;overflow:hidden}.ivu-table-wrapper-with-border{border:1px solid #dcdee2;border-bottom:0;border-right:0}.ivu-table-summary{border-top:1px solid #e8eaec}.ivu-table-summary tr td{background-color:#f8f8f9}.ivu-table-with-summary .ivu-table-tbody tr:last-child td{border-bottom:none}.ivu-table-resize-line{position:absolute;top:0;left:0;bottom:0;width:1px;border-right:1px dashed #e8eaec}.ivu-table-hide{opacity:0}.ivu-table:before{content:'';width:100%;height:1px;position:absolute;left:0;bottom:0;background-color:#dcdee2;z-index:4}.ivu-table-border:after{content:'';width:1px;height:100%;position:absolute;top:0;right:0;background-color:#dcdee2;z-index:3}.ivu-table-footer,.ivu-table-title{height:48px;line-height:48px;border-bottom:1px solid #e8eaec}.ivu-table-footer{border-bottom:none}.ivu-table-header{overflow:hidden}.ivu-table-header thead tr th{position:relative;height:100%;padding:8px 0}.ivu-table-header-resizable{position:absolute;width:10px;height:100%;bottom:0;right:-5px;cursor:col-resize;z-index:1}.ivu-table-overflowX{overflow-x:scroll}.ivu-table-overflowY{overflow-y:scroll}.ivu-table-tip{overflow-x:auto;overflow-y:hidden}.ivu-table-with-fixed-top.ivu-table-with-footer .ivu-table-footer{border-top:1px solid #dcdee2}.ivu-table-with-fixed-top.ivu-table-with-footer tbody tr:last-child td{border-bottom:none}.ivu-table td,.ivu-table th{min-width:0;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;text-overflow:ellipsis;vertical-align:middle;border-bottom:1px solid #e8eaec}.ivu-table th{height:40px;white-space:nowrap;overflow:hidden;background-color:#f8f8f9}.ivu-table td{background-color:#fff;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}td.ivu-table-column-left,th.ivu-table-column-left{text-align:left}td.ivu-table-column-center,th.ivu-table-column-center{text-align:center}td.ivu-table-column-right,th.ivu-table-column-right{text-align:right}.ivu-table table{table-layout:fixed}.ivu-table-border td,.ivu-table-border th{border-right:1px solid #e8eaec}.ivu-table-cell{padding-left:18px;padding-right:18px;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box}.ivu-table-cell-ellipsis{word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ivu-table-cell-tooltip{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ivu-table-cell-tooltip-content{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-table-cell-with-expand{height:47px;line-height:47px;padding:0;text-align:center}.ivu-table-cell-expand{cursor:pointer;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.ivu-table-cell-expand i{font-size:14px}.ivu-table-cell-expand-expanded{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ivu-table-cell-sort{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-table-cell-with-selection .ivu-checkbox-wrapper{margin-right:0}.ivu-table-cell-tree{display:inline-block;width:16px;height:16px;border:1px solid #dcdee2;border-radius:2px;background-color:#fff;line-height:12px;cursor:pointer;vertical-align:middle;-webkit-transition:color .2s ease-in-out,border-color .2s ease-in-out;transition:color .2s ease-in-out,border-color .2s ease-in-out}.ivu-table-cell-tree-empty{cursor:default;color:transparent;background-color:transparent;border-color:transparent}.ivu-table-cell-tree:hover{color:#8bcf70;border-color:#8bcf70}.ivu-table-cell-tree-empty:hover{color:transparent;border-color:transparent}.ivu-table-cell-tree-loading{cursor:default;background-color:transparent;border-color:transparent}.ivu-table-cell-tree-loading:hover{border-color:transparent}.ivu-table-cell-tree-level{display:inline-block;height:16px}.ivu-table-cell-slot-inline{display:inline}.ivu-table-cell-slot-inline-block{display:inline-block}.ivu-table-hidden{visibility:hidden}th .ivu-table-cell{display:inline-block;word-wrap:normal;vertical-align:middle}td.ivu-table-expanded-cell{padding:20px 50px;background:#f8f8f9}.ivu-table-stripe .ivu-table-body tr:nth-child(2n) td,.ivu-table-stripe .ivu-table-fixed-body tr:nth-child(2n) td{background-color:#f8f8f9}.ivu-table-stripe .ivu-table-body tr.ivu-table-row-hover td,.ivu-table-stripe .ivu-table-fixed-body tr.ivu-table-row-hover td{background-color:#ebf7ff}tr.ivu-table-row-hover td{background-color:#ebf7ff}.ivu-table-large{font-size:16px}.ivu-table-large th{height:48px}.ivu-table-large td{height:60px}.ivu-table-large-footer,.ivu-table-large-title{height:60px;line-height:60px}.ivu-table-large .ivu-table-cell-with-expand{height:59px;line-height:59px}.ivu-table-large .ivu-table-cell-with-expand i{font-size:16px}.ivu-table-small{font-size:12px}.ivu-table-small th{height:32px}.ivu-table-small td{height:40px}.ivu-table-small-footer,.ivu-table-small-title{height:40px;line-height:40px}.ivu-table-small .ivu-table-cell-with-expand{height:39px;line-height:39px}.ivu-table-row-highlight td,.ivu-table-stripe .ivu-table-body tr.ivu-table-row-highlight:nth-child(2n) td,.ivu-table-stripe .ivu-table-fixed-body tr.ivu-table-row-highlight:nth-child(2n) td,tr.ivu-table-row-highlight.ivu-table-row-hover td{background-color:#ebf7ff}.ivu-table-fixed,.ivu-table-fixed-right{position:absolute;top:0;left:0;-webkit-box-shadow:2px 0 6px -2px rgba(0,0,0,.2);box-shadow:2px 0 6px -2px rgba(0,0,0,.2)}.ivu-table-fixed-right::before,.ivu-table-fixed::before{content:'';width:100%;height:1px;background-color:#dcdee2;position:absolute;left:0;bottom:0;z-index:4}.ivu-table-fixed-right{top:0;left:auto;right:0;-webkit-box-shadow:-2px 0 6px -2px rgba(0,0,0,.2);box-shadow:-2px 0 6px -2px rgba(0,0,0,.2)}.ivu-table-fixed-right-header{position:absolute;top:-1px;right:0;background-color:#f8f8f9;border-top:1px solid #dcdee2;border-bottom:1px solid #e8eaec}.ivu-table-fixed-header{overflow:hidden}.ivu-table-fixed-header thead tr th{position:relative;height:100%;padding:8px 0}.ivu-table-fixed-body{overflow:hidden;position:relative;z-index:3}.ivu-table-fixed-shadow{width:1px;height:100%;position:absolute;top:0;right:0;-webkit-box-shadow:1px 0 6px rgba(0,0,0,.2);box-shadow:1px 0 6px rgba(0,0,0,.2);overflow:hidden;z-index:1}.ivu-table-sort{display:inline-block;width:14px;height:12px;margin-top:-1px;vertical-align:middle;overflow:hidden;cursor:pointer;position:relative}.ivu-table-sort i{display:block;height:6px;line-height:6px;overflow:hidden;position:absolute;color:#c5c8ce;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out;font-size:16px}.ivu-table-sort i:hover{color:inherit}.ivu-table-sort i.on{color:#8bcf70}.ivu-table-sort i:first-child{top:0}.ivu-table-sort i:last-child{bottom:0}.ivu-table-filter{display:inline-block;cursor:pointer;position:relative}.ivu-table-filter i{color:#c5c8ce;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-table-filter i:hover{color:inherit}.ivu-table-filter i.on{color:#8bcf70}.ivu-table-filter-list{padding:8px 0 0}.ivu-table-filter-list-item{padding:0 12px 8px}.ivu-table-filter-list-item .ivu-checkbox-wrapper+.ivu-checkbox-wrapper{margin:0}.ivu-table-filter-list-item label{display:block}.ivu-table-filter-list-item label>span{margin-right:4px}.ivu-table-filter-list ul{padding-bottom:8px}.ivu-table-filter-list .ivu-table-filter-select-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-table-filter-list .ivu-table-filter-select-item:hover{background:#f3f3f3}.ivu-table-filter-list .ivu-table-filter-select-item-focus{background:#f3f3f3}.ivu-table-filter-list .ivu-table-filter-select-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-table-filter-list .ivu-table-filter-select-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-table-filter-list .ivu-table-filter-select-item-selected,.ivu-table-filter-list .ivu-table-filter-select-item-selected:hover{color:#8bcf70}.ivu-table-filter-list .ivu-table-filter-select-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-table-filter-list .ivu-table-filter-select-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-table-filter-list .ivu-table-filter-select-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-table-filter-list .ivu-table-large .ivu-table-filter-select-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-table-filter-list .ivu-table-filter-select-item{white-space:normal}}.ivu-table-filter-footer{padding:4px;border-top:1px solid #e8eaec;overflow:hidden}.ivu-table-filter-footer button:first-child{float:left}.ivu-table-filter-footer button:last-child{float:right}.ivu-table-tip table{width:100%}.ivu-table-tip table td{text-align:center}.ivu-table-expanded-hidden{visibility:hidden}.ivu-table-context-menu{position:absolute}.ivu-table-popper{min-width:0;text-align:left}.ivu-table-popper .ivu-poptip-body{padding:0}.ivu-dropdown{display:inline-block}.ivu-dropdown .ivu-select-dropdown{overflow:visible;max-height:none}.ivu-dropdown .ivu-dropdown{width:100%}.ivu-dropdown-rel{position:relative}.ivu-dropdown-rel-user-select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-dropdown-menu{min-width:100px}.ivu-dropdown-transfer{width:auto}.ivu-dropdown-item-selected,.ivu-dropdown-item.ivu-dropdown-item-selected:hover{background:#f7fff0}.ivu-dropdown-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-dropdown-item:hover{background:#f3f3f3}.ivu-dropdown-item-focus{background:#f3f3f3}.ivu-dropdown-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-dropdown-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-dropdown-item-selected,.ivu-dropdown-item-selected:hover{color:#8bcf70}.ivu-dropdown-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-dropdown-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-dropdown-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-dropdown-large .ivu-dropdown-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-dropdown-item{white-space:normal}}.ivu-tabs{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;overflow:hidden;color:#515a6e;zoom:1}.ivu-tabs:after,.ivu-tabs:before{content:"";display:table}.ivu-tabs:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-tabs-bar{outline:0}.ivu-tabs-ink-bar{height:2px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#8bcf70;position:absolute;left:0;bottom:1px;z-index:1;-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ivu-tabs-bar{border-bottom:1px solid #dcdee2;margin-bottom:16px}.ivu-tabs-nav-container{margin-bottom:-1px;line-height:1.5;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;overflow:hidden;position:relative;zoom:1}.ivu-tabs-nav-container:after,.ivu-tabs-nav-container:before{content:"";display:table}.ivu-tabs-nav-container:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-tabs-nav-container:focus{outline:0}.ivu-tabs-nav-container:focus .ivu-tabs-tab-focused{border-color:#57a3f3!important}.ivu-tabs-nav-container-scrolling{padding-left:32px;padding-right:32px}.ivu-tabs-nav-wrap{overflow:hidden;margin-bottom:-1px}.ivu-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.ivu-tabs-nav-right{float:right;margin-left:5px}.ivu-tabs-nav-next,.ivu-tabs-nav-prev{width:32px;text-align:center;position:absolute;line-height:32px;cursor:pointer}.ivu-tabs-nav-next i,.ivu-tabs-nav-prev i{font-size:16px}.ivu-tabs-nav-prev{left:0}.ivu-tabs-nav-next{right:0}.ivu-tabs-nav-scrollable{padding:0 32px}.ivu-tabs-nav-scroll-disabled{display:none}.ivu-tabs-nav{padding-left:0;margin:0;float:left;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;-webkit-transition:-webkit-transform .5s ease-in-out;transition:-webkit-transform .5s ease-in-out;transition:transform .5s ease-in-out;transition:transform .5s ease-in-out,-webkit-transform .5s ease-in-out}.ivu-tabs-nav:after,.ivu-tabs-nav:before{display:table;content:" "}.ivu-tabs-nav:after{clear:both}.ivu-tabs-nav .ivu-tabs-tab-disabled{pointer-events:none;cursor:default;color:#ccc}.ivu-tabs-nav .ivu-tabs-tab{display:inline-block;height:100%;padding:8px 16px;margin-right:16px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-decoration:none;position:relative;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out}.ivu-tabs-nav .ivu-tabs-tab:hover{color:#57a3f3}.ivu-tabs-nav .ivu-tabs-tab:active{color:#2b85e4}.ivu-tabs-nav .ivu-tabs-tab .ivu-icon{width:14px;height:14px;margin-right:8px}.ivu-tabs-nav .ivu-tabs-tab-active{color:#8bcf70}.ivu-tabs-mini .ivu-tabs-nav-container{font-size:14px}.ivu-tabs-mini .ivu-tabs-tab{margin-right:0;padding:8px 16px;font-size:12px}.ivu-tabs .ivu-tabs-content-animated{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;will-change:transform;-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.ivu-tabs .ivu-tabs-tabpane{-ms-flex-negative:0;flex-shrink:0;width:100%;-webkit-transition:opacity .3s;transition:opacity .3s;opacity:1;outline:0}.ivu-tabs .ivu-tabs-tabpane-inactive{opacity:0;height:0}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-nav-container{height:32px}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-ink-bar{visibility:hidden}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab{margin:0;margin-right:4px;height:31px;padding:5px 16px 4px;border:1px solid #dcdee2;border-bottom:0;border-radius:4px 4px 0 0;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background:#f8f8f9}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab-active{height:32px;padding-bottom:5px;background:#fff;-webkit-transform:translateZ(0);transform:translateZ(0);border-color:#dcdee2;color:#8bcf70}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-nav-wrap{margin-bottom:0}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab .ivu-tabs-close{width:0;height:22px;font-size:22px;margin-right:0;color:#999;text-align:right;vertical-align:middle;overflow:hidden;position:relative;top:-1px;-webkit-transform-origin:100% 50%;-ms-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab .ivu-tabs-close:hover{color:#444}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab-active .ivu-tabs-close,.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab:hover .ivu-tabs-close{width:22px;-webkit-transform:translateZ(0);transform:translateZ(0);margin-right:-6px}.ivu-tabs-context-menu{position:absolute}.ivu-tabs-no-animation>.ivu-tabs-content{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.ivu-tabs-no-animation>.ivu-tabs-content>.ivu-tabs-tabpane-inactive{display:none}.ivu-menu{display:block;margin:0;padding:0;outline:0;list-style:none;color:#515a6e;font-size:14px;position:relative;z-index:900}.ivu-menu-horizontal{height:60px;line-height:60px}.ivu-menu-horizontal.ivu-menu-light:after{content:'';display:block;width:100%;height:1px;background:#dcdee2;position:absolute;bottom:0;left:0}.ivu-menu-vertical.ivu-menu-light:after{content:'';display:block;width:1px;height:100%;background:#dcdee2;position:absolute;top:0;bottom:0;right:0;z-index:1}.ivu-menu-light{background:#fff}.ivu-menu-dark{background:#515a6e}.ivu-menu-primary{background:#8bcf70}.ivu-menu-item{display:block;outline:0;list-style:none;font-size:14px;position:relative;z-index:1;cursor:pointer;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.ivu-menu-item{color:inherit}a.ivu-menu-item:active,a.ivu-menu-item:hover{color:inherit}.ivu-menu-item>i{margin-right:6px}.ivu-menu-submenu-title span>i,.ivu-menu-submenu-title>i{margin-right:8px}.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-horizontal .ivu-menu-submenu{float:left;padding:0 20px;position:relative;cursor:pointer;z-index:3;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-menu-light.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-submenu{height:inherit;line-height:inherit;border-bottom:2px solid transparent;color:#515a6e}.ivu-menu-light.ivu-menu-horizontal .ivu-menu-item-active,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-item:hover,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-submenu-active,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-submenu:hover{color:#8bcf70;border-bottom:2px solid #8bcf70}.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu{color:rgba(255,255,255,.7)}.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item-active,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item:hover,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu-active,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu:hover{color:#fff}.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-submenu{color:#fff}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown{min-width:100%;width:auto;max-height:none}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{height:auto;line-height:normal;border-bottom:0;float:none}.ivu-menu-item-group{line-height:normal}.ivu-menu-item-group-title{height:30px;line-height:30px;padding-left:8px;font-size:12px;color:#999}.ivu-menu-item-group>ul{padding:0!important;list-style:none!important}.ivu-menu-vertical .ivu-menu-item,.ivu-menu-vertical .ivu-menu-submenu-title{padding:14px 24px;position:relative;cursor:pointer;z-index:1;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-menu-vertical .ivu-menu-item:hover,.ivu-menu-vertical .ivu-menu-submenu-title:hover{color:#8bcf70}.ivu-menu-vertical .ivu-menu-submenu-title-icon{position:absolute;top:50%;right:24px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ivu-menu-submenu-title-icon{-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.ivu-menu-horizontal .ivu-menu-opened>*>.ivu-menu-submenu-title-icon{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ivu-menu-vertical .ivu-menu-opened>*>.ivu-menu-submenu-title-icon{-webkit-transform:translateY(-50%) rotate(180deg);-ms-transform:translateY(-50%) rotate(180deg);transform:translateY(-50%) rotate(180deg)}.ivu-menu-vertical .ivu-menu-submenu-nested{padding-left:20px}.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item{padding-left:43px}.ivu-menu-vertical .ivu-menu-item-group-title{height:48px;line-height:48px;font-size:14px;padding-left:28px}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-group-title{color:rgba(255,255,255,.36)}.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu){color:#8bcf70;background:#f7fff0;z-index:2}.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):after{content:'';display:block;width:2px;position:absolute;top:0;bottom:0;right:0;background:#8bcf70}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title{color:rgba(255,255,255,.7)}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):hover,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu):hover{background:#363e4f}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item:hover,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title:hover{color:#fff;background:#515a6e}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu){color:#8bcf70}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item:hover{color:#fff;background:0 0!important}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item-active,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item-active:hover{border-right:none;color:#fff;background:#8bcf70!important}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-child-item-active>.ivu-menu-submenu-title{color:#fff}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened{background:#363e4f}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened .ivu-menu-submenu-title{background:#515a6e}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened .ivu-menu-submenu-has-parent-submenu .ivu-menu-submenu-title{background:0 0}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item:hover{background:#f3f3f3}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-focus{background:#f3f3f3}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-selected,.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-selected:hover{color:#8bcf70}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-enter{color:#8bcf70;font-weight:700;float:right}.ivu-menu-large .ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{white-space:normal}}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{padding:7px 16px 8px;font-size:14px!important}.ivu-date-picker{display:inline-block;line-height:normal}.ivu-date-picker-rel{position:relative}.ivu-date-picker .ivu-select-dropdown{width:auto;padding:0;overflow:visible;max-height:none}.ivu-date-picker-cells{width:196px;margin:10px;white-space:normal}.ivu-date-picker-cells span{display:inline-block;width:24px;height:24px}.ivu-date-picker-cells span em{display:inline-block;width:24px;height:24px;line-height:24px;margin:2px;font-style:normal;border-radius:3px;text-align:center;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-date-picker-cells-header span{line-height:24px;text-align:center;margin:2px;color:#c5c8ce}.ivu-date-picker-cells-cell:hover em{background:#e1f0fe}.ivu-date-picker-cells-focused em{-webkit-box-shadow:0 0 0 1px #8bcf70 inset;box-shadow:0 0 0 1px #8bcf70 inset}span.ivu-date-picker-cells-cell{width:28px;height:28px;cursor:pointer}.ivu-date-picker-cells-cell-next-month em,.ivu-date-picker-cells-cell-prev-month em{color:#c5c8ce}.ivu-date-picker-cells-cell-next-month:hover em,.ivu-date-picker-cells-cell-prev-month:hover em{background:0 0}span.ivu-date-picker-cells-cell-disabled,span.ivu-date-picker-cells-cell-disabled:hover,span.ivu-date-picker-cells-cell-week-label,span.ivu-date-picker-cells-cell-week-label:hover{cursor:not-allowed;color:#c5c8ce}span.ivu-date-picker-cells-cell-disabled em,span.ivu-date-picker-cells-cell-disabled:hover em,span.ivu-date-picker-cells-cell-week-label em,span.ivu-date-picker-cells-cell-week-label:hover em{color:inherit;background:inherit}span.ivu-date-picker-cells-cell-disabled,span.ivu-date-picker-cells-cell-disabled:hover{background:#f7f7f7}.ivu-date-picker-cells-cell-today em{position:relative}.ivu-date-picker-cells-cell-today em:after{content:'';display:block;width:6px;height:6px;border-radius:50%;background:#8bcf70;position:absolute;top:1px;right:1px}.ivu-date-picker-cells-cell-range{position:relative}.ivu-date-picker-cells-cell-range em{position:relative;z-index:1}.ivu-date-picker-cells-cell-range:before{content:'';display:block;background:#e1f0fe;border-radius:0;border:0;position:absolute;top:2px;bottom:2px;left:0;right:0}.ivu-date-picker-cells-cell-selected em,.ivu-date-picker-cells-cell-selected:hover em{background:#8bcf70;color:#fff}span.ivu-date-picker-cells-cell-disabled.ivu-date-picker-cells-cell-selected em{background:#c5c8ce;color:#f7f7f7}.ivu-date-picker-cells-cell-today.ivu-date-picker-cells-cell-selected em:after{background:#fff}.ivu-date-picker-cells-show-week-numbers{width:226px}.ivu-date-picker-cells-month,.ivu-date-picker-cells-year{margin-top:14px}.ivu-date-picker-cells-month span,.ivu-date-picker-cells-year span{width:40px;height:28px;line-height:28px;margin:10px 12px;border-radius:3px}.ivu-date-picker-cells-month span em,.ivu-date-picker-cells-year span em{width:40px;height:28px;line-height:28px;margin:0}.ivu-date-picker-cells-month .ivu-date-picker-cells-cell-focused,.ivu-date-picker-cells-year .ivu-date-picker-cells-cell-focused{background-color:#e8f5e2}.ivu-date-picker-header{height:32px;line-height:32px;text-align:center;border-bottom:1px solid #e8eaec}.ivu-date-picker-header-label{cursor:pointer;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-date-picker-header-label:hover{color:#8bcf70}.ivu-date-picker-btn-pulse{background-color:#e8f5e2!important;border-radius:4px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.ivu-date-picker-prev-btn{float:left}.ivu-date-picker-prev-btn-arrow-double{margin-left:10px}.ivu-date-picker-prev-btn-arrow-double i:after{content:"\F115";margin-left:-8px}.ivu-date-picker-next-btn{float:right}.ivu-date-picker-next-btn-arrow-double{margin-right:10px}.ivu-date-picker-next-btn-arrow-double i:after{content:"\F11F";margin-left:-8px}.ivu-date-picker-with-range .ivu-picker-panel-body{min-width:432px}.ivu-date-picker-with-range .ivu-picker-panel-content{float:left}.ivu-date-picker-with-range .ivu-picker-cells-show-week-numbers{min-width:492px}.ivu-date-picker-with-week-numbers .ivu-picker-panel-body-date{min-width:492px}.ivu-date-picker-transfer{z-index:1060;max-height:none;width:auto}.ivu-date-picker-focused input{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-picker-panel-icon-btn{display:inline-block;width:20px;height:24px;line-height:26px;margin-top:2px;text-align:center;cursor:pointer;color:#c5c8ce;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-picker-panel-icon-btn:hover{color:#8bcf70}.ivu-picker-panel-icon-btn i{font-size:14px}.ivu-picker-panel-body-wrapper.ivu-picker-panel-with-sidebar{padding-left:92px}.ivu-picker-panel-sidebar{width:92px;float:left;margin-left:-92px;position:absolute;top:0;bottom:0;background:#f8f8f9;border-right:1px solid #e8eaec;border-radius:4px 0 0 4px;overflow:auto}.ivu-picker-panel-shortcut{padding:6px 16px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-picker-panel-shortcut:hover{background:#e8eaec}.ivu-picker-panel-body{float:left}.ivu-picker-confirm{border-top:1px solid #e8eaec;text-align:right;padding:8px;clear:both}.ivu-picker-confirm>span{color:#8bcf70;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;float:left;padding:2px 0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-picker-confirm>span:hover{color:#57a3f3}.ivu-picker-confirm>span:active{color:#2b85e4}.ivu-picker-confirm-time{float:left}.ivu-time-picker-cells{min-width:112px}.ivu-time-picker-cells-with-seconds{min-width:168px}.ivu-time-picker-cells-list{width:56px;max-height:144px;float:left;overflow:hidden;border-left:1px solid #e8eaec;position:relative}.ivu-time-picker-cells-list:hover{overflow-y:auto}.ivu-time-picker-cells-list:first-child{border-left:none;border-radius:4px 0 0 4px}.ivu-time-picker-cells-list:last-child{border-radius:0 4px 4px 0}.ivu-time-picker-cells-list ul{width:100%;margin:0;padding:0 0 120px 0;list-style:none}.ivu-time-picker-cells-list ul li{width:100%;height:24px;line-height:24px;margin:0;padding:0 0 0 16px;-webkit-box-sizing:content-box;box-sizing:content-box;text-align:left;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;list-style:none;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-time-picker-cells-cell:hover{background:#f3f3f3}.ivu-time-picker-cells-cell-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-time-picker-cells-cell-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-time-picker-cells-cell-selected,.ivu-time-picker-cells-cell-selected:hover{color:#8bcf70;background:#f3f3f3}.ivu-time-picker-cells-cell-focused{background-color:#e8f5e2}.ivu-time-picker-header{height:32px;line-height:32px;text-align:center;border-bottom:1px solid #e8eaec}.ivu-time-picker-with-range .ivu-picker-panel-body{min-width:228px}.ivu-time-picker-with-range .ivu-picker-panel-content{float:left;position:relative}.ivu-time-picker-with-range .ivu-picker-panel-content:after{content:'';display:block;width:2px;position:absolute;top:31px;bottom:0;right:-2px;background:#e8eaec;z-index:1}.ivu-time-picker-with-range .ivu-picker-panel-content-right{float:right}.ivu-time-picker-with-range .ivu-picker-panel-content-right:after{right:auto;left:-2px}.ivu-time-picker-with-range .ivu-time-picker-cells-list:first-child{border-radius:0}.ivu-time-picker-with-range .ivu-time-picker-cells-list:last-child{border-radius:0}.ivu-time-picker-with-range.ivu-time-picker-with-seconds .ivu-picker-panel-body{min-width:340px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells{min-width:216px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-with-seconds{min-width:216px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-with-seconds .ivu-time-picker-cells-list{width:72px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-with-seconds .ivu-time-picker-cells-list ul li{padding:0 0 0 28px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list{width:108px;max-height:216px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list:first-child{border-radius:0}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list:last-child{border-radius:0}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list ul{padding:0 0 192px 0}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list ul li{padding:0 0 0 46px}.ivu-form .ivu-form-item-label-wrap{float:left}.ivu-form .ivu-form-item-label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#515a6e;line-height:1;padding:10px 12px 10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.ivu-form-label-left .ivu-form-item-label{text-align:left}.ivu-form-label-top .ivu-form-item-label{float:none;display:inline-block;padding:0 0 10px 0}.ivu-form-inline .ivu-form-item{display:inline-block;margin-right:10px;vertical-align:top}.ivu-form-item{margin-bottom:24px;vertical-align:top;zoom:1}.ivu-form-item:after,.ivu-form-item:before{content:"";display:table}.ivu-form-item:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-form-item-content{position:relative;line-height:32px;font-size:14px}.ivu-form-item .ivu-form-item{margin-bottom:0}.ivu-form-item .ivu-form-item .ivu-form-item-content{margin-left:0!important}.ivu-form-item-error-tip{position:absolute;top:100%;left:0;line-height:1;padding-top:6px;color:#ed4014}.ivu-form-item-required .ivu-form-item-label:before{content:'*';display:inline-block;margin-right:4px;line-height:1;font-family:SimSun;font-size:14px;color:#ed4014}.ivu-form-hide-required-mark .ivu-form-item-required .ivu-form-item-label:before{display:none}.ivu-carousel{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.ivu-carousel-list,.ivu-carousel-track{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ivu-carousel-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.ivu-carousel-track{position:relative;top:100%;left:0;display:block;overflow:hidden;z-index:1}.ivu-carousel-track.higher{z-index:2;top:0}.ivu-carousel-item{float:left;height:100%;min-height:1px;display:block}.ivu-carousel-arrow{border:none;outline:0;padding:0;margin:0;width:36px;height:36px;border-radius:50%;cursor:pointer;display:none;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s;transition:.2s;background-color:rgba(31,45,61,.11);color:#fff;text-align:center;font-size:1em;font-family:inherit;line-height:inherit}.ivu-carousel-arrow:hover{background-color:rgba(31,45,61,.5)}.ivu-carousel-arrow>*{vertical-align:baseline}.ivu-carousel-arrow.left{left:16px}.ivu-carousel-arrow.right{right:16px}.ivu-carousel-arrow-always{display:inherit}.ivu-carousel-arrow-hover{display:inherit;opacity:0}.ivu-carousel:hover .ivu-carousel-arrow-hover{opacity:1}.ivu-carousel-dots{z-index:10;display:none;position:relative;list-style:none;text-align:center;padding:0;width:100%;height:17px}.ivu-carousel-dots-inside{display:block;position:absolute;bottom:3px}.ivu-carousel-dots-outside{display:block;margin-top:3px}.ivu-carousel-dots li{position:relative;display:inline-block;vertical-align:top;text-align:center;margin:0 2px;padding:7px 0;cursor:pointer}.ivu-carousel-dots li button{border:0;cursor:pointer;background:#8391a5;opacity:.3;display:block;width:16px;height:3px;border-radius:1px;outline:0;font-size:0;color:transparent;-webkit-transition:all .5s;transition:all .5s}.ivu-carousel-dots li button.radius{width:6px;height:6px;border-radius:50%}.ivu-carousel-dots li:hover>button{opacity:.7}.ivu-carousel-dots li.ivu-carousel-active>button{opacity:1;width:24px}.ivu-carousel-dots li.ivu-carousel-active>button.radius{width:6px}.ivu-rate{display:inline-block;margin:0;padding:0;font-size:20px;vertical-align:middle;font-weight:400;font-style:normal}.ivu-rate-disabled .ivu-rate-star-content:before,.ivu-rate-disabled .ivu-rate-star:before{cursor:default}.ivu-rate-disabled .ivu-rate-star:hover{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.ivu-rate-star-full,.ivu-rate-star-zero{position:relative}.ivu-rate-star-first{position:absolute;left:0;top:0;width:50%;height:100%;overflow:hidden;opacity:0}.ivu-rate-star-first,.ivu-rate-star-second{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s ease;transition:all .3s ease;color:#e9e9e9;cursor:pointer}.ivu-rate-star-chart{display:inline-block;margin:0;padding:0;margin-right:8px;position:relative;font-family:Ionicons;-webkit-transition:all .3s ease;transition:all .3s ease}.ivu-rate-star-chart:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.ivu-rate-star-chart.ivu-rate-star-full .ivu-rate-star-first,.ivu-rate-star-chart.ivu-rate-star-full .ivu-rate-star-second{color:#f5a623}.ivu-rate-star-chart.ivu-rate-star-half .ivu-rate-star-first{opacity:1;color:#f5a623}.ivu-rate-star{display:inline-block;margin:0;padding:0;margin-right:8px;position:relative;font-family:Ionicons;-webkit-transition:all .3s ease;transition:all .3s ease}.ivu-rate-star:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.ivu-rate-star-content:before,.ivu-rate-star:before{color:#e9e9e9;cursor:pointer;content:"\F2BF";-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:block}.ivu-rate-star-content{position:absolute;left:0;top:0;width:50%;height:100%;overflow:hidden}.ivu-rate-star-content:before{color:transparent}.ivu-rate-star-full:before,.ivu-rate-star-half .ivu-rate-star-content:before{color:#f5a623}.ivu-rate-star-full:hover:before,.ivu-rate-star-half:hover .ivu-rate-star-content:before{color:#f7b84f}.ivu-rate-text{margin-left:8px;vertical-align:middle;display:inline-block;font-size:14px}.ivu-upload input[type=file]{display:none}.ivu-upload-list{margin-top:8px}.ivu-upload-list-file{padding:4px;color:#515a6e;border-radius:4px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out;overflow:hidden;position:relative}.ivu-upload-list-file>span{cursor:pointer;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-upload-list-file>span i{display:inline-block;width:12px;height:12px;color:#515a6e;text-align:center}.ivu-upload-list-file:hover{background:#f3f3f3}.ivu-upload-list-file:hover>span{color:#8bcf70}.ivu-upload-list-file:hover>span i{color:#515a6e}.ivu-upload-list-file:hover .ivu-upload-list-remove{opacity:1}.ivu-upload-list-remove{opacity:0;font-size:18px;cursor:pointer;float:right;margin-right:4px;color:#999;-webkit-transition:all .2s ease;transition:all .2s ease}.ivu-upload-list-remove:hover{color:#444}.ivu-upload-select{display:inline-block}.ivu-upload-drag{background:#fff;border:1px dashed #dcdee2;border-radius:4px;text-align:center;cursor:pointer;position:relative;overflow:hidden;-webkit-transition:border-color .2s ease;transition:border-color .2s ease}.ivu-upload-drag:hover{border:1px dashed #8bcf70}.ivu-upload-dragOver{border:2px dashed #8bcf70}.ivu-tree{position:relative}.ivu-tree ul{list-style:none;margin:0;padding:0;font-size:14px}.ivu-tree ul.ivu-dropdown-menu{padding:0}.ivu-tree ul li{list-style:none;margin:8px 0;padding:0;white-space:nowrap;outline:0}.ivu-tree ul li.ivu-dropdown-item{margin:0;padding:7px 16px;white-space:nowrap}.ivu-tree li ul{margin:0;padding:0 0 0 18px}.ivu-tree-title{display:inline-block;margin:0;padding:0 4px;border-radius:3px;cursor:pointer;vertical-align:top;color:#515a6e;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-tree-title:hover{background-color:#f3faf1}.ivu-tree-title-selected,.ivu-tree-title-selected:hover{background-color:#e8f5e2}.ivu-tree-arrow{cursor:pointer;width:12px;text-align:center;display:inline-block}.ivu-tree-arrow i{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;font-size:14px;vertical-align:middle}.ivu-tree-arrow-open i{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ivu-tree .ivu-checkbox-wrapper{margin-right:4px;margin-left:4px}.ivu-tree-context-menu{position:absolute}.ivu-avatar{display:inline-block;text-align:center;background:#ccc;color:#fff;white-space:nowrap;position:relative;overflow:hidden;vertical-align:middle;width:32px;height:32px;line-height:32px;border-radius:50%}.ivu-avatar-image{background:0 0}.ivu-avatar .ivu-icon{position:relative;top:-1px}.ivu-avatar.ivu-avatar-icon{font-size:18px}.ivu-avatar-large{width:40px;height:40px;line-height:40px;border-radius:50%}.ivu-avatar-large.ivu-avatar-icon{font-size:24px}.ivu-avatar-large .ivu-icon{position:relative;top:-2px}.ivu-avatar-small{width:24px;height:24px;line-height:24px;border-radius:50%}.ivu-avatar-small.ivu-avatar-icon{font-size:14px}.ivu-avatar-square{border-radius:4px}.ivu-avatar>img{width:100%;height:100%}.ivu-color-picker{display:inline-block}.ivu-color-picker-hide{display:none}.ivu-color-picker-hide-drop{visibility:hidden}.ivu-color-picker-disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-color-picker-disabled:hover{border-color:#e3e5e8}.ivu-color-picker>div:first-child:hover .ivu-input{border-color:#a2d98d}.ivu-color-picker>div:first-child.ivu-color-picker-disabled:hover .ivu-input{border-color:#e3e5e8}.ivu-color-picker .ivu-select-dropdown{padding:0}.ivu-color-picker-input.ivu-input:focus{-webkit-box-shadow:none;box-shadow:none}.ivu-color-picker-focused{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-color-picker-rel{line-height:0}.ivu-color-picker-color{width:18px;height:18px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px;position:relative;top:2px}.ivu-color-picker-color div{width:100%;height:100%;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);border-radius:2px}.ivu-color-picker-color-empty{background:#fff;overflow:hidden;text-align:center}.ivu-color-picker-color-empty i{font-size:18px;vertical-align:baseline}.ivu-color-picker-color-focused{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-color-picker-large .ivu-color-picker-color{width:20px;height:20px;top:1px}.ivu-color-picker-large .ivu-color-picker-color-empty i{font-size:20px}.ivu-color-picker-small .ivu-color-picker-color{width:14px;height:14px;top:3px}.ivu-color-picker-small .ivu-color-picker-color-empty i{font-size:14px}.ivu-color-picker-picker-wrapper{padding:8px 8px 0}.ivu-color-picker-picker-panel{width:240px;margin:0 auto;-webkit-box-sizing:initial;box-sizing:initial;position:relative}.ivu-color-picker-picker-alpha-slider,.ivu-color-picker-picker-hue-slider{height:10px;margin-top:8px;position:relative}.ivu-color-picker-picker-colors{margin-top:8px;overflow:hidden;border-radius:2px;-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-picker-colors:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-color-picker-picker-colors-wrapper{display:inline;width:20px;height:20px;float:left;position:relative}.ivu-color-picker-picker-colors-wrapper-color{outline:0;display:block;position:absolute;width:16px;height:16px;margin:2px;cursor:pointer;border-radius:2px;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.ivu-color-picker-picker-colors-wrapper-circle{width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);-ms-transform:translate(-2px,-2px);transform:translate(-2px,-2px);position:absolute;top:10px;left:10px;cursor:pointer}.ivu-color-picker-picker .ivu-picker-confirm{margin-top:8px}.ivu-color-picker-saturation-wrapper{width:100%;padding-bottom:75%;position:relative;-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-saturation-wrapper:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-color-picker-saturation,.ivu-color-picker-saturation--black,.ivu-color-picker-saturation--white{cursor:pointer;position:absolute;top:0;left:0;right:0;bottom:0}.ivu-color-picker-saturation--white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.ivu-color-picker-saturation--black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.ivu-color-picker-saturation-pointer{cursor:pointer;position:absolute}.ivu-color-picker-saturation-circle{width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);-ms-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.ivu-color-picker-hue{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-hue:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-color-picker-hue-container{cursor:pointer;margin:0 2px;position:relative;height:100%}.ivu-color-picker-hue-pointer{z-index:2;position:absolute}.ivu-color-picker-hue-picker{cursor:pointer;margin-top:1px;width:4px;border-radius:1px;height:8px;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);background:#fff;-webkit-transform:translateX(-2px);-ms-transform:translateX(-2px);transform:translateX(-2px)}.ivu-color-picker-alpha{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-alpha:focus{border-color:#a2d98d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(139,207,112,.2);box-shadow:0 0 0 2px rgba(139,207,112,.2)}.ivu-color-picker-alpha-checkboard-wrap{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border-radius:2px}.ivu-color-picker-alpha-checkerboard{position:absolute;top:0;right:0;bottom:0;left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.ivu-color-picker-alpha-gradient{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px}.ivu-color-picker-alpha-container{cursor:pointer;position:relative;z-index:2;height:100%;margin:0 3px}.ivu-color-picker-alpha-pointer{z-index:2;position:absolute}.ivu-color-picker-alpha-picker{cursor:pointer;width:4px;border-radius:1px;height:8px;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);background:#fff;margin-top:1px;-webkit-transform:translateX(-2px);-ms-transform:translateX(-2px);transform:translateX(-2px)}.ivu-color-picker-confirm{margin-top:8px;position:relative;border-top:1px solid #e8eaec;text-align:right;padding:8px;clear:both}.ivu-color-picker-confirm-color{position:absolute;top:11px;left:8px}.ivu-color-picker-confirm-color-editable{top:8px;right:110px}.ivu-auto-complete .ivu-select-not-found{display:none}.ivu-auto-complete .ivu-icon-ios-close{display:none}.ivu-auto-complete:hover .ivu-icon-ios-close{display:inline-block}.ivu-auto-complete.ivu-select-dropdown{max-height:none}.ivu-auto-complete div,.ivu-auto-complete:focus{outline:0}.ivu-divider{font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;font-size:14px;line-height:1.5;color:#515a6e;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;background:#e8eaec}.ivu-divider,.ivu-divider-vertical{margin:0 8px;display:inline-block;height:.9em;width:1px;vertical-align:middle;position:relative;top:-.06em}.ivu-divider-horizontal{display:block;height:1px;width:100%;min-width:100%;margin:24px 0;clear:both}.ivu-divider-horizontal.ivu-divider-with-text-center,.ivu-divider-horizontal.ivu-divider-with-text-left,.ivu-divider-horizontal.ivu-divider-with-text-right{display:table;white-space:nowrap;text-align:center;background:0 0;font-weight:500;color:#17233d;font-size:16px;margin:16px 0}.ivu-divider-horizontal.ivu-divider-with-text-center:after,.ivu-divider-horizontal.ivu-divider-with-text-center:before,.ivu-divider-horizontal.ivu-divider-with-text-left:after,.ivu-divider-horizontal.ivu-divider-with-text-left:before,.ivu-divider-horizontal.ivu-divider-with-text-right:after,.ivu-divider-horizontal.ivu-divider-with-text-right:before{content:'';display:table-cell;top:50%;width:50%;border-top:1px solid #e8eaec;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.ivu-divider-horizontal.ivu-divider-small.ivu-divider-with-text-center,.ivu-divider-horizontal.ivu-divider-small.ivu-divider-with-text-left,.ivu-divider-horizontal.ivu-divider-small.ivu-divider-with-text-right{font-size:14px;margin:8px 0}.ivu-divider-horizontal.ivu-divider-with-text-left .ivu-divider-inner-text,.ivu-divider-horizontal.ivu-divider-with-text-right .ivu-divider-inner-text{display:inline-block;padding:0 10px}.ivu-divider-horizontal.ivu-divider-with-text-left:before{top:50%;width:5%}.ivu-divider-horizontal.ivu-divider-with-text-left:after{top:50%;width:95%}.ivu-divider-horizontal.ivu-divider-with-text-right:before{top:50%;width:95%}.ivu-divider-horizontal.ivu-divider-with-text-right:after{top:50%;width:5%}.ivu-divider-inner-text{display:inline-block;padding:0 24px}.ivu-divider-dashed{background:0 0;border-top:1px dashed #e8eaec}.ivu-divider-horizontal.ivu-divider-with-text-left.ivu-divider-dashed,.ivu-divider-horizontal.ivu-divider-with-text-right.ivu-divider-dashed,.ivu-divider-horizontal.ivu-divider-with-text.ivu-divider-dashed{border-top:0}.ivu-divider-horizontal.ivu-divider-with-text-left.ivu-divider-dashed:after,.ivu-divider-horizontal.ivu-divider-with-text-left.ivu-divider-dashed:before,.ivu-divider-horizontal.ivu-divider-with-text-right.ivu-divider-dashed:after,.ivu-divider-horizontal.ivu-divider-with-text-right.ivu-divider-dashed:before,.ivu-divider-horizontal.ivu-divider-with-text.ivu-divider-dashed:after,.ivu-divider-horizontal.ivu-divider-with-text.ivu-divider-dashed:before{border-style:dashed none none}.ivu-divider-plain.ivu-divider-with-text,.ivu-divider-plain.ivu-divider-with-text-left,.ivu-divider-plain.ivu-divider-with-text-right{color:#515a6e;font-weight:400;font-size:14px}.ivu-anchor{position:relative;padding-left:2px}.ivu-anchor-wrapper{overflow:auto;padding-left:4px;margin-left:-4px}.ivu-anchor-ink{position:absolute;height:100%;left:0;top:0}.ivu-anchor-ink:before{content:' ';position:relative;width:2px;height:100%;display:block;background-color:#e8eaec;margin:0 auto}.ivu-anchor-ink-ball{display:inline-block;position:absolute;width:8px;height:8px;border-radius:50%;border:2px solid #8bcf70;background-color:#fff;left:50%;-webkit-transition:top .2s ease-in-out;transition:top .2s ease-in-out;-webkit-transform:translate(-50%,2px);-ms-transform:translate(-50%,2px);transform:translate(-50%,2px)}.ivu-anchor.fixed .ivu-anchor-ink .ivu-anchor-ink-ball{display:none}.ivu-anchor-link{padding:8px 0 8px 16px;line-height:1}.ivu-anchor-link-title{display:block;position:relative;-webkit-transition:all .3s;transition:all .3s;color:#515a6e;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:8px}.ivu-anchor-link-title:only-child{margin-bottom:0}.ivu-anchor-link-active>.ivu-anchor-link-title{color:#8bcf70}.ivu-anchor-link .ivu-anchor-link{padding-top:6px;padding-bottom:6px}.ivu-time-with-hash{cursor:pointer}.ivu-time-with-hash:hover{text-decoration:underline}.ivu-cell{position:relative;overflow:hidden}.ivu-cell-link,.ivu-cell-link:active,.ivu-cell-link:hover{color:inherit}.ivu-cell-icon{display:inline-block;margin-right:4px;font-size:14px;vertical-align:middle}.ivu-cell-icon:empty{display:none}.ivu-cell-main{display:inline-block;vertical-align:middle}.ivu-cell-title{line-height:24px;font-size:14px}.ivu-cell-label{line-height:1.2;font-size:12px;color:#808695}.ivu-cell-selected .ivu-cell-label{color:inherit}.ivu-cell-selected,.ivu-cell.ivu-cell-selected:hover{background:#f7fff0}.ivu-cell-footer{display:inline-block;position:absolute;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;right:16px;color:#515a6e}.ivu-cell-with-link .ivu-cell-footer{right:32px}.ivu-cell-selected .ivu-cell-footer{color:inherit}.ivu-cell-arrow{display:inline-block;position:absolute;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;right:16px;font-size:14px}.ivu-cell:focus{background:#f3f3f3;outline:0}.ivu-cell-selected:focus{background:rgba(122,182,99,.91)}.ivu-cell{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-cell:hover{background:#f3f3f3}.ivu-cell-focus{background:#f3f3f3}.ivu-cell-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-cell-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-cell-selected,.ivu-cell-selected:hover{color:#8bcf70}.ivu-cell-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-cell-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-cell-enter{color:#8bcf70;font-weight:700;float:right}.ivu-cell-large .ivu-cell{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-cell{white-space:normal}}.ivu-drawer{width:auto;height:100%;position:fixed;top:0}.ivu-drawer-inner{position:absolute}.ivu-drawer-left{left:0}.ivu-drawer-right{right:0}.ivu-drawer-bottom,.ivu-drawer-top{width:100%;height:auto;top:auto}.ivu-drawer-bottom{bottom:0}.ivu-drawer-hidden{display:none!important}.ivu-drawer-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.ivu-drawer-wrap-inner{position:absolute;overflow:hidden}.ivu-drawer-wrap-dragging{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-drawer-wrap *{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.ivu-drawer-mask{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,55,55,.6);height:100%;z-index:1000}.ivu-drawer-mask-hidden{display:none}.ivu-drawer-mask-inner{position:absolute}.ivu-drawer-content{width:100%;height:100%;position:absolute;top:0;bottom:0;background-color:#fff;border:0;background-clip:padding-box;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15)}.ivu-drawer-content-no-mask{pointer-events:auto}.ivu-drawer-header{border-bottom:1px solid #e8eaec;padding:14px 16px;line-height:1}.ivu-drawer-header p,.ivu-drawer-header-inner{display:inline-block;width:100%;height:20px;line-height:20px;font-size:16px;color:#17233d;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-drawer-close{z-index:1;font-size:12px;position:absolute;right:8px;top:8px;overflow:hidden;cursor:pointer}.ivu-drawer-close .ivu-icon-ios-close{font-size:31px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:1px}.ivu-drawer-close .ivu-icon-ios-close:hover{color:#444}.ivu-drawer-body{width:100%;height:calc(100% - 51px);padding:16px;font-size:14px;line-height:1.5;word-wrap:break-word;position:absolute;overflow:auto}.ivu-drawer-no-header .ivu-drawer-body{height:100%}.ivu-drawer-no-mask{pointer-events:none}.ivu-drawer-no-mask .ivu-drawer-drag{pointer-events:auto}.ivu-drawer-drag{top:0;height:100%;width:0;position:absolute}.ivu-drawer-drag-left{right:0}.ivu-drawer-drag-bottom,.ivu-drawer-drag-top{top:auto;width:100%;height:0}.ivu-drawer-drag-top{bottom:0}.ivu-drawer-drag-bottom{top:0}.ivu-drawer-drag-move-trigger{width:8px;height:100px;line-height:100px;position:absolute;top:50%;background:#f3f3f3;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-radius:4px;-webkit-box-shadow:0 0 1px 1px rgba(0,0,0,.2);box-shadow:0 0 1px 1px rgba(0,0,0,.2);cursor:col-resize}.ivu-drawer-drag-move-trigger-point{display:inline-block;width:50%;-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%)}.ivu-drawer-drag-move-trigger-point i{display:block;border-bottom:1px solid silver;padding-bottom:2px}.ivu-drawer-drag-bottom .ivu-drawer-drag-move-trigger,.ivu-drawer-drag-top .ivu-drawer-drag-move-trigger{width:100px;height:8px;line-height:8px;top:auto;left:50%;cursor:row-resize}.ivu-drawer-drag-bottom .ivu-drawer-drag-move-trigger-point,.ivu-drawer-drag-top .ivu-drawer-drag-move-trigger-point{width:100%;height:50%;-webkit-transform:translateY(-75%);-ms-transform:translateY(-75%);transform:translateY(-75%);text-align:center}.ivu-drawer-drag-bottom .ivu-drawer-drag-move-trigger-point i,.ivu-drawer-drag-top .ivu-drawer-drag-move-trigger-point i{display:inline-block;border-bottom:inherit;width:1px;height:100%;border-left:1px solid silver;padding-bottom:inherit;margin-left:2px}.ivu-breadcrumb{color:#999;font-size:14px}.ivu-breadcrumb a{color:#515a6e;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-breadcrumb a:hover{color:#a2d98d}.ivu-breadcrumb>span:last-child{font-weight:700;color:#515a6e}.ivu-breadcrumb>span:last-child .ivu-breadcrumb-item-separator{display:none}.ivu-breadcrumb-item-separator{margin:0 8px;color:#dcdee2}.ivu-breadcrumb-item-link>.ivu-icon+span{margin-left:4px}.ivu-list{position:relative}.ivu-list-items{margin:0;padding:0;list-style:none}.ivu-list-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:12px 0}.ivu-list-item-content{color:#515a6e}.ivu-list-item-meta{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;font-size:0}.ivu-list-item-meta-avatar{margin-right:16px}.ivu-list-item-meta-content{-webkit-box-flex:1;-ms-flex:1 0;flex:1 0}.ivu-list-item-meta-title{font-weight:500;margin-bottom:4px;color:#515a6e;font-size:14px;line-height:22px}.ivu-list-item-meta-title>a{color:#515a6e;-webkit-transition:all .2s;transition:all .2s}.ivu-list-item-meta-title>a:hover{color:#8bcf70}.ivu-list-item-meta-description{color:rgba(0,0,0,.45);font-size:14px;line-height:22px}.ivu-list-item-action{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin-left:48px;padding:0;font-size:0;list-style:none}.ivu-list-item-action>li{position:relative;display:inline-block;padding:0 8px;color:rgba(0,0,0,.45);font-size:14px;line-height:22px;text-align:center;cursor:pointer}.ivu-list-item-action>li:after{content:'';position:absolute;top:50%;right:0;width:1px;height:14px;margin-top:-7px;background-color:#e8eaec}.ivu-list-item-action>li:first-child{padding-left:0}.ivu-list-item-action>li:last-child:after{display:none}.ivu-list-header{background:0 0}.ivu-list-footer{background:0 0}.ivu-list-footer,.ivu-list-header{padding-top:12px;padding-bottom:12px}.ivu-list-split .ivu-list-item{border-bottom:1px solid #e8eaec}.ivu-list-split .ivu-list-item:last-child{border-bottom:none}.ivu-list-split .ivu-list-header{border-bottom:1px solid #e8eaec}.ivu-list-split .ivu-list-footer{border-top:1px solid #e8eaec}.ivu-list-large .ivu-list-item{padding-top:16px;padding-bottom:16px}.ivu-list-small .ivu-list-item{padding-top:8px;padding-bottom:8px}.ivu-list-vertical .ivu-list-item{-webkit-box-align:initial;-ms-flex-align:initial;align-items:initial}.ivu-list-vertical .ivu-list-item-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1}.ivu-list-vertical .ivu-list-item-extra{margin-left:40px}.ivu-list-vertical .ivu-list-item-meta{margin-bottom:16px}.ivu-list-vertical .ivu-list-item-meta-title{margin-bottom:12px;color:rgba(0,0,0,.85);font-size:16px;line-height:24px}.ivu-list-vertical .ivu-list-item-action{margin-top:16px;margin-left:auto}.ivu-list-vertical .ivu-list-item-action>li{padding:0 16px}.ivu-list-vertical .ivu-list-item-action>li:first-child{padding-left:0}.ivu-list-item-no-flex{display:block}.ivu-list:not(.ivu-list-vertical) .ivu-list-item-no-flex .ivu-list-item-action{float:right}.ivu-list-bordered{border:1px solid #dcdee2;border-radius:6px}.ivu-list-bordered .ivu-list-header{padding-right:24px;padding-left:24px}.ivu-list-bordered .ivu-list-footer{padding-right:24px;padding-left:24px}.ivu-list-bordered .ivu-list-item{padding-right:24px;padding-left:24px;border-bottom:1px solid #e8eaec}.ivu-list-bordered .ivu-list-pagination{margin:16px 24px}.ivu-list-bordered.ivu-list-small .ivu-list-item{padding-right:16px;padding-left:16px}.ivu-list-bordered.ivu-list-small .ivu-list-footer,.ivu-list-bordered.ivu-list-small .ivu-list-header{padding:8px 16px}.ivu-list-bordered.ivu-list-large .ivu-list-footer,.ivu-list-bordered.ivu-list-large .ivu-list-header{padding:16px 24px}@media screen and (max-width:768px){.ivu-list-item-action{margin-left:24px}.ivu-list-vertical .ivu-list-item-extra{margin-left:24px}}@media screen and (max-width:576px){.ivu-list-item{-ms-flex-wrap:wrap;flex-wrap:wrap}.ivu-list-item-action{margin-left:12px}.ivu-list-vertical .ivu-list-item{-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse}.ivu-list-vertical .ivu-list-item-main{min-width:220px}.ivu-list-vertical .ivu-list-item-extra{margin:auto auto 16px}} diff --git a/public/images/browser/360.png b/public/images/browser/360.png new file mode 100755 index 000000000..2aae7b8f0 Binary files /dev/null and b/public/images/browser/360.png differ diff --git a/public/images/browser/chrome.png b/public/images/browser/chrome.png new file mode 100755 index 000000000..23bb5d731 Binary files /dev/null and b/public/images/browser/chrome.png differ diff --git a/public/images/browser/firefox.png b/public/images/browser/firefox.png new file mode 100755 index 000000000..56790ccfc Binary files /dev/null and b/public/images/browser/firefox.png differ diff --git a/public/images/browser/ie.png b/public/images/browser/ie.png new file mode 100755 index 000000000..d5335b389 Binary files /dev/null and b/public/images/browser/ie.png differ diff --git a/public/images/browser/safari.png b/public/images/browser/safari.png new file mode 100755 index 000000000..c26c33d94 Binary files /dev/null and b/public/images/browser/safari.png differ diff --git a/public/images/ext/ai.png b/public/images/ext/ai.png new file mode 100644 index 000000000..773a06a05 Binary files /dev/null and b/public/images/ext/ai.png differ diff --git a/public/images/ext/avi.png b/public/images/ext/avi.png new file mode 100644 index 000000000..68f7f8c71 Binary files /dev/null and b/public/images/ext/avi.png differ diff --git a/public/images/ext/bmp.png b/public/images/ext/bmp.png new file mode 100644 index 000000000..5d5530a08 Binary files /dev/null and b/public/images/ext/bmp.png differ diff --git a/public/images/ext/cdr.png b/public/images/ext/cdr.png new file mode 100644 index 000000000..36aefc961 Binary files /dev/null and b/public/images/ext/cdr.png differ diff --git a/public/images/ext/doc.png b/public/images/ext/doc.png new file mode 100644 index 000000000..e0b9a21e8 Binary files /dev/null and b/public/images/ext/doc.png differ diff --git a/public/images/ext/document.png b/public/images/ext/document.png new file mode 100644 index 000000000..edd94f9a2 Binary files /dev/null and b/public/images/ext/document.png differ diff --git a/public/images/ext/eps.png b/public/images/ext/eps.png new file mode 100644 index 000000000..a3f918493 Binary files /dev/null and b/public/images/ext/eps.png differ diff --git a/public/images/ext/exe.png b/public/images/ext/exe.png new file mode 100644 index 000000000..68b8b4008 Binary files /dev/null and b/public/images/ext/exe.png differ diff --git a/public/images/ext/file.png b/public/images/ext/file.png new file mode 100644 index 000000000..51c16dbda Binary files /dev/null and b/public/images/ext/file.png differ diff --git a/public/images/ext/flow.png b/public/images/ext/flow.png new file mode 100644 index 000000000..87ae04904 Binary files /dev/null and b/public/images/ext/flow.png differ diff --git a/public/images/ext/folder.png b/public/images/ext/folder.png new file mode 100644 index 000000000..39de4a98d Binary files /dev/null and b/public/images/ext/folder.png differ diff --git a/public/images/ext/gif.png b/public/images/ext/gif.png new file mode 100644 index 000000000..64c89cce1 Binary files /dev/null and b/public/images/ext/gif.png differ diff --git a/public/images/ext/html.png b/public/images/ext/html.png new file mode 100644 index 000000000..d6709db7b Binary files /dev/null and b/public/images/ext/html.png differ diff --git a/public/images/ext/mind.png b/public/images/ext/mind.png new file mode 100644 index 000000000..a97e2fdf8 Binary files /dev/null and b/public/images/ext/mind.png differ diff --git a/public/images/ext/mov.png b/public/images/ext/mov.png new file mode 100644 index 000000000..3aec5778d Binary files /dev/null and b/public/images/ext/mov.png differ diff --git a/public/images/ext/mp3.png b/public/images/ext/mp3.png new file mode 100644 index 000000000..fe8779eec Binary files /dev/null and b/public/images/ext/mp3.png differ diff --git a/public/images/ext/mp4.png b/public/images/ext/mp4.png new file mode 100644 index 000000000..8643af661 Binary files /dev/null and b/public/images/ext/mp4.png differ diff --git a/public/images/ext/pdf.png b/public/images/ext/pdf.png new file mode 100644 index 000000000..19288492a Binary files /dev/null and b/public/images/ext/pdf.png differ diff --git a/public/images/ext/ppt.png b/public/images/ext/ppt.png new file mode 100644 index 000000000..4cd59dea2 Binary files /dev/null and b/public/images/ext/ppt.png differ diff --git a/public/images/ext/pr.png b/public/images/ext/pr.png new file mode 100644 index 000000000..cb78fe352 Binary files /dev/null and b/public/images/ext/pr.png differ diff --git a/public/images/ext/psd.png b/public/images/ext/psd.png new file mode 100644 index 000000000..ba6bbdbfa Binary files /dev/null and b/public/images/ext/psd.png differ diff --git a/public/images/ext/rar.png b/public/images/ext/rar.png new file mode 100644 index 000000000..a325a93e6 Binary files /dev/null and b/public/images/ext/rar.png differ diff --git a/public/images/ext/sheet.png b/public/images/ext/sheet.png new file mode 100644 index 000000000..0b9685364 Binary files /dev/null and b/public/images/ext/sheet.png differ diff --git a/public/images/ext/svg.png b/public/images/ext/svg.png new file mode 100644 index 000000000..8ccc74409 Binary files /dev/null and b/public/images/ext/svg.png differ diff --git a/public/images/ext/tif.png b/public/images/ext/tif.png new file mode 100644 index 000000000..7d743d5f6 Binary files /dev/null and b/public/images/ext/tif.png differ diff --git a/public/images/ext/txt.png b/public/images/ext/txt.png new file mode 100644 index 000000000..7490f9ce9 Binary files /dev/null and b/public/images/ext/txt.png differ diff --git a/public/images/ext/xls.png b/public/images/ext/xls.png new file mode 100644 index 000000000..33d5b3be7 Binary files /dev/null and b/public/images/ext/xls.png differ diff --git a/public/images/ext/zip.png b/public/images/ext/zip.png new file mode 100644 index 000000000..1edba9b0f Binary files /dev/null and b/public/images/ext/zip.png differ diff --git a/public/images/file/document.svg b/public/images/file/document.svg new file mode 100644 index 000000000..2dac4e83e --- /dev/null +++ b/public/images/file/document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/file/flow.svg b/public/images/file/flow.svg new file mode 100644 index 000000000..f32e101de --- /dev/null +++ b/public/images/file/flow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/file/folder.svg b/public/images/file/folder.svg new file mode 100644 index 000000000..60788d5b4 --- /dev/null +++ b/public/images/file/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/file/mind.svg b/public/images/file/mind.svg new file mode 100644 index 000000000..a6636648b --- /dev/null +++ b/public/images/file/mind.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/file/sheet.svg b/public/images/file/sheet.svg new file mode 100644 index 000000000..77ced9bdb --- /dev/null +++ b/public/images/file/sheet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/logo-app.icns b/public/images/logo-app.icns new file mode 100644 index 000000000..c34d20448 Binary files /dev/null and b/public/images/logo-app.icns differ diff --git a/public/images/logo-app.png b/public/images/logo-app.png new file mode 100644 index 000000000..ec53c95c8 Binary files /dev/null and b/public/images/logo-app.png differ diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 000000000..c83aa4312 Binary files /dev/null and b/public/images/logo.png differ diff --git a/public/images/logo.svg b/public/images/logo.svg new file mode 100644 index 000000000..b0bf31718 --- /dev/null +++ b/public/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/other/avatar.png b/public/images/other/avatar.png new file mode 100644 index 000000000..c83aa4312 Binary files /dev/null and b/public/images/other/avatar.png differ diff --git a/public/images/other/dir.png b/public/images/other/dir.png new file mode 100755 index 000000000..c1f165285 Binary files /dev/null and b/public/images/other/dir.png differ diff --git a/public/images/other/imgerr.jpg b/public/images/other/imgerr.jpg new file mode 100755 index 000000000..7f8f4eef3 Binary files /dev/null and b/public/images/other/imgerr.jpg differ diff --git a/public/js/app.js b/public/js/app.js new file mode 100644 index 000000000..853ce6970 --- /dev/null +++ b/public/js/app.js @@ -0,0 +1,2 @@ +/*! For license information please see app.js.LICENSE.txt */ +(()=>{var e,t,n,i,r,a={12631:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>C});var i=n(88239),r=n(72444),a=/%[sdj%]/g;function s(){for(var e=arguments.length,t=Array(e),n=0;n=s)return e;switch(e){case"%s":return String(t[i++]);case"%d":return Number(t[i++]);case"%j":try{return JSON.stringify(t[i++])}catch(e){return"[Circular]"}break;default:return e}})),l=t[i];i()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,url:new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$","i"),hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},m={integer:function(e){return m.number(e)&&parseInt(e,10)===e},float:function(e){return m.number(e)&&!m.integer(e)},array:function(e){return Array.isArray(e)},regexp:function(e){if(e instanceof RegExp)return!0;try{return!!new RegExp(e)}catch(e){return!1}},date:function(e){return"function"==typeof e.getTime&&"function"==typeof e.getMonth&&"function"==typeof e.getYear},number:function(e){return!isNaN(e)&&"number"==typeof e},object:function(e){return"object"===(void 0===e?"undefined":(0,r.Z)(e))&&!m.array(e)},method:function(e){return"function"==typeof e},email:function(e){return"string"==typeof e&&!!e.match(p.email)&&e.length<255},url:function(e){return"string"==typeof e&&!!e.match(p.url)},hex:function(e){return"string"==typeof e&&!!e.match(p.hex)}};const v=function(e,t,n,i,a){if(e.required&&void 0===t)h(e,t,n,i,a);else{var o=e.type;["integer","float","array","regexp","object","method","email","number","date","url","hex"].indexOf(o)>-1?m[o](t)||i.push(s(a.messages.types[o],e.fullField,e.type)):o&&(void 0===t?"undefined":(0,r.Z)(t))!==e.type&&i.push(s(a.messages.types[o],e.fullField,e.type))}};const g={required:h,whitespace:f,type:v,range:function(e,t,n,i,r){var a="number"==typeof e.len,o="number"==typeof e.min,l="number"==typeof e.max,u=t,c=null,d="number"==typeof t,h="string"==typeof t,f=Array.isArray(t);if(d?c="number":h?c="string":f&&(c="array"),!c)return!1;f&&(u=t.length),h&&(u=t.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").length),a?u!==e.len&&i.push(s(r.messages[c].len,e.fullField,e.len)):o&&!l&&ue.max?i.push(s(r.messages[c].max,e.fullField,e.max)):o&&l&&(ue.max)&&i.push(s(r.messages[c].range,e.fullField,e.min,e.max))},enum:function(e,t,n,i,r){e.enum=Array.isArray(e.enum)?e.enum:[],-1===e.enum.indexOf(t)&&i.push(s(r.messages.enum,e.fullField,e.enum.join(", ")))},pattern:function(e,t,n,i,r){if(e.pattern)if(e.pattern instanceof RegExp)e.pattern.lastIndex=0,e.pattern.test(t)||i.push(s(r.messages.pattern.mismatch,e.fullField,t,e.pattern));else if("string"==typeof e.pattern){new RegExp(e.pattern).test(t)||i.push(s(r.messages.pattern.mismatch,e.fullField,t,e.pattern))}}};const b=function(e,t,n,i,r){var a=e.type,s=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t,a)&&!e.required)return n();g.required(e,t,i,s,r,a),o(t,a)||g.type(e,t,i,s,r)}n(s)},y={string:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t,"string")&&!e.required)return n();g.required(e,t,i,a,r,"string"),o(t,"string")||(g.type(e,t,i,a,r),g.range(e,t,i,a,r),g.pattern(e,t,i,a,r),!0===e.whitespace&&g.whitespace(e,t,i,a,r))}n(a)},method:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),void 0!==t&&g.type(e,t,i,a,r)}n(a)},number:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),void 0!==t&&(g.type(e,t,i,a,r),g.range(e,t,i,a,r))}n(a)},boolean:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),void 0!==t&&g.type(e,t,i,a,r)}n(a)},regexp:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),o(t)||g.type(e,t,i,a,r)}n(a)},integer:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),void 0!==t&&(g.type(e,t,i,a,r),g.range(e,t,i,a,r))}n(a)},float:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),void 0!==t&&(g.type(e,t,i,a,r),g.range(e,t,i,a,r))}n(a)},array:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t,"array")&&!e.required)return n();g.required(e,t,i,a,r,"array"),o(t,"array")||(g.type(e,t,i,a,r),g.range(e,t,i,a,r))}n(a)},object:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),void 0!==t&&g.type(e,t,i,a,r)}n(a)},enum:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();g.required(e,t,i,a,r),t&&g.enum(e,t,i,a,r)}n(a)},pattern:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t,"string")&&!e.required)return n();g.required(e,t,i,a,r),o(t,"string")||g.pattern(e,t,i,a,r)}n(a)},date:function(e,t,n,i,r){var a=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(o(t)&&!e.required)return n();if(g.required(e,t,i,a,r),!o(t)){var s=void 0;s="number"==typeof t?new Date(t):t,g.type(e,s,i,a,r),s&&g.range(e,s.getTime(),i,a,r)}}n(a)},url:b,hex:b,email:b,required:function(e,t,n,i,a){var s=[],o=Array.isArray(t)?"array":void 0===t?"undefined":(0,r.Z)(t);g.required(e,t,i,s,a,o),n(s)}};function _(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var e=JSON.parse(JSON.stringify(this));return e.clone=this.clone,e}}}var w=_();function x(e){this.rules=null,this._messages=w,this.define(e)}x.prototype={messages:function(e){return e&&(this._messages=d(_(),e)),this._messages},define:function(e){if(!e)throw new Error("Cannot configure a schema with no rules");if("object"!==(void 0===e?"undefined":(0,r.Z)(e))||Array.isArray(e))throw new Error("Rules must be an object");this.rules={};var t=void 0,n=void 0;for(t in e)e.hasOwnProperty(t)&&(n=e[t],this.rules[t]=Array.isArray(n)?n:[n])},validate:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments[2],o=e,l=n,h=a;if("function"==typeof l&&(h=l,l={}),this.rules&&0!==Object.keys(this.rules).length){if(l.messages){var f=this.messages();f===w&&(f=_()),d(f,l.messages),l.messages=f}else l.messages=this.messages();var p=void 0,m=void 0,v={},g=l.keys||Object.keys(this.rules);g.forEach((function(n){p=t.rules[n],m=o[n],p.forEach((function(r){var a=r;"function"==typeof a.transform&&(o===e&&(o=(0,i.Z)({},o)),m=o[n]=a.transform(m)),(a="function"==typeof a?{validator:a}:(0,i.Z)({},a)).validator=t.getValidationMethod(a),a.field=n,a.fullField=a.fullField||n,a.type=t.getType(a),a.validator&&(v[n]=v[n]||[],v[n].push({rule:a,value:m,source:o,field:n}))}))}));var b={};u(v,l,(function(e,t){var n=e.rule,a=!("object"!==n.type&&"array"!==n.type||"object"!==(0,r.Z)(n.fields)&&"object"!==(0,r.Z)(n.defaultField));function o(e,t){return(0,i.Z)({},t,{fullField:n.fullField+"."+e})}function u(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],u=r;if(Array.isArray(u)||(u=[u]),u.length,u.length&&n.message&&(u=[].concat(n.message)),u=u.map(c(n)),l.first&&u.length)return b[n.field]=1,t(u);if(a){if(n.required&&!e.value)return u=n.message?[].concat(n.message).map(c(n)):l.error?[l.error(n,s(l.messages.required,n.field))]:[],t(u);var d={};if(n.defaultField)for(var h in e.value)e.value.hasOwnProperty(h)&&(d[h]=n.defaultField);for(var f in d=(0,i.Z)({},d,e.rule.fields))if(d.hasOwnProperty(f)){var p=Array.isArray(d[f])?d[f]:[d[f]];d[f]=p.map(o.bind(null,f))}var m=new x(d);m.messages(l.messages),e.rule.options&&(e.rule.options.messages=l.messages,e.rule.options.error=l.error),m.validate(e.value,e.rule.options||l,(function(e){t(e&&e.length?u.concat(e):e)}))}else t(u)}a=a&&(n.required||!n.required&&e.value),n.field=e.field;var d=n.validator(n,e.value,u,e.source,l);d&&d.then&&d.then((function(){return u()}),(function(e){return u(e)}))}),(function(e){y(e)}))}else h&&h();function y(e){var t,n=void 0,i=void 0,r=[],a={};for(n=0;n{var t=/^(attrs|props|on|nativeOn|class|style|hook)$/;function n(e,t){return function(){e&&e.apply(this,arguments),t&&t.apply(this,arguments)}}e.exports=function(e){return e.reduce((function(e,i){var r,a,s,o,l;for(s in i)if(r=e[s],a=i[s],r&&t.test(s))if("class"===s&&("string"==typeof r&&(l=r,e[s]=r={},r[l]=!0),"string"==typeof a&&(l=a,i[s]=a={},a[l]=!0)),"on"===s||"nativeOn"===s||"hook"===s)for(o in a)r[o]=n(r[o],a[o]);else if(Array.isArray(r))e[s]=r.concat(a);else if(Array.isArray(a))e[s]=[r].concat(a);else for(o in a)r[o]=a[o];else e[s]=i[s];return e}),{})}},76809:(e,t,n)=>{"use strict";var i=n(70538),r=n(20629);const a={name:"Spinner"};var s=n(51900);const o={components:{Spinner:(0,s.Z)(a,(function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"common-spinner",attrs:{id:"common-spinner"}},[t("Loading",{staticClass:"common-circular"})],1)}),[],!1,null,null,null).exports},data:function(){return{transitionName:null}},mounted:function(){var e=this,t=window.location.hash;0===t.indexOf("#")&&(t=t.substr(1))&&this.$nextTick((function(){t=$A.removeURLParameter(t,"token"),e.goForward({path:t})})),this.sessionStorage("/",1);var n=window.location.pathname;n&&0===this.sessionStorage(n)&&this.sessionStorage(n,this.sessionStorage("::count")+1),setInterval(this.searchEnter,1e3)},watch:{$route:function(e,t){null!==this.transitionName?void 0!==e.name&&void 0!==t.name&&this.slideType(e,t):this.transitionName="app-slide-no"}},methods:{slideType:function(e,t){var n=this.$router.isBack;this.$router.isBack=!1;var i=this.sessionStorage(e.path),r=this.sessionStorage(t.path);i&&i=0&&(t=e.slice(i),e=e.slice(0,i));var r=e.indexOf("?");return r>=0&&(n=e.slice(r+1),e=e.slice(0,r)),{path:e,query:n,hash:t}}(r.path||""),u=t&&t.path||"/",c=l.path?j(l.path,u,n||r.append):u,d=function(e,t,n){void 0===t&&(t={});var i,r=n||w;try{i=r(e||"")}catch(e){i={}}for(var a in t){var s=t[a];i[a]=Array.isArray(s)?s.map(_):_(s)}return i}(l.query,r.query,i&&i.options.parseQuery),h=r.hash||l.hash;return h&&"#"!==h.charAt(0)&&(h="#"+h),{_normalized:!0,path:c,query:d,hash:h}}var te,ne=function(){},ie={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,i=this.$route,r=n.resolve(this.to,i,this.append),a=r.location,s=r.route,o=r.href,l={},u=n.options.linkActiveClass,c=n.options.linkExactActiveClass,d=null==u?"router-link-active":u,h=null==c?"router-link-exact-active":c,f=null==this.activeClass?d:this.activeClass,m=null==this.exactActiveClass?h:this.exactActiveClass,v=s.redirectedFrom?k(null,ee(s.redirectedFrom),null,n):s;l[m]=T(i,v,this.exactPath),l[f]=this.exact||this.exactPath?l[m]:function(e,t){return 0===e.path.replace(C,"/").indexOf(t.path.replace(C,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(i,v);var g=l[m]?this.ariaCurrentValue:null,b=function(e){re(e)&&(t.replace?n.replace(a,ne):n.push(a,ne))},y={click:re};Array.isArray(this.event)?this.event.forEach((function(e){y[e]=b})):y[this.event]=b;var _={class:l},w=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:o,route:s,navigate:b,isActive:l[f],isExactActive:l[m]});if(w){if(1===w.length)return w[0];if(w.length>1||!w.length)return 0===w.length?e():e("span",{},w)}if("a"===this.tag)_.on=y,_.attrs={href:o,"aria-current":g};else{var x=ae(this.$slots.default);if(x){x.isStatic=!1;var S=x.data=p({},x.data);for(var O in S.on=S.on||{},S.on){var $=S.on[O];O in y&&(S.on[O]=Array.isArray($)?$:[$])}for(var D in y)D in S.on?S.on[D].push(y[D]):S.on[D]=b;var M=x.data.attrs=p({},x.data.attrs);M.href=o,M["aria-current"]=g}else _.on=y}return e(this.tag,_,this.$slots.default)}};function re(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){var t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function ae(e){if(e)for(var t,n=0;n-1&&(o.params[h]=n.params[h]);return o.path=Q(c.path,o.params),l(c,o,s)}if(o.path){o.params={};for(var f=0;f=e.length?n():e[r]?t(e[r],(function(){i(r+1)})):i(r+1)};i(0)}var Ee={redirected:2,aborted:4,cancelled:8,duplicated:16};function Ie(e,t){return Ne(e,t,Ee.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return Ae.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function je(e,t){return Ne(e,t,Ee.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function Ne(e,t,n,i){var r=new Error(i);return r._isRouter=!0,r.from=e,r.to=t,r.type=n,r}var Ae=["params","query","hash"];function Fe(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Le(e,t){return Fe(e)&&e._isRouter&&(null==t||e.type===t)}function Ve(e){return function(t,n,i){var r=!1,a=0,s=null;Re(e,(function(e,t,n,o){if("function"==typeof e&&void 0===e.cid){r=!0,a++;var l,u=We((function(t){var r;((r=t).__esModule||ze&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:te.extend(t),n.components[o]=t,--a<=0&&i()})),c=We((function(e){var t="Failed to resolve async component "+o+": "+e;s||(s=Fe(e)?e:new Error(t),i(s))}));try{l=e(u,c)}catch(e){c(e)}if(l)if("function"==typeof l.then)l.then(u,c);else{var d=l.component;d&&"function"==typeof d.then&&d.then(u,c)}}})),r||i()}}function Re(e,t){return Be(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Be(e){return Array.prototype.concat.apply([],e)}var ze="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function We(e){var t=!1;return function(){for(var n=[],i=arguments.length;i--;)n[i]=arguments[i];if(!t)return t=!0,e.apply(this,n)}}var He=function(e,t){this.router=e,this.base=function(e){if(!e)if(se){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=O,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function qe(e,t,n,i){var r=Re(e,(function(e,i,r,a){var s=function(e,t){"function"!=typeof e&&(e=te.extend(e));return e.options[t]}(e,t);if(s)return Array.isArray(s)?s.map((function(e){return n(e,i,r,a)})):n(s,i,r,a)}));return Be(i?r.reverse():r)}function Ke(e,t){if(t)return function(){return e.apply(t,arguments)}}He.prototype.listen=function(e){this.cb=e},He.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},He.prototype.onError=function(e){this.errorCbs.push(e)},He.prototype.transitionTo=function(e,t,n){var i,r=this;try{i=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var a=this.current;this.confirmTransition(i,(function(){r.updateRoute(i),t&&t(i),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(i,a)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(i)})))}),(function(e){n&&n(e),e&&!r.ready&&(Le(e,Ee.redirected)&&a===O||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},He.prototype.confirmTransition=function(e,t,n){var i=this,r=this.current;this.pending=e;var a,s,o=function(e){!Le(e)&&Fe(e)&&(i.errorCbs.length?i.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},l=e.matched.length-1,u=r.matched.length-1;if(T(e,r)&&l===u&&e.matched[l]===r.matched[u])return this.ensureURL(),o(((s=Ne(a=r,e,Ee.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",s));var c=function(e,t){var n,i=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,i=De&&n;i&&this.listeners.push(be());var r=function(){var n=e.current,r=Ye(e.base);e.current===O&&r===e._startLocation||e.transitionTo(r,(function(e){i&&ye(t,e,n,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var i=this,r=this.current;this.transitionTo(e,(function(e){Te(N(i.base+e.fullPath)),ye(i.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var i=this,r=this.current;this.transitionTo(e,(function(e){Me(N(i.base+e.fullPath)),ye(i.router,e,r,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ye(this.base)!==this.current.fullPath){var t=N(this.base+this.current.fullPath);e?Te(t):Me(t)}},t.prototype.getCurrentLocation=function(){return Ye(this.base)},t}(He);function Ye(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ge=function(e){function t(t,n,i){e.call(this,t,n),i&&function(e){var t=Ye(e);if(!/^\/#/.test(t))return window.location.replace(N(e+"/#"+t)),!0}(this.base)||Xe()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=De&&t;n&&this.listeners.push(be());var i=function(){var t=e.current;Xe()&&e.transitionTo(Je(),(function(i){n&&ye(e.router,i,t,!0),De||et(i.fullPath)}))},r=De?"popstate":"hashchange";window.addEventListener(r,i),this.listeners.push((function(){window.removeEventListener(r,i)}))}},t.prototype.push=function(e,t,n){var i=this,r=this.current;this.transitionTo(e,(function(e){Qe(e.fullPath),ye(i.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var i=this,r=this.current;this.transitionTo(e,(function(e){et(e.fullPath),ye(i.router,e,r,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Je()!==t&&(e?Qe(t):et(t))},t.prototype.getCurrentLocation=function(){return Je()},t}(He);function Xe(){var e=Je();return"/"===e.charAt(0)||(et("/"+e),!1)}function Je(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ze(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Qe(e){De?Te(Ze(e)):window.location.hash=e}function et(e){De?Me(Ze(e)):window.location.replace(Ze(e))}var tt=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var i=this;this.transitionTo(e,(function(e){i.stack=i.stack.slice(0,i.index+1).concat(e),i.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var i=this;this.transitionTo(e,(function(e){i.stack=i.stack.slice(0,i.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var i=this.stack[n];this.confirmTransition(i,(function(){var e=t.current;t.index=n,t.updateRoute(i),t.router.afterHooks.forEach((function(t){t&&t(i,e)}))}),(function(e){Le(e,Ee.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(He),nt=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=ce(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!De&&!1!==e.fallback,this.fallback&&(t="hash"),se||(t="abstract"),this.mode=t,t){case"history":this.history=new Ue(this,e.base);break;case"hash":this.history=new Ge(this,e.base,this.fallback);break;case"abstract":this.history=new tt(this,e.base);break;default:0}},it={currentRoute:{configurable:!0}};function rt(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}nt.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},it.currentRoute.get=function(){return this.history&&this.history.current},nt.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Ue||n instanceof Ge){var i=function(e){n.setupListeners(),function(e){var i=n.current,r=t.options.scrollBehavior;De&&r&&"fullPath"in e&&ye(t,e,i,!1)}(e)};n.transitionTo(n.getCurrentLocation(),i,i)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},nt.prototype.beforeEach=function(e){return rt(this.beforeHooks,e)},nt.prototype.beforeResolve=function(e){return rt(this.resolveHooks,e)},nt.prototype.afterEach=function(e){return rt(this.afterHooks,e)},nt.prototype.onReady=function(e,t){this.history.onReady(e,t)},nt.prototype.onError=function(e){this.history.onError(e)},nt.prototype.push=function(e,t,n){var i=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){i.history.push(e,t,n)}));this.history.push(e,t,n)},nt.prototype.replace=function(e,t,n){var i=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){i.history.replace(e,t,n)}));this.history.replace(e,t,n)},nt.prototype.go=function(e){this.history.go(e)},nt.prototype.back=function(){this.go(-1)},nt.prototype.forward=function(){this.go(1)},nt.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},nt.prototype.resolve=function(e,t,n){var i=ee(e,t=t||this.history.current,n,this),r=this.match(i,t),a=r.redirectedFrom||r.fullPath;return{location:i,route:r,href:function(e,t,n){var i="hash"===n?"#"+t:t;return e?N(e+"/"+i):i}(this.history.base,a,this.mode),normalizedTo:i,resolved:r}},nt.prototype.getRoutes=function(){return this.matcher.getRoutes()},nt.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==O&&this.history.transitionTo(this.history.getCurrentLocation())},nt.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==O&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(nt.prototype,it),nt.install=function e(t){if(!e.installed||te!==t){e.installed=!0,te=t;var n=function(e){return void 0!==e},i=function(e,t){var i=e.$options._parentVnode;n(i)&&n(i=i.data)&&n(i=i.registerRouteInstance)&&i(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,i(this,this)},destroyed:function(){i(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",E),t.component("RouterLink",ie);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},nt.version="3.5.1",nt.isNavigationFailure=Le,nt.NavigationFailureType=Ee,nt.START_LOCATION=O,se&&window.Vue&&window.Vue.use(nt);const at=nt;var st=n(40158),ot=n.n(st);function lt(e){return function(e){if(Array.isArray(e))return ut(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ut(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ut(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ut(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n=t)return e;for(var i="",r=0;r1&&void 0!==arguments[1]?arguments[1]:null,n=this.storage(e);return n||t},getStorageString:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=this.storage(e);return"string"==typeof n||"number"==typeof n?n:t},getStorageInt:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.storage(e);return"number"==typeof n?n:t},getStorageBoolean:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.storage(e);return"boolean"==typeof n?n:t},getStorageArray:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=this.storage(e);return this.isArray(n)?n:t},getStorageJson:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.storage(e);return this.isJson(n)?n:t},isArray:function(e){return"object"==mt(e)&&"[object array]"==Object.prototype.toString.call(e).toLowerCase()&&"number"==typeof e.length},isJson:function(e){return"object"==mt(e)&&"[object object]"==Object.prototype.toString.call(e).toLowerCase()&&void 0===e.length},inArray:function(e,t){return!!this.isArray(t)&&t.includes(e)},storage:function(e,t){if(e){var n="__state__";if("cache"===e.substring(0,5)&&(n="__state:"+e+"__"),void 0===t)return this.loadFromlLocal(e,"",n);this.savaToLocal(e,t,n)}},savaToLocal:function(e,t,n){try{void 0===n&&(n="__seller__");var i=window.localStorage[n];(i=i?JSON.parse(i):{})[e]=t,window.localStorage[n]=JSON.stringify(i)}catch(e){}},loadFromlLocal:function(e,t,n){try{void 0===n&&(n="__seller__");var i=window.localStorage[n];return i&&((i=JSON.parse(i))&&void 0!==i[e])?i[e]:t}catch(e){return t}},clearLocal:function(){try{window.localStorage.clear()}catch(e){}},runNum:function(e,t){var n=Number(e);if((n+""=="NaN"&&(n=0),/^[0-9]*[1-9][0-9]*$/.test(t))&&(n=n.toFixed(t)).indexOf(".")<0){n+=".";for(var i=0;i0){window.__projectId=t;var n=e.method.cloneJSON(e.projects.find((function(e){return e.id==t})));if(n)return n.columns=e.method.cloneJSON(e.columns.filter((function(e){return e.project_id==n.id}))).sort((function(e,t){return e.sort!=t.sort?e.sort-t.sort:e.id-t.id})),n.columns.forEach((function(t){t.tasks=e.method.cloneJSON(e.tasks.filter((function(e){return e.column_id==t.id}))).sort((function(e,t){return e.sort!=t.sort?e.sort-t.sort:e.id-t.id}))})),Object.freeze(n)}return{columns:[],project_user:[]}},taskData:function(e){var t=e.taskId;if(0==t&&(t=e.method.runNum(window.__taskId)),t>0){window.__taskId=t;var n=e.tasks.find((function(e){return e.id==t}));if(n)return n}return{}},tablePanel:function(e){return function(t){if(!e.projectId)return!1;var n=e.cacheTablePanel.find((function(t){return t.project_id==e.projectId}));return n||(n={project_id:e.projectId,card:!0,chat:!1,showMy:!0,showUndone:!0,showCompleted:!1,completedTask:!1},e.cacheTablePanel.push(n)),n&&!!n[t]}}};function yt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const _t={call:function(e,t){var n=e.state,i=e.dispatch;return n.method.isJson(t)||(t={url:t}),n.method.isJson(t.header)||(t.header={}),t.url=n.method.apiUrl(t.url),t.data=n.method.date2string(t.data),t.header["Content-Type"]="application/json",t.header.language=$A.getLanguage(),t.header.token=n.userToken,t.header.fd=n.method.getStorageString("userWsFd"),new Promise((function(e,r){if(!0===t.spinner){var a=document.getElementById("common-spinner");if(a){var s=t.before;t.before=function(){n.ajaxLoadNum++,a.style.display="block","function"==typeof s&&s()};var o=t.complete;t.complete=function(){n.ajaxLoadNum--,n.ajaxLoadNum<=0&&(a.style.display="none"),"function"==typeof o&&o()}}}if(t.success=function(a,s,o){if(!n.method.isJson(a))return console.log(a,s,o),void r({data:{},msg:"Return error"});var l=a.ret,u=a.data,c=a.msg;-1!==l||!1===t.checkRole?1===l?e({data:u,msg:c}):r({data:u,msg:c||"Unknown error"}):$A.modalError({content:c,onOk:function(){i("logout")}})},t.error=function(){r({data:{},msg:"System error"})},!0===t.websocket||!0===t.ws){var l=n.method.randomString(16),u=setTimeout((function(){var e=n.ajaxWsListener.find((function(e){return e.apiWebsocket==l}));e&&(e.complete(),e.error("timeout"),e.after()),n.ajaxWsListener=n.ajaxWsListener.filter((function(e){return e.apiWebsocket!=l}))}),t.timeout||3e4);n.ajaxWsListener.push({apiWebsocket:l,complete:"function"==typeof t.complete?t.complete:function(){},success:"function"==typeof t.success?t.success:function(){},error:"function"==typeof t.error?t.error:function(){},after:"function"==typeof t.after?t.after:function(){}}),t.complete=function(){},t.success=function(){},t.error=function(){},t.after=function(){},t.header["Api-Websocket"]=l,!1===n.ajaxWsReady&&(n.ajaxWsReady=!0,i("websocketMsgListener",{name:"apiWebsocket",callback:function(e){switch(e.type){case"apiWebsocket":clearTimeout(u);var t=e.apiWebsocket,i=e.apiSuccess,r=e.data,a=n.ajaxWsListener.find((function(e){return e.apiWebsocket==t}));a&&(a.complete(),i?a.success(r):a.error(r),a.after()),n.ajaxWsListener=n.ajaxWsListener.filter((function(e){return e.apiWebsocket!=t}))}}}))}$A.ajaxc(t)}))},toggleTablePanel:function(e,t){var n=e.state;if(n.projectId){var i=n.cacheTablePanel.findIndex((function(e){return e.project_id==n.projectId}));-1===i&&(n.cacheTablePanel.push({project_id:n.projectId}),i=n.cacheTablePanel.findIndex((function(e){return e.project_id==n.projectId})));var r=n.cacheTablePanel[i];n.cacheTablePanel.splice(i,1,Object.assign(r,yt({},t,!r[t]))),n.method.setStorage("cacheTablePanel",n.cacheTablePanel)}},getUserInfo:function(e){var t=e.dispatch;return new Promise((function(e,n){t("call",{url:"users/info"}).then((function(n){t("saveUserInfo",n.data),e(n)})).catch((function(e){console.error(e),n(e)}))}))},saveUserInfo:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e){var r=n.method.cloneJSON(t);r.userid=n.method.runNum(r.userid),r.token=r.userid>0?r.token||n.userToken:"",n.userInfo=r,n.userId=r.userid,n.userToken=r.token,n.userIsAdmin=n.method.inArray("admin",r.identity),n.method.setStorage("userInfo",n.userInfo),i("getProjects"),i("getDialogs"),i("websocketConnection"),e()}))},saveUserOnlineStatus:function(e,t){var n=e.state,i=t.userid,r=t.online;n.userOnline[i]!==r&&(n.userOnline=Object.assign({},n.userOnline,yt({},i,r)))},getUserBasic:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isJson(t)){var r=t.userid,a=t.success,s=t.complete;if(r!==n.userId){var o=Math.round((new Date).getTime()/1e3),l=[];(n.method.isArray(r)?r:[r]).some((function(e){if(n.cacheUserBasic[e]&&("function"==typeof a&&a(n.cacheUserBasic[e].data,!1),o-n.cacheUserBasic[e].time<=30))return!1;l.push(e)})),0!==l.length?!0!==n.cacheUserBasic["::load"]?(n.cacheUserBasic["::load"]=!0,i("call",{url:"users/basic",data:{userid:l}}).then((function(e){n.cacheUserBasic["::load"]=!1,"function"==typeof s&&s(),e.data.forEach((function(e){n.cacheUserBasic[e.userid]={time:o,data:e},n.method.setStorage("cacheUserBasic",n.cacheUserBasic),i("saveUserOnlineStatus",e),"function"==typeof a&&a(e,!0)}))})).catch((function(e){console.error(e),n.cacheUserBasic["::load"]=!1,"function"==typeof s&&s()}))):setTimeout((function(){i("getUserBasic",t)}),20):"function"==typeof s&&s()}else"function"==typeof a&&a(n.userInfo,!0)}},logout:function(e){var t=e.state,n=e.dispatch;t.method.clearLocal(),n("saveUserInfo",{}).then((function(){var e="/"==window.location.pathname?"":encodeURIComponent(window.location.href);$A.goForward({path:"/login",query:e?{from:e}:{}},!0)}))},saveFile:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isArray(t))t.forEach((function(e){i("saveFile",e)}));else if(n.method.isJson(t)){var r=n.files.findIndex((function(e){return e.id==t.id}));r>-1?n.files.splice(r,1,t):n.files.push(t)}},forgetFile:function(e,t){var n=e.state,i=e.dispatch;n.files=n.files.filter((function(e){return e.id!=t})),n.files.forEach((function(e){e.pid==t&&i("forgetFile",e.id)}))},getFiles:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){i("call",{url:"file/lists",data:{pid:t}}).then((function(r){var a=r.data.map((function(e){return e.id}));n.files=n.files.filter((function(e){return e.pid!=t||a.includes(e.id)})),i("saveFile",r.data),e(r)})).catch((function(e){console.error(e),r(e)}))}))},saveProject:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isArray(t))t.forEach((function(e){i("saveProject",e)}));else if(n.method.isJson(t)){var r=n.projects.findIndex((function(e){return e.id==t.id}));r>-1?n.projects.splice(r,1,Object.assign(n.projects[r],t)):n.projects.push(t),setTimeout((function(){n.method.setStorage("cacheProjects",n.cacheProjects=n.projects)}))}},forgetProject:function(e,t){var n=e.state,i=n.projects.findIndex((function(e){return e.id==t}));if(i>-1&&n.projects.splice(i,1),n.projectId==t){var r=n.projects.find((function(e){var n=e.id;return n&&n!=t}));r?$A.goForward({path:"/manage/project/"+r.id}):$A.goForward({path:"/manage/dashboard"})}setTimeout((function(){n.method.setStorage("cacheProjects",n.cacheProjects=n.projects)}))},getProjects:function(e){var t=e.state,n=e.dispatch;0!==t.userId?(t.cacheProjects.length>0&&(t.projects=t.cacheProjects),n("call",{url:"project/lists"}).then((function(e){t.projects=[],n("saveProject",e.data.data)})).catch((function(e){console.error(e)}))):t.projects=[]},getProjectOne:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?(n.projectLoad++,i("call",{url:"project/one",data:{project_id:t}}).then((function(t){n.projectLoad--,i("saveProject",t.data),e(t)})).catch((function(e){console.error(e),n.projectLoad--,r(e)}))):r({msg:"Parameter error"})}))},archivedProject:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/archived",data:{project_id:t}}).then((function(n){i("forgetProject",t),e(n)})).catch((function(e){console.error(e),i("getProjectOne",t),r(e)})):r({msg:"Parameter error"})}))},removeProject:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/remove",data:{project_id:t}}).then((function(n){i("forgetProject",t),e(n)})).catch((function(e){console.error(e),i("getProjectOne",t),r(e)})):r({msg:"Parameter error"})}))},exitProject:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/exit",data:{project_id:t}}).then((function(n){i("forgetProject",t),e(n)})).catch((function(e){console.error(e),i("getProjectOne",t),r(e)})):r({msg:"Parameter error"})}))},getProjectStatistics:function(e){var t=e.state;(0,e.dispatch)("call",{url:"project/statistics"}).then((function(e){var n=e.data;t.projectStatistics=n}))},saveColumn:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isArray(t))t.forEach((function(e){i("saveColumn",e)}));else if(n.method.isJson(t)){var r=n.columns.findIndex((function(e){return e.id==t.id}));r>-1?n.columns.splice(r,1,Object.assign(n.columns[r],t)):n.columns.push(t),setTimeout((function(){n.method.setStorage("cacheColumns",n.cacheColumns=n.columns)}))}},forgetColumn:function(e,t){var n=e.state,i=e.dispatch,r=n.columns.findIndex((function(e){return e.id==t}));r>-1&&(i("getProjectOne",n.columns[r].project_id),n.columns.splice(r,1)),setTimeout((function(){n.method.setStorage("cacheColumns",n.cacheColumns=n.columns)}))},getColumns:function(e,t){var n=e.state,i=e.dispatch;0!==n.userId?(n.cacheColumns.length>0&&(n.columns=n.cacheColumns),n.projectLoad++,i("call",{url:"project/column/lists",data:{project_id:t}}).then((function(e){n.projectLoad--;var r=e.data.data.map((function(e){return e.id}));0!=r.length&&(n.columns=n.columns.filter((function(e){return e.project_id!=t||r.includes(e.id)})),i("saveColumn",e.data.data))})).catch((function(e){console.error(e),n.projectLoad--}))):n.columns=[]},removeColumn:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/column/remove",data:{column_id:t}}).then((function(n){i("forgetColumn",t),e(n)})).catch((function(e){console.error(e),r(e)})):r({msg:"Parameter error"})}))},saveTask:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isArray(t))t.forEach((function(e){i("saveTask",e)}));else if(n.method.isJson(t)){var r=t.parent_id>0?"taskSubs":"tasks",a=n[r].findIndex((function(e){return e.id==t.id}));a>-1?n[r].splice(a,1,Object.assign(n[r][a],t)):n[r].push(t),a>-1&&t.parent_id&&i("getTaskOne",t.parent_id),t.is_update_complete&&i("getProjectOne",t.project_id),t.is_update_content&&i("getTaskContent",t.id),setTimeout((function(){"taskSubs"==r?n.method.setStorage("cacheTaskSubs",n.cacheTaskSubs=n[r]):n.method.setStorage("cacheTasks",n.cacheTasks=n[r])}))}},forgetTask:function(e,t){var n=e.state,i=e.dispatch,r=n.tasks.findIndex((function(e){return e.id==t})),a="tasks";-1===r&&(r=n.taskSubs.findIndex((function(e){return e.id==t})),a="taskSubs"),r>-1&&(n[a][r].parent_id&&i("getTaskOne",n[a][r].parent_id),"tasks"==a&&i("getProjectOne",n[a][r].project_id),n[a].splice(r,1)),n.taskId==t&&(n.taskId=0),setTimeout((function(){"taskSubs"==a?n.method.setStorage("cacheTaskSubs",n.cacheTaskSubs=n[a]):n.method.setStorage("cacheTasks",n.cacheTasks=n[a])}))},increaseTaskMsgNum:function(e,t){var n=e.state.tasks.find((function(e){return e.dialog_id===t}));n&&n.msg_num++},getTasks:function(e,t){var n=e.state,i=e.dispatch;0!==n.userId?(n.cacheTasks.length>0&&(n.tasks=n.cacheTasks),t.project_id&&n.projectLoad++,i("call",{url:"project/task/lists",data:t}).then((function(e){t.project_id&&n.projectLoad--;var r=e.data,a=r.data.map((function(e){return e.id}));if(0!=a.length&&(t.project_id&&(n.tasks=n.tasks.filter((function(e){return e.project_id!=t.project_id||a.includes(e.id)}))),t.parent_id&&(n.taskSubs=n.taskSubs.filter((function(e){return e.parent_id!=t.parent_id||a.includes(e.id)}))),i("saveTask",r.data),r.next_page_url)){var s=Object.assign(t,{page:r.current_page+1});r.current_page%5==0?$A.modalWarning({content:"数据已超过"+r.to+"条,是否继续加载?",onOk:function(){i("getTasks",s)}}):i("getTasks",s)}})).catch((function(e){console.error(e),t.project_id&&n.projectLoad--}))):n.tasks=[]},getTaskOne:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/task/one",data:{task_id:t}}).then((function(t){i("saveTask",t.data),e(t)})).catch((function(e){console.error(e),r(e)})):r({msg:"Parameter error"})}))},removeTask:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/task/remove",data:{task_id:t}}).then((function(n){i("forgetTask",t),e(n)})).catch((function(e){console.error(e),i("getTaskOne",t),r(e)})):r({msg:"Parameter error"})}))},archivedTask:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/task/archived",data:{task_id:t}}).then((function(n){i("forgetTask",t),e(n)})).catch((function(e){console.error(e),i("getTaskOne",t),r(e)})):r({msg:"Parameter error"})}))},getTaskContent:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/task/content",data:{task_id:t}}).then((function(t){var i=n.taskContents.findIndex((function(e){return e.id==t.data.id}));i>-1?n.taskContents.splice(i,1,t.data):n.taskContents.push(t.data),e(t)})).catch((function(e){console.error(e),r(e)})):r({msg:"Parameter error"})}))},getTaskFiles:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"project/task/files",data:{task_id:t}}).then((function(r){r.data.forEach((function(e){var t=n.taskFiles.findIndex((function(t){return t.id==e.id}));t>-1?n.taskFiles.splice(t,1,e):n.taskFiles.push(e)})),i("saveTask",{id:t,file_num:r.data.length}),e(r)})).catch((function(e){console.error(e),r(e)})):r({msg:"Parameter error"})}))},forgetTaskFile:function(e,t){var n=e.state,i=(e.dispatch,n.taskFiles.findIndex((function(e){return e.id==t})));i>-1&&n.taskFiles.splice(i,1)},openTask:function(e,t){var n=e.state,i=e.dispatch;n.taskId=t,t>0&&i("getTaskOne",t).then((function(){i("getTaskContent",t),i("getTaskFiles",t),i("getTasks",{parent_id:t})})).catch((function(e){var t=e.msg;$A.modalWarning({content:t,onOk:function(){n.taskId=0}})}))},taskAdd:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){var a=n.method.cloneJSON(n.method.date2string(t));n.method.isArray(a.column_id)&&(a.column_id=a.column_id.find((function(e){return e}))),i("call",{url:"project/task/add",data:a,method:"post"}).then((function(t){i("addTaskSuccess",t.data),e(t)})).catch((function(e){console.error(e),r(e)}))}))},taskAddSub:function(e,t){var n=e.dispatch;return new Promise((function(e,i){n("call",{url:"project/task/addsub",data:t}).then((function(t){n("addTaskSuccess",t.data),e(t)})).catch((function(e){console.error(e),i(e)}))}))},addTaskSuccess:function(e,t){var n=e.dispatch,i=t.new_column,r=t.task;i&&n("saveColumn",i),n("saveTask",r),r.parent_id?n("getTaskOne",r.parent_id):n("getProjectOne",r.project_id)},taskUpdate:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){var a=n.method.cloneJSON(n.method.date2string(t));i("call",{url:"project/task/update",data:a,method:"post"}).then((function(t){i("saveTask",t.data),e(t)})).catch((function(e){console.error(e),i("getTaskOne",a.task_id),r(e)}))}))},getTaskPriority:function(e){var t=e.state,n=e.dispatch;return new Promise((function(e,i){n("call",{url:"system/priority"}).then((function(n){t.taskPriority=n.data,e(n)})).catch((function(e){console.error(e),i(e)}))}))},saveDialog:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isArray(t))t.forEach((function(e){i("saveDialog",e)}));else if(n.method.isJson(t)){var r=n.dialogs.findIndex((function(e){return e.id==t.id}));r>-1?n.dialogs.splice(r,1,Object.assign(n.dialogs[r],t)):n.dialogs.push(t),setTimeout((function(){n.method.setStorage("cacheDialogs",n.cacheDialogs=n.dialogs)}))}},updateDialogLastMsg:function(e,t){var n=e.state,i=e.dispatch;n.dialogs.find((function(e){return e.id==t.dialog_id}))?i("saveDialog",{id:t.dialog_id,last_msg:t,last_at:n.method.formatDate("Y-m-d H:i:s")}):i("getDialogOne",t.dialog_id)},getDialogs:function(e){var t=e.state,n=e.dispatch;0!==t.userId?n("call",{url:"dialog/lists"}).then((function(e){n("saveDialog",e.data.data)})).catch((function(e){console.error(e)})):t.dialogs=[]},getDialogOne:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){0!==n.method.runNum(t)?i("call",{url:"dialog/one",data:{dialog_id:t}}).then((function(t){i("saveDialog",t.data),e(t)})).catch((function(e){console.error(e),r(e)})):r({msg:"Parameter error"})}))},openDialogUserid:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){t!==n.userId?i("call",{url:"dialog/open/user",data:{userid:t}}).then((function(t){i("saveDialog",t.data),n.method.setStorage("messenger::dialogId",t.data.id),n.dialogOpenId=t.data.id,e(t)})).catch((function(e){console.error(e),r(e)})):r({msg:"Parameter error"})}))},moveDialogTop:function(e,t){var n=e.state,i=n.dialogs.findIndex((function(e){return e.id==t}));if(i>-1){var r=n.method.cloneJSON(n.dialogs[i]);n.dialogs.splice(i,1),n.dialogs.unshift(r)}},saveDialogMsg:function(e,t){var n=e.state,i=e.dispatch;if(n.method.isArray(t))t.forEach((function(e){i("saveDialogMsg",e)}));else if(n.method.isJson(t)){var r=n.dialogMsgs.findIndex((function(e){return e.id==t.id}));r>-1?n.dialogMsgs.splice(r,1,Object.assign(n.dialogMsgs[r],t)):n.dialogMsgs.push(t),setTimeout((function(){n.method.setStorage("cacheDialogMsgs",n.cacheDialogMsgs=n.dialogMsgs)}))}},getDialogMsgs:function(e,t){var n=e.state,i=e.dispatch,r=n.dialogs.find((function(e){return e.id==t}));r||(r={id:t},n.dialogs.push(r)),r.loading||(r.loading=!0,r.currentPage=1,r.hasMorePages=!1,i("call",{url:"dialog/msg/lists",data:{dialog_id:t,page:r.currentPage}}).then((function(e){r.loading=!1,r.currentPage=e.data.current_page,r.hasMorePages=!!e.data.next_page_url,i("saveDialog",r);var a=e.data.data.map((function(e){return e.id}));0!=a.length&&(n.dialogMsgs=n.dialogMsgs.filter((function(e){return e.dialog_id!=t||a.includes(e.id)})),i("saveDialog",e.data.dialog),i("saveDialogMsg",e.data.data))})).catch((function(e){console.error(e),r.loading=!1})))},getDialogMsgNextPage:function(e,t){var n=e.state,i=e.dispatch;return new Promise((function(e,r){var a=n.dialogs.find((function(e){return e.id==t}));a?a.hasMorePages?a.loading?r({msg:"Loading"}):(a.loading=!0,a.currentPage++,i("call",{url:"dialog/msg/lists",data:{dialog_id:t,page:a.currentPage}}).then((function(t){a.loading=!1,a.currentPage=t.data.current_page,a.hasMorePages=!!t.data.next_page_url,i("saveDialogMsg",t.data.data),e(t)})).catch((function(e){console.error(e),a.loading=!1,r(e)}))):r({msg:"No more page"}):r({msg:"Parameter error"})}))},dialogMsgRead:function(e,t){var n=e.state,i=e.dispatch;if(t.userid!=n.userId&&!0!==t.is_read){t.is_read=!0;var r=n.dialogs.find((function(e){return e.id==t.dialog_id}));r&&r.unread>0&&r.unread--,n.wsReadWaitList.push(t.id),clearTimeout(n.wsReadTimeout),n.wsReadTimeout=setTimeout((function(){i("websocketSend",{type:"readMsg",data:{id:n.method.cloneJSON(n.wsReadWaitList)}}),n.wsReadWaitList=[]}),20)}},websocketConnection:function(e){var t=e.state,n=e.dispatch;e.commit;if(clearTimeout(t.wsTimeout),0!==t.userId){var i=window.webSocketConfig.URL;i||(i=(i=(i=window.location.origin).replace("https://","wss://")).replace("http://","ws://"),i+="/ws"),i+="?action=web&token="+t.userToken,t.ws=new WebSocket(i),t.ws.onopen=function(e){console.log("[WS] Open",e)},t.ws.onclose=function(e){console.log("[WS] Close",e),t.ws=null,clearTimeout(t.wsTimeout),t.wsTimeout=setTimeout((function(){n("websocketConnection")}),3e3)},t.ws.onerror=function(e){console.log("[WS] Error",e),t.ws=null,clearTimeout(t.wsTimeout),t.wsTimeout=setTimeout((function(){n("websocketConnection")}),3e3)},t.ws.onmessage=function(e){console.log("[WS] Message",e);var i=t.method.jsonParse(event.data),r=i.type,a=i.msgId;switch(r){case"open":t.method.setStorage("userWsFd",i.data.fd);break;case"receipt":"function"==typeof t.wsCall[a]&&t.wsCall[a](i.body,!0),delete t.wsCall[a];break;case"line":n("saveUserOnlineStatus",i.data);break;default:switch(a&&n("websocketSend",{type:"receipt",msgId:a}),t.wsMsg=i,Object.values(t.wsListener).forEach((function(e){if("function"==typeof e)try{e(i)}catch(e){console.log("[WS] Callerr",e)}})),r){case"dialog":!function(e){var i=e.mode,r=e.data,a=r.dialog_id;if("add"===i||"chat"===i){if(n("increaseTaskMsgNum",a),"chat"===i)return;var s=t.dialogs.find((function(e){return e.id==r.dialog_id}));s&&(r.userid!==t.userId&&-1===t.dialogMsgs.findIndex((function(e){return e.id==r.id}))&&s.unread++,n("moveDialogTop",a)),t.dialogMsgPush=r}n("saveDialogMsg",r),n("updateDialogLastMsg",r)}(i);break;case"project":!function(e){var t=e.action,i=e.data;switch(t){case"add":case"update":n("saveProject",i);break;case"detail":n("getProjectOne",i.id),n("getTasks",{project_id:i.id});break;case"archived":case"delete":n("forgetProject",i.id);break;case"sort":n("getTasks",{project_id:i.id})}}(i);break;case"projectColumn":!function(e){var t=e.action,i=e.data;switch(t){case"add":case"update":n("saveColumn",i);break;case"delete":n("forgetColumn",i.id)}}(i);break;case"projectTask":!function(e){var t=e.action,i=e.data;switch(t){case"add":n("addTaskSuccess",i);break;case"update":n("saveTask",i);break;case"dialog":n("saveTask",i),n("getDialogOne",i.dialog_id);break;case"upload":n("getTaskFiles",i.task_id);break;case"filedelete":n("forgetTaskFile",i.id);break;case"archived":case"delete":n("forgetTask",i.id)}}(i)}}}}else t.ws&&(t.ws.close(),t.ws=null)},websocketSend:function(e,t){var n=e.state;if(n.method.isJson(t)){var i=t.type,r=t.data,a=t.callback,s=t.msgId;if(n.ws){"function"==typeof a&&(s=n.method.randomString(16),n.wsCall[s]=a);try{n.ws.send(JSON.stringify({type:i,msgId:s,data:r}))}catch(e){"function"==typeof a&&a(null,!1)}}else"function"==typeof a&&a(null,!1)}},websocketMsgListener:function(e,t){var n=e.state,i=t.name,r=t.callback;"function"==typeof r?n.wsListener[i]=r:n.wsListener[i]&&delete n.wsListener[i]},websocketClose:function(e){var t=e.state;t.ws&&t.ws.close()}};i.default.use(r.ZP);const wt=new r.ZP.Store({state:gt,getters:bt,mutations:{},actions:_t});n(90091),n(92693);const xt={name:"PageTitle",props:{title:{type:[String,Number],default:""}},data:function(){return{pagePath:""}},activated:function(){this.updateTitle()},watch:{title:{handler:function(){this.initTitle()},immediate:!0}},methods:{initTitle:function(){this.pagePath=this.$route.path,this.updateTitle()},updateTitle:function(){if(""!=this.pagePath){var e=this.title;e!==document.title&&this.pagePath===this.$route.path&&this.setPageTile(e)}},setPageTile:function(e){document.title=e;var t=navigator.userAgent.toLowerCase();if(/iphone|ipad|ipod/.test(t)){var n=document.createElement("iframe");n.style.display="none";n.addEventListener("load",(function e(){setTimeout((function(){n.removeEventListener("load",e),document.body.removeChild(n)}),0)})),document.body.appendChild(n)}}}};const Ct=(0,s.Z)(xt,(function(){var e=this,t=e.$createElement;e._self._c;return e._e()}),[],!1,null,null,null).exports;const kt={name:"Loading"};const St=(0,s.Z)(kt,(function(){var e=this.$createElement,t=this._self._c||e;return t("svg",{staticClass:"common-loading",attrs:{viewBox:"25 25 50 50"}},[t("circle",{staticClass:"common-path",attrs:{cx:"50",cy:"50",r:"20",fill:"none","stroke-width":"5","stroke-miterlimit":"10"}})])}),[],!1,null,null,null).exports;const Ot={name:"AutoTip",props:{content:{type:[String,Number],default:""},placement:{default:"bottom"},tooltipTheme:{default:"dark"},tooltipMaxWidth:{type:[String,Number],default:300},delay:{type:Number,default:100}},data:function(){return{slotText:"",showTooltip:!1}},mounted:function(){this.updateConetne()},beforeUpdate:function(){this.updateConetne()},activated:function(){this.updateConetne()},computed:{text:function(){var e=this.content,t=this.slotText;return e||(void 0===t||t.length<1||"string"!=typeof t[0].text?"":t[0].text)},existSlot:function(){var e=this.slotText;return!(void 0===e||e.length<1)}},methods:{updateConetne:function(){this.slotText=this.$slots.default},handleTooltipIn:function(){var e=this.$refs.content,t=document.createRange();t.setStart(e,0),t.setEnd(e,e.childNodes.length);var n=t.getBoundingClientRect().width;this.showTooltip=Math.floor(n)>Math.floor(e.offsetWidth),t=null}}};const $t=(0,s.Z)(Ot,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ETooltip",{attrs:{content:e.text,placement:e.placement,theme:e.tooltipTheme,delay:e.delay,disabled:!e.showTooltip,"max-width":e.tooltipMaxWidth,transfer:""}},[n("span",{ref:"content",staticClass:"common-auto-tip",on:{mouseenter:e.handleTooltipIn}},[e.existSlot?[e._t("default")]:[e._v(e._s(e.text))]],2)])}),[],!1,null,null,null).exports;const Dt={name:"TagInput",props:{value:{default:""},cut:{default:","},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},placeholder:{default:""},max:{default:0}},data:function(){var e=[];return this.value.split(",").forEach((function(t){t&&e.push(t)})),{minWidth:80,tis:"",tisTimeout:null,showPlaceholder:!0,content:"",disSource:e}},mounted:function(){this.wayMinWidth()},watch:{placeholder:function(){this.wayMinWidth()},value:function(e){var t=[];$A.count(e)>0&&e.split(",").forEach((function(e){e&&t.push(e)})),this.disSource=t},disSource:function(e){var t=this,n="";e.forEach((function(e){""!=n&&(n+=t.cut),n+=e})),this.$emit("input",n)}},methods:{wayMinWidth:function(){var e=this;this.showPlaceholder=!0,this.$nextTick((function(){e.$refs.myPlaceholder&&(e.minWidth=Math.max(e.minWidth,e.$refs.myPlaceholder.offsetWidth)),setTimeout((function(){try{e.minWidth=Math.max(e.minWidth,e.$refs.myPlaceholder.offsetWidth),e.showPlaceholder=!1}catch(e){}$A(e.$refs.myPlaceholder).is(":visible")||e.wayMinWidth()}),500)}))},pasteText:function(e){e.preventDefault();var t=(e.clipboardData||window.clipboardData).getData("text");this.addTag(!1,t)},clickWrap:function(){this.$refs.myTextarea.focus()},downEnter:function(e){e.preventDefault()},addTag:function(e,t){var n=this;if(13===e.keyCode||!1===e)""!=t.trim()&&-1===this.disSource.indexOf(t.trim())&&this.disSource.push(t.trim()),this.content="";else{if(this.max>0&&this.disSource.length>=this.max)return this.content="",this.tis="最多只能添加"+this.max+"个",clearInterval(this.tisTimeout),void(this.tisTimeout=setTimeout((function(){n.tis=""}),2e3));var i=t.trim(),r=i.length-this.cut.length;""!=i&&i.substring(r)===this.cut&&(""!=(i=i.substring(0,r)).trim()&&-1===this.disSource.indexOf(i.trim())&&this.disSource.push(i.trim()),this.content="")}},delTag:function(e){if(!1===e){if(""!==this.content)return;e=this.disSource.length-1}this.disSource.splice(e,1)}}};const Tt=(0,s.Z)(Dt,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"common-tag-input",on:{paste:function(t){return e.pasteText(t)},click:e.clickWrap}},[e._l(e.disSource,(function(t,i){return n("div",{staticClass:"tags-item"},[n("span",{staticClass:"tags-content",on:{click:function(e){e.stopPropagation()}}},[e._v(e._s(t))]),n("span",{staticClass:"tags-del",on:{click:function(t){return t.stopPropagation(),e.delTag(i)}}},[e._v("×")])])})),e._v(" "),n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.content,expression:"content"}],ref:"myTextarea",staticClass:"tags-input",style:{minWidth:e.minWidth+"px"},attrs:{placeholder:e.tis||e.placeholder,disabled:e.disabled,readonly:e.readonly},domProps:{value:e.content},on:{keydown:[function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.downEnter(t)},function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"delete",[8,46],t.key,["Backspace","Delete","Del"])?null:e.delTag(!1)}],keyup:function(t){return e.addTag(t,e.content)},blur:function(t){return e.addTag(!1,e.content)},input:function(t){t.target.composing||(e.content=t.target.value)}}}),e._v(" "),e.showPlaceholder||""!==e.tis?n("span",{ref:"myPlaceholder",staticClass:"tags-placeholder"},[e._v(e._s(e.tis||e.placeholder))]):e._e()],2)}),[],!1,null,null,null).exports;var Mt=n(3869),Pt=n.n(Mt);i.default.use(Pt());const Et={name:"TableAction",props:{column:{type:Object,default:function(){return{}}},minWidth:{type:Number,default:80},align:{type:String,default:""}},data:function(){return{width:0,height:0}},mounted:function(){this.onUpdate()},activated:function(){this.onUpdate()},beforeUpdate:function(){this.onUpdate()},computed:{tdStyle:function(){var e={},t=this.align;return["left","center","right"].includes(t.toLowerCase())&&(e.textAlign=t),e}},methods:{handleIn:function(){this.$refs.action.offsetWidth!=this.width&&this.onUpdate()},onUpdate:function(){this.onResize({width:this.$refs.action.offsetWidth,height:this.$refs.action.offsetHeight})},onResize:function(e){var t=e.width,n=e.height;$A(".ivu-table-column-"+this.column.__id).each((function(e,i){var r=$A(i).find(".td-action-container");r.length>0&&(t=Math.max(t,r[0].offsetWidth),n=Math.max(n,r[0].offsetHeight))})),this.width=t,this.height=n;var i=Math.max(this.minWidth,this.width+26);this.column.minWidth&&(i=Math.max(this.column.minWidth,i)),this.column.maxWidth&&(i=Math.min(this.column.maxWidth,i)),i!=this.column.width&&this.$set(this.column,"width",i)}}};const It=(0,s.Z)(Et,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"td-action",style:e.tdStyle},[n("div",{directives:[{name:"resize",rawName:"v-resize",value:e.onResize,expression:"onResize"}],ref:"action",staticClass:"td-action-container",on:{mouseenter:e.handleIn}},[e._t("default")],2)])}),[],!1,null,null,null).exports;const jt={name:"QuickEdit",props:{value:{}},data:function(){return{isLoad:!1,isEdit:!1,content:""}},watch:{isEdit:function(e){this.$emit("on-edit",e)}},methods:{onClick:function(){var e=this;this.content=this.value,this.isEdit=!0,this.$nextTick((function(){e.$refs.input.focus()}))},onEnter:function(){var e=this;this.content!=this.value?(this.isLoad=!0,this.$emit("input",this.content),this.$emit("on-update",this.content,(function(){e.isEdit=!1,e.isLoad=!1}))):this.isEdit=!1}}};const Nt=(0,s.Z)(jt,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"quick-edit"},[e.isEdit?n("div",{staticClass:"quick-input"},[n("Input",{ref:"input",attrs:{disabled:e.isLoad},on:{"on-blur":e.onEnter,"on-enter":e.onEnter},model:{value:e.content,callback:function(t){e.content=t},expression:"content"}}),e._v(" "),e.isLoad?n("div",{staticClass:"quick-loading"},[n("Loading")],1):e._e()],1):[n("div",{staticClass:"quick-text"},[e._t("default")],2),e._v(" "),n("Icon",{staticClass:"quick-icon",attrs:{type:"ios-create-outline"},on:{click:function(t){return t.stopPropagation(),e.onClick.apply(null,arguments)}}})]],2)}),[],!1,null,null,null).exports;function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Ft(e){for(var t=1;t0&&(e.border=t+"px solid "+(n||"#ffffff")),e},spotStyle:function(){var e=this.borderWitdh,t=this.size;return"default"===t&&(t=32),e>0&&(t-=e),32==t?{}:{transform:"scale("+Math.min(1.25,t/32)+")"}},avatarSize:function(){var e=this.borderWitdh,t=this.size;return"default"===t&&(t=32),e>0?t-2*e:t},showImg:function(){var e=this.user.userimg;return!!e&&!$A.rightExists(e,"/avatar.png")},nickname:function(){var e=this.user.nickname;if(!e)return"D";var t=e.substring(0,2);return/^[\u4e00-\u9fa5]+$/.test(t)&&(t=t.substring(0,1)),t||"D"}}),watch:{userid:function(){this.getData()},userInfo:function(e){e.userid==this.userid&&(this.user=e)},userOnline:function(e){this.user&&void 0!==e[this.user.userid]&&this.$set(this.user,"online",e[this.user.userid])}},methods:{getData:function(){var e=this;this.userid&&(this.userid!=this.userInfo.userid?this.$store.dispatch("getUserBasic",{userid:this.userid,success:function(t){e.user=t}}):this.user=this.userInfo)},openDialog:function(){this.goForward({path:"/manage/messenger"}),this.$store.dispatch("openDialogUserid",this.userid)}}};const Rt=(0,s.Z)(Vt,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.user?n("ETooltip",{staticClass:"common-avatar",attrs:{"open-delay":600,disabled:e.tooltipDisabled}},[n("div",{staticClass:"common-avatar-transfer",attrs:{slot:"content"},slot:"content"},[e._t("default"),e._v(" "),n("p",[e._v(e._s(e.$L("昵称"))+": "+e._s(e.user.nickname))]),e._v(" "),n("p",[e._v(e._s(e.$L("职位/职称"))+": "+e._s(e.user.profession||"-"))]),e._v(" "),e.userId!=e.userid&&e.showIconMenu?n("div",{staticClass:"avatar-icons"},[n("Icon",{attrs:{type:"ios-chatbubbles"},on:{click:e.openDialog}})],1):e._e()],2),e._v(" "),n("div",{staticClass:"avatar-wrapper"},[n("div",{class:["avatar-box",e.userId===e.userid||e.user.online?"online":""],style:e.boxStyle},[n("em",{style:e.spotStyle}),e._v(" "),e.showImg?n("EAvatar",{attrs:{src:e.user.userimg,size:e.avatarSize}}):n("EAvatar",{staticClass:"avatar-text",attrs:{size:e.avatarSize}},[n("span",{style:e.spotStyle},[e._v(e._s(e.nickname))])])],1),e._v(" "),e.showName?n("div",{staticClass:"avatar-name"},[e._v(e._s(e.user.nickname))]):e._e()])]):e._e()}),[],!1,null,null,null).exports;var Bt=n(64720);function zt(e){return(zt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}i.default.use(r.ZP),i.default.use(ot()),i.default.use(at),i.default.use(pt),i.default.component("PageTitle",Ct),i.default.component("Loading",St),i.default.component("AutoTip",$t),i.default.component("TagInput",Tt),i.default.component("TableAction",It),i.default.component("QuickEdit",Nt),i.default.component("UserAvatar",Rt),i.default.component("EAvatar",Bt.Avatar),i.default.component("ETooltip",Bt.Tooltip),i.default.component("EPopover",Bt.Popover),i.default.component("EDropdown",Bt.Dropdown),i.default.component("EDropdownMenu",Bt.DropdownMenu),i.default.component("EDropdownItem",Bt.DropdownItem);var Wt=at.prototype.push;at.prototype.push=function(e){return Wt.call(this,e).catch((function(e){return e}))};var Ht=new at({mode:"history",routes:f});ot().LoadingBar.config({color:"#3fcc25",failedColor:"#ff0000"}),Ht.beforeEach((function(e,t,n){ot().LoadingBar.start(),n()})),Ht.afterEach((function(e,t,n){ot().LoadingBar.finish()})),i.default.prototype.goForward=function(e,t){"string"==typeof e&&(e={name:e}),!0===t?qt.$router.replace(e).then((function(){})):qt.$router.push(e).then((function(){}))},i.default.prototype.goBack=function(e){var t=$A.jsonParse(window.sessionStorage.__history__||"{}");$A.runNum(t["::count"])>2?qt.$router.go("number"==typeof e?e:-1):qt.$router.replace("object"===zt(e)?e:{path:"/"}).then((function(){}))},i.default.prototype.$A=$A,i.default.config.productionTip=!1;var qt=new i.default({el:"#app",router:Ht,store:wt,template:"",components:{App:h}});$A.goForward=qt.goForward,$A.goBack=qt.goBack,$A.getLanguage=qt.getLanguage,$A.Message=qt.$Message,$A.Notice=qt.$Notice,$A.Modal=qt.$Modal,$A.store=qt.$store,$A.L=qt.$L},90091:()=>{function e(){return(e=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&(t=e[e.length-1]),t},strExists:function(e,t){var n=arguments.length>2&&arguments[2]!==a&&arguments[2];return e+="",t+="",!0!==n&&(e=e.toLowerCase(),t=t.toLowerCase()),-1!==e.indexOf(t)},leftExists:function(e,t){var n=arguments.length>2&&arguments[2]!==a&&arguments[2];return e+="",t+="",!0!==n&&(e=e.toLowerCase(),t=t.toLowerCase()),e.substring(0,t.length)===t},leftDelete:function(e,t){var n=arguments.length>2&&arguments[2]!==a&&arguments[2];return e+="",t+="",this.leftExists(e,t,n)&&(e=e.substring(t.length)),e||""},rightExists:function(e,t){var n=arguments.length>2&&arguments[2]!==a&&arguments[2];return e+="",t+="",!0!==n&&(e=e.toLowerCase(),t=t.toLowerCase()),e.substring(e.length-t.length)===t},getMiddle:function(e,t,n){return e=e.toString(),this.ishave(t)&&this.strExists(e,t)&&(e=e.substring(e.indexOf(t)+t.length)),this.ishave(n)&&this.strExists(e,n)&&(e=e.substring(0,e.indexOf(n))),e},subString:function(e,t,n){return e+="",this.ishave(n)||(n=e.length),e.substring(t,n)},randomString:function(e){e=e||32;for(var t="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678oOLl9gqVvUuI1",n=t.length,i="",r=0;r=t)return e;for(var i="",r=0;r86400){var i=Math.floor(n/86400),r=Math.ceil((n-86400*i)/3600);return r>0?i+"天"+r+"小时":i+"天"}return n>3600?Math.ceil(n/3600)+"小时":n>60?Math.ceil(n/60)+"分钟":n>10?n+"秒":"刚刚"},isMobile:function(e){return/^1([3456789])\d{9}$/.test(e)},isPhone:function(e){return this.isMobile(e)},getDistance:function(e,t,n,i){var r,a,s,o,l,u=3.14159265359,c=6.28318530712,d=.01745329252,h=6370693.5;return r=t*d,a=i*d,(l=e*d-n*d)>u?l=c-l:l<-u&&(l=c+l),s=h*Math.cos(r)*l,o=h*(r-a),Math.sqrt(s*s+o*o).toFixed(0)},setTile:function(e){document.title=e;var t=navigator.userAgent.toLowerCase();if(/iphone|ipad|ipod/.test(t)){var n=document.createElement("iframe");n.style.display="none",n.setAttribute("src","/favicon.ico");n.addEventListener("load",(function e(){setTimeout((function(){n.removeEventListener("load",e),document.body.removeChild(n)}),0)})),document.body.appendChild(n)}},cloneData:function(n){return"object"!==i(n)||null===n?n:"number"==typeof n.length?t(n).slice(0):e({},n)},cloneJSON:function(e){return"object"!==i(e)||null===e?e:$A.jsonParse($A.jsonStringify(e))},jsonParse:function(e,t){if(null===e)return t||{};if("object"===i(e))return e;try{return JSON.parse(e.replace(/\n/g,"\\n").replace(/\r/g,"\\r"))}catch(e){return t||{}}},jsonStringify:function(e,t){if("object"!==i(e))return e;try{return JSON.stringify(e)}catch(e){return t||""}},resize:function(e,t){var n=$A(e);if(0!==n.length)var i=parseInt(n.outerHeight()),r=parseInt(n.outerWidth()),a=setInterval((function(){0===n.length&&clearInterval(a);var e=parseInt(n.outerHeight()),s=parseInt(n.outerWidth());i===e&&r===s||(i=e,r=s,console.log(r,i),"function"==typeof t&&t())}),250)},isIos:function(){var e=void 0!==n&&n.navigator.userAgent.toLowerCase();return e&&/iphone|ipad|ipod|ios/.test(e)},isAndroid:function(){var e=void 0!==n&&n.navigator.userAgent.toLowerCase();return e&&e.indexOf("android")>0},isWeixin:function(){return(void 0!==n&&n.navigator.userAgent.toLowerCase()).match(/MicroMessenger/i)+""=="micromessenger"},getObject:function(e,t){var n=e;if(0===this.count(e)||0===this.count(t))return"";var i=t.replace(/,/g,"|").replace(/\./g,"|").split("|");return $A.each(i,(function(e,t){n=void 0===n[t]?"":n[t]})),n},count:function(e){try{if(void 0===e)return 0;if("number"==typeof e&&(e+=""),"number"==typeof e.length)return e.length;var t,n=0;for(t in e)n++;return n}catch(e){return 0}},objImplode:function(e){var t=this;if(null===e)return"";var n="";return $A.each(e,(function(e,r){null!==r&&("object"===i(r)&&t.count(r)>0?n+=t.objImplode(r):n+=String(r))})),n.replace(/\s/g,"").replace(/undefined/g,"")},urlParameter:function(e){var t=this.urlParameterAll();return void 0===e?t:t[e]},urlParameterAll:function(){var e=n.location.search||"",t=[];this.strExists(e,"?")&&(t=this.getMiddle(e,"?").split("&"));for(var i={},r=0;r=2){for(var i=encodeURIComponent(t)+"=",r=n[1].split(/[&;]/g),a=r.length;a-- >0;)-1!==r[a].lastIndexOf(i,0)&&r.splice(a,1);return n[0]+(r.length>0?"?"+r.join("&"):"")}return e},urlAddParams:function(e,t){if("object"===i(t)&&null!==t)for(var n in e+="",e+=-1===e.indexOf("?")?"?":"",t)t.hasOwnProperty(n)&&(e+="&"+n+"="+t[n]);return e.replace("?&","?")},stringConnect:function(){for(var e=null,t="",n=arguments.length,i=new Array(n),r=0;r0&&(e=e[0]);var n="object"===i(e.$el)?$A(e.$el):$A(e);if(0!==n.length){var r=n[0];if("INPUT"!=r.tagName&&"TEXTAREA"!=r.tagName&&(n=0===n.find("input").length?n.find("textarea"):n.find("input")),0!==n.length&&("INPUT"==(r=n[0]).tagName||"TEXTAREA"==r.tagName)){var a=n.val(),s=r,o=s.selectionStart,l=s.selectionEnd;n.val("".concat(a.substring(0,o)).concat(t).concat(a.substring(l,a.length))),r.dispatchEvent(new Event("input")),setTimeout((function(){if(r.setSelectionRange){var e=a.substring(0,o).length+t.length;r.focus(),r.setSelectionRange(e,e)}}),10)}}}},iOSKeyboardFixer:function(){this.isIos()&&(document.body.scrollTop=document.body.scrollTop+1,document.body.scrollTop=document.body.scrollTop-1)},autoDevwid:function(e){var t=e||640;new function(){var e=this;e.width=t,e.fontSize=30,e.widthProportion=function(){var t=(document.body&&document.body.clientWidth||document.getElementsByTagName("html")[0].offsetWidth)/e.width;return t>1?1:t<.38?.38:t},e.changePage=function(){document.getElementsByTagName("html")[0].setAttribute("style","font-size:"+e.widthProportion()*e.fontSize+"px !important")},e.changePage(),n.addEventListener("resize",(function(){e.changePage()}),!1)};var i=$A(n).width()/t;return $A(".__auto").each((function(){"1"!==$A(this).attr("data-original")&&($A(this).attr("data-original-top",parseInt($A(this).css("top"))),$A(this).attr("data-original-right",parseInt($A(this).css("right"))),$A(this).attr("data-original-bottom",parseInt($A(this).css("bottom"))),$A(this).attr("data-original-left",parseInt($A(this).css("left"))),$A(this).attr("data-original-width",parseInt($A(this).css("width"))),$A(this).attr("data-original-height",parseInt($A(this).css("height"))),$A(this).attr("data-original-line-height",parseInt($A(this).css("line-height"))),$A(this).attr("data-original","1"));var e=parseInt($A(this).attr("data-original-top")),t=parseInt($A(this).attr("data-original-right")),n=parseInt($A(this).attr("data-original-bottom")),r=parseInt($A(this).attr("data-original-left")),a=parseInt($A(this).attr("data-original-width")),s=parseInt($A(this).attr("data-original-height")),o=parseInt($A(this).attr("data-original-line-height")),l={};e>0&&(l.top=e*i),t>0&&(l.right=t*i),n>0&&(l.bottom=n*i),r>0&&(l.left=r*i),a>0&&(l.width=a*i),s>0&&(l.height=s*i),o>0&&(l["line-height"]=o*i+"px"),$A(this).css(l)})),i},loadScript:function(e,t){var i=this;if(this.rightExists(e,".css"))this.loadCss(e,t);else if(!0!==this.__loadScript[e]){var r=document.createElement("script");r.type="text/javascript",r.readyState?r.onreadystatechange=function(){"loaded"!==r.readyState&&"complete"!==r.readyState||(r.onreadystatechange=null,i.__loadScript[e]=!0,"function"==typeof t&&t())}:r.onload=function(){i.__loadScript[e]=!0,"function"==typeof t&&t()},this.rightExists(e,".js")?r.src=e+"?hash="+n.systemInformation.version:r.src=e,document.body.appendChild(r)}else"function"==typeof t&&t()},loadScriptS:function(e,t){var n=this,i=0;this.loadScript(e[0],(function r(){++i0){for(var n="",i=0;i0&&a.push(u.join("&"))}else null===e[l]?a.push(s(l)+"="):"object"===i(e[l])?((n=t.slice()).push(l),""!==(u=r.serializeObject(e[l],n))&&a.push(u)):void 0!==e[l]&&""!==e[l]?a.push(s(l)+"="+o(e[l])):""===e[l]&&a.push(s(l))}return a.join("&")},globalAjaxOptions:{},ajaxSetup:function(e){e.type&&(e.method=e.type),r.each(e,(function(e,t){r.globalAjaxOptions[e]=t}))},_jsonpRequests:0,ihttp:function(e){var t={method:"GET",data:!1,async:!0,cache:!0,user:"",password:"",headers:{},xhrFields:{},statusCode:{},processData:!0,dataType:"text",contentType:"application/x-www-form-urlencoded",timeout:0},i=["beforeSend","error","complete","success","statusCode"];function s(t,n,i){var a=arguments;t&&r(document).trigger(t,n),i&&(i in r.globalAjaxOptions&&r.globalAjaxOptions[i](a[3],a[4],a[5],a[6]),e[i]&&e[i](a[3],a[4],a[5],a[6]))}e.type&&(e.method=e.type),r.each(r.globalAjaxOptions,(function(e,n){i.indexOf(e)<0&&(t[e]=n)})),r.each(t,(function(t,n){t in e||(e[t]=n)})),e.url||(e.url=n.location.toString());var o,l=e.url.indexOf("?")>=0?"&":"?",u=e.method.toUpperCase();"GET"!==u&&"HEAD"!==u&&"OPTIONS"!==u&&"DELETE"!==u||!e.data||(o="string"==typeof e.data?e.data.indexOf("?")>=0?e.data.split("?")[1]:e.data:r.serializeObject(e.data)).length&&(e.url+=l+o,"?"===l&&(l="&"));if("json"===e.dataType&&e.url.indexOf("callback=")>=0){var c,d="f7jsonp_"+Date.now()+r._jsonpRequests++,h=e.url.split("callback="),f=h[0]+"callback="+d;if(h[1].indexOf("&")>=0){var p=h[1].split("&").filter((function(e){return e.indexOf("=")>0})).join("&");p.length>0&&(f+="&"+p)}var m=document.createElement("script");return m.type="text/javascript",m.onerror=function(){clearTimeout(c),s(a,a,"error",null,"scripterror"),s("ajaxComplete ajax:complete",{scripterror:!0},"complete",null,"scripterror")},m.src=f,n[d]=function(e){clearTimeout(c),s(a,a,"success",e),m.parentNode.removeChild(m),m=null,delete n[d]},document.querySelector("head").appendChild(m),void(e.timeout>0&&(c=setTimeout((function(){m.parentNode.removeChild(m),m=null,s(a,a,"error",null,"timeout")}),e.timeout)))}"GET"!==u&&"HEAD"!==u&&"OPTIONS"!==u&&"DELETE"!==u||!1===e.cache&&(e.url+=l+"_nocache="+Date.now());var v=new XMLHttpRequest;v.requestUrl=e.url,v.requestParameters=e,v.open(u,e.url,e.async,e.user,e.password);var g,b=null;if(("POST"===u||"PUT"===u||"PATCH"===u)&&e.data)if(e.processData)if([ArrayBuffer,Blob,Document,FormData].indexOf(e.data.constructor)>=0)b=e.data;else{var y="---------------------------"+Date.now().toString(16);"multipart/form-data"===e.contentType?v.setRequestHeader("Content-Type","multipart/form-data; boundary="+y):v.setRequestHeader("Content-Type",e.contentType),b="";var _=r.serializeObject(e.data);if("multipart/form-data"===e.contentType){y="---------------------------"+Date.now().toString(16),_=_.split("&");for(var w=[],x=0;x<_.length;x++)w.push('Content-Disposition: form-data; name="'+_[x].split("=")[0]+'"\r\n\r\n'+_[x].split("=")[1]+"\r\n");b="--"+y+"\r\n"+w.join("--"+y+"\r\n")+"--"+y+"--\r\n"}else b=_}else b=e.data;return e.headers&&r.each(e.headers,(function(e,t){v.setRequestHeader(e,t)})),void 0===e.crossDomain&&(e.crossDomain=/^([\w-]+:)?\/\/([^\/]+)/.test(e.url)&&RegExp.$2!==n.location.host),e.crossDomain||v.setRequestHeader("X-Requested-With","XMLHttpRequest"),e.xhrFields&&r.each(e.xhrFields,(function(e,t){v[e]=t})),v.onload=function(t){var n;if(g&&clearTimeout(g),v.status>=200&&v.status<300||0===v.status)if("json"===e.dataType)try{n=JSON.parse(v.responseText),s("ajaxSuccess ajax:success",{xhr:v},"success",n,v.status,v)}catch(e){console.error(e),s("ajaxError ajax:error",{xhr:v,parseerror:!0},"error",v,"parseerror")}else n="text"===v.responseType||""===v.responseType?v.responseText:v.response,s("ajaxSuccess ajax:success",{xhr:v},"success",n,v.status,v);else s("ajaxError ajax:error",{xhr:v},"error",v,v.status);e.statusCode&&(r.globalAjaxOptions.statusCode&&r.globalAjaxOptions.statusCode[v.status]&&r.globalAjaxOptions.statusCode[v.status](v),e.statusCode[v.status]&&e.statusCode[v.status](v)),s("ajaxComplete ajax:complete",{xhr:v},"complete",v,v.status)},v.onerror=function(e){g&&clearTimeout(g),s("ajaxError ajax:error",{xhr:v},"error",v,v.status),s("ajaxComplete ajax:complete",{xhr:v,error:!0},"complete",v,"error")},s("ajaxStart ajax:start",{xhr:v},"start",v),s(a,a,"beforeSend",v),e.timeout>0&&(v.onabort=function(){g&&clearTimeout(g)},g=setTimeout((function(){v.abort(),s("ajaxError ajax:error",{xhr:v,timeout:!0},"error",v,"timeout"),s("ajaxComplete ajax:complete",{xhr:v,timeout:!0},"complete",v,"timeout")}),e.timeout)),v.send(b),v}}),r.extend({ajaxc:function(e){return!!e&&(void 0!==e.url&&(void 0===e.data&&(e.data={}),void 0===e.cache&&(e.cache=!1),void 0===e.method&&(e.method="GET"),void 0===e.timeout&&(e.timeout=3e4),void 0===e.dataType&&(e.dataType="json"),void 0===e.before&&(e.before=function(){}),void 0===e.complete&&(e.complete=function(){}),void 0===e.after&&(e.after=function(){}),void 0===e.success&&(e.success=function(){}),void 0===e.error&&(e.error=function(){}),void 0===e.header&&(e.header={}),e.before(),void $A.ihttp({url:e.url,data:e.data,cache:e.cache,headers:e.header,method:e.method.toUpperCase(),contentType:"OPTIONS",crossDomain:!0,dataType:e.dataType,timeout:e.timeout,success:function(t,n,i){e.complete(),e.success(t,n,i),e.after(!0)},error:function(t,n){e.complete(),e.error(t,n),e.after(!1)}})))}}),r.extend({date2string:function(e,t){if(null===e)return e;if(void 0===t&&(t="Y-m-d H:i:s"),e instanceof Date)e=$A.formatDate(t,e);else if($A.isJson(e))for(var n in e)e.hasOwnProperty(n)&&(e[n]=$A.date2string(e[n],t));else $A.isArray(e)&&e.forEach((function(n,i){e[i]=$A.date2string(n,t)}));return e},getData:function(e){var t=arguments.length>1&&arguments[1]!==a&&arguments[1],n=new Date,i=n.getDay(),r=n.getDate(),s=n.getMonth(),o=n.getYear();o+=o<2e3?1900:0;var l=new Date;l.setDate(1),l.setMonth(l.getMonth()-1);var u=l.getMonth(),c=function(){var e=0;return s<3&&(e=0),28&&(e=9),e},d=function(e){var t=new Date(o,e,1);return(new Date(o,e+1,1)-t)/864e5},h=n.getTime();switch(e){case"今天":h=n;break;case"昨天":h=n-864e5;break;case"前天":h=n-1728e5;break;case"本周":h=new Date(o,s,r-i);break;case"本周结束":h=new Date(o,s,r+(6-i));break;case"上周":h=new Date(o,s,r-i-7);break;case"上周结束":h=new Date(o,s,r-i-1);break;case"本周2":h=new Date(o,s,r-i+1);break;case"本周结束2":h=new Date(o,s,r+(6-i)+1);break;case"上周2":h=new Date(o,s,r-i-7+1);break;case"上周结束2":h=new Date(o,s,r-i-1+1);break;case"本月":h=new Date(o,s,1);break;case"本月结束":h=new Date(o,s,d(s));break;case"上个月":h=new Date(o,u,1);break;case"上个月结束":h=new Date(o,u,d(u));break;case"本季度":h=new Date(o,c(),1);break;case"本季度结束":var f=c()+2;h=new Date(o,f,d(f))}return!0===t?h:$A.formatDate("Y-m-d",parseInt(h/1e3))},bytesToSize:function(e){if(0===e)return"0 B";var t=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],n=Math.floor(Math.log(e)/Math.log(1024));return void 0===t[n]?"0 B":$A.runNum(e/Math.pow(1024,n),2)+" "+t[n]},html2Escape:function(e){return e&&""!=e?e.replace(/[<>&"]/g,(function(e){return{"<":"<",">":">","&":"&",'"':"""}[e]})):""},sreachHighlight:function(e,t){return e&&""!=e?t&&""!=t?e=(e=(e=$A.html2Escape(e.replace(new RegExp(t,"g"),"[highlight]"+t+"[/highlight]"))).replace(/\[highlight\]/g,'')).replace(/\[\/highlight\]/g,""):$A.html2Escape(e):""}}),n.$A=r}(window,window.jQuery)},92693:()=>{!function(e){var t=e.$A;t.extend({modalConfig:function(e){return void 0===e?e={content:"Undefined"}:"string"==typeof e&&(e={content:e}),e.title=$A.L(e.title||(void 0===e.render?"温馨提示":"")),e.content=$A.L(e.content||""),e.okText=$A.L(e.okText||"确定"),e.cancelText=$A.L(e.cancelText||"取消"),e},modalInput:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t>0)setTimeout((function(){$A.modalInput(e)}),t);else{"string"==typeof e&&(e={title:e});var n="modalInput_"+$A.randomString(6);$A.Modal.confirm({render:function(t){return t("div",[t("div",{style:{fontSize:"16px",fontWeight:"500",marginBottom:"20px"}},$A.L(e.title)),t("Input",{props:{value:e.value,placeholder:$A.L(e.placeholder),elementId:n},on:{input:function(t){e.value=t}}})])},loading:!0,onOk:function(){"function"==typeof e.onOk?!0===e.onOk(e.value,(function(){$A.Modal.remove()}))&&$A.Modal.remove():$A.Modal.remove()}}),setTimeout((function(){document.getElementById(n)&&document.getElementById(n).focus()}))}},modalConfirm:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t>0?setTimeout((function(){$A.modalConfirm(e)}),t):$A.Modal.confirm($A.modalConfig(e))},modalSuccess:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t>0?setTimeout((function(){$A.modalSuccess(e)}),t):$A.Modal.success($A.modalConfig(e))},modalInfo:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t>0?setTimeout((function(){$A.modalInfo(e)}),t):$A.Modal.info($A.modalConfig(e))},modalWarning:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t>0?setTimeout((function(){$A.modalWarning(e)}),t):$A.Modal.warning($A.modalConfig(e))},modalError:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t>0?setTimeout((function(){$A.modalError(e)}),t):$A.Modal.error($A.modalConfig(e))},modalAlert:function(e){alert($A.L(e))},messageSuccess:function(e){$A.Message.success($A.L(e))},messageWarning:function(e){$A.Message.warning($A.L(e))},messageError:function(e){$A.Message.error($A.L(e))},noticeConfig:function(e){return void 0===e?e={desc:"Undefined"}:"string"==typeof e&&(e={desc:e}),e.title=$A.L(e.title||(void 0===e.render?"温馨提示":"")),e.desc=$A.L(e.desc||""),e},noticeSuccess:function(e){$A.Notice.success($A.noticeConfig(e))},noticeWarning:function(e){$A.Notice.warning($A.noticeConfig(e))},noticeError:function(e){"string"==typeof e&&(e={desc:e,duration:6}),$A.Notice.error($A.noticeConfig(e))}}),e.$A=t}(window)},31108:(e,t)=>{t.Z=[{CN:"登录",EN:"Log in",TC:"登錄",KM:"ចូល",TH:"เข้าสู่ระบบ",KO:"로그인",JA:"ログインする"}]},52945:(e,t,n)=>{e.exports={default:n(56981),__esModule:!0}},93516:(e,t,n)=>{e.exports={default:n(80025),__esModule:!0}},64275:(e,t,n)=>{e.exports={default:n(52392),__esModule:!0}},88239:(e,t,n)=>{"use strict";var i,r=n(52945),a=(i=r)&&i.__esModule?i:{default:i};t.Z=a.default||function(e){for(var t=1;t{"use strict";var i=s(n(64275)),r=s(n(93516)),a="function"==typeof r.default&&"symbol"==typeof i.default?function(e){return typeof e}:function(e){return e&&"function"==typeof r.default&&e.constructor===r.default&&e!==r.default.prototype?"symbol":typeof e};function s(e){return e&&e.__esModule?e:{default:e}}t.Z="function"==typeof r.default&&"symbol"===a(i.default)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof r.default&&e.constructor===r.default&&e!==r.default.prototype?"symbol":void 0===e?"undefined":a(e)}},56981:(e,t,n)=>{n(72699),e.exports=n(34579).Object.assign},80025:(e,t,n)=>{n(46840),n(94058),n(8174),n(36461),e.exports=n(34579).Symbol},52392:(e,t,n)=>{n(91867),n(73871),e.exports=n(25103).f("iterator")},85663:e=>{e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},79003:e=>{e.exports=function(){}},12159:(e,t,n)=>{var i=n(36727);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},57428:(e,t,n)=>{var i=n(7932),r=n(78728),a=n(16531);e.exports=function(e){return function(t,n,s){var o,l=i(t),u=r(l.length),c=a(s,u);if(e&&n!=n){for(;u>c;)if((o=l[c++])!=o)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}}},32894:e=>{var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},34579:e=>{var t=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=t)},19216:(e,t,n)=>{var i=n(85663);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},8333:e=>{e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},89666:(e,t,n)=>{e.exports=!n(7929)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},97467:(e,t,n)=>{var i=n(36727),r=n(33938).document,a=i(r)&&i(r.createElement);e.exports=function(e){return a?r.createElement(e):{}}},73338:e=>{e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},70337:(e,t,n)=>{var i=n(46162),r=n(48195),a=n(86274);e.exports=function(e){var t=i(e),n=r.f;if(n)for(var s,o=n(e),l=a.f,u=0;o.length>u;)l.call(e,s=o[u++])&&t.push(s);return t}},83856:(e,t,n)=>{var i=n(33938),r=n(34579),a=n(19216),s=n(41818),o=n(27069),l=function(e,t,n){var u,c,d,h=e&l.F,f=e&l.G,p=e&l.S,m=e&l.P,v=e&l.B,g=e&l.W,b=f?r:r[t]||(r[t]={}),y=b.prototype,_=f?i:p?i[t]:(i[t]||{}).prototype;for(u in f&&(n=t),n)(c=!h&&_&&void 0!==_[u])&&o(b,u)||(d=c?_[u]:n[u],b[u]=f&&"function"!=typeof _[u]?n[u]:v&&c?a(d,i):g&&_[u]==d?function(e){var t=function(t,n,i){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,i)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(d):m&&"function"==typeof d?a(Function.call,d):d,m&&((b.virtual||(b.virtual={}))[u]=d,e&l.R&&y&&!y[u]&&s(y,u,d)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},7929:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},33938:e=>{var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},27069:e=>{var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},41818:(e,t,n)=>{var i=n(4743),r=n(83101);e.exports=n(89666)?function(e,t,n){return i.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},54881:(e,t,n)=>{var i=n(33938).document;e.exports=i&&i.documentElement},33758:(e,t,n)=>{e.exports=!n(89666)&&!n(7929)((function(){return 7!=Object.defineProperty(n(97467)("div"),"a",{get:function(){return 7}}).a}))},50799:(e,t,n)=>{var i=n(32894);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},71421:(e,t,n)=>{var i=n(32894);e.exports=Array.isArray||function(e){return"Array"==i(e)}},36727:e=>{e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},33945:(e,t,n)=>{"use strict";var i=n(98989),r=n(83101),a=n(25378),s={};n(41818)(s,n(22939)("iterator"),(function(){return this})),e.exports=function(e,t,n){e.prototype=i(s,{next:r(1,n)}),a(e,t+" Iterator")}},45700:(e,t,n)=>{"use strict";var i=n(16227),r=n(83856),a=n(57470),s=n(41818),o=n(15449),l=n(33945),u=n(25378),c=n(95089),d=n(22939)("iterator"),h=!([].keys&&"next"in[].keys()),f="keys",p="values",m=function(){return this};e.exports=function(e,t,n,v,g,b,y){l(n,t,v);var _,w,x,C=function(e){if(!h&&e in $)return $[e];switch(e){case f:case p:return function(){return new n(this,e)}}return function(){return new n(this,e)}},k=t+" Iterator",S=g==p,O=!1,$=e.prototype,D=$[d]||$["@@iterator"]||g&&$[g],T=D||C(g),M=g?S?C("entries"):T:void 0,P="Array"==t&&$.entries||D;if(P&&(x=c(P.call(new e)))!==Object.prototype&&x.next&&(u(x,k,!0),i||"function"==typeof x[d]||s(x,d,m)),S&&D&&D.name!==p&&(O=!0,T=function(){return D.call(this)}),i&&!y||!h&&!O&&$[d]||s($,d,T),o[t]=T,o[k]=m,g)if(_={values:S?T:C(p),keys:b?T:C(f),entries:M},y)for(w in _)w in $||a($,w,_[w]);else r(r.P+r.F*(h||O),t,_);return _}},85084:e=>{e.exports=function(e,t){return{value:t,done:!!e}}},15449:e=>{e.exports={}},16227:e=>{e.exports=!0},77177:(e,t,n)=>{var i=n(65730)("meta"),r=n(36727),a=n(27069),s=n(4743).f,o=0,l=Object.isExtensible||function(){return!0},u=!n(7929)((function(){return l(Object.preventExtensions({}))})),c=function(e){s(e,i,{value:{i:"O"+ ++o,w:{}}})},d=e.exports={KEY:i,NEED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,i)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[i].i},getWeak:function(e,t){if(!a(e,i)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[i].w},onFreeze:function(e){return u&&d.NEED&&l(e)&&!a(e,i)&&c(e),e}}},88082:(e,t,n)=>{"use strict";var i=n(89666),r=n(46162),a=n(48195),s=n(86274),o=n(66530),l=n(50799),u=Object.assign;e.exports=!u||n(7929)((function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach((function(e){t[e]=e})),7!=u({},e)[n]||Object.keys(u({},t)).join("")!=i}))?function(e,t){for(var n=o(e),u=arguments.length,c=1,d=a.f,h=s.f;u>c;)for(var f,p=l(arguments[c++]),m=d?r(p).concat(d(p)):r(p),v=m.length,g=0;v>g;)f=m[g++],i&&!h.call(p,f)||(n[f]=p[f]);return n}:u},98989:(e,t,n)=>{var i=n(12159),r=n(57856),a=n(73338),s=n(58989)("IE_PROTO"),o=function(){},l=function(){var e,t=n(97467)("iframe"),i=a.length;for(t.style.display="none",n(54881).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + + + + + + + + + + + + + + + + + + + diff --git a/public/js/grapheditor/js/Actions.js b/public/js/grapheditor/js/Actions.js new file mode 100644 index 000000000..fbe5fb489 --- /dev/null +++ b/public/js/grapheditor/js/Actions.js @@ -0,0 +1,1504 @@ +/** + * Copyright (c) 2006-2020, JGraph Ltd + * Copyright (c) 2006-2020, draw.io AG + * + * Constructs the actions object for the given UI. + */ +function Actions(editorUi) +{ + this.editorUi = editorUi; + this.actions = new Object(); + this.init(); +}; + +/** + * Adds the default actions. + */ +Actions.prototype.init = function() +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + var isGraphEnabled = function() + { + return Action.prototype.isEnabled.apply(this, arguments) && graph.isEnabled(); + }; + + // File actions + this.addAction('new...', function() { graph.openLink(ui.getUrl()); }); + this.addAction('open...', function() + { + window.openNew = true; + window.openKey = 'open'; + + ui.openFile(); + }); + this.addAction('import...', function() + { + window.openNew = false; + window.openKey = 'import'; + + // Closes dialog after open + window.openFile = new OpenFile(mxUtils.bind(this, function() + { + ui.hideDialog(); + })); + + window.openFile.setConsumer(mxUtils.bind(this, function(xml, filename) + { + try + { + var doc = mxUtils.parseXml(xml); + editor.graph.setSelectionCells(editor.graph.importGraphModel(doc.documentElement)); + } + catch (e) + { + mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message); + } + })); + + // Removes openFile if dialog is closed + ui.showDialog(new OpenDialog(this).container, 320, 220, true, true, function() + { + window.openFile = null; + }); + }).isEnabled = isGraphEnabled; + this.addAction('save', function() { ui.saveFile(false); }, null, null, Editor.ctrlKey + '+S').isEnabled = isGraphEnabled; + this.addAction('saveAs...', function() { ui.saveFile(true); }, null, null, Editor.ctrlKey + '+Shift+S').isEnabled = isGraphEnabled; + this.addAction('export...', function() { ui.showDialog(new ExportDialog(ui).container, 300, 296, true, true); }); + this.addAction('editDiagram...', function() + { + var dlg = new EditDiagramDialog(ui); + ui.showDialog(dlg.container, 620, 420, true, false); + dlg.init(); + }); + this.addAction('pageSetup...', function() { ui.showDialog(new PageSetupDialog(ui).container, 320, 220, true, true); }).isEnabled = isGraphEnabled; + this.addAction('print...', function() { ui.showDialog(new PrintDialog(ui).container, 300, 180, true, true); }, null, 'sprite-print', Editor.ctrlKey + '+P'); + this.addAction('preview', function() { mxUtils.show(graph, null, 10, 10); }); + + // Edit actions + this.addAction('undo', function() { ui.undo(); }, null, 'sprite-undo', Editor.ctrlKey + '+Z'); + this.addAction('redo', function() { ui.redo(); }, null, 'sprite-redo', (!mxClient.IS_WIN) ? Editor.ctrlKey + '+Shift+Z' : Editor.ctrlKey + '+Y'); + this.addAction('cut', function() { mxClipboard.cut(graph); }, null, 'sprite-cut', Editor.ctrlKey + '+X'); + this.addAction('copy', function() + { + try + { + mxClipboard.copy(graph); + } + catch (e) + { + ui.handleError(e); + } + }, null, 'sprite-copy', Editor.ctrlKey + '+C'); + this.addAction('paste', function() + { + if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) + { + mxClipboard.paste(graph); + } + }, false, 'sprite-paste', Editor.ctrlKey + '+V'); + this.addAction('pasteHere', function(evt) + { + if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) + { + graph.getModel().beginUpdate(); + try + { + var cells = mxClipboard.paste(graph); + + if (cells != null) + { + var includeEdges = true; + + for (var i = 0; i < cells.length && includeEdges; i++) + { + includeEdges = includeEdges && graph.model.isEdge(cells[i]); + } + + var t = graph.view.translate; + var s = graph.view.scale; + var dx = t.x; + var dy = t.y; + var bb = null; + + if (cells.length == 1 && includeEdges) + { + var geo = graph.getCellGeometry(cells[0]); + + if (geo != null) + { + bb = geo.getTerminalPoint(true); + } + } + + bb = (bb != null) ? bb : graph.getBoundingBoxFromGeometry(cells, includeEdges); + + if (bb != null) + { + var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx)); + var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy)); + + graph.cellsMoved(cells, x - bb.x, y - bb.y); + } + } + } + finally + { + graph.getModel().endUpdate(); + } + } + }); + + this.addAction('copySize', function(evt) + { + var cell = graph.getSelectionCell(); + + if (graph.isEnabled() && cell != null && graph.getModel().isVertex(cell)) + { + var geo = graph.getCellGeometry(cell); + + if (geo != null) + { + ui.copiedSize = new mxRectangle(geo.x, geo.y, geo.width, geo.height); + } + } + }, null, null, 'Alt+Shift+X'); + + this.addAction('pasteSize', function(evt) + { + if (graph.isEnabled() && !graph.isSelectionEmpty() && ui.copiedSize != null) + { + graph.getModel().beginUpdate(); + + try + { + var cells = graph.getSelectionCells(); + + for (var i = 0; i < cells.length; i++) + { + if (graph.getModel().isVertex(cells[i])) + { + var geo = graph.getCellGeometry(cells[i]); + + if (geo != null) + { + geo = geo.clone(); + geo.width = ui.copiedSize.width; + geo.height = ui.copiedSize.height; + + graph.getModel().setGeometry(cells[i], geo); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + } + }, null, null, 'Alt+Shift+V'); + + function deleteCells(includeEdges) + { + // Cancels interactive operations + graph.escape(); + var cells = graph.getDeletableCells(graph.getSelectionCells()); + + if (cells != null && cells.length > 0) + { + var parents = (graph.selectParentAfterDelete) ? graph.model.getParents(cells) : null; + graph.removeCells(cells, includeEdges); + + // Selects parents for easier editing of groups + if (parents != null) + { + var select = []; + + for (var i = 0; i < parents.length; i++) + { + if (graph.model.contains(parents[i]) && + (graph.model.isVertex(parents[i]) || + graph.model.isEdge(parents[i]))) + { + select.push(parents[i]); + } + } + + graph.setSelectionCells(select); + } + } + }; + + this.addAction('delete', function(evt) + { + deleteCells(evt != null && mxEvent.isShiftDown(evt)); + }, null, null, 'Delete'); + this.addAction('deleteAll', function() + { + deleteCells(true); + }, null, null, Editor.ctrlKey + '+Delete'); + this.addAction('duplicate', function() + { + try + { + graph.setSelectionCells(graph.duplicateCells()); + } + catch (e) + { + ui.handleError(e); + } + }, null, null, Editor.ctrlKey + '+D'); + this.put('turn', new Action(mxResources.get('turn') + ' / ' + mxResources.get('reverse'), function(evt) + { + graph.turnShapes(graph.getSelectionCells(), (evt != null) ? mxEvent.isShiftDown(evt) : false); + }, null, null, Editor.ctrlKey + '+R')); + this.addAction('selectVertices', function() { graph.selectVertices(null, true); }, null, null, Editor.ctrlKey + '+Shift+I'); + this.addAction('selectEdges', function() { graph.selectEdges(); }, null, null, Editor.ctrlKey + '+Shift+E'); + this.addAction('selectAll', function() { graph.selectAll(null, true); }, null, null, Editor.ctrlKey + '+A'); + this.addAction('selectNone', function() { graph.clearSelection(); }, null, null, Editor.ctrlKey + '+Shift+A'); + this.addAction('lockUnlock', function() + { + if (!graph.isSelectionEmpty()) + { + graph.getModel().beginUpdate(); + try + { + var defaultValue = graph.isCellMovable(graph.getSelectionCell()) ? 1 : 0; + graph.toggleCellStyles(mxConstants.STYLE_MOVABLE, defaultValue); + graph.toggleCellStyles(mxConstants.STYLE_RESIZABLE, defaultValue); + graph.toggleCellStyles(mxConstants.STYLE_ROTATABLE, defaultValue); + graph.toggleCellStyles(mxConstants.STYLE_DELETABLE, defaultValue); + graph.toggleCellStyles(mxConstants.STYLE_EDITABLE, defaultValue); + graph.toggleCellStyles('connectable', defaultValue); + } + finally + { + graph.getModel().endUpdate(); + } + } + }, null, null, Editor.ctrlKey + '+L'); + + // Navigation actions + this.addAction('home', function() { graph.home(); }, null, null, 'Home'); + this.addAction('exitGroup', function() { graph.exitGroup(); }, null, null, Editor.ctrlKey + '+Shift+Home'); + this.addAction('enterGroup', function() { graph.enterGroup(); }, null, null, Editor.ctrlKey + '+Shift+End'); + this.addAction('collapse', function() { graph.foldCells(true); }, null, null, Editor.ctrlKey + '+Home'); + this.addAction('expand', function() { graph.foldCells(false); }, null, null, Editor.ctrlKey + '+End'); + + // Arrange actions + this.addAction('toFront', function() { graph.orderCells(false); }, null, null, Editor.ctrlKey + '+Shift+F'); + this.addAction('toBack', function() { graph.orderCells(true); }, null, null, Editor.ctrlKey + '+Shift+B'); + this.addAction('group', function() + { + if (graph.getSelectionCount() == 1) + { + graph.setCellStyles('container', '1'); + } + else + { + graph.setSelectionCell(graph.groupCells(null, 0)); + } + }, null, null, Editor.ctrlKey + '+G'); + this.addAction('ungroup', function() + { + if (graph.getSelectionCount() == 1 && graph.getModel().getChildCount(graph.getSelectionCell()) == 0) + { + graph.setCellStyles('container', '0'); + } + else + { + graph.setSelectionCells(graph.ungroupCells()); + } + }, null, null, Editor.ctrlKey + '+Shift+U'); + this.addAction('removeFromGroup', function() { graph.removeCellsFromParent(); }); + // Adds action + this.addAction('edit', function() + { + if (graph.isEnabled()) + { + graph.startEditingAtCell(); + } + }, null, null, 'F2/Enter'); + this.addAction('editData...', function() + { + var cell = graph.getSelectionCell() || graph.getModel().getRoot(); + ui.showDataDialog(cell); + }, null, null, Editor.ctrlKey + '+M'); + this.addAction('editTooltip...', function() + { + var graph = ui.editor.graph; + + if (graph.isEnabled() && !graph.isSelectionEmpty()) + { + var cell = graph.getSelectionCell(); + var tooltip = ''; + + if (mxUtils.isNode(cell.value)) + { + var tmp = cell.value.getAttribute('tooltip'); + + if (tmp != null) + { + tooltip = tmp; + } + } + + var dlg = new TextareaDialog(ui, mxResources.get('editTooltip') + ':', tooltip, function(newValue) + { + graph.setTooltipForCell(cell, newValue); + }); + ui.showDialog(dlg.container, 320, 200, true, true); + dlg.init(); + } + }, null, null, 'Alt+Shift+T'); + this.addAction('openLink', function() + { + var link = graph.getLinkForCell(graph.getSelectionCell()); + + if (link != null) + { + graph.openLink(link); + } + }); + this.addAction('editLink...', function() + { + var graph = ui.editor.graph; + + if (graph.isEnabled() && !graph.isSelectionEmpty()) + { + var cell = graph.getSelectionCell(); + var value = graph.getLinkForCell(cell) || ''; + + ui.showLinkDialog(value, mxResources.get('apply'), function(link) + { + link = mxUtils.trim(link); + graph.setLinkForCell(cell, (link.length > 0) ? link : null); + }); + } + }, null, null, 'Alt+Shift+L'); + this.put('insertImage', new Action(mxResources.get('image') + '...', function() + { + if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) + { + graph.clearSelection(); + ui.actions.get('image').funct(); + } + })).isEnabled = isGraphEnabled; + this.put('insertLink', new Action(mxResources.get('link') + '...', function() + { + if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) + { + ui.showLinkDialog('', mxResources.get('insert'), function(link, docs) + { + link = mxUtils.trim(link); + + if (link.length > 0) + { + var icon = null; + var title = graph.getLinkTitle(link); + + if (docs != null && docs.length > 0) + { + icon = docs[0].iconUrl; + title = docs[0].name || docs[0].type; + title = title.charAt(0).toUpperCase() + title.substring(1); + + if (title.length > 30) + { + title = title.substring(0, 30) + '...'; + } + } + + var pt = graph.getFreeInsertPoint(); + var linkCell = new mxCell(title, new mxGeometry(pt.x, pt.y, 100, 40), + 'fontColor=#0000EE;fontStyle=4;rounded=1;overflow=hidden;' + ((icon != null) ? + 'shape=label;imageWidth=16;imageHeight=16;spacingLeft=26;align=left;image=' + icon : + 'spacing=10;')); + linkCell.vertex = true; + + graph.setLinkForCell(linkCell, link); + graph.cellSizeUpdated(linkCell, true); + + graph.getModel().beginUpdate(); + try + { + linkCell = graph.addCell(linkCell); + graph.fireEvent(new mxEventObject('cellsInserted', 'cells', [linkCell])); + } + finally + { + graph.getModel().endUpdate(); + } + + graph.setSelectionCell(linkCell); + graph.scrollCellToVisible(graph.getSelectionCell()); + } + }); + } + })).isEnabled = isGraphEnabled; + this.addAction('link...', mxUtils.bind(this, function() + { + var graph = ui.editor.graph; + + if (graph.isEnabled()) + { + if (graph.cellEditor.isContentEditing()) + { + var elt = graph.getSelectedElement(); + var link = graph.getParentByName(elt, 'A', graph.cellEditor.textarea); + var oldValue = ''; + + // Workaround for FF returning the outermost selected element after double + // click on a DOM hierarchy with a link inside (but not as topmost element) + if (link == null && elt != null && elt.getElementsByTagName != null) + { + // Finds all links in the selected DOM and uses the link + // where the selection text matches its text content + var links = elt.getElementsByTagName('a'); + + for (var i = 0; i < links.length && link == null; i++) + { + if (links[i].textContent == elt.textContent) + { + link = links[i]; + } + } + } + + if (link != null && link.nodeName == 'A') + { + oldValue = link.getAttribute('href') || ''; + graph.selectNode(link); + } + + var selState = graph.cellEditor.saveSelection(); + + ui.showLinkDialog(oldValue, mxResources.get('apply'), mxUtils.bind(this, function(value) + { + graph.cellEditor.restoreSelection(selState); + + if (value != null) + { + graph.insertLink(value); + } + })); + } + else if (graph.isSelectionEmpty()) + { + this.get('insertLink').funct(); + } + else + { + this.get('editLink').funct(); + } + } + })).isEnabled = isGraphEnabled; + this.addAction('autosize', function() + { + var cells = graph.getSelectionCells(); + + if (cells != null) + { + graph.getModel().beginUpdate(); + try + { + for (var i = 0; i < cells.length; i++) + { + var cell = cells[i]; + + if (graph.getModel().getChildCount(cell)) + { + graph.updateGroupBounds([cell], 20); + } + else + { + var state = graph.view.getState(cell); + var geo = graph.getCellGeometry(cell); + + if (graph.getModel().isVertex(cell) && state != null && state.text != null && + geo != null && graph.isWrapping(cell)) + { + geo = geo.clone(); + geo.height = state.text.boundingBox.height / graph.view.scale; + graph.getModel().setGeometry(cell, geo); + } + else + { + graph.updateCellSize(cell); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + } + }, null, null, Editor.ctrlKey + '+Shift+Y'); + this.addAction('formattedText', function() + { + var refState = graph.getView().getState(graph.getSelectionCell()); + + if (refState != null) + { + graph.stopEditing(); + var value = (refState.style['html'] == '1') ? null : '1'; + + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + + for (var i = 0; i < cells.length; i++) + { + state = graph.getView().getState(cells[i]); + + if (state != null) + { + var html = mxUtils.getValue(state.style, 'html', '0'); + + if (html == '1' && value == null) + { + var label = graph.convertValueToString(state.cell); + + if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0') + { + // Removes newlines from HTML and converts breaks to newlines + // to match the HTML output in plain text + label = label.replace(/\n/g, '').replace(//g, '\n'); + } + + // Removes HTML tags + var temp = document.createElement('div'); + temp.innerHTML = label; + label = mxUtils.extractTextWithWhitespace(temp.childNodes); + + graph.cellLabelChanged(state.cell, label); + graph.setCellStyles('html', value, [cells[i]]); + } + else if (html == '0' && value == '1') + { + // Converts HTML tags to text + var label = mxUtils.htmlEntities(graph.convertValueToString(state.cell), false); + + if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0') + { + // Converts newlines in plain text to breaks in HTML + // to match the plain text output + label = label.replace(/\n/g, '
'); + } + + graph.cellLabelChanged(state.cell, graph.sanitizeHtml(label)); + graph.setCellStyles('html', value, [cells[i]]); + } + } + } + + ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['html'], + 'values', [(value != null) ? value : '0'], 'cells', cells)); + } + finally + { + graph.getModel().endUpdate(); + } + } + }); + this.addAction('wordWrap', function() + { + var state = graph.getView().getState(graph.getSelectionCell()); + var value = 'wrap'; + + graph.stopEditing(); + + if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') + { + value = null; + } + + graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value); + }); + this.addAction('rotation', function() + { + var value = '0'; + var state = graph.getView().getState(graph.getSelectionCell()); + + if (state != null) + { + value = state.style[mxConstants.STYLE_ROTATION] || value; + } + + var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), function(newValue) + { + if (newValue != null && newValue.length > 0) + { + graph.setCellStyles(mxConstants.STYLE_ROTATION, newValue); + } + }, mxResources.get('enterValue') + ' (' + mxResources.get('rotation') + ' 0-360)'); + + ui.showDialog(dlg.container, 375, 80, true, true); + dlg.init(); + }); + // View actions + this.addAction('resetView', function() + { + graph.zoomTo(1); + ui.resetScrollbars(); + }, null, null, Editor.ctrlKey + '+H'); + this.addAction('zoomIn', function(evt) + { + if (graph.isFastZoomEnabled()) + { + graph.lazyZoom(true, true, ui.buttonZoomDelay); + } + else + { + graph.zoomIn(); + } + }, null, null, Editor.ctrlKey + ' + (Numpad) / Alt+Mousewheel'); + this.addAction('zoomOut', function(evt) + { + if (graph.isFastZoomEnabled()) + { + graph.lazyZoom(false, true, ui.buttonZoomDelay); + } + else + { + graph.zoomOut(); + } + }, null, null, Editor.ctrlKey + ' - (Numpad) / Alt+Mousewheel'); + this.addAction('fitWindow', function() + { + var bounds = (graph.isSelectionEmpty()) ? graph.getGraphBounds() : graph.getBoundingBox(graph.getSelectionCells()); + var t = graph.view.translate; + var s = graph.view.scale; + bounds.width /= s; + bounds.height /= s; + bounds.x = bounds.x / s - t.x; + bounds.y = bounds.y / s - t.y; + + var cw = graph.container.clientWidth - 10; + var ch = graph.container.clientHeight - 10; + var scale = Math.floor(20 * Math.min(cw / bounds.width, ch / bounds.height)) / 20; + graph.zoomTo(scale); + + if (mxUtils.hasScrollbars(graph.container)) + { + graph.container.scrollTop = (bounds.y + t.y) * scale - + Math.max((ch - bounds.height * scale) / 2 + 5, 0); + graph.container.scrollLeft = (bounds.x + t.x) * scale - + Math.max((cw - bounds.width * scale) / 2 + 5, 0); + } + }, null, null, Editor.ctrlKey + '+Shift+H'); + this.addAction('fitPage', mxUtils.bind(this, function() + { + if (!graph.pageVisible) + { + this.get('pageView').funct(); + } + + var fmt = graph.pageFormat; + var ps = graph.pageScale; + var cw = graph.container.clientWidth - 10; + var ch = graph.container.clientHeight - 10; + var scale = Math.floor(20 * Math.min(cw / fmt.width / ps, ch / fmt.height / ps)) / 20; + graph.zoomTo(scale); + + if (mxUtils.hasScrollbars(graph.container)) + { + var pad = graph.getPagePadding(); + graph.container.scrollTop = pad.y * graph.view.scale - 1; + graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, (graph.container.scrollWidth - graph.container.clientWidth) / 2) - 1; + } + }), null, null, Editor.ctrlKey + '+J'); + this.addAction('fitTwoPages', mxUtils.bind(this, function() + { + if (!graph.pageVisible) + { + this.get('pageView').funct(); + } + + var fmt = graph.pageFormat; + var ps = graph.pageScale; + var cw = graph.container.clientWidth - 10; + var ch = graph.container.clientHeight - 10; + + var scale = Math.floor(20 * Math.min(cw / (2 * fmt.width) / ps, ch / fmt.height / ps)) / 20; + graph.zoomTo(scale); + + if (mxUtils.hasScrollbars(graph.container)) + { + var pad = graph.getPagePadding(); + graph.container.scrollTop = Math.min(pad.y, (graph.container.scrollHeight - graph.container.clientHeight) / 2); + graph.container.scrollLeft = Math.min(pad.x, (graph.container.scrollWidth - graph.container.clientWidth) / 2); + } + }), null, null, Editor.ctrlKey + '+Shift+J'); + this.addAction('fitPageWidth', mxUtils.bind(this, function() + { + if (!graph.pageVisible) + { + this.get('pageView').funct(); + } + + var fmt = graph.pageFormat; + var ps = graph.pageScale; + var cw = graph.container.clientWidth - 10; + + var scale = Math.floor(20 * cw / fmt.width / ps) / 20; + graph.zoomTo(scale); + + if (mxUtils.hasScrollbars(graph.container)) + { + var pad = graph.getPagePadding(); + graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, + (graph.container.scrollWidth - graph.container.clientWidth) / 2); + } + })); + this.put('customZoom', new Action(mxResources.get('custom') + '...', mxUtils.bind(this, function() + { + var dlg = new FilenameDialog(this.editorUi, parseInt(graph.getView().getScale() * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue) + { + var val = parseInt(newValue); + + if (!isNaN(val) && val > 0) + { + graph.zoomTo(val / 100); + } + }), mxResources.get('zoom') + ' (%)'); + this.editorUi.showDialog(dlg.container, 300, 80, true, true); + dlg.init(); + }), null, null, Editor.ctrlKey + '+0')); + this.addAction('pageScale...', mxUtils.bind(this, function() + { + var dlg = new FilenameDialog(this.editorUi, parseInt(graph.pageScale * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue) + { + var val = parseInt(newValue); + + if (!isNaN(val) && val > 0) + { + var change = new ChangePageSetup(ui, null, null, null, val / 100); + change.ignoreColor = true; + change.ignoreImage = true; + + graph.model.execute(change); + } + }), mxResources.get('pageScale') + ' (%)'); + this.editorUi.showDialog(dlg.container, 300, 80, true, true); + dlg.init(); + })); + + // Option actions + var action = null; + action = this.addAction('grid', function() + { + graph.setGridEnabled(!graph.isGridEnabled()); + ui.fireEvent(new mxEventObject('gridEnabledChanged')); + }, null, null, Editor.ctrlKey + '+Shift+G'); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.isGridEnabled(); }); + action.setEnabled(false); + + action = this.addAction('guides', function() + { + graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled; + ui.fireEvent(new mxEventObject('guidesEnabledChanged')); + }); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.graphHandler.guidesEnabled; }); + action.setEnabled(false); + + action = this.addAction('tooltips', function() + { + graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled()); + }); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.tooltipHandler.isEnabled(); }); + + action = this.addAction('collapseExpand', function() + { + var change = new ChangePageSetup(ui); + change.ignoreColor = true; + change.ignoreImage = true; + change.foldingEnabled = !graph.foldingEnabled; + + graph.model.execute(change); + }); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.foldingEnabled; }); + action.isEnabled = isGraphEnabled; + action = this.addAction('scrollbars', function() + { + ui.setScrollbars(!ui.hasScrollbars()); + }); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.scrollbars; }); + action = this.addAction('pageView', mxUtils.bind(this, function() + { + ui.setPageVisible(!graph.pageVisible); + })); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.pageVisible; }); + action = this.addAction('connectionArrows', function() + { + graph.connectionArrowsEnabled = !graph.connectionArrowsEnabled; + ui.fireEvent(new mxEventObject('connectionArrowsChanged')); + }, null, null, 'Alt+Shift+A'); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.connectionArrowsEnabled; }); + action = this.addAction('connectionPoints', function() + { + graph.setConnectable(!graph.connectionHandler.isEnabled()); + ui.fireEvent(new mxEventObject('connectionPointsChanged')); + }, null, null, 'Alt+Shift+P'); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.connectionHandler.isEnabled(); }); + action = this.addAction('copyConnect', function() + { + graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget()); + ui.fireEvent(new mxEventObject('copyConnectChanged')); + }); + action.setToggleAction(true); + action.setSelectedCallback(function() { return graph.connectionHandler.isCreateTarget(); }); + action.isEnabled = isGraphEnabled; + action = this.addAction('autosave', function() + { + ui.editor.setAutosave(!ui.editor.autosave); + }); + action.setToggleAction(true); + action.setSelectedCallback(function() { return ui.editor.autosave; }); + action.isEnabled = isGraphEnabled; + action.visible = false; + + // Help actions + this.addAction('help', function() + { + var ext = ''; + + if (mxResources.isLanguageSupported(mxClient.language)) + { + ext = '_' + mxClient.language; + } + + graph.openLink(RESOURCES_PATH + '/help' + ext + '.html'); + }); + + var showingAbout = false; + + this.put('about', new Action(mxResources.get('about') + ' Graph Editor...', function() + { + if (!showingAbout) + { + ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true, function() + { + showingAbout = false; + }); + + showingAbout = true; + } + })); + + // Font style actions + var toggleFontStyle = mxUtils.bind(this, function(key, style, fn, shortcut) + { + return this.addAction(key, function() + { + if (fn != null && graph.cellEditor.isContentEditing()) + { + fn(); + } + else + { + graph.stopEditing(false); + + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style, cells); + + // Removes bold and italic tags and CSS styles inside labels + if ((style & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) + { + graph.updateLabelElements(graph.getSelectionCells(), function(elt) + { + elt.style.fontWeight = null; + + if (elt.nodeName == 'B') + { + graph.replaceElement(elt); + } + }); + } + else if ((style & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) + { + graph.updateLabelElements(graph.getSelectionCells(), function(elt) + { + elt.style.fontStyle = null; + + if (elt.nodeName == 'I') + { + graph.replaceElement(elt); + } + }); + } + else if ((style & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) + { + graph.updateLabelElements(graph.getSelectionCells(), function(elt) + { + elt.style.textDecoration = null; + + if (elt.nodeName == 'U') + { + graph.replaceElement(elt); + } + }); + } + + for (var i = 0; i < cells.length; i++) + { + if (graph.model.getChildCount(cells[i]) == 0) + { + graph.autoSizeCell(cells[i], false); + } + } + } + finally + { + graph.getModel().endUpdate(); + } + } + }, null, null, shortcut); + }); + + toggleFontStyle('bold', mxConstants.FONT_BOLD, function() { document.execCommand('bold', false, null); }, Editor.ctrlKey + '+B'); + toggleFontStyle('italic', mxConstants.FONT_ITALIC, function() { document.execCommand('italic', false, null); }, Editor.ctrlKey + '+I'); + toggleFontStyle('underline', mxConstants.FONT_UNDERLINE, function() { document.execCommand('underline', false, null); }, Editor.ctrlKey + '+U'); + + // Color actions + this.addAction('fontColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FONTCOLOR, 'forecolor', '000000'); }); + this.addAction('strokeColor...', function() { ui.menus.pickColor(mxConstants.STYLE_STROKECOLOR); }); + this.addAction('fillColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FILLCOLOR); }); + this.addAction('gradientColor...', function() { ui.menus.pickColor(mxConstants.STYLE_GRADIENTCOLOR); }); + this.addAction('backgroundColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, 'backcolor'); }); + this.addAction('borderColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BORDERCOLOR); }); + + // Format actions + this.addAction('vertical', function() { ui.menus.toggleStyle(mxConstants.STYLE_HORIZONTAL, true); }); + this.addAction('shadow', function() { ui.menus.toggleStyle(mxConstants.STYLE_SHADOW); }); + this.addAction('solid', function() + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(mxConstants.STYLE_DASHED, null); + graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], + 'values', [null, null], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); + this.addAction('dashed', function() + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(mxConstants.STYLE_DASHED, '1'); + graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], + 'values', ['1', null], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); + this.addAction('dotted', function() + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(mxConstants.STYLE_DASHED, '1'); + graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, '1 4'); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], + 'values', ['1', '1 4'], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); + this.addAction('sharp', function() + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0'); + graph.setCellStyles(mxConstants.STYLE_CURVED, '0'); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], + 'values', ['0', '0'], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); + this.addAction('rounded', function() + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(mxConstants.STYLE_ROUNDED, '1'); + graph.setCellStyles(mxConstants.STYLE_CURVED, '0'); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], + 'values', ['1', '0'], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); + this.addAction('toggleRounded', function() + { + if (!graph.isSelectionEmpty() && graph.isEnabled()) + { + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + var style = graph.getCurrentCellStyle(cells[0]); + var value = (mxUtils.getValue(style, mxConstants.STYLE_ROUNDED, '0') == '1') ? '0' : '1'; + + graph.setCellStyles(mxConstants.STYLE_ROUNDED, value); + graph.setCellStyles(mxConstants.STYLE_CURVED, null); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], + 'values', [value, '0'], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + } + }); + this.addAction('curved', function() + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0'); + graph.setCellStyles(mxConstants.STYLE_CURVED, '1'); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], + 'values', ['0', '1'], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); + this.addAction('collapsible', function() + { + var state = graph.view.getState(graph.getSelectionCell()); + var value = '1'; + + if (state != null && graph.getFoldingImage(state) != null) + { + value = '0'; + } + + graph.setCellStyles('collapsible', value); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['collapsible'], + 'values', [value], 'cells', graph.getSelectionCells())); + }); + this.addAction('editStyle...', mxUtils.bind(this, function() + { + var cells = graph.getSelectionCells(); + + if (cells != null && cells.length > 0) + { + var model = graph.getModel(); + + var dlg = new TextareaDialog(this.editorUi, mxResources.get('editStyle') + ':', + model.getStyle(cells[0]) || '', function(newValue) + { + if (newValue != null) + { + graph.setCellStyle(mxUtils.trim(newValue), cells); + } + }, null, null, 400, 220); + this.editorUi.showDialog(dlg.container, 420, 300, true, true); + dlg.init(); + } + }), null, null, Editor.ctrlKey + '+E'); + this.addAction('setAsDefaultStyle', function() + { + if (graph.isEnabled() && !graph.isSelectionEmpty()) + { + ui.setDefaultStyle(graph.getSelectionCell()); + } + }, null, null, Editor.ctrlKey + '+Shift+D'); + this.addAction('clearDefaultStyle', function() + { + if (graph.isEnabled()) + { + ui.clearDefaultStyle(); + } + }, null, null, Editor.ctrlKey + '+Shift+R'); + this.addAction('addWaypoint', function() + { + var cell = graph.getSelectionCell(); + + if (cell != null && graph.getModel().isEdge(cell)) + { + var handler = editor.graph.selectionCellsHandler.getHandler(cell); + + if (handler instanceof mxEdgeHandler) + { + var t = graph.view.translate; + var s = graph.view.scale; + var dx = t.x; + var dy = t.y; + + var parent = graph.getModel().getParent(cell); + var pgeo = graph.getCellGeometry(parent); + + while (graph.getModel().isVertex(parent) && pgeo != null) + { + dx += pgeo.x; + dy += pgeo.y; + + parent = graph.getModel().getParent(parent); + pgeo = graph.getCellGeometry(parent); + } + + var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx)); + var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy)); + + handler.addPointAt(handler.state, x, y); + } + } + }); + this.addAction('removeWaypoint', function() + { + // TODO: Action should run with "this" set to action + var rmWaypointAction = ui.actions.get('removeWaypoint'); + + if (rmWaypointAction.handler != null) + { + // NOTE: Popupevent handled and action updated in Menus.createPopupMenu + rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state, rmWaypointAction.index); + } + }); + this.addAction('clearWaypoints', function() + { + var cells = graph.getSelectionCells(); + + if (cells != null) + { + cells = graph.addAllEdges(cells); + + graph.getModel().beginUpdate(); + try + { + for (var i = 0; i < cells.length; i++) + { + var cell = cells[i]; + + if (graph.getModel().isEdge(cell)) + { + var geo = graph.getCellGeometry(cell); + + if (geo != null) + { + geo = geo.clone(); + geo.points = null; + graph.getModel().setGeometry(cell, geo); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + } + }, null, null, 'Alt+Shift+C'); + action = this.addAction('subscript', mxUtils.bind(this, function() + { + if (graph.cellEditor.isContentEditing()) + { + document.execCommand('subscript', false, null); + } + }), null, null, Editor.ctrlKey + '+,'); + action = this.addAction('superscript', mxUtils.bind(this, function() + { + if (graph.cellEditor.isContentEditing()) + { + document.execCommand('superscript', false, null); + } + }), null, null, Editor.ctrlKey + '+.'); + action = this.addAction('indent', mxUtils.bind(this, function() + { + // NOTE: Alt+Tab for outdent implemented via special code in + // keyHandler.getFunction in EditorUi.js. Ctrl+Tab is reserved. + if (graph.cellEditor.isContentEditing()) + { + document.execCommand('indent', false, null); + } + }), null, null, 'Shift+Tab'); + this.addAction('image...', function() + { + if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) + { + var title = mxResources.get('image') + ' (' + mxResources.get('url') + '):'; + var state = graph.getView().getState(graph.getSelectionCell()); + var value = ''; + + if (state != null) + { + value = state.style[mxConstants.STYLE_IMAGE] || value; + } + + var selectionState = graph.cellEditor.saveSelection(); + + ui.showImageDialog(title, value, function(newValue, w, h) + { + // Inserts image into HTML text + if (graph.cellEditor.isContentEditing()) + { + graph.cellEditor.restoreSelection(selectionState); + graph.insertImage(newValue, w, h); + } + else + { + var cells = graph.getSelectionCells(); + + if (newValue != null && (newValue.length > 0 || cells.length > 0)) + { + var select = null; + + graph.getModel().beginUpdate(); + try + { + // Inserts new cell if no cell is selected + if (cells.length == 0) + { + var pt = graph.getFreeInsertPoint(); + cells = [graph.insertVertex(graph.getDefaultParent(), null, '', pt.x, pt.y, w, h, + 'shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;')]; + select = cells; + graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select)); + } + + graph.setCellStyles(mxConstants.STYLE_IMAGE, (newValue.length > 0) ? newValue : null, cells); + + // Sets shape only if not already shape with image (label or image) + var style = graph.getCurrentCellStyle(cells[0]); + + if (style[mxConstants.STYLE_SHAPE] != 'image' && style[mxConstants.STYLE_SHAPE] != 'label') + { + graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells); + } + else if (newValue.length == 0) + { + graph.setCellStyles(mxConstants.STYLE_SHAPE, null, cells); + } + + if (graph.getSelectionCount() == 1) + { + if (w != null && h != null) + { + var cell = cells[0]; + var geo = graph.getModel().getGeometry(cell); + + if (geo != null) + { + geo = geo.clone(); + geo.width = w; + geo.height = h; + graph.getModel().setGeometry(cell, geo); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + + if (select != null) + { + graph.setSelectionCells(select); + graph.scrollCellToVisible(select[0]); + } + } + } + }, graph.cellEditor.isContentEditing(), !graph.cellEditor.isContentEditing()); + } + }).isEnabled = isGraphEnabled; + action = this.addAction('layers', mxUtils.bind(this, function() + { + if (this.layersWindow == null) + { + // LATER: Check outline window for initial placement + this.layersWindow = new LayersWindow(ui, document.body.offsetWidth - 280, 120, 220, 196); + this.layersWindow.window.addListener('show', function() + { + ui.fireEvent(new mxEventObject('layers')); + }); + this.layersWindow.window.addListener('hide', function() + { + ui.fireEvent(new mxEventObject('layers')); + }); + this.layersWindow.window.setVisible(true); + ui.fireEvent(new mxEventObject('layers')); + + this.layersWindow.init(); + } + else + { + this.layersWindow.window.setVisible(!this.layersWindow.window.isVisible()); + } + }), null, null, Editor.ctrlKey + '+Shift+L'); + action.setToggleAction(true); + action.setSelectedCallback(mxUtils.bind(this, function() { return this.layersWindow != null && this.layersWindow.window.isVisible(); })); + action = this.addAction('formatPanel', mxUtils.bind(this, function() + { + ui.toggleFormatPanel(); + }), null, null, Editor.ctrlKey + '+Shift+P'); + action.setToggleAction(true); + action.setSelectedCallback(mxUtils.bind(this, function() { return ui.formatWidth > 0; })); + action = this.addAction('outline', mxUtils.bind(this, function() + { + if (this.outlineWindow == null) + { + // LATER: Check layers window for initial placement + this.outlineWindow = new OutlineWindow(ui, document.body.offsetWidth - 260, 100, 180, 180); + this.outlineWindow.window.addListener('show', function() + { + ui.fireEvent(new mxEventObject('outline')); + }); + this.outlineWindow.window.addListener('hide', function() + { + ui.fireEvent(new mxEventObject('outline')); + }); + this.outlineWindow.window.setVisible(true); + ui.fireEvent(new mxEventObject('outline')); + } + else + { + this.outlineWindow.window.setVisible(!this.outlineWindow.window.isVisible()); + } + }), null, null, Editor.ctrlKey + '+Shift+O'); + + action.setToggleAction(true); + action.setSelectedCallback(mxUtils.bind(this, function() { return this.outlineWindow != null && this.outlineWindow.window.isVisible(); })); +}; + +/** + * Registers the given action under the given name. + */ +Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) +{ + var title; + + if (key.substring(key.length - 3) == '...') + { + key = key.substring(0, key.length - 3); + title = mxResources.get(key) + '...'; + } + else + { + title = mxResources.get(key); + } + + return this.put(key, new Action(title, funct, enabled, iconCls, shortcut)); +}; + +/** + * Registers the given action under the given name. + */ +Actions.prototype.put = function(name, action) +{ + this.actions[name] = action; + + return action; +}; + +/** + * Returns the action for the given name or null if no such action exists. + */ +Actions.prototype.get = function(name) +{ + return this.actions[name]; +}; + +/** + * Constructs a new action for the given parameters. + */ +function Action(label, funct, enabled, iconCls, shortcut) +{ + mxEventSource.call(this); + this.label = label; + this.funct = this.createFunction(funct); + this.enabled = (enabled != null) ? enabled : true; + this.iconCls = iconCls; + this.shortcut = shortcut; + this.visible = true; +}; + +// Action inherits from mxEventSource +mxUtils.extend(Action, mxEventSource); + +/** + * Sets the enabled state of the action and fires a stateChanged event. + */ +Action.prototype.createFunction = function(funct) +{ + return funct; +}; + +/** + * Sets the enabled state of the action and fires a stateChanged event. + */ +Action.prototype.setEnabled = function(value) +{ + if (this.enabled != value) + { + this.enabled = value; + this.fireEvent(new mxEventObject('stateChanged')); + } +}; + +/** + * Sets the enabled state of the action and fires a stateChanged event. + */ +Action.prototype.isEnabled = function() +{ + return this.enabled; +}; + +/** + * Sets the enabled state of the action and fires a stateChanged event. + */ +Action.prototype.setToggleAction = function(value) +{ + this.toggleAction = value; +}; + +/** + * Sets the enabled state of the action and fires a stateChanged event. + */ +Action.prototype.setSelectedCallback = function(funct) +{ + this.selectedCallback = funct; +}; + +/** + * Sets the enabled state of the action and fires a stateChanged event. + */ +Action.prototype.isSelected = function() +{ + return this.selectedCallback(); +}; diff --git a/public/js/grapheditor/js/Dialogs.js b/public/js/grapheditor/js/Dialogs.js new file mode 100644 index 000000000..da410a5b0 --- /dev/null +++ b/public/js/grapheditor/js/Dialogs.js @@ -0,0 +1,2553 @@ +/** + * Copyright (c) 2006-2012, JGraph Ltd + */ +/** + * Constructs a new open dialog. + */ +var OpenDialog = function() +{ + var iframe = document.createElement('iframe'); + iframe.style.backgroundColor = 'transparent'; + iframe.allowTransparency = 'true'; + iframe.style.borderStyle = 'none'; + iframe.style.borderWidth = '0px'; + iframe.style.overflow = 'hidden'; + iframe.frameBorder = '0'; + + // Adds padding as a workaround for box model in older IE versions + var dx = (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8)) ? 20 : 0; + + iframe.setAttribute('width', (((Editor.useLocalStorage) ? 640 : 320) + dx) + 'px'); + iframe.setAttribute('height', (((Editor.useLocalStorage) ? 480 : 220) + dx) + 'px'); + iframe.setAttribute('src', OPEN_FORM); + + this.container = iframe; +}; + +/** + * Constructs a new color dialog. + */ +var ColorDialog = function(editorUi, color, apply, cancelFn) +{ + this.editorUi = editorUi; + + var input = document.createElement('input'); + input.style.marginBottom = '10px'; + input.style.width = '216px'; + + // Required for picker to render in IE + if (mxClient.IS_IE) + { + input.style.marginTop = '10px'; + document.body.appendChild(input); + } + + this.init = function() + { + if (!mxClient.IS_TOUCH) + { + input.focus(); + } + }; + + var picker = new jscolor.color(input); + picker.pickerOnfocus = false; + picker.showPicker(); + + var div = document.createElement('div'); + jscolor.picker.box.style.position = 'relative'; + jscolor.picker.box.style.width = '230px'; + jscolor.picker.box.style.height = '100px'; + jscolor.picker.box.style.paddingBottom = '10px'; + div.appendChild(jscolor.picker.box); + + var center = document.createElement('center'); + + function createRecentColorTable() + { + var table = addPresets((ColorDialog.recentColors.length == 0) ? ['FFFFFF'] : + ColorDialog.recentColors, 11, 'FFFFFF', true); + table.style.marginBottom = '8px'; + + return table; + }; + + function addPresets(presets, rowLength, defaultColor, addResetOption) + { + rowLength = (rowLength != null) ? rowLength : 12; + var table = document.createElement('table'); + table.style.borderCollapse = 'collapse'; + table.setAttribute('cellspacing', '0'); + table.style.marginBottom = '20px'; + table.style.cellSpacing = '0px'; + var tbody = document.createElement('tbody'); + table.appendChild(tbody); + + var rows = presets.length / rowLength; + + for (var row = 0; row < rows; row++) + { + var tr = document.createElement('tr'); + + for (var i = 0; i < rowLength; i++) + { + (function(clr) + { + var td = document.createElement('td'); + td.style.border = '1px solid black'; + td.style.padding = '0px'; + td.style.width = '16px'; + td.style.height = '16px'; + + if (clr == null) + { + clr = defaultColor; + } + + if (clr == 'none') + { + td.style.background = 'url(\'' + Dialog.prototype.noColorImage + '\')'; + } + else + { + td.style.backgroundColor = '#' + clr; + } + + tr.appendChild(td); + + if (clr != null) + { + td.style.cursor = 'pointer'; + + mxEvent.addListener(td, 'click', function() + { + if (clr == 'none') + { + picker.fromString('ffffff'); + input.value = 'none'; + } + else + { + picker.fromString(clr); + } + }); + } + })(presets[row * rowLength + i]); + } + + tbody.appendChild(tr); + } + + if (addResetOption) + { + var td = document.createElement('td'); + td.setAttribute('title', mxResources.get('reset')); + td.style.border = '1px solid black'; + td.style.padding = '0px'; + td.style.width = '16px'; + td.style.height = '16px'; + td.style.backgroundImage = 'url(\'' + Dialog.prototype.closeImage + '\')'; + td.style.backgroundPosition = 'center center'; + td.style.backgroundRepeat = 'no-repeat'; + td.style.cursor = 'pointer'; + + tr.appendChild(td); + + mxEvent.addListener(td, 'click', function() + { + ColorDialog.resetRecentColors(); + table.parentNode.replaceChild(createRecentColorTable(), table); + }); + } + + center.appendChild(table); + + return table; + }; + + div.appendChild(input); + mxUtils.br(div); + + // Adds recent colors + createRecentColorTable(); + + // Adds presets + var table = addPresets(this.presetColors); + table.style.marginBottom = '8px'; + table = addPresets(this.defaultColors); + table.style.marginBottom = '16px'; + + div.appendChild(center); + + var buttons = document.createElement('div'); + buttons.style.textAlign = 'right'; + buttons.style.whiteSpace = 'nowrap'; + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + + if (cancelFn != null) + { + cancelFn(); + } + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + buttons.appendChild(cancelBtn); + } + + var applyFunction = (apply != null) ? apply : this.createApplyFunction(); + + var applyBtn = mxUtils.button(mxResources.get('apply'), function() + { + var color = input.value; + + // Blocks any non-alphabetic chars in colors + if (/(^#?[a-zA-Z0-9]*$)/.test(color)) + { + if (color != 'none' && color.charAt(0) != '#') + { + color = '#' + color; + } + + ColorDialog.addRecentColor((color != 'none') ? color.substring(1) : color, 12); + applyFunction(color); + editorUi.hideDialog(); + } + else + { + editorUi.handleError({message: mxResources.get('invalidInput')}); + } + }); + applyBtn.className = 'geBtn gePrimaryBtn'; + buttons.appendChild(applyBtn); + + if (!editorUi.editor.cancelFirst) + { + buttons.appendChild(cancelBtn); + } + + if (color != null) + { + if (color == 'none') + { + picker.fromString('ffffff'); + input.value = 'none'; + } + else + { + picker.fromString(color); + } + } + + div.appendChild(buttons); + this.picker = picker; + this.colorInput = input; + + // LATER: Only fires if input if focused, should always + // fire if this dialog is showing. + mxEvent.addListener(div, 'keydown', function(e) + { + if (e.keyCode == 27) + { + editorUi.hideDialog(); + + if (cancelFn != null) + { + cancelFn(); + } + + mxEvent.consume(e); + } + }); + + this.container = div; +}; + +/** + * Creates function to apply value + */ +ColorDialog.prototype.presetColors = ['E6D0DE', 'CDA2BE', 'B5739D', 'E1D5E7', 'C3ABD0', 'A680B8', 'D4E1F5', 'A9C4EB', '7EA6E0', 'D5E8D4', '9AC7BF', '67AB9F', 'D5E8D4', 'B9E0A5', '97D077', 'FFF2CC', 'FFE599', 'FFD966', 'FFF4C3', 'FFCE9F', 'FFB570', 'F8CECC', 'F19C99', 'EA6B66']; + +/** + * Creates function to apply value + */ +ColorDialog.prototype.defaultColors = ['none', 'FFFFFF', 'E6E6E6', 'CCCCCC', 'B3B3B3', '999999', '808080', '666666', '4D4D4D', '333333', '1A1A1A', '000000', 'FFCCCC', 'FFE6CC', 'FFFFCC', 'E6FFCC', 'CCFFCC', 'CCFFE6', 'CCFFFF', 'CCE5FF', 'CCCCFF', 'E5CCFF', 'FFCCFF', 'FFCCE6', + 'FF9999', 'FFCC99', 'FFFF99', 'CCFF99', '99FF99', '99FFCC', '99FFFF', '99CCFF', '9999FF', 'CC99FF', 'FF99FF', 'FF99CC', 'FF6666', 'FFB366', 'FFFF66', 'B3FF66', '66FF66', '66FFB3', '66FFFF', '66B2FF', '6666FF', 'B266FF', 'FF66FF', 'FF66B3', 'FF3333', 'FF9933', 'FFFF33', + '99FF33', '33FF33', '33FF99', '33FFFF', '3399FF', '3333FF', '9933FF', 'FF33FF', 'FF3399', 'FF0000', 'FF8000', 'FFFF00', '80FF00', '00FF00', '00FF80', '00FFFF', '007FFF', '0000FF', '7F00FF', 'FF00FF', 'FF0080', 'CC0000', 'CC6600', 'CCCC00', '66CC00', '00CC00', '00CC66', + '00CCCC', '0066CC', '0000CC', '6600CC', 'CC00CC', 'CC0066', '990000', '994C00', '999900', '4D9900', '009900', '00994D', '009999', '004C99', '000099', '4C0099', '990099', '99004D', '660000', '663300', '666600', '336600', '006600', '006633', '006666', '003366', '000066', + '330066', '660066', '660033', '330000', '331A00', '333300', '1A3300', '003300', '00331A', '003333', '001933', '000033', '190033', '330033', '33001A']; + +/** + * Creates function to apply value + */ +ColorDialog.prototype.createApplyFunction = function() +{ + return mxUtils.bind(this, function(color) + { + var graph = this.editorUi.editor.graph; + + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles(this.currentColorKey, color); + this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [this.currentColorKey], + 'values', [color], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }); +}; + +/** + * + */ +ColorDialog.recentColors = []; + +/** + * Adds recent color for later use. + */ +ColorDialog.addRecentColor = function(color, max) +{ + if (color != null) + { + mxUtils.remove(color, ColorDialog.recentColors); + ColorDialog.recentColors.splice(0, 0, color); + + if (ColorDialog.recentColors.length >= max) + { + ColorDialog.recentColors.pop(); + } + } +}; + +/** + * Adds recent color for later use. + */ +ColorDialog.resetRecentColors = function() +{ + ColorDialog.recentColors = []; +}; + +/** + * Constructs a new about dialog. + */ +var AboutDialog = function(editorUi) +{ + var div = document.createElement('div'); + div.setAttribute('align', 'center'); + var h3 = document.createElement('h3'); + mxUtils.write(h3, mxResources.get('about') + ' GraphEditor'); + div.appendChild(h3); + var img = document.createElement('img'); + img.style.border = '0px'; + img.setAttribute('width', '176'); + img.setAttribute('width', '151'); + img.setAttribute('src', IMAGE_PATH + '/logo.png'); + div.appendChild(img); + mxUtils.br(div); + mxUtils.write(div, 'Powered by mxGraph ' + mxClient.VERSION); + mxUtils.br(div); + var link = document.createElement('a'); + link.setAttribute('href', 'http://www.jgraph.com/'); + link.setAttribute('target', '_blank'); + mxUtils.write(link, 'www.jgraph.com'); + div.appendChild(link); + mxUtils.br(div); + mxUtils.br(div); + var closeBtn = mxUtils.button(mxResources.get('close'), function() + { + editorUi.hideDialog(); + }); + closeBtn.className = 'geBtn gePrimaryBtn'; + div.appendChild(closeBtn); + + this.container = div; +}; + +/** + * Constructs a new textarea dialog. + */ +var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w, h, + addButtons, noHide, noWrap, applyTitle, helpLink, customButtons) +{ + w = (w != null) ? w : 300; + h = (h != null) ? h : 120; + noHide = (noHide != null) ? noHide : false; + var row, td; + + var table = document.createElement('table'); + var tbody = document.createElement('tbody'); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + td.style.width = '100px'; + mxUtils.write(td, title); + + row.appendChild(td); + tbody.appendChild(row); + + row = document.createElement('tr'); + td = document.createElement('td'); + + var nameInput = document.createElement('textarea'); + + if (noWrap) + { + nameInput.setAttribute('wrap', 'off'); + } + + nameInput.setAttribute('spellcheck', 'false'); + nameInput.setAttribute('autocorrect', 'off'); + nameInput.setAttribute('autocomplete', 'off'); + nameInput.setAttribute('autocapitalize', 'off'); + + mxUtils.write(nameInput, url || ''); + nameInput.style.resize = 'none'; + nameInput.style.width = w + 'px'; + nameInput.style.height = h + 'px'; + + this.textarea = nameInput; + + this.init = function() + { + nameInput.focus(); + nameInput.scrollTop = 0; + }; + + td.appendChild(nameInput); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + td = document.createElement('td'); + td.style.paddingTop = '14px'; + td.style.whiteSpace = 'nowrap'; + td.setAttribute('align', 'right'); + + if (helpLink != null) + { + var helpBtn = mxUtils.button(mxResources.get('help'), function() + { + editorUi.editor.graph.openLink(helpLink); + }); + helpBtn.className = 'geBtn'; + + td.appendChild(helpBtn); + } + + if (customButtons != null) + { + for (var i = 0; i < customButtons.length; i++) + { + (function(label, fn) + { + var customBtn = mxUtils.button(label, function(e) + { + fn(e, nameInput); + }); + customBtn.className = 'geBtn'; + + td.appendChild(customBtn); + })(customButtons[i][0], customButtons[i][1]); + } + } + + var cancelBtn = mxUtils.button(cancelTitle || mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + + if (cancelFn != null) + { + cancelFn(); + } + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + if (addButtons != null) + { + addButtons(td, nameInput); + } + + if (fn != null) + { + var genericBtn = mxUtils.button(applyTitle || mxResources.get('apply'), function() + { + if (!noHide) + { + editorUi.hideDialog(); + } + + fn(nameInput.value); + }); + + genericBtn.className = 'geBtn gePrimaryBtn'; + td.appendChild(genericBtn); + } + + if (!editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + row.appendChild(td); + tbody.appendChild(row); + table.appendChild(tbody); + this.container = table; +}; + +/** + * Constructs a new edit file dialog. + */ +var EditDiagramDialog = function(editorUi) +{ + var div = document.createElement('div'); + div.style.textAlign = 'right'; + var textarea = document.createElement('textarea'); + textarea.setAttribute('wrap', 'off'); + textarea.setAttribute('spellcheck', 'false'); + textarea.setAttribute('autocorrect', 'off'); + textarea.setAttribute('autocomplete', 'off'); + textarea.setAttribute('autocapitalize', 'off'); + textarea.style.overflow = 'auto'; + textarea.style.resize = 'none'; + textarea.style.width = '600px'; + textarea.style.height = '360px'; + textarea.style.marginBottom = '16px'; + + textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml()); + div.appendChild(textarea); + + this.init = function() + { + textarea.focus(); + }; + + // Enables dropping files + if (Graph.fileSupport) + { + function handleDrop(evt) + { + evt.stopPropagation(); + evt.preventDefault(); + + if (evt.dataTransfer.files.length > 0) + { + var file = evt.dataTransfer.files[0]; + var reader = new FileReader(); + + reader.onload = function(e) + { + textarea.value = e.target.result; + }; + + reader.readAsText(file); + } + else + { + textarea.value = editorUi.extractGraphModelFromEvent(evt); + } + }; + + function handleDragOver(evt) + { + evt.stopPropagation(); + evt.preventDefault(); + }; + + // Setup the dnd listeners. + textarea.addEventListener('dragover', handleDragOver, false); + textarea.addEventListener('drop', handleDrop, false); + } + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + div.appendChild(cancelBtn); + } + + var select = document.createElement('select'); + select.style.width = '180px'; + select.className = 'geBtn'; + + if (editorUi.editor.graph.isEnabled()) + { + var replaceOption = document.createElement('option'); + replaceOption.setAttribute('value', 'replace'); + mxUtils.write(replaceOption, mxResources.get('replaceExistingDrawing')); + select.appendChild(replaceOption); + } + + var newOption = document.createElement('option'); + newOption.setAttribute('value', 'new'); + mxUtils.write(newOption, mxResources.get('openInNewWindow')); + + if (EditDiagramDialog.showNewWindowOption) + { + select.appendChild(newOption); + } + + if (editorUi.editor.graph.isEnabled()) + { + var importOption = document.createElement('option'); + importOption.setAttribute('value', 'import'); + mxUtils.write(importOption, mxResources.get('addToExistingDrawing')); + select.appendChild(importOption); + } + + div.appendChild(select); + + var okBtn = mxUtils.button(mxResources.get('ok'), function() + { + // Removes all illegal control characters before parsing + var data = Graph.zapGremlins(mxUtils.trim(textarea.value)); + var error = null; + + if (select.value == 'new') + { + editorUi.hideDialog(); + editorUi.editor.editAsNew(data); + } + else if (select.value == 'replace') + { + editorUi.editor.graph.model.beginUpdate(); + try + { + editorUi.editor.setGraphXml(mxUtils.parseXml(data).documentElement); + // LATER: Why is hideDialog between begin-/endUpdate faster? + editorUi.hideDialog(); + } + catch (e) + { + error = e; + } + finally + { + editorUi.editor.graph.model.endUpdate(); + } + } + else if (select.value == 'import') + { + editorUi.editor.graph.model.beginUpdate(); + try + { + var doc = mxUtils.parseXml(data); + var model = new mxGraphModel(); + var codec = new mxCodec(doc); + codec.decode(doc.documentElement, model); + + var children = model.getChildren(model.getChildAt(model.getRoot(), 0)); + editorUi.editor.graph.setSelectionCells(editorUi.editor.graph.importCells(children)); + + // LATER: Why is hideDialog between begin-/endUpdate faster? + editorUi.hideDialog(); + } + catch (e) + { + error = e; + } + finally + { + editorUi.editor.graph.model.endUpdate(); + } + } + + if (error != null) + { + mxUtils.alert(error.message); + } + }); + okBtn.className = 'geBtn gePrimaryBtn'; + div.appendChild(okBtn); + + if (!editorUi.editor.cancelFirst) + { + div.appendChild(cancelBtn); + } + + this.container = div; +}; + +/** + * + */ +EditDiagramDialog.showNewWindowOption = true; + +/** + * Constructs a new export dialog. + */ +var ExportDialog = function(editorUi) +{ + var graph = editorUi.editor.graph; + var bounds = graph.getGraphBounds(); + var scale = graph.view.scale; + + var width = Math.ceil(bounds.width / scale); + var height = Math.ceil(bounds.height / scale); + + var row, td; + + var table = document.createElement('table'); + var tbody = document.createElement('tbody'); + table.setAttribute('cellpadding', (mxClient.IS_SF) ? '0' : '2'); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + td.style.width = '100px'; + mxUtils.write(td, mxResources.get('filename') + ':'); + + row.appendChild(td); + + var nameInput = document.createElement('input'); + nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename()); + nameInput.style.width = '180px'; + + td = document.createElement('td'); + td.appendChild(nameInput); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('format') + ':'); + + row.appendChild(td); + + var imageFormatSelect = document.createElement('select'); + imageFormatSelect.style.width = '180px'; + + var pngOption = document.createElement('option'); + pngOption.setAttribute('value', 'png'); + mxUtils.write(pngOption, mxResources.get('formatPng')); + imageFormatSelect.appendChild(pngOption); + + var gifOption = document.createElement('option'); + + if (ExportDialog.showGifOption) + { + gifOption.setAttribute('value', 'gif'); + mxUtils.write(gifOption, mxResources.get('formatGif')); + imageFormatSelect.appendChild(gifOption); + } + + var jpgOption = document.createElement('option'); + jpgOption.setAttribute('value', 'jpg'); + mxUtils.write(jpgOption, mxResources.get('formatJpg')); + imageFormatSelect.appendChild(jpgOption); + + var pdfOption = document.createElement('option'); + pdfOption.setAttribute('value', 'pdf'); + mxUtils.write(pdfOption, mxResources.get('formatPdf')); + imageFormatSelect.appendChild(pdfOption); + + var svgOption = document.createElement('option'); + svgOption.setAttribute('value', 'svg'); + mxUtils.write(svgOption, mxResources.get('formatSvg')); + imageFormatSelect.appendChild(svgOption); + + if (ExportDialog.showXmlOption) + { + var xmlOption = document.createElement('option'); + xmlOption.setAttribute('value', 'xml'); + mxUtils.write(xmlOption, mxResources.get('formatXml')); + imageFormatSelect.appendChild(xmlOption); + } + + td = document.createElement('td'); + td.appendChild(imageFormatSelect); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('zoom') + ' (%):'); + + row.appendChild(td); + + var zoomInput = document.createElement('input'); + zoomInput.setAttribute('type', 'number'); + zoomInput.setAttribute('value', '100'); + zoomInput.style.width = '180px'; + + td = document.createElement('td'); + td.appendChild(zoomInput); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('width') + ':'); + + row.appendChild(td); + + var widthInput = document.createElement('input'); + widthInput.setAttribute('value', width); + widthInput.style.width = '180px'; + + td = document.createElement('td'); + td.appendChild(widthInput); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('height') + ':'); + + row.appendChild(td); + + var heightInput = document.createElement('input'); + heightInput.setAttribute('value', height); + heightInput.style.width = '180px'; + + td = document.createElement('td'); + td.appendChild(heightInput); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('dpi') + ':'); + + row.appendChild(td); + + var dpiSelect = document.createElement('select'); + dpiSelect.style.width = '180px'; + + var dpi100Option = document.createElement('option'); + dpi100Option.setAttribute('value', '100'); + mxUtils.write(dpi100Option, '100dpi'); + dpiSelect.appendChild(dpi100Option); + + var dpi200Option = document.createElement('option'); + dpi200Option.setAttribute('value', '200'); + mxUtils.write(dpi200Option, '200dpi'); + dpiSelect.appendChild(dpi200Option); + + var dpi300Option = document.createElement('option'); + dpi300Option.setAttribute('value', '300'); + mxUtils.write(dpi300Option, '300dpi'); + dpiSelect.appendChild(dpi300Option); + + var dpi400Option = document.createElement('option'); + dpi400Option.setAttribute('value', '400'); + mxUtils.write(dpi400Option, '400dpi'); + dpiSelect.appendChild(dpi400Option); + + var dpiCustOption = document.createElement('option'); + dpiCustOption.setAttribute('value', 'custom'); + mxUtils.write(dpiCustOption, mxResources.get('custom')); + dpiSelect.appendChild(dpiCustOption); + + var customDpi = document.createElement('input'); + customDpi.style.width = '180px'; + customDpi.style.display = 'none'; + customDpi.setAttribute('value', '100'); + customDpi.setAttribute('type', 'number'); + customDpi.setAttribute('min', '50'); + customDpi.setAttribute('step', '50'); + + var zoomUserChanged = false; + + mxEvent.addListener(dpiSelect, 'change', function() + { + if (this.value == 'custom') + { + this.style.display = 'none'; + customDpi.style.display = ''; + customDpi.focus(); + } + else + { + customDpi.value = this.value; + + if (!zoomUserChanged) + { + zoomInput.value = this.value; + } + } + }); + + mxEvent.addListener(customDpi, 'change', function() + { + var dpi = parseInt(customDpi.value); + + if (isNaN(dpi) || dpi <= 0) + { + customDpi.style.backgroundColor = 'red'; + } + else + { + customDpi.style.backgroundColor = ''; + + if (!zoomUserChanged) + { + zoomInput.value = dpi; + } + } + }); + + td = document.createElement('td'); + td.appendChild(dpiSelect); + td.appendChild(customDpi); + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('background') + ':'); + + row.appendChild(td); + + var transparentCheckbox = document.createElement('input'); + transparentCheckbox.setAttribute('type', 'checkbox'); + transparentCheckbox.checked = graph.background == null || graph.background == mxConstants.NONE; + + td = document.createElement('td'); + td.appendChild(transparentCheckbox); + mxUtils.write(td, mxResources.get('transparent')); + + row.appendChild(td); + + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('borderWidth') + ':'); + + row.appendChild(td); + + var borderInput = document.createElement('input'); + borderInput.setAttribute('type', 'number'); + borderInput.setAttribute('value', ExportDialog.lastBorderValue); + borderInput.style.width = '180px'; + + td = document.createElement('td'); + td.appendChild(borderInput); + row.appendChild(td); + + tbody.appendChild(row); + table.appendChild(tbody); + + // Handles changes in the export format + function formatChanged() + { + var name = nameInput.value; + var dot = name.lastIndexOf('.'); + + if (dot > 0) + { + nameInput.value = name.substring(0, dot + 1) + imageFormatSelect.value; + } + else + { + nameInput.value = name + '.' + imageFormatSelect.value; + } + + if (imageFormatSelect.value === 'xml') + { + zoomInput.setAttribute('disabled', 'true'); + widthInput.setAttribute('disabled', 'true'); + heightInput.setAttribute('disabled', 'true'); + borderInput.setAttribute('disabled', 'true'); + } + else + { + zoomInput.removeAttribute('disabled'); + widthInput.removeAttribute('disabled'); + heightInput.removeAttribute('disabled'); + borderInput.removeAttribute('disabled'); + } + + if (imageFormatSelect.value === 'png' || imageFormatSelect.value === 'svg') + { + transparentCheckbox.removeAttribute('disabled'); + } + else + { + transparentCheckbox.setAttribute('disabled', 'disabled'); + } + + if (imageFormatSelect.value === 'png') + { + dpiSelect.removeAttribute('disabled'); + customDpi.removeAttribute('disabled'); + } + else + { + dpiSelect.setAttribute('disabled', 'disabled'); + customDpi.setAttribute('disabled', 'disabled'); + } + }; + + mxEvent.addListener(imageFormatSelect, 'change', formatChanged); + formatChanged(); + + function checkValues() + { + if (widthInput.value * heightInput.value > MAX_AREA || widthInput.value <= 0) + { + widthInput.style.backgroundColor = 'red'; + } + else + { + widthInput.style.backgroundColor = ''; + } + + if (widthInput.value * heightInput.value > MAX_AREA || heightInput.value <= 0) + { + heightInput.style.backgroundColor = 'red'; + } + else + { + heightInput.style.backgroundColor = ''; + } + }; + + mxEvent.addListener(zoomInput, 'change', function() + { + zoomUserChanged = true; + var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100; + zoomInput.value = parseFloat((s * 100).toFixed(2)); + + if (width > 0) + { + widthInput.value = Math.floor(width * s); + heightInput.value = Math.floor(height * s); + } + else + { + zoomInput.value = '100'; + widthInput.value = width; + heightInput.value = height; + } + + checkValues(); + }); + + mxEvent.addListener(widthInput, 'change', function() + { + var s = parseInt(widthInput.value) / width; + + if (s > 0) + { + zoomInput.value = parseFloat((s * 100).toFixed(2)); + heightInput.value = Math.floor(height * s); + } + else + { + zoomInput.value = '100'; + widthInput.value = width; + heightInput.value = height; + } + + checkValues(); + }); + + mxEvent.addListener(heightInput, 'change', function() + { + var s = parseInt(heightInput.value) / height; + + if (s > 0) + { + zoomInput.value = parseFloat((s * 100).toFixed(2)); + widthInput.value = Math.floor(width * s); + } + else + { + zoomInput.value = '100'; + widthInput.value = width; + heightInput.value = height; + } + + checkValues(); + }); + + row = document.createElement('tr'); + td = document.createElement('td'); + td.setAttribute('align', 'right'); + td.style.paddingTop = '22px'; + td.colSpan = 2; + + var saveBtn = mxUtils.button(mxResources.get('export'), mxUtils.bind(this, function() + { + if (parseInt(zoomInput.value) <= 0) + { + mxUtils.alert(mxResources.get('drawingEmpty')); + } + else + { + var name = nameInput.value; + var format = imageFormatSelect.value; + var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100; + var b = Math.max(0, parseInt(borderInput.value)); + var bg = graph.background; + var dpi = Math.max(1, parseInt(customDpi.value)); + + if ((format == 'svg' || format == 'png') && transparentCheckbox.checked) + { + bg = null; + } + else if (bg == null || bg == mxConstants.NONE) + { + bg = '#ffffff'; + } + + ExportDialog.lastBorderValue = b; + ExportDialog.exportFile(editorUi, name, format, bg, s, b, dpi); + } + })); + saveBtn.className = 'geBtn gePrimaryBtn'; + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + td.appendChild(saveBtn); + } + else + { + td.appendChild(saveBtn); + td.appendChild(cancelBtn); + } + + row.appendChild(td); + tbody.appendChild(row); + table.appendChild(tbody); + this.container = table; +}; + +/** + * Remembers last value for border. + */ +ExportDialog.lastBorderValue = 0; + +/** + * Global switches for the export dialog. + */ +ExportDialog.showGifOption = true; + +/** + * Global switches for the export dialog. + */ +ExportDialog.showXmlOption = true; + +/** + * Hook for getting the export format. Returns null for the default + * intermediate XML export format or a function that returns the + * parameter and value to be used in the request in the form + * key=value, where value should be URL encoded. + */ +ExportDialog.exportFile = function(editorUi, name, format, bg, s, b, dpi) +{ + var graph = editorUi.editor.graph; + + if (format == 'xml') + { + ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(editorUi.editor.getGraphXml()), name, format); + } + else if (format == 'svg') + { + ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(graph.getSvg(bg, s, b)), name, format); + } + else + { + var bounds = graph.getGraphBounds(); + + // New image export + var xmlDoc = mxUtils.createXmlDocument(); + var root = xmlDoc.createElement('output'); + xmlDoc.appendChild(root); + + // Renders graph. Offset will be multiplied with state's scale when painting state. + var xmlCanvas = new mxXmlCanvas2D(root); + xmlCanvas.translate(Math.floor((b / s - bounds.x) / graph.view.scale), + Math.floor((b / s - bounds.y) / graph.view.scale)); + xmlCanvas.scale(s / graph.view.scale); + + var imgExport = new mxImageExport() + imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas); + + // Puts request data together + var param = 'xml=' + encodeURIComponent(mxUtils.getXml(root)); + var w = Math.ceil(bounds.width * s / graph.view.scale + 2 * b); + var h = Math.ceil(bounds.height * s / graph.view.scale + 2 * b); + + // Requests image if request is valid + if (param.length <= MAX_REQUEST_SIZE && w * h < MAX_AREA) + { + editorUi.hideDialog(); + var req = new mxXmlRequest(EXPORT_URL, 'format=' + format + + '&filename=' + encodeURIComponent(name) + + '&bg=' + ((bg != null) ? bg : 'none') + + '&w=' + w + '&h=' + h + '&' + param + + '&dpi=' + dpi); + req.simulate(document, '_blank'); + } + else + { + mxUtils.alert(mxResources.get('drawingTooLarge')); + } + } +}; + +/** + * Hook for getting the export format. Returns null for the default + * intermediate XML export format or a function that returns the + * parameter and value to be used in the request in the form + * key=value, where value should be URL encoded. + */ +ExportDialog.saveLocalFile = function(editorUi, data, filename, format) +{ + if (data.length < MAX_REQUEST_SIZE) + { + editorUi.hideDialog(); + var req = new mxXmlRequest(SAVE_URL, 'xml=' + encodeURIComponent(data) + '&filename=' + + encodeURIComponent(filename) + '&format=' + format); + req.simulate(document, '_blank'); + } + else + { + mxUtils.alert(mxResources.get('drawingTooLarge')); + mxUtils.popup(xml); + } +}; + +/** + * Constructs a new metadata dialog. + */ +var EditDataDialog = function(ui, cell) +{ + var div = document.createElement('div'); + var graph = ui.editor.graph; + + var value = graph.getModel().getValue(cell); + + // Converts the value to an XML node + if (!mxUtils.isNode(value)) + { + var doc = mxUtils.createXmlDocument(); + var obj = doc.createElement('object'); + obj.setAttribute('label', value || ''); + value = obj; + } + + // Creates the dialog contents + var form = new mxForm('properties'); + form.table.style.width = '100%'; + + var attrs = value.attributes; + var names = []; + var texts = []; + var count = 0; + + var id = (EditDataDialog.getDisplayIdForCell != null) ? + EditDataDialog.getDisplayIdForCell(ui, cell) : null; + + var addRemoveButton = function(text, name) + { + var wrapper = document.createElement('div'); + wrapper.style.position = 'relative'; + wrapper.style.paddingRight = '20px'; + wrapper.style.boxSizing = 'border-box'; + wrapper.style.width = '100%'; + + var removeAttr = document.createElement('a'); + var img = mxUtils.createImage(Dialog.prototype.closeImage); + img.style.height = '9px'; + img.style.fontSize = '9px'; + img.style.marginBottom = (mxClient.IS_IE11) ? '-1px' : '5px'; + + removeAttr.className = 'geButton'; + removeAttr.setAttribute('title', mxResources.get('delete')); + removeAttr.style.position = 'absolute'; + removeAttr.style.top = '4px'; + removeAttr.style.right = '0px'; + removeAttr.style.margin = '0px'; + removeAttr.style.width = '9px'; + removeAttr.style.height = '9px'; + removeAttr.style.cursor = 'pointer'; + removeAttr.appendChild(img); + + var removeAttrFn = (function(name) + { + return function() + { + var count = 0; + + for (var j = 0; j < names.length; j++) + { + if (names[j] == name) + { + texts[j] = null; + form.table.deleteRow(count + ((id != null) ? 1 : 0)); + + break; + } + + if (texts[j] != null) + { + count++; + } + } + }; + })(name); + + mxEvent.addListener(removeAttr, 'click', removeAttrFn); + + var parent = text.parentNode; + wrapper.appendChild(text); + wrapper.appendChild(removeAttr); + parent.appendChild(wrapper); + }; + + var addTextArea = function(index, name, value) + { + names[index] = name; + texts[index] = form.addTextarea(names[count] + ':', value, 2); + texts[index].style.width = '100%'; + + if (value.indexOf('\n') > 0) + { + texts[index].setAttribute('rows', '2'); + } + + addRemoveButton(texts[index], name); + }; + + var temp = []; + var isLayer = graph.getModel().getParent(cell) == graph.getModel().getRoot(); + + for (var i = 0; i < attrs.length; i++) + { + if ((isLayer || attrs[i].nodeName != 'label') && attrs[i].nodeName != 'placeholders') + { + temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue}); + } + } + + // Sorts by name + temp.sort(function(a, b) + { + if (a.name < b.name) + { + return -1; + } + else if (a.name > b.name) + { + return 1; + } + else + { + return 0; + } + }); + + if (id != null) + { + var text = document.createElement('div'); + text.style.width = '100%'; + text.style.fontSize = '11px'; + text.style.textAlign = 'center'; + mxUtils.write(text, id); + + form.addField(mxResources.get('id') + ':', text); + } + + for (var i = 0; i < temp.length; i++) + { + addTextArea(count, temp[i].name, temp[i].value); + count++; + } + + var top = document.createElement('div'); + top.style.cssText = 'position:absolute;left:30px;right:30px;overflow-y:auto;top:30px;bottom:80px;'; + top.appendChild(form.table); + + var newProp = document.createElement('div'); + newProp.style.boxSizing = 'border-box'; + newProp.style.paddingRight = '160px'; + newProp.style.whiteSpace = 'nowrap'; + newProp.style.marginTop = '6px'; + newProp.style.width = '100%'; + + var nameInput = document.createElement('input'); + nameInput.setAttribute('placeholder', mxResources.get('enterPropertyName')); + nameInput.setAttribute('type', 'text'); + nameInput.setAttribute('size', (mxClient.IS_IE || mxClient.IS_IE11) ? '36' : '40'); + nameInput.style.boxSizing = 'border-box'; + nameInput.style.marginLeft = '2px'; + nameInput.style.width = '100%'; + + newProp.appendChild(nameInput); + top.appendChild(newProp); + div.appendChild(top); + + var addBtn = mxUtils.button(mxResources.get('addProperty'), function() + { + var name = nameInput.value; + + // Avoid ':' in attribute names which seems to be valid in Chrome + if (name.length > 0 && name != 'label' && name != 'placeholders' && name.indexOf(':') < 0) + { + try + { + var idx = mxUtils.indexOf(names, name); + + if (idx >= 0 && texts[idx] != null) + { + texts[idx].focus(); + } + else + { + // Checks if the name is valid + var clone = value.cloneNode(false); + clone.setAttribute(name, ''); + + if (idx >= 0) + { + names.splice(idx, 1); + texts.splice(idx, 1); + } + + names.push(name); + var text = form.addTextarea(name + ':', '', 2); + text.style.width = '100%'; + texts.push(text); + addRemoveButton(text, name); + + text.focus(); + } + + addBtn.setAttribute('disabled', 'disabled'); + nameInput.value = ''; + } + catch (e) + { + mxUtils.alert(e); + } + } + else + { + mxUtils.alert(mxResources.get('invalidName')); + } + }); + + this.init = function() + { + if (texts.length > 0) + { + texts[0].focus(); + } + else + { + nameInput.focus(); + } + }; + + addBtn.setAttribute('title', mxResources.get('addProperty')); + addBtn.setAttribute('disabled', 'disabled'); + addBtn.style.textOverflow = 'ellipsis'; + addBtn.style.position = 'absolute'; + addBtn.style.overflow = 'hidden'; + addBtn.style.width = '144px'; + addBtn.style.right = '0px'; + addBtn.className = 'geBtn'; + newProp.appendChild(addBtn); + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + ui.hideDialog.apply(ui, arguments); + }); + + cancelBtn.className = 'geBtn'; + + var applyBtn = mxUtils.button(mxResources.get('apply'), function() + { + try + { + ui.hideDialog.apply(ui, arguments); + + // Clones and updates the value + value = value.cloneNode(true); + var removeLabel = false; + + for (var i = 0; i < names.length; i++) + { + if (texts[i] == null) + { + value.removeAttribute(names[i]); + } + else + { + value.setAttribute(names[i], texts[i].value); + removeLabel = removeLabel || (names[i] == 'placeholder' && + value.getAttribute('placeholders') == '1'); + } + } + + // Removes label if placeholder is assigned + if (removeLabel) + { + value.removeAttribute('label'); + } + + // Updates the value of the cell (undoable) + graph.getModel().setValue(cell, value); + } + catch (e) + { + mxUtils.alert(e); + } + }); + applyBtn.className = 'geBtn gePrimaryBtn'; + + function updateAddBtn() + { + if (nameInput.value.length > 0) + { + addBtn.removeAttribute('disabled'); + } + else + { + addBtn.setAttribute('disabled', 'disabled'); + } + }; + + mxEvent.addListener(nameInput, 'keyup', updateAddBtn); + + // Catches all changes that don't fire a keyup (such as paste via mouse) + mxEvent.addListener(nameInput, 'change', updateAddBtn); + + var buttons = document.createElement('div'); + buttons.style.cssText = 'position:absolute;left:30px;right:30px;text-align:right;bottom:30px;height:40px;' + + if (ui.editor.graph.getModel().isVertex(cell) || ui.editor.graph.getModel().isEdge(cell)) + { + var replace = document.createElement('span'); + replace.style.marginRight = '10px'; + var input = document.createElement('input'); + input.setAttribute('type', 'checkbox'); + input.style.marginRight = '6px'; + + if (value.getAttribute('placeholders') == '1') + { + input.setAttribute('checked', 'checked'); + input.defaultChecked = true; + } + + mxEvent.addListener(input, 'click', function() + { + if (value.getAttribute('placeholders') == '1') + { + value.removeAttribute('placeholders'); + } + else + { + value.setAttribute('placeholders', '1'); + } + }); + + replace.appendChild(input); + mxUtils.write(replace, mxResources.get('placeholders')); + + if (EditDataDialog.placeholderHelpLink != null) + { + var link = document.createElement('a'); + link.setAttribute('href', EditDataDialog.placeholderHelpLink); + link.setAttribute('title', mxResources.get('help')); + link.setAttribute('target', '_blank'); + link.style.marginLeft = '8px'; + link.style.cursor = 'help'; + + var icon = document.createElement('img'); + mxUtils.setOpacity(icon, 50); + icon.style.height = '16px'; + icon.style.width = '16px'; + icon.setAttribute('border', '0'); + icon.setAttribute('valign', 'middle'); + icon.style.marginTop = (mxClient.IS_IE11) ? '0px' : '-4px'; + icon.setAttribute('src', Editor.helpImage); + link.appendChild(icon); + + replace.appendChild(link); + } + + buttons.appendChild(replace); + } + + if (ui.editor.cancelFirst) + { + buttons.appendChild(cancelBtn); + buttons.appendChild(applyBtn); + } + else + { + buttons.appendChild(applyBtn); + buttons.appendChild(cancelBtn); + } + + div.appendChild(buttons); + this.container = div; +}; + +/** + * Optional help link. + */ +EditDataDialog.getDisplayIdForCell = function(ui, cell) +{ + var id = null; + + if (ui.editor.graph.getModel().getParent(cell) != null) + { + id = cell.getId(); + } + + return id; +}; + +/** + * Optional help link. + */ +EditDataDialog.placeholderHelpLink = null; + +/** + * Constructs a new link dialog. + */ +var LinkDialog = function(editorUi, initialValue, btnLabel, fn) +{ + var div = document.createElement('div'); + mxUtils.write(div, mxResources.get('editLink') + ':'); + + var inner = document.createElement('div'); + inner.className = 'geTitle'; + inner.style.backgroundColor = 'transparent'; + inner.style.borderColor = 'transparent'; + inner.style.whiteSpace = 'nowrap'; + inner.style.textOverflow = 'clip'; + inner.style.cursor = 'default'; + + if (!mxClient.IS_VML) + { + inner.style.paddingRight = '20px'; + } + + var linkInput = document.createElement('input'); + linkInput.setAttribute('value', initialValue); + linkInput.setAttribute('placeholder', 'http://www.example.com/'); + linkInput.setAttribute('type', 'text'); + linkInput.style.marginTop = '6px'; + linkInput.style.width = '400px'; + linkInput.style.backgroundImage = 'url(\'' + Dialog.prototype.clearImage + '\')'; + linkInput.style.backgroundRepeat = 'no-repeat'; + linkInput.style.backgroundPosition = '100% 50%'; + linkInput.style.paddingRight = '14px'; + + var cross = document.createElement('div'); + cross.setAttribute('title', mxResources.get('reset')); + cross.style.position = 'relative'; + cross.style.left = '-16px'; + cross.style.width = '12px'; + cross.style.height = '14px'; + cross.style.cursor = 'pointer'; + + // Workaround for inline-block not supported in IE + cross.style.display = (mxClient.IS_VML) ? 'inline' : 'inline-block'; + cross.style.top = ((mxClient.IS_VML) ? 0 : 3) + 'px'; + + // Needed to block event transparency in IE + cross.style.background = 'url(' + IMAGE_PATH + '/transparent.gif)'; + + mxEvent.addListener(cross, 'click', function() + { + linkInput.value = ''; + linkInput.focus(); + }); + + inner.appendChild(linkInput); + inner.appendChild(cross); + div.appendChild(inner); + + this.init = function() + { + linkInput.focus(); + + if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS) + { + linkInput.select(); + } + else + { + document.execCommand('selectAll', false, null); + } + }; + + var btns = document.createElement('div'); + btns.style.marginTop = '18px'; + btns.style.textAlign = 'right'; + + mxEvent.addListener(linkInput, 'keypress', function(e) + { + if (e.keyCode == 13) + { + editorUi.hideDialog(); + fn(linkInput.value); + } + }); + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + btns.appendChild(cancelBtn); + } + + var mainBtn = mxUtils.button(btnLabel, function() + { + editorUi.hideDialog(); + fn(linkInput.value); + }); + mainBtn.className = 'geBtn gePrimaryBtn'; + btns.appendChild(mainBtn); + + if (!editorUi.editor.cancelFirst) + { + btns.appendChild(cancelBtn); + } + + div.appendChild(btns); + + this.container = div; +}; + +/** + * + */ +var OutlineWindow = function(editorUi, x, y, w, h) +{ + var graph = editorUi.editor.graph; + + var div = document.createElement('div'); + div.style.position = 'absolute'; + div.style.width = '100%'; + div.style.height = '100%'; + div.style.border = '1px solid whiteSmoke'; + div.style.overflow = 'hidden'; + + this.window = new mxWindow(mxResources.get('outline'), div, x, y, w, h, true, true); + this.window.minimumSize = new mxRectangle(0, 0, 80, 80); + this.window.destroyOnClose = false; + this.window.setMaximizable(false); + this.window.setResizable(true); + this.window.setClosable(true); + this.window.setVisible(true); + + this.window.setLocation = function(x, y) + { + var iw = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth; + var ih = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight; + + x = Math.max(0, Math.min(x, iw - this.table.clientWidth)); + y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48)); + + if (this.getX() != x || this.getY() != y) + { + mxWindow.prototype.setLocation.apply(this, arguments); + } + }; + + var resizeListener = mxUtils.bind(this, function() + { + var x = this.window.getX(); + var y = this.window.getY(); + + this.window.setLocation(x, y); + }); + + mxEvent.addListener(window, 'resize', resizeListener); + + var outline = editorUi.createOutline(this.window); + + this.destroy = function() + { + mxEvent.removeListener(window, 'resize', resizeListener); + this.window.destroy(); + outline.destroy(); + } + + this.window.addListener(mxEvent.RESIZE, mxUtils.bind(this, function() + { + outline.update(false); + outline.outline.sizeDidChange(); + })); + + this.window.addListener(mxEvent.SHOW, mxUtils.bind(this, function() + { + this.window.fit(); + outline.suspended = false; + outline.outline.refresh(); + outline.update(); + })); + + this.window.addListener(mxEvent.HIDE, mxUtils.bind(this, function() + { + outline.suspended = true; + })); + + this.window.addListener(mxEvent.NORMALIZE, mxUtils.bind(this, function() + { + outline.suspended = false; + outline.update(); + })); + + this.window.addListener(mxEvent.MINIMIZE, mxUtils.bind(this, function() + { + outline.suspended = true; + })); + + var outlineCreateGraph = outline.createGraph; + outline.createGraph = function(container) + { + var g = outlineCreateGraph.apply(this, arguments); + g.gridEnabled = false; + g.pageScale = graph.pageScale; + g.pageFormat = graph.pageFormat; + g.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background; + g.pageVisible = graph.pageVisible; + + var current = mxUtils.getCurrentStyle(graph.container); + div.style.backgroundColor = current.backgroundColor; + + return g; + }; + + function update() + { + outline.outline.pageScale = graph.pageScale; + outline.outline.pageFormat = graph.pageFormat; + outline.outline.pageVisible = graph.pageVisible; + outline.outline.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background;; + + var current = mxUtils.getCurrentStyle(graph.container); + div.style.backgroundColor = current.backgroundColor; + + if (graph.view.backgroundPageShape != null && outline.outline.view.backgroundPageShape != null) + { + outline.outline.view.backgroundPageShape.fill = graph.view.backgroundPageShape.fill; + } + + outline.outline.refresh(); + }; + + outline.init(div); + + editorUi.editor.addListener('resetGraphView', update); + editorUi.addListener('pageFormatChanged', update); + editorUi.addListener('backgroundColorChanged', update); + editorUi.addListener('backgroundImageChanged', update); + editorUi.addListener('pageViewChanged', function() + { + update(); + outline.update(true); + }); + + if (outline.outline.dialect == mxConstants.DIALECT_SVG) + { + var zoomInAction = editorUi.actions.get('zoomIn'); + var zoomOutAction = editorUi.actions.get('zoomOut'); + + mxEvent.addMouseWheelListener(function(evt, up) + { + var outlineWheel = false; + var source = mxEvent.getSource(evt); + + while (source != null) + { + if (source == outline.outline.view.canvas.ownerSVGElement) + { + outlineWheel = true; + break; + } + + source = source.parentNode; + } + + if (outlineWheel) + { + if (up) + { + zoomInAction.funct(); + } + else + { + zoomOutAction.funct(); + } + } + }); + } +}; + +/** + * + */ +var LayersWindow = function(editorUi, x, y, w, h) +{ + var graph = editorUi.editor.graph; + + var div = document.createElement('div'); + div.style.userSelect = 'none'; + div.style.background = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; + div.style.border = '1px solid whiteSmoke'; + div.style.height = '100%'; + div.style.marginBottom = '10px'; + div.style.overflow = 'auto'; + + var tbarHeight = (!EditorUi.compactUi) ? '30px' : '26px'; + + var listDiv = document.createElement('div') + listDiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? '#dcdcdc' : Dialog.backdropColor; + listDiv.style.position = 'absolute'; + listDiv.style.overflow = 'auto'; + listDiv.style.left = '0px'; + listDiv.style.right = '0px'; + listDiv.style.top = '0px'; + listDiv.style.bottom = (parseInt(tbarHeight) + 7) + 'px'; + div.appendChild(listDiv); + + var dragSource = null; + var dropIndex = null; + + mxEvent.addListener(div, 'dragover', function(evt) + { + evt.dataTransfer.dropEffect = 'move'; + dropIndex = 0; + evt.stopPropagation(); + evt.preventDefault(); + }); + + // Workaround for "no element found" error in FF + mxEvent.addListener(div, 'drop', function(evt) + { + evt.stopPropagation(); + evt.preventDefault(); + }); + + var layerCount = null; + var selectionLayer = null; + var ldiv = document.createElement('div'); + + ldiv.className = 'geToolbarContainer'; + ldiv.style.position = 'absolute'; + ldiv.style.bottom = '0px'; + ldiv.style.left = '0px'; + ldiv.style.right = '0px'; + ldiv.style.height = tbarHeight; + ldiv.style.overflow = 'hidden'; + ldiv.style.padding = (!EditorUi.compactUi) ? '1px' : '4px 0px 3px 0px'; + ldiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; + ldiv.style.borderWidth = '1px 0px 0px 0px'; + ldiv.style.borderColor = '#c3c3c3'; + ldiv.style.borderStyle = 'solid'; + ldiv.style.display = 'block'; + ldiv.style.whiteSpace = 'nowrap'; + + if (mxClient.IS_QUIRKS) + { + ldiv.style.filter = 'none'; + } + + var link = document.createElement('a'); + link.className = 'geButton'; + + if (mxClient.IS_QUIRKS) + { + link.style.filter = 'none'; + } + + var removeLink = link.cloneNode(); + removeLink.innerHTML = '
'; + + mxEvent.addListener(removeLink, 'click', function(evt) + { + if (graph.isEnabled()) + { + graph.model.beginUpdate(); + try + { + var index = graph.model.root.getIndex(selectionLayer); + graph.removeCells([selectionLayer], false); + + // Creates default layer if no layer exists + if (graph.model.getChildCount(graph.model.root) == 0) + { + graph.model.add(graph.model.root, new mxCell()); + graph.setDefaultParent(null); + } + else if (index > 0 && index <= graph.model.getChildCount(graph.model.root)) + { + graph.setDefaultParent(graph.model.getChildAt(graph.model.root, index - 1)); + } + else + { + graph.setDefaultParent(null); + } + } + finally + { + graph.model.endUpdate(); + } + } + + mxEvent.consume(evt); + }); + + if (!graph.isEnabled()) + { + removeLink.className = 'geButton mxDisabled'; + } + + ldiv.appendChild(removeLink); + + var insertLink = link.cloneNode(); + insertLink.setAttribute('title', mxUtils.trim(mxResources.get('moveSelectionTo', ['']))); + insertLink.innerHTML = '
'; + + mxEvent.addListener(insertLink, 'click', function(evt) + { + if (graph.isEnabled() && !graph.isSelectionEmpty()) + { + editorUi.editor.graph.popupMenuHandler.hideMenu(); + + var menu = new mxPopupMenu(mxUtils.bind(this, function(menu, parent) + { + for (var i = layerCount - 1; i >= 0; i--) + { + (mxUtils.bind(this, function(child) + { + var item = menu.addItem(graph.convertValueToString(child) || + mxResources.get('background'), null, mxUtils.bind(this, function() + { + graph.moveCells(graph.getSelectionCells(), 0, 0, false, child); + }), parent); + + if (graph.getSelectionCount() == 1 && graph.model.isAncestor(child, graph.getSelectionCell())) + { + menu.addCheckmark(item, Editor.checkmarkImage); + } + + }))(graph.model.getChildAt(graph.model.root, i)); + } + })); + menu.div.className += ' geMenubarMenu'; + menu.smartSeparators = true; + menu.showDisabled = true; + menu.autoExpand = true; + + // Disables autoexpand and destroys menu when hidden + menu.hideMenu = mxUtils.bind(this, function() + { + mxPopupMenu.prototype.hideMenu.apply(menu, arguments); + menu.destroy(); + }); + + var offset = mxUtils.getOffset(insertLink); + menu.popup(offset.x, offset.y + insertLink.offsetHeight, null, evt); + + // Allows hiding by clicking on document + editorUi.setCurrentMenu(menu); + } + }); + + ldiv.appendChild(insertLink); + + var dataLink = link.cloneNode(); + dataLink.innerHTML = '
'; + dataLink.setAttribute('title', mxResources.get('rename')); + + mxEvent.addListener(dataLink, 'click', function(evt) + { + if (graph.isEnabled()) + { + editorUi.showDataDialog(selectionLayer); + } + + mxEvent.consume(evt); + }); + + if (!graph.isEnabled()) + { + dataLink.className = 'geButton mxDisabled'; + } + + ldiv.appendChild(dataLink); + + function renameLayer(layer) + { + if (graph.isEnabled() && layer != null) + { + var label = graph.convertValueToString(layer); + var dlg = new FilenameDialog(editorUi, label || mxResources.get('background'), mxResources.get('rename'), mxUtils.bind(this, function(newValue) + { + if (newValue != null) + { + graph.cellLabelChanged(layer, newValue); + } + }), mxResources.get('enterName')); + editorUi.showDialog(dlg.container, 300, 100, true, true); + dlg.init(); + } + }; + + var duplicateLink = link.cloneNode(); + duplicateLink.innerHTML = '
'; + + mxEvent.addListener(duplicateLink, 'click', function(evt) + { + if (graph.isEnabled()) + { + var newCell = null; + graph.model.beginUpdate(); + try + { + newCell = graph.cloneCell(selectionLayer); + graph.cellLabelChanged(newCell, mxResources.get('untitledLayer')); + newCell.setVisible(true); + newCell = graph.addCell(newCell, graph.model.root); + graph.setDefaultParent(newCell); + } + finally + { + graph.model.endUpdate(); + } + + if (newCell != null && !graph.isCellLocked(newCell)) + { + graph.selectAll(newCell); + } + } + }); + + if (!graph.isEnabled()) + { + duplicateLink.className = 'geButton mxDisabled'; + } + + ldiv.appendChild(duplicateLink); + + var addLink = link.cloneNode(); + addLink.innerHTML = '
'; + addLink.setAttribute('title', mxResources.get('addLayer')); + + mxEvent.addListener(addLink, 'click', function(evt) + { + if (graph.isEnabled()) + { + graph.model.beginUpdate(); + + try + { + var cell = graph.addCell(new mxCell(mxResources.get('untitledLayer')), graph.model.root); + graph.setDefaultParent(cell); + } + finally + { + graph.model.endUpdate(); + } + } + + mxEvent.consume(evt); + }); + + if (!graph.isEnabled()) + { + addLink.className = 'geButton mxDisabled'; + } + + ldiv.appendChild(addLink); + div.appendChild(ldiv); + + function refresh() + { + layerCount = graph.model.getChildCount(graph.model.root) + listDiv.innerHTML = ''; + + function addLayer(index, label, child, defaultParent) + { + var ldiv = document.createElement('div'); + ldiv.className = 'geToolbarContainer'; + + ldiv.style.overflow = 'hidden'; + ldiv.style.position = 'relative'; + ldiv.style.padding = '4px'; + ldiv.style.height = '22px'; + ldiv.style.display = 'block'; + ldiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; + ldiv.style.borderWidth = '0px 0px 1px 0px'; + ldiv.style.borderColor = '#c3c3c3'; + ldiv.style.borderStyle = 'solid'; + ldiv.style.whiteSpace = 'nowrap'; + ldiv.setAttribute('title', label); + + var left = document.createElement('div'); + left.style.display = 'inline-block'; + left.style.width = '100%'; + left.style.textOverflow = 'ellipsis'; + left.style.overflow = 'hidden'; + + mxEvent.addListener(ldiv, 'dragover', function(evt) + { + evt.dataTransfer.dropEffect = 'move'; + dropIndex = index; + evt.stopPropagation(); + evt.preventDefault(); + }); + + mxEvent.addListener(ldiv, 'dragstart', function(evt) + { + dragSource = ldiv; + + // Workaround for no DnD on DIV in FF + if (mxClient.IS_FF) + { + // LATER: Check what triggers a parse as XML on this in FF after drop + evt.dataTransfer.setData('Text', ''); + } + }); + + mxEvent.addListener(ldiv, 'dragend', function(evt) + { + if (dragSource != null && dropIndex != null) + { + graph.addCell(child, graph.model.root, dropIndex); + } + + dragSource = null; + dropIndex = null; + evt.stopPropagation(); + evt.preventDefault(); + }); + + var btn = document.createElement('img'); + btn.setAttribute('draggable', 'false'); + btn.setAttribute('align', 'top'); + btn.setAttribute('border', '0'); + btn.style.padding = '4px'; + btn.setAttribute('title', mxResources.get('lockUnlock')); + + var style = graph.getCurrentCellStyle(child); + + if (mxUtils.getValue(style, 'locked', '0') == '1') + { + btn.setAttribute('src', Dialog.prototype.lockedImage); + } + else + { + btn.setAttribute('src', Dialog.prototype.unlockedImage); + } + + if (graph.isEnabled()) + { + btn.style.cursor = 'pointer'; + } + + mxEvent.addListener(btn, 'click', function(evt) + { + if (graph.isEnabled()) + { + var value = null; + + graph.getModel().beginUpdate(); + try + { + value = (mxUtils.getValue(style, 'locked', '0') == '1') ? null : '1'; + graph.setCellStyles('locked', value, [child]); + } + finally + { + graph.getModel().endUpdate(); + } + + if (value == '1') + { + graph.removeSelectionCells(graph.getModel().getDescendants(child)); + } + + mxEvent.consume(evt); + } + }); + + left.appendChild(btn); + + var inp = document.createElement('input'); + inp.setAttribute('type', 'checkbox'); + inp.setAttribute('title', mxResources.get('hideIt', [child.value || mxResources.get('background')])); + inp.style.marginLeft = '4px'; + inp.style.marginRight = '6px'; + inp.style.marginTop = '4px'; + left.appendChild(inp); + + if (graph.model.isVisible(child)) + { + inp.setAttribute('checked', 'checked'); + inp.defaultChecked = true; + } + + mxEvent.addListener(inp, 'click', function(evt) + { + graph.model.setVisible(child, !graph.model.isVisible(child)); + mxEvent.consume(evt); + }); + + mxUtils.write(left, label); + ldiv.appendChild(left); + + if (graph.isEnabled()) + { + // Fallback if no drag and drop is available + if (mxClient.IS_TOUCH || mxClient.IS_POINTER || mxClient.IS_VML || + (mxClient.IS_IE && document.documentMode < 10)) + { + var right = document.createElement('div'); + right.style.display = 'block'; + right.style.textAlign = 'right'; + right.style.whiteSpace = 'nowrap'; + right.style.position = 'absolute'; + right.style.right = '6px'; + right.style.top = '6px'; + + // Poor man's change layer order + if (index > 0) + { + var img2 = document.createElement('a'); + + img2.setAttribute('title', mxResources.get('toBack')); + + img2.className = 'geButton'; + img2.style.cssFloat = 'none'; + img2.innerHTML = '▼'; + img2.style.width = '14px'; + img2.style.height = '14px'; + img2.style.fontSize = '14px'; + img2.style.margin = '0px'; + img2.style.marginTop = '-1px'; + right.appendChild(img2); + + mxEvent.addListener(img2, 'click', function(evt) + { + if (graph.isEnabled()) + { + graph.addCell(child, graph.model.root, index - 1); + } + + mxEvent.consume(evt); + }); + } + + if (index >= 0 && index < layerCount - 1) + { + var img1 = document.createElement('a'); + + img1.setAttribute('title', mxResources.get('toFront')); + + img1.className = 'geButton'; + img1.style.cssFloat = 'none'; + img1.innerHTML = '▲'; + img1.style.width = '14px'; + img1.style.height = '14px'; + img1.style.fontSize = '14px'; + img1.style.margin = '0px'; + img1.style.marginTop = '-1px'; + right.appendChild(img1); + + mxEvent.addListener(img1, 'click', function(evt) + { + if (graph.isEnabled()) + { + graph.addCell(child, graph.model.root, index + 1); + } + + mxEvent.consume(evt); + }); + } + + ldiv.appendChild(right); + } + + if (mxClient.IS_SVG && (!mxClient.IS_IE || document.documentMode >= 10)) + { + ldiv.setAttribute('draggable', 'true'); + ldiv.style.cursor = 'move'; + } + } + + mxEvent.addListener(ldiv, 'dblclick', function(evt) + { + var nodeName = mxEvent.getSource(evt).nodeName; + + if (nodeName != 'INPUT' && nodeName != 'IMG') + { + renameLayer(child); + mxEvent.consume(evt); + } + }); + + if (graph.getDefaultParent() == child) + { + ldiv.style.background = (Dialog.backdropColor == 'white') ? '#e6eff8' : '#505759'; + ldiv.style.fontWeight = (graph.isEnabled()) ? 'bold' : ''; + selectionLayer = child; + } + else + { + mxEvent.addListener(ldiv, 'click', function(evt) + { + if (graph.isEnabled()) + { + graph.setDefaultParent(defaultParent); + graph.view.setCurrentRoot(null); + refresh(); + } + }); + } + + listDiv.appendChild(ldiv); + }; + + // Cannot be moved or deleted + for (var i = layerCount - 1; i >= 0; i--) + { + (mxUtils.bind(this, function(child) + { + addLayer(i, graph.convertValueToString(child) || + mxResources.get('background'), child, child); + }))(graph.model.getChildAt(graph.model.root, i)); + } + + var label = graph.convertValueToString(selectionLayer) || mxResources.get('background'); + removeLink.setAttribute('title', mxResources.get('removeIt', [label])); + duplicateLink.setAttribute('title', mxResources.get('duplicateIt', [label])); + dataLink.setAttribute('title', mxResources.get('editData')); + + if (graph.isSelectionEmpty()) + { + insertLink.className = 'geButton mxDisabled'; + } + }; + + refresh(); + graph.model.addListener(mxEvent.CHANGE, function() + { + refresh(); + }); + + graph.selectionModel.addListener(mxEvent.CHANGE, function() + { + if (graph.isSelectionEmpty()) + { + insertLink.className = 'geButton mxDisabled'; + } + else + { + insertLink.className = 'geButton'; + } + }); + + this.window = new mxWindow(mxResources.get('layers'), div, x, y, w, h, true, true); + this.window.minimumSize = new mxRectangle(0, 0, 120, 120); + this.window.destroyOnClose = false; + this.window.setMaximizable(false); + this.window.setResizable(true); + this.window.setClosable(true); + this.window.setVisible(true); + + this.init = function() + { + listDiv.scrollTop = listDiv.scrollHeight - listDiv.clientHeight; + }; + + this.window.addListener(mxEvent.SHOW, mxUtils.bind(this, function() + { + this.window.fit(); + })); + + // Make refresh available via instance + this.refreshLayers = refresh; + + this.window.setLocation = function(x, y) + { + var iw = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth; + var ih = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight; + + x = Math.max(0, Math.min(x, iw - this.table.clientWidth)); + y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48)); + + if (this.getX() != x || this.getY() != y) + { + mxWindow.prototype.setLocation.apply(this, arguments); + } + }; + + var resizeListener = mxUtils.bind(this, function() + { + var x = this.window.getX(); + var y = this.window.getY(); + + this.window.setLocation(x, y); + }); + + mxEvent.addListener(window, 'resize', resizeListener); + + this.destroy = function() + { + mxEvent.removeListener(window, 'resize', resizeListener); + this.window.destroy(); + } +}; diff --git a/public/js/grapheditor/js/Editor.js b/public/js/grapheditor/js/Editor.js new file mode 100644 index 000000000..604d95c2b --- /dev/null +++ b/public/js/grapheditor/js/Editor.js @@ -0,0 +1,2704 @@ +/** + * Copyright (c) 2006-2012, JGraph Ltd + */ +/** + * Editor constructor executed on page load. + */ +Editor = function(chromeless, themes, model, graph, editable) +{ + mxEventSource.call(this); + this.chromeless = (chromeless != null) ? chromeless : this.chromeless; + this.initStencilRegistry(); + this.graph = graph || this.createGraph(themes, model); + this.editable = (editable != null) ? editable : !chromeless; + this.undoManager = this.createUndoManager(); + this.status = ''; + + this.getOrCreateFilename = function() + { + return this.filename || mxResources.get('drawing', [Editor.pageCounter]) + '.xml'; + }; + + this.getFilename = function() + { + return this.filename; + }; + + // Sets the status and fires a statusChanged event + this.setStatus = function(value) + { + this.status = value; + this.fireEvent(new mxEventObject('statusChanged')); + }; + + // Returns the current status + this.getStatus = function() + { + return this.status; + }; + + // Updates modified state if graph changes + this.graphChangeListener = function(sender, eventObject) + { + var edit = (eventObject != null) ? eventObject.getProperty('edit') : null; + + if (edit == null || !edit.ignoreEdit) + { + this.setModified(true); + } + }; + + this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() + { + this.graphChangeListener.apply(this, arguments); + })); + + // Sets persistent graph state defaults + this.graph.resetViewOnRootChange = false; + this.init(); +}; + +/** + * Counts open editor tabs (must be global for cross-window access) + */ +Editor.pageCounter = 0; + +// Cross-domain window access is not allowed in FF, so if we +// were opened from another domain then this will fail. +(function() +{ + try + { + var op = window; + + while (op.opener != null && typeof op.opener.Editor !== 'undefined' && + !isNaN(op.opener.Editor.pageCounter) && + // Workaround for possible infinite loop in FF https://drawio.atlassian.net/browse/DS-795 + op.opener != op) + { + op = op.opener; + } + + // Increments the counter in the first opener in the chain + if (op != null) + { + op.Editor.pageCounter++; + Editor.pageCounter = op.Editor.pageCounter; + } + } + catch (e) + { + // ignore + } +})(); + +/** + * Specifies if local storage should be used (eg. on the iPad which has no filesystem) + */ +Editor.useLocalStorage = typeof(Storage) != 'undefined' && mxClient.IS_IOS; + +/** + * + */ +Editor.moveImage = (mxClient.IS_SVG) ? 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI4cHgiIGhlaWdodD0iMjhweCI+PGc+PC9nPjxnPjxnPjxnPjxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuNCwyLjQpc2NhbGUoMC44KXJvdGF0ZSg0NSwxMiwxMikiIHN0cm9rZT0iIzI5YjZmMiIgZmlsbD0iIzI5YjZmMiIgZD0iTTE1LDNsMi4zLDIuM2wtMi44OSwyLjg3bDEuNDIsMS40MkwxOC43LDYuN0wyMSw5VjNIMTV6IE0zLDlsMi4zLTIuM2wyLjg3LDIuODlsMS40Mi0xLjQyTDYuNyw1LjNMOSwzSDNWOXogTTksMjEgbC0yLjMtMi4zbDIuODktMi44N2wtMS40Mi0xLjQyTDUuMywxNy4zTDMsMTV2Nkg5eiBNMjEsMTVsLTIuMywyLjNsLTIuODctMi44OWwtMS40MiwxLjQybDIuODksMi44N0wxNSwyMWg2VjE1eiIvPjwvZz48L2c+PC9nPjwvc3ZnPgo=' : + IMAGE_PATH + '/move.png'; + +/** + * Images below are for lightbox and embedding toolbars. + */ +Editor.helpImage = (mxClient.IS_SVG) ? 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSJub25lIiBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZD0iTTExIDE4aDJ2LTJoLTJ2MnptMS0xNkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6bTAtMTRjLTIuMjEgMC00IDEuNzktNCA0aDJjMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIDItMyAxLjc1LTMgNWgyYzAtMi4yNSAzLTIuNSAzLTUgMC0yLjIxLTEuNzktNC00LTR6Ii8+PC9zdmc+' : + IMAGE_PATH + '/help.png'; + +/** + * Sets the default font size. + */ +Editor.checkmarkImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhFQAVAMQfAGxsbHx8fIqKioaGhvb29nJycvr6+sDAwJqamltbW5OTk+np6YGBgeTk5Ly8vJiYmP39/fLy8qWlpa6ursjIyOLi4vj4+N/f3+3t7fT09LCwsHZ2dubm5r6+vmZmZv///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEY4NTZERTQ5QUFBMTFFMUE5MTVDOTM5MUZGMTE3M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEY4NTZERTU5QUFBMTFFMUE5MTVDOTM5MUZGMTE3M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Rjg1NkRFMjlBQUExMUUxQTkxNUM5MzkxRkYxMTczRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Rjg1NkRFMzlBQUExMUUxQTkxNUM5MzkxRkYxMTczRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAB8ALAAAAAAVABUAAAVI4CeOZGmeaKqubKtylktSgCOLRyLd3+QJEJnh4VHcMoOfYQXQLBcBD4PA6ngGlIInEHEhPOANRkaIFhq8SuHCE1Hb8Lh8LgsBADs=' : + IMAGE_PATH + '/checkmark.gif'; + +/** + * Images below are for lightbox and embedding toolbars. + */ +Editor.maximizeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABXRSTlMA758vX1Pw3BoAAABJSURBVAjXY8AJQkODGBhUQ0MhbAUGBiYY24CBgRnGFmZgMISwgwwDGRhEhVVBbAVmEQYGRwMmBjIAQi/CTIRd6G5AuA3dzYQBAHj0EFdHkvV4AAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.zoomOutImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAsLCxxcXEhISFgYGChjTUxAAAAAXRSTlMAQObYZgAAAEdJREFUCNdjIAMwCQrB2YKCggJQJqMwA7MglK1owMBgqABVApITgLJZXFxgbIQ4Qj3CHIT5ggoIe5kgNkM1KSDYKBKqxPkDAPo5BAZBE54hAAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.zoomInImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAsLCwhISFxcXFgYGBavKaoAAAAAXRSTlMAQObYZgAAAElJREFUCNdjIAMwCQrB2YKCggJQJqMIA4sglK3owMzgqABVwsDMwCgAZTMbG8PYCHGEeoQ5CPMFFRD2MkFshmpSQLBRJFSJ8wcAEqcEM2uhl2MAAAAASUVORK5CYII='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.zoomFitImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAwMDBwcHBgYGC1xl09AAAAAXRSTlMAQObYZgAAAEFJREFUCNdjIAMwCQrB2YKCggJQJqMwA7MglK1owMBgqABVApITwMdGqEeYgzBfUAFhLxPEZqgmBQQbRUKFOH8AAK5OA3lA+FFOAAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.layersImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAaVBMVEUAAAAgICAICAgdHR0PDw8WFhYICAgLCwsXFxcvLy8ODg4uLi4iIiIqKiokJCQYGBgKCgonJycFBQUCAgIqKiocHBwcHBwODg4eHh4cHBwnJycJCQkUFBQqKiojIyMuLi4ZGRkgICAEBATOWYXAAAAAGnRSTlMAD7+fnz8/H7/ff18/77+vr5+fn39/b28fH2xSoKsAAACQSURBVBjTrYxJEsMgDARZZMAY73sgCcn/HxnhKtnk7j6oRq0psfuoyndZ/SuODkHPLzfVT6KeyPePnJ7KrnkRjWMXTn4SMnN8mXe2SSM3ts8L/ZUxxrbAULSYJJULE0Iw9pjpenoICcgcX61mGgTgtCv9Be99pzCoDhNQWQnchD1mup5++CYGcoQexajZbfwAj/0MD8ZOaUgAAAAASUVORK5CYII='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.previousImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAAh0lEQVQ4je3UsQnCUBCA4U8hpa1NsoEjpHQJS0dxADdwEMuMIJkgA1hYChbGQgMi+JC8q4L/AB/vDu7x74cWWEZhJU44RmA1zujR5GIbXF9YNrjD/Q0bDRY4fEBZ4P4LlgTnCbAf84pUM8/9hY08tMUtEoQ1LpEgrNBFglChFXR6Q6GfwwR6AGKJMF74Vtt3AAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.nextImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAAi0lEQVQ4jeXUIQ7CUAwA0MeGxWI2yylwnALJUdBcgYvM7QYLmjOQIAkIPmJZghiIvypoUtX0tfnJL38X5ZfaEgUeUcManFBHgS0SLlhHggk3bCPBhCf2keCQR8wjwYTDp6YiZxJmOU1jGw7vGALescuBxsArNlOwd/CM1VSM/ut1qCIw+uOwiMJ+OF4CQzBCXm3hyAAAAABJRU5ErkJggg=='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.editImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhCwALAIABAFdXV////yH5BAEAAAEALAAAAAALAAsAAAIZjB8AiKuc4jvLOGqzrjX6zmkWyChXaUJBAQA7' : IMAGE_PATH + '/edit.gif'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.zoomOutLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABJklEQVQ4y4WT2XaDMAxEvWD2nSSUNEnTJN3r//+9Sj7ILAY6L0ijC4ONYVZRpo6cByrz2YKSUGorGTpz71lPVHvT+avoB5wIkU/mxk8veceSuNoLg44IzziXjvpih72wKQnm8yc2UoiP/LAd8jQfe2Xf4Pq+2EyYIvv9wbzHHCgwxDdlBtWZOdqDfTCVgqpygQpsZaojVAVc9UjQxnAJDIBhiQv84tq3gMQCAVTxVoSibXJf8tMuc7e1TB/DCmejBNg/w1Y3c+AM5vv4w7xM59/oXamrHaLVqPQ+OTCnmMZxgz0SdL5zji0/ld6j88qGa5KIiBB6WeJGKfUKwSMKLuXgvl1TW0tm5R9UQL/efSDYsnzxD8CinhBsTTdugJatKpJwf8v+ADb8QmvW7AeAAAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.zoomInLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABKElEQVQ4y4WT6WKCMBCENwkBwn2oFKvWqr3L+79es4EkQIDOH2d3Pxk2ABiJlB8JCXjqw4LikHVGLHTm3nM3UeVN5690GBBN0GwyV/3kkrUQR+WeKnREeKpzaXWd77CmJiXGfPIEI4V4yQ9TIW/ntlcMBe731Vts9w5TWG8F5j3mQI4hvrKpdGeYA7CX9qAcl650gVJartxRuhyHVghF8idQAIbFLvCLu28BsQEC6aKtCK6Pyb3JT7PmbmtNH8Ny56CotD/2qOs5cJbuffxgXmCib+xddVU5RNOhkvvkhTlFehzVWCOh3++MYElOhfdovaImnRYVmqDdsuhNp1QrBBE6uGC2+3ZNjGdg5B94oD+9uyVgWT79BwAxEBTWdOu3bWBVgsn/N/AHUD9IC01Oe40AAAAASUVORK5CYII='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.actualSizeLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABIUlEQVQ4y4WT2XqDIBCFBxDc9yTWNEnTJN3r+79eGT4BEbXnaubMr8dBBaM450dCQp4LWFAascGIRd48eB4cNYE7f6XjgGiCFs5c+dml6CFN6j1V6IQIlHPpdV/usKcmJcV88gQTRXjLD9Mhb+fWq8YG9/uCmTCFjeeDeY85UGKIUGUuqzN42kv7oCouq9oHamlzVR1lVfpAIu1QVRiW+sAv7r4FpAYIZZVsRXB9TP5Dfpo1d1trCgzz1iiptH/sUbdz4CzN9+mLeXHn3+hdddd4RDegsrvzwZwSs2GLPRJidAqCLTlVwaMPqpYMWjTWBB2WRW86pVkhSKyDK2bdt2tmagZG4sBD/evdLQHLEvQfAOKRoLCmG1FAB6uKmby+gz+REDn7O5+EwQAAAABJRU5ErkJggg=='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.printLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAXVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9RKvvlAAAAHnRSTlMAydnl77qbMLT093H7K4Nd4Ktn082+lYt5bkklEgP44nQSAAAApUlEQVQ4y73P2Q6DIBRF0cOgbRHHzhP//5m9mBAQKjG1cT0Yc7ITAMu1LNQgUZiQ2DYoNQ0sCQb6qgHAfRx48opq3J9AZ6xuF7uOew8Ik1OsCZRS2UAC9V+D9a+QZYxNA45YFQftPtSkATOhw7dAc0vPBwKWiIOjP0JZ0yMuQJ27g36DipOUsqRAM0dR8KD1/ILHaHSE/w8DIx09E3g/BTce6rHUB5sAPKvfF+JdAAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.layersLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAmVBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v7///+bnZkkAAAAMnRSTlMABPr8ByiD88KsTi/rvJb272mjeUA1CuPe1M/KjVxYHxMP6KZ0S9nYzGRGGRaznpGIbzaGUf0AAAHESURBVDjLbZLZYoIwEEVDgLCjbKIgAlqXqt3m/z+uNwu1rcyDhjl3ktnYL7OY254C0VX3yWFZfzDrOClbbgKxi0YDHjwl4jbnRkXxJS/C1YP3DbBhD1n7Ex4uaAqdVDb3yJ/4J/3nJD2to/ngQz/DfUvzMp4JJ5sSCaF5oXmemgQDfDxzbi+Kq4sU+vNcuAmx94JtyOP2DD4Epz2asWSCz4Z/4fECxyNj9zC9xNLHcdPEO+awDKeSaUu0W4twZQiO2hYVisTR3RCtK/c1X6t4xMEpiGqXqVntEBLolkZZsKY4QtwH6jzq67dEHlJysB1aNOD3XT7n1UkasQN59L4yC2RELMDSeCRtz3yV22Ub3ozIUTknYx8JWqDdQxbUes98cR2kZtUSveF/bAhcedwEWmlxIkpZUy4XOCb6VBjjxHvbwo/1lBAHHi2JCr0NI570QhyHq/DhJoE2lLgyA4RVe6KmZ47O/3b86MCP0HWa73A8/C3SUc5Qc1ajt6fgpXJ+RGpMvDSchepZDOOQRcZVIKcK90x2D7etqtI+56+u6n3sPriO6nfphitR4+O2m3EbM7lh3me1FM1o+LMI887rN+s3/wZdTFlpNVJiOAAAAABJRU5ErkJggg=='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.closeLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAUVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////8IN+deAAAAGnRSTlMAuvAIg/dDM/QlOeuFhj0S5s4vKgzjxJRQNiLSey0AAADNSURBVDjLfZLbEoMgDEQjRRRs1XqX///QNmOHJSnjPkHOGR7IEmeoGtJZstnwjqbRfIsmgEdtPCqe9Ynz7ZSc07rE2QiSc+qv8TvjRXA2PDUm3dpe82iJhOEUfxJJo3aCv+jKmRmH4lcCjCjeh9GWOdL/GZZkXH3PYYDrHBnfc4D/RVZf5sjoC1was+Y6HQxwaUxFvq/a0Pv343VCTxfBSRiB+ab3M3eiQZXmMNBJ3Y8pGRZtYQ7DgHMXJEdPLTaN/qBjzJOBc3nmNcbsA16bMR0oLqf+AAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.editLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAgVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9d3yJTAAAAKnRSTlMA+hzi3nRQWyXzkm0h2j3u54gzEgSXjlYoTBgJxL2loGpAOS3Jt7Wxm35Ga7gRAAAA6UlEQVQ4y63Q2XaCMBSF4Q0JBasoQ5DJqbXjfv8HbCK2BZNwo/8FXHx7rcMC7lQu0iX8qU/qtvAWCpoqH8dYzS0SwaV5eK/UAf8X9pd2CWKzuF5Jrftp1owXwnIGLUaL3PYndOHf4kNNXWrXK/m7CHunk7K8LE6YtBpcknwG9GKxnroY+ylBXcx4xKyx/u/EuXi509cP9V7OO1oyHnzrdFTcqLG/4ibBA5pIMr/4xvKzuQDkVy9wW8SgBFD6HDvuzMvrZcC9QlkfMzI7w64m+b4PqBMNHB05lH21PVxJo2/fBXxV4hB38PcD+5AkI4FuETsAAAAASUVORK5CYII='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.previousLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAD////////////////////////////////////////////////////////////////////////////YSWgTAAAAE3RSTlMA7fci493c0MW8uJ6CZks4MxQHEZL6ewAAAFZJREFUOMvdkskRgDAMA4lDwg2B7b9XOlge/KKvdsa25KFb5XlRvxXC/DNBEv8IFNjBgGdDgXtFgTyhwDXiQAUHCvwa4Uv6mR6UR+1led2mVonvl+tML45qCQNQLIx7AAAAAElFTkSuQmCC'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.nextLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAD////////////////////////////////////////////////////////////////////////////YSWgTAAAAE3RSTlMA7fci493c0MW8uJ6CZks4MxQHEZL6ewAAAFRJREFUOMvd0skRgCAQBVEFwQ0V7fxzNQP6wI05v6pZ/kyj1b7FNgik2gQzzLcAwiUAigHOTwDHK4A1CmB5BJANJG1hQ9qafYcqFlZP3IFc9eVGrR+iIgkDQRUXIAAAAABJRU5ErkJggg=='; + +/** + * Specifies the image to be used for the refresh button. + */ +Editor.refreshLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAolBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8ELnaCAAAANXRSTlMABfyE2QKU+dfNyyDyoVYKwnTv7N+6rntsYlFNQjEqEw316uSzf2c1JB3GvqebiVw6GAjQB4DQr10AAAE7SURBVDjLvZLXcoMwEABPIgRCx3TT3A3udqL//7UgAdGRcR4yk8k+idsdmgS/QyWEqD/axS2JDV33zlnzLHIzQ2MDq9OeJ3m8l76KKENYlxrmM/b65Ys1+8YxnTEZFIEY0vVhszFWfUGZDJpQTDznTgAe5k4XhQxILB7ruzBQn+kkyDXuHfRtjoYDEvH7J9Lz98dBZXXL94X0Ofco2PFlChKbjVzEdakoSlKjoNoqPYkJ/wUZAYwc+PpLj1Ei7+jdoBWlwQZoJv2H1w3CWgRvo7dd9DP5btgwCWz0M02+oVoxCcIWeY9PNmR6B++m9prMxYEISpCBYBlfy9bc745is7UUULAem1Ww7FfalsiA2uaJsgmWP3pQI9q9/yMLkaaHAp2fxhHff/cNq7dBdHXhGW7l+Mo2zU0Cf8knJ2xA0oJ8enwAAAAASUVORK5CYII='; + +/** + * Specifies the image to be used for the back button. + */ +Editor.backLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAclBMVEUAAAD////////////////+/v7////////////////////////////////////////////+/v7///////////////////////////////////////////////////////////////////////////////8vKLfTAAAAJXRSTlMACh7h9gby3NLIwzwZ55uVJgH57b+8tbCljYV1RRMQ46FrTzQw+vtxOQAAAJ5JREFUOMuF00cWgzAQA1DRDQFCbwFSdf8rZpdVrNH2z3tuMv7mldZQ2WN2yi8x+TT8JvyTkqvwpiKvwsOIrA1fWr+XGTklfj8dOQR+D3KyUF6QufBkJN0hfCazEv6sZBRCJDUcPasGKpu1RLtYE8lkHAPBQLoTsK/SfAyRw5FjAuhCzC2MSj0gJ+66lHatgXdKboD9tfREB5m9/+3iC9jHDYvsGNcUAAAAAElFTkSuQmCC'; + +/** + * Specifies the image to be used for the back button. + */ +Editor.fullscreenLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAllBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AJcWoAAAAMXRSTlMA+wIFxPWPCIb446tnUxmsoIykgxTe29jQnpKBe2MNsZhVTR/KyLuWbFhEPjUq7L9z+bQj+gAAAWxJREFUOMttk4l2gkAMRTODCO4FtQgIbnWpS9v8/881iZFh8R51NO8GJ+gAjMN8zuTRFSw04cIOHQcqFHH6oaQFGxf0jeBjEgB8Y52TpW9Ag4zB5QICWOtHrgwGuFZBcw+gPP0MFS7+iiD5inOmDIQS9sZgTwUzwEzyxhxHVEEU7NdDUXsqUPtqjIgR2IZSCT4upzSeIeOdcMHnfDsx3giPoezfU6MrQGB5//SckLEG2xYscK4GfnUFqaix39zrwooaOD/cXoYuvHKQIc7pzd3HVPusp6t2FAW/RmjMonbl8vwHDeZo/GkleJC7e+p5XA/rAq1X/V10wKag04rBpa2/d0LL4OYYceOEtsG5jyMntI1wS+N1BGcQBl/CoLoPOl9ABrW/BP53e1bwSJHHlkIVchJwmHwyyfJ4kIvEnKtwkxNSEct83KSChT7WiWgDZ3ccZ0BM4tloJow2YUAtifNT3njnyD+y/pMsnP4DN3Y4yl1Gyk0AAAAASUVORK5CYII='; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.ctrlKey = (mxClient.IS_MAC) ? 'Cmd' : 'Ctrl'; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.hintOffset = 20; + +/** + * Specifies if the diagram should be saved automatically if possible. Default + * is true. + */ +Editor.popupsAllowed = true; + +/** + * Editor inherits from mxEventSource + */ +mxUtils.extend(Editor, mxEventSource); + +/** + * Stores initial state of mxClient.NO_FO. + */ +Editor.prototype.originalNoForeignObject = mxClient.NO_FO; + +/** + * Specifies the image URL to be used for the transparent background. + */ +Editor.prototype.transparentImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhMAAwAIAAAP///wAAACH5BAEAAAAALAAAAAAwADAAAAIxhI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8egpAAA7' : + IMAGE_PATH + '/transparent.gif'; + +/** + * Specifies if the canvas should be extended in all directions. Default is true. + */ +Editor.prototype.extendCanvas = true; + +/** + * Specifies if the app should run in chromeless mode. Default is false. + * This default is only used if the contructor argument is null. + */ +Editor.prototype.chromeless = false; + +/** + * Specifies the order of OK/Cancel buttons in dialogs. Default is true. + * Cancel first is used on Macs, Windows/Confluence uses cancel last. + */ +Editor.prototype.cancelFirst = true; + +/** + * Specifies if the editor is enabled. Default is true. + */ +Editor.prototype.enabled = true; + +/** + * Contains the name which was used for the last save. Default value is null. + */ +Editor.prototype.filename = null; + +/** + * Contains the current modified state of the diagram. This is false for + * new diagrams and after the diagram was saved. + */ +Editor.prototype.modified = false; + +/** + * Specifies if the diagram should be saved automatically if possible. Default + * is true. + */ +Editor.prototype.autosave = true; + +/** + * Specifies the top spacing for the initial page view. Default is 0. + */ +Editor.prototype.initialTopSpacing = 0; + +/** + * Specifies the app name. Default is document.title. + */ +Editor.prototype.appName = document.title; + +/** + * + */ +Editor.prototype.editBlankUrl = window.location.protocol + '//' + window.location.host + '/'; + +/** + * Default value for the graph container overflow style. + */ +Editor.prototype.defaultGraphOverflow = 'hidden'; + +/** + * Initializes the environment. + */ +Editor.prototype.init = function() { }; + +/** + * Sets the XML node for the current diagram. + */ +Editor.prototype.isChromelessView = function() +{ + return this.chromeless; +}; + +/** + * Sets the XML node for the current diagram. + */ +Editor.prototype.setAutosave = function(value) +{ + this.autosave = value; + this.fireEvent(new mxEventObject('autosaveChanged')); +}; + +/** + * + */ +Editor.prototype.getEditBlankUrl = function(params) +{ + return this.editBlankUrl + params; +} + +/** + * + */ +Editor.prototype.editAsNew = function(xml, title) +{ + var p = (title != null) ? '?title=' + encodeURIComponent(title) : ''; + + if (urlParams['ui'] != null) + { + p += ((p.length > 0) ? '&' : '?') + 'ui=' + urlParams['ui']; + } + + if (typeof window.postMessage !== 'undefined' && + (document.documentMode == null || + document.documentMode >= 10)) + { + var wnd = null; + + var l = mxUtils.bind(this, function(evt) + { + if (evt.data == 'ready' && evt.source == wnd) + { + mxEvent.removeListener(window, 'message', l); + wnd.postMessage(xml, '*'); + } + }); + + mxEvent.addListener(window, 'message', l); + wnd = this.graph.openLink(this.getEditBlankUrl( + p + ((p.length > 0) ? '&' : '?') + + 'client=1'), null, true); + } + else + { + this.graph.openLink(this.getEditBlankUrl(p) + + '#R' + encodeURIComponent(xml)); + } +}; + +/** + * Sets the XML node for the current diagram. + */ +Editor.prototype.createGraph = function(themes, model) +{ + var graph = new Graph(null, model, null, null, themes); + graph.transparentBackground = false; + + // Opens all links in a new window while editing + if (!this.chromeless) + { + graph.isBlankLink = function(href) + { + return !this.isExternalProtocol(href); + }; + } + + return graph; +}; + +/** + * Sets the XML node for the current diagram. + */ +Editor.prototype.resetGraph = function() +{ + this.graph.gridEnabled = !this.isChromelessView() || urlParams['grid'] == '1'; + this.graph.graphHandler.guidesEnabled = true; + this.graph.setTooltips(true); + this.graph.setConnectable(true); + this.graph.foldingEnabled = true; + this.graph.scrollbars = this.graph.defaultScrollbars; + this.graph.pageVisible = this.graph.defaultPageVisible; + this.graph.pageBreaksVisible = this.graph.pageVisible; + this.graph.preferPageSize = this.graph.pageBreaksVisible; + this.graph.background = null; + this.graph.pageScale = mxGraph.prototype.pageScale; + this.graph.pageFormat = mxGraph.prototype.pageFormat; + this.graph.currentScale = 1; + this.graph.currentTranslate.x = 0; + this.graph.currentTranslate.y = 0; + this.updateGraphComponents(); + this.graph.view.setScale(1); +}; + +/** + * Sets the XML node for the current diagram. + */ +Editor.prototype.readGraphState = function(node) +{ + this.graph.gridEnabled = node.getAttribute('grid') != '0' && (!this.isChromelessView() || urlParams['grid'] == '1'); + this.graph.gridSize = parseFloat(node.getAttribute('gridSize')) || mxGraph.prototype.gridSize; + this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0'; + this.graph.setTooltips(node.getAttribute('tooltips') != '0'); + this.graph.setConnectable(node.getAttribute('connect') != '0'); + this.graph.connectionArrowsEnabled = node.getAttribute('arrows') != '0'; + this.graph.foldingEnabled = node.getAttribute('fold') != '0'; + + if (this.isChromelessView() && this.graph.foldingEnabled) + { + this.graph.foldingEnabled = urlParams['nav'] == '1'; + this.graph.cellRenderer.forceControlClickHandler = this.graph.foldingEnabled; + } + + var ps = parseFloat(node.getAttribute('pageScale')); + + if (!isNaN(ps) && ps > 0) + { + this.graph.pageScale = ps; + } + else + { + this.graph.pageScale = mxGraph.prototype.pageScale; + } + + if (!this.graph.isLightboxView() && !this.graph.isViewer()) + { + var pv = node.getAttribute('page'); + + if (pv != null) + { + this.graph.pageVisible = (pv != '0'); + } + else + { + this.graph.pageVisible = this.graph.defaultPageVisible; + } + } + else + { + this.graph.pageVisible = false; + } + + this.graph.pageBreaksVisible = this.graph.pageVisible; + this.graph.preferPageSize = this.graph.pageBreaksVisible; + + var pw = parseFloat(node.getAttribute('pageWidth')); + var ph = parseFloat(node.getAttribute('pageHeight')); + + if (!isNaN(pw) && !isNaN(ph)) + { + this.graph.pageFormat = new mxRectangle(0, 0, pw, ph); + } + + // Loads the persistent state settings + var bg = node.getAttribute('background'); + + if (bg != null && bg.length > 0) + { + this.graph.background = bg; + } + else + { + this.graph.background = null; + } +}; + +/** + * Sets the XML node for the current diagram. + */ +Editor.prototype.setGraphXml = function(node) +{ + if (node != null) + { + var dec = new mxCodec(node.ownerDocument); + + if (node.nodeName == 'mxGraphModel') + { + this.graph.model.beginUpdate(); + + try + { + this.graph.model.clear(); + this.graph.view.scale = 1; + this.readGraphState(node); + this.updateGraphComponents(); + dec.decode(node, this.graph.getModel()); + } + finally + { + this.graph.model.endUpdate(); + } + + this.fireEvent(new mxEventObject('resetGraphView')); + } + else if (node.nodeName == 'root') + { + this.resetGraph(); + + // Workaround for invalid XML output in Firefox 20 due to bug in mxUtils.getXml + var wrapper = dec.document.createElement('mxGraphModel'); + wrapper.appendChild(node); + + dec.decode(wrapper, this.graph.getModel()); + this.updateGraphComponents(); + this.fireEvent(new mxEventObject('resetGraphView')); + } + else + { + throw { + message: mxResources.get('cannotOpenFile'), + node: node, + toString: function() { return this.message; } + }; + } + } + else + { + this.resetGraph(); + this.graph.model.clear(); + this.fireEvent(new mxEventObject('resetGraphView')); + } +}; + +/** + * Returns the XML node that represents the current diagram. + */ +Editor.prototype.getGraphXml = function(ignoreSelection) +{ + ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true; + var node = null; + + if (ignoreSelection) + { + var enc = new mxCodec(mxUtils.createXmlDocument()); + node = enc.encode(this.graph.getModel()); + } + else + { + node = this.graph.encodeCells(mxUtils.sortCells(this.graph.model.getTopmostCells( + this.graph.getSelectionCells()))); + } + + if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0) + { + node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100); + node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100); + } + + node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0'); + node.setAttribute('gridSize', this.graph.gridSize); + node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0'); + node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0'); + node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0'); + node.setAttribute('arrows', (this.graph.connectionArrowsEnabled) ? '1' : '0'); + node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0'); + node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0'); + node.setAttribute('pageScale', this.graph.pageScale); + node.setAttribute('pageWidth', this.graph.pageFormat.width); + node.setAttribute('pageHeight', this.graph.pageFormat.height); + + if (this.graph.background != null) + { + node.setAttribute('background', this.graph.background); + } + + return node; +}; + +/** + * Keeps the graph container in sync with the persistent graph state + */ +Editor.prototype.updateGraphComponents = function() +{ + var graph = this.graph; + + if (graph.container != null) + { + graph.view.validateBackground(); + graph.container.style.overflow = (graph.scrollbars) ? 'auto' : this.defaultGraphOverflow; + + this.fireEvent(new mxEventObject('updateGraphComponents')); + } +}; + +/** + * Sets the modified flag. + */ +Editor.prototype.setModified = function(value) +{ + this.modified = value; +}; + +/** + * Sets the filename. + */ +Editor.prototype.setFilename = function(value) +{ + this.filename = value; +}; + +/** + * Creates and returns a new undo manager. + */ +Editor.prototype.createUndoManager = function() +{ + var graph = this.graph; + var undoMgr = new mxUndoManager(); + + this.undoListener = function(sender, evt) + { + undoMgr.undoableEditHappened(evt.getProperty('edit')); + }; + + // Installs the command history + var listener = mxUtils.bind(this, function(sender, evt) + { + this.undoListener.apply(this, arguments); + }); + + graph.getModel().addListener(mxEvent.UNDO, listener); + graph.getView().addListener(mxEvent.UNDO, listener); + + // Keeps the selection in sync with the history + var undoHandler = function(sender, evt) + { + var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes, function(change) + { + // Only selects changes to the cell hierarchy + return !(change instanceof mxChildChange); + }); + + if (cand.length > 0) + { + var model = graph.getModel(); + var cells = []; + + for (var i = 0; i < cand.length; i++) + { + if (graph.view.getState(cand[i]) != null) + { + cells.push(cand[i]); + } + } + + graph.setSelectionCells(cells); + } + }; + + undoMgr.addListener(mxEvent.UNDO, undoHandler); + undoMgr.addListener(mxEvent.REDO, undoHandler); + + return undoMgr; +}; + +/** + * Adds basic stencil set (no namespace). + */ +Editor.prototype.initStencilRegistry = function() { }; + +/** + * Creates and returns a new undo manager. + */ +Editor.prototype.destroy = function() +{ + if (this.graph != null) + { + this.graph.destroy(); + this.graph = null; + } +}; + +/** + * Class for asynchronously opening a new window and loading a file at the same + * time. This acts as a bridge between the open dialog and the new editor. + */ +OpenFile = function(done) +{ + this.producer = null; + this.consumer = null; + this.done = done; + this.args = null; +}; + +/** + * Registers the editor from the new window. + */ +OpenFile.prototype.setConsumer = function(value) +{ + this.consumer = value; + this.execute(); +}; + +/** + * Sets the data from the loaded file. + */ +OpenFile.prototype.setData = function() +{ + this.args = arguments; + this.execute(); +}; + +/** + * Displays an error message. + */ +OpenFile.prototype.error = function(msg) +{ + this.cancel(true); + mxUtils.alert(msg); +}; + +/** + * Consumes the data. + */ +OpenFile.prototype.execute = function() +{ + if (this.consumer != null && this.args != null) + { + this.cancel(false); + this.consumer.apply(this, this.args); + } +}; + +/** + * Cancels the operation. + */ +OpenFile.prototype.cancel = function(cancel) +{ + if (this.done != null) + { + this.done((cancel != null) ? cancel : true); + } +}; + +/** + * Basic dialogs that are available in the viewer (print dialog). + */ +function Dialog(editorUi, elt, w, h, modal, closable, onClose, noScroll, transparent, onResize, ignoreBgClick) +{ + var dx = 0; + + if (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8)) + { + // Adds padding as a workaround for box model in older IE versions + // This needs to match the total padding of geDialog in CSS + dx = 80; + } + + w += dx; + h += dx; + + var w0 = w; + var h0 = h; + + var ds = mxUtils.getDocumentSize(); + + // Workaround for print dialog offset in viewer lightbox + if (window.innerHeight != null) + { + ds.height = window.innerHeight; + } + + var dh = ds.height; + var left = Math.max(1, Math.round((ds.width - w - 64) / 2)); + var top = Math.max(1, Math.round((dh - h - editorUi.footerHeight) / 3)); + + // Keeps window size inside available space + if (!mxClient.IS_QUIRKS) + { + elt.style.maxHeight = '100%'; + } + + w = (document.body != null) ? Math.min(w, document.body.scrollWidth - 64) : w; + h = Math.min(h, dh - 64); + + // Increments zIndex to put subdialogs and background over existing dialogs and background + if (editorUi.dialogs.length > 0) + { + this.zIndex += editorUi.dialogs.length * 2; + } + + if (this.bg == null) + { + this.bg = editorUi.createDiv('background'); + this.bg.style.position = 'absolute'; + this.bg.style.background = Dialog.backdropColor; + this.bg.style.height = dh + 'px'; + this.bg.style.right = '0px'; + this.bg.style.zIndex = this.zIndex - 2; + + mxUtils.setOpacity(this.bg, this.bgOpacity); + + if (mxClient.IS_QUIRKS) + { + new mxDivResizer(this.bg); + } + } + + var origin = mxUtils.getDocumentScrollOrigin(document); + this.bg.style.left = origin.x + 'px'; + this.bg.style.top = origin.y + 'px'; + left += origin.x; + top += origin.y; + + if (modal) + { + document.body.appendChild(this.bg); + } + + var div = editorUi.createDiv(transparent? 'geTransDialog' : 'geDialog'); + var pos = this.getPosition(left, top, w, h); + left = pos.x; + top = pos.y; + + div.style.width = w + 'px'; + div.style.height = h + 'px'; + div.style.left = left + 'px'; + div.style.top = top + 'px'; + div.style.zIndex = this.zIndex; + + div.appendChild(elt); + document.body.appendChild(div); + + // Adds vertical scrollbars if needed + if (!noScroll && elt.clientHeight > div.clientHeight - 64) + { + elt.style.overflowY = 'auto'; + } + + if (closable) + { + var img = document.createElement('img'); + + img.setAttribute('src', Dialog.prototype.closeImage); + img.setAttribute('title', mxResources.get('close')); + img.className = 'geDialogClose'; + img.style.top = (top + 14) + 'px'; + img.style.left = (left + w + 38 - dx) + 'px'; + img.style.zIndex = this.zIndex; + + mxEvent.addListener(img, 'click', mxUtils.bind(this, function() + { + editorUi.hideDialog(true); + })); + + document.body.appendChild(img); + this.dialogImg = img; + + if (!ignoreBgClick) + { + var mouseDownSeen = false; + + mxEvent.addGestureListeners(this.bg, mxUtils.bind(this, function(evt) + { + mouseDownSeen = true; + }), null, mxUtils.bind(this, function(evt) + { + if (mouseDownSeen) + { + editorUi.hideDialog(true); + mouseDownSeen = false; + } + })); + } + } + + this.resizeListener = mxUtils.bind(this, function() + { + if (onResize != null) + { + var newWH = onResize(); + + if (newWH != null) + { + w0 = w = newWH.w; + h0 = h = newWH.h; + } + } + + var ds = mxUtils.getDocumentSize(); + dh = ds.height; + this.bg.style.height = dh + 'px'; + + left = Math.max(1, Math.round((ds.width - w - 64) / 2)); + top = Math.max(1, Math.round((dh - h - editorUi.footerHeight) / 3)); + w = (document.body != null) ? Math.min(w0, document.body.scrollWidth - 64) : w0; + h = Math.min(h0, dh - 64); + + var pos = this.getPosition(left, top, w, h); + left = pos.x; + top = pos.y; + + div.style.left = left + 'px'; + div.style.top = top + 'px'; + div.style.width = w + 'px'; + div.style.height = h + 'px'; + + // Adds vertical scrollbars if needed + if (!noScroll && elt.clientHeight > div.clientHeight - 64) + { + elt.style.overflowY = 'auto'; + } + + if (this.dialogImg != null) + { + this.dialogImg.style.top = (top + 14) + 'px'; + this.dialogImg.style.left = (left + w + 38 - dx) + 'px'; + } + }); + + mxEvent.addListener(window, 'resize', this.resizeListener); + + this.onDialogClose = onClose; + this.container = div; + + editorUi.editor.fireEvent(new mxEventObject('showDialog')); +}; + +/** + * + */ +Dialog.backdropColor = 'white'; + +/** + * + */ +Dialog.prototype.zIndex = mxPopupMenu.prototype.zIndex - 1; + +/** + * + */ +Dialog.prototype.noColorImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/nocolor.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkEzRDlBMUUwODYxMTExRTFCMzA4RDdDMjJBMEMxRDM3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkEzRDlBMUUxODYxMTExRTFCMzA4RDdDMjJBMEMxRDM3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTNEOUExREU4NjExMTFFMUIzMDhEN0MyMkEwQzFEMzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTNEOUExREY4NjExMTFFMUIzMDhEN0MyMkEwQzFEMzciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5xh3fmAAAABlBMVEX////MzMw46qqDAAAAGElEQVR42mJggAJGKGAYIIGBth8KAAIMAEUQAIElnLuQAAAAAElFTkSuQmCC'; + +/** + * + */ +Dialog.prototype.closeImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/close.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAABlBMVEV7mr3///+wksspAAAAAnRSTlP/AOW3MEoAAAAdSURBVAgdY9jXwCDDwNDRwHCwgeExmASygSL7GgB12QiqNHZZIwAAAABJRU5ErkJggg=='; + +/** + * + */ +Dialog.prototype.clearImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/clear.gif' : 'data:image/gif;base64,R0lGODlhDQAKAIABAMDAwP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUIzOEM1NzI4NjEyMTFFMUEzMkNDMUE3NjZERDE2QjIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUIzOEM1NzM4NjEyMTFFMUEzMkNDMUE3NjZERDE2QjIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QjM4QzU3MDg2MTIxMUUxQTMyQ0MxQTc2NkREMTZCMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QjM4QzU3MTg2MTIxMUUxQTMyQ0MxQTc2NkREMTZCMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAEALAAAAAANAAoAAAIXTGCJebD9jEOTqRlttXdrB32PJ2ncyRQAOw=='; + +/** + * + */ +Dialog.prototype.lockedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/locked.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzdDMDZCODExNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzdDMDZCODIxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozN0MwNkI3RjE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0MwNkI4MDE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvqMCFYAAAAVUExURZmZmb+/v7KysqysrMzMzLGxsf///4g8N1cAAAAHdFJOU////////wAaSwNGAAAAPElEQVR42lTMQQ4AIQgEwUa0//9kTQirOweYOgDqAMbZUr10AGlAwx4/BJ2QJ4U0L5brYjovvpv32xZgAHZaATFtMbu4AAAAAElFTkSuQmCC'; + +/** + * + */ +Dialog.prototype.unlockedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/unlocked.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzdDMDZCN0QxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzdDMDZCN0UxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozN0MwNkI3QjE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0MwNkI3QzE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkKMpVwAAAAYUExURZmZmbKysr+/v6ysrOXl5czMzLGxsf///zHN5lwAAAAIdFJOU/////////8A3oO9WQAAADxJREFUeNpUzFESACAEBNBVsfe/cZJU+8Mzs8CIABCidtfGOndnYsT40HDSiCcbPdoJo10o9aI677cpwACRoAF3dFNlswAAAABJRU5ErkJggg=='; + +/** + * Removes the dialog from the DOM. + */ +Dialog.prototype.bgOpacity = 80; + +/** + * Removes the dialog from the DOM. + */ +Dialog.prototype.getPosition = function(left, top) +{ + return new mxPoint(left, top); +}; + +/** + * Removes the dialog from the DOM. + */ +Dialog.prototype.close = function(cancel, isEsc) +{ + if (this.onDialogClose != null) + { + if (this.onDialogClose(cancel, isEsc) == false) + { + return false; + } + + this.onDialogClose = null; + } + + if (this.dialogImg != null) + { + this.dialogImg.parentNode.removeChild(this.dialogImg); + this.dialogImg = null; + } + + if (this.bg != null && this.bg.parentNode != null) + { + this.bg.parentNode.removeChild(this.bg); + } + + mxEvent.removeListener(window, 'resize', this.resizeListener); + this.container.parentNode.removeChild(this.container); +}; + +/** + * + */ +var ErrorDialog = function(editorUi, title, message, buttonText, fn, retry, buttonText2, fn2, hide, buttonText3, fn3) +{ + hide = (hide != null) ? hide : true; + + var div = document.createElement('div'); + div.style.textAlign = 'center'; + + if (title != null) + { + var hd = document.createElement('div'); + hd.style.padding = '0px'; + hd.style.margin = '0px'; + hd.style.fontSize = '18px'; + hd.style.paddingBottom = '16px'; + hd.style.marginBottom = '10px'; + hd.style.borderBottom = '1px solid #c0c0c0'; + hd.style.color = 'gray'; + hd.style.whiteSpace = 'nowrap'; + hd.style.textOverflow = 'ellipsis'; + hd.style.overflow = 'hidden'; + mxUtils.write(hd, title); + hd.setAttribute('title', title); + div.appendChild(hd); + } + + var p2 = document.createElement('div'); + p2.style.lineHeight = '1.2em'; + p2.style.padding = '6px'; + p2.innerHTML = message; + div.appendChild(p2); + + var btns = document.createElement('div'); + btns.style.marginTop = '12px'; + btns.style.textAlign = 'center'; + + if (retry != null) + { + var retryBtn = mxUtils.button(mxResources.get('tryAgain'), function() + { + editorUi.hideDialog(); + retry(); + }); + retryBtn.className = 'geBtn'; + btns.appendChild(retryBtn); + + btns.style.textAlign = 'center'; + } + + if (buttonText3 != null) + { + var btn3 = mxUtils.button(buttonText3, function() + { + if (fn3 != null) + { + fn3(); + } + }); + + btn3.className = 'geBtn'; + btns.appendChild(btn3); + } + + var btn = mxUtils.button(buttonText, function() + { + if (hide) + { + editorUi.hideDialog(); + } + + if (fn != null) + { + fn(); + } + }); + + btn.className = 'geBtn'; + btns.appendChild(btn); + + if (buttonText2 != null) + { + var mainBtn = mxUtils.button(buttonText2, function() + { + if (hide) + { + editorUi.hideDialog(); + } + + if (fn2 != null) + { + fn2(); + } + }); + + mainBtn.className = 'geBtn gePrimaryBtn'; + btns.appendChild(mainBtn); + } + + this.init = function() + { + btn.focus(); + }; + + div.appendChild(btns); + + this.container = div; +}; + +/** + * Constructs a new print dialog. + */ +var PrintDialog = function(editorUi, title) +{ + this.create(editorUi, title); +}; + +/** + * Constructs a new print dialog. + */ +PrintDialog.prototype.create = function(editorUi) +{ + var graph = editorUi.editor.graph; + var row, td; + + var table = document.createElement('table'); + table.style.width = '100%'; + table.style.height = '100%'; + var tbody = document.createElement('tbody'); + + row = document.createElement('tr'); + + var onePageCheckBox = document.createElement('input'); + onePageCheckBox.setAttribute('type', 'checkbox'); + td = document.createElement('td'); + td.setAttribute('colspan', '2'); + td.style.fontSize = '10pt'; + td.appendChild(onePageCheckBox); + + var span = document.createElement('span'); + mxUtils.write(span, ' ' + mxResources.get('fitPage')); + td.appendChild(span); + + mxEvent.addListener(span, 'click', function(evt) + { + onePageCheckBox.checked = !onePageCheckBox.checked; + pageCountCheckBox.checked = !onePageCheckBox.checked; + mxEvent.consume(evt); + }); + + mxEvent.addListener(onePageCheckBox, 'change', function() + { + pageCountCheckBox.checked = !onePageCheckBox.checked; + }); + + row.appendChild(td); + tbody.appendChild(row); + + row = row.cloneNode(false); + + var pageCountCheckBox = document.createElement('input'); + pageCountCheckBox.setAttribute('type', 'checkbox'); + td = document.createElement('td'); + td.style.fontSize = '10pt'; + td.appendChild(pageCountCheckBox); + + var span = document.createElement('span'); + mxUtils.write(span, ' ' + mxResources.get('posterPrint') + ':'); + td.appendChild(span); + + mxEvent.addListener(span, 'click', function(evt) + { + pageCountCheckBox.checked = !pageCountCheckBox.checked; + onePageCheckBox.checked = !pageCountCheckBox.checked; + mxEvent.consume(evt); + }); + + row.appendChild(td); + + var pageCountInput = document.createElement('input'); + pageCountInput.setAttribute('value', '1'); + pageCountInput.setAttribute('type', 'number'); + pageCountInput.setAttribute('min', '1'); + pageCountInput.setAttribute('size', '4'); + pageCountInput.setAttribute('disabled', 'disabled'); + pageCountInput.style.width = '50px'; + + td = document.createElement('td'); + td.style.fontSize = '10pt'; + td.appendChild(pageCountInput); + mxUtils.write(td, ' ' + mxResources.get('pages') + ' (max)'); + row.appendChild(td); + tbody.appendChild(row); + + mxEvent.addListener(pageCountCheckBox, 'change', function() + { + if (pageCountCheckBox.checked) + { + pageCountInput.removeAttribute('disabled'); + } + else + { + pageCountInput.setAttribute('disabled', 'disabled'); + } + + onePageCheckBox.checked = !pageCountCheckBox.checked; + }); + + row = row.cloneNode(false); + + td = document.createElement('td'); + mxUtils.write(td, mxResources.get('pageScale') + ':'); + row.appendChild(td); + + td = document.createElement('td'); + var pageScaleInput = document.createElement('input'); + pageScaleInput.setAttribute('value', '100 %'); + pageScaleInput.setAttribute('size', '5'); + pageScaleInput.style.width = '50px'; + + td.appendChild(pageScaleInput); + row.appendChild(td); + tbody.appendChild(row); + + row = document.createElement('tr'); + td = document.createElement('td'); + td.colSpan = 2; + td.style.paddingTop = '20px'; + td.setAttribute('align', 'right'); + + // Overall scale for print-out to account for print borders in dialogs etc + function preview(print) + { + var autoOrigin = onePageCheckBox.checked || pageCountCheckBox.checked; + var printScale = parseInt(pageScaleInput.value) / 100; + + if (isNaN(printScale)) + { + printScale = 1; + pageScaleInput.value = '100%'; + } + + // Workaround to match available paper size in actual print output + printScale *= 0.75; + + var pf = graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT; + var scale = 1 / graph.pageScale; + + if (autoOrigin) + { + var pageCount = (onePageCheckBox.checked) ? 1 : parseInt(pageCountInput.value); + + if (!isNaN(pageCount)) + { + scale = mxUtils.getScaleForPageCount(pageCount, graph, pf); + } + } + + // Negative coordinates are cropped or shifted if page visible + var gb = graph.getGraphBounds(); + var border = 0; + var x0 = 0; + var y0 = 0; + + // Applies print scale + pf = mxRectangle.fromRectangle(pf); + pf.width = Math.ceil(pf.width * printScale); + pf.height = Math.ceil(pf.height * printScale); + scale *= printScale; + + // Starts at first visible page + if (!autoOrigin && graph.pageVisible) + { + var layout = graph.getPageLayout(); + x0 -= layout.x * pf.width; + y0 -= layout.y * pf.height; + } + else + { + autoOrigin = true; + } + + var preview = PrintDialog.createPrintPreview(graph, scale, pf, border, x0, y0, autoOrigin); + preview.open(); + + if (print) + { + PrintDialog.printPreview(preview); + } + }; + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + if (PrintDialog.previewEnabled) + { + var previewBtn = mxUtils.button(mxResources.get('preview'), function() + { + editorUi.hideDialog(); + preview(false); + }); + previewBtn.className = 'geBtn'; + td.appendChild(previewBtn); + } + + var printBtn = mxUtils.button(mxResources.get((!PrintDialog.previewEnabled) ? 'ok' : 'print'), function() + { + editorUi.hideDialog(); + preview(true); + }); + printBtn.className = 'geBtn gePrimaryBtn'; + td.appendChild(printBtn); + + if (!editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + row.appendChild(td); + tbody.appendChild(row); + + table.appendChild(tbody); + this.container = table; +}; + +/** + * Constructs a new print dialog. + */ +PrintDialog.printPreview = function(preview) +{ + try + { + if (preview.wnd != null) + { + var printFn = function() + { + preview.wnd.focus(); + preview.wnd.print(); + preview.wnd.close(); + }; + + // Workaround for Google Chrome which needs a bit of a + // delay in order to render the SVG contents + // Needs testing in production + if (mxClient.IS_GC) + { + window.setTimeout(printFn, 500); + } + else + { + printFn(); + } + } + } + catch (e) + { + // ignores possible Access Denied + } +}; + +/** + * Constructs a new print dialog. + */ +PrintDialog.createPrintPreview = function(graph, scale, pf, border, x0, y0, autoOrigin) +{ + var preview = new mxPrintPreview(graph, scale, pf, border, x0, y0); + preview.title = mxResources.get('preview'); + preview.printBackgroundImage = true; + preview.autoOrigin = autoOrigin; + var bg = graph.background; + + if (bg == null || bg == '' || bg == mxConstants.NONE) + { + bg = '#ffffff'; + } + + preview.backgroundColor = bg; + + var writeHead = preview.writeHead; + + // Adds a border in the preview + preview.writeHead = function(doc) + { + writeHead.apply(this, arguments); + + doc.writeln(''); + }; + + return preview; +}; + +/** + * Specifies if the preview button should be enabled. Default is true. + */ +PrintDialog.previewEnabled = true; + +/** + * Constructs a new page setup dialog. + */ +var PageSetupDialog = function(editorUi) +{ + var graph = editorUi.editor.graph; + var row, td; + + var table = document.createElement('table'); + table.style.width = '100%'; + table.style.height = '100%'; + var tbody = document.createElement('tbody'); + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.verticalAlign = 'top'; + td.style.fontSize = '10pt'; + mxUtils.write(td, mxResources.get('paperSize') + ':'); + + row.appendChild(td); + + td = document.createElement('td'); + td.style.verticalAlign = 'top'; + td.style.fontSize = '10pt'; + + var accessor = PageSetupDialog.addPageFormatPanel(td, 'pagesetupdialog', graph.pageFormat); + + row.appendChild(td); + tbody.appendChild(row); + + row = document.createElement('tr'); + + td = document.createElement('td'); + mxUtils.write(td, mxResources.get('background') + ':'); + + row.appendChild(td); + + td = document.createElement('td'); + td.style.whiteSpace = 'nowrap'; + + var backgroundInput = document.createElement('input'); + backgroundInput.setAttribute('type', 'text'); + var backgroundButton = document.createElement('button'); + + backgroundButton.style.width = '18px'; + backgroundButton.style.height = '18px'; + backgroundButton.style.marginRight = '20px'; + backgroundButton.style.backgroundPosition = 'center center'; + backgroundButton.style.backgroundRepeat = 'no-repeat'; + + var newBackgroundColor = graph.background; + + function updateBackgroundColor() + { + if (newBackgroundColor == null || newBackgroundColor == mxConstants.NONE) + { + backgroundButton.style.backgroundColor = ''; + backgroundButton.style.backgroundImage = 'url(\'' + Dialog.prototype.noColorImage + '\')'; + } + else + { + backgroundButton.style.backgroundColor = newBackgroundColor; + backgroundButton.style.backgroundImage = ''; + } + }; + + updateBackgroundColor(); + + mxEvent.addListener(backgroundButton, 'click', function(evt) + { + editorUi.pickColor(newBackgroundColor || 'none', function(color) + { + newBackgroundColor = color; + updateBackgroundColor(); + }); + mxEvent.consume(evt); + }); + + td.appendChild(backgroundButton); + + mxUtils.write(td, mxResources.get('gridSize') + ':'); + + var gridSizeInput = document.createElement('input'); + gridSizeInput.setAttribute('type', 'number'); + gridSizeInput.setAttribute('min', '0'); + gridSizeInput.style.width = '40px'; + gridSizeInput.style.marginLeft = '6px'; + + gridSizeInput.value = graph.getGridSize(); + td.appendChild(gridSizeInput); + + mxEvent.addListener(gridSizeInput, 'change', function() + { + var value = parseInt(gridSizeInput.value); + gridSizeInput.value = Math.max(1, (isNaN(value)) ? graph.getGridSize() : value); + }); + + row.appendChild(td); + tbody.appendChild(row); + + row = document.createElement('tr'); + td = document.createElement('td'); + + mxUtils.write(td, mxResources.get('image') + ':'); + + row.appendChild(td); + td = document.createElement('td'); + + var changeImageLink = document.createElement('a'); + changeImageLink.style.textDecoration = 'underline'; + changeImageLink.style.cursor = 'pointer'; + changeImageLink.style.color = '#a0a0a0'; + + var newBackgroundImage = graph.backgroundImage; + + function updateBackgroundImage() + { + if (newBackgroundImage == null) + { + changeImageLink.removeAttribute('title'); + changeImageLink.style.fontSize = ''; + changeImageLink.innerHTML = mxResources.get('change') + '...'; + } + else + { + changeImageLink.setAttribute('title', newBackgroundImage.src); + changeImageLink.style.fontSize = '11px'; + changeImageLink.innerHTML = newBackgroundImage.src.substring(0, 42) + '...'; + } + }; + + mxEvent.addListener(changeImageLink, 'click', function(evt) + { + editorUi.showBackgroundImageDialog(function(image) + { + newBackgroundImage = image; + updateBackgroundImage(); + }); + + mxEvent.consume(evt); + }); + + updateBackgroundImage(); + + td.appendChild(changeImageLink); + + row.appendChild(td); + tbody.appendChild(row); + + row = document.createElement('tr'); + td = document.createElement('td'); + td.colSpan = 2; + td.style.paddingTop = '16px'; + td.setAttribute('align', 'right'); + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + var applyBtn = mxUtils.button(mxResources.get('apply'), function() + { + editorUi.hideDialog(); + + if (graph.gridSize !== gridSizeInput.value) + { + graph.setGridSize(parseInt(gridSizeInput.value)); + } + + var change = new ChangePageSetup(editorUi, newBackgroundColor, + newBackgroundImage, accessor.get()); + change.ignoreColor = graph.background == newBackgroundColor; + + var oldSrc = (graph.backgroundImage != null) ? graph.backgroundImage.src : null; + var newSrc = (newBackgroundImage != null) ? newBackgroundImage.src : null; + + change.ignoreImage = oldSrc === newSrc; + + if (graph.pageFormat.width != change.previousFormat.width || + graph.pageFormat.height != change.previousFormat.height || + !change.ignoreColor || !change.ignoreImage) + { + graph.model.execute(change); + } + }); + applyBtn.className = 'geBtn gePrimaryBtn'; + td.appendChild(applyBtn); + + if (!editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + row.appendChild(td); + tbody.appendChild(row); + + table.appendChild(tbody); + this.container = table; +}; + +/** + * + */ +PageSetupDialog.addPageFormatPanel = function(div, namePostfix, pageFormat, pageFormatListener) +{ + var formatName = 'format-' + namePostfix; + + var portraitCheckBox = document.createElement('input'); + portraitCheckBox.setAttribute('name', formatName); + portraitCheckBox.setAttribute('type', 'radio'); + portraitCheckBox.setAttribute('value', 'portrait'); + + var landscapeCheckBox = document.createElement('input'); + landscapeCheckBox.setAttribute('name', formatName); + landscapeCheckBox.setAttribute('type', 'radio'); + landscapeCheckBox.setAttribute('value', 'landscape'); + + var paperSizeSelect = document.createElement('select'); + paperSizeSelect.style.marginBottom = '8px'; + paperSizeSelect.style.width = '202px'; + + var formatDiv = document.createElement('div'); + formatDiv.style.marginLeft = '4px'; + formatDiv.style.width = '210px'; + formatDiv.style.height = '24px'; + + portraitCheckBox.style.marginRight = '6px'; + formatDiv.appendChild(portraitCheckBox); + + var portraitSpan = document.createElement('span'); + portraitSpan.style.maxWidth = '100px'; + mxUtils.write(portraitSpan, mxResources.get('portrait')); + formatDiv.appendChild(portraitSpan); + + landscapeCheckBox.style.marginLeft = '10px'; + landscapeCheckBox.style.marginRight = '6px'; + formatDiv.appendChild(landscapeCheckBox); + + var landscapeSpan = document.createElement('span'); + landscapeSpan.style.width = '100px'; + mxUtils.write(landscapeSpan, mxResources.get('landscape')); + formatDiv.appendChild(landscapeSpan) + + var customDiv = document.createElement('div'); + customDiv.style.marginLeft = '4px'; + customDiv.style.width = '210px'; + customDiv.style.height = '24px'; + + var widthInput = document.createElement('input'); + widthInput.setAttribute('size', '7'); + widthInput.style.textAlign = 'right'; + customDiv.appendChild(widthInput); + mxUtils.write(customDiv, ' in x '); + + var heightInput = document.createElement('input'); + heightInput.setAttribute('size', '7'); + heightInput.style.textAlign = 'right'; + customDiv.appendChild(heightInput); + mxUtils.write(customDiv, ' in'); + + formatDiv.style.display = 'none'; + customDiv.style.display = 'none'; + + var pf = new Object(); + var formats = PageSetupDialog.getFormats(); + + for (var i = 0; i < formats.length; i++) + { + var f = formats[i]; + pf[f.key] = f; + + var paperSizeOption = document.createElement('option'); + paperSizeOption.setAttribute('value', f.key); + mxUtils.write(paperSizeOption, f.title); + paperSizeSelect.appendChild(paperSizeOption); + } + + var customSize = false; + + function listener(sender, evt, force) + { + if (force || (widthInput != document.activeElement && heightInput != document.activeElement)) + { + var detected = false; + + for (var i = 0; i < formats.length; i++) + { + var f = formats[i]; + + // Special case where custom was chosen + if (customSize) + { + if (f.key == 'custom') + { + paperSizeSelect.value = f.key; + customSize = false; + } + } + else if (f.format != null) + { + // Fixes wrong values for previous A4 and A5 page sizes + if (f.key == 'a4') + { + if (pageFormat.width == 826) + { + pageFormat = mxRectangle.fromRectangle(pageFormat); + pageFormat.width = 827; + } + else if (pageFormat.height == 826) + { + pageFormat = mxRectangle.fromRectangle(pageFormat); + pageFormat.height = 827; + } + } + else if (f.key == 'a5') + { + if (pageFormat.width == 584) + { + pageFormat = mxRectangle.fromRectangle(pageFormat); + pageFormat.width = 583; + } + else if (pageFormat.height == 584) + { + pageFormat = mxRectangle.fromRectangle(pageFormat); + pageFormat.height = 583; + } + } + + if (pageFormat.width == f.format.width && pageFormat.height == f.format.height) + { + paperSizeSelect.value = f.key; + portraitCheckBox.setAttribute('checked', 'checked'); + portraitCheckBox.defaultChecked = true; + portraitCheckBox.checked = true; + landscapeCheckBox.removeAttribute('checked'); + landscapeCheckBox.defaultChecked = false; + landscapeCheckBox.checked = false; + detected = true; + } + else if (pageFormat.width == f.format.height && pageFormat.height == f.format.width) + { + paperSizeSelect.value = f.key; + portraitCheckBox.removeAttribute('checked'); + portraitCheckBox.defaultChecked = false; + portraitCheckBox.checked = false; + landscapeCheckBox.setAttribute('checked', 'checked'); + landscapeCheckBox.defaultChecked = true; + landscapeCheckBox.checked = true; + detected = true; + } + } + } + + // Selects custom format which is last in list + if (!detected) + { + widthInput.value = pageFormat.width / 100; + heightInput.value = pageFormat.height / 100; + portraitCheckBox.setAttribute('checked', 'checked'); + paperSizeSelect.value = 'custom'; + formatDiv.style.display = 'none'; + customDiv.style.display = ''; + } + else + { + formatDiv.style.display = ''; + customDiv.style.display = 'none'; + } + } + }; + + listener(); + + div.appendChild(paperSizeSelect); + mxUtils.br(div); + + div.appendChild(formatDiv); + div.appendChild(customDiv); + + var currentPageFormat = pageFormat; + + var update = function(evt, selectChanged) + { + var f = pf[paperSizeSelect.value]; + + if (f.format != null) + { + widthInput.value = f.format.width / 100; + heightInput.value = f.format.height / 100; + customDiv.style.display = 'none'; + formatDiv.style.display = ''; + } + else + { + formatDiv.style.display = 'none'; + customDiv.style.display = ''; + } + + var wi = parseFloat(widthInput.value); + + if (isNaN(wi) || wi <= 0) + { + widthInput.value = pageFormat.width / 100; + } + + var hi = parseFloat(heightInput.value); + + if (isNaN(hi) || hi <= 0) + { + heightInput.value = pageFormat.height / 100; + } + + var newPageFormat = new mxRectangle(0, 0, + Math.floor(parseFloat(widthInput.value) * 100), + Math.floor(parseFloat(heightInput.value) * 100)); + + if (paperSizeSelect.value != 'custom' && landscapeCheckBox.checked) + { + newPageFormat = new mxRectangle(0, 0, newPageFormat.height, newPageFormat.width); + } + + // Initial select of custom should not update page format to avoid update of combo + if ((!selectChanged || !customSize) && (newPageFormat.width != currentPageFormat.width || + newPageFormat.height != currentPageFormat.height)) + { + currentPageFormat = newPageFormat; + + // Updates page format and reloads format panel + if (pageFormatListener != null) + { + pageFormatListener(currentPageFormat); + } + } + }; + + mxEvent.addListener(portraitSpan, 'click', function(evt) + { + portraitCheckBox.checked = true; + update(evt); + mxEvent.consume(evt); + }); + + mxEvent.addListener(landscapeSpan, 'click', function(evt) + { + landscapeCheckBox.checked = true; + update(evt); + mxEvent.consume(evt); + }); + + mxEvent.addListener(widthInput, 'blur', update); + mxEvent.addListener(widthInput, 'click', update); + mxEvent.addListener(heightInput, 'blur', update); + mxEvent.addListener(heightInput, 'click', update); + mxEvent.addListener(landscapeCheckBox, 'change', update); + mxEvent.addListener(portraitCheckBox, 'change', update); + mxEvent.addListener(paperSizeSelect, 'change', function(evt) + { + // Handles special case where custom was chosen + customSize = paperSizeSelect.value == 'custom'; + update(evt, true); + }); + + update(); + + return {set: function(value) + { + pageFormat = value; + listener(null, null, true); + },get: function() + { + return currentPageFormat; + }, widthInput: widthInput, + heightInput: heightInput}; +}; + +/** + * + */ +PageSetupDialog.getFormats = function() +{ + return [{key: 'letter', title: 'US-Letter (8,5" x 11")', format: mxConstants.PAGE_FORMAT_LETTER_PORTRAIT}, + {key: 'legal', title: 'US-Legal (8,5" x 14")', format: new mxRectangle(0, 0, 850, 1400)}, + {key: 'tabloid', title: 'US-Tabloid (11" x 17")', format: new mxRectangle(0, 0, 1100, 1700)}, + {key: 'executive', title: 'US-Executive (7" x 10")', format: new mxRectangle(0, 0, 700, 1000)}, + {key: 'a0', title: 'A0 (841 mm x 1189 mm)', format: new mxRectangle(0, 0, 3300, 4681)}, + {key: 'a1', title: 'A1 (594 mm x 841 mm)', format: new mxRectangle(0, 0, 2339, 3300)}, + {key: 'a2', title: 'A2 (420 mm x 594 mm)', format: new mxRectangle(0, 0, 1654, 2336)}, + {key: 'a3', title: 'A3 (297 mm x 420 mm)', format: new mxRectangle(0, 0, 1169, 1654)}, + {key: 'a4', title: 'A4 (210 mm x 297 mm)', format: mxConstants.PAGE_FORMAT_A4_PORTRAIT}, + {key: 'a5', title: 'A5 (148 mm x 210 mm)', format: new mxRectangle(0, 0, 583, 827)}, + {key: 'a6', title: 'A6 (105 mm x 148 mm)', format: new mxRectangle(0, 0, 413, 583)}, + {key: 'a7', title: 'A7 (74 mm x 105 mm)', format: new mxRectangle(0, 0, 291, 413)}, + {key: 'b4', title: 'B4 (250 mm x 353 mm)', format: new mxRectangle(0, 0, 980, 1390)}, + {key: 'b5', title: 'B5 (176 mm x 250 mm)', format: new mxRectangle(0, 0, 690, 980)}, + {key: '16-9', title: '16:9 (1600 x 900)', format: new mxRectangle(0, 0, 1600, 900)}, + {key: '16-10', title: '16:10 (1920 x 1200)', format: new mxRectangle(0, 0, 1920, 1200)}, + {key: '4-3', title: '4:3 (1600 x 1200)', format: new mxRectangle(0, 0, 1600, 1200)}, + {key: 'custom', title: mxResources.get('custom'), format: null}]; +}; + +/** + * Constructs a new filename dialog. + */ +var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validateFn, content, helpLink, closeOnBtn, cancelFn, hints, w) +{ + closeOnBtn = (closeOnBtn != null) ? closeOnBtn : true; + var row, td; + + var table = document.createElement('table'); + var tbody = document.createElement('tbody'); + table.style.marginTop = '8px'; + + row = document.createElement('tr'); + + td = document.createElement('td'); + td.style.whiteSpace = 'nowrap'; + td.style.fontSize = '10pt'; + td.style.width = '120px'; + mxUtils.write(td, (label || mxResources.get('filename')) + ':'); + + row.appendChild(td); + + var nameInput = document.createElement('input'); + nameInput.setAttribute('value', filename || ''); + nameInput.style.marginLeft = '4px'; + nameInput.style.width = (w != null) ? w + 'px' : '180px'; + + var genericBtn = mxUtils.button(buttonText, function() + { + if (validateFn == null || validateFn(nameInput.value)) + { + if (closeOnBtn) + { + editorUi.hideDialog(); + } + + fn(nameInput.value); + } + }); + genericBtn.className = 'geBtn gePrimaryBtn'; + + this.init = function() + { + if (label == null && content != null) + { + return; + } + + nameInput.focus(); + + if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS) + { + nameInput.select(); + } + else + { + document.execCommand('selectAll', false, null); + } + + // Installs drag and drop handler for links + if (Graph.fileSupport) + { + // Setup the dnd listeners + var dlg = table.parentNode; + + if (dlg != null) + { + var graph = editorUi.editor.graph; + var dropElt = null; + + mxEvent.addListener(dlg, 'dragleave', function(evt) + { + if (dropElt != null) + { + dropElt.style.backgroundColor = ''; + dropElt = null; + } + + evt.stopPropagation(); + evt.preventDefault(); + }); + + mxEvent.addListener(dlg, 'dragover', mxUtils.bind(this, function(evt) + { + // IE 10 does not implement pointer-events so it can't have a drop highlight + if (dropElt == null && (!mxClient.IS_IE || document.documentMode > 10)) + { + dropElt = nameInput; + dropElt.style.backgroundColor = '#ebf2f9'; + } + + evt.stopPropagation(); + evt.preventDefault(); + })); + + mxEvent.addListener(dlg, 'drop', mxUtils.bind(this, function(evt) + { + if (dropElt != null) + { + dropElt.style.backgroundColor = ''; + dropElt = null; + } + + if (mxUtils.indexOf(evt.dataTransfer.types, 'text/uri-list') >= 0) + { + nameInput.value = decodeURIComponent(evt.dataTransfer.getData('text/uri-list')); + genericBtn.click(); + } + + evt.stopPropagation(); + evt.preventDefault(); + })); + } + } + }; + + td = document.createElement('td'); + td.style.whiteSpace = 'nowrap'; + td.appendChild(nameInput); + row.appendChild(td); + + if (label != null || content == null) + { + tbody.appendChild(row); + + if (hints != null) + { + td.appendChild(FilenameDialog.createTypeHint(editorUi, nameInput, hints)); + } + } + + if (content != null) + { + row = document.createElement('tr'); + td = document.createElement('td'); + td.colSpan = 2; + td.appendChild(content); + row.appendChild(td); + tbody.appendChild(row); + } + + row = document.createElement('tr'); + td = document.createElement('td'); + td.colSpan = 2; + td.style.paddingTop = '20px'; + td.style.whiteSpace = 'nowrap'; + td.setAttribute('align', 'right'); + + var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() + { + editorUi.hideDialog(); + + if (cancelFn != null) + { + cancelFn(); + } + }); + cancelBtn.className = 'geBtn'; + + if (editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + if (helpLink != null) + { + var helpBtn = mxUtils.button(mxResources.get('help'), function() + { + editorUi.editor.graph.openLink(helpLink); + }); + + helpBtn.className = 'geBtn'; + td.appendChild(helpBtn); + } + + mxEvent.addListener(nameInput, 'keypress', function(e) + { + if (e.keyCode == 13) + { + genericBtn.click(); + } + }); + + td.appendChild(genericBtn); + + if (!editorUi.editor.cancelFirst) + { + td.appendChild(cancelBtn); + } + + row.appendChild(td); + tbody.appendChild(row); + table.appendChild(tbody); + + this.container = table; +}; + +/** + * + */ +FilenameDialog.filenameHelpLink = null; + +/** + * + */ +FilenameDialog.createTypeHint = function(ui, nameInput, hints) +{ + var hint = document.createElement('img'); + hint.style.cssText = 'vertical-align:top;height:16px;width:16px;margin-left:4px;background-repeat:no-repeat;background-position:center bottom;cursor:pointer;'; + mxUtils.setOpacity(hint, 70); + + var nameChanged = function() + { + hint.setAttribute('src', Editor.helpImage); + hint.setAttribute('title', mxResources.get('help')); + + for (var i = 0; i < hints.length; i++) + { + if (hints[i].ext.length > 0 && + nameInput.value.substring(nameInput.value.length - + hints[i].ext.length - 1) == '.' + hints[i].ext) + { + hint.setAttribute('src', mxClient.imageBasePath + '/warning.png'); + hint.setAttribute('title', mxResources.get(hints[i].title)); + break; + } + } + }; + + mxEvent.addListener(nameInput, 'keyup', nameChanged); + mxEvent.addListener(nameInput, 'change', nameChanged); + mxEvent.addListener(hint, 'click', function(evt) + { + var title = hint.getAttribute('title'); + + if (hint.getAttribute('src') == Editor.helpImage) + { + ui.editor.graph.openLink(FilenameDialog.filenameHelpLink); + } + else if (title != '') + { + ui.showError(null, title, mxResources.get('help'), function() + { + ui.editor.graph.openLink(FilenameDialog.filenameHelpLink); + }, null, mxResources.get('ok'), null, null, null, 340, 90); + } + + mxEvent.consume(evt); + }); + + nameChanged(); + + return hint; +}; + +/** + * Static overrides + */ +(function() +{ + // Uses HTML for background pages (to support grid background image) + mxGraphView.prototype.validateBackgroundPage = function() + { + var graph = this.graph; + + if (graph.container != null && !graph.transparentBackground) + { + if (graph.pageVisible) + { + var bounds = this.getBackgroundPageBounds(); + + if (this.backgroundPageShape == null) + { + // Finds first element in graph container + var firstChild = graph.container.firstChild; + + while (firstChild != null && firstChild.nodeType != mxConstants.NODETYPE_ELEMENT) + { + firstChild = firstChild.nextSibling; + } + + if (firstChild != null) + { + this.backgroundPageShape = this.createBackgroundPageShape(bounds); + this.backgroundPageShape.scale = 1; + + // Shadow filter causes problems in outline window in quirks mode. IE8 standards + // also has known rendering issues inside mxWindow but not using shadow is worse. + this.backgroundPageShape.isShadow = !mxClient.IS_QUIRKS; + this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML; + this.backgroundPageShape.init(graph.container); + + // Required for the browser to render the background page in correct order + firstChild.style.position = 'absolute'; + graph.container.insertBefore(this.backgroundPageShape.node, firstChild); + this.backgroundPageShape.redraw(); + + this.backgroundPageShape.node.className = 'geBackgroundPage'; + + // Adds listener for double click handling on background + mxEvent.addListener(this.backgroundPageShape.node, 'dblclick', + mxUtils.bind(this, function(evt) + { + graph.dblClick(evt); + }) + ); + + // Adds basic listeners for graph event dispatching outside of the + // container and finishing the handling of a single gesture + mxEvent.addGestureListeners(this.backgroundPageShape.node, + mxUtils.bind(this, function(evt) + { + graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt)); + }), + mxUtils.bind(this, function(evt) + { + // Hides the tooltip if mouse is outside container + if (graph.tooltipHandler != null && graph.tooltipHandler.isHideOnHover()) + { + graph.tooltipHandler.hide(); + } + + if (graph.isMouseDown && !mxEvent.isConsumed(evt)) + { + graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(evt)); + } + }), + mxUtils.bind(this, function(evt) + { + graph.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(evt)); + }) + ); + } + } + else + { + this.backgroundPageShape.scale = 1; + this.backgroundPageShape.bounds = bounds; + this.backgroundPageShape.redraw(); + } + } + else if (this.backgroundPageShape != null) + { + this.backgroundPageShape.destroy(); + this.backgroundPageShape = null; + } + + this.validateBackgroundStyles(); + } + }; + + // Updates the CSS of the background to draw the grid + mxGraphView.prototype.validateBackgroundStyles = function() + { + var graph = this.graph; + var color = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background; + var gridColor = (color != null && this.gridColor != color.toLowerCase()) ? this.gridColor : '#ffffff'; + var image = 'none'; + var position = ''; + + if (graph.isGridEnabled()) + { + var phase = 10; + + if (mxClient.IS_SVG) + { + // Generates the SVG required for drawing the dynamic grid + image = unescape(encodeURIComponent(this.createSvgGrid(gridColor))); + image = (window.btoa) ? btoa(image) : Base64.encode(image, true); + image = 'url(' + 'data:image/svg+xml;base64,' + image + ')' + phase = graph.gridSize * this.scale * this.gridSteps; + } + else + { + // Fallback to grid wallpaper with fixed size + image = 'url(' + this.gridImage + ')'; + } + + var x0 = 0; + var y0 = 0; + + if (graph.view.backgroundPageShape != null) + { + var bds = this.getBackgroundPageBounds(); + + x0 = 1 + bds.x; + y0 = 1 + bds.y; + } + + // Computes the offset to maintain origin for grid + position = -Math.round(phase - mxUtils.mod(this.translate.x * this.scale - x0, phase)) + 'px ' + + -Math.round(phase - mxUtils.mod(this.translate.y * this.scale - y0, phase)) + 'px'; + } + + var canvas = graph.view.canvas; + + if (canvas.ownerSVGElement != null) + { + canvas = canvas.ownerSVGElement; + } + + if (graph.view.backgroundPageShape != null) + { + graph.view.backgroundPageShape.node.style.backgroundPosition = position; + graph.view.backgroundPageShape.node.style.backgroundImage = image; + graph.view.backgroundPageShape.node.style.backgroundColor = color; + graph.container.className = 'geDiagramContainer geDiagramBackdrop'; + canvas.style.backgroundImage = 'none'; + canvas.style.backgroundColor = ''; + } + else + { + graph.container.className = 'geDiagramContainer'; + canvas.style.backgroundPosition = position; + canvas.style.backgroundColor = color; + canvas.style.backgroundImage = image; + } + }; + + // Returns the SVG required for painting the background grid. + mxGraphView.prototype.createSvgGrid = function(color) + { + var tmp = this.graph.gridSize * this.scale; + + while (tmp < this.minGridSize) + { + tmp *= 2; + } + + var tmp2 = this.gridSteps * tmp; + + // Small grid lines + var d = []; + + for (var i = 1; i < this.gridSteps; i++) + { + var tmp3 = i * tmp; + d.push('M 0 ' + tmp3 + ' L ' + tmp2 + ' ' + tmp3 + ' M ' + tmp3 + ' 0 L ' + tmp3 + ' ' + tmp2); + } + + // KNOWN: Rounding errors for certain scales (eg. 144%, 121% in Chrome, FF and Safari). Workaround + // in Chrome is to use 100% for the svg size, but this results in blurred grid for large diagrams. + var size = tmp2; + var svg = '' + + '' + + '' + + '' + + ''; + + return svg; + }; + + // Adds panning for the grid with no page view and disabled scrollbars + var mxGraphPanGraph = mxGraph.prototype.panGraph; + mxGraph.prototype.panGraph = function(dx, dy) + { + mxGraphPanGraph.apply(this, arguments); + + if (this.shiftPreview1 != null) + { + var canvas = this.view.canvas; + + if (canvas.ownerSVGElement != null) + { + canvas = canvas.ownerSVGElement; + } + + var phase = this.gridSize * this.view.scale * this.view.gridSteps; + var position = -Math.round(phase - mxUtils.mod(this.view.translate.x * this.view.scale + dx, phase)) + 'px ' + + -Math.round(phase - mxUtils.mod(this.view.translate.y * this.view.scale + dy, phase)) + 'px'; + canvas.style.backgroundPosition = position; + } + }; + + // Draws page breaks only within the page + mxGraph.prototype.updatePageBreaks = function(visible, width, height) + { + var scale = this.view.scale; + var tr = this.view.translate; + var fmt = this.pageFormat; + var ps = scale * this.pageScale; + + var bounds2 = this.view.getBackgroundPageBounds(); + + width = bounds2.width; + height = bounds2.height; + var bounds = new mxRectangle(scale * tr.x, scale * tr.y, fmt.width * ps, fmt.height * ps); + + // Does not show page breaks if the scale is too small + visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist; + + var horizontalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0; + var verticalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0; + var right = bounds2.x + width; + var bottom = bounds2.y + height; + + if (this.horizontalPageBreaks == null && horizontalCount > 0) + { + this.horizontalPageBreaks = []; + } + + if (this.verticalPageBreaks == null && verticalCount > 0) + { + this.verticalPageBreaks = []; + } + + var drawPageBreaks = mxUtils.bind(this, function(breaks) + { + if (breaks != null) + { + var count = (breaks == this.horizontalPageBreaks) ? horizontalCount : verticalCount; + + for (var i = 0; i <= count; i++) + { + var pts = (breaks == this.horizontalPageBreaks) ? + [new mxPoint(Math.round(bounds2.x), Math.round(bounds2.y + (i + 1) * bounds.height)), + new mxPoint(Math.round(right), Math.round(bounds2.y + (i + 1) * bounds.height))] : + [new mxPoint(Math.round(bounds2.x + (i + 1) * bounds.width), Math.round(bounds2.y)), + new mxPoint(Math.round(bounds2.x + (i + 1) * bounds.width), Math.round(bottom))]; + + if (breaks[i] != null) + { + breaks[i].points = pts; + breaks[i].redraw(); + } + else + { + var pageBreak = new mxPolyline(pts, this.pageBreakColor); + pageBreak.dialect = this.dialect; + pageBreak.isDashed = this.pageBreakDashed; + pageBreak.pointerEvents = false; + pageBreak.init(this.view.backgroundPane); + pageBreak.redraw(); + + breaks[i] = pageBreak; + } + } + + for (var i = count; i < breaks.length; i++) + { + breaks[i].destroy(); + } + + breaks.splice(count, breaks.length - count); + } + }); + + drawPageBreaks(this.horizontalPageBreaks); + drawPageBreaks(this.verticalPageBreaks); + }; + + // Disables removing relative children from parents + var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent; + mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt) + { + for (var i = 0; i < cells.length; i++) + { + if (this.graph.getModel().isVertex(cells[i])) + { + var geo = this.graph.getCellGeometry(cells[i]); + + if (geo != null && geo.relative) + { + return false; + } + } + } + + return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments); + }; + + // Overrides to ignore hotspot only for target terminal + var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker; + mxConnectionHandler.prototype.createMarker = function() + { + var marker = mxConnectionHandlerCreateMarker.apply(this, arguments); + + marker.intersects = mxUtils.bind(this, function(state, evt) + { + if (this.isConnecting()) + { + return true; + } + + return mxCellMarker.prototype.intersects.apply(marker, arguments); + }); + + return marker; + }; + + // Creates background page shape + mxGraphView.prototype.createBackgroundPageShape = function(bounds) + { + return new mxRectangleShape(bounds, '#ffffff', this.graph.defaultPageBorderColor); + }; + + // Fits the number of background pages to the graph + mxGraphView.prototype.getBackgroundPageBounds = function() + { + var gb = this.getGraphBounds(); + + // Computes unscaled, untranslated graph bounds + var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0; + var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0; + var w = gb.width / this.scale; + var h = gb.height / this.scale; + + var fmt = this.graph.pageFormat; + var ps = this.graph.pageScale; + + var pw = fmt.width * ps; + var ph = fmt.height * ps; + + var x0 = Math.floor(Math.min(0, x) / pw); + var y0 = Math.floor(Math.min(0, y) / ph); + var xe = Math.ceil(Math.max(1, x + w) / pw); + var ye = Math.ceil(Math.max(1, y + h) / ph); + + var rows = xe - x0; + var cols = ye - y0; + + var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale * + (this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph); + + return bounds; + }; + + // Add panning for background page in VML + var graphPanGraph = mxGraph.prototype.panGraph; + mxGraph.prototype.panGraph = function(dx, dy) + { + graphPanGraph.apply(this, arguments); + + if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) && + (!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container))) + { + this.view.backgroundPageShape.node.style.marginLeft = dx + 'px'; + this.view.backgroundPageShape.node.style.marginTop = dy + 'px'; + } + }; + + /** + * Consumes click events for disabled menu items. + */ + var mxPopupMenuAddItem = mxPopupMenu.prototype.addItem; + mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled) + { + var result = mxPopupMenuAddItem.apply(this, arguments); + + if (enabled != null && !enabled) + { + mxEvent.addListener(result, 'mousedown', function(evt) + { + mxEvent.consume(evt); + }); + } + + return result; + }; + + // Selects ancestors before descendants + var graphHandlerGetInitialCellForEvent = mxGraphHandler.prototype.getInitialCellForEvent; + mxGraphHandler.prototype.getInitialCellForEvent = function(me) + { + var model = this.graph.getModel(); + var psel = model.getParent(this.graph.getSelectionCell()); + var cell = graphHandlerGetInitialCellForEvent.apply(this, arguments); + var parent = model.getParent(cell); + + if (psel == null || (psel != cell && psel != parent)) + { + while (!this.graph.isCellSelected(cell) && !this.graph.isCellSelected(parent) && + model.isVertex(parent) && !this.graph.isContainer(parent)) + { + cell = parent; + parent = this.graph.getModel().getParent(cell); + } + } + + return cell; + }; + + // Selection is delayed to mouseup if ancestor is selected + var graphHandlerIsDelayedSelection = mxGraphHandler.prototype.isDelayedSelection; + mxGraphHandler.prototype.isDelayedSelection = function(cell, me) + { + var result = graphHandlerIsDelayedSelection.apply(this, arguments); + + if (!result) + { + var model = this.graph.getModel(); + var parent = model.getParent(cell); + + while (parent != null) + { + // Inconsistency for unselected parent swimlane is intended for easier moving + // of stack layouts where the container title section is too far away + if (this.graph.isCellSelected(parent) && model.isVertex(parent)) + { + result = true; + break; + } + + parent = model.getParent(parent); + } + } + + return result; + }; + + // Delayed selection of parent group + mxGraphHandler.prototype.selectDelayed = function(me) + { + if (!this.graph.popupMenuHandler.isPopupTrigger(me)) + { + var cell = me.getCell(); + + if (cell == null) + { + cell = this.cell; + } + + // Selects folded cell for hit on folding icon + var state = this.graph.view.getState(cell) + + if (state != null && me.isSource(state.control)) + { + this.graph.selectCellForEvent(cell, me.getEvent()); + } + else + { + var model = this.graph.getModel(); + var parent = model.getParent(cell); + + while (!this.graph.isCellSelected(parent) && model.isVertex(parent)) + { + cell = parent; + parent = model.getParent(cell); + } + + this.graph.selectCellForEvent(cell, me.getEvent()); + } + } + }; + + // Returns last selected ancestor + mxPopupMenuHandler.prototype.getCellForPopupEvent = function(me) + { + var cell = me.getCell(); + var model = this.graph.getModel(); + var parent = model.getParent(cell); + + while (model.isVertex(parent) && !this.graph.isContainer(parent)) + { + if (this.graph.isCellSelected(parent)) + { + cell = parent; + } + + parent = model.getParent(parent); + } + + return cell; + }; + +})(); diff --git a/public/js/grapheditor/js/EditorUi.js b/public/js/grapheditor/js/EditorUi.js new file mode 100644 index 000000000..66b4c8802 --- /dev/null +++ b/public/js/grapheditor/js/EditorUi.js @@ -0,0 +1,4676 @@ +/** + * Copyright (c) 2006-2012, JGraph Ltd + */ +/** + * Constructs a new graph editor + */ +EditorUi = function(editor, container, lightbox) +{ + mxEventSource.call(this); + + this.destroyFunctions = []; + this.editor = editor || new Editor(); + this.container = container || document.body; + + var graph = this.editor.graph; + graph.lightbox = lightbox; + + // Faster scrollwheel zoom is possible with CSS transforms + if (graph.useCssTransforms) + { + this.lazyZoomDelay = 0; + } + + // Pre-fetches submenu image or replaces with embedded image if supported + if (mxClient.IS_SVG) + { + mxPopupMenu.prototype.submenuImage = 'data:image/gif;base64,R0lGODlhCQAJAIAAAP///zMzMyH5BAEAAAAALAAAAAAJAAkAAAIPhI8WebHsHopSOVgb26AAADs='; + } + else + { + new Image().src = mxPopupMenu.prototype.submenuImage; + } + + // Pre-fetches connect image + if (!mxClient.IS_SVG && mxConnectionHandler.prototype.connectImage != null) + { + new Image().src = mxConnectionHandler.prototype.connectImage.src; + } + + // Disables graph and forced panning in chromeless mode + if (this.editor.chromeless && !this.editor.editable) + { + this.footerHeight = 0; + graph.isEnabled = function() { return false; }; + graph.panningHandler.isForcePanningEvent = function(me) + { + return !mxEvent.isPopupTrigger(me.getEvent()); + }; + } + + // Creates the user interface + this.actions = new Actions(this); + this.menus = this.createMenus(); + + if (!graph.standalone) + { + this.createDivs(); + this.createUi(); + this.refresh(); + + // Disables HTML and text selection + var textEditing = mxUtils.bind(this, function(evt) + { + if (evt == null) + { + evt = window.event; + } + + return graph.isEditing() || (evt != null && this.isSelectionAllowed(evt)); + }); + + // Disables text selection while not editing and no dialog visible + if (this.container == document.body) + { + this.menubarContainer.onselectstart = textEditing; + this.menubarContainer.onmousedown = textEditing; + this.toolbarContainer.onselectstart = textEditing; + this.toolbarContainer.onmousedown = textEditing; + this.diagramContainer.onselectstart = textEditing; + this.diagramContainer.onmousedown = textEditing; + this.sidebarContainer.onselectstart = textEditing; + this.sidebarContainer.onmousedown = textEditing; + this.formatContainer.onselectstart = textEditing; + this.formatContainer.onmousedown = textEditing; + this.footerContainer.onselectstart = textEditing; + this.footerContainer.onmousedown = textEditing; + + if (this.tabContainer != null) + { + // Mouse down is needed for drag and drop + this.tabContainer.onselectstart = textEditing; + } + } + + // And uses built-in context menu while editing + if (!this.editor.chromeless || this.editor.editable) + { + // Allows context menu for links in hints + var linkHandler = function(evt) + { + if (evt != null) + { + var source = mxEvent.getSource(evt); + + if (source.nodeName == 'A') + { + while (source != null) + { + if (source.className == 'geHint') + { + return true; + } + + source = source.parentNode; + } + } + } + + return textEditing(evt); + }; + + if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9)) + { + mxEvent.addListener(this.diagramContainer, 'contextmenu', linkHandler); + } + else + { + // Allows browser context menu outside of diagram and sidebar + this.diagramContainer.oncontextmenu = linkHandler; + } + } + else + { + graph.panningHandler.usePopupTrigger = false; + } + + // Contains the main graph instance inside the given panel + graph.init(this.diagramContainer); + + // Improves line wrapping for in-place editor + if (mxClient.IS_SVG && graph.view.getDrawPane() != null) + { + var root = graph.view.getDrawPane().ownerSVGElement; + + if (root != null) + { + root.style.position = 'absolute'; + } + } + + // Creates hover icons + this.hoverIcons = this.createHoverIcons(); + + // Adds tooltip when mouse is over scrollbars to show space-drag panning option + mxEvent.addListener(this.diagramContainer, 'mousemove', mxUtils.bind(this, function(evt) + { + var off = mxUtils.getOffset(this.diagramContainer); + + if (mxEvent.getClientX(evt) - off.x - this.diagramContainer.clientWidth > 0 || + mxEvent.getClientY(evt) - off.y - this.diagramContainer.clientHeight > 0) + { + this.diagramContainer.setAttribute('title', mxResources.get('panTooltip')); + } + else + { + this.diagramContainer.removeAttribute('title'); + } + })); + + // Escape key hides dialogs, adds space+drag panning + var spaceKeyPressed = false; + + // Overrides hovericons to disable while space key is pressed + var hoverIconsIsResetEvent = this.hoverIcons.isResetEvent; + + this.hoverIcons.isResetEvent = function(evt, allowShift) + { + return spaceKeyPressed || hoverIconsIsResetEvent.apply(this, arguments); + }; + + this.keydownHandler = mxUtils.bind(this, function(evt) + { + if (evt.which == 32 /* Space */ && !graph.isEditing()) + { + spaceKeyPressed = true; + this.hoverIcons.reset(); + graph.container.style.cursor = 'move'; + + // Disables scroll after space keystroke with scrollbars + if (!graph.isEditing() && mxEvent.getSource(evt) == graph.container) + { + mxEvent.consume(evt); + } + } + else if (!mxEvent.isConsumed(evt) && evt.keyCode == 27 /* Escape */) + { + this.hideDialog(null, true); + } + }); + + mxEvent.addListener(document, 'keydown', this.keydownHandler); + + this.keyupHandler = mxUtils.bind(this, function(evt) + { + graph.container.style.cursor = ''; + spaceKeyPressed = false; + }); + + mxEvent.addListener(document, 'keyup', this.keyupHandler); + + // Forces panning for middle and right mouse buttons + var panningHandlerIsForcePanningEvent = graph.panningHandler.isForcePanningEvent; + graph.panningHandler.isForcePanningEvent = function(me) + { + // Ctrl+left button is reported as right button in FF on Mac + return panningHandlerIsForcePanningEvent.apply(this, arguments) || + spaceKeyPressed || (mxEvent.isMouseEvent(me.getEvent()) && + (this.usePopupTrigger || !mxEvent.isPopupTrigger(me.getEvent())) && + ((!mxEvent.isControlDown(me.getEvent()) && + mxEvent.isRightMouseButton(me.getEvent())) || + mxEvent.isMiddleMouseButton(me.getEvent()))); + }; + + // Ctrl/Cmd+Enter applies editing value except in Safari where Ctrl+Enter creates + // a new line (while Enter creates a new paragraph and Shift+Enter stops) + var cellEditorIsStopEditingEvent = graph.cellEditor.isStopEditingEvent; + graph.cellEditor.isStopEditingEvent = function(evt) + { + return cellEditorIsStopEditingEvent.apply(this, arguments) || + (evt.keyCode == 13 && ((!mxClient.IS_SF && mxEvent.isControlDown(evt)) || + (mxClient.IS_MAC && mxEvent.isMetaDown(evt)) || + (mxClient.IS_SF && mxEvent.isShiftDown(evt)))); + }; + + // Adds space+wheel for zoom + var graphIsZoomWheelEvent = graph.isZoomWheelEvent; + + graph.isZoomWheelEvent = function() + { + return spaceKeyPressed || graphIsZoomWheelEvent.apply(this, arguments); + }; + + // Switches toolbar for text editing + var textMode = false; + var fontMenu = null; + var sizeMenu = null; + var nodes = null; + + var updateToolbar = mxUtils.bind(this, function() + { + if (this.toolbar != null && textMode != graph.cellEditor.isContentEditing()) + { + var node = this.toolbar.container.firstChild; + var newNodes = []; + + while (node != null) + { + var tmp = node.nextSibling; + + if (mxUtils.indexOf(this.toolbar.staticElements, node) < 0) + { + node.parentNode.removeChild(node); + newNodes.push(node); + } + + node = tmp; + } + + // Saves references to special items + var tmp1 = this.toolbar.fontMenu; + var tmp2 = this.toolbar.sizeMenu; + + if (nodes == null) + { + this.toolbar.createTextToolbar(); + } + else + { + for (var i = 0; i < nodes.length; i++) + { + this.toolbar.container.appendChild(nodes[i]); + } + + // Restores references to special items + this.toolbar.fontMenu = fontMenu; + this.toolbar.sizeMenu = sizeMenu; + } + + textMode = graph.cellEditor.isContentEditing(); + fontMenu = tmp1; + sizeMenu = tmp2; + nodes = newNodes; + } + }); + + var ui = this; + + // Overrides cell editor to update toolbar + var cellEditorStartEditing = graph.cellEditor.startEditing; + graph.cellEditor.startEditing = function() + { + cellEditorStartEditing.apply(this, arguments); + updateToolbar(); + + if (graph.cellEditor.isContentEditing()) + { + var updating = false; + + var updateCssHandler = function() + { + if (!updating) + { + updating = true; + + window.setTimeout(function() + { + var selectedElement = graph.getSelectedElement(); + var node = selectedElement; + + while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) + { + node = node.parentNode; + } + + if (node != null) + { + var css = mxUtils.getCurrentStyle(node); + + if (css != null && ui.toolbar != null) + { + // Strips leading and trailing quotes + var ff = css.fontFamily; + + if (ff.charAt(0) == '\'') + { + ff = ff.substring(1); + } + + if (ff.charAt(ff.length - 1) == '\'') + { + ff = ff.substring(0, ff.length - 1); + } + + ui.toolbar.setFontName(ff); + ui.toolbar.setFontSize(parseInt(css.fontSize)); + } + } + + updating = false; + }, 0); + } + }; + + mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler) + mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler); + mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler); + mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler); + updateCssHandler(); + } + }; + + // Updates toolbar and handles possible errors + var cellEditorStopEditing = graph.cellEditor.stopEditing; + graph.cellEditor.stopEditing = function(cell, trigger) + { + try + { + cellEditorStopEditing.apply(this, arguments); + updateToolbar(); + } + catch (e) + { + ui.handleError(e); + } + }; + + // Enables scrollbars and sets cursor style for the container + graph.container.setAttribute('tabindex', '0'); + graph.container.style.cursor = 'default'; + + // Workaround for page scroll if embedded via iframe + if (window.self === window.top && graph.container.parentNode != null) + { + try + { + graph.container.focus(); + } + catch (e) + { + // ignores error in old versions of IE + } + } + + // Keeps graph container focused on mouse down + var graphFireMouseEvent = graph.fireMouseEvent; + graph.fireMouseEvent = function(evtName, me, sender) + { + if (evtName == mxEvent.MOUSE_DOWN) + { + this.container.focus(); + } + + graphFireMouseEvent.apply(this, arguments); + }; + + // Configures automatic expand on mouseover + graph.popupMenuHandler.autoExpand = true; + + // Installs context menu + if (this.menus != null) + { + graph.popupMenuHandler.factoryMethod = mxUtils.bind(this, function(menu, cell, evt) + { + this.menus.createPopupMenu(menu, cell, evt); + }); + } + + // Hides context menu + mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) + { + graph.popupMenuHandler.hideMenu(); + })); + + // Create handler for key events + this.keyHandler = this.createKeyHandler(editor); + + // Getter for key handler + this.getKeyHandler = function() + { + return keyHandler; + }; + + // Stores the current style and assigns it to new cells + var styles = ['rounded', 'shadow', 'glass', 'dashed', 'dashPattern', 'comic', 'labelBackgroundColor']; + var connectStyles = ['shape', 'edgeStyle', 'curved', 'rounded', 'elbow', 'comic', 'jumpStyle', 'jumpSize']; + + // Note: Everything that is not in styles is ignored (styles is augmented below) + this.setDefaultStyle = function(cell) + { + try + { + var state = graph.view.getState(cell); + + if (state != null) + { + // Ignores default styles + var clone = cell.clone(); + clone.style = '' + var defaultStyle = graph.getCellStyle(clone); + var values = []; + var keys = []; + + for (var key in state.style) + { + if (defaultStyle[key] != state.style[key]) + { + values.push(state.style[key]); + keys.push(key); + } + } + + // Handles special case for value "none" + var cellStyle = graph.getModel().getStyle(state.cell); + var tokens = (cellStyle != null) ? cellStyle.split(';') : []; + + for (var i = 0; i < tokens.length; i++) + { + var tmp = tokens[i]; + var pos = tmp.indexOf('='); + + if (pos >= 0) + { + var key = tmp.substring(0, pos); + var value = tmp.substring(pos + 1); + + if (defaultStyle[key] != null && value == 'none') + { + values.push(value); + keys.push(key); + } + } + } + + // Resets current style + if (graph.getModel().isEdge(state.cell)) + { + graph.currentEdgeStyle = {}; + } + else + { + graph.currentVertexStyle = {} + } + + this.fireEvent(new mxEventObject('styleChanged', 'keys', keys, 'values', values, 'cells', [state.cell])); + } + } + catch (e) + { + this.handleError(e); + } + }; + + this.clearDefaultStyle = function() + { + graph.currentEdgeStyle = mxUtils.clone(graph.defaultEdgeStyle); + graph.currentVertexStyle = mxUtils.clone(graph.defaultVertexStyle); + + // Updates UI + this.fireEvent(new mxEventObject('styleChanged', 'keys', [], 'values', [], 'cells', [])); + }; + + // Keys that should be ignored if the cell has a value (known: new default for all cells is html=1 so + // for the html key this effecticely only works for edges inserted via the connection handler) + var valueStyles = ['fontFamily', 'fontSize', 'fontColor']; + + // Keys that always update the current edge style regardless of selection + var alwaysEdgeStyles = ['edgeStyle', 'startArrow', 'startFill', 'startSize', 'endArrow', + 'endFill', 'endSize']; + + // Keys that are ignored together (if one appears all are ignored) + var keyGroups = [['startArrow', 'startFill', 'startSize', 'sourcePerimeterSpacing', + 'endArrow', 'endFill', 'endSize', 'targetPerimeterSpacing'], + ['strokeColor', 'strokeWidth'], + ['fillColor', 'gradientColor'], + valueStyles, + ['opacity'], + ['align'], + ['html']]; + + // Adds all keys used above to the styles array + for (var i = 0; i < keyGroups.length; i++) + { + for (var j = 0; j < keyGroups[i].length; j++) + { + styles.push(keyGroups[i][j]); + } + } + + for (var i = 0; i < connectStyles.length; i++) + { + if (mxUtils.indexOf(styles, connectStyles[i]) < 0) + { + styles.push(connectStyles[i]); + } + } + + // Implements a global current style for edges and vertices that is applied to new cells + var insertHandler = function(cells, asText) + { + var model = graph.getModel(); + + model.beginUpdate(); + try + { + for (var i = 0; i < cells.length; i++) + { + var cell = cells[i]; + + var appliedStyles; + + if (asText) + { + // Applies only basic text styles + appliedStyles = ['fontSize', 'fontFamily', 'fontColor']; + } + else + { + // Removes styles defined in the cell style from the styles to be applied + var cellStyle = model.getStyle(cell); + var tokens = (cellStyle != null) ? cellStyle.split(';') : []; + appliedStyles = styles.slice(); + + for (var j = 0; j < tokens.length; j++) + { + var tmp = tokens[j]; + var pos = tmp.indexOf('='); + + if (pos >= 0) + { + var key = tmp.substring(0, pos); + var index = mxUtils.indexOf(appliedStyles, key); + + if (index >= 0) + { + appliedStyles.splice(index, 1); + } + + // Handles special cases where one defined style ignores other styles + for (var k = 0; k < keyGroups.length; k++) + { + var group = keyGroups[k]; + + if (mxUtils.indexOf(group, key) >= 0) + { + for (var l = 0; l < group.length; l++) + { + var index2 = mxUtils.indexOf(appliedStyles, group[l]); + + if (index2 >= 0) + { + appliedStyles.splice(index2, 1); + } + } + } + } + } + } + } + + // Applies the current style to the cell + var edge = model.isEdge(cell); + var current = (edge) ? graph.currentEdgeStyle : graph.currentVertexStyle; + var newStyle = model.getStyle(cell); + + for (var j = 0; j < appliedStyles.length; j++) + { + var key = appliedStyles[j]; + var styleValue = current[key]; + + if (styleValue != null && (key != 'shape' || edge)) + { + // Special case: Connect styles are not applied here but in the connection handler + if (!edge || mxUtils.indexOf(connectStyles, key) < 0) + { + newStyle = mxUtils.setStyle(newStyle, key, styleValue); + } + } + } + + model.setStyle(cell, newStyle); + } + } + finally + { + model.endUpdate(); + } + }; + + graph.addListener('cellsInserted', function(sender, evt) + { + insertHandler(evt.getProperty('cells')); + }); + + graph.addListener('textInserted', function(sender, evt) + { + insertHandler(evt.getProperty('cells'), true); + }); + + graph.connectionHandler.addListener(mxEvent.CONNECT, function(sender, evt) + { + var cells = [evt.getProperty('cell')]; + + if (evt.getProperty('terminalInserted')) + { + cells.push(evt.getProperty('terminal')); + } + + insertHandler(cells); + }); + + this.addListener('styleChanged', mxUtils.bind(this, function(sender, evt) + { + // Checks if edges and/or vertices were modified + var cells = evt.getProperty('cells'); + var vertex = false; + var edge = false; + + if (cells.length > 0) + { + for (var i = 0; i < cells.length; i++) + { + vertex = graph.getModel().isVertex(cells[i]) || vertex; + edge = graph.getModel().isEdge(cells[i]) || edge; + + if (edge && vertex) + { + break; + } + } + } + else + { + vertex = true; + edge = true; + } + + var keys = evt.getProperty('keys'); + var values = evt.getProperty('values'); + + for (var i = 0; i < keys.length; i++) + { + var common = mxUtils.indexOf(valueStyles, keys[i]) >= 0; + + // Ignores transparent stroke colors + if (keys[i] != 'strokeColor' || (values[i] != null && values[i] != 'none')) + { + // Special case: Edge style and shape + if (mxUtils.indexOf(connectStyles, keys[i]) >= 0) + { + if (edge || mxUtils.indexOf(alwaysEdgeStyles, keys[i]) >= 0) + { + if (values[i] == null) + { + delete graph.currentEdgeStyle[keys[i]]; + } + else + { + graph.currentEdgeStyle[keys[i]] = values[i]; + } + } + // Uses style for vertex if defined in styles + else if (vertex && mxUtils.indexOf(styles, keys[i]) >= 0) + { + if (values[i] == null) + { + delete graph.currentVertexStyle[keys[i]]; + } + else + { + graph.currentVertexStyle[keys[i]] = values[i]; + } + } + } + else if (mxUtils.indexOf(styles, keys[i]) >= 0) + { + if (vertex || common) + { + if (values[i] == null) + { + delete graph.currentVertexStyle[keys[i]]; + } + else + { + graph.currentVertexStyle[keys[i]] = values[i]; + } + } + + if (edge || common || mxUtils.indexOf(alwaysEdgeStyles, keys[i]) >= 0) + { + if (values[i] == null) + { + delete graph.currentEdgeStyle[keys[i]]; + } + else + { + graph.currentEdgeStyle[keys[i]] = values[i]; + } + } + } + } + } + + if (this.toolbar != null) + { + this.toolbar.setFontName(graph.currentVertexStyle['fontFamily'] || Menus.prototype.defaultFont); + this.toolbar.setFontSize(graph.currentVertexStyle['fontSize'] || Menus.prototype.defaultFontSize); + + if (this.toolbar.edgeStyleMenu != null) + { + // Updates toolbar icon for edge style + var edgeStyleDiv = this.toolbar.edgeStyleMenu.getElementsByTagName('div')[0]; + + if (graph.currentEdgeStyle['edgeStyle'] == 'orthogonalEdgeStyle' && graph.currentEdgeStyle['curved'] == '1') + { + edgeStyleDiv.className = 'geSprite geSprite-curved'; + } + else if (graph.currentEdgeStyle['edgeStyle'] == 'straight' || graph.currentEdgeStyle['edgeStyle'] == 'none' || + graph.currentEdgeStyle['edgeStyle'] == null) + { + edgeStyleDiv.className = 'geSprite geSprite-straight'; + } + else if (graph.currentEdgeStyle['edgeStyle'] == 'entityRelationEdgeStyle') + { + edgeStyleDiv.className = 'geSprite geSprite-entity'; + } + else if (graph.currentEdgeStyle['edgeStyle'] == 'elbowEdgeStyle') + { + edgeStyleDiv.className = 'geSprite geSprite-' + ((graph.currentEdgeStyle['elbow'] == 'vertical') ? + 'verticalelbow' : 'horizontalelbow'); + } + else if (graph.currentEdgeStyle['edgeStyle'] == 'isometricEdgeStyle') + { + edgeStyleDiv.className = 'geSprite geSprite-' + ((graph.currentEdgeStyle['elbow'] == 'vertical') ? + 'verticalisometric' : 'horizontalisometric'); + } + else + { + edgeStyleDiv.className = 'geSprite geSprite-orthogonal'; + } + } + + if (this.toolbar.edgeShapeMenu != null) + { + // Updates icon for edge shape + var edgeShapeDiv = this.toolbar.edgeShapeMenu.getElementsByTagName('div')[0]; + + if (graph.currentEdgeStyle['shape'] == 'link') + { + edgeShapeDiv.className = 'geSprite geSprite-linkedge'; + } + else if (graph.currentEdgeStyle['shape'] == 'flexArrow') + { + edgeShapeDiv.className = 'geSprite geSprite-arrow'; + } + else if (graph.currentEdgeStyle['shape'] == 'arrow') + { + edgeShapeDiv.className = 'geSprite geSprite-simplearrow'; + } + else + { + edgeShapeDiv.className = 'geSprite geSprite-connection'; + } + } + + // Updates icon for optinal line start shape + if (this.toolbar.lineStartMenu != null) + { + var lineStartDiv = this.toolbar.lineStartMenu.getElementsByTagName('div')[0]; + + lineStartDiv.className = this.getCssClassForMarker('start', + graph.currentEdgeStyle['shape'], graph.currentEdgeStyle[mxConstants.STYLE_STARTARROW], + mxUtils.getValue(graph.currentEdgeStyle, 'startFill', '1')); + } + + // Updates icon for optinal line end shape + if (this.toolbar.lineEndMenu != null) + { + var lineEndDiv = this.toolbar.lineEndMenu.getElementsByTagName('div')[0]; + + lineEndDiv.className = this.getCssClassForMarker('end', + graph.currentEdgeStyle['shape'], graph.currentEdgeStyle[mxConstants.STYLE_ENDARROW], + mxUtils.getValue(graph.currentEdgeStyle, 'endFill', '1')); + } + } + })); + + // Update font size and font family labels + if (this.toolbar != null) + { + var update = mxUtils.bind(this, function() + { + var ff = graph.currentVertexStyle['fontFamily'] || 'Helvetica'; + var fs = String(graph.currentVertexStyle['fontSize'] || '12'); + var state = graph.getView().getState(graph.getSelectionCell()); + + if (state != null) + { + ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff; + fs = state.style[mxConstants.STYLE_FONTSIZE] || fs; + + if (ff.length > 10) + { + ff = ff.substring(0, 8) + '...'; + } + } + + this.toolbar.setFontName(ff); + this.toolbar.setFontSize(fs); + }); + + graph.getSelectionModel().addListener(mxEvent.CHANGE, update); + graph.getModel().addListener(mxEvent.CHANGE, update); + } + + // Makes sure the current layer is visible when cells are added + graph.addListener(mxEvent.CELLS_ADDED, function(sender, evt) + { + var cells = evt.getProperty('cells'); + var parent = evt.getProperty('parent'); + + if (graph.getModel().isLayer(parent) && !graph.isCellVisible(parent) && cells != null && cells.length > 0) + { + graph.getModel().setVisible(parent, true); + } + }); + + // Global handler to hide the current menu + this.gestureHandler = mxUtils.bind(this, function(evt) + { + if (this.currentMenu != null && mxEvent.getSource(evt) != this.currentMenu.div) + { + this.hideCurrentMenu(); + } + }); + + mxEvent.addGestureListeners(document, this.gestureHandler); + + // Updates the editor UI after the window has been resized or the orientation changes + // Timeout is workaround for old IE versions which have a delay for DOM client sizes. + // Should not use delay > 0 to avoid handle multiple repaints during window resize + this.resizeHandler = mxUtils.bind(this, function() + { + window.setTimeout(mxUtils.bind(this, function() + { + if (this.editor.graph != null) + { + this.refresh(); + } + }), 0); + }); + + mxEvent.addListener(window, 'resize', this.resizeHandler); + + this.orientationChangeHandler = mxUtils.bind(this, function() + { + this.refresh(); + }); + + mxEvent.addListener(window, 'orientationchange', this.orientationChangeHandler); + + // Workaround for bug on iOS see + // http://stackoverflow.com/questions/19012135/ios-7-ipad-safari-landscape-innerheight-outerheight-layout-issue + if (mxClient.IS_IOS && !window.navigator.standalone) + { + this.scrollHandler = mxUtils.bind(this, function() + { + window.scrollTo(0, 0); + }); + + mxEvent.addListener(window, 'scroll', this.scrollHandler); + } + + /** + * Sets the initial scrollbar locations after a file was loaded. + */ + this.editor.addListener('resetGraphView', mxUtils.bind(this, function() + { + this.resetScrollbars(); + })); + + /** + * Repaints the grid. + */ + this.addListener('gridEnabledChanged', mxUtils.bind(this, function() + { + graph.view.validateBackground(); + })); + + this.addListener('backgroundColorChanged', mxUtils.bind(this, function() + { + graph.view.validateBackground(); + })); + + /** + * Repaints the grid. + */ + graph.addListener('gridSizeChanged', mxUtils.bind(this, function() + { + if (graph.isGridEnabled()) + { + graph.view.validateBackground(); + } + })); + + // Resets UI, updates action and menu states + this.editor.resetGraph(); + } + + this.init(); + + if (!graph.standalone) + { + this.open(); + } +}; + +// Extends mxEventSource +mxUtils.extend(EditorUi, mxEventSource); + +/** + * Global config that specifies if the compact UI elements should be used. + */ +EditorUi.compactUi = true; + +/** + * Specifies the size of the split bar. + */ +EditorUi.prototype.splitSize = (mxClient.IS_TOUCH || mxClient.IS_POINTER) ? 12 : 8; + +/** + * Specifies the height of the menubar. Default is 30. + */ +EditorUi.prototype.menubarHeight = 30; + +/** + * Specifies the width of the format panel should be enabled. Default is true. + */ +EditorUi.prototype.formatEnabled = true; + +/** + * Specifies the width of the format panel. Default is 240. + */ +EditorUi.prototype.formatWidth = 240; + +/** + * Specifies the height of the toolbar. Default is 38. + */ +EditorUi.prototype.toolbarHeight = 38; + +/** + * Specifies the height of the footer. Default is 28. + */ +EditorUi.prototype.footerHeight = 28; + +/** + * Specifies the height of the optional sidebarFooterContainer. Default is 34. + */ +EditorUi.prototype.sidebarFooterHeight = 34; + +/** + * Specifies the position of the horizontal split bar. Default is 240 or 118 for + * screen widths <= 640px. + */ +EditorUi.prototype.hsplitPosition = (screen.width <= 640) ? 118 : ((urlParams['sidebar-entries'] != 'large') ? 212 : 240); + +/** + * Specifies if animations are allowed in . Default is true. + */ +EditorUi.prototype.allowAnimation = true; + +/** + * Default is 2. + */ +EditorUi.prototype.lightboxMaxFitScale = 2; + +/** + * Default is 4. + */ +EditorUi.prototype.lightboxVerticalDivider = 4; + +/** + * Specifies if single click on horizontal split should collapse sidebar. Default is false. + */ +EditorUi.prototype.hsplitClickEnabled = false; + +/** + * Installs the listeners to update the action states. + */ +EditorUi.prototype.init = function() +{ + var graph = this.editor.graph; + + if (!graph.standalone) + { + // Hides tooltips and connection points when scrolling + mxEvent.addListener(graph.container, 'scroll', mxUtils.bind(this, function() + { + graph.tooltipHandler.hide(); + + if (graph.connectionHandler != null && graph.connectionHandler.constraintHandler != null) + { + graph.connectionHandler.constraintHandler.reset(); + } + })); + + // Hides tooltip on escape + graph.addListener(mxEvent.ESCAPE, mxUtils.bind(this, function() + { + graph.tooltipHandler.hide(); + var rb = graph.getRubberband(); + + if (rb != null) + { + rb.cancel(); + } + })); + + mxEvent.addListener(graph.container, 'keydown', mxUtils.bind(this, function(evt) + { + this.onKeyDown(evt); + })); + + mxEvent.addListener(graph.container, 'keypress', mxUtils.bind(this, function(evt) + { + this.onKeyPress(evt); + })); + + // Updates action states + this.addUndoListener(); + this.addBeforeUnloadListener(); + + graph.getSelectionModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() + { + this.updateActionStates(); + })); + + graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() + { + this.updateActionStates(); + })); + + // Changes action states after change of default parent + var graphSetDefaultParent = graph.setDefaultParent; + var ui = this; + + this.editor.graph.setDefaultParent = function() + { + graphSetDefaultParent.apply(this, arguments); + ui.updateActionStates(); + }; + + // Hack to make editLink available in vertex handler + graph.editLink = ui.actions.get('editLink').funct; + + this.updateActionStates(); + this.initClipboard(); + this.initCanvas(); + + if (this.format != null) + { + this.format.init(); + } + } +}; + +/** + * Returns true if the given event should start editing. This implementation returns true. + */ +EditorUi.prototype.onKeyDown = function(evt) +{ + var graph = this.editor.graph; + + // Tab selects next cell + if (evt.which == 9 && graph.isEnabled() && !mxEvent.isAltDown(evt) && + (!graph.isEditing() || !mxEvent.isShiftDown(evt))) + { + if (graph.isEditing()) + { + graph.stopEditing(false); + } + else + { + graph.selectCell(!mxEvent.isShiftDown(evt)); + } + + mxEvent.consume(evt); + } +}; + +/** + * Returns true if the given event should start editing. This implementation returns true. + */ +EditorUi.prototype.onKeyPress = function(evt) +{ + var graph = this.editor.graph; + + // KNOWN: Focus does not work if label is empty in quirks mode + if (this.isImmediateEditingEvent(evt) && !graph.isEditing() && !graph.isSelectionEmpty() && evt.which !== 0 && + evt.which !== 27 && !mxEvent.isAltDown(evt) && !mxEvent.isControlDown(evt) && !mxEvent.isMetaDown(evt)) + { + graph.escape(); + graph.startEditing(); + + // Workaround for FF where char is lost if cursor is placed before char + if (mxClient.IS_FF) + { + var ce = graph.cellEditor; + ce.textarea.innerHTML = String.fromCharCode(evt.which); + + // Moves cursor to end of textarea + var range = document.createRange(); + range.selectNodeContents(ce.textarea); + range.collapse(false); + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + } + } +}; + +/** + * Returns true if the given event should start editing. This implementation returns true. + */ +EditorUi.prototype.isImmediateEditingEvent = function(evt) +{ + return true; +}; + +/** + * Private helper method. + */ +EditorUi.prototype.getCssClassForMarker = function(prefix, shape, marker, fill) +{ + var result = ''; + + if (shape == 'flexArrow') + { + result = (marker != null && marker != mxConstants.NONE) ? + 'geSprite geSprite-' + prefix + 'blocktrans' : 'geSprite geSprite-noarrow'; + } + else + { + // SVG marker sprites + if (marker == 'box' || marker == 'halfCircle') + { + result = 'geSprite geSvgSprite geSprite-' + marker + ((prefix == 'end') ? ' geFlipSprite' : ''); + } + else if (marker == mxConstants.ARROW_CLASSIC) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'classic' : 'geSprite geSprite-' + prefix + 'classictrans'; + } + else if (marker == mxConstants.ARROW_CLASSIC_THIN) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'classicthin' : 'geSprite geSprite-' + prefix + 'classicthintrans'; + } + else if (marker == mxConstants.ARROW_OPEN) + { + result = 'geSprite geSprite-' + prefix + 'open'; + } + else if (marker == mxConstants.ARROW_OPEN_THIN) + { + result = 'geSprite geSprite-' + prefix + 'openthin'; + } + else if (marker == mxConstants.ARROW_BLOCK) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'block' : 'geSprite geSprite-' + prefix + 'blocktrans'; + } + else if (marker == mxConstants.ARROW_BLOCK_THIN) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'blockthin' : 'geSprite geSprite-' + prefix + 'blockthintrans'; + } + else if (marker == mxConstants.ARROW_OVAL) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'oval' : 'geSprite geSprite-' + prefix + 'ovaltrans'; + } + else if (marker == mxConstants.ARROW_DIAMOND) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'diamond' : 'geSprite geSprite-' + prefix + 'diamondtrans'; + } + else if (marker == mxConstants.ARROW_DIAMOND_THIN) + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'thindiamond' : 'geSprite geSprite-' + prefix + 'thindiamondtrans'; + } + else if (marker == 'openAsync') + { + result = 'geSprite geSprite-' + prefix + 'openasync'; + } + else if (marker == 'dash') + { + result = 'geSprite geSprite-' + prefix + 'dash'; + } + else if (marker == 'cross') + { + result = 'geSprite geSprite-' + prefix + 'cross'; + } + else if (marker == 'async') + { + result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'async' : 'geSprite geSprite-' + prefix + 'asynctrans'; + } + else if (marker == 'circle' || marker == 'circlePlus') + { + result = (fill == '1' || marker == 'circle') ? 'geSprite geSprite-' + prefix + 'circle' : 'geSprite geSprite-' + prefix + 'circleplus'; + } + else if (marker == 'ERone') + { + result = 'geSprite geSprite-' + prefix + 'erone'; + } + else if (marker == 'ERmandOne') + { + result = 'geSprite geSprite-' + prefix + 'eronetoone'; + } + else if (marker == 'ERmany') + { + result = 'geSprite geSprite-' + prefix + 'ermany'; + } + else if (marker == 'ERoneToMany') + { + result = 'geSprite geSprite-' + prefix + 'eronetomany'; + } + else if (marker == 'ERzeroToOne') + { + result = 'geSprite geSprite-' + prefix + 'eroneopt'; + } + else if (marker == 'ERzeroToMany') + { + result = 'geSprite geSprite-' + prefix + 'ermanyopt'; + } + else + { + result = 'geSprite geSprite-noarrow'; + } + } + + return result; +}; + +/** + * Overridden in Menus.js + */ +EditorUi.prototype.createMenus = function() +{ + return null; +}; + +/** + * Hook for allowing selection and context menu for certain events. + */ +EditorUi.prototype.updatePasteActionStates = function() +{ + var graph = this.editor.graph; + var paste = this.actions.get('paste'); + var pasteHere = this.actions.get('pasteHere'); + + paste.setEnabled(this.editor.graph.cellEditor.isContentEditing() || (!mxClipboard.isEmpty() && + graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))); + pasteHere.setEnabled(paste.isEnabled()); +}; + +/** + * Hook for allowing selection and context menu for certain events. + */ +EditorUi.prototype.initClipboard = function() +{ + var ui = this; + + var mxClipboardCut = mxClipboard.cut; + mxClipboard.cut = function(graph) + { + if (graph.cellEditor.isContentEditing()) + { + document.execCommand('cut', false, null); + } + else + { + mxClipboardCut.apply(this, arguments); + } + + ui.updatePasteActionStates(); + }; + + var mxClipboardCopy = mxClipboard.copy; + mxClipboard.copy = function(graph) + { + var result = null; + + if (graph.cellEditor.isContentEditing()) + { + document.execCommand('copy', false, null); + } + else + { + result = result || graph.getSelectionCells(); + result = graph.getExportableCells(graph.model.getTopmostCells(result)); + + var cloneMap = new Object(); + var lookup = graph.createCellLookup(result); + var clones = graph.cloneCells(result, null, cloneMap); + + // Uses temporary model to force new IDs to be assigned + // to avoid having to carry over the mapping from object + // ID to cell ID to the paste operation + var model = new mxGraphModel(); + var parent = model.getChildAt(model.getRoot(), 0); + + for (var i = 0; i < clones.length; i++) + { + model.add(parent, clones[i]); + } + + graph.updateCustomLinks(graph.createCellMapping(cloneMap, lookup), clones); + + mxClipboard.insertCount = 1; + mxClipboard.setCells(clones); + } + + ui.updatePasteActionStates(); + + return result; + }; + + var mxClipboardPaste = mxClipboard.paste; + mxClipboard.paste = function(graph) + { + var result = null; + + if (graph.cellEditor.isContentEditing()) + { + document.execCommand('paste', false, null); + } + else + { + result = mxClipboardPaste.apply(this, arguments); + } + + ui.updatePasteActionStates(); + + return result; + }; + + // Overrides cell editor to update paste action state + var cellEditorStartEditing = this.editor.graph.cellEditor.startEditing; + + this.editor.graph.cellEditor.startEditing = function() + { + cellEditorStartEditing.apply(this, arguments); + ui.updatePasteActionStates(); + }; + + var cellEditorStopEditing = this.editor.graph.cellEditor.stopEditing; + + this.editor.graph.cellEditor.stopEditing = function(cell, trigger) + { + cellEditorStopEditing.apply(this, arguments); + ui.updatePasteActionStates(); + }; + + this.updatePasteActionStates(); +}; + +/** + * Delay between zoom steps when not using preview. + */ +EditorUi.prototype.lazyZoomDelay = 20; + +/** + * Delay before update of DOM when using preview. + */ +EditorUi.prototype.wheelZoomDelay = 400; + +/** + * Delay before update of DOM when using preview. + */ +EditorUi.prototype.buttonZoomDelay = 600; + +/** + * Initializes the infinite canvas. + */ +EditorUi.prototype.initCanvas = function() +{ + // Initial page layout view, scrollBuffer and timer-based scrolling + var graph = this.editor.graph; + graph.timerAutoScroll = true; + + /** + * Returns the padding for pages in page view with scrollbars. + */ + graph.getPagePadding = function() + { + return new mxPoint(Math.max(0, Math.round((graph.container.offsetWidth - 34) / graph.view.scale)), + Math.max(0, Math.round((graph.container.offsetHeight - 34) / graph.view.scale))); + }; + + // Fits the number of background pages to the graph + graph.view.getBackgroundPageBounds = function() + { + var layout = this.graph.getPageLayout(); + var page = this.graph.getPageSize(); + + return new mxRectangle(this.scale * (this.translate.x + layout.x * page.width), + this.scale * (this.translate.y + layout.y * page.height), + this.scale * layout.width * page.width, + this.scale * layout.height * page.height); + }; + + graph.getPreferredPageSize = function(bounds, width, height) + { + var pages = this.getPageLayout(); + var size = this.getPageSize(); + + return new mxRectangle(0, 0, pages.width * size.width, pages.height * size.height); + }; + + // Scales pages/graph to fit available size + var resize = null; + var ui = this; + + if (this.editor.isChromelessView()) + { + resize = mxUtils.bind(this, function(autoscale, maxScale, cx, cy) + { + if (graph.container != null && !graph.isViewer()) + { + cx = (cx != null) ? cx : 0; + cy = (cy != null) ? cy : 0; + + var bds = (graph.pageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds(); + var scroll = mxUtils.hasScrollbars(graph.container); + var tr = graph.view.translate; + var s = graph.view.scale; + + // Normalizes the bounds + var b = mxRectangle.fromRectangle(bds); + b.x = b.x / s - tr.x; + b.y = b.y / s - tr.y; + b.width /= s; + b.height /= s; + + var st = graph.container.scrollTop; + var sl = graph.container.scrollLeft; + var sb = (mxClient.IS_QUIRKS || document.documentMode >= 8) ? 20 : 14; + + if (document.documentMode == 8 || document.documentMode == 9) + { + sb += 3; + } + + var cw = graph.container.offsetWidth - sb; + var ch = graph.container.offsetHeight - sb; + + var ns = (autoscale) ? Math.max(0.3, Math.min(maxScale || 1, cw / b.width)) : s; + var dx = ((cw - ns * b.width) / 2) / ns; + var dy = (this.lightboxVerticalDivider == 0) ? 0 : ((ch - ns * b.height) / this.lightboxVerticalDivider) / ns; + + if (scroll) + { + dx = Math.max(dx, 0); + dy = Math.max(dy, 0); + } + + if (scroll || bds.width < cw || bds.height < ch) + { + graph.view.scaleAndTranslate(ns, Math.floor(dx - b.x), Math.floor(dy - b.y)); + graph.container.scrollTop = st * ns / s; + graph.container.scrollLeft = sl * ns / s; + } + else if (cx != 0 || cy != 0) + { + var t = graph.view.translate; + graph.view.setTranslate(Math.floor(t.x + cx / s), Math.floor(t.y + cy / s)); + } + } + }); + + // Hack to make function available to subclassers + this.chromelessResize = resize; + + // Hook for subclassers for override + this.chromelessWindowResize = mxUtils.bind(this, function() + { + this.chromelessResize(false); + }); + + // Removable resize listener + var autoscaleResize = mxUtils.bind(this, function() + { + this.chromelessWindowResize(false); + }); + + mxEvent.addListener(window, 'resize', autoscaleResize); + + this.destroyFunctions.push(function() + { + mxEvent.removeListener(window, 'resize', autoscaleResize); + }); + + this.editor.addListener('resetGraphView', mxUtils.bind(this, function() + { + this.chromelessResize(true); + })); + + this.actions.get('zoomIn').funct = mxUtils.bind(this, function(evt) + { + graph.zoomIn(); + this.chromelessResize(false); + }); + this.actions.get('zoomOut').funct = mxUtils.bind(this, function(evt) + { + graph.zoomOut(); + this.chromelessResize(false); + }); + + // Creates toolbar for viewer - do not use CSS here + // as this may be used in a viewer that has no CSS + if (urlParams['toolbar'] != '0') + { + var toolbarConfig = JSON.parse(decodeURIComponent(urlParams['toolbar-config'] || '{}')); + + this.chromelessToolbar = document.createElement('div'); + this.chromelessToolbar.style.position = 'fixed'; + this.chromelessToolbar.style.overflow = 'hidden'; + this.chromelessToolbar.style.boxSizing = 'border-box'; + this.chromelessToolbar.style.whiteSpace = 'nowrap'; + this.chromelessToolbar.style.backgroundColor = '#000000'; + this.chromelessToolbar.style.padding = '10px 10px 8px 10px'; + this.chromelessToolbar.style.left = (graph.isViewer()) ? '0' : '50%'; + + if (!mxClient.IS_VML) + { + mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'borderRadius', '20px'); + mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'transition', 'opacity 600ms ease-in-out'); + } + + var updateChromelessToolbarPosition = mxUtils.bind(this, function() + { + var css = mxUtils.getCurrentStyle(graph.container); + + if (graph.isViewer()) + { + this.chromelessToolbar.style.top = '0'; + } + else + { + this.chromelessToolbar.style.bottom = ((css != null) ? parseInt(css['margin-bottom'] || 0) : 0) + + ((this.tabContainer != null) ? (20 + parseInt(this.tabContainer.style.height)) : 20) + 'px'; + } + }); + + this.editor.addListener('resetGraphView', updateChromelessToolbarPosition); + updateChromelessToolbarPosition(); + + var btnCount = 0; + + var addButton = mxUtils.bind(this, function(fn, imgSrc, tip) + { + btnCount++; + + var a = document.createElement('span'); + a.style.paddingLeft = '8px'; + a.style.paddingRight = '8px'; + a.style.cursor = 'pointer'; + mxEvent.addListener(a, 'click', fn); + + if (tip != null) + { + a.setAttribute('title', tip); + } + + var img = document.createElement('img'); + img.setAttribute('border', '0'); + img.setAttribute('src', imgSrc); + + a.appendChild(img); + this.chromelessToolbar.appendChild(a); + + return a; + }); + + if (toolbarConfig.backBtn != null) + { + addButton(mxUtils.bind(this, function(evt) + { + window.location.href = toolbarConfig.backBtn.url; + mxEvent.consume(evt); + }), Editor.backLargeImage, mxResources.get('back', null, 'Back')); + } + + var prevButton = addButton(mxUtils.bind(this, function(evt) + { + this.actions.get('previousPage').funct(); + mxEvent.consume(evt); + }), Editor.previousLargeImage, mxResources.get('previousPage')); + + var pageInfo = document.createElement('div'); + pageInfo.style.display = 'inline-block'; + pageInfo.style.verticalAlign = 'top'; + pageInfo.style.fontFamily = 'Helvetica,Arial'; + pageInfo.style.marginTop = '8px'; + pageInfo.style.fontSize = '14px'; + pageInfo.style.color = '#ffffff'; + this.chromelessToolbar.appendChild(pageInfo); + + var nextButton = addButton(mxUtils.bind(this, function(evt) + { + this.actions.get('nextPage').funct(); + mxEvent.consume(evt); + }), Editor.nextLargeImage, mxResources.get('nextPage')); + + var updatePageInfo = mxUtils.bind(this, function() + { + if (this.pages != null && this.pages.length > 1 && this.currentPage != null) + { + pageInfo.innerHTML = ''; + mxUtils.write(pageInfo, (mxUtils.indexOf(this.pages, this.currentPage) + 1) + ' / ' + this.pages.length); + } + }); + + prevButton.style.paddingLeft = '0px'; + prevButton.style.paddingRight = '4px'; + nextButton.style.paddingLeft = '4px'; + nextButton.style.paddingRight = '0px'; + + var updatePageButtons = mxUtils.bind(this, function() + { + if (this.pages != null && this.pages.length > 1 && this.currentPage != null) + { + nextButton.style.display = ''; + prevButton.style.display = ''; + pageInfo.style.display = 'inline-block'; + } + else + { + nextButton.style.display = 'none'; + prevButton.style.display = 'none'; + pageInfo.style.display = 'none'; + } + + updatePageInfo(); + }); + + this.editor.addListener('resetGraphView', updatePageButtons); + this.editor.addListener('pageSelected', updatePageInfo); + + addButton(mxUtils.bind(this, function(evt) + { + this.actions.get('zoomOut').funct(); + mxEvent.consume(evt); + }), Editor.zoomOutLargeImage, mxResources.get('zoomOut') + ' (Alt+Mousewheel)'); + + addButton(mxUtils.bind(this, function(evt) + { + this.actions.get('zoomIn').funct(); + mxEvent.consume(evt); + }), Editor.zoomInLargeImage, mxResources.get('zoomIn') + ' (Alt+Mousewheel)'); + + addButton(mxUtils.bind(this, function(evt) + { + if (graph.isLightboxView()) + { + if (graph.view.scale == 1) + { + this.lightboxFit(); + } + else + { + graph.zoomTo(1); + } + + this.chromelessResize(false); + } + else + { + this.chromelessResize(true); + } + + mxEvent.consume(evt); + }), Editor.actualSizeLargeImage, mxResources.get('fit')); + + // Changes toolbar opacity on hover + var fadeThread = null; + var fadeThread2 = null; + + var fadeOut = mxUtils.bind(this, function(delay) + { + if (fadeThread != null) + { + window.clearTimeout(fadeThread); + fadeThead = null; + } + + if (fadeThread2 != null) + { + window.clearTimeout(fadeThread2); + fadeThead2 = null; + } + + fadeThread = window.setTimeout(mxUtils.bind(this, function() + { + mxUtils.setOpacity(this.chromelessToolbar, 0); + fadeThread = null; + + fadeThread2 = window.setTimeout(mxUtils.bind(this, function() + { + this.chromelessToolbar.style.display = 'none'; + fadeThread2 = null; + }), 600); + }), delay || 200); + }); + + var fadeIn = mxUtils.bind(this, function(opacity) + { + if (fadeThread != null) + { + window.clearTimeout(fadeThread); + fadeThead = null; + } + + if (fadeThread2 != null) + { + window.clearTimeout(fadeThread2); + fadeThead2 = null; + } + + this.chromelessToolbar.style.display = ''; + mxUtils.setOpacity(this.chromelessToolbar, opacity || 30); + }); + + if (urlParams['layers'] == '1') + { + this.layersDialog = null; + + var layersButton = addButton(mxUtils.bind(this, function(evt) + { + if (this.layersDialog != null) + { + this.layersDialog.parentNode.removeChild(this.layersDialog); + this.layersDialog = null; + } + else + { + this.layersDialog = graph.createLayersDialog(); + + mxEvent.addListener(this.layersDialog, 'mouseleave', mxUtils.bind(this, function() + { + this.layersDialog.parentNode.removeChild(this.layersDialog); + this.layersDialog = null; + })); + + var r = layersButton.getBoundingClientRect(); + + mxUtils.setPrefixedStyle(this.layersDialog.style, 'borderRadius', '5px'); + this.layersDialog.style.position = 'fixed'; + this.layersDialog.style.fontFamily = 'Helvetica,Arial'; + this.layersDialog.style.backgroundColor = '#000000'; + this.layersDialog.style.width = '160px'; + this.layersDialog.style.padding = '4px 2px 4px 2px'; + this.layersDialog.style.color = '#ffffff'; + mxUtils.setOpacity(this.layersDialog, 70); + this.layersDialog.style.left = r.left + 'px'; + this.layersDialog.style.bottom = parseInt(this.chromelessToolbar.style.bottom) + + this.chromelessToolbar.offsetHeight + 4 + 'px'; + + // Puts the dialog on top of the container z-index + var style = mxUtils.getCurrentStyle(this.editor.graph.container); + this.layersDialog.style.zIndex = style.zIndex; + + document.body.appendChild(this.layersDialog); + } + + mxEvent.consume(evt); + }), Editor.layersLargeImage, mxResources.get('layers')); + + // Shows/hides layers button depending on content + var model = graph.getModel(); + + model.addListener(mxEvent.CHANGE, function() + { + layersButton.style.display = (model.getChildCount(model.root) > 1) ? '' : 'none'; + }); + } + + this.addChromelessToolbarItems(addButton); + + if (this.editor.editButtonLink != null || this.editor.editButtonFunc != null) + { + addButton(mxUtils.bind(this, function(evt) + { + if (this.editor.editButtonFunc != null) + { + this.editor.editButtonFunc(); + } + else if (this.editor.editButtonLink == '_blank') + { + this.editor.editAsNew(this.getEditBlankXml()); + } + else + { + graph.openLink(this.editor.editButtonLink, 'editWindow'); + } + + mxEvent.consume(evt); + }), Editor.editLargeImage, mxResources.get('edit')); + } + + if (this.lightboxToolbarActions != null) + { + for (var i = 0; i < this.lightboxToolbarActions.length; i++) + { + var lbAction = this.lightboxToolbarActions[i]; + addButton(lbAction.fn, lbAction.icon, lbAction.tooltip); + } + } + + if (toolbarConfig.refreshBtn != null) + { + addButton(mxUtils.bind(this, function(evt) + { + if (toolbarConfig.refreshBtn.url) + { + window.location.href = toolbarConfig.refreshBtn.url; + } + else + { + window.location.reload(); + } + + mxEvent.consume(evt); + }), Editor.refreshLargeImage, mxResources.get('refresh', null, 'Refresh')); + } + + if (toolbarConfig.fullscreenBtn != null && window.self !== window.top) + { + addButton(mxUtils.bind(this, function(evt) + { + if (toolbarConfig.fullscreenBtn.url) + { + graph.openLink(toolbarConfig.fullscreenBtn.url); + } + else + { + graph.openLink(window.location.href); + } + + mxEvent.consume(evt); + }), Editor.fullscreenLargeImage, mxResources.get('openInNewWindow', null, 'Open in New Window')); + } + + if ((toolbarConfig.closeBtn && window.self === window.top) || + (graph.lightbox && (urlParams['close'] == '1' || this.container != document.body))) + + { + addButton(mxUtils.bind(this, function(evt) + { + if (urlParams['close'] == '1' || toolbarConfig.closeBtn) + { + window.close(); + } + else + { + this.destroy(); + mxEvent.consume(evt); + } + }), Editor.closeLargeImage, mxResources.get('close') + ' (Escape)'); + } + + // Initial state invisible + this.chromelessToolbar.style.display = 'none'; + + if (!graph.isViewer()) + { + mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'transform', 'translate(-50%,0)'); + } + + graph.container.appendChild(this.chromelessToolbar); + + mxEvent.addListener(graph.container, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', mxUtils.bind(this, function(evt) + { + if (!mxEvent.isTouchEvent(evt)) + { + if (!mxEvent.isShiftDown(evt)) + { + fadeIn(30); + } + + fadeOut(); + } + })); + + mxEvent.addListener(this.chromelessToolbar, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', function(evt) + { + mxEvent.consume(evt); + }); + + mxEvent.addListener(this.chromelessToolbar, 'mouseenter', mxUtils.bind(this, function(evt) + { + if (!mxEvent.isShiftDown(evt)) + { + fadeIn(100); + } + else + { + fadeOut(); + } + })); + + mxEvent.addListener(this.chromelessToolbar, 'mousemove', mxUtils.bind(this, function(evt) + { + if (!mxEvent.isShiftDown(evt)) + { + fadeIn(100); + } + else + { + fadeOut(); + } + + mxEvent.consume(evt); + })); + + mxEvent.addListener(this.chromelessToolbar, 'mouseleave', mxUtils.bind(this, function(evt) + { + if (!mxEvent.isTouchEvent(evt)) + { + fadeIn(30); + } + })); + + // Shows/hides toolbar for touch devices + var tol = graph.getTolerance(); + + graph.addMouseListener( + { + startX: 0, + startY: 0, + scrollLeft: 0, + scrollTop: 0, + mouseDown: function(sender, me) + { + this.startX = me.getGraphX(); + this.startY = me.getGraphY(); + this.scrollLeft = graph.container.scrollLeft; + this.scrollTop = graph.container.scrollTop; + }, + mouseMove: function(sender, me) {}, + mouseUp: function(sender, me) + { + if (mxEvent.isTouchEvent(me.getEvent())) + { + if ((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && + Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && + (Math.abs(this.startX - me.getGraphX()) < tol && + Math.abs(this.startY - me.getGraphY()) < tol)) + { + if (parseFloat(ui.chromelessToolbar.style.opacity || 0) > 0) + { + fadeOut(); + } + else + { + fadeIn(30); + } + } + } + } + }); + } // end if toolbar + + // Installs handling of highlight and handling links to relative links and anchors + if (!this.editor.editable) + { + this.addChromelessClickHandler(); + } + } + else if (this.editor.extendCanvas) + { + /** + * Guesses autoTranslate to avoid another repaint (see below). + * Works if only the scale of the graph changes or if pages + * are visible and the visible pages do not change. + */ + var graphViewValidate = graph.view.validate; + graph.view.validate = function() + { + if (this.graph.container != null && mxUtils.hasScrollbars(this.graph.container)) + { + var pad = this.graph.getPagePadding(); + var size = this.graph.getPageSize(); + + // Updating scrollbars here causes flickering in quirks and is not needed + // if zoom method is always used to set the current scale on the graph. + var tx = this.translate.x; + var ty = this.translate.y; + this.translate.x = pad.x - (this.x0 || 0) * size.width; + this.translate.y = pad.y - (this.y0 || 0) * size.height; + } + + graphViewValidate.apply(this, arguments); + }; + + if (!graph.isViewer()) + { + var graphSizeDidChange = graph.sizeDidChange; + + graph.sizeDidChange = function() + { + if (this.container != null && mxUtils.hasScrollbars(this.container)) + { + var pages = this.getPageLayout(); + var pad = this.getPagePadding(); + var size = this.getPageSize(); + + // Updates the minimum graph size + var minw = Math.ceil(2 * pad.x + pages.width * size.width); + var minh = Math.ceil(2 * pad.y + pages.height * size.height); + + var min = graph.minimumGraphSize; + + // LATER: Fix flicker of scrollbar size in IE quirks mode + // after delayed call in window.resize event handler + if (min == null || min.width != minw || min.height != minh) + { + graph.minimumGraphSize = new mxRectangle(0, 0, minw, minh); + } + + // Updates auto-translate to include padding and graph size + var dx = pad.x - pages.x * size.width; + var dy = pad.y - pages.y * size.height; + + if (!this.autoTranslate && (this.view.translate.x != dx || this.view.translate.y != dy)) + { + this.autoTranslate = true; + this.view.x0 = pages.x; + this.view.y0 = pages.y; + + // NOTE: THIS INVOKES THIS METHOD AGAIN. UNFORTUNATELY THERE IS NO WAY AROUND THIS SINCE THE + // BOUNDS ARE KNOWN AFTER THE VALIDATION AND SETTING THE TRANSLATE TRIGGERS A REVALIDATION. + // SHOULD MOVE TRANSLATE/SCALE TO VIEW. + var tx = graph.view.translate.x; + var ty = graph.view.translate.y; + graph.view.setTranslate(dx, dy); + + // LATER: Fix rounding errors for small zoom + graph.container.scrollLeft += Math.round((dx - tx) * graph.view.scale); + graph.container.scrollTop += Math.round((dy - ty) * graph.view.scale); + + this.autoTranslate = false; + + return; + } + + graphSizeDidChange.apply(this, arguments); + } + else + { + // Fires event but does not invoke superclass + this.fireEvent(new mxEventObject(mxEvent.SIZE, 'bounds', this.getGraphBounds())); + } + }; + } + } + + // Accumulates the zoom factor while the rendering is taking place + // so that not the complete sequence of zoom steps must be painted + var bgGroup = graph.view.getBackgroundPane(); + var mainGroup = graph.view.getDrawPane(); + graph.cumulativeZoomFactor = 1; + var updateZoomTimeout = null; + var cursorPosition = null; + var scrollPosition = null; + var filter = null; + + var scheduleZoom = function(delay) + { + if (updateZoomTimeout != null) + { + window.clearTimeout(updateZoomTimeout); + } + + window.setTimeout(function() + { + if (!graph.isMouseDown) + { + updateZoomTimeout = window.setTimeout(mxUtils.bind(this, function() + { + if (graph.isFastZoomEnabled()) + { + // Transforms background page + if (graph.view.backgroundPageShape != null && graph.view.backgroundPageShape.node != null) + { + mxUtils.setPrefixedStyle(graph.view.backgroundPageShape.node.style, 'transform-origin', null); + mxUtils.setPrefixedStyle(graph.view.backgroundPageShape.node.style, 'transform', null); + } + + // Transforms graph and background image + mainGroup.style.transformOrigin = ''; + bgGroup.style.transformOrigin = ''; + + // Workaround for no reset of transform in Safari + if (mxClient.IS_SF) + { + mainGroup.style.transform = 'scale(1)'; + bgGroup.style.transform = 'scale(1)'; + + window.setTimeout(function() + { + mainGroup.style.transform = ''; + bgGroup.style.transform = ''; + }, 0) + } + else + { + mainGroup.style.transform = ''; + bgGroup.style.transform = ''; + } + + // Shows interactive elements + graph.view.getDecoratorPane().style.opacity = ''; + graph.view.getOverlayPane().style.opacity = ''; + } + + var sp = new mxPoint(graph.container.scrollLeft, graph.container.scrollTop); + var offset = mxUtils.getOffset(graph.container); + var prev = graph.view.scale; + var dx = 0; + var dy = 0; + + if (cursorPosition != null) + { + dx = graph.container.offsetWidth / 2 - cursorPosition.x + offset.x; + dy = graph.container.offsetHeight / 2 - cursorPosition.y + offset.y; + } + + graph.zoom(graph.cumulativeZoomFactor); + var s = graph.view.scale; + + if (s != prev) + { + if (scrollPosition != null) + { + dx += sp.x - scrollPosition.x; + dy += sp.y - scrollPosition.y; + } + + if (resize != null) + { + ui.chromelessResize(false, null, dx * (graph.cumulativeZoomFactor - 1), + dy * (graph.cumulativeZoomFactor - 1)); + } + + if (mxUtils.hasScrollbars(graph.container) && (dx != 0 || dy != 0)) + { + graph.container.scrollLeft -= dx * (graph.cumulativeZoomFactor - 1); + graph.container.scrollTop -= dy * (graph.cumulativeZoomFactor - 1); + } + } + + if (filter != null) + { + mainGroup.setAttribute('filter', filter); + } + + graph.cumulativeZoomFactor = 1; + updateZoomTimeout = null; + scrollPosition = null; + cursorPosition = null; + filter = null; + }), (delay != null) ? delay : ((graph.isFastZoomEnabled()) ? ui.wheelZoomDelay : ui.lazyZoomDelay)); + } + }, 0); + }; + + graph.lazyZoom = function(zoomIn, ignoreCursorPosition, delay) + { + // TODO: Fix ignored cursor position if scrollbars are disabled + ignoreCursorPosition = ignoreCursorPosition || !graph.scrollbars; + + if (ignoreCursorPosition) + { + cursorPosition = new mxPoint( + graph.container.offsetLeft + graph.container.clientWidth / 2, + graph.container.offsetTop + graph.container.clientHeight / 2); + } + + // Switches to 5% zoom steps below 15% + if (zoomIn) + { + if (this.view.scale * this.cumulativeZoomFactor <= 0.15) + { + this.cumulativeZoomFactor *= (this.view.scale + 0.05) / this.view.scale; + } + else + { + // Uses to 5% zoom steps for better grid rendering in webkit + // and to avoid rounding errors for zoom steps + this.cumulativeZoomFactor *= this.zoomFactor; + this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 20) / 20 / this.view.scale; + } + } + else + { + if (this.view.scale * this.cumulativeZoomFactor <= 0.15) + { + this.cumulativeZoomFactor *= (this.view.scale - 0.05) / this.view.scale; + } + else + { + // Uses to 5% zoom steps for better grid rendering in webkit + // and to avoid rounding errors for zoom steps + this.cumulativeZoomFactor /= this.zoomFactor; + this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 20) / 20 / this.view.scale; + } + } + + this.cumulativeZoomFactor = Math.max(0.05, Math.min(this.view.scale * this.cumulativeZoomFactor, 160)) / this.view.scale; + + if (graph.isFastZoomEnabled()) + { + if (filter == null && mainGroup.getAttribute('filter') != '') + { + filter = mainGroup.getAttribute('filter'); + mainGroup.removeAttribute('filter'); + } + + scrollPosition = new mxPoint(graph.container.scrollLeft, graph.container.scrollTop); + + var cx = (ignoreCursorPosition) ? graph.container.scrollLeft + graph.container.clientWidth / 2 : + cursorPosition.x + graph.container.scrollLeft - graph.container.offsetLeft; + var cy = (ignoreCursorPosition) ? graph.container.scrollTop + graph.container.clientHeight / 2 : + cursorPosition.y + graph.container.scrollTop - graph.container.offsetTop; + mainGroup.style.transformOrigin = cx + 'px ' + cy + 'px'; + mainGroup.style.transform = 'scale(' + this.cumulativeZoomFactor + ')'; + bgGroup.style.transformOrigin = cx + 'px ' + cy + 'px'; + bgGroup.style.transform = 'scale(' + this.cumulativeZoomFactor + ')'; + + if (graph.view.backgroundPageShape != null && graph.view.backgroundPageShape.node != null) + { + var page = graph.view.backgroundPageShape.node; + + mxUtils.setPrefixedStyle(page.style, 'transform-origin', + ((ignoreCursorPosition) ? ((graph.container.clientWidth / 2 + graph.container.scrollLeft - + page.offsetLeft) + 'px') : ((cursorPosition.x + graph.container.scrollLeft - + page.offsetLeft - graph.container.offsetLeft) + 'px')) + ' ' + + ((ignoreCursorPosition) ? ((graph.container.clientHeight / 2 + graph.container.scrollTop - + page.offsetTop) + 'px') : ((cursorPosition.y + graph.container.scrollTop - + page.offsetTop - graph.container.offsetTop) + 'px'))); + mxUtils.setPrefixedStyle(page.style, 'transform', + 'scale(' + this.cumulativeZoomFactor + ')'); + } + + graph.view.getDecoratorPane().style.opacity = '0'; + graph.view.getOverlayPane().style.opacity = '0'; + + if (ui.hoverIcons != null) + { + ui.hoverIcons.reset(); + } + } + + scheduleZoom(delay); + }; + + // Holds back repaint until after mouse gestures + mxEvent.addGestureListeners(graph.container, function(evt) + { + if (updateZoomTimeout != null) + { + window.clearTimeout(updateZoomTimeout); + } + }, null, function(evt) + { + if (graph.cumulativeZoomFactor != 1) + { + scheduleZoom(0); + } + }); + + // Holds back repaint until scroll ends + mxEvent.addListener(graph.container, 'scroll', function() + { + if (updateZoomTimeout && !graph.isMouseDown && graph.cumulativeZoomFactor != 1) + { + scheduleZoom(0); + } + }); + + mxEvent.addMouseWheelListener(mxUtils.bind(this, function(evt, up, force) + { + if (this.dialogs == null || this.dialogs.length == 0) + { + // Scrolls with scrollbars turned off + if (!graph.scrollbars && graph.isScrollWheelEvent(evt)) + { + var t = graph.view.getTranslate(); + var step = 40 / graph.view.scale; + + if (!mxEvent.isShiftDown(evt)) + { + graph.view.setTranslate(t.x, t.y + ((up) ? step : -step)); + } + else + { + graph.view.setTranslate(t.x + ((up) ? -step : step), t.y); + } + } + else if (force || graph.isZoomWheelEvent(evt)) + { + var source = mxEvent.getSource(evt); + + while (source != null) + { + if (source == graph.container) + { + graph.tooltipHandler.hideTooltip(); + cursorPosition = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + graph.lazyZoom(up); + mxEvent.consume(evt); + + return false; + } + + source = source.parentNode; + } + } + } + }), graph.container); + + // Uses fast zoom for pinch gestures on iOS + graph.panningHandler.zoomGraph = function(evt) + { + graph.cumulativeZoomFactor = evt.scale; + graph.lazyZoom(evt.scale > 0, true); + mxEvent.consume(evt); + }; +}; + +/** + * Creates a temporary graph instance for rendering off-screen content. + */ +EditorUi.prototype.addChromelessToolbarItems = function(addButton) +{ + addButton(mxUtils.bind(this, function(evt) + { + this.actions.get('print').funct(); + mxEvent.consume(evt); + }), Editor.printLargeImage, mxResources.get('print')); +}; + +/** + * Creates a temporary graph instance for rendering off-screen content. + */ +EditorUi.prototype.createTemporaryGraph = function(stylesheet) +{ + var graph = new Graph(document.createElement('div'), null, null, stylesheet); + graph.resetViewOnRootChange = false; + graph.setConnectable(false); + graph.gridEnabled = false; + graph.autoScroll = false; + graph.setTooltips(false); + graph.setEnabled(false); + + // Container must be in the DOM for correct HTML rendering + graph.container.style.visibility = 'hidden'; + graph.container.style.position = 'absolute'; + graph.container.style.overflow = 'hidden'; + graph.container.style.height = '1px'; + graph.container.style.width = '1px'; + + return graph; +}; + +/** + * + */ +EditorUi.prototype.addChromelessClickHandler = function() +{ + var hl = urlParams['highlight']; + + // Adds leading # for highlight color code + if (hl != null && hl.length > 0) + { + hl = '#' + hl; + } + + this.editor.graph.addClickHandler(hl); +}; + +/** + * + */ +EditorUi.prototype.toggleFormatPanel = function(forceHide) +{ + if (this.format != null) + { + this.formatWidth = (forceHide || this.formatWidth > 0) ? 0 : 240; + this.formatContainer.style.display = (forceHide || this.formatWidth > 0) ? '' : 'none'; + this.refresh(); + this.format.refresh(); + this.fireEvent(new mxEventObject('formatWidthChanged')); + } +}; + +/** + * Adds support for placeholders in labels. + */ +EditorUi.prototype.lightboxFit = function(maxHeight) +{ + if (this.isDiagramEmpty()) + { + this.editor.graph.view.setScale(1); + } + else + { + var p = urlParams['border']; + var border = 60; + + if (p != null) + { + border = parseInt(p); + } + + // LATER: Use initial graph bounds to avoid rounding errors + this.editor.graph.maxFitScale = this.lightboxMaxFitScale; + this.editor.graph.fit(border, null, null, null, null, null, maxHeight); + this.editor.graph.maxFitScale = null; + } +}; + +/** + * Translates this point by the given vector. + * + * @param {number} dx X-coordinate of the translation. + * @param {number} dy Y-coordinate of the translation. + */ +EditorUi.prototype.isDiagramEmpty = function() +{ + var model = this.editor.graph.getModel(); + + return model.getChildCount(model.root) == 1 && model.getChildCount(model.getChildAt(model.root, 0)) == 0; +}; + +/** + * Hook for allowing selection and context menu for certain events. + */ +EditorUi.prototype.isSelectionAllowed = function(evt) +{ + return mxEvent.getSource(evt).nodeName == 'SELECT' || (mxEvent.getSource(evt).nodeName == 'INPUT' && + mxUtils.isAncestorNode(this.formatContainer, mxEvent.getSource(evt))); +}; + +/** + * Installs dialog if browser window is closed without saving + * This must be disabled during save and image export. + */ +EditorUi.prototype.addBeforeUnloadListener = function() +{ + // Installs dialog if browser window is closed without saving + // This must be disabled during save and image export + window.onbeforeunload = mxUtils.bind(this, function() + { + if (!this.editor.isChromelessView()) + { + //return this.onBeforeUnload(); + } + }); +}; + +/** + * Sets the onbeforeunload for the application + */ +EditorUi.prototype.onBeforeUnload = function() +{ + if (this.editor.modified) + { + return mxResources.get('allChangesLost'); + } +}; + +/** + * Opens the current diagram via the window.opener if one exists. + */ +EditorUi.prototype.open = function() +{ + // Cross-domain window access is not allowed in FF, so if we + // were opened from another domain then this will fail. + try + { + if (window.opener != null && window.opener.openFile != null) + { + window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml, filename) + { + try + { + var doc = mxUtils.parseXml(xml); + this.editor.setGraphXml(doc.documentElement); + this.editor.setModified(false); + this.editor.undoManager.clear(); + + if (filename != null) + { + this.editor.setFilename(filename); + this.updateDocumentTitle(); + } + + return; + } + catch (e) + { + mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message); + } + })); + } + } + catch(e) + { + // ignore + } + + // Fires as the last step if no file was loaded + this.editor.graph.view.validate(); + + // Required only in special cases where an initial file is opened + // and the minimumGraphSize changes and CSS must be updated. + this.editor.graph.sizeDidChange(); + this.editor.fireEvent(new mxEventObject('resetGraphView')); +}; + +/** + * Sets the current menu and element. + */ +EditorUi.prototype.setCurrentMenu = function(menu, elt) +{ + this.currentMenuElt = elt; + this.currentMenu = menu; +}; + +/** + * Resets the current menu and element. + */ +EditorUi.prototype.resetCurrentMenu = function() +{ + this.currentMenuElt = null; + this.currentMenu = null; +}; + +/** + * Hides and destroys the current menu. + */ +EditorUi.prototype.hideCurrentMenu = function() +{ + if (this.currentMenu != null) + { + this.currentMenu.hideMenu(); + this.resetCurrentMenu(); + } +}; + +/** + * Updates the document title. + */ +EditorUi.prototype.updateDocumentTitle = function() +{ + var title = this.editor.getOrCreateFilename(); + + if (this.editor.appName != null) + { + title += ' - ' + this.editor.appName; + } + + document.title = title; +}; + +/** + * Updates the document title. + */ +EditorUi.prototype.createHoverIcons = function() +{ + return new HoverIcons(this.editor.graph); +}; + +/** + * Returns the URL for a copy of this editor with no state. + */ +EditorUi.prototype.redo = function() +{ + try + { + var graph = this.editor.graph; + + if (graph.isEditing()) + { + document.execCommand('redo', false, null); + } + else + { + this.editor.undoManager.redo(); + } + } + catch (e) + { + // ignore all errors + } +}; + +/** + * Returns the URL for a copy of this editor with no state. + */ +EditorUi.prototype.undo = function() +{ + try + { + var graph = this.editor.graph; + + if (graph.isEditing()) + { + // Stops editing and executes undo on graph if native undo + // does not affect current editing value + var value = graph.cellEditor.textarea.innerHTML; + document.execCommand('undo', false, null); + + if (value == graph.cellEditor.textarea.innerHTML) + { + graph.stopEditing(true); + this.editor.undoManager.undo(); + } + } + else + { + this.editor.undoManager.undo(); + } + } + catch (e) + { + // ignore all errors + } +}; + +/** + * Returns the URL for a copy of this editor with no state. + */ +EditorUi.prototype.canRedo = function() +{ + return this.editor.graph.isEditing() || this.editor.undoManager.canRedo(); +}; + +/** + * Returns the URL for a copy of this editor with no state. + */ +EditorUi.prototype.canUndo = function() +{ + return this.editor.graph.isEditing() || this.editor.undoManager.canUndo(); +}; + +/** + * + */ +EditorUi.prototype.getEditBlankXml = function() +{ + return mxUtils.getXml(this.editor.getGraphXml()); +}; + +/** + * Returns the URL for a copy of this editor with no state. + */ +EditorUi.prototype.getUrl = function(pathname) +{ + var href = (pathname != null) ? pathname : window.location.pathname; + var parms = (href.indexOf('?') > 0) ? 1 : 0; + + // Removes template URL parameter for new blank diagram + for (var key in urlParams) + { + if (parms == 0) + { + href += '?'; + } + else + { + href += '&'; + } + + href += key + '=' + urlParams[key]; + parms++; + } + + return href; +}; + +/** + * Specifies if the graph has scrollbars. + */ +EditorUi.prototype.setScrollbars = function(value) +{ + var graph = this.editor.graph; + var prev = graph.container.style.overflow; + graph.scrollbars = value; + this.editor.updateGraphComponents(); + + if (prev != graph.container.style.overflow) + { + graph.container.scrollTop = 0; + graph.container.scrollLeft = 0; + graph.view.scaleAndTranslate(1, 0, 0); + this.resetScrollbars(); + } + + this.fireEvent(new mxEventObject('scrollbarsChanged')); +}; + +/** + * Returns true if the graph has scrollbars. + */ +EditorUi.prototype.hasScrollbars = function() +{ + return this.editor.graph.scrollbars; +}; + +/** + * Resets the state of the scrollbars. + */ +EditorUi.prototype.resetScrollbars = function() +{ + var graph = this.editor.graph; + + if (!this.editor.extendCanvas) + { + graph.container.scrollTop = 0; + graph.container.scrollLeft = 0; + + if (!mxUtils.hasScrollbars(graph.container)) + { + graph.view.setTranslate(0, 0); + } + } + else if (!this.editor.isChromelessView()) + { + if (mxUtils.hasScrollbars(graph.container)) + { + if (graph.pageVisible) + { + var pad = graph.getPagePadding(); + graph.container.scrollTop = Math.floor(pad.y - this.editor.initialTopSpacing) - 1; + graph.container.scrollLeft = Math.floor(Math.min(pad.x, + (graph.container.scrollWidth - graph.container.clientWidth) / 2)) - 1; + + // Scrolls graph to visible area + var bounds = graph.getGraphBounds(); + + if (bounds.width > 0 && bounds.height > 0) + { + if (bounds.x > graph.container.scrollLeft + graph.container.clientWidth * 0.9) + { + graph.container.scrollLeft = Math.min(bounds.x + bounds.width - graph.container.clientWidth, bounds.x - 10); + } + + if (bounds.y > graph.container.scrollTop + graph.container.clientHeight * 0.9) + { + graph.container.scrollTop = Math.min(bounds.y + bounds.height - graph.container.clientHeight, bounds.y - 10); + } + } + } + else + { + var bounds = graph.getGraphBounds(); + var width = Math.max(bounds.width, graph.scrollTileSize.width * graph.view.scale); + var height = Math.max(bounds.height, graph.scrollTileSize.height * graph.view.scale); + graph.container.scrollTop = Math.floor(Math.max(0, bounds.y - Math.max(20, (graph.container.clientHeight - height) / 4))); + graph.container.scrollLeft = Math.floor(Math.max(0, bounds.x - Math.max(0, (graph.container.clientWidth - width) / 2))); + } + } + else + { + var b = mxRectangle.fromRectangle((graph.pageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds()) + var tr = graph.view.translate; + var s = graph.view.scale; + b.x = b.x / s - tr.x; + b.y = b.y / s - tr.y; + b.width /= s; + b.height /= s; + + var dy = (graph.pageVisible) ? 0 : Math.max(0, (graph.container.clientHeight - b.height) / 4); + + graph.view.setTranslate(Math.floor(Math.max(0, + (graph.container.clientWidth - b.width) / 2) - b.x + 2), + Math.floor(dy - b.y + 1)); + } + } +}; + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setPageVisible = function(value) +{ + var graph = this.editor.graph; + var hasScrollbars = mxUtils.hasScrollbars(graph.container); + var tx = 0; + var ty = 0; + + if (hasScrollbars) + { + tx = graph.view.translate.x * graph.view.scale - graph.container.scrollLeft; + ty = graph.view.translate.y * graph.view.scale - graph.container.scrollTop; + } + + graph.pageVisible = value; + graph.pageBreaksVisible = value; + graph.preferPageSize = value; + graph.view.validateBackground(); + + // Workaround for possible handle offset + if (hasScrollbars) + { + var cells = graph.getSelectionCells(); + graph.clearSelection(); + graph.setSelectionCells(cells); + } + + // Calls updatePageBreaks + graph.sizeDidChange(); + + if (hasScrollbars) + { + graph.container.scrollLeft = graph.view.translate.x * graph.view.scale - tx; + graph.container.scrollTop = graph.view.translate.y * graph.view.scale - ty; + } + + this.fireEvent(new mxEventObject('pageViewChanged')); +}; + +/** + * Change types + */ +function ChangePageSetup(ui, color, image, format, pageScale) +{ + this.ui = ui; + this.color = color; + this.previousColor = color; + this.image = image; + this.previousImage = image; + this.format = format; + this.previousFormat = format; + this.pageScale = pageScale; + this.previousPageScale = pageScale; + + // Needed since null are valid values for color and image + this.ignoreColor = false; + this.ignoreImage = false; +} + +/** + * Implementation of the undoable page rename. + */ +ChangePageSetup.prototype.execute = function() +{ + var graph = this.ui.editor.graph; + + if (!this.ignoreColor) + { + this.color = this.previousColor; + var tmp = graph.background; + this.ui.setBackgroundColor(this.previousColor); + this.previousColor = tmp; + } + + if (!this.ignoreImage) + { + this.image = this.previousImage; + var tmp = graph.backgroundImage; + this.ui.setBackgroundImage(this.previousImage); + this.previousImage = tmp; + } + + if (this.previousFormat != null) + { + this.format = this.previousFormat; + var tmp = graph.pageFormat; + + if (this.previousFormat.width != tmp.width || + this.previousFormat.height != tmp.height) + { + this.ui.setPageFormat(this.previousFormat); + this.previousFormat = tmp; + } + } + + if (this.foldingEnabled != null && this.foldingEnabled != this.ui.editor.graph.foldingEnabled) + { + this.ui.setFoldingEnabled(this.foldingEnabled); + this.foldingEnabled = !this.foldingEnabled; + } + + if (this.previousPageScale != null) + { + var currentPageScale = this.ui.editor.graph.pageScale; + + if (this.previousPageScale != currentPageScale) + { + this.ui.setPageScale(this.previousPageScale); + this.previousPageScale = currentPageScale; + } + } +}; + +// Registers codec for ChangePageSetup +(function() +{ + var codec = new mxObjectCodec(new ChangePageSetup(), ['ui', 'previousColor', 'previousImage', 'previousFormat', 'previousPageScale']); + + codec.afterDecode = function(dec, node, obj) + { + obj.previousColor = obj.color; + obj.previousImage = obj.image; + obj.previousFormat = obj.format; + obj.previousPageScale = obj.pageScale; + + if (obj.foldingEnabled != null) + { + obj.foldingEnabled = !obj.foldingEnabled; + } + + return obj; + }; + + mxCodecRegistry.register(codec); +})(); + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setBackgroundColor = function(value) +{ + this.editor.graph.background = value; + this.editor.graph.view.validateBackground(); + + this.fireEvent(new mxEventObject('backgroundColorChanged')); +}; + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setFoldingEnabled = function(value) +{ + this.editor.graph.foldingEnabled = value; + this.editor.graph.view.revalidate(); + + this.fireEvent(new mxEventObject('foldingEnabledChanged')); +}; + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setPageFormat = function(value) +{ + this.editor.graph.pageFormat = value; + + if (!this.editor.graph.pageVisible) + { + this.actions.get('pageView').funct(); + } + else + { + this.editor.graph.view.validateBackground(); + this.editor.graph.sizeDidChange(); + } + + this.fireEvent(new mxEventObject('pageFormatChanged')); +}; + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setPageScale = function(value) +{ + this.editor.graph.pageScale = value; + + if (!this.editor.graph.pageVisible) + { + this.actions.get('pageView').funct(); + } + else + { + this.editor.graph.view.validateBackground(); + this.editor.graph.sizeDidChange(); + } + + this.fireEvent(new mxEventObject('pageScaleChanged')); +}; + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setGridColor = function(value) +{ + this.editor.graph.view.gridColor = value; + this.editor.graph.view.validateBackground(); + this.fireEvent(new mxEventObject('gridColorChanged')); +}; + +/** + * Updates the states of the given undo/redo items. + */ +EditorUi.prototype.addUndoListener = function() +{ + var undo = this.actions.get('undo'); + var redo = this.actions.get('redo'); + + var undoMgr = this.editor.undoManager; + + var undoListener = mxUtils.bind(this, function() + { + undo.setEnabled(this.canUndo()); + redo.setEnabled(this.canRedo()); + }); + + undoMgr.addListener(mxEvent.ADD, undoListener); + undoMgr.addListener(mxEvent.UNDO, undoListener); + undoMgr.addListener(mxEvent.REDO, undoListener); + undoMgr.addListener(mxEvent.CLEAR, undoListener); + + // Overrides cell editor to update action states + var cellEditorStartEditing = this.editor.graph.cellEditor.startEditing; + + this.editor.graph.cellEditor.startEditing = function() + { + cellEditorStartEditing.apply(this, arguments); + undoListener(); + }; + + var cellEditorStopEditing = this.editor.graph.cellEditor.stopEditing; + + this.editor.graph.cellEditor.stopEditing = function(cell, trigger) + { + cellEditorStopEditing.apply(this, arguments); + undoListener(); + }; + + // Updates the button states once + undoListener(); +}; + +/** +* Updates the states of the given toolbar items based on the selection. +*/ +EditorUi.prototype.updateActionStates = function() +{ + var graph = this.editor.graph; + var selected = !graph.isSelectionEmpty(); + var vertexSelected = false; + var edgeSelected = false; + + var cells = graph.getSelectionCells(); + + if (cells != null) + { + for (var i = 0; i < cells.length; i++) + { + var cell = cells[i]; + + if (graph.getModel().isEdge(cell)) + { + edgeSelected = true; + } + + if (graph.getModel().isVertex(cell)) + { + vertexSelected = true; + } + + if (edgeSelected && vertexSelected) + { + break; + } + } + } + + // Updates action states + var actions = ['cut', 'copy', 'bold', 'italic', 'underline', 'delete', 'duplicate', + 'editStyle', 'editTooltip', 'editLink', 'backgroundColor', 'borderColor', + 'edit', 'toFront', 'toBack', 'lockUnlock', 'solid', 'dashed', 'pasteSize', + 'dotted', 'fillColor', 'gradientColor', 'shadow', 'fontColor', + 'formattedText', 'rounded', 'toggleRounded', 'sharp', 'strokeColor']; + + for (var i = 0; i < actions.length; i++) + { + this.actions.get(actions[i]).setEnabled(selected); + } + + this.actions.get('setAsDefaultStyle').setEnabled(graph.getSelectionCount() == 1); + this.actions.get('clearWaypoints').setEnabled(!graph.isSelectionEmpty()); + this.actions.get('copySize').setEnabled(graph.getSelectionCount() == 1); + this.actions.get('turn').setEnabled(!graph.isSelectionEmpty()); + this.actions.get('curved').setEnabled(edgeSelected); + this.actions.get('rotation').setEnabled(vertexSelected); + this.actions.get('wordWrap').setEnabled(vertexSelected); + this.actions.get('autosize').setEnabled(vertexSelected); + var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1; + this.actions.get('group').setEnabled(graph.getSelectionCount() > 1 || + (oneVertexSelected && !graph.isContainer(graph.getSelectionCell()))); + this.actions.get('ungroup').setEnabled(graph.getSelectionCount() == 1 && + (graph.getModel().getChildCount(graph.getSelectionCell()) > 0 || + (oneVertexSelected && graph.isContainer(graph.getSelectionCell())))); + this.actions.get('removeFromGroup').setEnabled(oneVertexSelected && + graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell()))); + + // Updates menu states + var state = graph.view.getState(graph.getSelectionCell()); + this.menus.get('navigation').setEnabled(selected || graph.view.currentRoot != null); + this.actions.get('collapsible').setEnabled(vertexSelected && + (graph.isContainer(graph.getSelectionCell()) || graph.model.getChildCount(graph.getSelectionCell()) > 0)); + this.actions.get('home').setEnabled(graph.view.currentRoot != null); + this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null); + this.actions.get('enterGroup').setEnabled(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell())); + var foldable = graph.getSelectionCount() == 1 && graph.isCellFoldable(graph.getSelectionCell()); + this.actions.get('expand').setEnabled(foldable); + this.actions.get('collapse').setEnabled(foldable); + this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1); + this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 && + graph.getLinkForCell(graph.getSelectionCell()) != null); + this.actions.get('guides').setEnabled(graph.isEnabled()); + this.actions.get('grid').setEnabled(!this.editor.chromeless || this.editor.editable); + + var unlocked = graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()); + this.menus.get('layout').setEnabled(unlocked); + this.menus.get('insert').setEnabled(unlocked); + this.menus.get('direction').setEnabled(unlocked && vertexSelected); + this.menus.get('align').setEnabled(unlocked && vertexSelected && graph.getSelectionCount() > 1); + this.menus.get('distribute').setEnabled(unlocked && vertexSelected && graph.getSelectionCount() > 1); + this.actions.get('selectVertices').setEnabled(unlocked); + this.actions.get('selectEdges').setEnabled(unlocked); + this.actions.get('selectAll').setEnabled(unlocked); + this.actions.get('selectNone').setEnabled(unlocked); + + this.updatePasteActionStates(); +}; + +EditorUi.prototype.zeroOffset = new mxPoint(0, 0); + +EditorUi.prototype.getDiagramContainerOffset = function() +{ + return this.zeroOffset; +}; + +/** + * Refreshes the viewport. + */ +EditorUi.prototype.refresh = function(sizeDidChange) +{ + sizeDidChange = (sizeDidChange != null) ? sizeDidChange : true; + + var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode == 5); + var w = this.container.clientWidth; + var h = this.container.clientHeight; + + if (this.container == document.body) + { + w = document.body.clientWidth || document.documentElement.clientWidth; + h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight : document.documentElement.clientHeight; + } + + // Workaround for bug on iOS see + // http://stackoverflow.com/questions/19012135/ios-7-ipad-safari-landscape-innerheight-outerheight-layout-issue + // FIXME: Fix if footer visible + var off = 0; + + if (mxClient.IS_IOS && !window.navigator.standalone) + { + if (window.innerHeight != document.documentElement.clientHeight) + { + off = document.documentElement.clientHeight - window.innerHeight; + window.scrollTo(0, 0); + } + } + + var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize - 20)); + var tmp = 0; + + if (this.menubar != null) + { + this.menubarContainer.style.height = this.menubarHeight + 'px'; + tmp += this.menubarHeight; + } + + if (this.toolbar != null) + { + this.toolbarContainer.style.top = this.menubarHeight + 'px'; + this.toolbarContainer.style.height = this.toolbarHeight + 'px'; + tmp += this.toolbarHeight; + } + + if (tmp > 0 && !mxClient.IS_QUIRKS) + { + tmp += 1; + } + + var sidebarFooterHeight = 0; + + if (this.sidebarFooterContainer != null) + { + var bottom = this.footerHeight + off; + sidebarFooterHeight = Math.max(0, Math.min(h - tmp - bottom, this.sidebarFooterHeight)); + this.sidebarFooterContainer.style.width = effHsplitPosition + 'px'; + this.sidebarFooterContainer.style.height = sidebarFooterHeight + 'px'; + this.sidebarFooterContainer.style.bottom = bottom + 'px'; + } + + var fw = (this.format != null) ? this.formatWidth : 0; + this.sidebarContainer.style.top = tmp + 'px'; + this.sidebarContainer.style.width = effHsplitPosition + 'px'; + this.formatContainer.style.top = tmp + 'px'; + this.formatContainer.style.width = fw + 'px'; + this.formatContainer.style.display = (this.format != null) ? '' : 'none'; + + var diagContOffset = this.getDiagramContainerOffset(); + var contLeft = (this.hsplit.parentNode != null) ? (effHsplitPosition + this.splitSize) : 0; + this.diagramContainer.style.left = (contLeft + diagContOffset.x) + 'px'; + this.diagramContainer.style.top = (tmp + diagContOffset.y) + 'px'; + this.footerContainer.style.height = this.footerHeight + 'px'; + this.hsplit.style.top = this.sidebarContainer.style.top; + this.hsplit.style.bottom = (this.footerHeight + off) + 'px'; + this.hsplit.style.left = effHsplitPosition + 'px'; + this.footerContainer.style.display = (this.footerHeight == 0) ? 'none' : ''; + + if (this.tabContainer != null) + { + this.tabContainer.style.left = contLeft + 'px'; + } + + if (quirks) + { + this.menubarContainer.style.width = w + 'px'; + this.toolbarContainer.style.width = this.menubarContainer.style.width; + var sidebarHeight = Math.max(0, h - this.footerHeight - this.menubarHeight - this.toolbarHeight); + this.sidebarContainer.style.height = (sidebarHeight - sidebarFooterHeight) + 'px'; + this.formatContainer.style.height = sidebarHeight + 'px'; + this.diagramContainer.style.width = (this.hsplit.parentNode != null) ? Math.max(0, w - effHsplitPosition - this.splitSize - fw) + 'px' : w + 'px'; + this.footerContainer.style.width = this.menubarContainer.style.width; + var diagramHeight = Math.max(0, h - this.footerHeight - this.menubarHeight - this.toolbarHeight); + + if (this.tabContainer != null) + { + this.tabContainer.style.width = this.diagramContainer.style.width; + this.tabContainer.style.bottom = (this.footerHeight + off) + 'px'; + diagramHeight -= this.tabContainer.clientHeight; + } + + this.diagramContainer.style.height = diagramHeight + 'px'; + this.hsplit.style.height = diagramHeight + 'px'; + } + else + { + if (this.footerHeight > 0) + { + this.footerContainer.style.bottom = off + 'px'; + } + + this.diagramContainer.style.right = fw + 'px'; + var th = 0; + + if (this.tabContainer != null) + { + this.tabContainer.style.bottom = (this.footerHeight + off) + 'px'; + this.tabContainer.style.right = this.diagramContainer.style.right; + th = this.tabContainer.clientHeight; + } + + this.sidebarContainer.style.bottom = (this.footerHeight + sidebarFooterHeight + off) + 'px'; + this.formatContainer.style.bottom = (this.footerHeight + off) + 'px'; + this.diagramContainer.style.bottom = (this.footerHeight + off + th) + 'px'; + } + + if (sizeDidChange) + { + this.editor.graph.sizeDidChange(); + } +}; + +/** + * Creates the required containers. + */ +EditorUi.prototype.createTabContainer = function() +{ + return null; +}; + +/** + * Creates the required containers. + */ +EditorUi.prototype.createDivs = function() +{ + this.menubarContainer = this.createDiv('geMenubarContainer'); + this.toolbarContainer = this.createDiv('geToolbarContainer'); + this.sidebarContainer = this.createDiv('geSidebarContainer'); + this.formatContainer = this.createDiv('geSidebarContainer geFormatContainer'); + this.diagramContainer = this.createDiv('geDiagramContainer'); + this.footerContainer = this.createDiv('geFooterContainer'); + this.hsplit = this.createDiv('geHsplit'); + this.hsplit.setAttribute('title', mxResources.get('collapseExpand')); + + // Sets static style for containers + this.menubarContainer.style.top = '0px'; + this.menubarContainer.style.left = '0px'; + this.menubarContainer.style.right = '0px'; + this.toolbarContainer.style.left = '0px'; + this.toolbarContainer.style.right = '0px'; + this.sidebarContainer.style.left = '0px'; + this.formatContainer.style.right = '0px'; + this.formatContainer.style.zIndex = '1'; + this.diagramContainer.style.right = ((this.format != null) ? this.formatWidth : 0) + 'px'; + this.footerContainer.style.left = '0px'; + this.footerContainer.style.right = '0px'; + this.footerContainer.style.bottom = '0px'; + this.footerContainer.style.zIndex = mxPopupMenu.prototype.zIndex - 2; + this.hsplit.style.width = this.splitSize + 'px'; + this.sidebarFooterContainer = this.createSidebarFooterContainer(); + + if (this.sidebarFooterContainer) + { + this.sidebarFooterContainer.style.left = '0px'; + } + + if (!this.editor.chromeless) + { + this.tabContainer = this.createTabContainer(); + } + else + { + this.diagramContainer.style.border = 'none'; + } +}; + +/** + * Hook for sidebar footer container. This implementation returns null. + */ +EditorUi.prototype.createSidebarFooterContainer = function() +{ + return null; +}; + +/** + * Creates the required containers. + */ +EditorUi.prototype.createUi = function() +{ + // Creates menubar + this.menubar = (this.editor.chromeless) ? null : this.menus.createMenubar(this.createDiv('geMenubar')); + + if (this.menubar != null) + { + this.menubarContainer.appendChild(this.menubar.container); + } + + // Adds status bar in menubar + if (this.menubar != null) + { + this.statusContainer = this.createStatusContainer(); + + // Connects the status bar to the editor status + this.editor.addListener('statusChanged', mxUtils.bind(this, function() + { + this.setStatusText(this.editor.getStatus()); + })); + + this.setStatusText(this.editor.getStatus()); + this.menubar.container.appendChild(this.statusContainer); + + // Inserts into DOM + this.container.appendChild(this.menubarContainer); + } + + // Creates the sidebar + this.sidebar = (this.editor.chromeless) ? null : this.createSidebar(this.sidebarContainer); + + if (this.sidebar != null) + { + this.container.appendChild(this.sidebarContainer); + } + + // Creates the format sidebar + this.format = (this.editor.chromeless || !this.formatEnabled) ? null : this.createFormat(this.formatContainer); + + if (this.format != null) + { + this.container.appendChild(this.formatContainer); + } + + // Creates the footer + var footer = (this.editor.chromeless) ? null : this.createFooter(); + + if (footer != null) + { + this.footerContainer.appendChild(footer); + this.container.appendChild(this.footerContainer); + } + + if (this.sidebar != null && this.sidebarFooterContainer) + { + this.container.appendChild(this.sidebarFooterContainer); + } + + this.container.appendChild(this.diagramContainer); + + if (this.container != null && this.tabContainer != null) + { + this.container.appendChild(this.tabContainer); + } + + // Creates toolbar + this.toolbar = (this.editor.chromeless) ? null : this.createToolbar(this.createDiv('geToolbar')); + + if (this.toolbar != null) + { + this.toolbarContainer.appendChild(this.toolbar.container); + this.container.appendChild(this.toolbarContainer); + } + + // HSplit + if (this.sidebar != null) + { + this.container.appendChild(this.hsplit); + + this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(value) + { + this.hsplitPosition = value; + this.refresh(); + })); + } +}; + +/** + * Creates a new toolbar for the given container. + */ +EditorUi.prototype.createStatusContainer = function() +{ + var container = document.createElement('a'); + container.className = 'geItem geStatus'; + + if (screen.width < 420) + { + container.style.maxWidth = Math.max(20, screen.width - 320) + 'px'; + container.style.overflow = 'hidden'; + } + + return container; +}; + +/** + * Creates a new toolbar for the given container. + */ +EditorUi.prototype.setStatusText = function(value) +{ + this.statusContainer.innerHTML = value; +}; + +/** + * Creates a new toolbar for the given container. + */ +EditorUi.prototype.createToolbar = function(container) +{ + return new Toolbar(this, container); +}; + +/** + * Creates a new sidebar for the given container. + */ +EditorUi.prototype.createSidebar = function(container) +{ + return new Sidebar(this, container); +}; + +/** + * Creates a new sidebar for the given container. + */ +EditorUi.prototype.createFormat = function(container) +{ + return new Format(this, container); +}; + +/** + * Creates and returns a new footer. + */ +EditorUi.prototype.createFooter = function() +{ + return this.createDiv('geFooter'); +}; + +/** + * Creates the actual toolbar for the toolbar container. + */ +EditorUi.prototype.createDiv = function(classname) +{ + var elt = document.createElement('div'); + elt.className = classname; + + return elt; +}; + +/** + * Updates the states of the given undo/redo items. + */ +EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange) +{ + var start = null; + var initial = null; + var ignoreClick = true; + var last = null; + + // Disables built-in pan and zoom in IE10 and later + if (mxClient.IS_POINTER) + { + elt.style.touchAction = 'none'; + } + + var getValue = mxUtils.bind(this, function() + { + var result = parseInt(((horizontal) ? elt.style.left : elt.style.bottom)); + + // Takes into account hidden footer + if (!horizontal) + { + result = result + dx - this.footerHeight; + } + + return result; + }); + + function moveHandler(evt) + { + if (start != null) + { + var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y - pt.y)) - dx)); + mxEvent.consume(evt); + + if (initial != getValue()) + { + ignoreClick = true; + last = null; + } + } + }; + + function dropHandler(evt) + { + moveHandler(evt); + initial = null; + start = null; + }; + + mxEvent.addGestureListeners(elt, function(evt) + { + start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + initial = getValue(); + ignoreClick = false; + mxEvent.consume(evt); + }); + + mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) + { + if (!ignoreClick && this.hsplitClickEnabled) + { + var next = (last != null) ? last - dx : 0; + last = getValue(); + onChange(next); + mxEvent.consume(evt); + } + })); + + mxEvent.addGestureListeners(document, null, moveHandler, dropHandler); + + this.destroyFunctions.push(function() + { + mxEvent.removeGestureListeners(document, null, moveHandler, dropHandler); + }); +}; + +/** + * Translates this point by the given vector. + * + * @param {number} dx X-coordinate of the translation. + * @param {number} dy Y-coordinate of the translation. + */ +EditorUi.prototype.handleError = function(resp, title, fn, invokeFnOnClose, notFoundMessage) +{ + var e = (resp != null && resp.error != null) ? resp.error : resp; + + if (e != null || title != null) + { + var msg = mxUtils.htmlEntities(mxResources.get('unknownError')); + var btn = mxResources.get('ok'); + title = (title != null) ? title : mxResources.get('error'); + + if (e != null && e.message != null) + { + msg = mxUtils.htmlEntities(e.message); + } + + this.showError(title, msg, btn, fn, null, null, null, null, null, + null, null, null, (invokeFnOnClose) ? fn : null); + } + else if (fn != null) + { + fn(); + } +}; + +/** + * Translates this point by the given vector. + * + * @param {number} dx X-coordinate of the translation. + * @param {number} dy Y-coordinate of the translation. + */ +EditorUi.prototype.showError = function(title, msg, btn, fn, retry, btn2, fn2, btn3, fn3, w, h, hide, onClose) +{ + var dlg = new ErrorDialog(this, title, msg, btn || mxResources.get('ok'), + fn, retry, btn2, fn2, hide, btn3, fn3); + var lines = Math.ceil((msg != null) ? msg.length / 50 : 1); + this.showDialog(dlg.container, w || 340, h || (100 + lines * 20), true, false, onClose); + dlg.init(); +}; + +/** + * Displays a print dialog. + */ +EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose, noScroll, transparent, onResize, ignoreBgClick) +{ + this.editor.graph.tooltipHandler.hideTooltip(); + + if (this.dialogs == null) + { + this.dialogs = []; + } + + this.dialog = new Dialog(this, elt, w, h, modal, closable, onClose, noScroll, transparent, onResize, ignoreBgClick); + this.dialogs.push(this.dialog); +}; + +/** + * Displays a print dialog. + */ +EditorUi.prototype.hideDialog = function(cancel, isEsc) +{ + if (this.dialogs != null && this.dialogs.length > 0) + { + var dlg = this.dialogs.pop(); + + if (dlg.close(cancel, isEsc) == false) + { + //add the dialog back if dialog closing is cancelled + this.dialogs.push(dlg); + return; + } + + this.dialog = (this.dialogs.length > 0) ? this.dialogs[this.dialogs.length - 1] : null; + this.editor.fireEvent(new mxEventObject('hideDialog')); + + if (this.dialog == null && this.editor.graph.container.style.visibility != 'hidden') + { + window.setTimeout(mxUtils.bind(this, function() + { + if (this.editor.graph.isEditing() && this.editor.graph.cellEditor.textarea != null) + { + this.editor.graph.cellEditor.textarea.focus(); + } + else + { + mxUtils.clearSelection(); + this.editor.graph.container.focus(); + } + }), 0); + } + } +}; + +/** + * Display a color dialog. + */ +EditorUi.prototype.pickColor = function(color, apply) +{ + var graph = this.editor.graph; + var selState = graph.cellEditor.saveSelection(); + var h = 226 + ((Math.ceil(ColorDialog.prototype.presetColors.length / 12) + + Math.ceil(ColorDialog.prototype.defaultColors.length / 12)) * 17); + + var dlg = new ColorDialog(this, color || 'none', function(color) + { + graph.cellEditor.restoreSelection(selState); + apply(color); + }, function() + { + graph.cellEditor.restoreSelection(selState); + }); + this.showDialog(dlg.container, 230, h, true, false); + dlg.init(); +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +EditorUi.prototype.openFile = function() +{ + // Closes dialog after open + window.openFile = new OpenFile(mxUtils.bind(this, function(cancel) + { + this.hideDialog(cancel); + })); + + // Removes openFile if dialog is closed + this.showDialog(new OpenDialog(this).container, (Editor.useLocalStorage) ? 640 : 320, + (Editor.useLocalStorage) ? 480 : 220, true, true, function() + { + window.openFile = null; + }); +}; + +/** + * Extracs the graph model from the given HTML data from a data transfer event. + */ +EditorUi.prototype.extractGraphModelFromHtml = function(data) +{ + var result = null; + + try + { + var idx = data.indexOf('<mxGraphModel '); + + if (idx >= 0) + { + var idx2 = data.lastIndexOf('</mxGraphModel>'); + + if (idx2 > idx) + { + result = data.substring(idx, idx2 + 21).replace(/>/g, '>'). + replace(/</g, '<').replace(/\\"/g, '"').replace(/\n/g, ''); + } + } + } + catch (e) + { + // ignore + } + + return result; +}; + +/** + * Opens the given files in the editor. + */ +EditorUi.prototype.extractGraphModelFromEvent = function(evt) +{ + var result = null; + var data = null; + + if (evt != null) + { + var provider = (evt.dataTransfer != null) ? evt.dataTransfer : evt.clipboardData; + + if (provider != null) + { + if (document.documentMode == 10 || document.documentMode == 11) + { + data = provider.getData('Text'); + } + else + { + data = (mxUtils.indexOf(provider.types, 'text/html') >= 0) ? provider.getData('text/html') : null; + + if (mxUtils.indexOf(provider.types, 'text/plain' && (data == null || data.length == 0))) + { + data = provider.getData('text/plain'); + } + } + + if (data != null) + { + data = Graph.zapGremlins(mxUtils.trim(data)); + + // Tries parsing as HTML document with embedded XML + var xml = this.extractGraphModelFromHtml(data); + + if (xml != null) + { + data = xml; + } + } + } + } + + if (data != null && this.isCompatibleString(data)) + { + result = data; + } + + return result; +}; + +/** + * Hook for subclassers to return true if event data is a supported format. + * This implementation always returns false. + */ +EditorUi.prototype.isCompatibleString = function(data) +{ + return false; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +EditorUi.prototype.saveFile = function(forceDialog) +{ + if (!forceDialog && this.editor.filename != null) + { + this.save(this.editor.getOrCreateFilename()); + } + else + { + var dlg = new FilenameDialog(this, this.editor.getOrCreateFilename(), mxResources.get('save'), mxUtils.bind(this, function(name) + { + this.save(name); + }), null, mxUtils.bind(this, function(name) + { + if (name != null && name.length > 0) + { + return true; + } + + mxUtils.confirm(mxResources.get('invalidName')); + + return false; + })); + this.showDialog(dlg.container, 300, 100, true, true); + dlg.init(); + } +}; + +/** + * Saves the current graph under the given filename. + */ +EditorUi.prototype.save = function(name) +{ + if (name != null) + { + if (this.editor.graph.isEditing()) + { + this.editor.graph.stopEditing(); + } + + var xml = mxUtils.getXml(this.editor.getGraphXml()); + + try + { + if (Editor.useLocalStorage) + { + if (localStorage.getItem(name) != null && + !mxUtils.confirm(mxResources.get('replaceIt', [name]))) + { + return; + } + + localStorage.setItem(name, xml); + this.editor.setStatus(mxUtils.htmlEntities(mxResources.get('saved')) + ' ' + new Date()); + } + else + { + if (xml.length < MAX_REQUEST_SIZE) + { + new mxXmlRequest(SAVE_URL, 'filename=' + encodeURIComponent(name) + + '&xml=' + encodeURIComponent(xml)).simulate(document, '_blank'); + } + else + { + mxUtils.alert(mxResources.get('drawingTooLarge')); + mxUtils.popup(xml); + + return; + } + } + + this.editor.setModified(false); + this.editor.setFilename(name); + this.updateDocumentTitle(); + } + catch (e) + { + this.editor.setStatus(mxUtils.htmlEntities(mxResources.get('errorSavingFile'))); + } + } +}; + +/** + * Executes the given layout. + */ +EditorUi.prototype.executeLayout = function(exec, animate, post) +{ + var graph = this.editor.graph; + + if (graph.isEnabled()) + { + graph.getModel().beginUpdate(); + try + { + exec(); + } + catch (e) + { + throw e; + } + finally + { + // Animates the changes in the graph model except + // for Camino, where animation is too slow + if (this.allowAnimation && animate && (navigator.userAgent == null || + navigator.userAgent.indexOf('Camino') < 0)) + { + // New API for animating graph layout results asynchronously + var morph = new mxMorphing(graph); + morph.addListener(mxEvent.DONE, mxUtils.bind(this, function() + { + graph.getModel().endUpdate(); + + if (post != null) + { + post(); + } + })); + + morph.startAnimation(); + } + else + { + graph.getModel().endUpdate(); + + if (post != null) + { + post(); + } + } + } + } +}; + +/** + * Hides the current menu. + */ +EditorUi.prototype.showImageDialog = function(title, value, fn, ignoreExisting) +{ + var cellEditor = this.editor.graph.cellEditor; + var selState = cellEditor.saveSelection(); + var newValue = mxUtils.prompt(title, value); + cellEditor.restoreSelection(selState); + + if (newValue != null && newValue.length > 0) + { + var img = new Image(); + + img.onload = function() + { + fn(newValue, img.width, img.height); + }; + img.onerror = function() + { + fn(null); + mxUtils.alert(mxResources.get('fileNotFound')); + }; + + img.src = newValue; + } + else + { + fn(null); + } +}; + +/** + * Hides the current menu. + */ +EditorUi.prototype.showLinkDialog = function(value, btnLabel, fn) +{ + var dlg = new LinkDialog(this, value, btnLabel, fn); + this.showDialog(dlg.container, 420, 90, true, true); + dlg.init(); +}; + +/** + * Hides the current menu. + */ +EditorUi.prototype.showDataDialog = function(cell) +{ + if (cell != null) + { + var dlg = new EditDataDialog(this, cell); + this.showDialog(dlg.container, 480, 420, true, false, null, false); + dlg.init(); + } +}; + +/** + * Hides the current menu. + */ +EditorUi.prototype.showBackgroundImageDialog = function(apply) +{ + apply = (apply != null) ? apply : mxUtils.bind(this, function(image) + { + var change = new ChangePageSetup(this, null, image); + change.ignoreColor = true; + + this.editor.graph.model.execute(change); + }); + + var newValue = mxUtils.prompt(mxResources.get('backgroundImage'), ''); + + if (newValue != null && newValue.length > 0) + { + var img = new Image(); + + img.onload = function() + { + apply(new mxImage(newValue, img.width, img.height)); + }; + img.onerror = function() + { + apply(null); + mxUtils.alert(mxResources.get('fileNotFound')); + }; + + img.src = newValue; + } + else + { + apply(null); + } +}; + +/** + * Loads the stylesheet for this graph. + */ +EditorUi.prototype.setBackgroundImage = function(image) +{ + this.editor.graph.setBackgroundImage(image); + this.editor.graph.view.validateBackgroundImage(); + + this.fireEvent(new mxEventObject('backgroundImageChanged')); +}; + +/** + * Creates the keyboard event handler for the current graph and history. + */ +EditorUi.prototype.confirm = function(msg, okFn, cancelFn) +{ + if (mxUtils.confirm(msg)) + { + if (okFn != null) + { + okFn(); + } + } + else if (cancelFn != null) + { + cancelFn(); + } +}; + +/** + * Creates the keyboard event handler for the current graph and history. + */ +EditorUi.prototype.createOutline = function(wnd) +{ + var outline = new mxOutline(this.editor.graph); + outline.border = 20; + + mxEvent.addListener(window, 'resize', function() + { + outline.update(); + }); + + this.addListener('pageFormatChanged', function() + { + outline.update(); + }); + + return outline; +}; + +// Alt+Shift+Keycode mapping to action +EditorUi.prototype.altShiftActions = {67: 'clearWaypoints', // Alt+Shift+C + 65: 'connectionArrows', // Alt+Shift+A + 76: 'editLink', // Alt+Shift+L + 80: 'connectionPoints', // Alt+Shift+P + 84: 'editTooltip', // Alt+Shift+T + 86: 'pasteSize', // Alt+Shift+V + 88: 'copySize' // Alt+Shift+X +}; + +/** + * Creates the keyboard event handler for the current graph and history. + */ +EditorUi.prototype.createKeyHandler = function(editor) +{ + var editorUi = this; + var graph = this.editor.graph; + var keyHandler = new mxKeyHandler(graph); + + var isEventIgnored = keyHandler.isEventIgnored; + keyHandler.isEventIgnored = function(evt) + { + // Handles undo/redo/ctrl+./,/u via action and allows ctrl+b/i + // only if editing value is HTML (except for FF and Safari) + return !(mxEvent.isShiftDown(evt) && evt.keyCode == 9) && + ((!this.isControlDown(evt) || mxEvent.isShiftDown(evt) || + (evt.keyCode != 90 && evt.keyCode != 89 && evt.keyCode != 188 && + evt.keyCode != 190 && evt.keyCode != 85)) && ((evt.keyCode != 66 && evt.keyCode != 73) || + !this.isControlDown(evt) || (this.graph.cellEditor.isContentEditing() && + !mxClient.IS_FF && !mxClient.IS_SF)) && isEventIgnored.apply(this, arguments)); + }; + + // Ignores graph enabled state but not chromeless state + keyHandler.isEnabledForEvent = function(evt) + { + return (!mxEvent.isConsumed(evt) && this.isGraphEvent(evt) && this.isEnabled() && + (editorUi.dialogs == null || editorUi.dialogs.length == 0)); + }; + + // Routes command-key to control-key on Mac + keyHandler.isControlDown = function(evt) + { + return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey); + }; + + var queue = []; + var thread = null; + + // Helper function to move cells with the cursor keys + function nudge(keyCode, stepSize, resize) + { + queue.push(function() + { + if (!graph.isSelectionEmpty() && graph.isEnabled()) + { + stepSize = (stepSize != null) ? stepSize : 1; + + if (resize) + { + // Resizes all selected vertices + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + + for (var i = 0; i < cells.length; i++) + { + if (graph.getModel().isVertex(cells[i]) && graph.isCellResizable(cells[i])) + { + var geo = graph.getCellGeometry(cells[i]); + + if (geo != null) + { + geo = geo.clone(); + + if (keyCode == 37) + { + geo.width = Math.max(0, geo.width - stepSize); + } + else if (keyCode == 38) + { + geo.height = Math.max(0, geo.height - stepSize); + } + else if (keyCode == 39) + { + geo.width += stepSize; + } + else if (keyCode == 40) + { + geo.height += stepSize; + } + + graph.getModel().setGeometry(cells[i], geo); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + } + else + { + // Moves vertices up/down in a stack layout + var cell = graph.getSelectionCell(); + var parent = graph.model.getParent(cell); + var layout = null; + + if (graph.getSelectionCount() == 1 && graph.model.isVertex(cell) && + graph.layoutManager != null && !graph.isCellLocked(cell)) + { + layout = graph.layoutManager.getLayout(parent); + } + + if (layout != null && layout.constructor == mxStackLayout) + { + var index = parent.getIndex(cell); + + if (keyCode == 37 || keyCode == 38) + { + graph.model.add(parent, cell, Math.max(0, index - 1)); + } + else if (keyCode == 39 ||keyCode == 40) + { + graph.model.add(parent, cell, Math.min(graph.model.getChildCount(parent), index + 1)); + } + } + else + { + var cells = graph.getMovableCells(graph.getSelectionCells()); + var realCells = []; + + for (var i = 0; i < cells.length; i++) + { + // TODO: Use getCompositeParent + var style = graph.getCurrentCellStyle(cells[i]); + + if (mxUtils.getValue(style, 'part', '0') == '1') + { + var parent = graph.model.getParent(cells[i]); + + if (graph.model.isVertex(parent) && mxUtils.indexOf(cells, parent) < 0) + { + realCells.push(parent); + } + } + else + { + realCells.push(cells[i]); + } + } + + if (realCells.length > 0) + { + cells = realCells; + var dx = 0; + var dy = 0; + + if (keyCode == 37) + { + dx = -stepSize; + } + else if (keyCode == 38) + { + dy = -stepSize; + } + else if (keyCode == 39) + { + dx = stepSize; + } + else if (keyCode == 40) + { + dy = stepSize; + } + + graph.moveCells(cells, dx, dy); + } + } + } + } + }); + + if (thread != null) + { + window.clearTimeout(thread); + } + + thread = window.setTimeout(function() + { + if (queue.length > 0) + { + graph.getModel().beginUpdate(); + + try + { + for (var i = 0; i < queue.length; i++) + { + queue[i](); + } + + queue = []; + } + finally + { + graph.getModel().endUpdate(); + } + } + }, 200); + }; + + // Overridden to handle special alt+shift+cursor keyboard shortcuts + var directions = {37: mxConstants.DIRECTION_WEST, 38: mxConstants.DIRECTION_NORTH, + 39: mxConstants.DIRECTION_EAST, 40: mxConstants.DIRECTION_SOUTH}; + + var keyHandlerGetFunction = keyHandler.getFunction; + + mxKeyHandler.prototype.getFunction = function(evt) + { + if (graph.isEnabled()) + { + // TODO: Add alt modified state in core API, here are some specific cases + if (mxEvent.isShiftDown(evt) && mxEvent.isAltDown(evt)) + { + var action = editorUi.actions.get(editorUi.altShiftActions[evt.keyCode]); + + if (action != null) + { + return action.funct; + } + } + + if (evt.keyCode == 9 && mxEvent.isAltDown(evt)) + { + if (graph.cellEditor.isContentEditing()) + { + // Alt+Shift+Tab while editing + return function() + { + document.execCommand('outdent', false, null); + }; + } + else if (mxEvent.isShiftDown(evt)) + { + // Alt+Shift+Tab + return function() + { + graph.selectParentCell(); + }; + } + else + { + // Alt+Tab + return function() + { + graph.selectChildCell(); + }; + } + } + else if (directions[evt.keyCode] != null && !graph.isSelectionEmpty()) + { + // On macOS, Control+Cursor is used by Expose so allow for Alt+Control to resize + if (!this.isControlDown(evt) && mxEvent.isShiftDown(evt) && mxEvent.isAltDown(evt)) + { + if (graph.model.isVertex(graph.getSelectionCell())) + { + return function() + { + var cells = graph.connectVertex(graph.getSelectionCell(), directions[evt.keyCode], + graph.defaultEdgeLength, evt, true); + + if (cells != null && cells.length > 0) + { + if (cells.length == 1 && graph.model.isEdge(cells[0])) + { + graph.setSelectionCell(graph.model.getTerminal(cells[0], false)); + } + else + { + graph.setSelectionCell(cells[cells.length - 1]); + } + + graph.scrollCellToVisible(graph.getSelectionCell()); + + if (editorUi.hoverIcons != null) + { + editorUi.hoverIcons.update(graph.view.getState(graph.getSelectionCell())); + } + } + }; + } + } + else + { + // Avoids consuming event if no vertex is selected by returning null below + // Cursor keys move and resize (ctrl) cells + if (this.isControlDown(evt)) + { + return function() + { + nudge(evt.keyCode, (mxEvent.isShiftDown(evt)) ? graph.gridSize : null, true); + }; + } + else + { + return function() + { + nudge(evt.keyCode, (mxEvent.isShiftDown(evt)) ? graph.gridSize : null); + }; + } + } + } + } + + return keyHandlerGetFunction.apply(this, arguments); + }; + + // Binds keystrokes to actions + keyHandler.bindAction = mxUtils.bind(this, function(code, control, key, shift) + { + var action = this.actions.get(key); + + if (action != null) + { + var f = function() + { + if (action.isEnabled()) + { + action.funct(); + } + }; + + if (control) + { + if (shift) + { + keyHandler.bindControlShiftKey(code, f); + } + else + { + keyHandler.bindControlKey(code, f); + } + } + else + { + if (shift) + { + keyHandler.bindShiftKey(code, f); + } + else + { + keyHandler.bindKey(code, f); + } + } + } + }); + + var ui = this; + var keyHandlerEscape = keyHandler.escape; + keyHandler.escape = function(evt) + { + keyHandlerEscape.apply(this, arguments); + }; + + // Ignores enter keystroke. Remove this line if you want the + // enter keystroke to stop editing. N, W, T are reserved. + keyHandler.enter = function() {}; + + keyHandler.bindControlShiftKey(36, function() { graph.exitGroup(); }); // Ctrl+Shift+Home + keyHandler.bindControlShiftKey(35, function() { graph.enterGroup(); }); // Ctrl+Shift+End + keyHandler.bindKey(36, function() { graph.home(); }); // Home + keyHandler.bindKey(35, function() { graph.refresh(); }); // End + keyHandler.bindAction(107, true, 'zoomIn'); // Ctrl+Plus + keyHandler.bindAction(109, true, 'zoomOut'); // Ctrl+Minus + keyHandler.bindAction(80, true, 'print'); // Ctrl+P + keyHandler.bindAction(79, true, 'outline', true); // Ctrl+Shift+O + + if (!this.editor.chromeless || this.editor.editable) + { + keyHandler.bindControlKey(36, function() { if (graph.isEnabled()) { graph.foldCells(true); }}); // Ctrl+Home + keyHandler.bindControlKey(35, function() { if (graph.isEnabled()) { graph.foldCells(false); }}); // Ctrl+End + keyHandler.bindControlKey(13, function() + { + if (graph.isEnabled()) + { + try + { + graph.setSelectionCells(graph.duplicateCells(graph.getSelectionCells(), false)); + } + catch (e) + { + ui.handleError(e); + } + } + }); // Ctrl+Enter + keyHandler.bindAction(8, false, 'delete'); // Backspace + keyHandler.bindAction(8, true, 'deleteAll'); // Backspace + keyHandler.bindAction(46, false, 'delete'); // Delete + keyHandler.bindAction(46, true, 'deleteAll'); // Ctrl+Delete + keyHandler.bindAction(72, true, 'resetView'); // Ctrl+H + keyHandler.bindAction(72, true, 'fitWindow', true); // Ctrl+Shift+H + keyHandler.bindAction(74, true, 'fitPage'); // Ctrl+J + keyHandler.bindAction(74, true, 'fitTwoPages', true); // Ctrl+Shift+J + keyHandler.bindAction(48, true, 'customZoom'); // Ctrl+0 + keyHandler.bindAction(82, true, 'turn'); // Ctrl+R + keyHandler.bindAction(82, true, 'clearDefaultStyle', true); // Ctrl+Shift+R + keyHandler.bindAction(83, true, 'save'); // Ctrl+S + keyHandler.bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S + keyHandler.bindAction(65, true, 'selectAll'); // Ctrl+A + keyHandler.bindAction(65, true, 'selectNone', true); // Ctrl+A + keyHandler.bindAction(73, true, 'selectVertices', true); // Ctrl+Shift+I + keyHandler.bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E + keyHandler.bindAction(69, true, 'editStyle'); // Ctrl+E + keyHandler.bindAction(66, true, 'bold'); // Ctrl+B + keyHandler.bindAction(66, true, 'toBack', true); // Ctrl+Shift+B + keyHandler.bindAction(70, true, 'toFront', true); // Ctrl+Shift+F + keyHandler.bindAction(68, true, 'duplicate'); // Ctrl+D + keyHandler.bindAction(68, true, 'setAsDefaultStyle', true); // Ctrl+Shift+D + keyHandler.bindAction(90, true, 'undo'); // Ctrl+Z + keyHandler.bindAction(89, true, 'autosize', true); // Ctrl+Shift+Y + keyHandler.bindAction(88, true, 'cut'); // Ctrl+X + keyHandler.bindAction(67, true, 'copy'); // Ctrl+C + keyHandler.bindAction(86, true, 'paste'); // Ctrl+V + keyHandler.bindAction(71, true, 'group'); // Ctrl+G + keyHandler.bindAction(77, true, 'editData'); // Ctrl+M + keyHandler.bindAction(71, true, 'grid', true); // Ctrl+Shift+G + keyHandler.bindAction(73, true, 'italic'); // Ctrl+I + keyHandler.bindAction(76, true, 'lockUnlock'); // Ctrl+L + keyHandler.bindAction(76, true, 'layers', true); // Ctrl+Shift+L + keyHandler.bindAction(80, true, 'formatPanel', true); // Ctrl+Shift+P + keyHandler.bindAction(85, true, 'underline'); // Ctrl+U + keyHandler.bindAction(85, true, 'ungroup', true); // Ctrl+Shift+U + keyHandler.bindAction(190, true, 'superscript'); // Ctrl+. + keyHandler.bindAction(188, true, 'subscript'); // Ctrl+, + keyHandler.bindAction(9, false, 'indent', true); // Shift+Tab, + keyHandler.bindKey(13, function() { if (graph.isEnabled()) { graph.startEditingAtCell(); }}); // Enter + keyHandler.bindKey(113, function() { if (graph.isEnabled()) { graph.startEditingAtCell(); }}); // F2 + } + + if (!mxClient.IS_WIN) + { + keyHandler.bindAction(90, true, 'redo', true); // Ctrl+Shift+Z + } + else + { + keyHandler.bindAction(89, true, 'redo'); // Ctrl+Y + } + + return keyHandler; +}; + +/** + * Creates the keyboard event handler for the current graph and history. + */ +EditorUi.prototype.destroy = function() +{ + if (this.editor != null) + { + this.editor.destroy(); + this.editor = null; + } + + if (this.menubar != null) + { + this.menubar.destroy(); + this.menubar = null; + } + + if (this.toolbar != null) + { + this.toolbar.destroy(); + this.toolbar = null; + } + + if (this.sidebar != null) + { + this.sidebar.destroy(); + this.sidebar = null; + } + + if (this.keyHandler != null) + { + this.keyHandler.destroy(); + this.keyHandler = null; + } + + if (this.keydownHandler != null) + { + mxEvent.removeListener(document, 'keydown', this.keydownHandler); + this.keydownHandler = null; + } + + if (this.keyupHandler != null) + { + mxEvent.removeListener(document, 'keyup', this.keyupHandler); + this.keyupHandler = null; + } + + if (this.resizeHandler != null) + { + mxEvent.removeListener(window, 'resize', this.resizeHandler); + this.resizeHandler = null; + } + + if (this.gestureHandler != null) + { + mxEvent.removeGestureListeners(document, this.gestureHandler); + this.gestureHandler = null; + } + + if (this.orientationChangeHandler != null) + { + mxEvent.removeListener(window, 'orientationchange', this.orientationChangeHandler); + this.orientationChangeHandler = null; + } + + if (this.scrollHandler != null) + { + mxEvent.removeListener(window, 'scroll', this.scrollHandler); + this.scrollHandler = null; + } + + if (this.destroyFunctions != null) + { + for (var i = 0; i < this.destroyFunctions.length; i++) + { + this.destroyFunctions[i](); + } + + this.destroyFunctions = null; + } + + var c = [this.menubarContainer, this.toolbarContainer, this.sidebarContainer, + this.formatContainer, this.diagramContainer, this.footerContainer, + this.chromelessToolbar, this.hsplit, this.sidebarFooterContainer, + this.layersDialog]; + + for (var i = 0; i < c.length; i++) + { + if (c[i] != null && c[i].parentNode != null) + { + c[i].parentNode.removeChild(c[i]); + } + } +}; diff --git a/public/js/grapheditor/js/Format.js b/public/js/grapheditor/js/Format.js new file mode 100644 index 000000000..31a9f4e9d --- /dev/null +++ b/public/js/grapheditor/js/Format.js @@ -0,0 +1,5907 @@ +/** + * Copyright (c) 2006-2012, JGraph Ltd + */ +Format = function(editorUi, container) +{ + this.editorUi = editorUi; + this.container = container; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.labelIndex = 0; + +/** + * Returns information about the current selection. + */ +Format.prototype.currentIndex = 0; + +/** + * Returns information about the current selection. + */ +Format.prototype.showCloseButton = true; + +/** + * Background color for inactive tabs. + */ +Format.prototype.inactiveTabBackgroundColor = '#f1f3f4'; + +/** + * Background color for inactive tabs. + */ +Format.prototype.roundableShapes = ['label', 'rectangle', 'internalStorage', 'corner', + 'parallelogram', 'swimlane', 'triangle', 'trapezoid', + 'ext', 'step', 'tee', 'process', 'link', + 'rhombus', 'offPageConnector', 'loopLimit', 'hexagon', + 'manualInput', 'curlyBracket', 'singleArrow', 'callout', + 'doubleArrow', 'flexArrow', 'card', 'umlLifeline']; + +/** + * Adds the label menu items to the given menu and parent. + */ +Format.prototype.init = function() +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + this.update = mxUtils.bind(this, function(sender, evt) + { + this.clearSelectionState(); + this.refresh(); + }); + + graph.getSelectionModel().addListener(mxEvent.CHANGE, this.update); + graph.addListener(mxEvent.EDITING_STARTED, this.update); + graph.addListener(mxEvent.EDITING_STOPPED, this.update); + graph.getModel().addListener(mxEvent.CHANGE, this.update); + graph.addListener(mxEvent.ROOT, mxUtils.bind(this, function() + { + this.refresh(); + })); + + editor.addListener('autosaveChanged', mxUtils.bind(this, function() + { + this.refresh(); + })); + + this.refresh(); +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.clearSelectionState = function() +{ + this.selectionState = null; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.getSelectionState = function() +{ + if (this.selectionState == null) + { + this.selectionState = this.createSelectionState(); + } + + return this.selectionState; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.createSelectionState = function() +{ + var cells = this.editorUi.editor.graph.getSelectionCells(); + var result = this.initSelectionState(); + + for (var i = 0; i < cells.length; i++) + { + this.updateSelectionStateForCell(result, cells[i], cells); + } + + return result; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.initSelectionState = function() +{ + return {vertices: [], edges: [], x: null, y: null, width: null, height: null, style: {}, + containsImage: false, containsLabel: false, fill: true, glass: true, rounded: true, + comic: true, autoSize: false, image: true, shadow: true, lineJumps: true}; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.updateSelectionStateForCell = function(result, cell, cells) +{ + var graph = this.editorUi.editor.graph; + + if (graph.getModel().isVertex(cell)) + { + result.vertices.push(cell); + var geo = graph.getCellGeometry(cell); + + if (geo != null) + { + if (geo.width > 0) + { + if (result.width == null) + { + result.width = geo.width; + } + else if (result.width != geo.width) + { + result.width = ''; + } + } + else + { + result.containsLabel = true; + } + + if (geo.height > 0) + { + if (result.height == null) + { + result.height = geo.height; + } + else if (result.height != geo.height) + { + result.height = ''; + } + } + else + { + result.containsLabel = true; + } + + if (!geo.relative || geo.offset != null) + { + var x = (geo.relative) ? geo.offset.x : geo.x; + var y = (geo.relative) ? geo.offset.y : geo.y; + + if (result.x == null) + { + result.x = x; + } + else if (result.x != x) + { + result.x = ''; + } + + if (result.y == null) + { + result.y = y; + } + else if (result.y != y) + { + result.y = ''; + } + } + } + } + else if (graph.getModel().isEdge(cell)) + { + result.edges.push(cell); + } + + var state = graph.view.getState(cell); + + if (state != null) + { + result.autoSize = result.autoSize || this.isAutoSizeState(state); + result.glass = result.glass && this.isGlassState(state); + result.rounded = result.rounded && this.isRoundedState(state); + result.lineJumps = result.lineJumps && this.isLineJumpState(state); + result.comic = result.comic && this.isComicState(state); + result.image = result.image && this.isImageState(state); + result.shadow = result.shadow && this.isShadowState(state); + result.fill = result.fill && this.isFillState(state); + + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + result.containsImage = result.containsImage || shape == 'image'; + + for (var key in state.style) + { + var value = state.style[key]; + + if (value != null) + { + if (result.style[key] == null) + { + result.style[key] = value; + } + else if (result.style[key] != value) + { + result.style[key] = ''; + } + } + } + } +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isFillState = function(state) +{ + return state.view.graph.model.isVertex(state.cell) || + mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'arrow' || + mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'filledEdge' || + mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'flexArrow'; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isGlassState = function(state) +{ + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + + return (shape == 'label' || shape == 'rectangle' || shape == 'internalStorage' || + shape == 'ext' || shape == 'umlLifeline' || shape == 'swimlane' || + shape == 'process'); +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isRoundedState = function(state) +{ + return (state.shape != null) ? state.shape.isRoundable() : + mxUtils.indexOf(this.roundableShapes, mxUtils.getValue(state.style, + mxConstants.STYLE_SHAPE, null)) >= 0; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isLineJumpState = function(state) +{ + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + var curved = mxUtils.getValue(state.style, mxConstants.STYLE_CURVED, false); + + return !curved && (shape == 'connector' || shape == 'filledEdge'); +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isComicState = function(state) +{ + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + + return mxUtils.indexOf(['label', 'rectangle', 'internalStorage', 'corner', 'parallelogram', 'note', 'collate', + 'swimlane', 'triangle', 'trapezoid', 'ext', 'step', 'tee', 'process', 'link', 'rhombus', + 'offPageConnector', 'loopLimit', 'hexagon', 'manualInput', 'singleArrow', 'doubleArrow', + 'flexArrow', 'filledEdge', 'card', 'umlLifeline', 'connector', 'folder', 'component', 'sortShape', + 'cross', 'umlFrame', 'cube', 'isoCube', 'isoRectangle', 'partialRectangle'], shape) >= 0; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isAutoSizeState = function(state) +{ + return mxUtils.getValue(state.style, mxConstants.STYLE_AUTOSIZE, null) == '1'; +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isImageState = function(state) +{ + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + + return (shape == 'label' || shape == 'image'); +}; + +/** + * Returns information about the current selection. + */ +Format.prototype.isShadowState = function(state) +{ + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + + return (shape != 'image'); +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +Format.prototype.clear = function() +{ + this.container.innerHTML = ''; + + // Destroy existing panels + if (this.panels != null) + { + for (var i = 0; i < this.panels.length; i++) + { + this.panels[i].destroy(); + } + } + + this.panels = []; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +Format.prototype.refresh = function() +{ + // Performance tweak: No refresh needed if not visible + if (this.container.style.width == '0px') + { + return; + } + + this.clear(); + var ui = this.editorUi; + var graph = ui.editor.graph; + + var div = document.createElement('div'); + div.style.whiteSpace = 'nowrap'; + div.style.color = 'rgb(112, 112, 112)'; + div.style.textAlign = 'left'; + div.style.cursor = 'default'; + + var label = document.createElement('div'); + label.className = 'geFormatSection'; + label.style.textAlign = 'center'; + label.style.fontWeight = 'bold'; + label.style.paddingTop = '8px'; + label.style.fontSize = '13px'; + label.style.borderWidth = '0px 0px 1px 1px'; + label.style.borderStyle = 'solid'; + label.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; + label.style.height = (mxClient.IS_QUIRKS) ? '34px' : '25px'; + label.style.overflow = 'hidden'; + label.style.width = '100%'; + this.container.appendChild(div); + + // Prevents text selection + mxEvent.addListener(label, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', + mxUtils.bind(this, function(evt) + { + evt.preventDefault(); + })); + + if (graph.isSelectionEmpty()) + { + mxUtils.write(label, mxResources.get('diagram')); + label.style.borderLeftWidth = '0px'; + + // Adds button to hide the format panel since + // people don't seem to find the toolbar button + // and the menu item in the format menu + if (this.showCloseButton) + { + var img = document.createElement('img'); + img.setAttribute('border', '0'); + img.setAttribute('src', Dialog.prototype.closeImage); + img.setAttribute('title', mxResources.get('hide')); + img.style.position = 'absolute'; + img.style.display = 'block'; + img.style.right = '0px'; + img.style.top = '8px'; + img.style.cursor = 'pointer'; + img.style.marginTop = '1px'; + img.style.marginRight = '17px'; + img.style.border = '1px solid transparent'; + img.style.padding = '1px'; + img.style.opacity = 0.5; + label.appendChild(img) + + mxEvent.addListener(img, 'click', function() + { + ui.actions.get('formatPanel').funct(); + }); + } + + div.appendChild(label); + this.panels.push(new DiagramFormatPanel(this, ui, div)); + } + else if (graph.isEditing()) + { + mxUtils.write(label, mxResources.get('text')); + div.appendChild(label); + this.panels.push(new TextFormatPanel(this, ui, div)); + } + else + { + var containsLabel = this.getSelectionState().containsLabel; + var currentLabel = null; + var currentPanel = null; + + var addClickHandler = mxUtils.bind(this, function(elt, panel, index) + { + var clickHandler = mxUtils.bind(this, function(evt) + { + if (currentLabel != elt) + { + if (containsLabel) + { + this.labelIndex = index; + } + else + { + this.currentIndex = index; + } + + if (currentLabel != null) + { + currentLabel.style.backgroundColor = this.inactiveTabBackgroundColor; + currentLabel.style.borderBottomWidth = '1px'; + } + + currentLabel = elt; + currentLabel.style.backgroundColor = ''; + currentLabel.style.borderBottomWidth = '0px'; + + if (currentPanel != panel) + { + if (currentPanel != null) + { + currentPanel.style.display = 'none'; + } + + currentPanel = panel; + currentPanel.style.display = ''; + } + } + }); + + mxEvent.addListener(elt, 'click', clickHandler); + + // Prevents text selection + mxEvent.addListener(elt, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', + mxUtils.bind(this, function(evt) + { + evt.preventDefault(); + })); + + if (index == ((containsLabel) ? this.labelIndex : this.currentIndex)) + { + // Invokes handler directly as a workaround for no click on DIV in KHTML. + clickHandler(); + } + }); + + var idx = 0; + + label.style.backgroundColor = this.inactiveTabBackgroundColor; + label.style.borderLeftWidth = '1px'; + label.style.cursor = 'pointer'; + label.style.width = (containsLabel) ? '50%' : '33.3%'; + label.style.width = (containsLabel) ? '50%' : '33.3%'; + var label2 = label.cloneNode(false); + var label3 = label2.cloneNode(false); + + // Workaround for ignored background in IE + label2.style.backgroundColor = this.inactiveTabBackgroundColor; + label3.style.backgroundColor = this.inactiveTabBackgroundColor; + + // Style + if (containsLabel) + { + label2.style.borderLeftWidth = '0px'; + } + else + { + label.style.borderLeftWidth = '0px'; + mxUtils.write(label, mxResources.get('style')); + div.appendChild(label); + + var stylePanel = div.cloneNode(false); + stylePanel.style.display = 'none'; + this.panels.push(new StyleFormatPanel(this, ui, stylePanel)); + this.container.appendChild(stylePanel); + + addClickHandler(label, stylePanel, idx++); + } + + // Text + mxUtils.write(label2, mxResources.get('text')); + div.appendChild(label2); + + var textPanel = div.cloneNode(false); + textPanel.style.display = 'none'; + this.panels.push(new TextFormatPanel(this, ui, textPanel)); + this.container.appendChild(textPanel); + + // Arrange + mxUtils.write(label3, mxResources.get('arrange')); + div.appendChild(label3); + + var arrangePanel = div.cloneNode(false); + arrangePanel.style.display = 'none'; + this.panels.push(new ArrangePanel(this, ui, arrangePanel)); + this.container.appendChild(arrangePanel); + + addClickHandler(label2, textPanel, idx++); + addClickHandler(label3, arrangePanel, idx++); + } +}; + +/** + * Base class for format panels. + */ +BaseFormatPanel = function(format, editorUi, container) +{ + this.format = format; + this.editorUi = editorUi; + this.container = container; + this.listeners = []; +}; + +/** + * + */ +BaseFormatPanel.prototype.buttonBackgroundColor = 'white'; + +/** + * Adds the given color option. + */ +BaseFormatPanel.prototype.getSelectionState = function() +{ + var graph = this.editorUi.editor.graph; + var cells = graph.getSelectionCells(); + var shape = null; + + for (var i = 0; i < cells.length; i++) + { + var state = graph.view.getState(cells[i]); + + if (state != null) + { + var tmp = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + + if (tmp != null) + { + if (shape == null) + { + shape = tmp; + } + else if (shape != tmp) + { + return null; + } + } + + } + } + + return shape; +}; + +/** + * Install input handler. + */ +BaseFormatPanel.prototype.installInputHandler = function(input, key, defaultValue, min, max, unit, textEditFallback, isFloat) +{ + unit = (unit != null) ? unit : ''; + isFloat = (isFloat != null) ? isFloat : false; + + var ui = this.editorUi; + var graph = ui.editor.graph; + + min = (min != null) ? min : 1; + max = (max != null) ? max : 999; + + var selState = null; + var updating = false; + + var update = mxUtils.bind(this, function(evt) + { + var value = (isFloat) ? parseFloat(input.value) : parseInt(input.value); + + // Special case: angle mod 360 + if (!isNaN(value) && key == mxConstants.STYLE_ROTATION) + { + // Workaround for decimal rounding errors in floats is to + // use integer and round all numbers to two decimal point + value = mxUtils.mod(Math.round(value * 100), 36000) / 100; + } + + value = Math.min(max, Math.max(min, (isNaN(value)) ? defaultValue : value)); + + if (graph.cellEditor.isContentEditing() && textEditFallback) + { + if (!updating) + { + updating = true; + + if (selState != null) + { + graph.cellEditor.restoreSelection(selState); + selState = null; + } + + textEditFallback(value); + input.value = value + unit; + + // Restore focus and selection in input + updating = false; + } + } + else if (value != mxUtils.getValue(this.format.getSelectionState().style, key, defaultValue)) + { + if (graph.isEditing()) + { + graph.stopEditing(true); + } + + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + graph.setCellStyles(key, value, cells); + + // Handles special case for fontSize where HTML labels are parsed and updated + if (key == mxConstants.STYLE_FONTSIZE) + { + graph.updateLabelElements(graph.getSelectionCells(), function(elt) + { + elt.style.fontSize = value + 'px'; + elt.removeAttribute('size'); + }); + } + + for (var i = 0; i < cells.length; i++) + { + if (graph.model.getChildCount(cells[i]) == 0) + { + graph.autoSizeCell(cells[i], false); + } + } + + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key], + 'values', [value], 'cells', cells)); + } + finally + { + graph.getModel().endUpdate(); + } + } + + input.value = value + unit; + mxEvent.consume(evt); + }); + + if (textEditFallback && graph.cellEditor.isContentEditing()) + { + // KNOWN: Arrow up/down clear selection text in quirks/IE 8 + // Text size via arrow button limits to 16 in IE11. Why? + mxEvent.addListener(input, 'mousedown', function() + { + if (document.activeElement == graph.cellEditor.textarea) + { + selState = graph.cellEditor.saveSelection(); + } + }); + + mxEvent.addListener(input, 'touchstart', function() + { + if (document.activeElement == graph.cellEditor.textarea) + { + selState = graph.cellEditor.saveSelection(); + } + }); + } + + mxEvent.addListener(input, 'change', update); + mxEvent.addListener(input, 'blur', update); + + return update; +}; + +/** + * Adds the given option. + */ +BaseFormatPanel.prototype.createPanel = function() +{ + var div = document.createElement('div'); + div.className = 'geFormatSection'; + div.style.padding = '12px 0px 12px 18px'; + + return div; +}; + +/** + * Adds the given option. + */ +BaseFormatPanel.prototype.createTitle = function(title) +{ + var div = document.createElement('div'); + div.style.padding = '0px 0px 6px 0px'; + div.style.whiteSpace = 'nowrap'; + div.style.overflow = 'hidden'; + div.style.width = '200px'; + div.style.fontWeight = 'bold'; + mxUtils.write(div, title); + + return div; +}; + +/** + * + */ +BaseFormatPanel.prototype.createStepper = function(input, update, step, height, disableFocus, defaultValue, isFloat) +{ + step = (step != null) ? step : 1; + height = (height != null) ? height : 8; + + if (mxClient.IS_QUIRKS) + { + height = height - 2; + } + else if (mxClient.IS_MT || document.documentMode >= 8) + { + height = height + 1; + } + + var stepper = document.createElement('div'); + mxUtils.setPrefixedStyle(stepper.style, 'borderRadius', '3px'); + stepper.style.border = '1px solid rgb(192, 192, 192)'; + stepper.style.position = 'absolute'; + + var up = document.createElement('div'); + up.style.borderBottom = '1px solid rgb(192, 192, 192)'; + up.style.position = 'relative'; + up.style.height = height + 'px'; + up.style.width = '10px'; + up.className = 'geBtnUp'; + stepper.appendChild(up); + + var down = up.cloneNode(false); + down.style.border = 'none'; + down.style.height = height + 'px'; + down.className = 'geBtnDown'; + stepper.appendChild(down); + + mxEvent.addListener(down, 'click', function(evt) + { + if (input.value == '') + { + input.value = defaultValue || '2'; + } + + var val = isFloat? parseFloat(input.value) : parseInt(input.value); + + if (!isNaN(val)) + { + input.value = val - step; + + if (update != null) + { + update(evt); + } + } + + mxEvent.consume(evt); + }); + + mxEvent.addListener(up, 'click', function(evt) + { + if (input.value == '') + { + input.value = defaultValue || '0'; + } + + var val = isFloat? parseFloat(input.value) : parseInt(input.value); + + if (!isNaN(val)) + { + input.value = val + step; + + if (update != null) + { + update(evt); + } + } + + mxEvent.consume(evt); + }); + + // Disables transfer of focus to DIV but also :active CSS + // so it's only used for fontSize where the focus should + // stay on the selected text, but not for any other input. + if (disableFocus) + { + var currentSelection = null; + + mxEvent.addGestureListeners(stepper, + function(evt) + { + // Workaround for lost current selection in page because of focus in IE + if (mxClient.IS_QUIRKS || document.documentMode == 8) + { + currentSelection = document.selection.createRange(); + } + + mxEvent.consume(evt); + }, + null, + function(evt) + { + // Workaround for lost current selection in page because of focus in IE + if (currentSelection != null) + { + try + { + currentSelection.select(); + } + catch (e) + { + // ignore + } + + currentSelection = null; + mxEvent.consume(evt); + } + } + ); + } + + return stepper; +}; + +/** + * Adds the given option. + */ +BaseFormatPanel.prototype.createOption = function(label, isCheckedFn, setCheckedFn, listener) +{ + var div = document.createElement('div'); + div.style.padding = '6px 0px 1px 0px'; + div.style.whiteSpace = 'nowrap'; + div.style.overflow = 'hidden'; + div.style.width = '200px'; + div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px'; + + var cb = document.createElement('input'); + cb.setAttribute('type', 'checkbox'); + cb.style.margin = '0px 6px 0px 0px'; + div.appendChild(cb); + + var span = document.createElement('span'); + mxUtils.write(span, label); + div.appendChild(span); + + var applying = false; + var value = isCheckedFn(); + + var apply = function(newValue) + { + if (!applying) + { + applying = true; + + if (newValue) + { + cb.setAttribute('checked', 'checked'); + cb.defaultChecked = true; + cb.checked = true; + } + else + { + cb.removeAttribute('checked'); + cb.defaultChecked = false; + cb.checked = false; + } + + if (value != newValue) + { + value = newValue; + + // Checks if the color value needs to be updated in the model + if (isCheckedFn() != value) + { + setCheckedFn(value); + } + } + + applying = false; + } + }; + + mxEvent.addListener(div, 'click', function(evt) + { + if (cb.getAttribute('disabled') != 'disabled') + { + // Toggles checkbox state for click on label + var source = mxEvent.getSource(evt); + + if (source == div || source == span) + { + cb.checked = !cb.checked; + } + + apply(cb.checked); + } + }); + + apply(value); + + if (listener != null) + { + listener.install(apply); + this.listeners.push(listener); + } + + return div; +}; + +/** + * The string 'null' means use null in values. + */ +BaseFormatPanel.prototype.createCellOption = function(label, key, defaultValue, enabledValue, disabledValue, fn, action, stopEditing) +{ + enabledValue = (enabledValue != null) ? ((enabledValue == 'null') ? null : enabledValue) : '1'; + disabledValue = (disabledValue != null) ? ((disabledValue == 'null') ? null : disabledValue) : '0'; + + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + return this.createOption(label, function() + { + // Seems to be null sometimes, not sure why... + var state = graph.view.getState(graph.getSelectionCell()); + + if (state != null) + { + return mxUtils.getValue(state.style, key, defaultValue) != disabledValue; + } + + return null; + }, function(checked) + { + if (stopEditing) + { + graph.stopEditing(); + } + + if (action != null) + { + action.funct(); + } + else + { + graph.getModel().beginUpdate(); + try + { + var value = (checked) ? enabledValue : disabledValue; + graph.setCellStyles(key, value, graph.getSelectionCells()); + + if (fn != null) + { + fn(graph.getSelectionCells(), value); + } + + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key], + 'values', [value], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + } + }, + { + install: function(apply) + { + this.listener = function() + { + // Seems to be null sometimes, not sure why... + var state = graph.view.getState(graph.getSelectionCell()); + + if (state != null) + { + apply(mxUtils.getValue(state.style, key, defaultValue) != disabledValue); + } + }; + + graph.getModel().addListener(mxEvent.CHANGE, this.listener); + }, + destroy: function() + { + graph.getModel().removeListener(this.listener); + } + }); +}; + +/** + * Adds the given color option. + */ +BaseFormatPanel.prototype.createColorOption = function(label, getColorFn, setColorFn, defaultColor, listener, callbackFn, hideCheckbox) +{ + var div = document.createElement('div'); + div.style.padding = '6px 0px 1px 0px'; + div.style.whiteSpace = 'nowrap'; + div.style.overflow = 'hidden'; + div.style.width = '200px'; + div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px'; + + var cb = document.createElement('input'); + cb.setAttribute('type', 'checkbox'); + cb.style.margin = '0px 6px 0px 0px'; + + if (!hideCheckbox) + { + div.appendChild(cb); + } + + var span = document.createElement('span'); + mxUtils.write(span, label); + div.appendChild(span); + + var value = getColorFn(); + var applying = false; + var btn = null; + + var apply = function(color, disableUpdate, forceUpdate) + { + if (!applying) + { + applying = true; + color = (/(^#?[a-zA-Z0-9]*$)/.test(color)) ? color : defaultColor; + btn.innerHTML = '
'; + + // Fine-tuning in Firefox, quirks mode and IE8 standards + if (mxClient.IS_QUIRKS || document.documentMode == 8) + { + btn.firstChild.style.margin = '0px'; + } + + if (color != null && color != mxConstants.NONE) + { + cb.setAttribute('checked', 'checked'); + cb.defaultChecked = true; + cb.checked = true; + } + else + { + cb.removeAttribute('checked'); + cb.defaultChecked = false; + cb.checked = false; + } + + btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none'; + + if (callbackFn != null) + { + callbackFn(color); + } + + if (!disableUpdate) + { + value = color; + + // Checks if the color value needs to be updated in the model + if (forceUpdate || hideCheckbox || getColorFn() != value) + { + setColorFn(value); + } + } + + applying = false; + } + }; + + btn = mxUtils.button('', mxUtils.bind(this, function(evt) + { + this.editorUi.pickColor(value, function(color) + { + apply(color, null, true); + }); + mxEvent.consume(evt); + })); + + btn.style.position = 'absolute'; + btn.style.marginTop = '-4px'; + btn.style.right = (mxClient.IS_QUIRKS) ? '0px' : '20px'; + btn.style.height = '22px'; + btn.className = 'geColorBtn'; + btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none'; + div.appendChild(btn); + + mxEvent.addListener(div, 'click', function(evt) + { + var source = mxEvent.getSource(evt); + + if (source == cb || source.nodeName != 'INPUT') + { + // Toggles checkbox state for click on label + if (source != cb) + { + cb.checked = !cb.checked; + } + + // Overrides default value with current value to make it easier + // to restore previous value if the checkbox is clicked twice + if (!cb.checked && value != null && value != mxConstants.NONE && + defaultColor != mxConstants.NONE) + { + defaultColor = value; + } + + apply((cb.checked) ? defaultColor : mxConstants.NONE); + } + }); + + apply(value, true); + + if (listener != null) + { + listener.install(apply); + this.listeners.push(listener); + } + + return div; +}; + +/** + * + */ +BaseFormatPanel.prototype.createCellColorOption = function(label, colorKey, defaultColor, callbackFn, setStyleFn) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + return this.createColorOption(label, function() + { + // Seems to be null sometimes, not sure why... + var state = graph.view.getState(graph.getSelectionCell()); + + if (state != null) + { + return mxUtils.getValue(state.style, colorKey, null); + } + + return null; + }, function(color) + { + graph.getModel().beginUpdate(); + try + { + if (setStyleFn != null) + { + setStyleFn(color); + } + + graph.setCellStyles(colorKey, color, graph.getSelectionCells()); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [colorKey], + 'values', [color], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + }, defaultColor || mxConstants.NONE, + { + install: function(apply) + { + this.listener = function() + { + // Seems to be null sometimes, not sure why... + var state = graph.view.getState(graph.getSelectionCell()); + + if (state != null) + { + apply(mxUtils.getValue(state.style, colorKey, null)); + } + }; + + graph.getModel().addListener(mxEvent.CHANGE, this.listener); + }, + destroy: function() + { + graph.getModel().removeListener(this.listener); + } + }, callbackFn); +}; + +/** + * + */ +BaseFormatPanel.prototype.addArrow = function(elt, height) +{ + height = (height != null) ? height : 10; + + var arrow = document.createElement('div'); + arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; + arrow.style.padding = '6px'; + arrow.style.paddingRight = '4px'; + + var m = (10 - height); + + if (m == 2) + { + arrow.style.paddingTop = 6 + 'px'; + } + else if (m > 0) + { + arrow.style.paddingTop = (6 - m) + 'px'; + } + else + { + arrow.style.marginTop = '-2px'; + } + + arrow.style.height = height + 'px'; + arrow.style.borderLeft = '1px solid #a0a0a0'; + arrow.innerHTML = ''; + mxUtils.setOpacity(arrow, 70); + + var symbol = elt.getElementsByTagName('div')[0]; + + if (symbol != null) + { + symbol.style.paddingRight = '6px'; + symbol.style.marginLeft = '4px'; + symbol.style.marginTop = '-1px'; + symbol.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; + mxUtils.setOpacity(symbol, 60); + } + + mxUtils.setOpacity(elt, 100); + elt.style.border = '1px solid #a0a0a0'; + elt.style.backgroundColor = this.buttonBackgroundColor; + elt.style.backgroundImage = 'none'; + elt.style.width = 'auto'; + elt.className += ' geColorBtn'; + mxUtils.setPrefixedStyle(elt.style, 'borderRadius', '3px'); + + elt.appendChild(arrow); + + return symbol; +}; + +/** + * + */ +BaseFormatPanel.prototype.addUnitInput = function(container, unit, right, width, update, step, marginTop, disableFocus, isFloat) +{ + marginTop = (marginTop != null) ? marginTop : 0; + + var input = document.createElement('input'); + input.style.position = 'absolute'; + input.style.textAlign = 'right'; + input.style.marginTop = '-2px'; + input.style.right = (right + 12) + 'px'; + input.style.width = width + 'px'; + container.appendChild(input); + + var stepper = this.createStepper(input, update, step, null, disableFocus, null, isFloat); + stepper.style.marginTop = (marginTop - 2) + 'px'; + stepper.style.right = right + 'px'; + container.appendChild(stepper); + + return input; +}; + +/** + * + */ +BaseFormatPanel.prototype.createRelativeOption = function(label, key, width, handler, init) +{ + width = (width != null) ? width : 44; + + var graph = this.editorUi.editor.graph; + var div = this.createPanel(); + div.style.paddingTop = '10px'; + div.style.paddingBottom = '10px'; + mxUtils.write(div, label); + div.style.fontWeight = 'bold'; + + var update = mxUtils.bind(this, function(evt) + { + if (handler != null) + { + handler(input); + } + else + { + var value = parseInt(input.value); + value = Math.min(100, Math.max(0, (isNaN(value)) ? 100 : value)); + var state = graph.view.getState(graph.getSelectionCell()); + + if (state != null && value != mxUtils.getValue(state.style, key, 100)) + { + // Removes entry in style (assumes 100 is default for relative values) + if (value == 100) + { + value = null; + } + + graph.setCellStyles(key, value, graph.getSelectionCells()); + this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [key], + 'values', [value], 'cells', graph.getSelectionCells())); + } + + input.value = ((value != null) ? value : '100') + ' %'; + } + + mxEvent.consume(evt); + }); + + var input = this.addUnitInput(div, '%', 20, width, update, 10, -15, handler != null); + + if (key != null) + { + var listener = mxUtils.bind(this, function(sender, evt, force) + { + if (force || input != document.activeElement) + { + var ss = this.format.getSelectionState(); + var tmp = parseInt(mxUtils.getValue(ss.style, key, 100)); + input.value = (isNaN(tmp)) ? '' : tmp + ' %'; + } + }); + + mxEvent.addListener(input, 'keydown', function(e) + { + if (e.keyCode == 13) + { + graph.container.focus(); + mxEvent.consume(e); + } + else if (e.keyCode == 27) + { + listener(null, null, true); + graph.container.focus(); + mxEvent.consume(e); + } + }); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + } + + mxEvent.addListener(input, 'blur', update); + mxEvent.addListener(input, 'change', update); + + if (init != null) + { + init(input); + } + + return div; +}; + +/** + * + */ +BaseFormatPanel.prototype.addLabel = function(div, title, right, width) +{ + width = (width != null) ? width : 61; + + var label = document.createElement('div'); + mxUtils.write(label, title); + label.style.position = 'absolute'; + label.style.right = right + 'px'; + label.style.width = width + 'px'; + label.style.marginTop = '6px'; + label.style.textAlign = 'center'; + div.appendChild(label); +}; + +/** + * + */ +BaseFormatPanel.prototype.addKeyHandler = function(input, listener) +{ + mxEvent.addListener(input, 'keydown', mxUtils.bind(this, function(e) + { + if (e.keyCode == 13) + { + this.editorUi.editor.graph.container.focus(); + mxEvent.consume(e); + } + else if (e.keyCode == 27) + { + if (listener != null) + { + listener(null, null, true); + } + + this.editorUi.editor.graph.container.focus(); + mxEvent.consume(e); + } + })); +}; + +/** + * + */ +BaseFormatPanel.prototype.styleButtons = function(elts) +{ + for (var i = 0; i < elts.length; i++) + { + mxUtils.setPrefixedStyle(elts[i].style, 'borderRadius', '3px'); + mxUtils.setOpacity(elts[i], 100); + elts[i].style.border = '1px solid #a0a0a0'; + elts[i].style.padding = '4px'; + elts[i].style.paddingTop = '3px'; + elts[i].style.paddingRight = '1px'; + elts[i].style.margin = '1px'; + elts[i].style.width = '24px'; + elts[i].style.height = '20px'; + elts[i].className += ' geColorBtn'; + } +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +BaseFormatPanel.prototype.destroy = function() +{ + if (this.listeners != null) + { + for (var i = 0; i < this.listeners.length; i++) + { + this.listeners[i].destroy(); + } + + this.listeners = null; + } +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +ArrangePanel = function(format, editorUi, container) +{ + BaseFormatPanel.call(this, format, editorUi, container); + this.init(); +}; + +mxUtils.extend(ArrangePanel, BaseFormatPanel); + +/** + * Adds the label menu items to the given menu and parent. + */ +ArrangePanel.prototype.init = function() +{ + var graph = this.editorUi.editor.graph; + var ss = this.format.getSelectionState(); + + this.container.appendChild(this.addLayerOps(this.createPanel())); + // Special case that adds two panels + this.addGeometry(this.container); + this.addEdgeGeometry(this.container); + + if (!ss.containsLabel || ss.edges.length == 0) + { + this.container.appendChild(this.addAngle(this.createPanel())); + } + + if (!ss.containsLabel && ss.edges.length == 0 && + ss.style.shape != 'rectangle' && + ss.style.shape != 'label') + { + this.container.appendChild(this.addFlip(this.createPanel())); + } + + if (ss.vertices.length > 1) + { + this.container.appendChild(this.addAlign(this.createPanel())); + this.container.appendChild(this.addDistribute(this.createPanel())); + } + else if (ss.vertices.length == 1 && ss.edges.length == 0 && + (graph.isTable(ss.vertices[0]) || + graph.isTableRow(ss.vertices[0]) || + graph.isTableCell(ss.vertices[0]))) + { + this.container.appendChild(this.addTable(this.createPanel())); + } + + this.container.appendChild(this.addGroupOps(this.createPanel())); + + if (ss.containsLabel) + { + // Adds functions from hidden style format panel + var span = document.createElement('div'); + span.style.width = '100%'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + span.style.padding = '10px 0 0 18px'; + mxUtils.write(span, mxResources.get('style')); + this.container.appendChild(span); + + new StyleFormatPanel(this.format, this.editorUi, this.container); + } +}; + +/** + * + */ +ArrangePanel.prototype.addTable = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + var ss = this.format.getSelectionState(); + div.style.paddingTop = '6px'; + div.style.paddingBottom = '10px'; + + var span = document.createElement('div'); + span.style.marginTop = '2px'; + span.style.marginBottom = '8px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, mxResources.get('table')); + div.appendChild(span); + + var panel = document.createElement('div'); + panel.style.position = 'relative'; + panel.style.paddingLeft = '0px'; + panel.style.borderWidth = '0px'; + panel.className = 'geToolbarContainer'; + + var btns = [ + ui.toolbar.addButton('geSprite-insertcolumnbefore', mxResources.get('insertColumnBefore'), + mxUtils.bind(this, function() + { + try + { + graph.insertTableColumn(ss.vertices[0], true); + } + catch (e) + { + ui.handleError(e); + } + }), panel), + ui.toolbar.addButton('geSprite-insertcolumnafter', mxResources.get('insertColumnAfter'), + mxUtils.bind(this, function() + { + try + { + graph.insertTableColumn(ss.vertices[0], false); + } + catch (e) + { + ui.handleError(e); + } + }), panel), + ui.toolbar.addButton('geSprite-deletecolumn', mxResources.get('deleteColumn'), + mxUtils.bind(this, function() + { + try + { + graph.deleteTableColumn(ss.vertices[0]); + } + catch (e) + { + ui.handleError(e); + } + }), panel), + ui.toolbar.addButton('geSprite-insertrowbefore', mxResources.get('insertRowBefore'), + mxUtils.bind(this, function() + { + try + { + graph.insertTableRow(ss.vertices[0], true); + } + catch (e) + { + ui.handleError(e); + } + }), panel), + ui.toolbar.addButton('geSprite-insertrowafter', mxResources.get('insertRowAfter'), + mxUtils.bind(this, function() + { + try + { + graph.insertTableRow(ss.vertices[0], false); + } + catch (e) + { + ui.handleError(e); + } + }), panel), + ui.toolbar.addButton('geSprite-deleterow', mxResources.get('deleteRow'), + mxUtils.bind(this, function() + { + try + { + graph.deleteTableRow(ss.vertices[0]); + } + catch (e) + { + ui.handleError(e); + } + }), panel)]; + this.styleButtons(btns); + div.appendChild(panel); + btns[2].style.marginRight = '9px'; + + return div; +}; + +/** + * + */ +ArrangePanel.prototype.addLayerOps = function(div) +{ + var ui = this.editorUi; + + var btn = mxUtils.button(mxResources.get('toFront'), function(evt) + { + ui.actions.get('toFront').funct(); + }) + + btn.setAttribute('title', mxResources.get('toFront') + ' (' + this.editorUi.actions.get('toFront').shortcut + ')'); + btn.style.width = '100px'; + btn.style.marginRight = '2px'; + div.appendChild(btn); + + var btn = mxUtils.button(mxResources.get('toBack'), function(evt) + { + ui.actions.get('toBack').funct(); + }) + + btn.setAttribute('title', mxResources.get('toBack') + ' (' + this.editorUi.actions.get('toBack').shortcut + ')'); + btn.style.width = '100px'; + div.appendChild(btn); + + return div; +}; + +/** + * + */ +ArrangePanel.prototype.addGroupOps = function(div) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var cell = graph.getSelectionCell(); + var ss = this.format.getSelectionState(); + var count = 0; + var btn = null; + + div.style.paddingTop = '8px'; + div.style.paddingBottom = '6px'; + + if (graph.getSelectionCount() > 1) + { + btn = mxUtils.button(mxResources.get('group'), function(evt) + { + ui.actions.get('group').funct(); + }) + + btn.setAttribute('title', mxResources.get('group') + ' (' + this.editorUi.actions.get('group').shortcut + ')'); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + count++; + } + else if (graph.getSelectionCount() == 1 && !graph.getModel().isEdge(cell) && !graph.isSwimlane(cell) && + graph.getModel().getChildCount(cell) > 0) + { + btn = mxUtils.button(mxResources.get('ungroup'), function(evt) + { + ui.actions.get('ungroup').funct(); + }) + + btn.setAttribute('title', mxResources.get('ungroup') + ' (' + + this.editorUi.actions.get('ungroup').shortcut + ')'); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + count++; + } + + if (ss.vertices.length > 0) + { + if (count > 0) + { + mxUtils.br(div); + count = 0; + } + + var btn = mxUtils.button(mxResources.get('copySize'), function(evt) + { + ui.actions.get('copySize').funct(); + }); + + btn.setAttribute('title', mxResources.get('copySize') + ' (' + + this.editorUi.actions.get('copySize').shortcut + ')'); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + + div.appendChild(btn); + count++; + + if (ui.copiedSize != null) + { + var btn2 = mxUtils.button(mxResources.get('pasteSize'), function(evt) + { + ui.actions.get('pasteSize').funct(); + }); + + btn2.setAttribute('title', mxResources.get('pasteSize') + ' (' + + this.editorUi.actions.get('pasteSize').shortcut + ')'); + + div.appendChild(btn2); + count++; + + btn.style.width = '100px'; + btn.style.marginBottom = '2px'; + btn2.style.width = '100px'; + btn2.style.marginBottom = '2px'; + } + } + + if (graph.getSelectionCount() == 1 && graph.getModel().isVertex(cell) && + graph.getModel().isVertex(graph.getModel().getParent(cell))) + { + if (count > 0) + { + mxUtils.br(div); + } + + btn = mxUtils.button(mxResources.get('removeFromGroup'), function(evt) + { + ui.actions.get('removeFromGroup').funct(); + }) + + btn.setAttribute('title', mxResources.get('removeFromGroup')); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + count++; + } + else if (graph.getSelectionCount() > 0) + { + if (count > 0) + { + mxUtils.br(div); + } + + btn = mxUtils.button(mxResources.get('clearWaypoints'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('clearWaypoints').funct(); + })); + + btn.setAttribute('title', mxResources.get('clearWaypoints') + ' (' + this.editorUi.actions.get('clearWaypoints').shortcut + ')'); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + + count++; + } + + if (graph.getSelectionCount() == 1) + { + if (count > 0) + { + mxUtils.br(div); + } + + btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('editData').funct(); + })); + + btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')'); + btn.style.width = '100px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + count++; + + btn = mxUtils.button(mxResources.get('editLink'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('editLink').funct(); + })); + + btn.setAttribute('title', mxResources.get('editLink')); + btn.style.width = '100px'; + btn.style.marginLeft = '2px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + count++; + } + + if (count == 0) + { + div.style.display = 'none'; + } + + return div; +}; + +/** + * + */ +ArrangePanel.prototype.addAlign = function(div) +{ + var graph = this.editorUi.editor.graph; + div.style.paddingTop = '6px'; + div.style.paddingBottom = '12px'; + div.appendChild(this.createTitle(mxResources.get('align'))); + + var stylePanel = document.createElement('div'); + stylePanel.style.position = 'relative'; + stylePanel.style.paddingLeft = '0px'; + stylePanel.style.borderWidth = '0px'; + stylePanel.className = 'geToolbarContainer'; + + if (mxClient.IS_QUIRKS) + { + div.style.height = '60px'; + } + + var left = this.editorUi.toolbar.addButton('geSprite-alignleft', mxResources.get('left'), + function() { graph.alignCells(mxConstants.ALIGN_LEFT); }, stylePanel); + var center = this.editorUi.toolbar.addButton('geSprite-aligncenter', mxResources.get('center'), + function() { graph.alignCells(mxConstants.ALIGN_CENTER); }, stylePanel); + var right = this.editorUi.toolbar.addButton('geSprite-alignright', mxResources.get('right'), + function() { graph.alignCells(mxConstants.ALIGN_RIGHT); }, stylePanel); + + var top = this.editorUi.toolbar.addButton('geSprite-aligntop', mxResources.get('top'), + function() { graph.alignCells(mxConstants.ALIGN_TOP); }, stylePanel); + var middle = this.editorUi.toolbar.addButton('geSprite-alignmiddle', mxResources.get('middle'), + function() { graph.alignCells(mxConstants.ALIGN_MIDDLE); }, stylePanel); + var bottom = this.editorUi.toolbar.addButton('geSprite-alignbottom', mxResources.get('bottom'), + function() { graph.alignCells(mxConstants.ALIGN_BOTTOM); }, stylePanel); + + this.styleButtons([left, center, right, top, middle, bottom]); + right.style.marginRight = '6px'; + div.appendChild(stylePanel); + + return div; +}; + +/** + * + */ +ArrangePanel.prototype.addFlip = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + div.style.paddingTop = '6px'; + div.style.paddingBottom = '10px'; + + var span = document.createElement('div'); + span.style.marginTop = '2px'; + span.style.marginBottom = '8px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, mxResources.get('flip')); + div.appendChild(span); + + var btn = mxUtils.button(mxResources.get('horizontal'), function(evt) + { + graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false); + }) + + btn.setAttribute('title', mxResources.get('horizontal')); + btn.style.width = '100px'; + btn.style.marginRight = '2px'; + div.appendChild(btn); + + var btn = mxUtils.button(mxResources.get('vertical'), function(evt) + { + graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false); + }) + + btn.setAttribute('title', mxResources.get('vertical')); + btn.style.width = '100px'; + div.appendChild(btn); + + return div; +}; + +/** + * + */ +ArrangePanel.prototype.addDistribute = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + div.style.paddingTop = '6px'; + div.style.paddingBottom = '12px'; + + div.appendChild(this.createTitle(mxResources.get('distribute'))); + + var btn = mxUtils.button(mxResources.get('horizontal'), function(evt) + { + graph.distributeCells(true); + }) + + btn.setAttribute('title', mxResources.get('horizontal')); + btn.style.width = '100px'; + btn.style.marginRight = '2px'; + div.appendChild(btn); + + var btn = mxUtils.button(mxResources.get('vertical'), function(evt) + { + graph.distributeCells(false); + }) + + btn.setAttribute('title', mxResources.get('vertical')); + btn.style.width = '100px'; + div.appendChild(btn); + + return div; +}; + +/** + * + */ +ArrangePanel.prototype.addAngle = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + var ss = this.format.getSelectionState(); + + div.style.paddingBottom = '8px'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '70px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + + var input = null; + var update = null; + var btn = null; + + if (ss.edges.length == 0) + { + mxUtils.write(span, mxResources.get('angle')); + div.appendChild(span); + + input = this.addUnitInput(div, '°', 20, 44, function() + { + update.apply(this, arguments); + }); + + mxUtils.br(div); + div.style.paddingTop = '10px'; + } + else + { + div.style.paddingTop = '8px'; + } + + if (!ss.containsLabel) + { + var label = mxResources.get('reverse'); + + if (ss.vertices.length > 0 && ss.edges.length > 0) + { + label = mxResources.get('turn') + ' / ' + label; + } + else if (ss.vertices.length > 0) + { + label = mxResources.get('turn'); + } + + btn = mxUtils.button(label, function(evt) + { + ui.actions.get('turn').funct(evt); + }) + + btn.setAttribute('title', label + ' (' + this.editorUi.actions.get('turn').shortcut + ')'); + btn.style.width = '202px'; + div.appendChild(btn); + + if (input != null) + { + btn.style.marginTop = '8px'; + } + } + + if (input != null) + { + var listener = mxUtils.bind(this, function(sender, evt, force) + { + if (force || document.activeElement != input) + { + ss = this.format.getSelectionState(); + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_ROTATION, 0)); + input.value = (isNaN(tmp)) ? '' : tmp + '°'; + } + }); + + update = this.installInputHandler(input, mxConstants.STYLE_ROTATION, 0, 0, 360, '°', null, true); + this.addKeyHandler(input, listener); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + } + + return div; +}; + +BaseFormatPanel.prototype.getUnit = function() +{ + var unit = this.editorUi.editor.graph.view.unit; + + switch(unit) + { + case mxConstants.POINTS: + return 'pt'; + case mxConstants.INCHES: + return '"'; + case mxConstants.MILLIMETERS: + return 'mm'; + } +}; + +BaseFormatPanel.prototype.inUnit = function(pixels) +{ + return this.editorUi.editor.graph.view.formatUnitText(pixels); +}; + +BaseFormatPanel.prototype.fromUnit = function(value) +{ + var unit = this.editorUi.editor.graph.view.unit; + + switch(unit) + { + case mxConstants.POINTS: + return value; + case mxConstants.INCHES: + return value * mxConstants.PIXELS_PER_INCH; + case mxConstants.MILLIMETERS: + return value * mxConstants.PIXELS_PER_MM; + } +}; + +BaseFormatPanel.prototype.isFloatUnit = function() +{ + return this.editorUi.editor.graph.view.unit != mxConstants.POINTS; +}; + +BaseFormatPanel.prototype.getUnitStep = function() +{ + var unit = this.editorUi.editor.graph.view.unit; + + switch(unit) + { + case mxConstants.POINTS: + return 1; + case mxConstants.INCHES: + return 0.1; + case mxConstants.MILLIMETERS: + return 0.5; + } +}; + +/** + * + */ +ArrangePanel.prototype.addGeometry = function(container) +{ + var panel = this; + var ui = this.editorUi; + var graph = ui.editor.graph; + var rect = this.format.getSelectionState(); + + var div = this.createPanel(); + div.style.paddingBottom = '8px'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '50px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, mxResources.get('size')); + div.appendChild(span); + + var widthUpdate, heightUpdate, leftUpdate, topUpdate; + var width = this.addUnitInput(div, this.getUnit(), 84, 44, function() + { + widthUpdate.apply(this, arguments); + }, this.getUnitStep(), null, null, this.isFloatUnit()); + var height = this.addUnitInput(div, this.getUnit(), 20, 44, function() + { + heightUpdate.apply(this, arguments); + }, this.getUnitStep(), null, null, this.isFloatUnit()); + + var autosizeBtn = document.createElement('div'); + autosizeBtn.className = 'geSprite geSprite-fit'; + autosizeBtn.setAttribute('title', mxResources.get('autosize') + ' (' + this.editorUi.actions.get('autosize').shortcut + ')'); + autosizeBtn.style.position = 'relative'; + autosizeBtn.style.cursor = 'pointer'; + autosizeBtn.style.marginTop = '-3px'; + autosizeBtn.style.border = '0px'; + autosizeBtn.style.left = '52px'; + mxUtils.setOpacity(autosizeBtn, 50); + + mxEvent.addListener(autosizeBtn, 'mouseenter', function() + { + mxUtils.setOpacity(autosizeBtn, 100); + }); + + mxEvent.addListener(autosizeBtn, 'mouseleave', function() + { + mxUtils.setOpacity(autosizeBtn, 50); + }); + + mxEvent.addListener(autosizeBtn, 'click', function() + { + ui.actions.get('autosize').funct(); + }); + + div.appendChild(autosizeBtn); + this.addLabel(div, mxResources.get('width'), 84); + this.addLabel(div, mxResources.get('height'), 20); + mxUtils.br(div); + + var wrapper = document.createElement('div'); + wrapper.style.paddingTop = '8px'; + wrapper.style.paddingRight = '20px'; + wrapper.style.whiteSpace = 'nowrap'; + wrapper.style.textAlign = 'right'; + var opt = this.createCellOption(mxResources.get('constrainProportions'), + mxConstants.STYLE_ASPECT, null, 'fixed', 'null'); + opt.style.width = '100%'; + wrapper.appendChild(opt); + div.appendChild(wrapper); + + var constrainCheckbox = opt.getElementsByTagName('input')[0]; + this.addKeyHandler(width, listener); + this.addKeyHandler(height, listener); + + widthUpdate = this.addGeometryHandler(width, function(geo, value) + { + if (geo.width > 0) + { + var value = Math.max(1, panel.fromUnit(value)); + + if (constrainCheckbox.checked) + { + geo.height = Math.round((geo.height * value * 100) / geo.width) / 100; + } + + geo.width = value; + } + }); + heightUpdate = this.addGeometryHandler(height, function(geo, value) + { + if (geo.height > 0) + { + var value = Math.max(1, panel.fromUnit(value)); + + if (constrainCheckbox.checked) + { + geo.width = Math.round((geo.width * value * 100) / geo.height) / 100; + } + + geo.height = value; + } + }); + + container.appendChild(div); + + var div2 = this.createPanel(); + div2.style.paddingBottom = '30px'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '70px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, mxResources.get('position')); + div2.appendChild(span); + + var left = this.addUnitInput(div2, this.getUnit(), 84, 44, function() + { + leftUpdate.apply(this, arguments); + }, this.getUnitStep(), null, null, this.isFloatUnit()); + var top = this.addUnitInput(div2, this.getUnit(), 20, 44, function() + { + topUpdate.apply(this, arguments); + }, this.getUnitStep(), null, null, this.isFloatUnit()); + + mxUtils.br(div2); + this.addLabel(div2, mxResources.get('left'), 84); + this.addLabel(div2, mxResources.get('top'), 20); + + var listener = mxUtils.bind(this, function(sender, evt, force) + { + rect = this.format.getSelectionState(); + + if (!rect.containsLabel && rect.vertices.length == graph.getSelectionCount() && + rect.width != null && rect.height != null) + { + div.style.display = ''; + + if (force || document.activeElement != width) + { + width.value = this.inUnit(rect.width) + ((rect.width == '') ? '' : ' ' + this.getUnit()); + } + + if (force || document.activeElement != height) + { + height.value = this.inUnit(rect.height) + ((rect.height == '') ? '' : ' ' + this.getUnit()); + } + } + else + { + div.style.display = 'none'; + } + + if (rect.vertices.length == graph.getSelectionCount() && + rect.x != null && rect.y != null) + { + div2.style.display = ''; + + if (force || document.activeElement != left) + { + left.value = this.inUnit(rect.x) + ((rect.x == '') ? '' : ' ' + this.getUnit()); + } + + if (force || document.activeElement != top) + { + top.value = this.inUnit(rect.y) + ((rect.y == '') ? '' : ' ' + this.getUnit()); + } + } + else + { + div2.style.display = 'none'; + } + }); + + this.addKeyHandler(left, listener); + this.addKeyHandler(top, listener); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + + leftUpdate = this.addGeometryHandler(left, function(geo, value) + { + value = panel.fromUnit(value); + + if (geo.relative) + { + geo.offset.x = value; + } + else + { + geo.x = value; + } + }); + topUpdate = this.addGeometryHandler(top, function(geo, value) + { + value = panel.fromUnit(value); + + if (geo.relative) + { + geo.offset.y = value; + } + else + { + geo.y = value; + } + }); + + container.appendChild(div2); +}; + +/** + * + */ +ArrangePanel.prototype.addGeometryHandler = function(input, fn) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var initialValue = null; + var panel = this; + + function update(evt) + { + if (input.value != '') + { + var value = parseFloat(input.value); + + if (isNaN(value)) + { + input.value = initialValue + ' ' + panel.getUnit(); + } + else if (value != initialValue) + { + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + + for (var i = 0; i < cells.length; i++) + { + if (graph.getModel().isVertex(cells[i])) + { + var geo = graph.getCellGeometry(cells[i]); + + if (geo != null) + { + geo = geo.clone(); + fn(geo, value); + + var state = graph.view.getState(cells[i]); + + if (state != null && graph.isRecursiveVertexResize(state)) + { + graph.resizeChildCells(cells[i], geo); + } + + graph.getModel().setGeometry(cells[i], geo); + graph.constrainChildCells(cells[i]); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + + initialValue = value; + input.value = value + ' ' + panel.getUnit(); + } + } + + mxEvent.consume(evt); + }; + + mxEvent.addListener(input, 'blur', update); + mxEvent.addListener(input, 'change', update); + mxEvent.addListener(input, 'focus', function() + { + initialValue = input.value; + }); + + return update; +}; + +ArrangePanel.prototype.addEdgeGeometryHandler = function(input, fn) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var initialValue = null; + + function update(evt) + { + if (input.value != '') + { + var value = parseFloat(input.value); + + if (isNaN(value)) + { + input.value = initialValue + ' pt'; + } + else if (value != initialValue) + { + graph.getModel().beginUpdate(); + try + { + var cells = graph.getSelectionCells(); + + for (var i = 0; i < cells.length; i++) + { + if (graph.getModel().isEdge(cells[i])) + { + var geo = graph.getCellGeometry(cells[i]); + + if (geo != null) + { + geo = geo.clone(); + fn(geo, value); + + graph.getModel().setGeometry(cells[i], geo); + } + } + } + } + finally + { + graph.getModel().endUpdate(); + } + + initialValue = value; + input.value = value + ' pt'; + } + } + + mxEvent.consume(evt); + }; + + mxEvent.addListener(input, 'blur', update); + mxEvent.addListener(input, 'change', update); + mxEvent.addListener(input, 'focus', function() + { + initialValue = input.value; + }); + + return update; +}; + +/** + * + */ +ArrangePanel.prototype.addEdgeGeometry = function(container) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var rect = this.format.getSelectionState(); + + var div = this.createPanel(); + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '70px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, mxResources.get('width')); + div.appendChild(span); + + var widthUpdate, xtUpdate, ytUpdate, xsUpdate, ysUpdate; + var width = this.addUnitInput(div, 'pt', 20, 44, function() + { + widthUpdate.apply(this, arguments); + }); + + mxUtils.br(div); + this.addKeyHandler(width, listener); + + function widthUpdate(evt) + { + // Maximum stroke width is 999 + var value = parseInt(width.value); + value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); + + if (value != mxUtils.getValue(rect.style, 'width', mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth)) + { + graph.setCellStyles('width', value, graph.getSelectionCells()); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['width'], + 'values', [value], 'cells', graph.getSelectionCells())); + } + + width.value = value + ' pt'; + mxEvent.consume(evt); + }; + + mxEvent.addListener(width, 'blur', widthUpdate); + mxEvent.addListener(width, 'change', widthUpdate); + + container.appendChild(div); + + var divs = this.createPanel(); + divs.style.paddingBottom = '30px'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '70px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, 'Start'); + divs.appendChild(span); + + var xs = this.addUnitInput(divs, 'pt', 84, 44, function() + { + xsUpdate.apply(this, arguments); + }); + var ys = this.addUnitInput(divs, 'pt', 20, 44, function() + { + ysUpdate.apply(this, arguments); + }); + + mxUtils.br(divs); + this.addLabel(divs, mxResources.get('left'), 84); + this.addLabel(divs, mxResources.get('top'), 20); + container.appendChild(divs); + this.addKeyHandler(xs, listener); + this.addKeyHandler(ys, listener); + + var divt = this.createPanel(); + divt.style.paddingBottom = '30px'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '70px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, 'End'); + divt.appendChild(span); + + var xt = this.addUnitInput(divt, 'pt', 84, 44, function() + { + xtUpdate.apply(this, arguments); + }); + var yt = this.addUnitInput(divt, 'pt', 20, 44, function() + { + ytUpdate.apply(this, arguments); + }); + + mxUtils.br(divt); + this.addLabel(divt, mxResources.get('left'), 84); + this.addLabel(divt, mxResources.get('top'), 20); + container.appendChild(divt); + this.addKeyHandler(xt, listener); + this.addKeyHandler(yt, listener); + + var listener = mxUtils.bind(this, function(sender, evt, force) + { + rect = this.format.getSelectionState(); + var cell = graph.getSelectionCell(); + + if (rect.style.shape == 'link' || rect.style.shape == 'flexArrow') + { + div.style.display = ''; + + if (force || document.activeElement != width) + { + var value = mxUtils.getValue(rect.style, 'width', + mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth); + width.value = value + ' pt'; + } + } + else + { + div.style.display = 'none'; + } + + if (graph.getSelectionCount() == 1 && graph.model.isEdge(cell)) + { + var geo = graph.model.getGeometry(cell); + + if (geo.sourcePoint != null && graph.model.getTerminal(cell, true) == null) + { + xs.value = geo.sourcePoint.x; + ys.value = geo.sourcePoint.y; + } + else + { + divs.style.display = 'none'; + } + + if (geo.targetPoint != null && graph.model.getTerminal(cell, false) == null) + { + xt.value = geo.targetPoint.x; + yt.value = geo.targetPoint.y; + } + else + { + divt.style.display = 'none'; + } + } + else + { + divs.style.display = 'none'; + divt.style.display = 'none'; + } + }); + + xsUpdate = this.addEdgeGeometryHandler(xs, function(geo, value) + { + geo.sourcePoint.x = value; + }); + + ysUpdate = this.addEdgeGeometryHandler(ys, function(geo, value) + { + geo.sourcePoint.y = value; + }); + + xtUpdate = this.addEdgeGeometryHandler(xt, function(geo, value) + { + geo.targetPoint.x = value; + }); + + ytUpdate = this.addEdgeGeometryHandler(yt, function(geo, value) + { + geo.targetPoint.y = value; + }); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +TextFormatPanel = function(format, editorUi, container) +{ + BaseFormatPanel.call(this, format, editorUi, container); + this.init(); +}; + +mxUtils.extend(TextFormatPanel, BaseFormatPanel); + +/** + * Adds the label menu items to the given menu and parent. + */ +TextFormatPanel.prototype.init = function() +{ + this.container.style.borderBottom = 'none'; + this.addFont(this.container); +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +TextFormatPanel.prototype.addFont = function(container) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + var ss = this.format.getSelectionState(); + + var title = this.createTitle(mxResources.get('font')); + title.style.paddingLeft = '18px'; + title.style.paddingTop = '10px'; + title.style.paddingBottom = '6px'; + container.appendChild(title); + + var stylePanel = this.createPanel(); + stylePanel.style.paddingTop = '2px'; + stylePanel.style.paddingBottom = '2px'; + stylePanel.style.position = 'relative'; + stylePanel.style.marginLeft = '-2px'; + stylePanel.style.borderWidth = '0px'; + stylePanel.className = 'geToolbarContainer'; + + if (mxClient.IS_QUIRKS) + { + stylePanel.style.display = 'block'; + } + + if (graph.cellEditor.isContentEditing()) + { + var cssPanel = stylePanel.cloneNode(); + + var cssMenu = this.editorUi.toolbar.addMenu(mxResources.get('style'), + mxResources.get('style'), true, 'formatBlock', cssPanel, null, true); + cssMenu.style.color = 'rgb(112, 112, 112)'; + cssMenu.style.whiteSpace = 'nowrap'; + cssMenu.style.overflow = 'hidden'; + cssMenu.style.margin = '0px'; + this.addArrow(cssMenu); + cssMenu.style.width = '192px'; + cssMenu.style.height = '15px'; + + var arrow = cssMenu.getElementsByTagName('div')[0]; + arrow.style.cssFloat = 'right'; + container.appendChild(cssPanel); + } + + container.appendChild(stylePanel); + + var colorPanel = this.createPanel(); + colorPanel.style.marginTop = '8px'; + colorPanel.style.borderTop = '1px solid #c0c0c0'; + colorPanel.style.paddingTop = '6px'; + colorPanel.style.paddingBottom = '6px'; + + var fontMenu = this.editorUi.toolbar.addMenu('Helvetica', mxResources.get('fontFamily'), + true, 'fontFamily', stylePanel, null, true); + fontMenu.style.color = 'rgb(112, 112, 112)'; + fontMenu.style.whiteSpace = 'nowrap'; + fontMenu.style.overflow = 'hidden'; + fontMenu.style.margin = '0px'; + + this.addArrow(fontMenu); + fontMenu.style.width = '192px'; + fontMenu.style.height = '15px'; + + var stylePanel2 = stylePanel.cloneNode(false); + stylePanel2.style.marginLeft = '-3px'; + var fontStyleItems = this.editorUi.toolbar.addItems(['bold', 'italic', 'underline'], stylePanel2, true); + fontStyleItems[0].setAttribute('title', mxResources.get('bold') + ' (' + this.editorUi.actions.get('bold').shortcut + ')'); + fontStyleItems[1].setAttribute('title', mxResources.get('italic') + ' (' + this.editorUi.actions.get('italic').shortcut + ')'); + fontStyleItems[2].setAttribute('title', mxResources.get('underline') + ' (' + this.editorUi.actions.get('underline').shortcut + ')'); + + var verticalItem = this.editorUi.toolbar.addItems(['vertical'], stylePanel2, true)[0]; + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(container); + } + + container.appendChild(stylePanel2); + + this.styleButtons(fontStyleItems); + this.styleButtons([verticalItem]); + + var stylePanel3 = stylePanel.cloneNode(false); + stylePanel3.style.marginLeft = '-3px'; + stylePanel3.style.paddingBottom = '0px'; + + // Helper function to return a wrapper function does not pass any arguments + var callFn = function(fn) + { + return function() + { + return fn(); + }; + }; + + var left = this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'), + (graph.cellEditor.isContentEditing()) ? + function(evt) + { + graph.cellEditor.alignText(mxConstants.ALIGN_LEFT, evt); + } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT])), stylePanel3); + var center = this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'), + (graph.cellEditor.isContentEditing()) ? + function(evt) + { + graph.cellEditor.alignText(mxConstants.ALIGN_CENTER, evt); + } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER])), stylePanel3); + var right = this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'), + (graph.cellEditor.isContentEditing()) ? + function(evt) + { + graph.cellEditor.alignText(mxConstants.ALIGN_RIGHT, evt); + } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT])), stylePanel3); + + this.styleButtons([left, center, right]); + + // Quick hack for strikethrough + // TODO: Add translations and toggle state + if (graph.cellEditor.isContentEditing()) + { + var strike = this.editorUi.toolbar.addButton('geSprite-removeformat', mxResources.get('strikethrough'), + function() + { + document.execCommand('strikeThrough', false, null); + }, stylePanel2); + this.styleButtons([strike]); + + strike.firstChild.style.background = 'url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjR2MjRIMFYweiIvPjwvZGVmcz48Y2xpcFBhdGggaWQ9ImIiPjx1c2UgeGxpbms6aHJlZj0iI2EiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PC9jbGlwUGF0aD48cGF0aCBjbGlwLXBhdGg9InVybCgjYikiIGZpbGw9IiMwMTAxMDEiIGQ9Ik03LjI0IDguNzVjLS4yNi0uNDgtLjM5LTEuMDMtLjM5LTEuNjcgMC0uNjEuMTMtMS4xNi40LTEuNjcuMjYtLjUuNjMtLjkzIDEuMTEtMS4yOS40OC0uMzUgMS4wNS0uNjMgMS43LS44My42Ni0uMTkgMS4zOS0uMjkgMi4xOC0uMjkuODEgMCAxLjU0LjExIDIuMjEuMzQuNjYuMjIgMS4yMy41NCAxLjY5Ljk0LjQ3LjQuODMuODggMS4wOCAxLjQzLjI1LjU1LjM4IDEuMTUuMzggMS44MWgtMy4wMWMwLS4zMS0uMDUtLjU5LS4xNS0uODUtLjA5LS4yNy0uMjQtLjQ5LS40NC0uNjgtLjItLjE5LS40NS0uMzMtLjc1LS40NC0uMy0uMS0uNjYtLjE2LTEuMDYtLjE2LS4zOSAwLS43NC4wNC0xLjAzLjEzLS4yOS4wOS0uNTMuMjEtLjcyLjM2LS4xOS4xNi0uMzQuMzQtLjQ0LjU1LS4xLjIxLS4xNS40My0uMTUuNjYgMCAuNDguMjUuODguNzQgMS4yMS4zOC4yNS43Ny40OCAxLjQxLjdINy4zOWMtLjA1LS4wOC0uMTEtLjE3LS4xNS0uMjV6TTIxIDEydi0ySDN2Mmg5LjYyYy4xOC4wNy40LjE0LjU1LjIuMzcuMTcuNjYuMzQuODcuNTEuMjEuMTcuMzUuMzYuNDMuNTcuMDcuMi4xMS40My4xMS42OSAwIC4yMy0uMDUuNDUtLjE0LjY2LS4wOS4yLS4yMy4zOC0uNDIuNTMtLjE5LjE1LS40Mi4yNi0uNzEuMzUtLjI5LjA4LS42My4xMy0xLjAxLjEzLS40MyAwLS44My0uMDQtMS4xOC0uMTNzLS42Ni0uMjMtLjkxLS40MmMtLjI1LS4xOS0uNDUtLjQ0LS41OS0uNzUtLjE0LS4zMS0uMjUtLjc2LS4yNS0xLjIxSDYuNGMwIC41NS4wOCAxLjEzLjI0IDEuNTguMTYuNDUuMzcuODUuNjUgMS4yMS4yOC4zNS42LjY2Ljk4LjkyLjM3LjI2Ljc4LjQ4IDEuMjIuNjUuNDQuMTcuOS4zIDEuMzguMzkuNDguMDguOTYuMTMgMS40NC4xMy44IDAgMS41My0uMDkgMi4xOC0uMjhzMS4yMS0uNDUgMS42Ny0uNzljLjQ2LS4zNC44Mi0uNzcgMS4wNy0xLjI3cy4zOC0xLjA3LjM4LTEuNzFjMC0uNi0uMS0xLjE0LS4zMS0xLjYxLS4wNS0uMTEtLjExLS4yMy0uMTctLjMzSDIxeiIvPjwvc3ZnPg==)'; + strike.firstChild.style.backgroundPosition = '2px 2px'; + strike.firstChild.style.backgroundSize = '18px 18px'; + + this.styleButtons([strike]); + } + + var top = this.editorUi.toolbar.addButton('geSprite-top', mxResources.get('top'), + callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP])), stylePanel3); + var middle = this.editorUi.toolbar.addButton('geSprite-middle', mxResources.get('middle'), + callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE])), stylePanel3); + var bottom = this.editorUi.toolbar.addButton('geSprite-bottom', mxResources.get('bottom'), + callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM])), stylePanel3); + + this.styleButtons([top, middle, bottom]); + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(container); + } + + container.appendChild(stylePanel3); + + // Hack for updating UI state below based on current text selection + // currentTable is the current selected DOM table updated below + var sub, sup, full, tableWrapper, currentTable, tableCell, tableRow; + + if (graph.cellEditor.isContentEditing()) + { + top.style.display = 'none'; + middle.style.display = 'none'; + bottom.style.display = 'none'; + verticalItem.style.display = 'none'; + + full = this.editorUi.toolbar.addButton('geSprite-justifyfull', mxResources.get('block'), + function() + { + if (full.style.opacity == 1) + { + document.execCommand('justifyfull', false, null); + } + }, stylePanel3); + full.style.marginRight = '9px'; + full.style.opacity = 1; + + this.styleButtons([full, + sub = this.editorUi.toolbar.addButton('geSprite-subscript', + mxResources.get('subscript') + ' (' + Editor.ctrlKey + '+,)', + function() + { + document.execCommand('subscript', false, null); + }, stylePanel3), sup = this.editorUi.toolbar.addButton('geSprite-superscript', + mxResources.get('superscript') + ' (' + Editor.ctrlKey + '+.)', + function() + { + document.execCommand('superscript', false, null); + }, stylePanel3)]); + sub.style.marginLeft = '9px'; + + var tmp = stylePanel3.cloneNode(false); + tmp.style.paddingTop = '4px'; + var btns = [this.editorUi.toolbar.addButton('geSprite-orderedlist', mxResources.get('numberedList'), + function() + { + document.execCommand('insertorderedlist', false, null); + }, tmp), + this.editorUi.toolbar.addButton('geSprite-unorderedlist', mxResources.get('bulletedList'), + function() + { + document.execCommand('insertunorderedlist', false, null); + }, tmp), + this.editorUi.toolbar.addButton('geSprite-outdent', mxResources.get('decreaseIndent'), + function() + { + document.execCommand('outdent', false, null); + }, tmp), + this.editorUi.toolbar.addButton('geSprite-indent', mxResources.get('increaseIndent'), + function() + { + document.execCommand('indent', false, null); + }, tmp), + this.editorUi.toolbar.addButton('geSprite-removeformat', mxResources.get('removeFormat'), + function() + { + document.execCommand('removeformat', false, null); + }, tmp), + this.editorUi.toolbar.addButton('geSprite-code', mxResources.get('html'), + function() + { + graph.cellEditor.toggleViewMode(); + }, tmp)]; + this.styleButtons(btns); + btns[btns.length - 2].style.marginLeft = '9px'; + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(container); + tmp.style.height = '40'; + } + + container.appendChild(tmp); + } + else + { + fontStyleItems[2].style.marginRight = '9px'; + right.style.marginRight = '9px'; + } + + // Label position + var stylePanel4 = stylePanel.cloneNode(false); + stylePanel4.style.marginLeft = '0px'; + stylePanel4.style.paddingTop = '8px'; + stylePanel4.style.paddingBottom = '4px'; + stylePanel4.style.fontWeight = 'normal'; + + mxUtils.write(stylePanel4, mxResources.get('position')); + + // Adds label position options + var positionSelect = document.createElement('select'); + positionSelect.style.position = 'absolute'; + positionSelect.style.right = '20px'; + positionSelect.style.width = '97px'; + positionSelect.style.marginTop = '-2px'; + + var directions = ['topLeft', 'top', 'topRight', 'left', 'center', 'right', 'bottomLeft', 'bottom', 'bottomRight']; + var lset = {'topLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM], + 'top': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM], + 'topRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM], + 'left': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE], + 'center': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE], + 'right': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE], + 'bottomLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP], + 'bottom': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP], + 'bottomRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP]}; + + for (var i = 0; i < directions.length; i++) + { + var positionOption = document.createElement('option'); + positionOption.setAttribute('value', directions[i]); + mxUtils.write(positionOption, mxResources.get(directions[i])); + positionSelect.appendChild(positionOption); + } + + stylePanel4.appendChild(positionSelect); + + // Writing direction + var stylePanel5 = stylePanel.cloneNode(false); + stylePanel5.style.marginLeft = '0px'; + stylePanel5.style.paddingTop = '4px'; + stylePanel5.style.paddingBottom = '4px'; + stylePanel5.style.fontWeight = 'normal'; + + mxUtils.write(stylePanel5, mxResources.get('writingDirection')); + + // Adds writing direction options + // LATER: Handle reselect of same option in all selects (change event + // is not fired for same option so have opened state on click) and + // handle multiple different styles for current selection + var dirSelect = document.createElement('select'); + dirSelect.style.position = 'absolute'; + dirSelect.style.right = '20px'; + dirSelect.style.width = '97px'; + dirSelect.style.marginTop = '-2px'; + + // NOTE: For automatic we use the value null since automatic + // requires the text to be non formatted and non-wrapped + var dirs = ['automatic', 'leftToRight', 'rightToLeft']; + var dirSet = {'automatic': null, + 'leftToRight': mxConstants.TEXT_DIRECTION_LTR, + 'rightToLeft': mxConstants.TEXT_DIRECTION_RTL}; + + for (var i = 0; i < dirs.length; i++) + { + var dirOption = document.createElement('option'); + dirOption.setAttribute('value', dirs[i]); + mxUtils.write(dirOption, mxResources.get(dirs[i])); + dirSelect.appendChild(dirOption); + } + + stylePanel5.appendChild(dirSelect); + + if (!graph.isEditing()) + { + container.appendChild(stylePanel4); + + mxEvent.addListener(positionSelect, 'change', function(evt) + { + graph.getModel().beginUpdate(); + try + { + var vals = lset[positionSelect.value]; + + if (vals != null) + { + graph.setCellStyles(mxConstants.STYLE_LABEL_POSITION, vals[0], graph.getSelectionCells()); + graph.setCellStyles(mxConstants.STYLE_VERTICAL_LABEL_POSITION, vals[1], graph.getSelectionCells()); + graph.setCellStyles(mxConstants.STYLE_ALIGN, vals[2], graph.getSelectionCells()); + graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, vals[3], graph.getSelectionCells()); + } + } + finally + { + graph.getModel().endUpdate(); + } + + mxEvent.consume(evt); + }); + + // LATER: Update dir in text editor while editing and update style with label + // NOTE: The tricky part is handling and passing on the auto value + container.appendChild(stylePanel5); + + mxEvent.addListener(dirSelect, 'change', function(evt) + { + graph.setCellStyles(mxConstants.STYLE_TEXT_DIRECTION, dirSet[dirSelect.value], graph.getSelectionCells()); + mxEvent.consume(evt); + }); + } + + // Font size + var input = document.createElement('input'); + input.style.textAlign = 'right'; + input.style.marginTop = '4px'; + + if (!mxClient.IS_QUIRKS) + { + input.style.position = 'absolute'; + input.style.right = '32px'; + } + + input.style.width = '46px'; + input.style.height = (mxClient.IS_QUIRKS) ? '21px' : '17px'; + stylePanel2.appendChild(input); + + // Workaround for font size 4 if no text is selected is update font size below + // after first character was entered (as the font element is lazy created) + var pendingFontSize = null; + + var inputUpdate = this.installInputHandler(input, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize, 1, 999, ' pt', + function(fontSize) + { + // IE does not support containsNode + // KNOWN: Fixes font size issues but bypasses undo + if (window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11) + { + var selection = window.getSelection(); + var container = (selection.rangeCount > 0) ? selection.getRangeAt(0).commonAncestorContainer : + graph.cellEditor.textarea; + + function updateSize(elt, ignoreContains) + { + if (graph.cellEditor.textarea != null && elt != graph.cellEditor.textarea && + graph.cellEditor.textarea.contains(elt) && + (ignoreContains || selection.containsNode(elt, true))) + { + if (elt.nodeName == 'FONT') + { + elt.removeAttribute('size'); + elt.style.fontSize = fontSize + 'px'; + } + else + { + var css = mxUtils.getCurrentStyle(elt); + + if (css.fontSize != fontSize + 'px') + { + if (mxUtils.getCurrentStyle(elt.parentNode).fontSize != fontSize + 'px') + { + elt.style.fontSize = fontSize + 'px'; + } + else + { + elt.style.fontSize = ''; + } + } + } + } + }; + + // Wraps text node or mixed selection with leading text in a font element + if (container == graph.cellEditor.textarea || + container.nodeType != mxConstants.NODETYPE_ELEMENT) + { + document.execCommand('fontSize', false, '1'); + } + + if (container != graph.cellEditor.textarea) + { + container = container.parentNode; + } + + if (container != null && container.nodeType == mxConstants.NODETYPE_ELEMENT) + { + var elts = container.getElementsByTagName('*'); + updateSize(container); + + for (var i = 0; i < elts.length; i++) + { + updateSize(elts[i]); + } + } + + input.value = fontSize + ' pt'; + } + else if (window.getSelection || document.selection) + { + // Checks selection + var par = null; + + if (document.selection) + { + par = document.selection.createRange().parentElement(); + } + else + { + var selection = window.getSelection(); + + if (selection.rangeCount > 0) + { + par = selection.getRangeAt(0).commonAncestorContainer; + } + } + + // Node.contains does not work for text nodes in IE11 + function isOrContains(container, node) + { + while (node != null) + { + if (node === container) + { + return true; + } + + node = node.parentNode; + } + + return false; + }; + + if (par != null && isOrContains(graph.cellEditor.textarea, par)) + { + pendingFontSize = fontSize; + + // Workaround for can't set font size in px is to change font size afterwards + document.execCommand('fontSize', false, '4'); + var elts = graph.cellEditor.textarea.getElementsByTagName('font'); + + for (var i = 0; i < elts.length; i++) + { + if (elts[i].getAttribute('size') == '4') + { + elts[i].removeAttribute('size'); + elts[i].style.fontSize = pendingFontSize + 'px'; + + // Overrides fontSize in input with the one just assigned as a workaround + // for potential fontSize values of parent elements that don't match + window.setTimeout(function() + { + input.value = pendingFontSize + ' pt'; + pendingFontSize = null; + }, 0); + + break; + } + } + } + } + }, true); + + var stepper = this.createStepper(input, inputUpdate, 1, 10, true, Menus.prototype.defaultFontSize); + stepper.style.display = input.style.display; + stepper.style.marginTop = '4px'; + + if (!mxClient.IS_QUIRKS) + { + stepper.style.right = '20px'; + } + + stylePanel2.appendChild(stepper); + + var arrow = fontMenu.getElementsByTagName('div')[0]; + arrow.style.cssFloat = 'right'; + + var bgColorApply = null; + var currentBgColor = '#ffffff'; + + var fontColorApply = null; + var currentFontColor = '#000000'; + + var bgPanel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('backgroundColor'), function() + { + return currentBgColor; + }, function(color) + { + document.execCommand('backcolor', false, (color != mxConstants.NONE) ? color : 'transparent'); + }, '#ffffff', + { + install: function(apply) { bgColorApply = apply; }, + destroy: function() { bgColorApply = null; } + }, null, true) : this.createCellColorOption(mxResources.get('backgroundColor'), mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, '#ffffff', null, function(color) + { + graph.updateLabelElements(graph.getSelectionCells(), function(elt) + { + elt.style.backgroundColor = null; + }); + }); + bgPanel.style.fontWeight = 'bold'; + + var borderPanel = this.createCellColorOption(mxResources.get('borderColor'), mxConstants.STYLE_LABEL_BORDERCOLOR, '#000000'); + borderPanel.style.fontWeight = 'bold'; + + var panel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('fontColor'), function() + { + return currentFontColor; + }, function(color) + { + if (mxClient.IS_FF) + { + // Workaround for Firefox that adds the font element around + // anchor elements which ignore inherited colors is to move + // the font element inside anchor elements + var tmp = graph.cellEditor.textarea.getElementsByTagName('font'); + var oldFonts = []; + + for (var i = 0; i < tmp.length; i++) + { + oldFonts.push( + { + node: tmp[i], + color: tmp[i].getAttribute('color') + }); + } + + document.execCommand('forecolor', false, (color != mxConstants.NONE) ? + color : 'transparent'); + + // Finds the new or changed font element + var newFonts = graph.cellEditor.textarea.getElementsByTagName('font'); + + for (var i = 0; i < newFonts.length; i++) + { + if (i >= oldFonts.length || newFonts[i] != oldFonts[i].node || + (newFonts[i] == oldFonts[i].node && + newFonts[i].getAttribute('color') != oldFonts[i].color)) + { + var child = newFonts[i].firstChild; + + // Moves the font element to inside the anchor element and adopts all children + if (child != null && child.nodeName == 'A' && child.nextSibling == + null && + child.firstChild != null) + { + var parent = newFonts[i].parentNode; + parent.insertBefore(child, newFonts[i]); + var tmp = child.firstChild; + + while (tmp != null) + { + var next = tmp.nextSibling; + newFonts[i].appendChild(tmp); + tmp = next; + } + + child.appendChild(newFonts[i]); + } + + break; + } + } + } + else + { + document.execCommand('forecolor', false, (color != mxConstants.NONE) ? + color : 'transparent'); + } + }, '#000000', + { + install: function(apply) { fontColorApply = apply; }, + destroy: function() { fontColorApply = null; } + }, null, true) : this.createCellColorOption(mxResources.get('fontColor'), mxConstants.STYLE_FONTCOLOR, '#000000', function(color) + { + if (color == null || color == mxConstants.NONE) + { + bgPanel.style.display = 'none'; + } + else + { + bgPanel.style.display = ''; + } + + borderPanel.style.display = bgPanel.style.display; + }, function(color) + { + if (color == null || color == mxConstants.NONE) + { + graph.setCellStyles(mxConstants.STYLE_NOLABEL, '1', graph.getSelectionCells()); + } + else + { + graph.setCellStyles(mxConstants.STYLE_NOLABEL, null, graph.getSelectionCells()); + } + + graph.updateLabelElements(graph.getSelectionCells(), function(elt) + { + elt.removeAttribute('color'); + elt.style.color = null; + }); + }); + panel.style.fontWeight = 'bold'; + + colorPanel.appendChild(panel); + colorPanel.appendChild(bgPanel); + + if (!graph.cellEditor.isContentEditing()) + { + colorPanel.appendChild(borderPanel); + } + + container.appendChild(colorPanel); + + var extraPanel = this.createPanel(); + extraPanel.style.paddingTop = '2px'; + extraPanel.style.paddingBottom = '4px'; + + // LATER: Fix toggle using '' instead of 'null' + var wwOpt = this.createCellOption(mxResources.get('wordWrap'), mxConstants.STYLE_WHITE_SPACE, null, 'wrap', 'null', null, null, true); + wwOpt.style.fontWeight = 'bold'; + + // Word wrap in edge labels only supported via labelWidth style + if (!ss.containsLabel && !ss.autoSize && ss.edges.length == 0) + { + extraPanel.appendChild(wwOpt); + } + + // Delegates switch of style to formattedText action as it also convertes newlines + var htmlOpt = this.createCellOption(mxResources.get('formattedText'), 'html', '0', + null, null, null, ui.actions.get('formattedText')); + htmlOpt.style.fontWeight = 'bold'; + extraPanel.appendChild(htmlOpt); + + var spacingPanel = this.createPanel(); + spacingPanel.style.paddingTop = '10px'; + spacingPanel.style.paddingBottom = '28px'; + spacingPanel.style.fontWeight = 'normal'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.width = '70px'; + span.style.marginTop = '0px'; + span.style.fontWeight = 'bold'; + mxUtils.write(span, mxResources.get('spacing')); + spacingPanel.appendChild(span); + + var topUpdate, globalUpdate, leftUpdate, bottomUpdate, rightUpdate; + var topSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function() + { + topUpdate.apply(this, arguments); + }); + var globalSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function() + { + globalUpdate.apply(this, arguments); + }); + + mxUtils.br(spacingPanel); + this.addLabel(spacingPanel, mxResources.get('top'), 91); + this.addLabel(spacingPanel, mxResources.get('global'), 20); + mxUtils.br(spacingPanel); + mxUtils.br(spacingPanel); + + var leftSpacing = this.addUnitInput(spacingPanel, 'pt', 162, 44, function() + { + leftUpdate.apply(this, arguments); + }); + var bottomSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function() + { + bottomUpdate.apply(this, arguments); + }); + var rightSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function() + { + rightUpdate.apply(this, arguments); + }); + + mxUtils.br(spacingPanel); + this.addLabel(spacingPanel, mxResources.get('left'), 162); + this.addLabel(spacingPanel, mxResources.get('bottom'), 91); + this.addLabel(spacingPanel, mxResources.get('right'), 20); + + if (!graph.cellEditor.isContentEditing()) + { + container.appendChild(extraPanel); + container.appendChild(this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_TEXT_OPACITY)); + container.appendChild(spacingPanel); + } + else + { + var selState = null; + var lineHeightInput = null; + + container.appendChild(this.createRelativeOption(mxResources.get('lineheight'), null, null, function(input) + { + var value = (input.value == '') ? 120 : parseInt(input.value); + value = Math.max(0, (isNaN(value)) ? 120 : value); + + if (selState != null) + { + graph.cellEditor.restoreSelection(selState); + selState = null; + } + + var selectedElement = graph.getSelectedElement(); + var node = selectedElement; + + while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) + { + node = node.parentNode; + } + + if (node != null && node == graph.cellEditor.textarea && graph.cellEditor.textarea.firstChild != null) + { + if (graph.cellEditor.textarea.firstChild.nodeName != 'P') + { + graph.cellEditor.textarea.innerHTML = '

' + graph.cellEditor.textarea.innerHTML + '

'; + } + + node = graph.cellEditor.textarea.firstChild; + } + + if (node != null && graph.cellEditor.textarea != null && node != graph.cellEditor.textarea && + graph.cellEditor.textarea.contains(node)) + { + node.style.lineHeight = value + '%'; + } + + input.value = value + ' %'; + }, function(input) + { + // Used in CSS handler to update current value + lineHeightInput = input; + + // KNOWN: Arrow up/down clear selection text in quirks/IE 8 + // Text size via arrow button limits to 16 in IE11. Why? + mxEvent.addListener(input, 'mousedown', function() + { + if (document.activeElement == graph.cellEditor.textarea) + { + selState = graph.cellEditor.saveSelection(); + } + }); + + mxEvent.addListener(input, 'touchstart', function() + { + if (document.activeElement == graph.cellEditor.textarea) + { + selState = graph.cellEditor.saveSelection(); + } + }); + + input.value = '120 %'; + })); + + var insertPanel = stylePanel.cloneNode(false); + insertPanel.style.paddingLeft = '0px'; + var insertBtns = this.editorUi.toolbar.addItems(['link', 'image'], insertPanel, true); + + var btns = [ + this.editorUi.toolbar.addButton('geSprite-horizontalrule', mxResources.get('insertHorizontalRule'), + function() + { + document.execCommand('inserthorizontalrule', false); + }, insertPanel), + this.editorUi.toolbar.addMenuFunctionInContainer(insertPanel, 'geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu) + { + this.editorUi.menus.addInsertTableItem(menu); + }))]; + this.styleButtons(insertBtns); + this.styleButtons(btns); + + var wrapper2 = this.createPanel(); + wrapper2.style.paddingTop = '10px'; + wrapper2.style.paddingBottom = '10px'; + wrapper2.appendChild(this.createTitle(mxResources.get('insert'))); + wrapper2.appendChild(insertPanel); + container.appendChild(wrapper2); + + if (mxClient.IS_QUIRKS) + { + wrapper2.style.height = '70'; + } + + var tablePanel = stylePanel.cloneNode(false); + tablePanel.style.paddingLeft = '0px'; + + var btns = [ + this.editorUi.toolbar.addButton('geSprite-insertcolumnbefore', mxResources.get('insertColumnBefore'), + mxUtils.bind(this, function() + { + try + { + if (currentTable != null) + { + graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex : 0); + } + } + catch (e) + { + this.editorUi.handleError(e); + } + }), tablePanel), + this.editorUi.toolbar.addButton('geSprite-insertcolumnafter', mxResources.get('insertColumnAfter'), + mxUtils.bind(this, function() + { + try + { + if (currentTable != null) + { + graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex + 1 : -1); + } + } + catch (e) + { + this.editorUi.handleError(e); + } + }), tablePanel), + this.editorUi.toolbar.addButton('geSprite-deletecolumn', mxResources.get('deleteColumn'), + mxUtils.bind(this, function() + { + try + { + if (currentTable != null && tableCell != null) + { + graph.deleteColumn(currentTable, tableCell.cellIndex); + } + } + catch (e) + { + this.editorUi.handleError(e); + } + }), tablePanel), + this.editorUi.toolbar.addButton('geSprite-insertrowbefore', mxResources.get('insertRowBefore'), + mxUtils.bind(this, function() + { + try + { + if (currentTable != null && tableRow != null) + { + graph.insertRow(currentTable, tableRow.sectionRowIndex); + } + } + catch (e) + { + this.editorUi.handleError(e); + } + }), tablePanel), + this.editorUi.toolbar.addButton('geSprite-insertrowafter', mxResources.get('insertRowAfter'), + mxUtils.bind(this, function() + { + try + { + if (currentTable != null && tableRow != null) + { + graph.insertRow(currentTable, tableRow.sectionRowIndex + 1); + } + } + catch (e) + { + this.editorUi.handleError(e); + } + }), tablePanel), + this.editorUi.toolbar.addButton('geSprite-deleterow', mxResources.get('deleteRow'), + mxUtils.bind(this, function() + { + try + { + if (currentTable != null && tableRow != null) + { + graph.deleteRow(currentTable, tableRow.sectionRowIndex); + } + } + catch (e) + { + this.editorUi.handleError(e); + } + }), tablePanel)]; + this.styleButtons(btns); + btns[2].style.marginRight = '9px'; + + var wrapper3 = this.createPanel(); + wrapper3.style.paddingTop = '10px'; + wrapper3.style.paddingBottom = '10px'; + wrapper3.appendChild(this.createTitle(mxResources.get('table'))); + wrapper3.appendChild(tablePanel); + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(container); + wrapper3.style.height = '70'; + } + + var tablePanel2 = stylePanel.cloneNode(false); + tablePanel2.style.paddingLeft = '0px'; + + var btns = [ + this.editorUi.toolbar.addButton('geSprite-strokecolor', mxResources.get('borderColor'), + mxUtils.bind(this, function(evt) + { + if (currentTable != null) + { + // Converts rgb(r,g,b) values + var color = currentTable.style.borderColor.replace( + /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, + function($0, $1, $2, $3) { + return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); + }); + this.editorUi.pickColor(color, function(newColor) + { + var targetElt = (tableCell != null && (evt == null || !mxEvent.isShiftDown(evt))) ? tableCell : currentTable; + + graph.processElements(targetElt, function(elt) + { + elt.style.border = null; + }); + + if (newColor == null || newColor == mxConstants.NONE) + { + targetElt.removeAttribute('border'); + targetElt.style.border = ''; + targetElt.style.borderCollapse = ''; + } + else + { + targetElt.setAttribute('border', '1'); + targetElt.style.border = '1px solid ' + newColor; + targetElt.style.borderCollapse = 'collapse'; + } + }); + } + }), tablePanel2), + this.editorUi.toolbar.addButton('geSprite-fillcolor', mxResources.get('backgroundColor'), + mxUtils.bind(this, function(evt) + { + // Converts rgb(r,g,b) values + if (currentTable != null) + { + var color = currentTable.style.backgroundColor.replace( + /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, + function($0, $1, $2, $3) { + return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); + }); + this.editorUi.pickColor(color, function(newColor) + { + var targetElt = (tableCell != null && (evt == null || !mxEvent.isShiftDown(evt))) ? tableCell : currentTable; + + graph.processElements(targetElt, function(elt) + { + elt.style.backgroundColor = null; + }); + + if (newColor == null || newColor == mxConstants.NONE) + { + targetElt.style.backgroundColor = ''; + } + else + { + targetElt.style.backgroundColor = newColor; + } + }); + } + }), tablePanel2), + this.editorUi.toolbar.addButton('geSprite-fit', mxResources.get('spacing'), + function() + { + if (currentTable != null) + { + var value = currentTable.getAttribute('cellPadding') || 0; + + var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue) + { + if (newValue != null && newValue.length > 0) + { + currentTable.setAttribute('cellPadding', newValue); + } + else + { + currentTable.removeAttribute('cellPadding'); + } + }), mxResources.get('spacing')); + ui.showDialog(dlg.container, 300, 80, true, true); + dlg.init(); + } + }, tablePanel2), + this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'), + function() + { + if (currentTable != null) + { + currentTable.setAttribute('align', 'left'); + } + }, tablePanel2), + this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'), + function() + { + if (currentTable != null) + { + currentTable.setAttribute('align', 'center'); + } + }, tablePanel2), + this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'), + function() + { + if (currentTable != null) + { + currentTable.setAttribute('align', 'right'); + } + }, tablePanel2)]; + this.styleButtons(btns); + btns[2].style.marginRight = '9px'; + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(wrapper3); + mxUtils.br(wrapper3); + } + + wrapper3.appendChild(tablePanel2); + container.appendChild(wrapper3); + + tableWrapper = wrapper3; + } + + function setSelected(elt, selected) + { + if (mxClient.IS_IE && (mxClient.IS_QUIRKS || document.documentMode < 10)) + { + elt.style.filter = (selected) ? 'progid:DXImageTransform.Microsoft.Gradient('+ + 'StartColorStr=\'#c5ecff\', EndColorStr=\'#87d4fb\', GradientType=0)' : ''; + } + else + { + elt.style.backgroundImage = (selected) ? 'linear-gradient(#c5ecff 0px,#87d4fb 100%)' : ''; + } + }; + + var listener = mxUtils.bind(this, function(sender, evt, force) + { + ss = this.format.getSelectionState(); + var fontStyle = mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSTYLE, 0); + setSelected(fontStyleItems[0], (fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD); + setSelected(fontStyleItems[1], (fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC); + setSelected(fontStyleItems[2], (fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE); + fontMenu.firstChild.nodeValue = mxUtils.getValue(ss.style, mxConstants.STYLE_FONTFAMILY, Menus.prototype.defaultFont); + + setSelected(verticalItem, mxUtils.getValue(ss.style, mxConstants.STYLE_HORIZONTAL, '1') == '0'); + + if (force || document.activeElement != input) + { + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize)); + input.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + var align = mxUtils.getValue(ss.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER); + setSelected(left, align == mxConstants.ALIGN_LEFT); + setSelected(center, align == mxConstants.ALIGN_CENTER); + setSelected(right, align == mxConstants.ALIGN_RIGHT); + + var valign = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE); + setSelected(top, valign == mxConstants.ALIGN_TOP); + setSelected(middle, valign == mxConstants.ALIGN_MIDDLE); + setSelected(bottom, valign == mxConstants.ALIGN_BOTTOM); + + var pos = mxUtils.getValue(ss.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); + var vpos = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); + + if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_TOP) + { + positionSelect.value = 'topLeft'; + } + else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_TOP) + { + positionSelect.value = 'top'; + } + else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_TOP) + { + positionSelect.value = 'topRight'; + } + else if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_BOTTOM) + { + positionSelect.value = 'bottomLeft'; + } + else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_BOTTOM) + { + positionSelect.value = 'bottom'; + } + else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_BOTTOM) + { + positionSelect.value = 'bottomRight'; + } + else if (pos == mxConstants.ALIGN_LEFT) + { + positionSelect.value = 'left'; + } + else if (pos == mxConstants.ALIGN_RIGHT) + { + positionSelect.value = 'right'; + } + else + { + positionSelect.value = 'center'; + } + + var dir = mxUtils.getValue(ss.style, mxConstants.STYLE_TEXT_DIRECTION, mxConstants.DEFAULT_TEXT_DIRECTION); + + if (dir == mxConstants.TEXT_DIRECTION_RTL) + { + dirSelect.value = 'rightToLeft'; + } + else if (dir == mxConstants.TEXT_DIRECTION_LTR) + { + dirSelect.value = 'leftToRight'; + } + else if (dir == mxConstants.TEXT_DIRECTION_AUTO) + { + dirSelect.value = 'automatic'; + } + + if (force || document.activeElement != globalSpacing) + { + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING, 2)); + globalSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != topSpacing) + { + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_TOP, 0)); + topSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != rightSpacing) + { + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_RIGHT, 0)); + rightSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != bottomSpacing) + { + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_BOTTOM, 0)); + bottomSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != leftSpacing) + { + var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_LEFT, 0)); + leftSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + }); + + globalUpdate = this.installInputHandler(globalSpacing, mxConstants.STYLE_SPACING, 2, -999, 999, ' pt'); + topUpdate = this.installInputHandler(topSpacing, mxConstants.STYLE_SPACING_TOP, 0, -999, 999, ' pt'); + rightUpdate = this.installInputHandler(rightSpacing, mxConstants.STYLE_SPACING_RIGHT, 0, -999, 999, ' pt'); + bottomUpdate = this.installInputHandler(bottomSpacing, mxConstants.STYLE_SPACING_BOTTOM, 0, -999, 999, ' pt'); + leftUpdate = this.installInputHandler(leftSpacing, mxConstants.STYLE_SPACING_LEFT, 0, -999, 999, ' pt'); + + this.addKeyHandler(input, listener); + this.addKeyHandler(globalSpacing, listener); + this.addKeyHandler(topSpacing, listener); + this.addKeyHandler(rightSpacing, listener); + this.addKeyHandler(bottomSpacing, listener); + this.addKeyHandler(leftSpacing, listener); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + + if (graph.cellEditor.isContentEditing()) + { + var updating = false; + + var updateCssHandler = function() + { + if (!updating) + { + updating = true; + + window.setTimeout(function() + { + var selectedElement = graph.getSelectedElement(); + var node = selectedElement; + + while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) + { + node = node.parentNode; + } + + if (node != null) + { + // Workaround for commonAncestor on range in IE11 returning parent of common ancestor + if (node == graph.cellEditor.textarea && graph.cellEditor.textarea.children.length == 1 && + graph.cellEditor.textarea.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) + { + node = graph.cellEditor.textarea.firstChild; + } + + function getRelativeLineHeight(fontSize, css, elt) + { + if (elt.style != null && css != null) + { + var lineHeight = css.lineHeight + + if (elt.style.lineHeight != null && elt.style.lineHeight.substring(elt.style.lineHeight.length - 1) == '%') + { + return parseInt(elt.style.lineHeight) / 100; + } + else + { + return (lineHeight.substring(lineHeight.length - 2) == 'px') ? + parseFloat(lineHeight) / fontSize : parseInt(lineHeight); + } + } + else + { + return ''; + } + }; + + function getAbsoluteFontSize(css) + { + var fontSize = (css != null) ? css.fontSize : null; + + if (fontSize != null && fontSize.substring(fontSize.length - 2) == 'px') + { + return parseFloat(fontSize); + } + else + { + return mxConstants.DEFAULT_FONTSIZE; + } + }; + + var css = mxUtils.getCurrentStyle(node); + var fontSize = getAbsoluteFontSize(css); + var lineHeight = getRelativeLineHeight(fontSize, css, node); + + // Finds common font size + var elts = node.getElementsByTagName('*'); + + // IE does not support containsNode + if (elts.length > 0 && window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11) + { + var selection = window.getSelection(); + + for (var i = 0; i < elts.length; i++) + { + if (selection.containsNode(elts[i], true)) + { + temp = mxUtils.getCurrentStyle(elts[i]); + fontSize = Math.max(getAbsoluteFontSize(temp), fontSize); + var lh = getRelativeLineHeight(fontSize, temp, elts[i]); + + if (lh != lineHeight || isNaN(lh)) + { + lineHeight = ''; + } + } + } + } + + function hasParentOrOnlyChild(name) + { + if (graph.getParentByName(node, name, graph.cellEditor.textarea) != null) + { + return true; + } + else + { + var child = node; + + while (child != null && child.childNodes.length == 1) + { + child = child.childNodes[0]; + + if (child.nodeName == name) + { + return true; + } + } + } + + return false; + }; + + function isEqualOrPrefixed(str, value) + { + if (str != null && value != null) + { + if (str == value) + { + return true; + } + else if (str.length > value.length + 1) + { + return str.substring(str.length - value.length - 1, str.length) == '-' + value; + } + } + + return false; + }; + + if (css != null) + { + setSelected(fontStyleItems[0], css.fontWeight == 'bold' || + css.fontWeight > 400 || hasParentOrOnlyChild('B') || + hasParentOrOnlyChild('STRONG')); + setSelected(fontStyleItems[1], css.fontStyle == 'italic' || + hasParentOrOnlyChild('I') || hasParentOrOnlyChild('EM')); + setSelected(fontStyleItems[2], hasParentOrOnlyChild('U')); + setSelected(sup, hasParentOrOnlyChild('SUP')); + setSelected(sub, hasParentOrOnlyChild('SUB')); + + if (!graph.cellEditor.isTableSelected()) + { + var align = graph.cellEditor.align || mxUtils.getValue(ss.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER); + + if (isEqualOrPrefixed(css.textAlign, 'justify')) + { + setSelected(full, isEqualOrPrefixed(css.textAlign, 'justify')); + setSelected(left, false); + setSelected(center, false); + setSelected(right, false); + } + else + { + setSelected(full, false); + setSelected(left, align == mxConstants.ALIGN_LEFT); + setSelected(center, align == mxConstants.ALIGN_CENTER); + setSelected(right, align == mxConstants.ALIGN_RIGHT); + } + } + else + { + setSelected(full, isEqualOrPrefixed(css.textAlign, 'justify')); + setSelected(left, isEqualOrPrefixed(css.textAlign, 'left')); + setSelected(center, isEqualOrPrefixed(css.textAlign, 'center')); + setSelected(right, isEqualOrPrefixed(css.textAlign, 'right')); + } + + currentTable = graph.getParentByName(node, 'TABLE', graph.cellEditor.textarea); + tableRow = (currentTable == null) ? null : graph.getParentByName(node, 'TR', currentTable); + tableCell = (currentTable == null) ? null : graph.getParentByNames(node, ['TD', 'TH'], currentTable); + tableWrapper.style.display = (currentTable != null) ? '' : 'none'; + + if (document.activeElement != input) + { + if (node.nodeName == 'FONT' && node.getAttribute('size') == '4' && + pendingFontSize != null) + { + node.removeAttribute('size'); + node.style.fontSize = pendingFontSize + ' pt'; + pendingFontSize = null; + } + else + { + input.value = (isNaN(fontSize)) ? '' : fontSize + ' pt'; + } + + var lh = parseFloat(lineHeight); + + if (!isNaN(lh)) + { + lineHeightInput.value = Math.round(lh * 100) + ' %'; + } + else + { + lineHeightInput.value = '100 %'; + } + } + + // Converts rgb(r,g,b) values + var color = css.color.replace( + /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, + function($0, $1, $2, $3) { + return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); + }); + var color2 = css.backgroundColor.replace( + /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, + function($0, $1, $2, $3) { + return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); + }); + + // Updates the color picker for the current font + if (fontColorApply != null) + { + if (color.charAt(0) == '#') + { + currentFontColor = color; + } + else + { + currentFontColor = '#000000'; + } + + fontColorApply(currentFontColor, true); + } + + if (bgColorApply != null) + { + if (color2.charAt(0) == '#') + { + currentBgColor = color2; + } + else + { + currentBgColor = null; + } + + bgColorApply(currentBgColor, true); + } + + // Workaround for firstChild is null or not an object + // in the log which seems to be IE8- only / 29.01.15 + if (fontMenu.firstChild != null) + { + // Strips leading and trailing quotes + var ff = css.fontFamily; + + if (ff.charAt(0) == '\'') + { + ff = ff.substring(1); + } + + if (ff.charAt(ff.length - 1) == '\'') + { + ff = ff.substring(0, ff.length - 1); + } + + if (ff.charAt(0) == '"') + { + ff = ff.substring(1); + } + + if (ff.charAt(ff.length - 1) == '"') + { + ff = ff.substring(0, ff.length - 1); + } + + fontMenu.firstChild.nodeValue = ff; + } + } + } + + updating = false; + }, 0); + } + }; + + if (mxClient.IS_FF || mxClient.IS_EDGE || mxClient.IS_IE || mxClient.IS_IE11) + { + mxEvent.addListener(graph.cellEditor.textarea, 'DOMSubtreeModified', updateCssHandler); + } + + mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler); + mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler); + mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler); + mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler); + this.listeners.push({destroy: function() + { + // No need to remove listener since textarea is destroyed after edit + }}); + updateCssHandler(); + } + + return container; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel = function(format, editorUi, container) +{ + BaseFormatPanel.call(this, format, editorUi, container); + this.init(); +}; + +mxUtils.extend(StyleFormatPanel, BaseFormatPanel); + +/** + * + */ +StyleFormatPanel.prototype.defaultStrokeColor = 'black'; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.init = function() +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + var ss = this.format.getSelectionState(); + + if (!ss.containsLabel) + { + if (ss.containsImage && ss.vertices.length == 1 && ss.style.shape == 'image' && + ss.style.image != null && ss.style.image.substring(0, 19) == 'data:image/svg+xml;') + { + this.container.appendChild(this.addSvgStyles(this.createPanel())); + } + + if (!ss.containsImage || ss.style.shape == 'image') + { + this.container.appendChild(this.addFill(this.createPanel())); + } + + this.container.appendChild(this.addStroke(this.createPanel())); + this.container.appendChild(this.addLineJumps(this.createPanel())); + var opacityPanel = this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_OPACITY, 41); + opacityPanel.style.paddingTop = '8px'; + opacityPanel.style.paddingBottom = '8px'; + this.container.appendChild(opacityPanel); + this.container.appendChild(this.addEffects(this.createPanel())); + } + + var opsPanel = this.addEditOps(this.createPanel()); + + if (opsPanel.firstChild != null) + { + mxUtils.br(opsPanel); + } + + this.container.appendChild(this.addStyleOps(opsPanel)); +}; + +/** + * Use browser for parsing CSS. + */ +StyleFormatPanel.prototype.getCssRules = function(css) +{ + var doc = document.implementation.createHTMLDocument(''); + var styleElement = document.createElement('style'); + + mxUtils.setTextContent(styleElement, css); + doc.body.appendChild(styleElement); + + return styleElement.sheet.cssRules; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addSvgStyles = function(container) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var ss = this.format.getSelectionState(); + container.style.paddingTop = '6px'; + container.style.paddingBottom = '6px'; + container.style.fontWeight = 'bold'; + container.style.display = 'none'; + + try + { + var exp = ss.style.editableCssRules; + + if (exp != null) + { + var regex = new RegExp(exp); + + var data = ss.style.image.substring(ss.style.image.indexOf(',') + 1); + var xml = (window.atob) ? atob(data) : Base64.decode(data, true); + var svg = mxUtils.parseXml(xml); + + if (svg != null) + { + var styles = svg.getElementsByTagName('style'); + + for (var i = 0; i < styles.length; i++) + { + var rules = this.getCssRules(mxUtils.getTextContent(styles[i])); + + for (var j = 0; j < rules.length; j++) + { + this.addSvgRule(container, rules[j], svg, styles[i], rules, j, regex); + } + } + } + } + } + catch (e) + { + // ignore + } + + return container; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addSvgRule = function(container, rule, svg, styleElem, rules, ruleIndex, regex) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + + if (regex.test(rule.selectorText)) + { + function rgb2hex(rgb) + { + rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i); + + return (rgb && rgb.length === 4) ? "#" + + ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) + + ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) + + ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : ''; + }; + + var addStyleRule = mxUtils.bind(this, function(rule, key, label) + { + if (rule.style[key] != '') + { + var option = this.createColorOption(label + ' ' + rule.selectorText, function() + { + return rgb2hex(rule.style[key]); + }, function(color) + { + rules[ruleIndex].style[key] = color; + var cssTxt = ''; + + for (var i = 0; i < rules.length; i++) + { + cssTxt += rules[i].cssText + ' '; + } + + styleElem.textContent = cssTxt; + var xml = mxUtils.getXml(svg.documentElement); + + graph.setCellStyles(mxConstants.STYLE_IMAGE, 'data:image/svg+xml,' + + ((window.btoa) ? btoa(xml) : Base64.encode(xml, true)), + graph.getSelectionCells()); + }, '#ffffff', + { + install: function(apply) + { + // ignore + }, + destroy: function() + { + // ignore + } + }); + + container.appendChild(option); + + // Shows container if rules are added + container.style.display = ''; + } + }); + + addStyleRule(rule, 'fill', mxResources.get('fill')); + addStyleRule(rule, 'stroke', mxResources.get('line')); + } +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addEditOps = function(div) +{ + var ss = this.format.getSelectionState(); + var btn = null; + + if (this.editorUi.editor.graph.getSelectionCount() == 1) + { + btn = mxUtils.button(mxResources.get('editStyle'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('editStyle').funct(); + })); + + btn.setAttribute('title', mxResources.get('editStyle') + ' (' + this.editorUi.actions.get('editStyle').shortcut + ')'); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + + div.appendChild(btn); + } + + if (ss.image) + { + var btn2 = mxUtils.button(mxResources.get('editImage'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('image').funct(); + })); + + btn2.setAttribute('title', mxResources.get('editImage')); + btn2.style.marginBottom = '2px'; + + if (btn == null) + { + btn2.style.width = '202px'; + } + else + { + btn.style.width = '100px'; + btn2.style.width = '100px'; + btn2.style.marginLeft = '2px'; + } + + div.appendChild(btn2); + } + + return div; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addFill = function(container) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var ss = this.format.getSelectionState(); + container.style.paddingTop = '6px'; + container.style.paddingBottom = '6px'; + + // Adds gradient direction option + var gradientSelect = document.createElement('select'); + gradientSelect.style.position = 'absolute'; + gradientSelect.style.marginTop = '-2px'; + gradientSelect.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px'; + gradientSelect.style.width = '70px'; + + // Stops events from bubbling to color option event handler + mxEvent.addListener(gradientSelect, 'click', function(evt) + { + mxEvent.consume(evt); + }); + + var gradientPanel = this.createCellColorOption(mxResources.get('gradient'), mxConstants.STYLE_GRADIENTCOLOR, '#ffffff', function(color) + { + if (color == null || color == mxConstants.NONE) + { + gradientSelect.style.display = 'none'; + } + else + { + gradientSelect.style.display = ''; + } + }); + + var fillKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BACKGROUND : mxConstants.STYLE_FILLCOLOR; + var label = (ss.style.shape == 'image') ? mxResources.get('background') : mxResources.get('fill'); + + var fillPanel = this.createCellColorOption(label, fillKey, '#ffffff'); + fillPanel.style.fontWeight = 'bold'; + + var tmpColor = mxUtils.getValue(ss.style, fillKey, null); + gradientPanel.style.display = (tmpColor != null && tmpColor != mxConstants.NONE && + ss.fill && ss.style.shape != 'image') ? '' : 'none'; + + var directions = [mxConstants.DIRECTION_NORTH, mxConstants.DIRECTION_EAST, + mxConstants.DIRECTION_SOUTH, mxConstants.DIRECTION_WEST]; + + for (var i = 0; i < directions.length; i++) + { + var gradientOption = document.createElement('option'); + gradientOption.setAttribute('value', directions[i]); + mxUtils.write(gradientOption, mxResources.get(directions[i])); + gradientSelect.appendChild(gradientOption); + } + + gradientPanel.appendChild(gradientSelect); + + var listener = mxUtils.bind(this, function() + { + ss = this.format.getSelectionState(); + var value = mxUtils.getValue(ss.style, mxConstants.STYLE_GRADIENT_DIRECTION, mxConstants.DIRECTION_SOUTH); + + // Handles empty string which is not allowed as a value + if (value == '') + { + value = mxConstants.DIRECTION_SOUTH; + } + + gradientSelect.value = value; + container.style.display = (ss.fill) ? '' : 'none'; + + var fillColor = mxUtils.getValue(ss.style, mxConstants.STYLE_FILLCOLOR, null); + + if (!ss.fill || ss.containsImage || fillColor == null || fillColor == mxConstants.NONE || ss.style.shape == 'filledEdge') + { + gradientPanel.style.display = 'none'; + } + else + { + gradientPanel.style.display = ''; + } + }); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + + mxEvent.addListener(gradientSelect, 'change', function(evt) + { + graph.setCellStyles(mxConstants.STYLE_GRADIENT_DIRECTION, gradientSelect.value, graph.getSelectionCells()); + mxEvent.consume(evt); + }); + + container.appendChild(fillPanel); + container.appendChild(gradientPanel); + + // Adds custom colors + var custom = this.getCustomColors(); + + for (var i = 0; i < custom.length; i++) + { + container.appendChild(this.createCellColorOption(custom[i].title, custom[i].key, custom[i].defaultValue)); + } + + return container; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.getCustomColors = function() +{ + var ss = this.format.getSelectionState(); + var result = []; + + if (ss.style.shape == 'swimlane') + { + result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: '#ffffff'}); + } + + return result; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addStroke = function(container) +{ + var ui = this.editorUi; + var graph = ui.editor.graph; + var ss = this.format.getSelectionState(); + + container.style.paddingTop = '4px'; + container.style.paddingBottom = '4px'; + container.style.whiteSpace = 'normal'; + + var colorPanel = document.createElement('div'); + colorPanel.style.fontWeight = 'bold'; + + // Adds gradient direction option + var styleSelect = document.createElement('select'); + styleSelect.style.position = 'absolute'; + styleSelect.style.marginTop = '-2px'; + styleSelect.style.right = '72px'; + styleSelect.style.width = '80px'; + + var styles = ['sharp', 'rounded', 'curved']; + + for (var i = 0; i < styles.length; i++) + { + var styleOption = document.createElement('option'); + styleOption.setAttribute('value', styles[i]); + mxUtils.write(styleOption, mxResources.get(styles[i])); + styleSelect.appendChild(styleOption); + } + + mxEvent.addListener(styleSelect, 'change', function(evt) + { + graph.getModel().beginUpdate(); + try + { + var keys = [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED]; + // Default for rounded is 1 + var values = ['0', null]; + + if (styleSelect.value == 'rounded') + { + values = ['1', null]; + } + else if (styleSelect.value == 'curved') + { + values = [null, '1']; + } + + for (var i = 0; i < keys.length; i++) + { + graph.setCellStyles(keys[i], values[i], graph.getSelectionCells()); + } + + ui.fireEvent(new mxEventObject('styleChanged', 'keys', keys, + 'values', values, 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + + mxEvent.consume(evt); + }); + + // Stops events from bubbling to color option event handler + mxEvent.addListener(styleSelect, 'click', function(evt) + { + mxEvent.consume(evt); + }); + + var strokeKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BORDER : mxConstants.STYLE_STROKECOLOR; + var label = (ss.style.shape == 'image') ? mxResources.get('border') : mxResources.get('line'); + + var lineColor = this.createCellColorOption(label, strokeKey, '#000000'); + lineColor.appendChild(styleSelect); + colorPanel.appendChild(lineColor); + + // Used if only edges selected + var stylePanel = colorPanel.cloneNode(false); + stylePanel.style.fontWeight = 'normal'; + stylePanel.style.whiteSpace = 'nowrap'; + stylePanel.style.position = 'relative'; + stylePanel.style.paddingLeft = '16px' + stylePanel.style.marginBottom = '2px'; + stylePanel.style.marginTop = '2px'; + stylePanel.className = 'geToolbarContainer'; + + var addItem = mxUtils.bind(this, function(menu, width, cssName, keys, values) + { + var item = this.editorUi.menus.styleChange(menu, '', keys, values, 'geIcon', null); + + var pat = document.createElement('div'); + pat.style.width = width + 'px'; + pat.style.height = '1px'; + pat.style.borderBottom = '1px ' + cssName + ' ' + this.defaultStrokeColor; + pat.style.paddingTop = '6px'; + + item.firstChild.firstChild.style.padding = '0px 4px 0px 4px'; + item.firstChild.firstChild.style.width = width + 'px'; + item.firstChild.firstChild.appendChild(pat); + + return item; + }); + + var pattern = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu) + { + addItem(menu, 75, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid')); + addItem(menu, 75, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed')); + addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)'); + addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)'); + addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)'); + })); + + // Used for mixed selection (vertices and edges) + var altStylePanel = stylePanel.cloneNode(false); + + var edgeShape = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-connection', mxResources.get('connection'), false, mxUtils.bind(this, function(menu) + { + this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], [null, null, null, null], 'geIcon geSprite geSprite-connection', null, true).setAttribute('title', mxResources.get('line')); + this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['link', null, null, null], 'geIcon geSprite geSprite-linkedge', null, true).setAttribute('title', mxResources.get('link')); + this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['flexArrow', null, null, null], 'geIcon geSprite geSprite-arrow', null, true).setAttribute('title', mxResources.get('arrow')); + this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['arrow', null, null, null], 'geIcon geSprite geSprite-simplearrow', null, true).setAttribute('title', mxResources.get('simpleArrow')); + })); + + var altPattern = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu) + { + addItem(menu, 33, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid')); + addItem(menu, 33, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed')); + addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)'); + addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)'); + addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)'); + })); + + var stylePanel2 = stylePanel.cloneNode(false); + + // Stroke width + var input = document.createElement('input'); + input.style.textAlign = 'right'; + input.style.marginTop = '2px'; + input.style.width = '41px'; + input.setAttribute('title', mxResources.get('linewidth')); + + stylePanel.appendChild(input); + + var altInput = input.cloneNode(true); + altStylePanel.appendChild(altInput); + + function update(evt) + { + // Maximum stroke width is 999 + var value = parseInt(input.value); + value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); + + if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)) + { + graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells()); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH], + 'values', [value], 'cells', graph.getSelectionCells())); + } + + input.value = value + ' pt'; + mxEvent.consume(evt); + }; + + function altUpdate(evt) + { + // Maximum stroke width is 999 + var value = parseInt(altInput.value); + value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); + + if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)) + { + graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells()); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH], + 'values', [value], 'cells', graph.getSelectionCells())); + } + + altInput.value = value + ' pt'; + mxEvent.consume(evt); + }; + + var stepper = this.createStepper(input, update, 1, 9); + stepper.style.display = input.style.display; + stepper.style.marginTop = '2px'; + stylePanel.appendChild(stepper); + + var altStepper = this.createStepper(altInput, altUpdate, 1, 9); + altStepper.style.display = altInput.style.display; + altStepper.style.marginTop = '2px'; + altStylePanel.appendChild(altStepper); + + if (!mxClient.IS_QUIRKS) + { + input.style.position = 'absolute'; + input.style.right = '32px'; + input.style.height = '15px'; + stepper.style.right = '20px'; + + altInput.style.position = 'absolute'; + altInput.style.right = '32px'; + altInput.style.height = '15px'; + altStepper.style.right = '20px'; + } + else + { + input.style.height = '17px'; + altInput.style.height = '17px'; + } + + mxEvent.addListener(input, 'blur', update); + mxEvent.addListener(input, 'change', update); + + mxEvent.addListener(altInput, 'blur', altUpdate); + mxEvent.addListener(altInput, 'change', altUpdate); + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(stylePanel2); + mxUtils.br(stylePanel2); + } + + var edgeStyle = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-orthogonal', mxResources.get('waypoints'), false, mxUtils.bind(this, function(menu) + { + if (ss.style.shape != 'arrow') + { + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], [null, null, null], 'geIcon geSprite geSprite-straight', null, true).setAttribute('title', mxResources.get('straight')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', null, null], 'geIcon geSprite geSprite-orthogonal', null, true).setAttribute('title', mxResources.get('orthogonal')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalelbow', null, true).setAttribute('title', mxResources.get('simple')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalelbow', null, true).setAttribute('title', mxResources.get('simple')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalisometric', null, true).setAttribute('title', mxResources.get('isometric')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalisometric', null, true).setAttribute('title', mxResources.get('isometric')); + + if (ss.style.shape == 'connector') + { + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', '1', null], 'geIcon geSprite geSprite-curved', null, true).setAttribute('title', mxResources.get('curved')); + } + + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['entityRelationEdgeStyle', null, null], 'geIcon geSprite geSprite-entity', null, true).setAttribute('title', mxResources.get('entityRelation')); + } + })); + + var lineStart = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-startclassic', mxResources.get('linestart'), false, mxUtils.bind(this, function(menu) + { + if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge') + { + var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon', null, false); + item.setAttribute('title', mxResources.get('none')); + item.firstChild.firstChild.innerHTML = '' + mxUtils.htmlEntities(mxResources.get('none')) + ''; + + if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') + { + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null, false).setAttribute('title', mxResources.get('classic')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-startclassicthin', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-startopen', null, false).setAttribute('title', mxResources.get('openArrow')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-startopenthin', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['openAsync', 0], 'geIcon geSprite geSprite-startopenasync', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null, false).setAttribute('title', mxResources.get('block')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-startblockthin', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 1], 'geIcon geSprite geSprite-startasync', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null, false).setAttribute('title', mxResources.get('oval')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null, false).setAttribute('title', mxResources.get('diamond')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null, false).setAttribute('title', mxResources.get('classic')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-startclassicthintrans', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-startblockthintrans', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 0], 'geIcon geSprite geSprite-startasynctrans', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null, false).setAttribute('title', mxResources.get('oval')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null, false).setAttribute('title', mxResources.get('diamond')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['box', 0], 'geIcon geSprite geSvgSprite geSprite-box', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['halfCircle', 0], 'geIcon geSprite geSvgSprite geSprite-halfCircle', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['dash', 0], 'geIcon geSprite geSprite-startdash', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['cross', 0], 'geIcon geSprite geSprite-startcross', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-startcircleplus', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circle', 1], 'geIcon geSprite geSprite-startcircle', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERone', 0], 'geIcon geSprite geSprite-starterone', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-starteronetoone', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmany', 0], 'geIcon geSprite geSprite-startermany', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-starteronetomany', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-starteroneopt', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-startermanyopt', null, false); + } + else + { + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block')); + } + } + })); + + var lineEnd = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu) + { + if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge') + { + var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon', null, false); + item.setAttribute('title', mxResources.get('none')); + item.firstChild.firstChild.innerHTML = '' + mxUtils.htmlEntities(mxResources.get('none')) + ''; + + if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') + { + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null, false).setAttribute('title', mxResources.get('classic')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-endclassicthin', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-endopen', null, false).setAttribute('title', mxResources.get('openArrow')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-endopenthin', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['openAsync', 0], 'geIcon geSprite geSprite-endopenasync', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null, false).setAttribute('title', mxResources.get('block')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-endblockthin', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 1], 'geIcon geSprite geSprite-endasync', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null, false).setAttribute('title', mxResources.get('oval')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null, false).setAttribute('title', mxResources.get('diamond')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null, false).setAttribute('title', mxResources.get('classic')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-endclassicthintrans', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-endblockthintrans', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 0], 'geIcon geSprite geSprite-endasynctrans', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null, false).setAttribute('title', mxResources.get('oval')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null, false).setAttribute('title', mxResources.get('diamond')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin')); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['box', 0], 'geIcon geSprite geSvgSprite geFlipSprite geSprite-box', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['halfCircle', 0], 'geIcon geSprite geSvgSprite geFlipSprite geSprite-halfCircle', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['dash', 0], 'geIcon geSprite geSprite-enddash', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['cross', 0], 'geIcon geSprite geSprite-endcross', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-endcircleplus', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circle', 1], 'geIcon geSprite geSprite-endcircle', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERone', 0], 'geIcon geSprite geSprite-enderone', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-enderonetoone', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmany', 0], 'geIcon geSprite geSprite-endermany', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-enderonetomany', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-enderoneopt', null, false); + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-endermanyopt', null, false); + } + else + { + this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block')); + } + } + })); + + this.addArrow(edgeShape, 8); + this.addArrow(edgeStyle); + this.addArrow(lineStart); + this.addArrow(lineEnd); + + var symbol = this.addArrow(pattern, 9); + symbol.className = 'geIcon'; + symbol.style.width = '84px'; + + var altSymbol = this.addArrow(altPattern, 9); + altSymbol.className = 'geIcon'; + altSymbol.style.width = '22px'; + + var solid = document.createElement('div'); + solid.style.width = '85px'; + solid.style.height = '1px'; + solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; + solid.style.marginBottom = '9px'; + symbol.appendChild(solid); + + var altSolid = document.createElement('div'); + altSolid.style.width = '23px'; + altSolid.style.height = '1px'; + altSolid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; + altSolid.style.marginBottom = '9px'; + altSymbol.appendChild(altSolid); + + pattern.style.height = '15px'; + altPattern.style.height = '15px'; + edgeShape.style.height = '15px'; + edgeStyle.style.height = '17px'; + lineStart.style.marginLeft = '3px'; + lineStart.style.height = '17px'; + lineEnd.style.marginLeft = '3px'; + lineEnd.style.height = '17px'; + + container.appendChild(colorPanel); + container.appendChild(altStylePanel); + container.appendChild(stylePanel); + + var arrowPanel = stylePanel.cloneNode(false); + arrowPanel.style.paddingBottom = '6px'; + arrowPanel.style.paddingTop = '4px'; + arrowPanel.style.fontWeight = 'normal'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.marginLeft = '3px'; + span.style.marginBottom = '12px'; + span.style.marginTop = '2px'; + span.style.fontWeight = 'normal'; + span.style.width = '76px'; + + mxUtils.write(span, mxResources.get('lineend')); + arrowPanel.appendChild(span); + + var endSpacingUpdate, endSizeUpdate; + var endSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function() + { + endSpacingUpdate.apply(this, arguments); + }); + var endSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function() + { + endSizeUpdate.apply(this, arguments); + }); + + mxUtils.br(arrowPanel); + + var spacer = document.createElement('div'); + spacer.style.height = '8px'; + arrowPanel.appendChild(spacer); + + span = span.cloneNode(false); + mxUtils.write(span, mxResources.get('linestart')); + arrowPanel.appendChild(span); + + var startSpacingUpdate, startSizeUpdate; + var startSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function() + { + startSpacingUpdate.apply(this, arguments); + }); + var startSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function() + { + startSizeUpdate.apply(this, arguments); + }); + + mxUtils.br(arrowPanel); + this.addLabel(arrowPanel, mxResources.get('spacing'), 74, 50); + this.addLabel(arrowPanel, mxResources.get('size'), 20, 50); + mxUtils.br(arrowPanel); + + var perimeterPanel = colorPanel.cloneNode(false); + perimeterPanel.style.fontWeight = 'normal'; + perimeterPanel.style.position = 'relative'; + perimeterPanel.style.paddingLeft = '16px' + perimeterPanel.style.marginBottom = '2px'; + perimeterPanel.style.marginTop = '6px'; + perimeterPanel.style.borderWidth = '0px'; + perimeterPanel.style.paddingBottom = '18px'; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.marginLeft = '3px'; + span.style.marginBottom = '12px'; + span.style.marginTop = '1px'; + span.style.fontWeight = 'normal'; + span.style.width = '120px'; + mxUtils.write(span, mxResources.get('perimeter')); + perimeterPanel.appendChild(span); + + var perimeterUpdate; + var perimeterSpacing = this.addUnitInput(perimeterPanel, 'pt', 20, 41, function() + { + perimeterUpdate.apply(this, arguments); + }); + + if (ss.edges.length == graph.getSelectionCount()) + { + container.appendChild(stylePanel2); + + if (mxClient.IS_QUIRKS) + { + mxUtils.br(container); + mxUtils.br(container); + } + + container.appendChild(arrowPanel); + } + else if (ss.vertices.length == graph.getSelectionCount()) + { + if (mxClient.IS_QUIRKS) + { + mxUtils.br(container); + } + + container.appendChild(perimeterPanel); + } + + var listener = mxUtils.bind(this, function(sender, evt, force) + { + ss = this.format.getSelectionState(); + var color = mxUtils.getValue(ss.style, strokeKey, null); + + if (force || document.activeElement != input) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)); + input.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != altInput) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)); + altInput.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + styleSelect.style.visibility = (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') ? '' : 'hidden'; + + if (mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1') + { + styleSelect.value = 'curved'; + } + else if (mxUtils.getValue(ss.style, mxConstants.STYLE_ROUNDED, null) == '1') + { + styleSelect.value = 'rounded'; + } + + if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASHED, null) == '1') + { + if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASH_PATTERN, null) == null) + { + solid.style.borderBottom = '1px dashed ' + this.defaultStrokeColor; + } + else + { + solid.style.borderBottom = '1px dotted ' + this.defaultStrokeColor; + } + } + else + { + solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; + } + + altSolid.style.borderBottom = solid.style.borderBottom; + + // Updates toolbar icon for edge style + var edgeStyleDiv = edgeStyle.getElementsByTagName('div')[0]; + var es = mxUtils.getValue(ss.style, mxConstants.STYLE_EDGE, null); + + if (mxUtils.getValue(ss.style, mxConstants.STYLE_NOEDGESTYLE, null) == '1') + { + es = null; + } + + if (es == 'orthogonalEdgeStyle' && mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1') + { + edgeStyleDiv.className = 'geSprite geSprite-curved'; + } + else if (es == 'straight' || es == 'none' || es == null) + { + edgeStyleDiv.className = 'geSprite geSprite-straight'; + } + else if (es == 'entityRelationEdgeStyle') + { + edgeStyleDiv.className = 'geSprite geSprite-entity'; + } + else if (es == 'elbowEdgeStyle') + { + edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style, + mxConstants.STYLE_ELBOW, null) == 'vertical') ? + 'geSprite-verticalelbow' : 'geSprite-horizontalelbow'); + } + else if (es == 'isometricEdgeStyle') + { + edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style, + mxConstants.STYLE_ELBOW, null) == 'vertical') ? + 'geSprite-verticalisometric' : 'geSprite-horizontalisometric'); + } + else + { + edgeStyleDiv.className = 'geSprite geSprite-orthogonal'; + } + + // Updates icon for edge shape + var edgeShapeDiv = edgeShape.getElementsByTagName('div')[0]; + + if (ss.style.shape == 'link') + { + edgeShapeDiv.className = 'geSprite geSprite-linkedge'; + } + else if (ss.style.shape == 'flexArrow') + { + edgeShapeDiv.className = 'geSprite geSprite-arrow'; + } + else if (ss.style.shape == 'arrow') + { + edgeShapeDiv.className = 'geSprite geSprite-simplearrow'; + } + else + { + edgeShapeDiv.className = 'geSprite geSprite-connection'; + } + + if (ss.edges.length == graph.getSelectionCount()) + { + altStylePanel.style.display = ''; + stylePanel.style.display = 'none'; + } + else + { + altStylePanel.style.display = 'none'; + stylePanel.style.display = ''; + } + + function updateArrow(marker, fill, elt, prefix) + { + var markerDiv = elt.getElementsByTagName('div')[0]; + + markerDiv.className = ui.getCssClassForMarker(prefix, ss.style.shape, marker, fill); + + if (markerDiv.className == 'geSprite geSprite-noarrow') + { + markerDiv.innerHTML = mxUtils.htmlEntities(mxResources.get('none')); + markerDiv.style.backgroundImage = 'none'; + markerDiv.style.verticalAlign = 'top'; + markerDiv.style.marginTop = '5px'; + markerDiv.style.fontSize = '10px'; + markerDiv.style.filter = 'none'; + markerDiv.style.color = this.defaultStrokeColor; + markerDiv.nextSibling.style.marginTop = '0px'; + } + + return markerDiv; + }; + + var sourceDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTARROW, null), + mxUtils.getValue(ss.style, 'startFill', '1'), lineStart, 'start'); + var targetDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDARROW, null), + mxUtils.getValue(ss.style, 'endFill', '1'), lineEnd, 'end'); + + // Special cases for markers + if (ss.style.shape == 'arrow') + { + sourceDiv.className = 'geSprite geSprite-noarrow'; + targetDiv.className = 'geSprite geSprite-endblocktrans'; + } + else if (ss.style.shape == 'link') + { + sourceDiv.className = 'geSprite geSprite-noarrow'; + targetDiv.className = 'geSprite geSprite-noarrow'; + } + + mxUtils.setOpacity(edgeStyle, (ss.style.shape == 'arrow') ? 30 : 100); + + if (ss.style.shape != 'connector' && ss.style.shape != 'flexArrow' && ss.style.shape != 'filledEdge') + { + mxUtils.setOpacity(lineStart, 30); + mxUtils.setOpacity(lineEnd, 30); + } + else + { + mxUtils.setOpacity(lineStart, 100); + mxUtils.setOpacity(lineEnd, 100); + } + + if (force || document.activeElement != startSize) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE)); + startSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != startSpacing) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0)); + startSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != endSize) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE)); + endSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != startSpacing) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0)); + endSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + + if (force || document.activeElement != perimeterSpacing) + { + var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_PERIMETER_SPACING, 0)); + perimeterSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + }); + + startSizeUpdate = this.installInputHandler(startSize, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt'); + startSpacingUpdate = this.installInputHandler(startSpacing, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0, -999, 999, ' pt'); + endSizeUpdate = this.installInputHandler(endSize, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt'); + endSpacingUpdate = this.installInputHandler(endSpacing, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0, -999, 999, ' pt'); + perimeterUpdate = this.installInputHandler(perimeterSpacing, mxConstants.STYLE_PERIMETER_SPACING, 0, 0, 999, ' pt'); + + this.addKeyHandler(input, listener); + this.addKeyHandler(startSize, listener); + this.addKeyHandler(startSpacing, listener); + this.addKeyHandler(endSize, listener); + this.addKeyHandler(endSpacing, listener); + this.addKeyHandler(perimeterSpacing, listener); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + + return container; +}; + +/** + * Adds UI for configuring line jumps. + */ +StyleFormatPanel.prototype.addLineJumps = function(container) +{ + var ss = this.format.getSelectionState(); + + if (Graph.lineJumpsEnabled && ss.edges.length > 0 && + ss.vertices.length == 0 && ss.lineJumps) + { + container.style.padding = '8px 0px 24px 18px'; + + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + var span = document.createElement('div'); + span.style.position = 'absolute'; + span.style.fontWeight = 'bold'; + span.style.width = '80px'; + + mxUtils.write(span, mxResources.get('lineJumps')); + container.appendChild(span); + + var styleSelect = document.createElement('select'); + styleSelect.style.position = 'absolute'; + styleSelect.style.marginTop = '-2px'; + styleSelect.style.right = '76px'; + styleSelect.style.width = '62px'; + + var styles = ['none', 'arc', 'gap', 'sharp']; + + for (var i = 0; i < styles.length; i++) + { + var styleOption = document.createElement('option'); + styleOption.setAttribute('value', styles[i]); + mxUtils.write(styleOption, mxResources.get(styles[i])); + styleSelect.appendChild(styleOption); + } + + mxEvent.addListener(styleSelect, 'change', function(evt) + { + graph.getModel().beginUpdate(); + try + { + graph.setCellStyles('jumpStyle', styleSelect.value, graph.getSelectionCells()); + ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['jumpStyle'], + 'values', [styleSelect.value], 'cells', graph.getSelectionCells())); + } + finally + { + graph.getModel().endUpdate(); + } + + mxEvent.consume(evt); + }); + + // Stops events from bubbling to color option event handler + mxEvent.addListener(styleSelect, 'click', function(evt) + { + mxEvent.consume(evt); + }); + + container.appendChild(styleSelect); + + var jumpSizeUpdate; + + var jumpSize = this.addUnitInput(container, 'pt', 22, 33, function() + { + jumpSizeUpdate.apply(this, arguments); + }); + + jumpSizeUpdate = this.installInputHandler(jumpSize, 'jumpSize', + Graph.defaultJumpSize, 0, 999, ' pt'); + + var listener = mxUtils.bind(this, function(sender, evt, force) + { + ss = this.format.getSelectionState(); + styleSelect.value = mxUtils.getValue(ss.style, 'jumpStyle', 'none'); + + if (force || document.activeElement != jumpSize) + { + var tmp = parseInt(mxUtils.getValue(ss.style, 'jumpSize', Graph.defaultJumpSize)); + jumpSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; + } + }); + + this.addKeyHandler(jumpSize, listener); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + } + else + { + container.style.display = 'none'; + } + + return container; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addEffects = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + var ss = this.format.getSelectionState(); + + div.style.paddingTop = '0px'; + div.style.paddingBottom = '2px'; + + var table = document.createElement('table'); + + if (mxClient.IS_QUIRKS) + { + table.style.fontSize = '1em'; + } + + table.style.width = '100%'; + table.style.fontWeight = 'bold'; + table.style.paddingRight = '20px'; + var tbody = document.createElement('tbody'); + var row = document.createElement('tr'); + row.style.padding = '0px'; + var left = document.createElement('td'); + left.style.padding = '0px'; + left.style.width = '50%'; + left.setAttribute('valign', 'top'); + + var right = left.cloneNode(true); + right.style.paddingLeft = '8px'; + row.appendChild(left); + row.appendChild(right); + tbody.appendChild(row); + table.appendChild(tbody); + div.appendChild(table); + + var current = left; + var count = 0; + + var addOption = mxUtils.bind(this, function(label, key, defaultValue) + { + var opt = this.createCellOption(label, key, defaultValue); + opt.style.width = '100%'; + current.appendChild(opt); + current = (current == left) ? right : left; + count++; + }); + + var listener = mxUtils.bind(this, function(sender, evt, force) + { + ss = this.format.getSelectionState(); + + left.innerHTML = ''; + right.innerHTML = ''; + current = left; + + if (ss.rounded) + { + addOption(mxResources.get('rounded'), mxConstants.STYLE_ROUNDED, 0); + } + + if (ss.style.shape == 'swimlane') + { + addOption(mxResources.get('divider'), 'swimlaneLine', 1); + } + + if (!ss.containsImage) + { + addOption(mxResources.get('shadow'), mxConstants.STYLE_SHADOW, 0); + } + + if (ss.glass) + { + addOption(mxResources.get('glass'), mxConstants.STYLE_GLASS, 0); + } + + if (ss.comic) + { + addOption(mxResources.get('comic'), 'comic', 0); + } + + if (count == 0) + { + div.style.display = 'none'; + } + }); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + listener(); + + return div; +} + +/** + * Adds the label menu items to the given menu and parent. + */ +StyleFormatPanel.prototype.addStyleOps = function(div) +{ + div.style.paddingTop = '10px'; + div.style.paddingBottom = '10px'; + + var btn = mxUtils.button(mxResources.get('setAsDefaultStyle'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('setAsDefaultStyle').funct(); + })); + + btn.setAttribute('title', mxResources.get('setAsDefaultStyle') + ' (' + this.editorUi.actions.get('setAsDefaultStyle').shortcut + ')'); + btn.style.width = '202px'; + div.appendChild(btn); + + return div; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel = function(format, editorUi, container) +{ + BaseFormatPanel.call(this, format, editorUi, container); + this.init(); +}; + +mxUtils.extend(DiagramFormatPanel, BaseFormatPanel); + +/** + * Switch to disable page view. + */ +DiagramFormatPanel.showPageView = true; + +/** + * Specifies if the background image option should be shown. Default is true. + */ +DiagramFormatPanel.prototype.showBackgroundImageOption = true; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.init = function() +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + this.container.appendChild(this.addView(this.createPanel())); + + if (graph.isEnabled()) + { + this.container.appendChild(this.addOptions(this.createPanel())); + this.container.appendChild(this.addPaperSize(this.createPanel())); + this.container.appendChild(this.addStyleOps(this.createPanel())); + } +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.addView = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + div.appendChild(this.createTitle(mxResources.get('view'))); + + // Grid + this.addGridOption(div); + + // Page View + if (DiagramFormatPanel.showPageView) + { + div.appendChild(this.createOption(mxResources.get('pageView'), function() + { + return graph.pageVisible; + }, function(checked) + { + ui.actions.get('pageView').funct(); + }, + { + install: function(apply) + { + this.listener = function() + { + apply(graph.pageVisible); + }; + + ui.addListener('pageViewChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + })); + } + + if (graph.isEnabled()) + { + // Background + var bg = this.createColorOption(mxResources.get('background'), function() + { + return graph.background; + }, function(color) + { + var change = new ChangePageSetup(ui, color); + change.ignoreImage = true; + + graph.model.execute(change); + }, '#ffffff', + { + install: function(apply) + { + this.listener = function() + { + apply(graph.background); + }; + + ui.addListener('backgroundColorChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + }); + + if (this.showBackgroundImageOption) + { + var btn = mxUtils.button(mxResources.get('image'), function(evt) + { + ui.showBackgroundImageDialog(); + mxEvent.consume(evt); + }) + + btn.style.position = 'absolute'; + btn.className = 'geColorBtn'; + btn.style.marginTop = '-4px'; + btn.style.paddingBottom = (document.documentMode == 11 || mxClient.IS_MT) ? '0px' : '2px'; + btn.style.height = '22px'; + btn.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px'; + btn.style.width = '56px'; + + bg.appendChild(btn); + } + + div.appendChild(bg); + } + + return div; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.addOptions = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + div.appendChild(this.createTitle(mxResources.get('options'))); + + if (graph.isEnabled()) + { + // Connection arrows + div.appendChild(this.createOption(mxResources.get('connectionArrows'), function() + { + return graph.connectionArrowsEnabled; + }, function(checked) + { + ui.actions.get('connectionArrows').funct(); + }, + { + install: function(apply) + { + this.listener = function() + { + apply(graph.connectionArrowsEnabled); + }; + + ui.addListener('connectionArrowsChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + })); + + // Connection points + div.appendChild(this.createOption(mxResources.get('connectionPoints'), function() + { + return graph.connectionHandler.isEnabled(); + }, function(checked) + { + ui.actions.get('connectionPoints').funct(); + }, + { + install: function(apply) + { + this.listener = function() + { + apply(graph.connectionHandler.isEnabled()); + }; + + ui.addListener('connectionPointsChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + })); + + // Guides + div.appendChild(this.createOption(mxResources.get('guides'), function() + { + return graph.graphHandler.guidesEnabled; + }, function(checked) + { + ui.actions.get('guides').funct(); + }, + { + install: function(apply) + { + this.listener = function() + { + apply(graph.graphHandler.guidesEnabled); + }; + + ui.addListener('guidesEnabledChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + })); + } + + return div; +}; + +/** + * + */ +DiagramFormatPanel.prototype.addGridOption = function(container) +{ + var fPanel = this; + var ui = this.editorUi; + var graph = ui.editor.graph; + + var input = document.createElement('input'); + input.style.position = 'absolute'; + input.style.textAlign = 'right'; + input.style.width = '38px'; + input.value = this.inUnit(graph.getGridSize()) + ' ' + this.getUnit(); + + var stepper = this.createStepper(input, update, this.getUnitStep(), null, null, null, this.isFloatUnit()); + input.style.display = (graph.isGridEnabled()) ? '' : 'none'; + stepper.style.display = input.style.display; + + mxEvent.addListener(input, 'keydown', function(e) + { + if (e.keyCode == 13) + { + graph.container.focus(); + mxEvent.consume(e); + } + else if (e.keyCode == 27) + { + input.value = graph.getGridSize(); + graph.container.focus(); + mxEvent.consume(e); + } + }); + + function update(evt) + { + var value = fPanel.isFloatUnit()? parseFloat(input.value) : parseInt(input.value); + value = fPanel.fromUnit(Math.max(fPanel.inUnit(1), (isNaN(value)) ? fPanel.inUnit(10) : value)); + + if (value != graph.getGridSize()) + { + graph.setGridSize(value) + } + + input.value = fPanel.inUnit(value) + ' ' + fPanel.getUnit(); + mxEvent.consume(evt); + }; + + mxEvent.addListener(input, 'blur', update); + mxEvent.addListener(input, 'change', update); + + var unitChangeListener = function(sender, evt) + { + input.value = fPanel.inUnit(graph.getGridSize()) + ' ' + fPanel.getUnit(); + fPanel.format.refresh(); + }; + + graph.view.addListener('unitChanged', unitChangeListener); + this.listeners.push({destroy: function() { graph.view.removeListener(unitChangeListener); }}); + + if (mxClient.IS_SVG) + { + input.style.marginTop = '-2px'; + input.style.right = '84px'; + stepper.style.marginTop = '-16px'; + stepper.style.right = '72px'; + + var panel = this.createColorOption(mxResources.get('grid'), function() + { + var color = graph.view.gridColor; + + return (graph.isGridEnabled()) ? color : null; + }, function(color) + { + var enabled = graph.isGridEnabled(); + + if (color == mxConstants.NONE) + { + graph.setGridEnabled(false); + } + else + { + graph.setGridEnabled(true); + ui.setGridColor(color); + } + + input.style.display = (graph.isGridEnabled()) ? '' : 'none'; + stepper.style.display = input.style.display; + + if (enabled != graph.isGridEnabled()) + { + ui.fireEvent(new mxEventObject('gridEnabledChanged')); + } + }, '#e0e0e0', + { + install: function(apply) + { + this.listener = function() + { + apply((graph.isGridEnabled()) ? graph.view.gridColor : null); + }; + + ui.addListener('gridColorChanged', this.listener); + ui.addListener('gridEnabledChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + }); + + panel.appendChild(input); + panel.appendChild(stepper); + container.appendChild(panel); + } + else + { + input.style.marginTop = '2px'; + input.style.right = '32px'; + stepper.style.marginTop = '2px'; + stepper.style.right = '20px'; + + container.appendChild(input); + container.appendChild(stepper); + + container.appendChild(this.createOption(mxResources.get('grid'), function() + { + return graph.isGridEnabled(); + }, function(checked) + { + graph.setGridEnabled(checked); + + if (graph.isGridEnabled()) + { + graph.view.gridColor = '#e0e0e0'; + } + + ui.fireEvent(new mxEventObject('gridEnabledChanged')); + }, + { + install: function(apply) + { + this.listener = function() + { + input.style.display = (graph.isGridEnabled()) ? '' : 'none'; + stepper.style.display = input.style.display; + + apply(graph.isGridEnabled()); + }; + + ui.addListener('gridEnabledChanged', this.listener); + }, + destroy: function() + { + ui.removeListener(this.listener); + } + })); + } +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.addDocumentProperties = function(div) +{ + // Hook for subclassers + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + div.appendChild(this.createTitle(mxResources.get('options'))); + + return div; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.addPaperSize = function(div) +{ + var ui = this.editorUi; + var editor = ui.editor; + var graph = editor.graph; + + div.appendChild(this.createTitle(mxResources.get('paperSize'))); + + var accessor = PageSetupDialog.addPageFormatPanel(div, 'formatpanel', graph.pageFormat, function(pageFormat) + { + if (graph.pageFormat == null || graph.pageFormat.width != pageFormat.width || + graph.pageFormat.height != pageFormat.height) + { + var change = new ChangePageSetup(ui, null, null, pageFormat); + change.ignoreColor = true; + change.ignoreImage = true; + + graph.model.execute(change); + } + }); + + this.addKeyHandler(accessor.widthInput, function() + { + accessor.set(graph.pageFormat); + }); + this.addKeyHandler(accessor.heightInput, function() + { + accessor.set(graph.pageFormat); + }); + + var listener = function() + { + accessor.set(graph.pageFormat); + }; + + ui.addListener('pageFormatChanged', listener); + this.listeners.push({destroy: function() { ui.removeListener(listener); }}); + + graph.getModel().addListener(mxEvent.CHANGE, listener); + this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); + + return div; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.addStyleOps = function(div) +{ + var btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('editData').funct(); + })); + + btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')'); + btn.style.width = '202px'; + btn.style.marginBottom = '2px'; + div.appendChild(btn); + + mxUtils.br(div); + + btn = mxUtils.button(mxResources.get('clearDefaultStyle'), mxUtils.bind(this, function(evt) + { + this.editorUi.actions.get('clearDefaultStyle').funct(); + })); + + btn.setAttribute('title', mxResources.get('clearDefaultStyle') + ' (' + this.editorUi.actions.get('clearDefaultStyle').shortcut + ')'); + btn.style.width = '202px'; + div.appendChild(btn); + + return div; +}; + +/** + * Adds the label menu items to the given menu and parent. + */ +DiagramFormatPanel.prototype.destroy = function() +{ + BaseFormatPanel.prototype.destroy.apply(this, arguments); + + if (this.gridEnabledListener) + { + this.editorUi.removeListener(this.gridEnabledListener); + this.gridEnabledListener = null; + } +}; diff --git a/public/js/grapheditor/js/Graph.js b/public/js/grapheditor/js/Graph.js new file mode 100644 index 000000000..b235e9fa5 --- /dev/null +++ b/public/js/grapheditor/js/Graph.js @@ -0,0 +1,10291 @@ +/** + * Copyright (c) 2006-2012, JGraph Ltd + */ +// Workaround for allowing target="_blank" in HTML sanitizer +// see https://code.google.com/p/google-caja/issues/detail?can=2&q=&colspec=ID%20Type%20Status%20Priority%20Owner%20Summary&groupby=&sort=&id=1296 +if (typeof html4 !== 'undefined') +{ + html4.ATTRIBS["a::target"] = 0; + html4.ATTRIBS["source::src"] = 0; + html4.ATTRIBS["video::src"] = 0; + // Would be nice for tooltips but probably a security risk... + //html4.ATTRIBS["video::autoplay"] = 0; + //html4.ATTRIBS["video::autobuffer"] = 0; +} + +// Workaround for handling named HTML entities in mxUtils.parseXml +// LATER: How to configure DOMParser to just ignore all entities? +(function() +{ + var entities = [ + ['nbsp', '160'], + ['shy', '173'] + ]; + + var parseXml = mxUtils.parseXml; + + mxUtils.parseXml = function(text) + { + for (var i = 0; i < entities.length; i++) + { + text = text.replace(new RegExp( + '&' + entities[i][0] + ';', 'g'), + '&#' + entities[i][1] + ';'); + } + + return parseXml(text); + }; +})(); + +// Shim for missing toISOString in older versions of IE +// See https://stackoverflow.com/questions/12907862 +if (!Date.prototype.toISOString) +{ + (function() + { + function pad(number) + { + var r = String(number); + + if (r.length === 1) + { + r = '0' + r; + } + + return r; + }; + + Date.prototype.toISOString = function() + { + return this.getUTCFullYear() + + '-' + pad( this.getUTCMonth() + 1 ) + + '-' + pad( this.getUTCDate() ) + + 'T' + pad( this.getUTCHours() ) + + ':' + pad( this.getUTCMinutes() ) + + ':' + pad( this.getUTCSeconds() ) + + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) + + 'Z'; + }; + }()); +} + +// Shim for Date.now() +if (!Date.now) +{ + Date.now = function() + { + return new Date().getTime(); + }; +} + +// Changes default colors +/** + * Measurements Units + */ +mxConstants.POINTS = 1; +mxConstants.MILLIMETERS = 2; +mxConstants.INCHES = 3; +/** + * This ratio is with page scale 1 + */ +mxConstants.PIXELS_PER_MM = 3.937; +mxConstants.PIXELS_PER_INCH = 100; + +mxConstants.SHADOW_OPACITY = 0.25; +mxConstants.SHADOWCOLOR = '#000000'; +mxConstants.VML_SHADOWCOLOR = '#d0d0d0'; +mxGraph.prototype.pageBreakColor = '#c0c0c0'; +mxGraph.prototype.pageScale = 1; + +// Letter page format is default in US, Canada and Mexico +(function() +{ + try + { + if (navigator != null && navigator.language != null) + { + var lang = navigator.language.toLowerCase(); + mxGraph.prototype.pageFormat = (lang === 'en-us' || lang === 'en-ca' || lang === 'es-mx') ? + mxConstants.PAGE_FORMAT_LETTER_PORTRAIT : mxConstants.PAGE_FORMAT_A4_PORTRAIT; + } + } + catch (e) + { + // ignore + } +})(); + +// Matches label positions of mxGraph 1.x +mxText.prototype.baseSpacingTop = 5; +mxText.prototype.baseSpacingBottom = 1; + +// Keeps edges between relative child cells inside parent +mxGraphModel.prototype.ignoreRelativeEdgeParent = false; + +// Defines grid properties +mxGraphView.prototype.gridImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhCgAKAJEAAAAAAP///8zMzP///yH5BAEAAAMALAAAAAAKAAoAAAIJ1I6py+0Po2wFADs=' : + IMAGE_PATH + '/grid.gif'; +mxGraphView.prototype.gridSteps = 4; +mxGraphView.prototype.minGridSize = 4; + +// UrlParams is null in embed mode +mxGraphView.prototype.defaultGridColor = '#d0d0d0'; +mxGraphView.prototype.gridColor = mxGraphView.prototype.defaultGridColor; + +//Units +mxGraphView.prototype.unit = mxConstants.POINTS; + +mxGraphView.prototype.setUnit = function(unit) +{ + if (this.unit != unit) + { + this.unit = unit; + + this.fireEvent(new mxEventObject('unitChanged', 'unit', unit)); + } +}; + +// Alternative text for unsupported foreignObjects +mxSvgCanvas2D.prototype.foAltText = '[Not supported by viewer]'; + +// Hook for custom constraints +mxShape.prototype.getConstraints = function(style, w, h) +{ + return null; +}; + +/** + * Constructs a new graph instance. Note that the constructor does not take a + * container because the graph instance is needed for creating the UI, which + * in turn will create the container for the graph. Hence, the container is + * assigned later in EditorUi. + */ +/** + * Defines graph class. + */ +Graph = function(container, model, renderHint, stylesheet, themes, standalone) +{ + mxGraph.call(this, container, model, renderHint, stylesheet); + + this.themes = themes || this.defaultThemes; + this.currentEdgeStyle = mxUtils.clone(this.defaultEdgeStyle); + this.currentVertexStyle = mxUtils.clone(this.defaultVertexStyle); + this.standalone = (standalone != null) ? standalone : false; + + // Sets the base domain URL and domain path URL for relative links. + var b = this.baseUrl; + var p = b.indexOf('//'); + this.domainUrl = ''; + this.domainPathUrl = ''; + + if (p > 0) + { + var d = b.indexOf('/', p + 2); + + if (d > 0) + { + this.domainUrl = b.substring(0, d); + } + + d = b.lastIndexOf('/'); + + if (d > 0) + { + this.domainPathUrl = b.substring(0, d + 1); + } + } + + // Adds support for HTML labels via style. Note: Currently, only the Java + // backend supports HTML labels but CSS support is limited to the following: + // http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html + // TODO: Wrap should not affect isHtmlLabel output (should be handled later) + this.isHtmlLabel = function(cell) + { + var style = this.getCurrentCellStyle(cell); + + return (style != null) ? (style['html'] == '1' || style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') : false; + }; + + // Implements a listener for hover and click handling on edges + if (this.edgeMode) + { + var start = { + point: null, + event: null, + state: null, + handle: null, + selected: false + }; + + // Uses this event to process mouseDown to check the selection state before it is changed + this.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt) + { + if (evt.getProperty('eventName') == 'mouseDown' && this.isEnabled()) + { + var me = evt.getProperty('event'); + + if (!mxEvent.isControlDown(me.getEvent()) && !mxEvent.isShiftDown(me.getEvent())) + { + var state = me.getState(); + + if (state != null) + { + // Checks if state was removed in call to stopEditing above + if (this.model.isEdge(state.cell)) + { + start.point = new mxPoint(me.getGraphX(), me.getGraphY()); + start.selected = this.isCellSelected(state.cell); + start.state = state; + start.event = me; + + if (state.text != null && state.text.boundingBox != null && + mxUtils.contains(state.text.boundingBox, me.getGraphX(), me.getGraphY())) + { + start.handle = mxEvent.LABEL_HANDLE; + } + else + { + var handler = this.selectionCellsHandler.getHandler(state.cell); + + if (handler != null && handler.bends != null && handler.bends.length > 0) + { + start.handle = handler.getHandleForEvent(me); + } + } + } + } + } + } + })); + + var mouseDown = null; + + this.addMouseListener( + { + mouseDown: function(sender, me) {}, + mouseMove: mxUtils.bind(this, function(sender, me) + { + // Checks if any other handler is active + var handlerMap = this.selectionCellsHandler.handlers.map; + + for (var key in handlerMap) + { + if (handlerMap[key].index != null) + { + return; + } + } + + if (this.isEnabled() && !this.panningHandler.isActive() && !mxEvent.isControlDown(me.getEvent()) && + !mxEvent.isShiftDown(me.getEvent()) && !mxEvent.isAltDown(me.getEvent())) + { + var tol = this.tolerance; + + if (start.point != null && start.state != null && start.event != null) + { + var state = start.state; + + if (Math.abs(start.point.x - me.getGraphX()) > tol || + Math.abs(start.point.y - me.getGraphY()) > tol) + { + // Lazy selection for edges inside groups + if (!this.isCellSelected(state.cell)) + { + this.setSelectionCell(state.cell); + } + + var handler = this.selectionCellsHandler.getHandler(state.cell); + + if (handler != null && handler.bends != null && handler.bends.length > 0) + { + var handle = handler.getHandleForEvent(start.event); + var edgeStyle = this.view.getEdgeStyle(state); + var entity = edgeStyle == mxEdgeStyle.EntityRelation; + + // Handles special case where label was clicked on unselected edge in which + // case the label will be moved regardless of the handle that is returned + if (!start.selected && start.handle == mxEvent.LABEL_HANDLE) + { + handle = start.handle; + } + + if (!entity || handle == 0 || handle == handler.bends.length - 1 || handle == mxEvent.LABEL_HANDLE) + { + // Source or target handle or connected for direct handle access or orthogonal line + // with just two points where the central handle is moved regardless of mouse position + if (handle == mxEvent.LABEL_HANDLE || handle == 0 || state.visibleSourceState != null || + handle == handler.bends.length - 1 || state.visibleTargetState != null) + { + if (!entity && handle != mxEvent.LABEL_HANDLE) + { + var pts = state.absolutePoints; + + // Default case where handles are at corner points handles + // drag of corner as drag of existing point + if (pts != null && ((edgeStyle == null && handle == null) || + edgeStyle == mxEdgeStyle.OrthConnector)) + { + // Does not use handles if they were not initially visible + handle = start.handle; + + if (handle == null) + { + var box = new mxRectangle(start.point.x, start.point.y); + box.grow(mxEdgeHandler.prototype.handleImage.width / 2); + + if (mxUtils.contains(box, pts[0].x, pts[0].y)) + { + // Moves source terminal handle + handle = 0; + } + else if (mxUtils.contains(box, pts[pts.length - 1].x, pts[pts.length - 1].y)) + { + // Moves target terminal handle + handle = handler.bends.length - 1; + } + else + { + // Checks if edge has no bends + var nobends = edgeStyle != null && (pts.length == 2 || (pts.length == 3 && + ((Math.round(pts[0].x - pts[1].x) == 0 && Math.round(pts[1].x - pts[2].x) == 0) || + (Math.round(pts[0].y - pts[1].y) == 0 && Math.round(pts[1].y - pts[2].y) == 0)))); + + if (nobends) + { + // Moves central handle for straight orthogonal edges + handle = 2; + } + else + { + // Finds and moves vertical or horizontal segment + handle = mxUtils.findNearestSegment(state, start.point.x, start.point.y); + + // Converts segment to virtual handle index + if (edgeStyle == null) + { + handle = mxEvent.VIRTUAL_HANDLE - handle; + } + // Maps segment to handle + else + { + handle += 1; + } + } + } + } + } + + // Creates a new waypoint and starts moving it + if (handle == null) + { + handle = mxEvent.VIRTUAL_HANDLE; + } + } + + handler.start(me.getGraphX(), me.getGraphX(), handle); + start.state = null; + start.event = null; + start.point = null; + start.handle = null; + start.selected = false; + me.consume(); + + // Removes preview rectangle in graph handler + this.graphHandler.reset(); + } + } + else if (entity && (state.visibleSourceState != null || state.visibleTargetState != null)) + { + // Disables moves on entity to make it consistent + this.graphHandler.reset(); + me.consume(); + } + } + } + } + else + { + // Updates cursor for unselected edges under the mouse + var state = me.getState(); + + if (state != null) + { + // Checks if state was removed in call to stopEditing above + if (this.model.isEdge(state.cell)) + { + var cursor = null; + var pts = state.absolutePoints; + + if (pts != null) + { + var box = new mxRectangle(me.getGraphX(), me.getGraphY()); + box.grow(mxEdgeHandler.prototype.handleImage.width / 2); + + if (state.text != null && state.text.boundingBox != null && + mxUtils.contains(state.text.boundingBox, me.getGraphX(), me.getGraphY())) + { + cursor = 'move'; + } + else if (mxUtils.contains(box, pts[0].x, pts[0].y) || + mxUtils.contains(box, pts[pts.length - 1].x, pts[pts.length - 1].y)) + { + cursor = 'pointer'; + } + else if (state.visibleSourceState != null || state.visibleTargetState != null) + { + // Moving is not allowed for entity relation but still indicate hover state + var tmp = this.view.getEdgeStyle(state); + cursor = 'crosshair'; + + if (tmp != mxEdgeStyle.EntityRelation && this.isOrthogonal(state)) + { + var idx = mxUtils.findNearestSegment(state, me.getGraphX(), me.getGraphY()); + + if (idx < pts.length - 1 && idx >= 0) + { + cursor = (Math.round(pts[idx].x - pts[idx + 1].x) == 0) ? + 'col-resize' : 'row-resize'; + } + } + } + } + + if (cursor != null) + { + state.setCursor(cursor); + } + } + } + } + } + }), + mouseUp: mxUtils.bind(this, function(sender, me) + { + start.state = null; + start.event = null; + start.point = null; + start.handle = null; + }) + }); + } + + // HTML entities are displayed as plain text in wrapped plain text labels + this.cellRenderer.getLabelValue = function(state) + { + var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments); + + if (state.view.graph.isHtmlLabel(state.cell)) + { + if (state.style['html'] != 1) + { + result = mxUtils.htmlEntities(result, false); + } + else + { + result = state.view.graph.sanitizeHtml(result); + } + } + + return result; + }; + + // All code below not available and not needed in embed mode + if (typeof mxVertexHandler !== 'undefined') + { + this.setConnectable(true); + this.setDropEnabled(true); + this.setPanning(true); + this.setTooltips(true); + this.setAllowLoops(true); + this.allowAutoPanning = true; + this.resetEdgesOnConnect = false; + this.constrainChildren = false; + this.constrainRelativeChildren = true; + + // Do not scroll after moving cells + this.graphHandler.scrollOnMove = false; + this.graphHandler.scaleGrid = true; + + // Disables cloning of connection sources by default + this.connectionHandler.setCreateTarget(false); + this.connectionHandler.insertBeforeSource = true; + + // Disables built-in connection starts + this.connectionHandler.isValidSource = function(cell, me) + { + return false; + }; + + // Sets the style to be used when an elbow edge is double clicked + this.alternateEdgeStyle = 'vertical'; + + if (stylesheet == null) + { + this.loadStylesheet(); + } + + // Adds page centers to the guides for moving cells + var graphHandlerGetGuideStates = this.graphHandler.getGuideStates; + this.graphHandler.getGuideStates = function() + { + var result = graphHandlerGetGuideStates.apply(this, arguments); + + // Create virtual cell state for page centers + if (this.graph.pageVisible) + { + var guides = []; + + var pf = this.graph.pageFormat; + var ps = this.graph.pageScale; + var pw = pf.width * ps; + var ph = pf.height * ps; + var t = this.graph.view.translate; + var s = this.graph.view.scale; + + var layout = this.graph.getPageLayout(); + + for (var i = 0; i < layout.width; i++) + { + guides.push(new mxRectangle(((layout.x + i) * pw + t.x) * s, + (layout.y * ph + t.y) * s, pw * s, ph * s)); + } + + for (var j = 1; j < layout.height; j++) + { + guides.push(new mxRectangle((layout.x * pw + t.x) * s, + ((layout.y + j) * ph + t.y) * s, pw * s, ph * s)); + } + + // Page center guides have precedence over normal guides + result = guides.concat(result); + } + + return result; + }; + + // Overrides zIndex for dragElement + mxDragSource.prototype.dragElementZIndex = mxPopupMenu.prototype.zIndex; + + // Overrides color for virtual guides for page centers + mxGuide.prototype.getGuideColor = function(state, horizontal) + { + return (state.cell == null) ? '#ffa500' /* orange */ : mxConstants.GUIDE_COLOR; + }; + + // Changes color of move preview for black backgrounds + this.graphHandler.createPreviewShape = function(bounds) + { + this.previewColor = (this.graph.background == '#000000') ? '#ffffff' : mxGraphHandler.prototype.previewColor; + + return mxGraphHandler.prototype.createPreviewShape.apply(this, arguments); + }; + + // Handles parts of cells by checking if part=1 is in the style and returning the parent + // if the parent is not already in the list of cells. container style is used to disable + // step into swimlanes and dropTarget style is used to disable acting as a drop target. + // LATER: Handle recursive parts + var graphHandlerGetCells = this.graphHandler.getCells; + + this.graphHandler.getCells = function(initialCell) + { + var cells = graphHandlerGetCells.apply(this, arguments); + var newCells = []; + + for (var i = 0; i < cells.length; i++) + { + var cell = this.graph.getCompositeParent(cells[i]); + + if (cell == cells[i]) + { + newCells.push(cells[i]); + } + else if (cell != null && mxUtils.indexOf(cells, cell) < 0) + { + newCells.push(cell); + } + } + + return newCells; + }; + + // Handles parts of cells for drag and drop + var graphHandlerStart = this.graphHandler.start; + + this.graphHandler.start = function(cell, x, y, cells) + { + cell = this.graph.getCompositeParent(cell); + + graphHandlerStart.apply(this, arguments); + }; + + // Handles parts of cells when cloning the source for new connections + this.connectionHandler.createTargetVertex = function(evt, source) + { + source = this.graph.getCompositeParent(source); + + return mxConnectionHandler.prototype.createTargetVertex.apply(this, arguments); + }; + + var rubberband = new mxRubberband(this); + + this.getRubberband = function() + { + return rubberband; + }; + + // Timer-based activation of outline connect in connection handler + var startTime = new Date().getTime(); + var timeOnTarget = 0; + + var connectionHandlerMouseMove = this.connectionHandler.mouseMove; + + this.connectionHandler.mouseMove = function() + { + var prev = this.currentState; + connectionHandlerMouseMove.apply(this, arguments); + + if (prev != this.currentState) + { + startTime = new Date().getTime(); + timeOnTarget = 0; + } + else + { + timeOnTarget = new Date().getTime() - startTime; + } + }; + + // Activates outline connect after 1500ms with touch event or if alt is pressed inside the shape + // outlineConnect=0 is a custom style that means do not connect to strokes inside the shape, + // or in other words, connect to the shape's perimeter if the highlight is under the mouse + // (the name is because the highlight, including all strokes, is called outline in the code) + var connectionHandleIsOutlineConnectEvent = this.connectionHandler.isOutlineConnectEvent; + + this.connectionHandler.isOutlineConnectEvent = function(me) + { + return (this.currentState != null && me.getState() == this.currentState && timeOnTarget > 2000) || + ((this.currentState == null || mxUtils.getValue(this.currentState.style, 'outlineConnect', '1') != '0') && + connectionHandleIsOutlineConnectEvent.apply(this, arguments)); + }; + + // Adds shift+click to toggle selection state + var isToggleEvent = this.isToggleEvent; + this.isToggleEvent = function(evt) + { + return isToggleEvent.apply(this, arguments) || (!mxClient.IS_CHROMEOS && mxEvent.isShiftDown(evt)); + }; + + // Workaround for Firefox where first mouse down is received + // after tap and hold if scrollbars are visible, which means + // start rubberband immediately if no cell is under mouse. + var isForceRubberBandEvent = rubberband.isForceRubberbandEvent; + rubberband.isForceRubberbandEvent = function(me) + { + return (isForceRubberBandEvent.apply(this, arguments) && !mxEvent.isShiftDown(me.getEvent()) && + !mxEvent.isControlDown(me.getEvent())) || (mxClient.IS_CHROMEOS && mxEvent.isShiftDown(me.getEvent())) || + (mxUtils.hasScrollbars(this.graph.container) && mxClient.IS_FF && + mxClient.IS_WIN && me.getState() == null && mxEvent.isTouchEvent(me.getEvent())); + }; + + // Shows hand cursor while panning + var prevCursor = null; + + this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function() + { + if (this.isEnabled()) + { + prevCursor = this.container.style.cursor; + this.container.style.cursor = 'move'; + } + })); + + this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function() + { + if (this.isEnabled()) + { + this.container.style.cursor = prevCursor; + } + })); + + this.popupMenuHandler.autoExpand = true; + + this.popupMenuHandler.isSelectOnPopup = function(me) + { + return mxEvent.isMouseEvent(me.getEvent()); + }; + + // Handles links if graph is read-only or cell is locked + var click = this.click; + this.click = function(me) + { + var locked = me.state == null && me.sourceState != null && + this.isCellLocked(me.sourceState.cell); + + if ((!this.isEnabled() || locked) && !me.isConsumed()) + { + var cell = (locked) ? me.sourceState.cell : me.getCell(); + + if (cell != null) + { + var link = this.getClickableLinkForCell(cell); + + if (link != null) + { + if (this.isCustomLink(link)) + { + this.customLinkClicked(link); + } + else + { + this.openLink(link); + } + } + } + + if (this.isEnabled() && locked) + { + this.clearSelection(); + } + } + else + { + return click.apply(this, arguments); + } + }; + + // Redirects tooltips for locked cells + this.tooltipHandler.getStateForEvent = function(me) + { + return me.sourceState; + }; + + // Redirects cursor for locked cells + var getCursorForMouseEvent = this.getCursorForMouseEvent; + this.getCursorForMouseEvent = function(me) + { + var locked = me.state == null && me.sourceState != null && this.isCellLocked(me.sourceState.cell); + + return this.getCursorForCell((locked) ? me.sourceState.cell : me.getCell()); + }; + + // Shows pointer cursor for clickable cells with links + // ie. if the graph is disabled and cells cannot be selected + var getCursorForCell = this.getCursorForCell; + this.getCursorForCell = function(cell) + { + if (!this.isEnabled() || this.isCellLocked(cell)) + { + var link = this.getClickableLinkForCell(cell); + + if (link != null) + { + return 'pointer'; + } + else if (this.isCellLocked(cell)) + { + return 'default'; + } + } + + return getCursorForCell.apply(this, arguments); + }; + + // Changes rubberband selection to be recursive + this.selectRegion = function(rect, evt) + { + var cells = this.getAllCells(rect.x, rect.y, rect.width, rect.height); + this.selectCellsForEvent(cells, evt); + + return cells; + }; + + // Recursive implementation for rubberband selection + this.getAllCells = function(x, y, width, height, parent, result) + { + result = (result != null) ? result : []; + + if (width > 0 || height > 0) + { + var model = this.getModel(); + var right = x + width; + var bottom = y + height; + + if (parent == null) + { + parent = this.getCurrentRoot(); + + if (parent == null) + { + parent = model.getRoot(); + } + } + + if (parent != null) + { + var childCount = model.getChildCount(parent); + + for (var i = 0; i < childCount; i++) + { + var cell = model.getChildAt(parent, i); + var state = this.view.getState(cell); + + if (state != null && this.isCellVisible(cell) && mxUtils.getValue(state.style, 'locked', '0') != '1') + { + var deg = mxUtils.getValue(state.style, mxConstants.STYLE_ROTATION) || 0; + var box = state; + + if (deg != 0) + { + box = mxUtils.getBoundingBox(box, deg); + } + + if ((model.isEdge(cell) || model.isVertex(cell)) && + box.x >= x && box.y + box.height <= bottom && + box.y >= y && box.x + box.width <= right) + { + result.push(cell); + } + + this.getAllCells(x, y, width, height, cell, result); + } + } + } + } + + return result; + }; + + // Never removes cells from parents that are being moved + var graphHandlerShouldRemoveCellsFromParent = this.graphHandler.shouldRemoveCellsFromParent; + this.graphHandler.shouldRemoveCellsFromParent = function(parent, cells, evt) + { + if (this.graph.isCellSelected(parent)) + { + return false; + } + + return graphHandlerShouldRemoveCellsFromParent.apply(this, arguments); + }; + + // Unlocks all cells + this.isCellLocked = function(cell) + { + var pState = this.view.getState(cell); + + while (pState != null) + { + if (mxUtils.getValue(pState.style, 'locked', '0') == '1') + { + return true; + } + + pState = this.view.getState(this.model.getParent(pState.cell)); + } + + return false; + }; + + var tapAndHoldSelection = null; + + // Uses this event to process mouseDown to check the selection state before it is changed + this.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt) + { + if (evt.getProperty('eventName') == 'mouseDown') + { + var me = evt.getProperty('event'); + var state = me.getState(); + + if (state != null && !this.isSelectionEmpty() && !this.isCellSelected(state.cell)) + { + tapAndHoldSelection = this.getSelectionCells(); + } + else + { + tapAndHoldSelection = null; + } + } + })); + + // Tap and hold on background starts rubberband for multiple selected + // cells the cell associated with the event is deselected + this.addListener(mxEvent.TAP_AND_HOLD, mxUtils.bind(this, function(sender, evt) + { + if (!mxEvent.isMultiTouchEvent(evt)) + { + var me = evt.getProperty('event'); + var cell = evt.getProperty('cell'); + + if (cell == null) + { + var pt = mxUtils.convertPoint(this.container, + mxEvent.getClientX(me), mxEvent.getClientY(me)); + rubberband.start(pt.x, pt.y); + } + else if (tapAndHoldSelection != null) + { + this.addSelectionCells(tapAndHoldSelection); + } + else if (this.getSelectionCount() > 1 && this.isCellSelected(cell)) + { + this.removeSelectionCell(cell); + } + + // Blocks further processing of the event + tapAndHoldSelection = null; + evt.consume(); + } + })); + + // On connect the target is selected and we clone the cell of the preview edge for insert + this.connectionHandler.selectCells = function(edge, target) + { + this.graph.setSelectionCell(target || edge); + }; + + // Shows connection points only if cell not selected + this.connectionHandler.constraintHandler.isStateIgnored = function(state, source) + { + return source && state.view.graph.isCellSelected(state.cell); + }; + + // Updates constraint handler if the selection changes + this.selectionModel.addListener(mxEvent.CHANGE, mxUtils.bind(this, function() + { + var ch = this.connectionHandler.constraintHandler; + + if (ch.currentFocus != null && ch.isStateIgnored(ch.currentFocus, true)) + { + ch.currentFocus = null; + ch.constraints = null; + ch.destroyIcons(); + } + + ch.destroyFocusHighlight(); + })); + + // Initializes touch interface + if (Graph.touchStyle) + { + this.initTouch(); + } + + /** + * Adds locking + */ + var graphUpdateMouseEvent = this.updateMouseEvent; + this.updateMouseEvent = function(me) + { + me = graphUpdateMouseEvent.apply(this, arguments); + + if (me.state != null && this.isCellLocked(me.getCell())) + { + me.state = null; + } + + return me; + }; + } + + //Create a unique offset object for each graph instance. + this.currentTranslate = new mxPoint(0, 0); +}; + +/** + * Specifies if the touch UI should be used (cannot detect touch in FF so always on for Windows/Linux) + */ +Graph.touchStyle = mxClient.IS_TOUCH || (mxClient.IS_FF && mxClient.IS_WIN) || navigator.maxTouchPoints > 0 || + navigator.msMaxTouchPoints > 0 || window.urlParams == null || urlParams['touch'] == '1'; + +/** + * Shortcut for capability check. + */ +Graph.fileSupport = window.File != null && window.FileReader != null && window.FileList != null && + (window.urlParams == null || urlParams['filesupport'] != '0'); + +/** + * Default size for line jumps. + */ +Graph.lineJumpsEnabled = true; + +/** + * Default size for line jumps. + */ +Graph.defaultJumpSize = 6; + +/** + * Minimum width for table columns. + */ +Graph.minTableColumnWidth = 20; + +/** + * Minimum height for table rows. + */ +Graph.minTableRowHeight = 20; + +/** + * Text for foreign object warning. + */ +Graph.foreignObjectWarningText = 'Viewer does not support full SVG 1.1'; + +/** + * Link for foreign object warning. + */ +Graph.foreignObjectWarningLink = 'https://desk.draw.io/support/solutions/articles/16000042487'; + +/** + * Helper function for creating SVG data URI. + */ +Graph.createSvgImage = function(w, h, data, coordWidth, coordHeight) +{ + var tmp = unescape(encodeURIComponent( + '' + + '' + data + '')); + + return new mxImage('data:image/svg+xml;base64,' + ((window.btoa) ? btoa(tmp) : Base64.encode(tmp, true)), w, h) +}; + +/** + * Removes all illegal control characters with ASCII code <32 except TAB, LF + * and CR. + */ +Graph.zapGremlins = function(text) +{ + var checked = []; + + for (var i = 0; i < text.length; i++) + { + var code = text.charCodeAt(i); + + // Removes all control chars except TAB, LF and CR + if ((code >= 32 || code == 9 || code == 10 || code == 13) && + code != 0xFFFF && code != 0xFFFE) + { + checked.push(text.charAt(i)); + } + } + + return checked.join(''); +}; + +/** + * Turns the given string into an array. + */ +Graph.stringToBytes = function(str) +{ + var arr = new Array(str.length); + + for (var i = 0; i < str.length; i++) + { + arr[i] = str.charCodeAt(i); + } + + return arr; +}; + +/** + * Turns the given array into a string. + */ +Graph.bytesToString = function(arr) +{ + var result = new Array(arr.length); + + for (var i = 0; i < arr.length; i++) + { + result[i] = String.fromCharCode(arr[i]); + } + + return result.join(''); +}; + +/** + * Returns a base64 encoded version of the compressed outer XML of the given node. + */ +Graph.compressNode = function(node, checked) +{ + var xml = mxUtils.getXml(node); + + return Graph.compress((checked) ? xml : Graph.zapGremlins(xml)); +}; + +/** + * Returns a base64 encoded version of the compressed string. + */ +Graph.compress = function(data, deflate) +{ + if (data == null || data.length == 0 || typeof(pako) === 'undefined') + { + return data; + } + else + { + var tmp = (deflate) ? pako.deflate(encodeURIComponent(data), {to: 'string'}) : + pako.deflateRaw(encodeURIComponent(data), {to: 'string'}); + + return (window.btoa) ? btoa(tmp) : Base64.encode(tmp, true); + } +}; + +/** + * Returns a decompressed version of the base64 encoded string. + */ +Graph.decompress = function(data, inflate, checked) +{ + if (data == null || data.length == 0 || typeof(pako) === 'undefined') + { + return data; + } + else + { + var tmp = (window.atob) ? atob(data) : Base64.decode(data, true); + + var inflated = decodeURIComponent((inflate) ? + pako.inflate(tmp, {to: 'string'}) : + pako.inflateRaw(tmp, {to: 'string'})); + + return (checked) ? inflated : Graph.zapGremlins(inflated); + } +}; + +/** + * Graph inherits from mxGraph. + */ +mxUtils.extend(Graph, mxGraph); + +/** + * Allows all values in fit. + */ +Graph.prototype.minFitScale = null; + +/** + * Allows all values in fit. + */ +Graph.prototype.maxFitScale = null; + +/** + * Sets the policy for links. Possible values are "self" to replace any framesets, + * "blank" to load the URL in and "auto" (default). + */ +Graph.prototype.linkPolicy = (urlParams['target'] == 'frame') ? 'blank' : (urlParams['target'] || 'auto'); + +/** + * Target for links that open in a new window. Default is _blank. + */ +Graph.prototype.linkTarget = (urlParams['target'] == 'frame') ? '_self' : '_blank'; + +/** + * Value to the rel attribute of links. Default is 'nofollow noopener noreferrer'. + * NOTE: There are security implications when this is changed and if noopener is removed, + * then must be overridden to allow for the opener to be set by default. + */ +Graph.prototype.linkRelation = 'nofollow noopener noreferrer'; + +/** + * Scrollbars are enabled on non-touch devices (not including Firefox because touch events + * cannot be detected in Firefox, see above). + */ +Graph.prototype.defaultScrollbars = !mxClient.IS_IOS; + +/** + * Specifies if the page should be visible for new files. Default is true. + */ +Graph.prototype.defaultPageVisible = true; + +/** + * Specifies if the app should run in chromeless mode. Default is false. + * This default is only used if the contructor argument is null. + */ +Graph.prototype.lightbox = false; + +/** + * + */ +Graph.prototype.defaultPageBackgroundColor = '#ffffff'; + +/** + * + */ +Graph.prototype.defaultPageBorderColor = '#ffffff'; + +/** + * Specifies the size of the size for "tiles" to be used for a graph with + * scrollbars but no visible background page. A good value is large + * enough to reduce the number of repaints that is caused for auto- + * translation, which depends on this value, and small enough to give + * a small empty buffer around the graph. Default is 400x400. + */ +Graph.prototype.scrollTileSize = new mxRectangle(0, 0, 400, 400); + +/** + * Overrides the background color and paints a transparent background. + */ +Graph.prototype.transparentBackground = true; + +/** + * Sets global constants. + */ +Graph.prototype.selectParentAfterDelete = false; + +/** + * Sets the default target for all links in cells. + */ +Graph.prototype.defaultEdgeLength = 80; + +/** + * Disables move of bends/segments without selecting. + */ +Graph.prototype.edgeMode = false; + +/** + * Allows all values in fit. + */ +Graph.prototype.connectionArrowsEnabled = true; + +/** + * Specifies the regular expression for matching placeholders. + */ +Graph.prototype.placeholderPattern = new RegExp('%(date\{.*\}|[^%^\{^\}]+)%', 'g'); + +/** + * Specifies the regular expression for matching placeholders. + */ +Graph.prototype.absoluteUrlPattern = new RegExp('^(?:[a-z]+:)?//', 'i'); + +/** + * Specifies the default name for the theme. Default is 'default'. + */ +Graph.prototype.defaultThemeName = 'default'; + +/** + * Specifies the default name for the theme. Default is 'default'. + */ +Graph.prototype.defaultThemes = {}; + +/** + * Base URL for relative links. + */ +Graph.prototype.baseUrl = (urlParams['base'] != null) ? + decodeURIComponent(urlParams['base']) : + (((window != window.top) ? document.referrer : + document.location.toString()).split('#')[0]); + +/** + * Specifies if the label should be edited after an insert. + */ +Graph.prototype.editAfterInsert = false; + +/** + * Defines the built-in properties to be ignored in tooltips. + */ +Graph.prototype.builtInProperties = ['label', 'tooltip', 'placeholders', 'placeholder']; + +/** + * Defines if the graph is part of an EditorUi. If this is false the graph can + * be used in an EditorUi instance but will not have a UI added, functions + * overridden or event handlers added. + */ +Graph.prototype.standalone = false; + +/** + * Installs child layout styles. + */ +Graph.prototype.init = function(container) +{ + mxGraph.prototype.init.apply(this, arguments); + + // Intercepts links with no target attribute and opens in new window + this.cellRenderer.initializeLabel = function(state, shape) + { + mxCellRenderer.prototype.initializeLabel.apply(this, arguments); + + // Checks tolerance for clicks on links + var tol = state.view.graph.tolerance; + var handleClick = true; + var first = null; + + var down = mxUtils.bind(this, function(evt) + { + handleClick = true; + first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + }); + + var move = mxUtils.bind(this, function(evt) + { + handleClick = handleClick && first != null && + Math.abs(first.x - mxEvent.getClientX(evt)) < tol && + Math.abs(first.y - mxEvent.getClientY(evt)) < tol; + }); + + var up = mxUtils.bind(this, function(evt) + { + if (handleClick) + { + var elt = mxEvent.getSource(evt) + + while (elt != null && elt != shape.node) + { + if (elt.nodeName.toLowerCase() == 'a') + { + state.view.graph.labelLinkClicked(state, elt, evt); + break; + } + + elt = elt.parentNode; + } + } + }); + + mxEvent.addGestureListeners(shape.node, down, move, up); + mxEvent.addListener(shape.node, 'click', function(evt) + { + mxEvent.consume(evt); + }); + }; + + this.initLayoutManager(); +}; + +/** + * Implements zoom and offset via CSS transforms. This is currently only used + * in read-only as there are fewer issues with the mxCellState not being scaled + * and translated. + * + * KNOWN ISSUES TO FIX: + * - Apply CSS transforms to HTML labels in IE11 + */ +(function() +{ + /** + * Uses CSS transforms for scale and translate. + */ + Graph.prototype.useCssTransforms = false; + + /** + * Contains the scale. + */ + Graph.prototype.currentScale = 1; + + /** + * Contains the offset. + */ + Graph.prototype.currentTranslate = new mxPoint(0, 0); + + /** + * Returns true if fast zoom preview should be used. + */ + Graph.prototype.isFastZoomEnabled = function() + { + return urlParams['zoom'] != 'nocss' && !mxClient.NO_FO && !mxClient.IS_EDGE && + !this.useCssTransforms && this.isCssTransformsSupported(); + }; + + /** + * Only foreignObject supported for now (no IE11). Safari disabled as it ignores + * overflow visible on foreignObject in negative space (lightbox and viewer). + */ + Graph.prototype.isCssTransformsSupported = function() + { + return this.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO && + (!this.lightbox || !mxClient.IS_SF); + }; + + /** + * Function: getCellAt + * + * Needs to modify original method for recursive call. + */ + Graph.prototype.getCellAt = function(x, y, parent, vertices, edges, ignoreFn) + { + if (this.useCssTransforms) + { + x = x / this.currentScale - this.currentTranslate.x; + y = y / this.currentScale - this.currentTranslate.y; + } + + return this.getScaledCellAt.apply(this, arguments); + }; + + /** + * Function: getScaledCellAt + * + * Overridden for recursion. + */ + Graph.prototype.getScaledCellAt = function(x, y, parent, vertices, edges, ignoreFn) + { + vertices = (vertices != null) ? vertices : true; + edges = (edges != null) ? edges : true; + + if (parent == null) + { + parent = this.getCurrentRoot(); + + if (parent == null) + { + parent = this.getModel().getRoot(); + } + } + + if (parent != null) + { + var childCount = this.model.getChildCount(parent); + + for (var i = childCount - 1; i >= 0; i--) + { + var cell = this.model.getChildAt(parent, i); + var result = this.getScaledCellAt(x, y, cell, vertices, edges, ignoreFn); + + if (result != null) + { + return result; + } + else if (this.isCellVisible(cell) && (edges && this.model.isEdge(cell) || + vertices && this.model.isVertex(cell))) + { + var state = this.view.getState(cell); + + if (state != null && (ignoreFn == null || !ignoreFn(state, x, y)) && + this.intersects(state, x, y)) + { + return cell; + } + } + } + } + + return null; + }; + + /** + * Returns if the child cells of the given vertex cell state should be resized. + */ + Graph.prototype.isRecursiveVertexResize = function(state) + { + return !this.isSwimlane(state.cell) && this.model.getChildCount(state.cell) > 0 && + !this.isCellCollapsed(state.cell) && mxUtils.getValue(state.style, 'recursiveResize', '1') == '1' && + mxUtils.getValue(state.style, 'childLayout', null) == null; + } + + /** + * Returns the first parent that is not a part. + */ + Graph.prototype.isPart = function(cell) + { + return (!this.model.isVertex(cell)) ? false : + mxUtils.getValue(this.getCurrentCellStyle(cell), 'part', '0') == '1'; + }; + + /** + * Returns the first parent that is not a part. + */ + Graph.prototype.getCompositeParent = function(cell) + { + while (this.isPart(cell)) + { + cell = this.model.getParent(cell); + } + + return cell; + }; + + /** + * Function: repaint + * + * Updates the highlight after a change of the model or view. + */ + mxCellHighlight.prototype.getStrokeWidth = function(state) + { + var s = this.strokeWidth; + + if (this.graph.useCssTransforms) + { + s /= this.graph.currentScale; + } + + return s; + }; + + /** + * Function: getGraphBounds + * + * Overrides getGraphBounds to use bounding box from SVG. + */ + mxGraphView.prototype.getGraphBounds = function() + { + var b = this.graphBounds; + + if (this.graph.useCssTransforms) + { + var t = this.graph.currentTranslate; + var s = this.graph.currentScale; + + b = new mxRectangle( + (b.x + t.x) * s, (b.y + t.y) * s, + b.width * s, b.height * s); + } + + return b; + }; + + /** + * Function: viewStateChanged + * + * Overrides to bypass full cell tree validation. + * TODO: Check if this improves performance + */ + mxGraphView.prototype.viewStateChanged = function() + { + if (this.graph.useCssTransforms) + { + this.validate(); + this.graph.sizeDidChange(); + } + else + { + this.revalidate(); + this.graph.sizeDidChange(); + } + }; + + /** + * Function: validate + * + * Overrides validate to normalize validation view state and pass + * current state to CSS transform. + */ + var graphViewValidate = mxGraphView.prototype.validate; + + mxGraphView.prototype.validate = function(cell) + { + if (this.graph.useCssTransforms) + { + this.graph.currentScale = this.scale; + this.graph.currentTranslate.x = this.translate.x; + this.graph.currentTranslate.y = this.translate.y; + + this.scale = 1; + this.translate.x = 0; + this.translate.y = 0; + } + + graphViewValidate.apply(this, arguments); + + if (this.graph.useCssTransforms) + { + this.graph.updateCssTransform(); + + this.scale = this.graph.currentScale; + this.translate.x = this.graph.currentTranslate.x; + this.translate.y = this.graph.currentTranslate.y; + } + }; + + /** + * Function: updateCssTransform + * + * Zooms out of the graph by . + */ + Graph.prototype.updateCssTransform = function() + { + var temp = this.view.getDrawPane(); + + if (temp != null) + { + var g = temp.parentNode; + + if (!this.useCssTransforms) + { + g.removeAttribute('transformOrigin'); + g.removeAttribute('transform'); + } + else + { + var prev = g.getAttribute('transform'); + g.setAttribute('transformOrigin', '0 0'); + var s = Math.round(this.currentScale * 100) / 100; + var dx = Math.round(this.currentTranslate.x * 100) / 100; + var dy = Math.round(this.currentTranslate.y * 100) / 100; + g.setAttribute('transform', 'scale(' + s + ',' + s + ')' + + 'translate(' + dx + ',' + dy + ')'); + + // Applies workarounds only if translate has changed + if (prev != g.getAttribute('transform')) + { + try + { + // Applies transform to labels outside of the SVG DOM + // Excluded via isCssTransformsSupported + // if (mxClient.NO_FO) + // { + // var transform = 'scale(' + this.currentScale + ')' + 'translate(' + + // this.currentTranslate.x + 'px,' + this.currentTranslate.y + 'px)'; + // + // this.view.states.visit(mxUtils.bind(this, function(cell, state) + // { + // if (state.text != null && state.text.node != null) + // { + // // Stores initial CSS transform that is used for the label alignment + // if (state.text.originalTransform == null) + // { + // state.text.originalTransform = state.text.node.style.transform; + // } + // + // state.text.node.style.transform = transform + state.text.originalTransform; + // } + // })); + // } + // Workaround for https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4320441/ + if (mxClient.IS_EDGE) + { + // Recommended workaround is to do this on all + // foreignObjects, but this seems to be faster + var val = g.style.display; + g.style.display = 'none'; + g.getBBox(); + g.style.display = val; + } + } + catch (e) + { + // ignore + } + } + } + } + }; + + var graphViewValidateBackgroundPage = mxGraphView.prototype.validateBackgroundPage; + + mxGraphView.prototype.validateBackgroundPage = function() + { + var useCssTranforms = this.graph.useCssTransforms, scale = this.scale, + translate = this.translate; + + if (useCssTranforms) + { + this.scale = this.graph.currentScale; + this.translate = this.graph.currentTranslate; + } + + graphViewValidateBackgroundPage.apply(this, arguments); + + if (useCssTranforms) + { + this.scale = scale; + this.translate = translate; + } + }; + + var graphUpdatePageBreaks = mxGraph.prototype.updatePageBreaks; + + mxGraph.prototype.updatePageBreaks = function(visible, width, height) + { + var useCssTranforms = this.useCssTransforms, scale = this.view.scale, + translate = this.view.translate; + + if (useCssTranforms) + { + this.view.scale = 1; + this.view.translate = new mxPoint(0, 0); + this.useCssTransforms = false; + } + + graphUpdatePageBreaks.apply(this, arguments); + + if (useCssTranforms) + { + this.view.scale = scale; + this.view.translate = translate; + this.useCssTransforms = true; + } + }; + +})(); + +/** + * Sets the XML node for the current diagram. + */ +Graph.prototype.isLightboxView = function() +{ + return this.lightbox; +}; + +/** + * Sets the XML node for the current diagram. + */ +Graph.prototype.isViewer = function() +{ + return false; +}; + +/** + * Installs automatic layout via styles + */ +Graph.prototype.labelLinkClicked = function(state, elt, evt) +{ + var href = elt.getAttribute('href'); + + if (href != null && !this.isCustomLink(href) && (mxEvent.isLeftMouseButton(evt) && + !mxEvent.isPopupTrigger(evt)) || mxEvent.isTouchEvent(evt)) + { + if (!this.isEnabled() || this.isCellLocked(state.cell)) + { + var target = this.isBlankLink(href) ? this.linkTarget : '_top'; + this.openLink(this.getAbsoluteUrl(href), target); + } + + mxEvent.consume(evt); + } +}; + +/** + * Returns the size of the page format scaled with the page size. + */ +Graph.prototype.openLink = function(href, target, allowOpener) +{ + var result = window; + + try + { + // Workaround for blocking in same iframe + if (target == '_self' && window != window.top) + { + window.location.href = href; + } + else + { + // Avoids page reload for anchors (workaround for IE but used everywhere) + if (href.substring(0, this.baseUrl.length) == this.baseUrl && + href.charAt(this.baseUrl.length) == '#' && + target == '_top' && window == window.top) + { + var hash = href.split('#')[1]; + + // Forces navigation if on same hash + if (window.location.hash == '#' + hash) + { + window.location.hash = ''; + } + + window.location.hash = hash; + } + else + { + result = window.open(href, (target != null) ? target : '_blank'); + + if (result != null && !allowOpener) + { + result.opener = null; + } + } + } + } + catch (e) + { + // ignores permission denied + } + + return result; +}; + +/** + * Adds support for page links. + */ +Graph.prototype.getLinkTitle = function(href) +{ + return href.substring(href.lastIndexOf('/') + 1); +}; + +/** + * Adds support for page links. + */ +Graph.prototype.isCustomLink = function(href) +{ + return href.substring(0, 5) == 'data:'; +}; + +/** + * Adds support for page links. + */ +Graph.prototype.customLinkClicked = function(link) +{ + return false; +}; + +/** + * Returns true if the given href references an external protocol that + * should never open in a new window. Default returns true for mailto. + */ +Graph.prototype.isExternalProtocol = function(href) +{ + return href.substring(0, 7) === 'mailto:'; +}; + +/** + * Hook for links to open in same window. Default returns true for anchors, + * links to same domain or if target == 'self' in the config. + */ +Graph.prototype.isBlankLink = function(href) +{ + return !this.isExternalProtocol(href) && + (this.linkPolicy === 'blank' || + (this.linkPolicy !== 'self' && + !this.isRelativeUrl(href) && + href.substring(0, this.domainUrl.length) !== this.domainUrl)); +}; + +/** + * + */ +Graph.prototype.isRelativeUrl = function(url) +{ + return url != null && !this.absoluteUrlPattern.test(url) && + url.substring(0, 5) !== 'data:' && + !this.isExternalProtocol(url); +}; + +/** + * + */ +Graph.prototype.getAbsoluteUrl = function(url) +{ + if (url != null && this.isRelativeUrl(url)) + { + if (url.charAt(0) == '#') + { + url = this.baseUrl + url; + } + else if (url.charAt(0) == '/') + { + url = this.domainUrl + url; + } + else + { + url = this.domainPathUrl + url; + } + } + + return url; +}; + +/** + * Installs automatic layout via styles + */ +Graph.prototype.initLayoutManager = function() +{ + this.layoutManager = new mxLayoutManager(this); + + // Using shared instances for table layouts + var rowLayout = new TableRowLayout(this); + var tableLayout = new TableLayout(this); + + this.layoutManager.getLayout = function(cell, eventName) + { + // Workaround for possible invalid style after change and before view validation + if (eventName != mxEvent.BEGIN_UPDATE) + { + var style = this.graph.getCellStyle(cell); + + if (style != null) + { + if (style['childLayout'] == 'stackLayout') + { + var stackLayout = new mxStackLayout(this.graph, true); + stackLayout.resizeParentMax = mxUtils.getValue(style, 'resizeParentMax', '1') == '1'; + stackLayout.horizontal = mxUtils.getValue(style, 'horizontalStack', '1') == '1'; + stackLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1'; + stackLayout.resizeLast = mxUtils.getValue(style, 'resizeLast', '0') == '1'; + stackLayout.spacing = style['stackSpacing'] || stackLayout.spacing; + stackLayout.border = style['stackBorder'] || stackLayout.border; + stackLayout.marginLeft = style['marginLeft'] || 0; + stackLayout.marginRight = style['marginRight'] || 0; + stackLayout.marginTop = style['marginTop'] || 0; + stackLayout.marginBottom = style['marginBottom'] || 0; + stackLayout.fill = true; + + return stackLayout; + } + else if (style['childLayout'] == 'treeLayout') + { + var treeLayout = new mxCompactTreeLayout(this.graph); + treeLayout.horizontal = mxUtils.getValue(style, 'horizontalTree', '1') == '1'; + treeLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1'; + treeLayout.groupPadding = mxUtils.getValue(style, 'parentPadding', 20); + treeLayout.levelDistance = mxUtils.getValue(style, 'treeLevelDistance', 30); + treeLayout.maintainParentLocation = true; + treeLayout.edgeRouting = false; + treeLayout.resetEdges = false; + + return treeLayout; + } + else if (style['childLayout'] == 'flowLayout') + { + var flowLayout = new mxHierarchicalLayout(this.graph, mxUtils.getValue(style, + 'flowOrientation', mxConstants.DIRECTION_EAST)); + flowLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1'; + flowLayout.parentBorder = mxUtils.getValue(style, 'parentPadding', 20); + flowLayout.maintainParentLocation = true; + + // Special undocumented styles for changing the hierarchical + flowLayout.intraCellSpacing = mxUtils.getValue(style, 'intraCellSpacing', + mxHierarchicalLayout.prototype.intraCellSpacing); + flowLayout.interRankCellSpacing = mxUtils.getValue(style, 'interRankCellSpacing', + mxHierarchicalLayout.prototype.interRankCellSpacing); + flowLayout.interHierarchySpacing = mxUtils.getValue(style, 'interHierarchySpacing', + mxHierarchicalLayout.prototype.interHierarchySpacing); + flowLayout.parallelEdgeSpacing = mxUtils.getValue(style, 'parallelEdgeSpacing', + mxHierarchicalLayout.prototype.parallelEdgeSpacing); + + return flowLayout; + } + else if (style['childLayout'] == 'circleLayout') + { + return new mxCircleLayout(this.graph); + } + else if (style['childLayout'] == 'organicLayout') + { + return new mxFastOrganicLayout(this.graph); + } + else if (this.graph.isTableRow(cell) || + this.graph.isTableCell(cell)) + { + return rowLayout; + } + else if (this.graph.isTable(cell)) + { + return tableLayout; + } + } + } + + return null; + }; +}; + +/** + * Returns the size of the page format scaled with the page size. + */ +Graph.prototype.getPageSize = function() +{ + return (this.pageVisible) ? new mxRectangle(0, 0, this.pageFormat.width * this.pageScale, + this.pageFormat.height * this.pageScale) : this.scrollTileSize; +}; + +/** + * Returns a rectangle describing the position and count of the + * background pages, where x and y are the position of the top, + * left page and width and height are the vertical and horizontal + * page count. + */ +Graph.prototype.getPageLayout = function() +{ + var size = this.getPageSize(); + var bounds = this.getGraphBounds(); + + if (bounds.width == 0 || bounds.height == 0) + { + return new mxRectangle(0, 0, 1, 1); + } + else + { + var x0 = Math.floor(Math.ceil(bounds.x / this.view.scale - + this.view.translate.x) / size.width); + var y0 = Math.floor(Math.ceil(bounds.y / this.view.scale - + this.view.translate.y) / size.height); + var w0 = Math.ceil((Math.floor((bounds.x + bounds.width) / this.view.scale) - + this.view.translate.x) / size.width) - x0; + var h0 = Math.ceil((Math.floor((bounds.y + bounds.height) / this.view.scale) - + this.view.translate.y) / size.height) - y0; + + return new mxRectangle(x0, y0, w0, h0); + } +}; + +/** + * Sanitizes the given HTML markup. + */ +Graph.prototype.sanitizeHtml = function(value, editing) +{ + // Uses https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer + // NOTE: Original minimized sanitizer was modified to support + // data URIs for images, mailto and special data:-links. + // LATER: Add MathML to whitelisted tags + function urlX(link) + { + if (link != null && link.toString().toLowerCase().substring(0, 11) !== 'javascript:') + { + return link; + } + + return null; + }; + function idX(id) { return id }; + + return html_sanitize(value, urlX, idX); +}; + +/** + * Revalidates all cells with placeholders in the current graph model. + */ +Graph.prototype.updatePlaceholders = function() +{ + var model = this.model; + var validate = false; + + for (var key in this.model.cells) + { + var cell = this.model.cells[key]; + + if (this.isReplacePlaceholders(cell)) + { + this.view.invalidate(cell, false, false); + validate = true; + } + } + + if (validate) + { + this.view.validate(); + } +}; + +/** + * Adds support for placeholders in labels. + */ +Graph.prototype.isReplacePlaceholders = function(cell) +{ + return cell.value != null && typeof(cell.value) == 'object' && + cell.value.getAttribute('placeholders') == '1'; +}; + +/** + * Returns true if the given mouse wheel event should be used for zooming. This + * is invoked if no dialogs are showing and returns true with Alt or Control + * (or cmd in macOS only) is pressed. + */ +Graph.prototype.isZoomWheelEvent = function(evt) +{ + return mxEvent.isAltDown(evt) || (mxEvent.isMetaDown(evt) && mxClient.IS_MAC) || + mxEvent.isControlDown(evt); +}; + +/** + * Returns true if the given scroll wheel event should be used for scrolling. + */ +Graph.prototype.isScrollWheelEvent = function(evt) +{ + return !this.isZoomWheelEvent(evt); +}; + +/** + * Adds Alt+click to select cells behind cells (Shift+Click on Chrome OS). + */ +Graph.prototype.isTransparentClickEvent = function(evt) +{ + return mxEvent.isAltDown(evt) || (mxClient.IS_CHROMEOS && mxEvent.isShiftDown(evt)); +}; + +/** + * Adds ctrl+shift+connect to disable connections. + */ +Graph.prototype.isIgnoreTerminalEvent = function(evt) +{ + return mxEvent.isShiftDown(evt) && mxEvent.isControlDown(evt); +}; + +/** + * Adds support for placeholders in labels. + */ +Graph.prototype.isSplitTarget = function(target, cells, evt) +{ + return !this.model.isEdge(cells[0]) && + !mxEvent.isAltDown(evt) && !mxEvent.isShiftDown(evt) && + mxGraph.prototype.isSplitTarget.apply(this, arguments); +}; + +/** + * Adds support for placeholders in labels. + */ +Graph.prototype.getLabel = function(cell) +{ + var result = mxGraph.prototype.getLabel.apply(this, arguments); + + if (result != null && this.isReplacePlaceholders(cell) && cell.getAttribute('placeholder') == null) + { + result = this.replacePlaceholders(cell, result); + } + + return result; +}; + +/** + * Adds labelMovable style. + */ +Graph.prototype.isLabelMovable = function(cell) +{ + var style = this.getCurrentCellStyle(cell); + + return !this.isCellLocked(cell) && + ((this.model.isEdge(cell) && this.edgeLabelsMovable) || + (this.model.isVertex(cell) && (this.vertexLabelsMovable || + mxUtils.getValue(style, 'labelMovable', '0') == '1'))); +}; + +/** + * Adds event if grid size is changed. + */ +Graph.prototype.setGridSize = function(value) +{ + this.gridSize = value; + this.fireEvent(new mxEventObject('gridSizeChanged')); +}; + +/** + * Function: getClickableLinkForCell + * + * Returns the first non-null link for the cell or its ancestors. + * + * Parameters: + * + * cell - whose link should be returned. + */ +Graph.prototype.getClickableLinkForCell = function(cell) +{ + do + { + var link = this.getLinkForCell(cell); + + if (link != null) + { + return link; + } + + cell = this.model.getParent(cell); + } while (cell != null); + + return null; +}; + +/** + * Private helper method. + */ +Graph.prototype.getGlobalVariable = function(name) +{ + var val = null; + + if (name == 'date') + { + val = new Date().toLocaleDateString(); + } + else if (name == 'time') + { + val = new Date().toLocaleTimeString(); + } + else if (name == 'timestamp') + { + val = new Date().toLocaleString(); + } + else if (name.substring(0, 5) == 'date{') + { + var fmt = name.substring(5, name.length - 1); + val = this.formatDate(new Date(), fmt); + } + + return val; +}; + +/** + * Formats a date, see http://blog.stevenlevithan.com/archives/date-time-format + */ +Graph.prototype.formatDate = function(date, mask, utc) +{ + // LATER: Cache regexs + if (this.dateFormatCache == null) + { + this.dateFormatCache = { + i18n: { + dayNames: [ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + ] + }, + + masks: { + "default": "ddd mmm dd yyyy HH:MM:ss", + shortDate: "m/d/yy", + mediumDate: "mmm d, yyyy", + longDate: "mmmm d, yyyy", + fullDate: "dddd, mmmm d, yyyy", + shortTime: "h:MM TT", + mediumTime: "h:MM:ss TT", + longTime: "h:MM:ss TT Z", + isoDate: "yyyy-mm-dd", + isoTime: "HH:MM:ss", + isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", + isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" + } + }; + } + + var dF = this.dateFormatCache; + var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, + timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, + timezoneClip = /[^-+\dA-Z]/g, + pad = function (val, len) { + val = String(val); + len = len || 2; + while (val.length < len) val = "0" + val; + return val; + }; + + // You can't provide utc if you skip other args (use the "UTC:" mask prefix) + if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { + mask = date; + date = undefined; + } + + // Passing date through Date applies Date.parse, if necessary + date = date ? new Date(date) : new Date; + if (isNaN(date)) throw SyntaxError("invalid date"); + + mask = String(dF.masks[mask] || mask || dF.masks["default"]); + + // Allow setting the utc argument via the mask + if (mask.slice(0, 4) == "UTC:") { + mask = mask.slice(4); + utc = true; + } + + var _ = utc ? "getUTC" : "get", + d = date[_ + "Date"](), + D = date[_ + "Day"](), + m = date[_ + "Month"](), + y = date[_ + "FullYear"](), + H = date[_ + "Hours"](), + M = date[_ + "Minutes"](), + s = date[_ + "Seconds"](), + L = date[_ + "Milliseconds"](), + o = utc ? 0 : date.getTimezoneOffset(), + flags = { + d: d, + dd: pad(d), + ddd: dF.i18n.dayNames[D], + dddd: dF.i18n.dayNames[D + 7], + m: m + 1, + mm: pad(m + 1), + mmm: dF.i18n.monthNames[m], + mmmm: dF.i18n.monthNames[m + 12], + yy: String(y).slice(2), + yyyy: y, + h: H % 12 || 12, + hh: pad(H % 12 || 12), + H: H, + HH: pad(H), + M: M, + MM: pad(M), + s: s, + ss: pad(s), + l: pad(L, 3), + L: pad(L > 99 ? Math.round(L / 10) : L), + t: H < 12 ? "a" : "p", + tt: H < 12 ? "am" : "pm", + T: H < 12 ? "A" : "P", + TT: H < 12 ? "AM" : "PM", + Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), + o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), + S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] + }; + + return mask.replace(token, function ($0) + { + return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); + }); +}; + +/** + * + */ +Graph.prototype.createLayersDialog = function() +{ + var div = document.createElement('div'); + div.style.position = 'absolute'; + + var model = this.getModel(); + var childCount = model.getChildCount(model.root); + + for (var i = 0; i < childCount; i++) + { + (mxUtils.bind(this, function(layer) + { + var span = document.createElement('div'); + span.style.overflow = 'hidden'; + span.style.textOverflow = 'ellipsis'; + span.style.padding = '2px'; + span.style.whiteSpace = 'nowrap'; + + var cb = document.createElement('input'); + cb.style.display = 'inline-block'; + cb.setAttribute('type', 'checkbox'); + + if (model.isVisible(layer)) + { + cb.setAttribute('checked', 'checked'); + cb.defaultChecked = true; + } + + span.appendChild(cb); + + var title = this.convertValueToString(layer) || (mxResources.get('background') || 'Background'); + span.setAttribute('title', title); + mxUtils.write(span, title); + div.appendChild(span); + + mxEvent.addListener(cb, 'click', function() + { + if (cb.getAttribute('checked') != null) + { + cb.removeAttribute('checked'); + } + else + { + cb.setAttribute('checked', 'checked'); + } + + model.setVisible(layer, cb.checked); + }); + })(model.getChildAt(model.root, i))); + } + + return div; +}; + +/** + * Private helper method. + */ +Graph.prototype.replacePlaceholders = function(cell, str) +{ + var result = []; + + if (str != null) + { + var last = 0; + + while (match = this.placeholderPattern.exec(str)) + { + var val = match[0]; + + if (val.length > 2 && val != '%label%' && val != '%tooltip%') + { + var tmp = null; + + if (match.index > last && str.charAt(match.index - 1) == '%') + { + tmp = val.substring(1); + } + else + { + var name = val.substring(1, val.length - 1); + + // Workaround for invalid char for getting attribute in older versions of IE + if (name.indexOf('{') < 0) + { + var current = cell; + + while (tmp == null && current != null) + { + if (current.value != null && typeof(current.value) == 'object') + { + tmp = (current.hasAttribute(name)) ? ((current.getAttribute(name) != null) ? + current.getAttribute(name) : '') : null; + } + + current = this.model.getParent(current); + } + } + + if (tmp == null) + { + tmp = this.getGlobalVariable(name); + } + } + + result.push(str.substring(last, match.index) + ((tmp != null) ? tmp : val)); + last = match.index + val.length; + } + } + + result.push(str.substring(last)); + } + + return result.join(''); +}; + +/** + * Resolves the given cells in the model and selects them. + */ +Graph.prototype.restoreSelection = function(cells) +{ + if (cells != null && cells.length > 0) + { + var temp = []; + + for (var i = 0; i < cells.length; i++) + { + var newCell = this.model.getCell(cells[i].id); + + if (newCell != null) + { + temp.push(newCell); + } + } + + this.setSelectionCells(temp); + } + else + { + this.clearSelection(); + } +}; + +/** + * Selects cells for connect vertex return value. + */ +Graph.prototype.selectCellsForConnectVertex = function(cells, evt, hoverIcons) +{ + // Selects only target vertex if one exists + if (cells.length == 2 && this.model.isVertex(cells[1])) + { + this.setSelectionCell(cells[1]); + this.scrollCellToVisible(cells[1]); + + if (hoverIcons != null) + { + // Adds hover icons for cloned vertex or hides icons + if (mxEvent.isTouchEvent(evt)) + { + hoverIcons.update(hoverIcons.getState(this.view.getState(cells[1]))); + } + else + { + hoverIcons.reset(); + } + } + } + else + { + this.setSelectionCells(cells); + } +}; + +/** + * Adds a connection to the given vertex. + */ +Graph.prototype.connectVertex = function(source, direction, length, evt, forceClone, ignoreCellAt) +{ + // Ignores relative edge labels + if (source.geometry.relative && this.model.isEdge(source.parent)) + { + return []; + } + + ignoreCellAt = (ignoreCellAt) ? ignoreCellAt : false; + + var pt = (source.geometry.relative && source.parent.geometry != null) ? + new mxPoint(source.parent.geometry.width * source.geometry.x, source.parent.geometry.height * source.geometry.y) : + new mxPoint(source.geometry.x, source.geometry.y); + + if (direction == mxConstants.DIRECTION_NORTH) + { + pt.x += source.geometry.width / 2; + pt.y -= length ; + } + else if (direction == mxConstants.DIRECTION_SOUTH) + { + pt.x += source.geometry.width / 2; + pt.y += source.geometry.height + length; + } + else if (direction == mxConstants.DIRECTION_WEST) + { + pt.x -= length; + pt.y += source.geometry.height / 2; + } + else + { + pt.x += source.geometry.width + length; + pt.y += source.geometry.height / 2; + } + + var parentState = this.view.getState(this.model.getParent(source)); + var s = this.view.scale; + var t = this.view.translate; + var dx = t.x * s; + var dy = t.y * s; + + if (parentState != null && this.model.isVertex(parentState.cell)) + { + dx = parentState.x; + dy = parentState.y; + } + + // Workaround for relative child cells + if (this.model.isVertex(source.parent) && source.geometry.relative) + { + pt.x += source.parent.geometry.x; + pt.y += source.parent.geometry.y; + } + + // Checks actual end point of edge for target cell + var target = (ignoreCellAt || (mxEvent.isControlDown(evt) && !forceClone)) ? + null : this.getCellAt(dx + pt.x * s, dy + pt.y * s); + + if (this.model.isAncestor(target, source)) + { + target = null; + } + + // Checks if target or ancestor is locked + var temp = target; + + while (temp != null) + { + if (this.isCellLocked(temp)) + { + target = null; + break; + } + + temp = this.model.getParent(temp); + } + + // Checks if source and target intersect + if (target != null) + { + var sourceState = this.view.getState(source); + var targetState = this.view.getState(target); + + if (sourceState != null && targetState != null && mxUtils.intersects(sourceState, targetState)) + { + target = null; + } + } + + var duplicate = !mxEvent.isShiftDown(evt) || forceClone; + + if (duplicate) + { + if (direction == mxConstants.DIRECTION_NORTH) + { + pt.y -= source.geometry.height / 2; + } + else if (direction == mxConstants.DIRECTION_SOUTH) + { + pt.y += source.geometry.height / 2; + } + else if (direction == mxConstants.DIRECTION_WEST) + { + pt.x -= source.geometry.width / 2; + } + else + { + pt.x += source.geometry.width / 2; + } + } + + // Uses connectable parent vertex if one exists + if (target != null && !this.isCellConnectable(target)) + { + var parent = this.getModel().getParent(target); + + if (this.getModel().isVertex(parent) && this.isCellConnectable(parent)) + { + target = parent; + } + } + + if (target == source || this.model.isEdge(target) || !this.isCellConnectable(target)) + { + target = null; + } + + var result = []; + + this.model.beginUpdate(); + try + { + var swimlane = target != null && this.isSwimlane(target); + var realTarget = (!swimlane) ? target : null; + + if (realTarget == null && duplicate) + { + // Handles relative children + var cellToClone = source; + var geo = this.getCellGeometry(source); + + while (geo != null && geo.relative) + { + cellToClone = this.getModel().getParent(cellToClone); + geo = this.getCellGeometry(cellToClone); + } + + // Handle consistuents for cloning + cellToClone = this.getCompositeParent(cellToClone); + realTarget = this.duplicateCells([cellToClone], false)[0]; + + var geo = this.getCellGeometry(realTarget); + + if (geo != null) + { + geo.x = pt.x - geo.width / 2; + geo.y = pt.y - geo.height / 2; + } + + if (swimlane) + { + this.addCells([realTarget], target, null, null, null, true); + target = null; + } + } + + // Never connects children in stack layouts + var layout = null; + + if (this.layoutManager != null) + { + layout = this.layoutManager.getLayout(this.model.getParent(source)); + } + + var edge = ((mxEvent.isControlDown(evt) && duplicate) || (target == null && layout != null && layout.constructor == mxStackLayout)) ? null : + this.insertEdge(this.model.getParent(source), null, '', source, realTarget, this.createCurrentEdgeStyle()); + + // Inserts edge before source + if (edge != null && this.connectionHandler.insertBeforeSource) + { + var index = null; + var tmp = source; + + while (tmp.parent != null && tmp.geometry != null && + tmp.geometry.relative && tmp.parent != edge.parent) + { + tmp = this.model.getParent(tmp); + } + + if (tmp != null && tmp.parent != null && tmp.parent == edge.parent) + { + var index = tmp.parent.getIndex(tmp); + this.model.add(tmp.parent, edge, index); + } + } + + // Special case: Click on west icon puts clone before cell + if (target == null && realTarget != null && layout != null && source.parent != null && + layout.constructor == mxStackLayout && direction == mxConstants.DIRECTION_WEST) + { + var index = source.parent.getIndex(source); + this.model.add(source.parent, realTarget, index); + } + + if (edge != null) + { + result.push(edge); + } + + if (target == null && realTarget != null) + { + result.push(realTarget); + } + + if (realTarget == null && edge != null) + { + edge.geometry.setTerminalPoint(pt, false); + } + + if (edge != null) + { + this.fireEvent(new mxEventObject('cellsInserted', 'cells', [edge])); + } + } + finally + { + this.model.endUpdate(); + } + + return result; +}; + +/** + * Returns all labels in the diagram as a string. + */ +Graph.prototype.getIndexableText = function() +{ + var tmp = document.createElement('div'); + var labels = []; + var label = ''; + + for (var key in this.model.cells) + { + var cell = this.model.cells[key]; + + if (this.model.isVertex(cell) || this.model.isEdge(cell)) + { + if (this.isHtmlLabel(cell)) + { + tmp.innerHTML = this.getLabel(cell); + label = mxUtils.extractTextWithWhitespace([tmp]); + } + else + { + label = this.getLabel(cell); + } + + label = mxUtils.trim(label.replace(/[\x00-\x1F\x7F-\x9F]|\s+/g, ' ')); + + if (label.length > 0) + { + labels.push(label); + } + } + } + + return labels.join(' '); +}; + +/** + * Returns the label for the given cell. + */ +Graph.prototype.convertValueToString = function(cell) +{ + var value = this.model.getValue(cell); + + if (value != null && typeof(value) == 'object') + { + if (this.isReplacePlaceholders(cell) && cell.getAttribute('placeholder') != null) + { + var name = cell.getAttribute('placeholder'); + var current = cell; + var result = null; + + while (result == null && current != null) + { + if (current.value != null && typeof(current.value) == 'object') + { + result = (current.hasAttribute(name)) ? ((current.getAttribute(name) != null) ? + current.getAttribute(name) : '') : null; + } + + current = this.model.getParent(current); + } + + return result || ''; + } + else + { + return value.getAttribute('label') || ''; + } + } + + return mxGraph.prototype.convertValueToString.apply(this, arguments); +}; + +/** + * Returns the link for the given cell. + */ +Graph.prototype.getLinksForState = function(state) +{ + if (state != null && state.text != null && state.text.node != null) + { + return state.text.node.getElementsByTagName('a'); + } + + return null; +}; + +/** + * Returns the link for the given cell. + */ +Graph.prototype.getLinkForCell = function(cell) +{ + if (cell.value != null && typeof(cell.value) == 'object') + { + var link = cell.value.getAttribute('link'); + + // Removes links with leading javascript: protocol + // TODO: Check more possible attack vectors + if (link != null && link.toLowerCase().substring(0, 11) === 'javascript:') + { + link = link.substring(11); + } + + return link; + } + + return null; +}; + +/** + * Overrides label orientation for collapsed swimlanes inside stack. + */ +Graph.prototype.getCellStyle = function(cell) +{ + var style = mxGraph.prototype.getCellStyle.apply(this, arguments); + + if (cell != null && this.layoutManager != null) + { + var parent = this.model.getParent(cell); + + if (this.model.isVertex(parent) && this.isCellCollapsed(cell)) + { + var layout = this.layoutManager.getLayout(parent); + + if (layout != null && layout.constructor == mxStackLayout) + { + style[mxConstants.STYLE_HORIZONTAL] = !layout.horizontal; + } + } + } + + return style; +}; + +/** + * Disables alternate width persistence for stack layout parents + */ +Graph.prototype.updateAlternateBounds = function(cell, geo, willCollapse) +{ + if (cell != null && geo != null && this.layoutManager != null && geo.alternateBounds != null) + { + var layout = this.layoutManager.getLayout(this.model.getParent(cell)); + + if (layout != null && layout.constructor == mxStackLayout) + { + if (layout.horizontal) + { + geo.alternateBounds.height = 0; + } + else + { + geo.alternateBounds.width = 0; + } + } + } + + mxGraph.prototype.updateAlternateBounds.apply(this, arguments); +}; + +/** + * Adds Shift+collapse/expand and size management for folding inside stack + */ +Graph.prototype.isMoveCellsEvent = function(evt, state) +{ + return mxEvent.isShiftDown(evt) || mxUtils.getValue(state.style, 'moveCells', '0') == '1'; +}; + +/** + * Adds Shift+collapse/expand and size management for folding inside stack + */ +Graph.prototype.foldCells = function(collapse, recurse, cells, checkFoldable, evt) +{ + recurse = (recurse != null) ? recurse : false; + + if (cells == null) + { + cells = this.getFoldableCells(this.getSelectionCells(), collapse); + } + + if (cells != null) + { + this.model.beginUpdate(); + + try + { + mxGraph.prototype.foldCells.apply(this, arguments); + + // Resizes all parent stacks if alt is not pressed + if (this.layoutManager != null) + { + for (var i = 0; i < cells.length; i++) + { + var state = this.view.getState(cells[i]); + var geo = this.getCellGeometry(cells[i]); + + if (state != null && geo != null) + { + var dx = Math.round(geo.width - state.width / this.view.scale); + var dy = Math.round(geo.height - state.height / this.view.scale); + + if (dy != 0 || dx != 0) + { + var parent = this.model.getParent(cells[i]); + var layout = this.layoutManager.getLayout(parent); + + if (layout == null) + { + // Moves cells to the right and down after collapse/expand + if (evt != null && this.isMoveCellsEvent(evt, state)) + { + this.moveSiblings(state, parent, dx, dy); + } + } + else if ((evt == null || !mxEvent.isAltDown(evt)) && + layout.constructor == mxStackLayout && !layout.resizeLast) + { + this.resizeParentStacks(parent, layout, dx, dy); + } + } + } + } + } + } + finally + { + this.model.endUpdate(); + } + + // Selects cells after folding + if (this.isEnabled()) + { + this.setSelectionCells(cells); + } + } +}; + +/** + * Overrides label orientation for collapsed swimlanes inside stack. + */ +Graph.prototype.moveSiblings = function(state, parent, dx, dy) +{ + this.model.beginUpdate(); + try + { + var cells = this.getCellsBeyond(state.x, state.y, parent, true, true); + + for (var i = 0; i < cells.length; i++) + { + if (cells[i] != state.cell) + { + var tmp = this.view.getState(cells[i]); + var geo = this.getCellGeometry(cells[i]); + + if (tmp != null && geo != null) + { + geo = geo.clone(); + geo.translate(Math.round(dx * Math.max(0, Math.min(1, (tmp.x - state.x) / state.width))), + Math.round(dy * Math.max(0, Math.min(1, (tmp.y - state.y) / state.height)))); + this.model.setGeometry(cells[i], geo); + } + } + } + } + finally + { + this.model.endUpdate(); + } +}; + +/** + * Overrides label orientation for collapsed swimlanes inside stack. + */ +Graph.prototype.resizeParentStacks = function(parent, layout, dx, dy) +{ + if (this.layoutManager != null && layout != null && layout.constructor == mxStackLayout && !layout.resizeLast) + { + this.model.beginUpdate(); + try + { + var dir = layout.horizontal; + + // Bubble resize up for all parent stack layouts with same orientation + while (parent != null && layout != null && layout.constructor == mxStackLayout && + layout.horizontal == dir && !layout.resizeLast) + { + var pgeo = this.getCellGeometry(parent); + var pstate = this.view.getState(parent); + + if (pstate != null && pgeo != null) + { + pgeo = pgeo.clone(); + + if (layout.horizontal) + { + pgeo.width += dx + Math.min(0, pstate.width / this.view.scale - pgeo.width); + } + else + { + pgeo.height += dy + Math.min(0, pstate.height / this.view.scale - pgeo.height); + } + + this.model.setGeometry(parent, pgeo); + } + + parent = this.model.getParent(parent); + layout = this.layoutManager.getLayout(parent); + } + } + finally + { + this.model.endUpdate(); + } + } +}; + +/** + * Disables drill-down for non-swimlanes. + */ +Graph.prototype.isContainer = function(cell) +{ + var style = this.getCurrentCellStyle(cell); + + if (this.isSwimlane(cell)) + { + return style['container'] != '0'; + } + else + { + return style['container'] == '1'; + } +}; + +/** + * Adds a expand style. + */ +Graph.prototype.isExtendParent = function(cell) +{ + var parent = this.model.getParent(cell); + + if (parent != null) + { + var style = this.getCurrentCellStyle(parent); + + if (style['expand'] != null) + { + return style['expand'] != '0'; + } + } + + return mxGraph.prototype.isExtendParent.apply(this, arguments); +}; + +/** + * Adds a connectable style. + */ +Graph.prototype.isCellConnectable = function(cell) +{ + var style = this.getCurrentCellStyle(cell); + + return (style['connectable'] != null) ? style['connectable'] != '0' : + mxGraph.prototype.isCellConnectable.apply(this, arguments); +}; + +/** + * Adds labelMovable style. + */ +Graph.prototype.isLabelMovable = function(cell) +{ + var style = this.getCurrentCellStyle(cell); + + return (style['movableLabel'] != null) ? style['movableLabel'] != '0' : + mxGraph.prototype.isLabelMovable.apply(this, arguments); +}; + +/** + * Function: selectAll + * + * Selects all children of the given parent cell or the children of the + * default parent if no parent is specified. To select leaf vertices and/or + * edges use . + * + * Parameters: + * + * parent - Optional whose children should be selected. + * Default is . + */ +Graph.prototype.selectAll = function(parent) +{ + parent = parent || this.getDefaultParent(); + + if (!this.isCellLocked(parent)) + { + mxGraph.prototype.selectAll.apply(this, arguments); + } +}; + +/** + * Function: selectCells + * + * Selects all vertices and/or edges depending on the given boolean + * arguments recursively, starting at the given parent or the default + * parent if no parent is specified. Use to select all cells. + * For vertices, only cells with no children are selected. + * + * Parameters: + * + * vertices - Boolean indicating if vertices should be selected. + * edges - Boolean indicating if edges should be selected. + * parent - Optional that acts as the root of the recursion. + * Default is . + */ +Graph.prototype.selectCells = function(vertices, edges, parent) +{ + parent = parent || this.getDefaultParent(); + + if (!this.isCellLocked(parent)) + { + mxGraph.prototype.selectCells.apply(this, arguments); + } +}; + +/** + * Function: getSwimlaneAt + * + * Returns the bottom-most swimlane that intersects the given point (x, y) + * in the cell hierarchy that starts at the given parent. + * + * Parameters: + * + * x - X-coordinate of the location to be checked. + * y - Y-coordinate of the location to be checked. + * parent - that should be used as the root of the recursion. + * Default is . + */ +Graph.prototype.getSwimlaneAt = function (x, y, parent) +{ + var result = mxGraph.prototype.getSwimlaneAt.apply(this, arguments); + + if (this.isCellLocked(result)) + { + result = null; + } + + return result; +}; + +/** + * Disables folding for non-swimlanes. + */ +Graph.prototype.isCellFoldable = function(cell) +{ + var style = this.getCurrentCellStyle(cell); + + return this.foldingEnabled && (style['treeFolding'] == '1' || + (!this.isCellLocked(cell) && + ((this.isContainer(cell) && style['collapsible'] != '0') || + (!this.isContainer(cell) && style['collapsible'] == '1')))); +}; + +/** + * Stops all interactions and clears the selection. + */ +Graph.prototype.reset = function() +{ + if (this.isEditing()) + { + this.stopEditing(true); + } + + this.escape(); + + if (!this.isSelectionEmpty()) + { + this.clearSelection(); + } +}; + +/** + * Overridden to limit zoom to 1% - 16.000%. + */ +Graph.prototype.zoom = function(factor, center) +{ + factor = Math.max(0.01, Math.min(this.view.scale * factor, 160)) / this.view.scale; + + mxGraph.prototype.zoom.apply(this, arguments); +}; + +/** + * Function: zoomIn + * + * Zooms into the graph by . + */ +Graph.prototype.zoomIn = function() +{ + // Switches to 1% zoom steps below 15% + if (this.view.scale < 0.15) + { + this.zoom((this.view.scale + 0.01) / this.view.scale); + } + else + { + // Uses to 5% zoom steps for better grid rendering in webkit + // and to avoid rounding errors for zoom steps + this.zoom((Math.round(this.view.scale * this.zoomFactor * 20) / 20) / this.view.scale); + } +}; + +/** + * Function: zoomOut + * + * Zooms out of the graph by . + */ +Graph.prototype.zoomOut = function() +{ + // Switches to 1% zoom steps below 15% + if (this.view.scale <= 0.15) + { + this.zoom((this.view.scale - 0.01) / this.view.scale); + } + else + { + // Uses to 5% zoom steps for better grid rendering in webkit + // and to avoid rounding errors for zoom steps + this.zoom((Math.round(this.view.scale * (1 / this.zoomFactor) * 20) / 20) / this.view.scale); + } +}; + +/** + * Overrides tooltips to show custom tooltip or metadata. + */ +Graph.prototype.getTooltipForCell = function(cell) +{ + var tip = ''; + + if (mxUtils.isNode(cell.value)) + { + var tmp = cell.value.getAttribute('tooltip'); + + if (tmp != null) + { + if (tmp != null && this.isReplacePlaceholders(cell)) + { + tmp = this.replacePlaceholders(cell, tmp); + } + + tip = this.sanitizeHtml(tmp); + } + else + { + var ignored = this.builtInProperties; + var attrs = cell.value.attributes; + var temp = []; + + // Hides links in edit mode + if (this.isEnabled()) + { + ignored.push('link'); + } + + for (var i = 0; i < attrs.length; i++) + { + if (mxUtils.indexOf(ignored, attrs[i].nodeName) < 0 && attrs[i].nodeValue.length > 0) + { + temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue}); + } + } + + // Sorts by name + temp.sort(function(a, b) + { + if (a.name < b.name) + { + return -1; + } + else if (a.name > b.name) + { + return 1; + } + else + { + return 0; + } + }); + + for (var i = 0; i < temp.length; i++) + { + if (temp[i].name != 'link' || !this.isCustomLink(temp[i].value)) + { + tip += ((temp[i].name != 'link') ? '' + temp[i].name + ': ' : '') + + mxUtils.htmlEntities(temp[i].value) + '\n'; + } + } + + if (tip.length > 0) + { + tip = tip.substring(0, tip.length - 1); + + if (mxClient.IS_SVG) + { + tip = '
' + tip + '
'; + } + } + } + } + + return tip; +}; + +/** + * Turns the given string into an array. + */ +Graph.prototype.stringToBytes = function(str) +{ + return Graph.stringToBytes(str); +}; + +/** + * Turns the given array into a string. + */ +Graph.prototype.bytesToString = function(arr) +{ + return Graph.bytesToString(arr); +}; + +/** + * Returns a base64 encoded version of the compressed outer XML of the given node. + */ +Graph.prototype.compressNode = function(node) +{ + return Graph.compressNode(node); +}; + +/** + * Returns a base64 encoded version of the compressed string. + */ +Graph.prototype.compress = function(data, deflate) +{ + return Graph.compress(data, deflate); +}; + +/** + * Returns a decompressed version of the base64 encoded string. + */ +Graph.prototype.decompress = function(data, inflate) +{ + return Graph.decompress(data, inflate); +}; + +/** + * Redirects to Graph.zapGremlins. + */ +Graph.prototype.zapGremlins = function(text) +{ + return Graph.zapGremlins(text); +}; + +/** + * Hover icons are used for hover, vertex handler and drag from sidebar. + */ +HoverIcons = function(graph) +{ + this.graph = graph; + this.init(); +}; + +/** + * Up arrow. + */ +HoverIcons.prototype.arrowSpacing = 2; + +/** + * Delay to switch to another state for overlapping bbox. Default is 500ms. + */ +HoverIcons.prototype.updateDelay = 500; + +/** + * Delay to switch between states. Default is 140ms. + */ +HoverIcons.prototype.activationDelay = 140; + +/** + * Up arrow. + */ +HoverIcons.prototype.currentState = null; + +/** + * Up arrow. + */ +HoverIcons.prototype.activeArrow = null; + +/** + * Up arrow. + */ +HoverIcons.prototype.inactiveOpacity = 15; + +/** + * Up arrow. + */ +HoverIcons.prototype.cssCursor = 'copy'; + +/** + * Whether to hide arrows that collide with vertices. + * LATER: Add keyboard override, touch support. + */ +HoverIcons.prototype.checkCollisions = true; + +/** + * Up arrow. + */ +HoverIcons.prototype.arrowFill = '#29b6f2'; + +/** + * Up arrow. + */ +HoverIcons.prototype.triangleUp = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-up.png', 26, 14) : + Graph.createSvgImage(18, 28, ''); + +/** + * Right arrow. + */ +HoverIcons.prototype.triangleRight = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-right.png', 14, 26) : + Graph.createSvgImage(26, 18, ''); + +/** + * Down arrow. + */ +HoverIcons.prototype.triangleDown = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-down.png', 26, 14) : + Graph.createSvgImage(18, 26, ''); + +/** + * Left arrow. + */ +HoverIcons.prototype.triangleLeft = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-left.png', 14, 26) : + Graph.createSvgImage(28, 18, ''); + +/** + * Round target. + */ +HoverIcons.prototype.roundDrop = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/round-drop.png', 26, 26) : + Graph.createSvgImage(26, 26, ''); + +/** + * Refresh target. + */ +HoverIcons.prototype.refreshTarget = new mxImage((mxClient.IS_SVG) ? 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjM2cHgiIGhlaWdodD0iMzZweCI+PGVsbGlwc2UgZmlsbD0iIzI5YjZmMiIgY3g9IjEyIiBjeT0iMTIiIHJ4PSIxMiIgcnk9IjEyIi8+PHBhdGggdHJhbnNmb3JtPSJzY2FsZSgwLjgpIHRyYW5zbGF0ZSgyLjQsIDIuNCkiIHN0cm9rZT0iI2ZmZiIgZmlsbD0iI2ZmZiIgZD0iTTEyIDZ2M2w0LTQtNC00djNjLTQuNDIgMC04IDMuNTgtOCA4IDAgMS41Ny40NiAzLjAzIDEuMjQgNC4yNkw2LjcgMTQuOGMtLjQ1LS44My0uNy0xLjc5LS43LTIuOCAwLTMuMzEgMi42OS02IDYtNnptNi43NiAxLjc0TDE3LjMgOS4yYy40NC44NC43IDEuNzkuNyAyLjggMCAzLjMxLTIuNjkgNi02IDZ2LTNsLTQgNCA0IDR2LTNjNC40MiAwIDgtMy41OCA4LTggMC0xLjU3LS40Ni0zLjAzLTEuMjQtNC4yNnoiLz48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PC9zdmc+Cg==' : + IMAGE_PATH + '/refresh.png', 38, 38); + +/** + * Tolerance for hover icon clicks. + */ +HoverIcons.prototype.tolerance = (mxClient.IS_TOUCH) ? 6 : 0; + +/** + * + */ +HoverIcons.prototype.init = function() +{ + this.arrowUp = this.createArrow(this.triangleUp, mxResources.get('plusTooltip')); + this.arrowRight = this.createArrow(this.triangleRight, mxResources.get('plusTooltip')); + this.arrowDown = this.createArrow(this.triangleDown, mxResources.get('plusTooltip')); + this.arrowLeft = this.createArrow(this.triangleLeft, mxResources.get('plusTooltip')); + + this.elts = [this.arrowUp, this.arrowRight, this.arrowDown, this.arrowLeft]; + + this.resetHandler = mxUtils.bind(this, function() + { + this.reset(); + }); + + this.repaintHandler = mxUtils.bind(this, function() + { + this.repaint(); + }); + + this.graph.selectionModel.addListener(mxEvent.CHANGE, this.resetHandler); + this.graph.model.addListener(mxEvent.CHANGE, this.repaintHandler); + this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE, this.repaintHandler); + this.graph.view.addListener(mxEvent.TRANSLATE, this.repaintHandler); + this.graph.view.addListener(mxEvent.SCALE, this.repaintHandler); + this.graph.view.addListener(mxEvent.DOWN, this.repaintHandler); + this.graph.view.addListener(mxEvent.UP, this.repaintHandler); + this.graph.addListener(mxEvent.ROOT, this.repaintHandler); + this.graph.addListener(mxEvent.ESCAPE, this.resetHandler); + mxEvent.addListener(this.graph.container, 'scroll', this.resetHandler); + + // Resets the mouse point on escape + this.graph.addListener(mxEvent.ESCAPE, mxUtils.bind(this, function() + { + this.mouseDownPoint = null; + })); + + // Removes hover icons if mouse leaves the container + mxEvent.addListener(this.graph.container, 'mouseleave', mxUtils.bind(this, function(evt) + { + // Workaround for IE11 firing mouseleave for touch in diagram + if (evt.relatedTarget != null && mxEvent.getSource(evt) == this.graph.container) + { + this.setDisplay('none'); + } + })); + + // Resets current state when in-place editor starts + this.graph.addListener(mxEvent.START_EDITING, mxUtils.bind(this, function(evt) + { + this.reset(); + })); + + // Resets current state after update of selection state for touch events + var graphClick = this.graph.click; + this.graph.click = mxUtils.bind(this, function(me) + { + graphClick.apply(this.graph, arguments); + + if (this.currentState != null && !this.graph.isCellSelected(this.currentState.cell) && + mxEvent.isTouchEvent(me.getEvent()) && !this.graph.model.isVertex(me.getCell())) + { + this.reset(); + } + }); + + // Checks if connection handler was active in mouse move + // as workaround for possible double connection inserted + var connectionHandlerActive = false; + + // Implements a listener for hover and click handling + this.graph.addMouseListener( + { + mouseDown: mxUtils.bind(this, function(sender, me) + { + connectionHandlerActive = false; + var evt = me.getEvent(); + + if (this.isResetEvent(evt)) + { + this.reset(); + } + else if (!this.isActive()) + { + var state = this.getState(me.getState()); + + if (state != null || !mxEvent.isTouchEvent(evt)) + { + this.update(state); + } + } + + this.setDisplay('none'); + }), + mouseMove: mxUtils.bind(this, function(sender, me) + { + var evt = me.getEvent(); + + if (this.isResetEvent(evt)) + { + this.reset(); + } + else if (!this.graph.isMouseDown && !mxEvent.isTouchEvent(evt)) + { + this.update(this.getState(me.getState()), + me.getGraphX(), me.getGraphY()); + } + + if (this.graph.connectionHandler != null && + this.graph.connectionHandler.shape != null) + { + connectionHandlerActive = true; + } + }), + mouseUp: mxUtils.bind(this, function(sender, me) + { + var evt = me.getEvent(); + var pt = mxUtils.convertPoint(this.graph.container, + mxEvent.getClientX(evt), mxEvent.getClientY(evt)) + + if (this.isResetEvent(evt)) + { + this.reset(); + } + else if (this.isActive() && !connectionHandlerActive && + this.mouseDownPoint != null) + { + this.click(this.currentState, this.getDirection(), me); + } + else if (this.isActive()) + { + // Selects target vertex after drag and clone if not only new edge was inserted + if (this.graph.getSelectionCount() != 1 || !this.graph.model.isEdge( + this.graph.getSelectionCell())) + { + this.update(this.getState(this.graph.view.getState( + this.graph.getCellAt(me.getGraphX(), me.getGraphY())))); + } + else + { + this.reset(); + } + } + else if (mxEvent.isTouchEvent(evt) || (this.bbox != null && + mxUtils.contains(this.bbox, me.getGraphX(), me.getGraphY()))) + { + // Shows existing hover icons if inside bounding box + this.setDisplay(''); + this.repaint(); + } + else if (!mxEvent.isTouchEvent(evt)) + { + this.reset(); + } + + connectionHandlerActive = false; + this.resetActiveArrow(); + }) + }); +}; + +/** + * + */ +HoverIcons.prototype.isResetEvent = function(evt, allowShift) +{ + return mxEvent.isAltDown(evt) || (this.activeArrow == null && mxEvent.isShiftDown(evt)) || + mxEvent.isMetaDown(evt) || (mxEvent.isPopupTrigger(evt) && !mxEvent.isControlDown(evt)); +}; + +/** + * + */ +HoverIcons.prototype.createArrow = function(img, tooltip) +{ + var arrow = null; + + if (mxClient.IS_IE && !mxClient.IS_SVG) + { + // Workaround for PNG images in IE6 + if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat') + { + arrow = document.createElement(mxClient.VML_PREFIX + ':image'); + arrow.setAttribute('src', img.src); + arrow.style.borderStyle = 'none'; + } + else + { + arrow = document.createElement('div'); + arrow.style.backgroundImage = 'url(' + img.src + ')'; + arrow.style.backgroundPosition = 'center'; + arrow.style.backgroundRepeat = 'no-repeat'; + } + + arrow.style.width = (img.width + 4) + 'px'; + arrow.style.height = (img.height + 4) + 'px'; + arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; + } + else + { + arrow = mxUtils.createImage(img.src); + arrow.style.width = img.width + 'px'; + arrow.style.height = img.height + 'px'; + arrow.style.padding = this.tolerance + 'px'; + } + + if (tooltip != null) + { + arrow.setAttribute('title', tooltip); + } + + arrow.style.position = 'absolute'; + arrow.style.cursor = this.cssCursor; + + mxEvent.addGestureListeners(arrow, mxUtils.bind(this, function(evt) + { + if (this.currentState != null && !this.isResetEvent(evt)) + { + this.mouseDownPoint = mxUtils.convertPoint(this.graph.container, + mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + this.drag(evt, this.mouseDownPoint.x, this.mouseDownPoint.y); + this.activeArrow = arrow; + this.setDisplay('none'); + mxEvent.consume(evt); + } + })); + + // Captures mouse events as events on graph + mxEvent.redirectMouseEvents(arrow, this.graph, this.currentState); + + mxEvent.addListener(arrow, 'mouseenter', mxUtils.bind(this, function(evt) + { + // Workaround for Firefox firing mouseenter on touchend + if (mxEvent.isMouseEvent(evt)) + { + if (this.activeArrow != null && this.activeArrow != arrow) + { + mxUtils.setOpacity(this.activeArrow, this.inactiveOpacity); + } + + this.graph.connectionHandler.constraintHandler.reset(); + mxUtils.setOpacity(arrow, 100); + this.activeArrow = arrow; + } + })); + + mxEvent.addListener(arrow, 'mouseleave', mxUtils.bind(this, function(evt) + { + // Workaround for IE11 firing this event on touch + if (!this.graph.isMouseDown) + { + this.resetActiveArrow(); + } + })); + + return arrow; +}; + +/** + * + */ +HoverIcons.prototype.resetActiveArrow = function() +{ + if (this.activeArrow != null) + { + mxUtils.setOpacity(this.activeArrow, this.inactiveOpacity); + this.activeArrow = null; + } +}; + +/** + * + */ +HoverIcons.prototype.getDirection = function() +{ + var dir = mxConstants.DIRECTION_EAST; + + if (this.activeArrow == this.arrowUp) + { + dir = mxConstants.DIRECTION_NORTH; + } + else if (this.activeArrow == this.arrowDown) + { + dir = mxConstants.DIRECTION_SOUTH; + } + else if (this.activeArrow == this.arrowLeft) + { + dir = mxConstants.DIRECTION_WEST; + } + + return dir; +}; + +/** + * + */ +HoverIcons.prototype.visitNodes = function(visitor) +{ + for (var i = 0; i < this.elts.length; i++) + { + if (this.elts[i] != null) + { + visitor(this.elts[i]); + } + } +}; + +/** + * + */ +HoverIcons.prototype.removeNodes = function() +{ + this.visitNodes(function(elt) + { + if (elt.parentNode != null) + { + elt.parentNode.removeChild(elt); + } + }); +}; + +/** + * + */ +HoverIcons.prototype.setDisplay = function(display) +{ + this.visitNodes(function(elt) + { + elt.style.display = display; + }); +}; + +/** + * + */ +HoverIcons.prototype.isActive = function() +{ + return this.activeArrow != null && this.currentState != null; +}; + +/** + * + */ +HoverIcons.prototype.drag = function(evt, x, y) +{ + this.graph.popupMenuHandler.hideMenu(); + this.graph.stopEditing(false); + + // Checks if state was removed in call to stopEditing above + if (this.currentState != null) + { + this.graph.connectionHandler.start(this.currentState, x, y); + this.graph.isMouseTrigger = mxEvent.isMouseEvent(evt); + this.graph.isMouseDown = true; + + // Hides handles for selection cell + var handler = this.graph.selectionCellsHandler.getHandler(this.currentState.cell); + + if (handler != null) + { + handler.setHandlesVisible(false); + } + + // Ctrl+shift drag sets source constraint + var es = this.graph.connectionHandler.edgeState; + + if (evt != null && mxEvent.isShiftDown(evt) && mxEvent.isControlDown(evt) && es != null && + mxUtils.getValue(es.style, mxConstants.STYLE_EDGE, null) === 'orthogonalEdgeStyle') + { + var direction = this.getDirection(); + es.cell.style = mxUtils.setStyle(es.cell.style, 'sourcePortConstraint', direction); + es.style['sourcePortConstraint'] = direction; + } + } +}; + +/** + * + */ +HoverIcons.prototype.getStateAt = function(state, x, y) +{ + return this.graph.view.getState(this.graph.getCellAt(x, y)); +}; + +/** + * + */ +HoverIcons.prototype.click = function(state, dir, me) +{ + var evt = me.getEvent(); + var x = me.getGraphX(); + var y = me.getGraphY(); + + var tmp = this.getStateAt(state, x, y); + + if (tmp != null && this.graph.model.isEdge(tmp.cell) && !mxEvent.isControlDown(evt) && + (tmp.getVisibleTerminalState(true) == state || tmp.getVisibleTerminalState(false) == state)) + { + this.graph.setSelectionCell(tmp.cell); + this.reset(); + } + else if (state != null) + { + this.graph.selectCellsForConnectVertex(this.graph.connectVertex( + state.cell, dir, this.graph.defaultEdgeLength, evt), evt, this); + } + + me.consume(); +}; + +/** + * + */ +HoverIcons.prototype.reset = function(clearTimeout) +{ + clearTimeout = (clearTimeout == null) ? true : clearTimeout; + + if (clearTimeout && this.updateThread != null) + { + window.clearTimeout(this.updateThread); + } + + this.mouseDownPoint = null; + this.currentState = null; + this.activeArrow = null; + this.removeNodes(); + this.bbox = null; +}; + +/** + * + */ +HoverIcons.prototype.repaint = function() +{ + this.bbox = null; + + if (this.currentState != null) + { + // Checks if cell was deleted + this.currentState = this.getState(this.currentState); + + // Cell was deleted + if (this.currentState != null && + this.graph.model.isVertex(this.currentState.cell) && + this.graph.isCellConnectable(this.currentState.cell)) + { + var bds = mxRectangle.fromRectangle(this.currentState); + + // Uses outer bounding box to take rotation into account + if (this.currentState.shape != null && this.currentState.shape.boundingBox != null) + { + bds = mxRectangle.fromRectangle(this.currentState.shape.boundingBox); + } + + bds.grow(this.graph.tolerance); + bds.grow(this.arrowSpacing); + + var handler = this.graph.selectionCellsHandler.getHandler(this.currentState.cell); + var rotationBbox = null; + + if (handler != null) + { + bds.x -= handler.horizontalOffset / 2; + bds.y -= handler.verticalOffset / 2; + bds.width += handler.horizontalOffset; + bds.height += handler.verticalOffset; + + // Adds bounding box of rotation handle to avoid overlap + if (handler.rotationShape != null && handler.rotationShape.node != null && + handler.rotationShape.node.style.visibility != 'hidden' && + handler.rotationShape.node.style.display != 'none' && + handler.rotationShape.boundingBox != null) + { + rotationBbox = handler.rotationShape.boundingBox; + } + } + + // Positions arrows avoid collisions with rotation handle + var positionArrow = mxUtils.bind(this, function(arrow, x, y) + { + if (rotationBbox != null) + { + var bbox = new mxRectangle(x, y, arrow.clientWidth, arrow.clientHeight); + + if (mxUtils.intersects(bbox, rotationBbox)) + { + if (arrow == this.arrowUp) + { + y -= bbox.y + bbox.height - rotationBbox.y; + } + else if (arrow == this.arrowRight) + { + x += rotationBbox.x + rotationBbox.width - bbox.x; + } + else if (arrow == this.arrowDown) + { + y += rotationBbox.y + rotationBbox.height - bbox.y; + } + else if (arrow == this.arrowLeft) + { + x -= bbox.x + bbox.width - rotationBbox.x; + } + } + } + + arrow.style.left = x + 'px'; + arrow.style.top = y + 'px'; + mxUtils.setOpacity(arrow, this.inactiveOpacity); + }); + + positionArrow(this.arrowUp, + Math.round(this.currentState.getCenterX() - this.triangleUp.width / 2 - this.tolerance), + Math.round(bds.y - this.triangleUp.height - this.tolerance)); + + positionArrow(this.arrowRight, Math.round(bds.x + bds.width - this.tolerance), + Math.round(this.currentState.getCenterY() - this.triangleRight.height / 2 - this.tolerance)); + + positionArrow(this.arrowDown, parseInt(this.arrowUp.style.left), + Math.round(bds.y + bds.height - this.tolerance)); + + positionArrow(this.arrowLeft, Math.round(bds.x - this.triangleLeft.width - this.tolerance), + parseInt(this.arrowRight.style.top)); + + if (this.checkCollisions) + { + var right = this.graph.getCellAt(bds.x + bds.width + + this.triangleRight.width / 2, this.currentState.getCenterY()); + var left = this.graph.getCellAt(bds.x - this.triangleLeft.width / 2, this.currentState.getCenterY()); + var top = this.graph.getCellAt(this.currentState.getCenterX(), bds.y - this.triangleUp.height / 2); + var bottom = this.graph.getCellAt(this.currentState.getCenterX(), bds.y + bds.height + this.triangleDown.height / 2); + + // Shows hover icons large cell is behind all directions of current cell + if (right != null && right == left && left == top && top == bottom) + { + right = null; + left = null; + top = null; + bottom = null; + } + + var currentGeo = this.graph.getCellGeometry(this.currentState.cell); + + var checkCollision = mxUtils.bind(this, function(cell, arrow) + { + var geo = this.graph.model.isVertex(cell) && this.graph.getCellGeometry(cell); + + // Ignores collision if vertex is more than 3 times the size of this vertex + if (cell != null && !this.graph.model.isAncestor(cell, this.currentState.cell) && + !this.graph.isSwimlane(cell) && (geo == null || currentGeo == null || + (geo.height < 3 * currentGeo.height && geo.width < 3 * currentGeo.width))) + { + arrow.style.visibility = 'hidden'; + } + else + { + arrow.style.visibility = 'visible'; + } + }); + + checkCollision(right, this.arrowRight); + checkCollision(left, this.arrowLeft); + checkCollision(top, this.arrowUp); + checkCollision(bottom, this.arrowDown); + } + else + { + this.arrowLeft.style.visibility = 'visible'; + this.arrowRight.style.visibility = 'visible'; + this.arrowUp.style.visibility = 'visible'; + this.arrowDown.style.visibility = 'visible'; + } + + if (this.graph.tooltipHandler.isEnabled()) + { + this.arrowLeft.setAttribute('title', mxResources.get('plusTooltip')); + this.arrowRight.setAttribute('title', mxResources.get('plusTooltip')); + this.arrowUp.setAttribute('title', mxResources.get('plusTooltip')); + this.arrowDown.setAttribute('title', mxResources.get('plusTooltip')); + } + else + { + this.arrowLeft.removeAttribute('title'); + this.arrowRight.removeAttribute('title'); + this.arrowUp.removeAttribute('title'); + this.arrowDown.removeAttribute('title'); + } + } + else + { + this.reset(); + } + + // Updates bounding box + if (this.currentState != null) + { + this.bbox = this.computeBoundingBox(); + + // Adds tolerance for hover + if (this.bbox != null) + { + this.bbox.grow(10); + } + } + } +}; + +/** + * + */ +HoverIcons.prototype.computeBoundingBox = function() +{ + var bbox = (!this.graph.model.isEdge(this.currentState.cell)) ? mxRectangle.fromRectangle(this.currentState) : null; + + this.visitNodes(function(elt) + { + if (elt.parentNode != null) + { + var tmp = new mxRectangle(elt.offsetLeft, elt.offsetTop, elt.offsetWidth, elt.offsetHeight); + + if (bbox == null) + { + bbox = tmp; + } + else + { + bbox.add(tmp); + } + } + }); + + return bbox; +}; + +/** + * + */ +HoverIcons.prototype.getState = function(state) +{ + if (state != null) + { + var cell = state.cell; + + if (!this.graph.getModel().contains(cell)) + { + state = null; + } + else + { + // Uses connectable parent vertex if child is not connectable + if (this.graph.getModel().isVertex(cell) && !this.graph.isCellConnectable(cell)) + { + var parent = this.graph.getModel().getParent(cell); + + if (this.graph.getModel().isVertex(parent) && this.graph.isCellConnectable(parent)) + { + cell = parent; + } + } + + // Ignores locked cells and edges + if (this.graph.isCellLocked(cell) || this.graph.model.isEdge(cell)) + { + cell = null; + } + + state = this.graph.view.getState(cell); + + if (state != null && state.style == null) + { + state = null; + } + } + } + + return state; +}; + +/** + * + */ +HoverIcons.prototype.update = function(state, x, y) +{ + if (!this.graph.connectionArrowsEnabled || (state != null && + mxUtils.getValue(state.style, 'allowArrows', '1') == '0')) + { + this.reset(); + } + else + { + if (state != null && state.cell.geometry != null && state.cell.geometry.relative && + this.graph.model.isEdge(state.cell.parent)) + { + state = null; + } + + var timeOnTarget = null; + + // Time on target + if (this.prev != state || this.isActive()) + { + this.startTime = new Date().getTime(); + this.prev = state; + timeOnTarget = 0; + + if (this.updateThread != null) + { + window.clearTimeout(this.updateThread); + } + + if (state != null) + { + // Starts timer to update current state with no mouse events + this.updateThread = window.setTimeout(mxUtils.bind(this, function() + { + if (!this.isActive() && !this.graph.isMouseDown && + !this.graph.panningHandler.isActive()) + { + this.prev = state; + this.update(state, x, y); + } + }), this.updateDelay + 10); + } + } + else if (this.startTime != null) + { + timeOnTarget = new Date().getTime() - this.startTime; + } + + this.setDisplay(''); + + if (this.currentState != null && this.currentState != state && timeOnTarget < this.activationDelay && + this.bbox != null && !mxUtils.contains(this.bbox, x, y)) + { + this.reset(false); + } + else if (this.currentState != null || timeOnTarget > this.activationDelay) + { + if (this.currentState != state && ((timeOnTarget > this.updateDelay && state != null) || + this.bbox == null || x == null || y == null || !mxUtils.contains(this.bbox, x, y))) + { + if (state != null && this.graph.isEnabled()) + { + this.removeNodes(); + this.setCurrentState(state); + this.repaint(); + + // Resets connection points on other focused cells + if (this.graph.connectionHandler.constraintHandler.currentFocus != state) + { + this.graph.connectionHandler.constraintHandler.reset(); + } + } + else + { + this.reset(); + } + } + } + } +}; + +/** + * + */ +HoverIcons.prototype.setCurrentState = function(state) +{ + if (state.style['portConstraint'] != 'eastwest') + { + this.graph.container.appendChild(this.arrowUp); + this.graph.container.appendChild(this.arrowDown); + } + + this.graph.container.appendChild(this.arrowRight); + this.graph.container.appendChild(this.arrowLeft); + this.currentState = state; +}; + +/** + * Returns true if the given cell is a table. + */ +Graph.prototype.createParent = function(parent, child, childCount) +{ + parent = this.cloneCell(parent); + + for (var i = 0; i < childCount; i++) + { + parent.insert(this.cloneCell(child)); + } + + return parent; +}; + +/** + * Returns true if the given cell is a table. + */ +Graph.prototype.createTable = function(rowCount, colCount, w, h) +{ + w = (w != null) ? w : 40; + h = (h != null) ? h : 30; + + return this.createParent(this.createVertex(null, null, '', 0, 0, colCount * w, rowCount * h, + 'html=1;whiteSpace=wrap;container=1;collapsible=0;childLayout=tableLayout;'), + this.createParent(this.createVertex(null, null, '', 0, 0, colCount * w, h, + 'html=1;whiteSpace=wrap;container=1;collapsible=0;points=[[0,0.5],[1,0.5]];part=1;'), + this.createVertex(null, null, '', 0, 0, w, h, + 'html=1;whiteSpace=wrap;connectable=0;part=1;'), + colCount), rowCount); +}; + +/** + * + */ +Graph.prototype.createCrossFunctionalSwimlane = function(rowCount, colCount, w, h) +{ + w = (w != null) ? w : 120; + h = (h != null) ? h : 120; + + var s = 'swimlane;html=1;whiteSpace=wrap;container=1;' + + 'collapsible=0;recursiveResize=0;expand=0;'; + + var table = this.createVertex(null, null, '', + 0, 0, colCount * w, rowCount * h, + s + 'childLayout=tableLayout;'); + var row = this.createVertex(null, null, '', 0, 0, colCount * w, h, + s + 'horizontal=0;points=[[0,0.5],[1,0.5]];part=1;'); + table.insert(this.createParent(row, this.createVertex(null, null, '', + 0, 0, w, h, s + 'connectable=0;part=1;'), colCount)); + + if (rowCount > 1) + { + return this.createParent(table, this.createParent(row, + this.createVertex(null, null, '', 0, 0, w, h, + s + 'connectable=0;part=1;startSize=0;'), + colCount), rowCount - 1); + } + else + { + return table; + } +}; + +/** + * Returns true if the given cell is a table cell. + */ +Graph.prototype.isTableCell = function(cell) +{ + return this.isTableRow(this.model.getParent(cell)); +}; + +/** + * Returns true if the given cell is a table row. + */ +Graph.prototype.isTableRow = function(cell) +{ + return this.isTable(this.model.getParent(cell)); +}; + +/** + * Returns true if the given cell is a table. + */ +Graph.prototype.isTable = function(cell) +{ + var style = this.getCellStyle(cell); + + return style != null && style['childLayout'] == 'tableLayout'; +}; + +/** + * Updates column width and row height. + */ +Graph.prototype.getActualStartSize = function(swimlane, ignoreState) +{ + var result = new mxRectangle(); + + if (this.isSwimlane(swimlane)) + { + var style = this.getCurrentCellStyle(swimlane, ignoreState); + var size = parseInt(mxUtils.getValue(style, + mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)); + var flipH = mxUtils.getValue(style, mxConstants.STYLE_FLIPH, 0) == 1; + var flipV = mxUtils.getValue(style, mxConstants.STYLE_FLIPV, 0) == 1; + var h = mxUtils.getValue(style, mxConstants.STYLE_HORIZONTAL, true); + var n = 0; + + if (!h) + { + n++; + } + + var dir = mxUtils.getValue(style, mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_EAST); + + if (dir == mxConstants.DIRECTION_NORTH) + { + n++; + } + else if (dir == mxConstants.DIRECTION_WEST) + { + n += 2; + } + else if (dir == mxConstants.DIRECTION_SOUTH) + { + n += 3; + } + + n = mxUtils.mod(n, 4); + + if (n == 0) + { + result.y = size; + } + else if (n == 1) + { + result.x = size; + } + else if (n == 2) + { + result.height = size; + } + else if (n == 3) + { + result.width = size; + } + + if (flipV) + { + var tmp = result.y; + result.y = result.height; + result.height = tmp; + } + + if (flipH) + { + var tmp = result.x; + result.x = result.width; + result.width = tmp; + } + } + + return result; +}; + +/** + * Updates column width and row height. + */ +Graph.prototype.tableResized = function(table) +{ + console.log('tableLayout.tableResized', table); + var model = this.getModel(); + var rowCount = model.getChildCount(table); + var tableGeo = this.getCellGeometry(table); + + if (tableGeo != null && rowCount > 0) + { + var off = this.getActualStartSize(table); + var y = off.y; + + for (var i = 0; i < rowCount; i++) + { + var row = model.getChildAt(table, i); + + if (row != null && model.isVertex(row)) + { + var rowGeo = this.getCellGeometry(row); + + if (rowGeo != null) + { + if (i == rowCount - 1) + { + var newRowGeo = rowGeo.clone(); + newRowGeo.width = tableGeo.width - off.x; + + if (y < tableGeo.height) + { + newRowGeo.height = tableGeo.height - y; + } + else if (y > tableGeo.height) + { + tableGeo.height = y + Graph.minTableRowHeight; + newRowGeo.height = Graph.minTableRowHeight; + } + + model.setGeometry(row, newRowGeo); + this.tableRowResized(row, newRowGeo, rowGeo); + } + + y += rowGeo.height; + } + } + } + } +}; + +/** + * Updates column width and row height. + */ +Graph.prototype.setRowHeight = function(row, height) +{ + var model = this.getModel(); + + model.beginUpdate(); + try + { + for (var i = 0; i < model.getChildCount(row); i++) + { + var child = model.getChildAt(row, i); + + if (model.isVertex(child)) + { + var childGeo = this.getCellGeometry(child); + + if (childGeo != null) + { + childGeo = childGeo.clone(); + childGeo.height = height; + model.setGeometry(child, childGeo); + } + } + } + } + finally + { + model.endUpdate(); + } +}; + +/** + * Updates column width and row height. + */ +Graph.prototype.tableRowResized = function(row, bounds, prev) +{ + console.log('tableLayout.tableRowResized', row); + var model = this.getModel(); + var rowGeo = this.getCellGeometry(row); + var cellCount = model.getChildCount(row); + + if (rowGeo != null && cellCount > 0) + { + var off = this.getActualStartSize(row); + var x = off.x; + + for (var i = 0; i < cellCount; i++) + { + var cell = model.getChildAt(row, i); + + if (cell != null && model.isVertex(cell)) + { + var geo = this.getCellGeometry(cell); + + if (geo != null) + { + var newGeo = geo.clone(); + newGeo.height = rowGeo.height - off.y; + model.setGeometry(cell, newGeo); + + if (i == cellCount - 1) + { + if (x < rowGeo.width) + { + newGeo.width = rowGeo.width - x; + } + else if (x > rowGeo.width) + { + rowGeo.width = x + Graph.minTableColumnWidth; + newGeo.width = Graph.minTableColumnWidth; + } + + this.tableCellResized(cell, newGeo, geo); + } + + x += geo.width; + } + } + } + } + + // Updates previous row height if upper edge was moved + var table = model.getParent(row); + var index = table.getIndex(row); + + if (bounds.y != prev.y && index > 0) + { + var previousRow = model.getChildAt(table, index - 1); + var prg = this.getCellGeometry(previousRow); + + if (prg != null) + { + prg = prg.clone(); + prg.height -= prev.y - bounds.y; + model.setGeometry(previousRow, prg); + } + } +}; + +/** + * Updates column width and row height. + */ +Graph.prototype.tableCellResized = function(cell, bounds, prev) +{ + console.log('tableLayout.tableCellResized', cell, bounds, prev); + var geo = this.getCellGeometry(cell); + + if (geo != null) + { + var model = this.getModel(); + var row = model.getParent(cell); + var table = model.getParent(row); + var index = row.getIndex(cell); + + // Applies new height to all cells in the row + if (bounds.height != prev.height) + { + this.setRowHeight(row, geo.height); + } + + // Updates column width + var previousRow = null; + + for (var i = 0; i < model.getChildCount(table); i++) + { + var currentRow = model.getChildAt(table, i); + + if (model.isVertex(currentRow)) + { + var child = model.getChildAt(currentRow, index); + + if (cell != child) + { + var childGeo = this.getCellGeometry(child); + + if (childGeo != null) + { + childGeo = childGeo.clone(); + childGeo.width = geo.width; + model.setGeometry(child, childGeo); + } + } + + // Updates previous row height + if (bounds.y != prev.y && currentRow == row && previousRow != null) + { + var prg = this.getCellGeometry(previousRow); + + if (prg != null) + { + this.setRowHeight(previousRow, + prg.height - prev.y + bounds.y); + } + } + + previousRow = currentRow; + } + } + + // Updates previous column width + if (bounds.x != prev.x && index > 0) + { + var child = model.getChildAt(row, index - 1); + var childGeo = this.getCellGeometry(child); + + if (childGeo != null) + { + var newChildGeo = childGeo.clone(); + newChildGeo.width -= prev.x - bounds.x; + model.setGeometry(child, newChildGeo); + + this.tableCellResized(child, newChildGeo, childGeo); + } + } + } +}; + +/** + * Table Layout + */ +function TableLayout(graph) +{ + mxGraphLayout.call(this, graph); +}; + +/** + * Extends mxGraphLayout + */ +TableLayout.prototype = new mxGraphLayout(); +TableLayout.prototype.constructor = TableLayout; + +/** + * Reorders rows. + */ +TableLayout.prototype.moveCell = function(cell, x, y) +{ + // TODO: Reorder rows + console.log('tableLayout.moveCell', cell, x, y); +}; + +/** + * + */ +TableLayout.prototype.resizeCell = function(cell, geo, prev) +{ + if (this.graph.isTable(cell)) + { + this.graph.tableResized(cell, geo, prev); + } + else if (this.graph.isTableRow(cell)) + { + this.graph.tableRowResized(cell, geo, prev); + } + else if (this.graph.isTableCell(cell)) + { + this.graph.tableCellResized(cell, geo, prev); + } +}; + +/** + * Updates column width and row height. + */ +TableLayout.prototype.execute = function(table) +{ + var off = this.graph.getActualStartSize(table, true); + var model = this.graph.getModel(); + var y = off.y; + var rows = []; + var maxX = 0; + var x = 0; + + console.log('tableLayout.execute', table, off); + + for (var i = 0; i < model.getChildCount(table); i++) + { + var row = model.getChildAt(table, i); + + if (row != null && model.isVertex(row)) + { + var rowGeo = this.graph.getCellGeometry(row); + + if (rowGeo != null) + { + rowGeo = rowGeo.clone(); + var rowOff = this.graph.getActualStartSize(row, true); + var childCount = model.getChildCount(row); + x = rowOff.x; + + for (var j = 0; j < childCount; j++) + { + var cell = model.getChildAt(row, j); + + if (cell != null) + { + var geo = this.graph.getCellGeometry(cell); + + if (geo != null) + { + geo = geo.clone(); + + rowGeo.height = geo.height + + rowOff.y + rowOff.height; + geo.x = x; + geo.y = rowOff.y; + model.setGeometry(cell, geo); + + x += geo.width; + + if (j == childCount - 1) + { + rows.push([geo, rowGeo, rowOff]); + maxX = Math.max(x, maxX); + } + } + } + } + + rowGeo.width = x + rowOff.width; + rowGeo.y = y; + rowGeo.x = off.x; + model.setGeometry(row, rowGeo); + + y += rowGeo.height; + } + } + } + + // Updates table size + var tableGeo = this.graph.getCellGeometry(table); + + if (tableGeo != null) + { + tableGeo = tableGeo.clone(); + tableGeo.width = x + off.x + off.width; + tableGeo.height = y + off.height; + model.setGeometry(table, tableGeo); + + for (var i = 0; i < rows.length; i++) + { + if (rows[i][1].width < maxX) + { + rows[i][0].width += maxX - rows[i][1].width; + rows[i][1].width += maxX - rows[i][1].width; + } + } + } +}; + +/** + * Table Layout + */ +function TableRowLayout(graph) +{ + mxGraphLayout.call(this, graph); +}; + +/** + * Extends mxGraphLayout + */ +TableRowLayout.prototype = new TableLayout(); +TableRowLayout.prototype.constructor = TableRowLayout; + +/** + * Reorders rows. + */ +TableRowLayout.prototype.moveCell = function(cell, x, y) +{ + // TODO: Reorder columns + console.log('TableRowLayout.moveCell', cell, x, y); +}; + +/** + * Updates row start sizes. + */ +TableRowLayout.prototype.execute = function(row) +{ + var off = this.graph.getActualStartSize(row, true); + var off0 = this.graph.getActualStartSize(row); + var style = this.graph.getCellStyle(row); + var model = this.graph.getModel(); + var table = model.getParent(row); + + console.log('tableRowLayout.execute', row, off, off0); + + if (style != null && table != null) + { + var size = parseInt(mxUtils.getValue(style, + mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)); + + model.beginUpdate(); + try + { + // Swimlane rotation requires resize of last row element + if (this.graph.isTableRow(row)) + { + if (off.width != off0.width || off.x != off0.x) + { + var cell = model.getChildAt(row, model.getChildCount(row) - 1); + var geo = this.graph.getCellGeometry(cell); + + if (geo != null) + { + geo = geo.clone(); + geo.width += off0.width - off.width - off.x - off0.x; + geo.width = Math.max(Graph.minTableColumnWidth, geo.width); + model.setGeometry(cell, geo); + } + } + } + + for (var i = 0; i < model.getChildCount(table); i++) + { + var current = model.getChildAt(table, i); + + if (current != row) + { + var temp = this.graph.getActualStartSize(current); + + // Checks if same side is offset + if ((off.x > 0 && temp.x > 0) || + (off.y > 0 && temp.y > 0) || + (off.width > 0 && temp.width > 0) || + (off.height > 0 && temp.height > 0)) + { + this.graph.setCellStyles( + mxConstants.STYLE_STARTSIZE, + size, [current]); + } + } + } + } + finally + { + model.endUpdate(); + } + } +}; + +(function() +{ + /** + * Reset the list of processed edges. + */ + var mxGraphViewResetValidationState = mxGraphView.prototype.resetValidationState; + + mxGraphView.prototype.resetValidationState = function() + { + mxGraphViewResetValidationState.apply(this, arguments); + + this.validEdges = []; + }; + + /** + * Updates jumps for valid edges and repaints if needed. + */ + var mxGraphViewValidateCellState = mxGraphView.prototype.validateCellState; + + mxGraphView.prototype.validateCellState = function(cell, recurse) + { + recurse = (recurse != null) ? recurse : true; + var state = this.getState(cell); + + // Forces repaint if jumps change on a valid edge + if (state != null && recurse && this.graph.model.isEdge(state.cell) && + state.style != null && state.style[mxConstants.STYLE_CURVED] != 1 && + !state.invalid && this.updateLineJumps(state)) + { + this.graph.cellRenderer.redraw(state, false, this.isRendering()); + } + + state = mxGraphViewValidateCellState.apply(this, arguments); + + // Adds to the list of edges that may intersect with later edges + if (state != null && recurse && this.graph.model.isEdge(state.cell) && + state.style != null && state.style[mxConstants.STYLE_CURVED] != 1) + { + // LATER: Reuse jumps for valid edges + this.validEdges.push(state); + } + + return state; + }; + + /** + * Forces repaint if routed points have changed. + */ + var mxCellRendererIsShapeInvalid = mxCellRenderer.prototype.isShapeInvalid; + + mxCellRenderer.prototype.isShapeInvalid = function(state, shape) + { + return mxCellRendererIsShapeInvalid.apply(this, arguments) || + (state.routedPoints != null && shape.routedPoints != null && + !mxUtils.equalPoints(shape.routedPoints, state.routedPoints)) + }; + + + /** + * Updates jumps for invalid edges. + */ + var mxGraphViewUpdateCellState = mxGraphView.prototype.updateCellState; + + mxGraphView.prototype.updateCellState = function(state) + { + mxGraphViewUpdateCellState.apply(this, arguments); + + // Updates jumps on invalid edge before repaint + if (this.graph.model.isEdge(state.cell) && + state.style[mxConstants.STYLE_CURVED] != 1) + { + this.updateLineJumps(state); + } + }; + + /** + * Updates the jumps between given state and processed edges. + */ + mxGraphView.prototype.updateLineJumps = function(state) + { + var pts = state.absolutePoints; + + if (Graph.lineJumpsEnabled) + { + var changed = state.routedPoints != null; + var actual = null; + + if (pts != null && this.validEdges != null && + mxUtils.getValue(state.style, 'jumpStyle', 'none') !== 'none') + { + var thresh = 0.5 * this.scale; + changed = false; + actual = []; + + // Type 0 means normal waypoint, 1 means jump + function addPoint(type, x, y) + { + var rpt = new mxPoint(x, y); + rpt.type = type; + + actual.push(rpt); + var curr = (state.routedPoints != null) ? state.routedPoints[actual.length - 1] : null; + + return curr == null || curr.type != type || curr.x != x || curr.y != y; + }; + + for (var i = 0; i < pts.length - 1; i++) + { + var p1 = pts[i + 1]; + var p0 = pts[i]; + var list = []; + + // Ignores waypoints on straight segments + var pn = pts[i + 2]; + + while (i < pts.length - 2 && + mxUtils.ptSegDistSq(p0.x, p0.y, pn.x, pn.y, + p1.x, p1.y) < 1 * this.scale * this.scale) + { + p1 = pn; + i++; + pn = pts[i + 2]; + } + + changed = addPoint(0, p0.x, p0.y) || changed; + + // Processes all previous edges + for (var e = 0; e < this.validEdges.length; e++) + { + var state2 = this.validEdges[e]; + var pts2 = state2.absolutePoints; + + if (pts2 != null && mxUtils.intersects(state, state2) && state2.style['noJump'] != '1') + { + // Compares each segment of the edge with the current segment + for (var j = 0; j < pts2.length - 1; j++) + { + var p3 = pts2[j + 1]; + var p2 = pts2[j]; + + // Ignores waypoints on straight segments + pn = pts2[j + 2]; + + while (j < pts2.length - 2 && + mxUtils.ptSegDistSq(p2.x, p2.y, pn.x, pn.y, + p3.x, p3.y) < 1 * this.scale * this.scale) + { + p3 = pn; + j++; + pn = pts2[j + 2]; + } + + var pt = mxUtils.intersection(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); + + // Handles intersection between two segments + if (pt != null && (Math.abs(pt.x - p0.x) > thresh || + Math.abs(pt.y - p0.y) > thresh) && + (Math.abs(pt.x - p1.x) > thresh || + Math.abs(pt.y - p1.y) > thresh) && + (Math.abs(pt.x - p2.x) > thresh || + Math.abs(pt.y - p2.y) > thresh) && + (Math.abs(pt.x - p3.x) > thresh || + Math.abs(pt.y - p3.y) > thresh)) + { + var dx = pt.x - p0.x; + var dy = pt.y - p0.y; + var temp = {distSq: dx * dx + dy * dy, x: pt.x, y: pt.y}; + + // Intersections must be ordered by distance from start of segment + for (var t = 0; t < list.length; t++) + { + if (list[t].distSq > temp.distSq) + { + list.splice(t, 0, temp); + temp = null; + + break; + } + } + + // Ignores multiple intersections at segment joint + if (temp != null && (list.length == 0 || + list[list.length - 1].x !== temp.x || + list[list.length - 1].y !== temp.y)) + { + list.push(temp); + } + } + } + } + } + + // Adds ordered intersections to routed points + for (var j = 0; j < list.length; j++) + { + changed = addPoint(1, list[j].x, list[j].y) || changed; + } + } + + var pt = pts[pts.length - 1]; + changed = addPoint(0, pt.x, pt.y) || changed; + } + + state.routedPoints = actual; + + return changed; + } + else + { + return false; + } + }; + + /** + * Overrides painting the actual shape for taking into account jump style. + */ + var mxConnectorPaintLine = mxConnector.prototype.paintLine; + + mxConnector.prototype.paintLine = function (c, absPts, rounded) + { + // Required for checking dirty state + this.routedPoints = (this.state != null) ? this.state.routedPoints : null; + + if (this.outline || this.state == null || this.style == null || + this.state.routedPoints == null || this.state.routedPoints.length == 0) + { + mxConnectorPaintLine.apply(this, arguments); + } + else + { + var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, + mxConstants.LINE_ARCSIZE) / 2; + var size = (parseInt(mxUtils.getValue(this.style, 'jumpSize', + Graph.defaultJumpSize)) - 2) / 2 + this.strokewidth; + var style = mxUtils.getValue(this.style, 'jumpStyle', 'none'); + var moveTo = true; + var last = null; + var len = null; + var pts = []; + var n = null; + c.begin(); + + for (var i = 0; i < this.state.routedPoints.length; i++) + { + var rpt = this.state.routedPoints[i]; + var pt = new mxPoint(rpt.x / this.scale, rpt.y / this.scale); + + // Takes first and last point from passed-in array + if (i == 0) + { + pt = absPts[0]; + } + else if (i == this.state.routedPoints.length - 1) + { + pt = absPts[absPts.length - 1]; + } + + var done = false; + + // Type 1 is an intersection + if (last != null && rpt.type == 1) + { + // Checks if next/previous points are too close + var next = this.state.routedPoints[i + 1]; + var dx = next.x / this.scale - pt.x; + var dy = next.y / this.scale - pt.y; + var dist = dx * dx + dy * dy; + + if (n == null) + { + n = new mxPoint(pt.x - last.x, pt.y - last.y); + len = Math.sqrt(n.x * n.x + n.y * n.y); + + if (len > 0) + { + n.x = n.x * size / len; + n.y = n.y * size / len; + } + else + { + n = null; + } + } + + if (dist > size * size && len > 0) + { + var dx = last.x - pt.x; + var dy = last.y - pt.y; + var dist = dx * dx + dy * dy; + + if (dist > size * size) + { + var p0 = new mxPoint(pt.x - n.x, pt.y - n.y); + var p1 = new mxPoint(pt.x + n.x, pt.y + n.y); + pts.push(p0); + + this.addPoints(c, pts, rounded, arcSize, false, null, moveTo); + + var f = (Math.round(n.x) < 0 || (Math.round(n.x) == 0 + && Math.round(n.y) <= 0)) ? 1 : -1; + moveTo = false; + + if (style == 'sharp') + { + c.lineTo(p0.x - n.y * f, p0.y + n.x * f); + c.lineTo(p1.x - n.y * f, p1.y + n.x * f); + c.lineTo(p1.x, p1.y); + } + else if (style == 'arc') + { + f *= 1.3; + c.curveTo(p0.x - n.y * f, p0.y + n.x * f, + p1.x - n.y * f, p1.y + n.x * f, + p1.x, p1.y); + } + else + { + c.moveTo(p1.x, p1.y); + moveTo = true; + } + + pts = [p1]; + done = true; + } + } + } + else + { + n = null; + } + + if (!done) + { + pts.push(pt); + last = pt; + } + } + + this.addPoints(c, pts, rounded, arcSize, false, null, moveTo); + c.stroke(); + } + }; + + /** + * Adds support for snapToPoint style. + */ + var mxGraphViewUpdateFloatingTerminalPoint = mxGraphView.prototype.updateFloatingTerminalPoint; + + mxGraphView.prototype.updateFloatingTerminalPoint = function(edge, start, end, source) + { + if (start != null && edge != null && + (start.style['snapToPoint'] == '1' || + edge.style['snapToPoint'] == '1')) + { + start = this.getTerminalPort(edge, start, source); + var next = this.getNextPoint(edge, end, source); + + var orth = this.graph.isOrthogonal(edge); + var alpha = mxUtils.toRadians(Number(start.style[mxConstants.STYLE_ROTATION] || '0')); + var center = new mxPoint(start.getCenterX(), start.getCenterY()); + + if (alpha != 0) + { + var cos = Math.cos(-alpha); + var sin = Math.sin(-alpha); + next = mxUtils.getRotatedPoint(next, cos, sin, center); + } + + var border = parseFloat(edge.style[mxConstants.STYLE_PERIMETER_SPACING] || 0); + border += parseFloat(edge.style[(source) ? + mxConstants.STYLE_SOURCE_PERIMETER_SPACING : + mxConstants.STYLE_TARGET_PERIMETER_SPACING] || 0); + var pt = this.getPerimeterPoint(start, next, alpha == 0 && orth, border); + + if (alpha != 0) + { + var cos = Math.cos(alpha); + var sin = Math.sin(alpha); + pt = mxUtils.getRotatedPoint(pt, cos, sin, center); + } + + edge.setAbsoluteTerminalPoint(this.snapToAnchorPoint(edge, start, end, source, pt), source); + } + else + { + mxGraphViewUpdateFloatingTerminalPoint.apply(this, arguments); + } + }; + + mxGraphView.prototype.snapToAnchorPoint = function(edge, start, end, source, pt) + { + if (start != null && edge != null) + { + var constraints = this.graph.getAllConnectionConstraints(start) + var nearest = null; + var dist = null; + + if (constraints != null) + { + for (var i = 0; i < constraints.length; i++) + { + var cp = this.graph.getConnectionPoint(start, constraints[i]); + + if (cp != null) + { + var tmp = (cp.x - pt.x) * (cp.x - pt.x) + (cp.y - pt.y) * (cp.y - pt.y); + + if (dist == null || tmp < dist) + { + nearest = cp; + dist = tmp; + } + } + } + } + + if (nearest != null) + { + pt = nearest; + } + } + + return pt; + }; + + /** + * Adds support for placeholders in text elements of shapes. + */ + var mxStencilEvaluateTextAttribute = mxStencil.prototype.evaluateTextAttribute; + + mxStencil.prototype.evaluateTextAttribute = function(node, attribute, shape) + { + var result = mxStencilEvaluateTextAttribute.apply(this, arguments); + var placeholders = node.getAttribute('placeholders'); + + if (placeholders == '1' && shape.state != null) + { + result = shape.state.view.graph.replacePlaceholders(shape.state.cell, result); + } + + return result; + }; + + /** + * Adds custom stencils defined via shape=stencil(value) style. The value is a base64 encoded, compressed and + * URL encoded XML definition of the shape according to the stencil definition language of mxGraph. + * + * Needs to be in this file to make sure its part of the embed client code. Also the check for ZLib is + * different than for the Editor code. + */ + var mxCellRendererCreateShape = mxCellRenderer.prototype.createShape; + mxCellRenderer.prototype.createShape = function(state) + { + if (state.style != null && typeof(pako) !== 'undefined') + { + var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); + + // Extracts and decodes stencil XML if shape has the form shape=stencil(value) + if (shape != null && typeof shape === 'string' && shape.substring(0, 8) == 'stencil(') + { + try + { + var stencil = shape.substring(8, shape.length - 1); + var doc = mxUtils.parseXml(Graph.decompress(stencil)); + + return new mxShape(new mxStencil(doc.documentElement)); + } + catch (e) + { + if (window.console != null) + { + console.log('Error in shape: ' + e); + } + } + } + } + + return mxCellRendererCreateShape.apply(this, arguments); + }; +})(); + +/** + * Overrides stencil registry for dynamic loading of stencils. + */ +/** + * Maps from library names to an array of Javascript filenames, + * which are synchronously loaded. Currently only stencil files + * (.xml) and JS files (.js) are supported. + * IMPORTANT: For embedded diagrams to work entries must also + * be added in EmbedServlet.java. + */ +mxStencilRegistry.libraries = {}; + +/** + * Global switch to disable dynamic loading. + */ +mxStencilRegistry.dynamicLoading = true; + +/** + * Global switch to disable eval for JS (preload all JS instead). + */ +mxStencilRegistry.allowEval = true; + +/** + * Stores all package names that have been dynamically loaded. + * Each package is only loaded once. + */ +mxStencilRegistry.packages = []; + +// Extends the default stencil registry to add dynamic loading +mxStencilRegistry.getStencil = function(name) +{ + var result = mxStencilRegistry.stencils[name]; + + if (result == null && mxCellRenderer.defaultShapes[name] == null && mxStencilRegistry.dynamicLoading) + { + var basename = mxStencilRegistry.getBasenameForStencil(name); + + // Loads stencil files and tries again + if (basename != null) + { + var libs = mxStencilRegistry.libraries[basename]; + + if (libs != null) + { + if (mxStencilRegistry.packages[basename] == null) + { + for (var i = 0; i < libs.length; i++) + { + var fname = libs[i]; + + if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml') + { + mxStencilRegistry.loadStencilSet(fname, null); + } + else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js') + { + try + { + if (mxStencilRegistry.allowEval) + { + var req = mxUtils.load(fname); + + if (req != null && req.getStatus() >= 200 && req.getStatus() <= 299) + { + eval.call(window, req.getText()); + } + } + } + catch (e) + { + if (window.console != null) + { + console.log('error in getStencil:', fname, e); + } + } + } + else + { + // FIXME: This does not yet work as the loading is triggered after + // the shape was used in the graph, at which point the keys have + // typically been translated in the calling method. + //mxResources.add(fname); + } + } + + mxStencilRegistry.packages[basename] = 1; + } + } + else + { + // Replaces '_-_' with '_' + basename = basename.replace('_-_', '_'); + mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null); + } + + result = mxStencilRegistry.stencils[name]; + } + } + + return result; +}; + +// Returns the basename for the given stencil or null if no file must be +// loaded to render the given stencil. +mxStencilRegistry.getBasenameForStencil = function(name) +{ + var tmp = null; + + if (name != null && typeof name === 'string') + { + var parts = name.split('.'); + + if (parts.length > 0 && parts[0] == 'mxgraph') + { + tmp = parts[1]; + + for (var i = 2; i < parts.length - 1; i++) + { + tmp += '/' + parts[i]; + } + } + } + + return tmp; +}; + +// Loads the given stencil set +mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force, async) +{ + force = (force != null) ? force : false; + + // Uses additional cache for detecting previous load attempts + var xmlDoc = mxStencilRegistry.packages[stencilFile]; + + if (force || xmlDoc == null) + { + var install = false; + + if (xmlDoc == null) + { + try + { + if (async) + { + mxStencilRegistry.loadStencil(stencilFile, mxUtils.bind(this, function(xmlDoc2) + { + if (xmlDoc2 != null && xmlDoc2.documentElement != null) + { + mxStencilRegistry.packages[stencilFile] = xmlDoc2; + install = true; + mxStencilRegistry.parseStencilSet(xmlDoc2.documentElement, postStencilLoad, install); + } + })); + + return; + } + else + { + xmlDoc = mxStencilRegistry.loadStencil(stencilFile); + mxStencilRegistry.packages[stencilFile] = xmlDoc; + install = true; + } + } + catch (e) + { + if (window.console != null) + { + console.log('error in loadStencilSet:', stencilFile, e); + } + } + } + + if (xmlDoc != null && xmlDoc.documentElement != null) + { + mxStencilRegistry.parseStencilSet(xmlDoc.documentElement, postStencilLoad, install); + } + } +}; + +// Loads the given stencil XML file. +mxStencilRegistry.loadStencil = function(filename, fn) +{ + if (fn != null) + { + var req = mxUtils.get(filename, mxUtils.bind(this, function(req) + { + fn((req.getStatus() >= 200 && req.getStatus() <= 299) ? req.getXml() : null); + })); + } + else + { + return mxUtils.load(filename).getXml(); + } +}; + +// Takes array of strings +mxStencilRegistry.parseStencilSets = function(stencils) +{ + for (var i = 0; i < stencils.length; i++) + { + mxStencilRegistry.parseStencilSet(mxUtils.parseXml(stencils[i]).documentElement); + } +}; + +// Parses the given stencil set +mxStencilRegistry.parseStencilSet = function(root, postStencilLoad, install) +{ + if (root.nodeName == 'stencils') + { + var shapes = root.firstChild; + + while (shapes != null) + { + if (shapes.nodeName == 'shapes') + { + mxStencilRegistry.parseStencilSet(shapes, postStencilLoad, install); + } + + shapes = shapes.nextSibling; + } + } + else + { + install = (install != null) ? install : true; + var shape = root.firstChild; + var packageName = ''; + var name = root.getAttribute('name'); + + if (name != null) + { + packageName = name + '.'; + } + + while (shape != null) + { + if (shape.nodeType == mxConstants.NODETYPE_ELEMENT) + { + name = shape.getAttribute('name'); + + if (name != null) + { + packageName = packageName.toLowerCase(); + var stencilName = name.replace(/ /g,"_"); + + if (install) + { + mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape)); + } + + if (postStencilLoad != null) + { + var w = shape.getAttribute('w'); + var h = shape.getAttribute('h'); + + w = (w == null) ? 80 : parseInt(w, 10); + h = (h == null) ? 80 : parseInt(h, 10); + + postStencilLoad(packageName, stencilName, name, w, h); + } + } + } + + shape = shape.nextSibling; + } + } +}; + +/** + * These overrides are only added if mxVertexHandler is defined (ie. not in embedded graph) + */ +if (typeof mxVertexHandler != 'undefined') +{ + (function() + { + // Sets colors for handles + mxConstants.HANDLE_FILLCOLOR = '#29b6f2'; + mxConstants.HANDLE_STROKECOLOR = '#0088cf'; + mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff'; + mxConstants.OUTLINE_COLOR = '#00a8ff'; + mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff'; + mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff'; + mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff'; + mxConstants.EDGE_SELECTION_COLOR = '#00a8ff'; + mxConstants.DEFAULT_VALID_COLOR = '#00a8ff'; + mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff'; + mxConstants.GUIDE_COLOR = '#0088cf'; + mxConstants.HIGHLIGHT_OPACITY = 30; + mxConstants.HIGHLIGHT_SIZE = 5; + + // Enables snapping to off-grid terminals for edge waypoints + mxEdgeHandler.prototype.snapToTerminals = true; + + // Enables guides + mxGraphHandler.prototype.guidesEnabled = true; + + // Removes parents where all child cells are moved out + mxGraphHandler.prototype.removeEmptyParents = true; + + // Enables fading of rubberband + mxRubberband.prototype.fadeOut = true; + + // Alt-move disables guides + mxGuide.prototype.isEnabledForEvent = function(evt) + { + return !mxEvent.isAltDown(evt); + }; + + // Extends connection handler to enable ctrl+drag for cloning source cell + // since copyOnConnect is now disabled by default + var mxConnectionHandlerCreateTarget = mxConnectionHandler.prototype.isCreateTarget; + mxConnectionHandler.prototype.isCreateTarget = function(evt) + { + return mxEvent.isControlDown(evt) || mxConnectionHandlerCreateTarget.apply(this, arguments); + }; + + // Overrides highlight shape for connection points + mxConstraintHandler.prototype.createHighlightShape = function() + { + var hl = new mxEllipse(null, this.highlightColor, this.highlightColor, 0); + hl.opacity = mxConstants.HIGHLIGHT_OPACITY; + + return hl; + }; + + // Overrides edge preview to use current edge shape and default style + mxConnectionHandler.prototype.livePreview = true; + mxConnectionHandler.prototype.cursor = 'crosshair'; + + // Uses current edge style for connect preview + mxConnectionHandler.prototype.createEdgeState = function(me) + { + var style = this.graph.createCurrentEdgeStyle(); + var edge = this.graph.createEdge(null, null, null, null, null, style); + var state = new mxCellState(this.graph.view, edge, this.graph.getCellStyle(edge)); + + for (var key in this.graph.currentEdgeStyle) + { + state.style[key] = this.graph.currentEdgeStyle[key]; + } + + return state; + }; + + // Overrides dashed state with current edge style + var connectionHandlerCreateShape = mxConnectionHandler.prototype.createShape; + mxConnectionHandler.prototype.createShape = function() + { + var shape = connectionHandlerCreateShape.apply(this, arguments); + + shape.isDashed = this.graph.currentEdgeStyle[mxConstants.STYLE_DASHED] == '1'; + + return shape; + } + + // Overrides live preview to keep current style + mxConnectionHandler.prototype.updatePreview = function(valid) + { + // do not change color of preview + }; + + // Overrides connection handler to ignore edges instead of not allowing connections + var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker; + mxConnectionHandler.prototype.createMarker = function() + { + var marker = mxConnectionHandlerCreateMarker.apply(this, arguments); + + var markerGetCell = marker.getCell; + marker.getCell = mxUtils.bind(this, function(me) + { + var result = markerGetCell.apply(this, arguments); + + this.error = null; + + return result; + }); + + return marker; + }; + + /** + * + */ + Graph.prototype.defaultVertexStyle = {}; + + /** + * Contains the default style for edges. + */ + Graph.prototype.defaultEdgeStyle = {'edgeStyle': 'orthogonalEdgeStyle', 'rounded': '0', + 'jettySize': 'auto', 'orthogonalLoop': '1'}; + + /** + * Returns the current edge style as a string. + */ + Graph.prototype.createCurrentEdgeStyle = function() + { + var style = 'edgeStyle=' + (this.currentEdgeStyle['edgeStyle'] || 'none') + ';'; + + if (this.currentEdgeStyle['shape'] != null) + { + style += 'shape=' + this.currentEdgeStyle['shape'] + ';'; + } + + if (this.currentEdgeStyle['curved'] != null) + { + style += 'curved=' + this.currentEdgeStyle['curved'] + ';'; + } + + if (this.currentEdgeStyle['rounded'] != null) + { + style += 'rounded=' + this.currentEdgeStyle['rounded'] + ';'; + } + + if (this.currentEdgeStyle['comic'] != null) + { + style += 'comic=' + this.currentEdgeStyle['comic'] + ';'; + } + + if (this.currentEdgeStyle['jumpStyle'] != null) + { + style += 'jumpStyle=' + this.currentEdgeStyle['jumpStyle'] + ';'; + } + + if (this.currentEdgeStyle['jumpSize'] != null) + { + style += 'jumpSize=' + this.currentEdgeStyle['jumpSize'] + ';'; + } + + // Overrides the global default to match the default edge style + if (this.currentEdgeStyle['orthogonalLoop'] != null) + { + style += 'orthogonalLoop=' + this.currentEdgeStyle['orthogonalLoop'] + ';'; + } + else if (Graph.prototype.defaultEdgeStyle['orthogonalLoop'] != null) + { + style += 'orthogonalLoop=' + Graph.prototype.defaultEdgeStyle['orthogonalLoop'] + ';'; + } + + // Overrides the global default to match the default edge style + if (this.currentEdgeStyle['jettySize'] != null) + { + style += 'jettySize=' + this.currentEdgeStyle['jettySize'] + ';'; + } + else if (Graph.prototype.defaultEdgeStyle['jettySize'] != null) + { + style += 'jettySize=' + Graph.prototype.defaultEdgeStyle['jettySize'] + ';'; + } + + // Special logic for custom property of elbowEdgeStyle + if (this.currentEdgeStyle['edgeStyle'] == 'elbowEdgeStyle' && this.currentEdgeStyle['elbow'] != null) + { + style += 'elbow=' + this.currentEdgeStyle['elbow'] + ';'; + } + + if (this.currentEdgeStyle['html'] != null) + { + style += 'html=' + this.currentEdgeStyle['html'] + ';'; + } + else + { + style += 'html=1;'; + } + + return style; + }; + + /** + * Hook for subclassers. + */ + Graph.prototype.getPagePadding = function() + { + return new mxPoint(0, 0); + }; + + /** + * Loads the stylesheet for this graph. + */ + Graph.prototype.loadStylesheet = function() + { + var node = (this.themes != null) ? this.themes[this.defaultThemeName] : + (!mxStyleRegistry.dynamicLoading) ? null : + mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement(); + + if (node != null) + { + var dec = new mxCodec(node.ownerDocument); + dec.decode(node, this.getStylesheet()); + } + }; + + /** + * Creates lookup from object IDs to cell IDs. + */ + Graph.prototype.createCellLookup = function(cells, lookup) + { + lookup = (lookup != null) ? lookup : new Object(); + + for (var i = 0; i < cells.length; i++) + { + var cell = cells[i]; + lookup[mxObjectIdentity.get(cell)] = cell.getId(); + var childCount = this.model.getChildCount(cell); + + for (var j = 0; j < childCount; j++) + { + this.createCellLookup([this.model.getChildAt(cell, j)], lookup); + } + } + + return lookup; + }; + + /** + * Creates lookup from original to cloned cell IDs where mapping is + * the mapping used in cloneCells and lookup is a mapping from + * object IDs to cell IDs. + */ + Graph.prototype.createCellMapping = function(mapping, lookup, cellMapping) + { + cellMapping = (cellMapping != null) ? cellMapping : new Object(); + + for (var objectId in mapping) + { + var cellId = lookup[objectId]; + + if (cellMapping[cellId] == null) + { + // Uses empty string if clone ID was null which means + // the cell was cloned but not inserted into the model. + cellMapping[cellId] = mapping[objectId].getId() || ''; + } + } + + return cellMapping; + }; + + /** + * + */ + Graph.prototype.importGraphModel = function(node, dx, dy, crop) + { + dx = (dx != null) ? dx : 0; + dy = (dy != null) ? dy : 0; + + var codec = new mxCodec(node.ownerDocument); + var tempModel = new mxGraphModel(); + codec.decode(node, tempModel); + var cells = [] + + // Clones cells to remove invalid edges + var cloneMap = new Object(); + var cellMapping = new Object(); + var layers = tempModel.getChildren(this.cloneCell(tempModel.root, + this.isCloneInvalidEdges(), cloneMap)); + + if (layers != null) + { + // Creates lookup from object IDs to cell IDs + var lookup = this.createCellLookup([tempModel.root]); + + // Uses copy as layers are removed from array inside loop + layers = layers.slice(); + + this.model.beginUpdate(); + try + { + // Merges into unlocked current layer if one layer is pasted + if (layers.length == 1 && !this.isCellLocked(this.getDefaultParent())) + { + cells = this.moveCells(tempModel.getChildren(layers[0]), + dx, dy, false, this.getDefaultParent()); + + // Imported default parent maps to local default parent + cellMapping[tempModel.getChildAt(tempModel.root, 0).getId()] = + this.getDefaultParent().getId(); + } + else + { + for (var i = 0; i < layers.length; i++) + { + var children = this.model.getChildren(this.moveCells( + [layers[i]], dx, dy, false, this.model.getRoot())[0]); + + if (children != null) + { + cells = cells.concat(children); + } + } + } + + if (cells != null) + { + // Adds mapping for all cloned entries from imported to local cell ID + this.createCellMapping(cloneMap, lookup, cellMapping); + this.updateCustomLinks(cellMapping, cells); + + if (crop) + { + if (this.isGridEnabled()) + { + dx = this.snap(dx); + dy = this.snap(dy); + } + + var bounds = this.getBoundingBoxFromGeometry(cells, true); + + if (bounds != null) + { + this.moveCells(cells, dx - bounds.x, dy - bounds.y); + } + } + } + } + finally + { + this.model.endUpdate(); + } + } + + return cells; + }; + + /** + * Translates this point by the given vector. + * + * @param {number} dx X-coordinate of the translation. + * @param {number} dy Y-coordinate of the translation. + */ + Graph.prototype.encodeCells = function(cells) + { + var cloneMap = new Object(); + var clones = this.cloneCells(cells, null, cloneMap); + + // Creates a dictionary for fast lookups + var dict = new mxDictionary(); + + for (var i = 0; i < cells.length; i++) + { + dict.put(cells[i], true); + } + + // Checks for orphaned relative children and makes absolute + for (var i = 0; i < clones.length; i++) + { + var state = this.view.getState(cells[i]); + + if (state != null) + { + var geo = this.getCellGeometry(clones[i]); + + if (geo != null && geo.relative && !this.model.isEdge(cells[i]) && + !dict.get(this.model.getParent(cells[i]))) + { + geo.relative = false; + geo.x = state.x / state.view.scale - state.view.translate.x; + geo.y = state.y / state.view.scale - state.view.translate.y; + } + } + } + + var codec = new mxCodec(); + var model = new mxGraphModel(); + var parent = model.getChildAt(model.getRoot(), 0); + + for (var i = 0; i < clones.length; i++) + { + model.add(parent, clones[i]); + } + + this.updateCustomLinks(this.createCellMapping(cloneMap, + this.createCellLookup(cells)), clones); + + return codec.encode(model); + }; + + /** + * Overrides cloning cells in moveCells. + */ + var graphMoveCells = Graph.prototype.moveCells; + + Graph.prototype.moveCells = function(cells, dx, dy, clone, target, evt, mapping) + { + mapping = (mapping != null) ? mapping : new Object(); + var result = graphMoveCells.apply(this, arguments); + + if (clone) + { + this.updateCustomLinks(this.createCellMapping(mapping, + this.createCellLookup(cells)), result); + } + + return result; + }; + + /** + * Updates cells IDs for custom links in the given cells. + */ + Graph.prototype.updateCustomLinks = function(mapping, cells) + { + for (var i = 0; i < cells.length; i++) + { + if (cells[i] != null) + { + this.updateCustomLinksForCell(mapping, cells[i]); + } + } + }; + + /** + * Updates cell IDs in custom links on the given cell and its label. + */ + Graph.prototype.updateCustomLinksForCell = function(mapping, cell) + { + // Hook for subclassers + }; + + /** + * Overrides method to provide connection constraints for shapes. + */ + Graph.prototype.getAllConnectionConstraints = function(terminal, source) + { + if (terminal != null) + { + var constraints = mxUtils.getValue(terminal.style, 'points', null); + + if (constraints != null) + { + // Requires an array of arrays with x, y (0..1), an optional + // [perimeter (0 or 1), dx, and dy] eg. points=[[0,0,1,-10,10],[0,1,0],[1,1]] + var result = []; + + try + { + var c = JSON.parse(constraints); + + for (var i = 0; i < c.length; i++) + { + var tmp = c[i]; + result.push(new mxConnectionConstraint(new mxPoint(tmp[0], tmp[1]), (tmp.length > 2) ? tmp[2] != '0' : true, + null, (tmp.length > 3) ? tmp[3] : 0, (tmp.length > 4) ? tmp[4] : 0)); + } + } + catch (e) + { + // ignore + } + + return result; + } + else if (terminal.shape != null && terminal.shape.bounds != null) + { + var dir = terminal.shape.direction; + var bounds = terminal.shape.bounds; + var scale = terminal.shape.scale; + var w = bounds.width / scale; + var h = bounds.height / scale; + + if (dir == mxConstants.DIRECTION_NORTH || dir == mxConstants.DIRECTION_SOUTH) + { + var tmp = w; + w = h; + h = tmp; + } + + constraints = terminal.shape.getConstraints(terminal.style, w, h); + + if (constraints != null) + { + return constraints; + } + else if (terminal.shape.stencil != null && terminal.shape.stencil.constraints != null) + { + return terminal.shape.stencil.constraints; + } + else if (terminal.shape.constraints != null) + { + return terminal.shape.constraints; + } + } + } + + return null; + }; + + /** + * Inverts the elbow edge style without removing existing styles. + */ + Graph.prototype.flipEdge = function(edge) + { + if (edge != null) + { + var style = this.getCurrentCellStyle(edge); + var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW, + mxConstants.ELBOW_HORIZONTAL); + var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ? + mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL; + this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]); + } + }; + + /** + * Disables drill-down for non-swimlanes. + */ + Graph.prototype.isValidRoot = function(cell) + { + // Counts non-relative children + var childCount = this.model.getChildCount(cell); + var realChildCount = 0; + + for (var i = 0; i < childCount; i++) + { + var child = this.model.getChildAt(cell, i); + + if (this.model.isVertex(child)) + { + var geometry = this.getCellGeometry(child); + + if (geometry != null && !geometry.relative) + { + realChildCount++; + } + } + } + + return realChildCount > 0 || this.isContainer(cell); + }; + + /** + * Disables drill-down for non-swimlanes. + */ + Graph.prototype.isValidDropTarget = function(cell) + { + var style = this.getCurrentCellStyle(cell); + + return (mxUtils.getValue(style, 'part', '0') != '1' || + this.isContainer(cell)) && + mxUtils.getValue(style, 'dropTarget', '1') != '0' && + (mxGraph.prototype.isValidDropTarget.apply(this, arguments) || + this.isContainer(cell)); + }; + + /** + * Overrides createGroupCell to set the group style for new groups to 'group'. + */ + Graph.prototype.createGroupCell = function() + { + var group = mxGraph.prototype.createGroupCell.apply(this, arguments); + group.setStyle('group'); + + return group; + }; + + /** + * Disables extending parents with stack layouts on add + */ + Graph.prototype.isExtendParentsOnAdd = function(cell) + { + var result = mxGraph.prototype.isExtendParentsOnAdd.apply(this, arguments); + + if (result && cell != null && this.layoutManager != null) + { + var parent = this.model.getParent(cell); + + if (parent != null) + { + var layout = this.layoutManager.getLayout(parent); + + if (layout != null && layout.constructor == mxStackLayout) + { + result = false; + } + } + } + + return result; + }; + + /** + * Overrides autosize to add a border. + */ + Graph.prototype.getPreferredSizeForCell = function(cell) + { + var result = mxGraph.prototype.getPreferredSizeForCell.apply(this, arguments); + + // Adds buffer + if (result != null) + { + result.width += 10; + result.height += 4; + + if (this.gridEnabled) + { + result.width = this.snap(result.width); + result.height = this.snap(result.height); + } + } + + return result; + } + + /** + * Turns the given cells and returns the changed cells. + */ + Graph.prototype.turnShapes = function(cells, backwards) + { + var model = this.getModel(); + var select = []; + + model.beginUpdate(); + try + { + for (var i = 0; i < cells.length; i++) + { + var cell = cells[i]; + + if (model.isEdge(cell)) + { + var src = model.getTerminal(cell, true); + var trg = model.getTerminal(cell, false); + + model.setTerminal(cell, trg, true); + model.setTerminal(cell, src, false); + + var geo = model.getGeometry(cell); + + if (geo != null) + { + geo = geo.clone(); + + if (geo.points != null) + { + geo.points.reverse(); + } + + var sp = geo.getTerminalPoint(true); + var tp = geo.getTerminalPoint(false) + + geo.setTerminalPoint(sp, false); + geo.setTerminalPoint(tp, true); + model.setGeometry(cell, geo); + + // Inverts constraints + var edgeState = this.view.getState(cell); + var sourceState = this.view.getState(src); + var targetState = this.view.getState(trg); + + if (edgeState != null) + { + var sc = (sourceState != null) ? this.getConnectionConstraint(edgeState, sourceState, true) : null; + var tc = (targetState != null) ? this.getConnectionConstraint(edgeState, targetState, false) : null; + + this.setConnectionConstraint(cell, src, true, tc); + this.setConnectionConstraint(cell, trg, false, sc); + } + + select.push(cell); + } + } + else if (model.isVertex(cell)) + { + var geo = this.getCellGeometry(cell); + + if (geo != null) + { + // Rotates the size and position in the geometry + geo = geo.clone(); + geo.x += geo.width / 2 - geo.height / 2; + geo.y += geo.height / 2 - geo.width / 2; + var tmp = geo.width; + geo.width = geo.height; + geo.height = tmp; + model.setGeometry(cell, geo); + + // Reads the current direction and advances by 90 degrees + var state = this.view.getState(cell); + + if (state != null) + { + var dirs = [mxConstants.DIRECTION_EAST, mxConstants.DIRECTION_SOUTH, + mxConstants.DIRECTION_WEST, mxConstants.DIRECTION_NORTH]; + var dir = mxUtils.getValue(state.style, mxConstants.STYLE_DIRECTION, + mxConstants.DIRECTION_EAST); + this.setCellStyles(mxConstants.STYLE_DIRECTION, + dirs[mxUtils.mod(mxUtils.indexOf(dirs, dir) + + ((backwards) ? -1 : 1), dirs.length)], [cell]); + } + + select.push(cell); + } + } + } + } + finally + { + model.endUpdate(); + } + + return select; + }; + + /** + * Returns true if the given stencil contains any placeholder text. + */ + Graph.prototype.stencilHasPlaceholders = function(stencil) + { + if (stencil != null && stencil.fgNode != null) + { + var node = stencil.fgNode.firstChild; + + while (node != null) + { + if (node.nodeName == 'text' && node.getAttribute('placeholders') == '1') + { + return true; + } + + node = node.nextSibling; + } + } + + return false; + }; + + /** + * Updates the child cells with placeholders if metadata of a cell has changed. + */ + Graph.prototype.processChange = function(change) + { + mxGraph.prototype.processChange.apply(this, arguments); + + if (change instanceof mxValueChange && change.cell != null && + change.cell.value != null && typeof(change.cell.value) == 'object') + { + this.invalidateDescendantsWithPlaceholders(change.cell); + } + }; + + /** + * Replaces the given element with a span. + */ + Graph.prototype.invalidateDescendantsWithPlaceholders = function(cell) + { + // Invalidates all descendants with placeholders + var desc = this.model.getDescendants(cell); + + // LATER: Check if only label or tooltip have changed + if (desc.length > 0) + { + for (var i = 0; i < desc.length; i++) + { + var state = this.view.getState(desc[i]); + + if (state != null && state.shape != null && state.shape.stencil != null && + this.stencilHasPlaceholders(state.shape.stencil)) + { + this.removeStateForCell(desc[i]); + } + else if (this.isReplacePlaceholders(desc[i])) + { + this.view.invalidate(desc[i], false, false); + } + } + } + }; + + /** + * Replaces the given element with a span. + */ + Graph.prototype.replaceElement = function(elt, tagName) + { + var span = elt.ownerDocument.createElement((tagName != null) ? tagName : 'span'); + var attributes = Array.prototype.slice.call(elt.attributes); + + while (attr = attributes.pop()) + { + span.setAttribute(attr.nodeName, attr.nodeValue); + } + + span.innerHTML = elt.innerHTML; + elt.parentNode.replaceChild(span, elt); + }; + + /** + * + */ + Graph.prototype.processElements = function(elt, fn) + { + if (elt != null) + { + var elts = elt.getElementsByTagName('*'); + + for (var i = 0; i < elts.length; i++) + { + fn(elts[i]); + } + } + }; + + /** + * Handles label changes for XML user objects. + */ + Graph.prototype.updateLabelElements = function(cells, fn, tagName) + { + cells = (cells != null) ? cells : this.getSelectionCells(); + var div = document.createElement('div'); + + for (var i = 0; i < cells.length; i++) + { + // Changes font tags inside HTML labels + if (this.isHtmlLabel(cells[i])) + { + var label = this.convertValueToString(cells[i]); + + if (label != null && label.length > 0) + { + div.innerHTML = label; + var elts = div.getElementsByTagName((tagName != null) ? tagName : '*'); + + for (var j = 0; j < elts.length; j++) + { + fn(elts[j]); + } + + if (div.innerHTML != label) + { + this.cellLabelChanged(cells[i], div.innerHTML); + } + } + } + } + }; + + /** + * Handles label changes for XML user objects. + */ + Graph.prototype.cellLabelChanged = function(cell, value, autoSize) + { + // Removes all illegal control characters in user input + value = Graph.zapGremlins(value); + + this.model.beginUpdate(); + try + { + if (cell.value != null && typeof cell.value == 'object') + { + if (this.isReplacePlaceholders(cell) && + cell.getAttribute('placeholder') != null) + { + // LATER: Handle delete, name change + var name = cell.getAttribute('placeholder'); + var current = cell; + + while (current != null) + { + if (current == this.model.getRoot() || (current.value != null && + typeof(current.value) == 'object' && current.hasAttribute(name))) + { + this.setAttributeForCell(current, name, value); + + break; + } + + current = this.model.getParent(current); + } + } + + var tmp = cell.value.cloneNode(true); + tmp.setAttribute('label', value); + value = tmp; + } + + mxGraph.prototype.cellLabelChanged.apply(this, arguments); + } + finally + { + this.model.endUpdate(); + } + }; + + /** + * Removes transparent empty groups if all children are removed. + */ + Graph.prototype.cellsRemoved = function(cells) + { + if (cells != null) + { + var dict = new mxDictionary(); + + for (var i = 0; i < cells.length; i++) + { + dict.put(cells[i], true); + } + + // LATER: Recurse up the cell hierarchy + var parents = []; + + for (var i = 0; i < cells.length; i++) + { + var parent = this.model.getParent(cells[i]); + + if (parent != null && !dict.get(parent)) + { + dict.put(parent, true); + parents.push(parent); + } + } + + for (var i = 0; i < parents.length; i++) + { + var state = this.view.getState(parents[i]); + + if (state != null && (this.model.isEdge(state.cell) || + this.model.isVertex(state.cell)) && + this.isCellDeletable(state.cell) && + this.isTransparentState(state)) + { + var allChildren = true; + + for (var j = 0; j < this.model.getChildCount(state.cell) && allChildren; j++) + { + if (!dict.get(this.model.getChildAt(state.cell, j))) + { + allChildren = false; + } + } + + if (allChildren) + { + cells.push(state.cell); + } + } + } + } + + mxGraph.prototype.cellsRemoved.apply(this, arguments); + }; + + /** + * Overrides ungroup to check if group should be removed. + */ + Graph.prototype.removeCellsAfterUngroup = function(cells) + { + var cellsToRemove = []; + + for (var i = 0; i < cells.length; i++) + { + if (this.isCellDeletable(cells[i]) && this.isTransparentState( + this.view.getState(cells[i]))) + { + cellsToRemove.push(cells[i]); + } + } + + cells = cellsToRemove; + + mxGraph.prototype.removeCellsAfterUngroup.apply(this, arguments); + }; + + /** + * Sets the link for the given cell. + */ + Graph.prototype.setLinkForCell = function(cell, link) + { + this.setAttributeForCell(cell, 'link', link); + }; + + /** + * Sets the link for the given cell. + */ + Graph.prototype.setTooltipForCell = function(cell, link) + { + this.setAttributeForCell(cell, 'tooltip', link); + }; + + /** + * Returns the cells in the model (or given array) that have all of the + * given tags in their tags property. + */ + Graph.prototype.getAttributeForCell = function(cell, attributeName, defaultValue) + { + var value = (cell.value != null && typeof cell.value === 'object') ? + cell.value.getAttribute(attributeName) : null; + + return (value != null) ? value : defaultValue; + }; + + /** + * Sets the link for the given cell. + */ + Graph.prototype.setAttributeForCell = function(cell, attributeName, attributeValue) + { + var value = null; + + if (cell.value != null && typeof(cell.value) == 'object') + { + value = cell.value.cloneNode(true); + } + else + { + var doc = mxUtils.createXmlDocument(); + + value = doc.createElement('UserObject'); + value.setAttribute('label', cell.value || ''); + } + + if (attributeValue != null) + { + value.setAttribute(attributeName, attributeValue); + } + else + { + value.removeAttribute(attributeName); + } + + this.model.setValue(cell, value); + }; + + /** + * Overridden to stop moving edge labels between cells. + */ + Graph.prototype.getDropTarget = function(cells, evt, cell, clone) + { + var model = this.getModel(); + + // Disables drop into group if alt is pressed + if (mxEvent.isAltDown(evt)) + { + return null; + } + + // Disables dragging edge labels out of edges + for (var i = 0; i < cells.length; i++) + { + if (this.model.isEdge(this.model.getParent(cells[i]))) + { + return null; + } + } + + return mxGraph.prototype.getDropTarget.apply(this, arguments); + }; + + /** + * Overrides double click handling to avoid accidental inserts of new labels in dblClick below. + */ + Graph.prototype.click = function(me) + { + mxGraph.prototype.click.call(this, me); + + // Stores state and source for checking in dblClick + this.firstClickState = me.getState(); + this.firstClickSource = me.getSource(); + }; + + /** + * Overrides double click handling to add the tolerance and inserting text. + */ + Graph.prototype.dblClick = function(evt, cell) + { + if (this.isEnabled()) + { + var pt = mxUtils.convertPoint(this.container, mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + + // Automatically adds new child cells to edges on double click + if (evt != null && !this.model.isVertex(cell)) + { + var state = (this.model.isEdge(cell)) ? this.view.getState(cell) : null; + var src = mxEvent.getSource(evt); + + if ((this.firstClickState == state && this.firstClickSource == src) && + (state == null || (state.text == null || state.text.node == null || + state.text.boundingBox == null || (!mxUtils.contains(state.text.boundingBox, + pt.x, pt.y) && !mxUtils.isAncestorNode(state.text.node, mxEvent.getSource(evt))))) && + ((state == null && !this.isCellLocked(this.getDefaultParent())) || + (state != null && !this.isCellLocked(state.cell))) && + (state != null || (mxClient.IS_VML && src == this.view.getCanvas()) || + (mxClient.IS_SVG && src == this.view.getCanvas().ownerSVGElement))) + { + if (state == null) + { + state = this.view.getState(this.getCellAt(pt.x, pt.y)); + } + + cell = this.addText(pt.x, pt.y, state); + } + } + + mxGraph.prototype.dblClick.call(this, evt, cell); + } + }; + + /** + * Returns a point that specifies the location for inserting cells. + */ + Graph.prototype.getInsertPoint = function() + { + var gs = this.getGridSize(); + var dx = this.container.scrollLeft / this.view.scale - this.view.translate.x; + var dy = this.container.scrollTop / this.view.scale - this.view.translate.y; + + if (this.pageVisible) + { + var layout = this.getPageLayout(); + var page = this.getPageSize(); + dx = Math.max(dx, layout.x * page.width); + dy = Math.max(dy, layout.y * page.height); + } + + return new mxPoint(this.snap(dx + gs), this.snap(dy + gs)); + }; + + /** + * + */ + Graph.prototype.getFreeInsertPoint = function() + { + var view = this.view; + var bds = this.getGraphBounds(); + var pt = this.getInsertPoint(); + + // Places at same x-coord and 2 grid sizes below existing graph + var x = this.snap(Math.round(Math.max(pt.x, bds.x / view.scale - view.translate.x + + ((bds.width == 0) ? 2 * this.gridSize : 0)))); + var y = this.snap(Math.round(Math.max(pt.y, (bds.y + bds.height) / view.scale - view.translate.y + + 2 * this.gridSize))); + + return new mxPoint(x, y); + }; + + /** + * + */ + Graph.prototype.getCenterInsertPoint = function(bbox) + { + bbox = (bbox != null) ? bbox : new mxRectangle(); + + if (mxUtils.hasScrollbars(this.container)) + { + return new mxPoint( + this.snap((this.container.scrollLeft + this.container.clientWidth / 2) / this.view.scale - + this.view.translate.x - bbox.width / 2), + this.snap((this.container.scrollTop + this.container.clientHeight / 2) / this.view.scale - + this.view.translate.y - bbox.height / 2)); + } + else + { + return new mxPoint( + this.snap(this.container.clientWidth / 2 / this.view.scale - + this.view.translate.x - bbox.width / 2), + this.snap(this.container.clientHeight / 2 / this.view.scale - + this.view.translate.y - bbox.height / 2)); + } + }; + + /** + * Hook for subclassers to return true if the current insert point was defined + * using a mouse hover event. + */ + Graph.prototype.isMouseInsertPoint = function() + { + return false; + }; + + /** + * Adds a new label at the given position and returns the new cell. State is + * an optional edge state to be used as the parent for the label. Vertices + * are not allowed currently as states. + */ + Graph.prototype.addText = function(x, y, state) + { + // Creates a new edge label with a predefined text + var label = new mxCell(); + label.value = 'Text'; + label.style = 'text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];' + label.geometry = new mxGeometry(0, 0, 0, 0); + label.vertex = true; + + if (state != null && this.model.isEdge(state.cell)) + { + label.style += 'labelBackgroundColor=#ffffff;' + label.geometry.relative = true; + label.connectable = false; + + // Resets the relative location stored inside the geometry + var pt2 = this.view.getRelativePoint(state, x, y); + label.geometry.x = Math.round(pt2.x * 10000) / 10000; + label.geometry.y = Math.round(pt2.y); + + // Resets the offset inside the geometry to find the offset from the resulting point + label.geometry.offset = new mxPoint(0, 0); + pt2 = this.view.getPoint(state, label.geometry); + + var scale = this.view.scale; + label.geometry.offset = new mxPoint(Math.round((x - pt2.x) / scale), Math.round((y - pt2.y) / scale)); + } + else + { + var tr = this.view.translate; + label.geometry.width = 40; + label.geometry.height = 20; + label.geometry.x = Math.round(x / this.view.scale) - + tr.x - ((state != null) ? state.origin.x : 0); + label.geometry.y = Math.round(y / this.view.scale) - + tr.y - ((state != null) ? state.origin.y : 0); + label.style += 'autosize=1;' + } + + this.getModel().beginUpdate(); + try + { + this.addCells([label], (state != null) ? state.cell : null); + this.fireEvent(new mxEventObject('textInserted', 'cells', [label])); + + // Updates size of text after possible change of style via event + this.autoSizeCell(label); + } + finally + { + this.getModel().endUpdate(); + } + + return label; + }; + + /** + * Adds a handler for clicking on shapes with links. This replaces all links in labels. + */ + Graph.prototype.addClickHandler = function(highlight, beforeClick, onClick) + { + // Replaces links in labels for consistent right-clicks + var checkLinks = mxUtils.bind(this, function() + { + var links = this.container.getElementsByTagName('a'); + + if (links != null) + { + for (var i = 0; i < links.length; i++) + { + var href = this.getAbsoluteUrl(links[i].getAttribute('href')); + + if (href != null) + { + links[i].setAttribute('rel', this.linkRelation); + links[i].setAttribute('href', href); + + if (beforeClick != null) + { + mxEvent.addGestureListeners(links[i], null, null, beforeClick); + } + } + } + } + }); + + this.model.addListener(mxEvent.CHANGE, checkLinks); + checkLinks(); + + var cursor = this.container.style.cursor; + var tol = this.getTolerance(); + var graph = this; + + var mouseListener = + { + currentState: null, + currentLink: null, + highlight: (highlight != null && highlight != '' && highlight != mxConstants.NONE) ? + new mxCellHighlight(graph, highlight, 4) : null, + startX: 0, + startY: 0, + scrollLeft: 0, + scrollTop: 0, + updateCurrentState: function(me) + { + var tmp = me.sourceState; + + // Gets topmost intersecting cell with link + if (tmp == null || graph.getLinkForCell(tmp.cell) == null) + { + var cell = graph.getCellAt(me.getGraphX(), me.getGraphY(), null, null, null, function(state, x, y) + { + return graph.getLinkForCell(state.cell) == null; + }); + + tmp = graph.view.getState(cell); + } + + if (tmp != this.currentState) + { + if (this.currentState != null) + { + this.clear(); + } + + this.currentState = tmp; + + if (this.currentState != null) + { + this.activate(this.currentState); + } + } + }, + mouseDown: function(sender, me) + { + this.startX = me.getGraphX(); + this.startY = me.getGraphY(); + this.scrollLeft = graph.container.scrollLeft; + this.scrollTop = graph.container.scrollTop; + + if (this.currentLink == null && graph.container.style.overflow == 'auto') + { + graph.container.style.cursor = 'move'; + } + + this.updateCurrentState(me); + }, + mouseMove: function(sender, me) + { + if (graph.isMouseDown) + { + if (this.currentLink != null) + { + var dx = Math.abs(this.startX - me.getGraphX()); + var dy = Math.abs(this.startY - me.getGraphY()); + + if (dx > tol || dy > tol) + { + this.clear(); + } + } + } + else + { + // Checks for parent link + var linkNode = me.getSource(); + + while (linkNode != null && linkNode.nodeName.toLowerCase() != 'a') + { + linkNode = linkNode.parentNode; + } + + if (linkNode != null) + { + this.clear(); + } + else + { + if (graph.tooltipHandler != null && this.currentLink != null && this.currentState != null) + { + graph.tooltipHandler.reset(me, true, this.currentState); + } + + if (this.currentState != null && (me.getState() == this.currentState || me.sourceState == null) && + graph.intersects(this.currentState, me.getGraphX(), me.getGraphY())) + { + return; + } + + this.updateCurrentState(me); + } + } + }, + mouseUp: function(sender, me) + { + var source = me.getSource(); + var evt = me.getEvent(); + + // Checks for parent link + var linkNode = source; + + while (linkNode != null && linkNode.nodeName.toLowerCase() != 'a') + { + linkNode = linkNode.parentNode; + } + + // Ignores clicks on links and collapse/expand icon + if (linkNode == null && + (((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && + Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && + (me.sourceState == null || !me.isSource(me.sourceState.control))) && + (((mxEvent.isLeftMouseButton(evt) || mxEvent.isMiddleMouseButton(evt)) && + !mxEvent.isPopupTrigger(evt)) || mxEvent.isTouchEvent(evt)))) + { + if (this.currentLink != null) + { + var blank = graph.isBlankLink(this.currentLink); + + if ((this.currentLink.substring(0, 5) === 'data:' || + !blank) && beforeClick != null) + { + beforeClick(evt, this.currentLink); + } + + if (!mxEvent.isConsumed(evt)) + { + var target = (mxEvent.isMiddleMouseButton(evt)) ? '_blank' : + ((blank) ? graph.linkTarget : '_top'); + graph.openLink(this.currentLink, target); + me.consume(); + } + } + else if (onClick != null && !me.isConsumed() && + (Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && + Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && + (Math.abs(this.startX - me.getGraphX()) < tol && + Math.abs(this.startY - me.getGraphY()) < tol)) + { + onClick(me.getEvent()); + } + } + + this.clear(); + }, + activate: function(state) + { + this.currentLink = graph.getAbsoluteUrl(graph.getLinkForCell(state.cell)); + + if (this.currentLink != null) + { + graph.container.style.cursor = 'pointer'; + + if (this.highlight != null) + { + this.highlight.highlight(state); + } + } + }, + clear: function() + { + if (graph.container != null) + { + graph.container.style.cursor = cursor; + } + + this.currentState = null; + this.currentLink = null; + + if (this.highlight != null) + { + this.highlight.hide(); + } + + if (graph.tooltipHandler != null) + { + graph.tooltipHandler.hide(); + } + } + }; + + // Ignores built-in click handling + graph.click = function(me) {}; + graph.addMouseListener(mouseListener); + + mxEvent.addListener(document, 'mouseleave', function(evt) + { + mouseListener.clear(); + }); + }; + + /** + * Duplicates the given cells and returns the duplicates. + */ + Graph.prototype.duplicateCells = function(cells, append) + { + cells = (cells != null) ? cells : this.getSelectionCells(); + append = (append != null) ? append : true; + + cells = this.model.getTopmostCells(cells); + + var model = this.getModel(); + var s = this.gridSize; + var select = []; + + model.beginUpdate(); + try + { + var clones = this.cloneCells(cells, false, null, true); + + for (var i = 0; i < cells.length; i++) + { + var parent = model.getParent(cells[i]); + var child = this.moveCells([clones[i]], s, s, false)[0]; + select.push(child); + + if (append) + { + model.add(parent, clones[i]); + } + else + { + // Maintains child index by inserting after clone in parent + var index = parent.getIndex(cells[i]); + model.add(parent, clones[i], index + 1); + } + } + } + finally + { + model.endUpdate(); + } + + return select; + }; + + /** + * Inserts the given image at the cursor in a content editable text box using + * the insertimage command on the document instance. + */ + Graph.prototype.insertImage = function(newValue, w, h) + { + // To find the new image, we create a list of all existing links first + if (newValue != null && this.cellEditor.textarea != null) + { + var tmp = this.cellEditor.textarea.getElementsByTagName('img'); + var oldImages = []; + + for (var i = 0; i < tmp.length; i++) + { + oldImages.push(tmp[i]); + } + + // LATER: Fix inserting link/image in IE8/quirks after focus lost + document.execCommand('insertimage', false, newValue); + + // Sets size of new image + var newImages = this.cellEditor.textarea.getElementsByTagName('img'); + + if (newImages.length == oldImages.length + 1) + { + // Inverse order in favor of appended images + for (var i = newImages.length - 1; i >= 0; i--) + { + if (i == 0 || newImages[i] != oldImages[i - 1]) + { + // Workaround for lost styles during undo and redo is using attributes + newImages[i].setAttribute('width', w); + newImages[i].setAttribute('height', h); + + break; + } + } + } + } + }; + + /** + * Inserts the given image at the cursor in a content editable text box using + * the insertimage command on the document instance. + */ + Graph.prototype.insertLink = function(value) + { + if (this.cellEditor.textarea != null) + { + if (value.length == 0) + { + document.execCommand('unlink', false); + } + else if (mxClient.IS_FF) + { + // Workaround for Firefox that adds a new link and removes + // the href from the inner link if its parent is a span is + // to remove all inner links inside the new outer link + var tmp = this.cellEditor.textarea.getElementsByTagName('a'); + var oldLinks = []; + + for (var i = 0; i < tmp.length; i++) + { + oldLinks.push(tmp[i]); + } + + document.execCommand('createlink', false, mxUtils.trim(value)); + + // Finds the new link element + var newLinks = this.cellEditor.textarea.getElementsByTagName('a'); + + if (newLinks.length == oldLinks.length + 1) + { + // Inverse order in favor of appended links + for (var i = newLinks.length - 1; i >= 0; i--) + { + if (newLinks[i] != oldLinks[i - 1]) + { + // Removes all inner links from the new link and + // moves the children to the inner link parent + var tmp = newLinks[i].getElementsByTagName('a'); + + while (tmp.length > 0) + { + var parent = tmp[0].parentNode; + + while (tmp[0].firstChild != null) + { + parent.insertBefore(tmp[0].firstChild, tmp[0]); + } + + parent.removeChild(tmp[0]); + } + + break; + } + } + } + } + else + { + // LATER: Fix inserting link/image in IE8/quirks after focus lost + document.execCommand('createlink', false, mxUtils.trim(value)); + } + } + }; + + /** + * + * @param cell + * @returns {Boolean} + */ + Graph.prototype.isCellResizable = function(cell) + { + var result = mxGraph.prototype.isCellResizable.apply(this, arguments); + var style = this.getCurrentCellStyle(cell); + + return result || (mxUtils.getValue(style, mxConstants.STYLE_RESIZABLE, '1') != '0' && + style[mxConstants.STYLE_WHITE_SPACE] == 'wrap'); + }; + + /** + * Function: distributeCells + * + * Distribuets the centers of the given cells equally along the available + * horizontal or vertical space. + * + * Parameters: + * + * horizontal - Boolean that specifies the direction of the distribution. + * cells - Optional array of to be distributed. Edges are ignored. + */ + Graph.prototype.distributeCells = function(horizontal, cells) + { + if (cells == null) + { + cells = this.getSelectionCells(); + } + + if (cells != null && cells.length > 1) + { + var vertices = []; + var max = null; + var min = null; + + for (var i = 0; i < cells.length; i++) + { + if (this.getModel().isVertex(cells[i])) + { + var state = this.view.getState(cells[i]); + + if (state != null) + { + var tmp = (horizontal) ? state.getCenterX() : state.getCenterY(); + max = (max != null) ? Math.max(max, tmp) : tmp; + min = (min != null) ? Math.min(min, tmp) : tmp; + + vertices.push(state); + } + } + } + + if (vertices.length > 2) + { + vertices.sort(function(a, b) + { + return (horizontal) ? a.x - b.x : a.y - b.y; + }); + + var t = this.view.translate; + var s = this.view.scale; + + min = min / s - ((horizontal) ? t.x : t.y); + max = max / s - ((horizontal) ? t.x : t.y); + + this.getModel().beginUpdate(); + try + { + var dt = (max - min) / (vertices.length - 1); + var t0 = min; + + for (var i = 1; i < vertices.length - 1; i++) + { + var pstate = this.view.getState(this.model.getParent(vertices[i].cell)); + var geo = this.getCellGeometry(vertices[i].cell); + t0 += dt; + + if (geo != null && pstate != null) + { + geo = geo.clone(); + + if (horizontal) + { + geo.x = Math.round(t0 - geo.width / 2) - pstate.origin.x; + } + else + { + geo.y = Math.round(t0 - geo.height / 2) - pstate.origin.y; + } + + this.getModel().setGeometry(vertices[i].cell, geo); + } + } + } + finally + { + this.getModel().endUpdate(); + } + } + } + + return cells; + }; + + /** + * Adds meta-drag an Mac. + * @param evt + * @returns + */ + Graph.prototype.isCloneEvent = function(evt) + { + return (mxClient.IS_MAC && mxEvent.isMetaDown(evt)) || mxEvent.isControlDown(evt); + }; + + /** + * Translates this point by the given vector. + * + * @param {number} dx X-coordinate of the translation. + * @param {number} dy Y-coordinate of the translation. + */ + Graph.prototype.createSvgImageExport = function() + { + var exp = new mxImageExport(); + + // Adds hyperlinks (experimental) + exp.getLinkForCellState = mxUtils.bind(this, function(state, canvas) + { + return this.getLinkForCell(state.cell); + }); + + return exp; + }; + + /** + * Translates this point by the given vector. + * + * @param {number} dx X-coordinate of the translation. + * @param {number} dy Y-coordinate of the translation. + */ + Graph.prototype.getSvg = function(background, scale, border, nocrop, crisp, + ignoreSelection, showText, imgExport, linkTarget, hasShadow) + { + //Disable Css Transforms if it is used + var origUseCssTrans = this.useCssTransforms; + + if (origUseCssTrans) + { + this.useCssTransforms = false; + this.view.revalidate(); + this.sizeDidChange(); + } + + try + { + scale = (scale != null) ? scale : 1; + border = (border != null) ? border : 0; + crisp = (crisp != null) ? crisp : true; + ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true; + showText = (showText != null) ? showText : true; + + var bounds = (ignoreSelection || nocrop) ? + this.getGraphBounds() : this.getBoundingBox( + this.getSelectionCells()); + + if (bounds == null) + { + throw Error(mxResources.get('drawingEmpty')); + } + + var vs = this.view.scale; + + // Prepares SVG document that holds the output + var svgDoc = mxUtils.createXmlDocument(); + var root = (svgDoc.createElementNS != null) ? + svgDoc.createElementNS(mxConstants.NS_SVG, 'svg') : svgDoc.createElement('svg'); + + if (background != null) + { + if (root.style != null) + { + root.style.backgroundColor = background; + } + else + { + root.setAttribute('style', 'background-color:' + background); + } + } + + if (svgDoc.createElementNS == null) + { + root.setAttribute('xmlns', mxConstants.NS_SVG); + root.setAttribute('xmlns:xlink', mxConstants.NS_XLINK); + } + else + { + // KNOWN: Ignored in IE9-11, adds namespace for each image element instead. No workaround. + root.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', mxConstants.NS_XLINK); + } + + var s = scale / vs; + var w = Math.max(1, Math.ceil(bounds.width * s) + 2 * border) + ((hasShadow) ? 5 : 0); + var h = Math.max(1, Math.ceil(bounds.height * s) + 2 * border) + ((hasShadow) ? 5 : 0); + + root.setAttribute('version', '1.1'); + root.setAttribute('width', w + 'px'); + root.setAttribute('height', h + 'px'); + root.setAttribute('viewBox', ((crisp) ? '-0.5 -0.5' : '0 0') + ' ' + w + ' ' + h); + svgDoc.appendChild(root); + + // Renders graph. Offset will be multiplied with state's scale when painting state. + // TextOffset only seems to affect FF output but used everywhere for consistency. + var group = (svgDoc.createElementNS != null) ? + svgDoc.createElementNS(mxConstants.NS_SVG, 'g') : svgDoc.createElement('g'); + root.appendChild(group); + + var svgCanvas = this.createSvgCanvas(group); + svgCanvas.foOffset = (crisp) ? -0.5 : 0; + svgCanvas.textOffset = (crisp) ? -0.5 : 0; + svgCanvas.imageOffset = (crisp) ? -0.5 : 0; + svgCanvas.translate(Math.floor((border / scale - bounds.x) / vs), + Math.floor((border / scale - bounds.y) / vs)); + + // Convert HTML entities + var htmlConverter = document.createElement('div'); + + // Adds simple text fallback for viewers with no support for foreignObjects + var getAlternateText = svgCanvas.getAlternateText; + svgCanvas.getAlternateText = function(fo, x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation) + { + // Assumes a max character width of 0.5em + if (str != null && this.state.fontSize > 0) + { + try + { + if (mxUtils.isNode(str)) + { + str = str.innerText; + } + else + { + htmlConverter.innerHTML = str; + str = mxUtils.extractTextWithWhitespace(htmlConverter.childNodes); + } + + // Workaround for substring breaking double byte UTF + var exp = Math.ceil(2 * w / this.state.fontSize); + var result = []; + var length = 0; + var index = 0; + + while ((exp == 0 || length < exp) && index < str.length) + { + var char = str.charCodeAt(index); + + if (char == 10 || char == 13) + { + if (length > 0) + { + break; + } + } + else + { + result.push(str.charAt(index)); + + if (char < 255) + { + length++; + } + } + + index++; + } + + // Uses result and adds ellipsis if more than 1 char remains + if (result.length < str.length && str.length - result.length > 1) + { + str = mxUtils.trim(result.join('')) + '...'; + } + + return str; + } + catch (e) + { + return getAlternateText.apply(this, arguments); + } + } + else + { + return getAlternateText.apply(this, arguments); + } + }; + + // Paints background image + var bgImg = this.backgroundImage; + + if (bgImg != null) + { + var s2 = vs / scale; + var tr = this.view.translate; + var tmp = new mxRectangle(tr.x * s2, tr.y * s2, bgImg.width * s2, bgImg.height * s2); + + // Checks if visible + if (mxUtils.intersects(bounds, tmp)) + { + svgCanvas.image(tr.x, tr.y, bgImg.width, bgImg.height, bgImg.src, true); + } + } + + svgCanvas.scale(s); + svgCanvas.textEnabled = showText; + + imgExport = (imgExport != null) ? imgExport : this.createSvgImageExport(); + var imgExportDrawCellState = imgExport.drawCellState; + + // Ignores custom links + var imgExportGetLinkForCellState = imgExport.getLinkForCellState; + + imgExport.getLinkForCellState = function(state, canvas) + { + var result = imgExportGetLinkForCellState.apply(this, arguments); + + return (result != null && !state.view.graph.isCustomLink(result)) ? result : null; + }; + + // Implements ignoreSelection flag + imgExport.drawCellState = function(state, canvas) + { + var graph = state.view.graph; + var selected = graph.isCellSelected(state.cell); + var parent = graph.model.getParent(state.cell); + + // Checks if parent cell is selected + while (!ignoreSelection && !selected && parent != null) + { + selected = graph.isCellSelected(parent); + parent = graph.model.getParent(parent); + } + + if (ignoreSelection || selected) + { + imgExportDrawCellState.apply(this, arguments); + } + }; + + imgExport.drawState(this.getView().getState(this.model.root), svgCanvas); + this.updateSvgLinks(root, linkTarget, true); + this.addForeignObjectWarning(svgCanvas, root); + + return root; + } + finally + { + if (origUseCssTrans) + { + this.useCssTransforms = true; + this.view.revalidate(); + this.sizeDidChange(); + } + } + }; + + /** + * Adds warning for truncated labels in older viewers. + */ + Graph.prototype.addForeignObjectWarning = function(canvas, root) + { + if (root.getElementsByTagName('foreignObject').length > 0) + { + var sw = canvas.createElement('switch'); + var g1 = canvas.createElement('g'); + g1.setAttribute('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility'); + var a = canvas.createElement('a'); + a.setAttribute('transform', 'translate(0,-5)'); + + // Workaround for implicit namespace handling in HTML5 export, IE adds NS1 namespace so use code below + // in all IE versions except quirks mode. KNOWN: Adds xlink namespace to each image tag in output. + if (a.setAttributeNS == null || (root.ownerDocument != document && document.documentMode == null)) + { + a.setAttribute('xlink:href', Graph.foreignObjectWarningLink); + a.setAttribute('target', '_blank'); + } + else + { + a.setAttributeNS(mxConstants.NS_XLINK, 'xlink:href', Graph.foreignObjectWarningLink); + a.setAttributeNS(mxConstants.NS_XLINK, 'target', '_blank'); + } + + var text = canvas.createElement('text'); + text.setAttribute('text-anchor', 'middle'); + text.setAttribute('font-size', '10px'); + text.setAttribute('x', '50%'); + text.setAttribute('y', '100%'); + mxUtils.write(text, Graph.foreignObjectWarningText); + + sw.appendChild(g1); + a.appendChild(text); + sw.appendChild(a); + root.appendChild(sw); + } + }; + + /** + * Hook for creating the canvas used in getSvg. + */ + Graph.prototype.updateSvgLinks = function(node, target, removeCustom) + { + var links = node.getElementsByTagName('a'); + + for (var i = 0; i < links.length; i++) + { + var href = links[i].getAttribute('href'); + + if (href == null) + { + href = links[i].getAttribute('xlink:href'); + } + + if (href != null) + { + if (target != null && /^https?:\/\//.test(href)) + { + links[i].setAttribute('target', target); + } + else if (removeCustom && this.isCustomLink(href)) + { + links[i].setAttribute('href', 'javascript:void(0);'); + } + } + } + }; + + /** + * Hook for creating the canvas used in getSvg. + */ + Graph.prototype.createSvgCanvas = function(node) + { + var canvas = new mxSvgCanvas2D(node); + + canvas.pointerEvents = true; + + return canvas; + }; + + /** + * Returns the first ancestor of the current selection with the given name. + */ + Graph.prototype.getSelectedElement = function() + { + var node = null; + + if (window.getSelection) + { + var sel = window.getSelection(); + + if (sel.getRangeAt && sel.rangeCount) + { + var range = sel.getRangeAt(0); + node = range.commonAncestorContainer; + } + } + else if (document.selection) + { + node = document.selection.createRange().parentElement(); + } + + return node; + }; + + /** + * Returns the first ancestor of the current selection with the given name. + */ + Graph.prototype.getParentByName = function(node, name, stopAt) + { + while (node != null) + { + if (node.nodeName == name) + { + return node; + } + + if (node == stopAt) + { + return null; + } + + node = node.parentNode; + } + + return node; + }; + + /** + * Returns the first ancestor of the current selection with the given name. + */ + Graph.prototype.getParentByNames = function(node, names, stopAt) + { + while (node != null) + { + if (mxUtils.indexOf(names, node.nodeName) >= 0) + { + return node; + } + + if (node == stopAt) + { + return null; + } + + node = node.parentNode; + } + + return node; + }; + + /** + * Selects the given node. + */ + Graph.prototype.selectNode = function(node) + { + var sel = null; + + // IE9 and non-IE + if (window.getSelection) + { + sel = window.getSelection(); + + if (sel.getRangeAt && sel.rangeCount) + { + var range = document.createRange(); + range.selectNode(node); + sel.removeAllRanges(); + sel.addRange(range); + } + } + // IE < 9 + else if ((sel = document.selection) && sel.type != 'Control') + { + var originalRange = sel.createRange(); + originalRange.collapse(true); + var range = sel.createRange(); + range.setEndPoint('StartToStart', originalRange); + range.select(); + } + }; + + /** + * + */ + Graph.prototype.insertTableColumn = function(cell, before) + { + var model = this.getModel(); + model.beginUpdate(); + + try + { + var table = cell; + var index = 0; + + if (this.isTableCell(cell)) + { + var row = model.getParent(cell); + table = model.getParent(row); + index = row.getIndex(cell); + } + else + { + if (this.isTableRow(cell)) + { + table = model.getParent(cell); + } + + if (!before) + { + index = model.getChildCount(model.getChildAt(table, 0)) - 1; + } + } + + for (var i = 0; i < model.getChildCount(table); i++) + { + var row = model.getChildAt(table, i); + var child = model.getChildAt(row, index); + var clone = model.cloneCell(child); + var geo = this.getCellGeometry(clone); + clone.value = null; + + if (geo != null) + { + geo.width = Graph.minTableColumnWidth; + var rowGeo = this.getCellGeometry(row); + + if (rowGeo != null) + { + geo.height = rowGeo.height; + } + } + + model.add(row, clone, index + ((before) ? 0 : 1)); + } + + var tableGeo = this.getCellGeometry(table); + + if (tableGeo != null) + { + tableGeo = tableGeo.clone(); + tableGeo.width += Graph.minTableColumnWidth; + + model.setGeometry(table, tableGeo); + } + } + finally + { + model.endUpdate(); + } + }; + + /** + * + */ + Graph.prototype.insertTableRow = function(cell, before) + { + var model = this.getModel(); + model.beginUpdate(); + + try + { + var table = cell; + var index = 0; + + if (this.isTableCell(cell)) + { + var row = model.getParent(cell); + table = model.getParent(row); + index = table.getIndex(row); + } + else if (this.isTableRow(cell)) + { + table = model.getParent(cell); + index = table.getIndex(cell); + } + else if (!before) + { + index = model.getChildCount(table) - 1; + } + + var row = model.cloneCell(model.getChildAt(table, index)); + row.value = null; + + var rowGeo = this.getCellGeometry(row); + + if (rowGeo != null) + { + rowGeo.height = Graph.minTableRowHeight; + + for (var i = 0; i < model.getChildCount(row); i++) + { + var cell = model.getChildAt(row, i); + cell.value = null; + + var geo = this.getCellGeometry(cell); + + if (geo != null) + { + geo.height = rowGeo.height; + } + } + + model.add(table, row, index + ((before) ? 0 : 1)); + + var tableGeo = this.getCellGeometry(table); + + if (tableGeo != null) + { + tableGeo = tableGeo.clone(); + tableGeo.height += rowGeo.height; + + model.setGeometry(table, tableGeo); + } + } + } + finally + { + model.endUpdate(); + } + }; + + /** + * + */ + Graph.prototype.deleteTableColumn = function(cell) + { + var model = this.getModel(); + model.beginUpdate(); + + try + { + var table = cell; + var index = 0; + + if (this.isTableCell(cell)) + { + var row = model.getParent(cell); + table = model.getParent(row); + index = row.getIndex(cell); + } + else if (this.isTableRow(cell)) + { + table = model.getParent(cell); + index = model.getChildCount(cell) - 1; + } + else if (this.isTable(cell)) + { + index = model.getChildCount(model.getChildAt(cell, 0)) - 1; + } + + var width = 0; + + for (var i = 0; i < model.getChildCount(table); i++) + { + var row = model.getChildAt(table, i); + var child = model.getChildAt(row, index); + model.remove(child); + + var geo = this.getCellGeometry(child); + + if (geo != null) + { + width = Math.max(width, geo.width); + } + } + + var tableGeo = this.getCellGeometry(table); + + if (tableGeo != null) + { + tableGeo = tableGeo.clone(); + tableGeo.width -= width; + + model.setGeometry(table, tableGeo); + } + } + finally + { + model.endUpdate(); + } + }; + + /** + * + */ + Graph.prototype.deleteTableRow = function(cell) + { + var model = this.getModel(); + model.beginUpdate(); + + try + { + var row = cell; + + if (this.isTableCell(cell)) + { + row = model.getParent(cell); + } + else if (this.isTable(cell)) + { + row = model.getChildAt(cell, + model.getChildCount(cell) - 1); + } + + var table = model.getParent(row); + model.remove(row); + var height = 0; + + var geo = this.getCellGeometry(row); + + if (geo != null) + { + height = geo.height; + } + + var tableGeo = this.getCellGeometry(table); + + if (tableGeo != null) + { + tableGeo = tableGeo.clone(); + tableGeo.height -= height; + + model.setGeometry(table, tableGeo); + } + } + finally + { + model.endUpdate(); + } + }; + + /** + * Inserts a new row into the given table. + */ + Graph.prototype.insertRow = function(table, index) + { + var bd = table.tBodies[0]; + var cells = bd.rows[0].cells; + var cols = 0; + + // Counts columns including colspans + for (var i = 0; i < cells.length; i++) + { + var colspan = cells[i].getAttribute('colspan'); + cols += (colspan != null) ? parseInt(colspan) : 1; + } + + var row = bd.insertRow(index); + + for (var i = 0; i < cols; i++) + { + mxUtils.br(row.insertCell(-1)); + } + + return row.cells[0]; + }; + + /** + * Deletes the given column. + */ + Graph.prototype.deleteRow = function(table, index) + { + table.tBodies[0].deleteRow(index); + }; + + /** + * Deletes the given column. + */ + Graph.prototype.insertColumn = function(table, index) + { + var hd = table.tHead; + + if (hd != null) + { + // TODO: use colIndex + for (var h = 0; h < hd.rows.length; h++) + { + var th = document.createElement('th'); + hd.rows[h].appendChild(th); + mxUtils.br(th); + } + } + + var bd = table.tBodies[0]; + + for (var i = 0; i < bd.rows.length; i++) + { + var cell = bd.rows[i].insertCell(index); + mxUtils.br(cell); + } + + return bd.rows[0].cells[(index >= 0) ? index : bd.rows[0].cells.length - 1]; + }; + + /** + * Deletes the given column. + */ + Graph.prototype.deleteColumn = function(table, index) + { + if (index >= 0) + { + var bd = table.tBodies[0]; + var rows = bd.rows; + + for (var i = 0; i < rows.length; i++) + { + if (rows[i].cells.length > index) + { + rows[i].deleteCell(index); + } + } + } + }; + + /** + * Inserts the given HTML at the caret position (no undo). + */ + Graph.prototype.pasteHtmlAtCaret = function(html) + { + var sel, range; + + // IE9 and non-IE + if (window.getSelection) + { + sel = window.getSelection(); + + if (sel.getRangeAt && sel.rangeCount) + { + range = sel.getRangeAt(0); + range.deleteContents(); + + // Range.createContextualFragment() would be useful here but is + // only relatively recently standardized and is not supported in + // some browsers (IE9, for one) + var el = document.createElement("div"); + el.innerHTML = html; + var frag = document.createDocumentFragment(), node; + + while ((node = el.firstChild)) + { + lastNode = frag.appendChild(node); + } + + range.insertNode(frag); + } + } + // IE < 9 + else if ((sel = document.selection) && sel.type != "Control") + { + // FIXME: Does not work if selection is empty + sel.createRange().pasteHTML(html); + } + }; + + /** + * Creates an anchor elements for handling the given link in the + * hint that is shown when the cell is selected. + */ + Graph.prototype.createLinkForHint = function(link, label) + { + link = (link != null) ? link : 'javascript:void(0);'; + + if (label == null || label.length == 0) + { + if (this.isCustomLink(link)) + { + label = this.getLinkTitle(link); + } + else + { + label = link; + } + } + + // Helper function to shorten strings + function short(str, max) + { + if (str.length > max) + { + str = str.substring(0, Math.round(max / 2)) + '...' + + str.substring(str.length - Math.round(max / 4)); + } + + return str; + }; + + var a = document.createElement('a'); + a.setAttribute('rel', this.linkRelation); + a.setAttribute('href', this.getAbsoluteUrl(link)); + a.setAttribute('title', short((this.isCustomLink(link)) ? + this.getLinkTitle(link) : link, 80)); + + if (this.linkTarget != null) + { + a.setAttribute('target', this.linkTarget); + } + + // Adds shortened label to link + mxUtils.write(a, short(label, 40)); + + // Handles custom links + if (this.isCustomLink(link)) + { + mxEvent.addListener(a, 'click', mxUtils.bind(this, function(evt) + { + this.customLinkClicked(link); + mxEvent.consume(evt); + })); + } + + return a; + }; + + /** + * Customized graph for touch devices. + */ + Graph.prototype.initTouch = function() + { + // Disables new connections via "hotspot" + this.connectionHandler.marker.isEnabled = function() + { + return this.graph.connectionHandler.first != null; + }; + + // Hides menu when editing starts + this.addListener(mxEvent.START_EDITING, function(sender, evt) + { + this.popupMenuHandler.hideMenu(); + }); + + // Adds custom hit detection if native hit detection found no cell + var graphUpdateMouseEvent = this.updateMouseEvent; + this.updateMouseEvent = function(me) + { + me = graphUpdateMouseEvent.apply(this, arguments); + + if (mxEvent.isTouchEvent(me.getEvent()) && me.getState() == null) + { + var cell = this.getCellAt(me.graphX, me.graphY); + + if (cell != null && this.isSwimlane(cell) && this.hitsSwimlaneContent(cell, me.graphX, me.graphY)) + { + cell = null; + } + else + { + me.state = this.view.getState(cell); + + if (me.state != null && me.state.shape != null) + { + this.container.style.cursor = me.state.shape.node.style.cursor; + } + } + } + + if (me.getState() == null && this.isEnabled()) + { + this.container.style.cursor = 'default'; + } + + return me; + }; + + // Context menu trigger implementation depending on current selection state + // combined with support for normal popup trigger. + var cellSelected = false; + var selectionEmpty = false; + var menuShowing = false; + + var oldFireMouseEvent = this.fireMouseEvent; + + this.fireMouseEvent = function(evtName, me, sender) + { + if (evtName == mxEvent.MOUSE_DOWN) + { + // For hit detection on edges + me = this.updateMouseEvent(me); + + cellSelected = this.isCellSelected(me.getCell()); + selectionEmpty = this.isSelectionEmpty(); + menuShowing = this.popupMenuHandler.isMenuShowing(); + } + + oldFireMouseEvent.apply(this, arguments); + }; + + // Shows popup menu if cell was selected or selection was empty and background was clicked + // FIXME: Conflicts with mxPopupMenuHandler.prototype.getCellForPopupEvent in Editor.js by + // selecting parent for selected children in groups before this check can be made. + this.popupMenuHandler.mouseUp = mxUtils.bind(this, function(sender, me) + { + this.popupMenuHandler.popupTrigger = !this.isEditing() && this.isEnabled() && + (me.getState() == null || !me.isSource(me.getState().control)) && + (this.popupMenuHandler.popupTrigger || (!menuShowing && !mxEvent.isMouseEvent(me.getEvent()) && + ((selectionEmpty && me.getCell() == null && this.isSelectionEmpty()) || + (cellSelected && this.isCellSelected(me.getCell()))))); + mxPopupMenuHandler.prototype.mouseUp.apply(this.popupMenuHandler, arguments); + }); + }; + + /** + * HTML in-place editor + */ + mxCellEditor.prototype.isContentEditing = function() + { + var state = this.graph.view.getState(this.editingCell); + + return state != null && state.style['html'] == 1; + }; + + /** + * Returns true if all selected text is inside a table element. + */ + mxCellEditor.prototype.isTableSelected = function() + { + return this.graph.getParentByName( + this.graph.getSelectedElement(), + 'TABLE', this.textarea) != null; + }; + + /** + * Sets the alignment of the current selected cell. This sets the + * alignment in the cell style, removes all alignment within the + * text and invokes the built-in alignment function. + * + * Only the built-in function is invoked if shift is pressed or + * if table cells are selected and shift is not pressed. + */ + mxCellEditor.prototype.alignText = function(align, evt) + { + var shiftPressed = evt != null && mxEvent.isShiftDown(evt); + + if (shiftPressed || (window.getSelection != null && window.getSelection().containsNode != null)) + { + var allSelected = true; + + this.graph.processElements(this.textarea, function(node) + { + if (shiftPressed || window.getSelection().containsNode(node, true)) + { + node.removeAttribute('align'); + node.style.textAlign = null; + } + else + { + allSelected = false; + } + }); + + if (allSelected) + { + this.graph.cellEditor.setAlign(align); + } + } + + document.execCommand('justify' + align.toLowerCase(), false, null); + }; + + /** + * Creates the keyboard event handler for the current graph and history. + */ + mxCellEditor.prototype.saveSelection = function() + { + if (window.getSelection) + { + var sel = window.getSelection(); + + if (sel.getRangeAt && sel.rangeCount) + { + var ranges = []; + + for (var i = 0, len = sel.rangeCount; i < len; ++i) + { + ranges.push(sel.getRangeAt(i)); + } + + return ranges; + } + } + else if (document.selection && document.selection.createRange) + { + return document.selection.createRange(); + } + + return null; + }; + + /** + * Creates the keyboard event handler for the current graph and history. + */ + mxCellEditor.prototype.restoreSelection = function(savedSel) + { + try + { + if (savedSel) + { + if (window.getSelection) + { + sel = window.getSelection(); + sel.removeAllRanges(); + + for (var i = 0, len = savedSel.length; i < len; ++i) + { + sel.addRange(savedSel[i]); + } + } + else if (document.selection && savedSel.select) + { + savedSel.select(); + } + } + } + catch (e) + { + // ignore + } + }; + + /** + * Handling of special nl2Br style for not converting newlines to breaks in HTML labels. + * NOTE: Since it's easier to set this when the label is created we assume that it does + * not change during the lifetime of the mxText instance. + */ + var mxCellRendererInitializeLabel = mxCellRenderer.prototype.initializeLabel; + mxCellRenderer.prototype.initializeLabel = function(state) + { + if (state.text != null) + { + state.text.replaceLinefeeds = mxUtils.getValue(state.style, 'nl2Br', '1') != '0'; + } + + mxCellRendererInitializeLabel.apply(this, arguments); + }; + + var mxConstraintHandlerUpdate = mxConstraintHandler.prototype.update; + mxConstraintHandler.prototype.update = function(me, source) + { + if (this.isKeepFocusEvent(me) || !mxEvent.isAltDown(me.getEvent())) + { + mxConstraintHandlerUpdate.apply(this, arguments); + } + else + { + this.reset(); + } + }; + + /** + * No dashed shapes. + */ + mxGuide.prototype.createGuideShape = function(horizontal) + { + var guide = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH); + + return guide; + }; + + /** + * HTML in-place editor + */ + mxCellEditor.prototype.escapeCancelsEditing = false; + + var mxCellEditorStartEditing = mxCellEditor.prototype.startEditing; + mxCellEditor.prototype.startEditing = function(cell, trigger) + { + mxCellEditorStartEditing.apply(this, arguments); + + // Overrides class in case of HTML content to add + // dashed borders for divs and table cells + var state = this.graph.view.getState(cell); + + if (state != null && state.style['html'] == 1) + { + this.textarea.className = 'mxCellEditor geContentEditable'; + } + else + { + this.textarea.className = 'mxCellEditor mxPlainTextEditor'; + } + + // Toggles markup vs wysiwyg mode + this.codeViewMode = false; + + // Stores current selection range when switching between markup and code + this.switchSelectionState = null; + + // Selects editing cell + this.graph.setSelectionCell(cell); + + // Enables focus outline for edges and edge labels + var parent = this.graph.getModel().getParent(cell); + var geo = this.graph.getCellGeometry(cell); + + if ((this.graph.getModel().isEdge(parent) && geo != null && geo.relative) || + this.graph.getModel().isEdge(cell)) + { + // Quirks does not support outline at all so use border instead + if (mxClient.IS_QUIRKS) + { + this.textarea.style.border = 'gray dotted 1px'; + } + // IE>8 and FF on Windows uses outline default of none + else if (mxClient.IS_IE || mxClient.IS_IE11 || (mxClient.IS_FF && mxClient.IS_WIN)) + { + this.textarea.style.outline = 'gray dotted 1px'; + } + else + { + this.textarea.style.outline = ''; + } + } + else if (mxClient.IS_QUIRKS) + { + this.textarea.style.outline = 'none'; + this.textarea.style.border = ''; + } + } + + /** + * HTML in-place editor + */ + var cellEditorInstallListeners = mxCellEditor.prototype.installListeners; + mxCellEditor.prototype.installListeners = function(elt) + { + cellEditorInstallListeners.apply(this, arguments); + + // Adds a reference from the clone to the original node, recursively + function reference(node, clone) + { + clone.originalNode = node; + + node = node.firstChild; + var child = clone.firstChild; + + while (node != null && child != null) + { + reference(node, child); + node = node.nextSibling; + child = child.nextSibling; + } + + return clone; + }; + + // Checks the given node for new nodes, recursively + function checkNode(node, clone) + { + if (node != null) + { + if (clone.originalNode != node) + { + cleanNode(node); + } + else + { + node = node.firstChild; + clone = clone.firstChild; + + while (node != null) + { + var nextNode = node.nextSibling; + + if (clone == null) + { + cleanNode(node); + } + else + { + checkNode(node, clone); + clone = clone.nextSibling; + } + + node = nextNode; + } + } + } + }; + + // Removes unused DOM nodes and attributes, recursively + function cleanNode(node) + { + var child = node.firstChild; + + while (child != null) + { + var next = child.nextSibling; + cleanNode(child); + child = next; + } + + if ((node.nodeType != 1 || (node.nodeName !== 'BR' && node.firstChild == null)) && + (node.nodeType != 3 || mxUtils.trim(mxUtils.getTextContent(node)).length == 0)) + { + node.parentNode.removeChild(node); + } + else + { + // Removes linefeeds + if (node.nodeType == 3) + { + mxUtils.setTextContent(node, mxUtils.getTextContent(node).replace(/\n|\r/g, '')); + } + + // Removes CSS classes and styles (for Word and Excel) + if (node.nodeType == 1) + { + node.removeAttribute('style'); + node.removeAttribute('class'); + node.removeAttribute('width'); + node.removeAttribute('cellpadding'); + node.removeAttribute('cellspacing'); + node.removeAttribute('border'); + } + } + }; + + // Handles paste from Word, Excel etc by removing styles, classnames and unused nodes + // LATER: Fix undo/redo for paste + if (!mxClient.IS_QUIRKS && document.documentMode !== 7 && document.documentMode !== 8) + { + mxEvent.addListener(this.textarea, 'paste', mxUtils.bind(this, function(evt) + { + var clone = reference(this.textarea, this.textarea.cloneNode(true)); + + window.setTimeout(mxUtils.bind(this, function() + { + // Paste from Word or Excel + if (this.textarea != null && + (this.textarea.innerHTML.indexOf('') >= 0 || + this.textarea.innerHTML.indexOf('' + newline); + } + } + else if (node.nodeType == mxConstants.NODETYPE_TEXT) + { + var value = mxUtils.getTextContent(node); + + if (value.length > 0) + { + result.push(indent + mxUtils.htmlEntities(mxUtils.trim(value), false) + newline); + } + } + else + { + result.push(indent + '<' + node.nodeName); + + // Creates the string with the node attributes + // and converts all HTML entities in the values + var attrs = node.attributes; + + if (attrs != null) + { + for (var i = 0; i < attrs.length; i++) + { + var val = mxUtils.htmlEntities(attrs[i].value); + result.push(' ' + attrs[i].nodeName + '="' + val + '"'); + } + } + + // Recursively creates the XML string for each child + // node and appends it here with an indentation + var tmp = node.firstChild; + + if (tmp != null) + { + result.push('>' + newline); + + while (tmp != null) + { + result.push(mxUtils.getPrettyXml(tmp, tab, indent + tab, newline, ns)); + tmp = tmp.nextSibling; + } + + result.push(indent + '' + newline); + } + else + { + result.push(' />' + newline); + } + } + } + + return result.join(''); + }, + + /** + * Function: extractTextWithWhitespace + * + * Returns the text content of the specified node. + * + * Parameters: + * + * elems - DOM nodes to return the text for. + */ + extractTextWithWhitespace: function(elems) + { + // Known block elements for handling linefeeds (list is not complete) + var blocks = ['BLOCKQUOTE', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'OL', 'P', 'PRE', 'TABLE', 'UL']; + var ret = []; + + function doExtract(elts) + { + // Single break should be ignored + if (elts.length == 1 && (elts[0].nodeName == 'BR' || + elts[0].innerHTML == '\n')) + { + return; + } + + for (var i = 0; i < elts.length; i++) + { + var elem = elts[i]; + + // DIV with a br or linefeed forces a linefeed + if (elem.nodeName == 'BR' || elem.innerHTML == '\n' || + ((elts.length == 1 || i == 0) && (elem.nodeName == 'DIV' && + elem.innerHTML.toLowerCase() == '
'))) + { + ret.push('\n'); + } + else + { + if (elem.nodeType === 3 || elem.nodeType === 4) + { + if (elem.nodeValue.length > 0) + { + ret.push(elem.nodeValue); + } + } + else if (elem.nodeType !== 8 && elem.childNodes.length > 0) + { + doExtract(elem.childNodes); + } + + if (i < elts.length - 1 && mxUtils.indexOf(blocks, elts[i + 1].nodeName) >= 0) + { + ret.push('\n'); + } + } + } + }; + + doExtract(elems); + + return ret.join(''); + }, + + /** + * Function: replaceTrailingNewlines + * + * Replaces each trailing newline with the given pattern. + */ + replaceTrailingNewlines: function(str, pattern) + { + // LATER: Check is this can be done with a regular expression + var postfix = ''; + + while (str.length > 0 && str.charAt(str.length - 1) == '\n') + { + str = str.substring(0, str.length - 1); + postfix += pattern; + } + + return str + postfix; + }, + + /** + * Function: getTextContent + * + * Returns the text content of the specified node. + * + * Parameters: + * + * node - DOM node to return the text content for. + */ + getTextContent: function(node) + { + // Only IE10- + if (mxClient.IS_IE && node.innerText !== undefined) + { + return node.innerText; + } + else + { + return (node != null) ? node[(node.textContent === undefined) ? 'text' : 'textContent'] : ''; + } + }, + + /** + * Function: setTextContent + * + * Sets the text content of the specified node. + * + * Parameters: + * + * node - DOM node to set the text content for. + * text - String that represents the text content. + */ + setTextContent: function(node, text) + { + if (node.innerText !== undefined) + { + node.innerText = text; + } + else + { + node[(node.textContent === undefined) ? 'text' : 'textContent'] = text; + } + }, + + /** + * Function: getInnerHtml + * + * Returns the inner HTML for the given node as a string or an empty string + * if no node was specified. The inner HTML is the text representing all + * children of the node, but not the node itself. + * + * Parameters: + * + * node - DOM node to return the inner HTML for. + */ + getInnerHtml: function() + { + if (mxClient.IS_IE) + { + return function(node) + { + if (node != null) + { + return node.innerHTML; + } + + return ''; + }; + } + else + { + return function(node) + { + if (node != null) + { + var serializer = new XMLSerializer(); + return serializer.serializeToString(node); + } + + return ''; + }; + } + }(), + + /** + * Function: getOuterHtml + * + * Returns the outer HTML for the given node as a string or an empty + * string if no node was specified. The outer HTML is the text representing + * all children of the node including the node itself. + * + * Parameters: + * + * node - DOM node to return the outer HTML for. + */ + getOuterHtml: function() + { + if (mxClient.IS_IE) + { + return function(node) + { + if (node != null) + { + if (node.outerHTML != null) + { + return node.outerHTML; + } + else + { + var tmp = []; + tmp.push('<'+node.nodeName); + + var attrs = node.attributes; + + if (attrs != null) + { + for (var i = 0; i < attrs.length; i++) + { + var value = attrs[i].value; + + if (value != null && value.length > 0) + { + tmp.push(' '); + tmp.push(attrs[i].nodeName); + tmp.push('="'); + tmp.push(value); + tmp.push('"'); + } + } + } + + if (node.innerHTML.length == 0) + { + tmp.push('/>'); + } + else + { + tmp.push('>'); + tmp.push(node.innerHTML); + tmp.push(''); + } + + return tmp.join(''); + } + } + + return ''; + }; + } + else + { + return function(node) + { + if (node != null) + { + var serializer = new XMLSerializer(); + return serializer.serializeToString(node); + } + + return ''; + }; + } + }(), + + /** + * Function: write + * + * Creates a text node for the given string and appends it to the given + * parent. Returns the text node. + * + * Parameters: + * + * parent - DOM node to append the text node to. + * text - String representing the text to be added. + */ + write: function(parent, text) + { + var doc = parent.ownerDocument; + var node = doc.createTextNode(text); + + if (parent != null) + { + parent.appendChild(node); + } + + return node; + }, + + /** + * Function: writeln + * + * Creates a text node for the given string and appends it to the given + * parent with an additional linefeed. Returns the text node. + * + * Parameters: + * + * parent - DOM node to append the text node to. + * text - String representing the text to be added. + */ + writeln: function(parent, text) + { + var doc = parent.ownerDocument; + var node = doc.createTextNode(text); + + if (parent != null) + { + parent.appendChild(node); + parent.appendChild(document.createElement('br')); + } + + return node; + }, + + /** + * Function: br + * + * Appends a linebreak to the given parent and returns the linebreak. + * + * Parameters: + * + * parent - DOM node to append the linebreak to. + */ + br: function(parent, count) + { + count = count || 1; + var br = null; + + for (var i = 0; i < count; i++) + { + if (parent != null) + { + br = parent.ownerDocument.createElement('br'); + parent.appendChild(br); + } + } + + return br; + }, + + /** + * Function: button + * + * Returns a new button with the given level and function as an onclick + * event handler. + * + * (code) + * document.body.appendChild(mxUtils.button('Test', function(evt) + * { + * alert('Hello, World!'); + * })); + * (end) + * + * Parameters: + * + * label - String that represents the label of the button. + * funct - Function to be called if the button is pressed. + * doc - Optional document to be used for creating the button. Default is the + * current document. + */ + button: function(label, funct, doc) + { + doc = (doc != null) ? doc : document; + + var button = doc.createElement('button'); + mxUtils.write(button, label); + + mxEvent.addListener(button, 'click', function(evt) + { + funct(evt); + }); + + return button; + }, + + /** + * Function: para + * + * Appends a new paragraph with the given text to the specified parent and + * returns the paragraph. + * + * Parameters: + * + * parent - DOM node to append the text node to. + * text - String representing the text for the new paragraph. + */ + para: function(parent, text) + { + var p = document.createElement('p'); + mxUtils.write(p, text); + + if (parent != null) + { + parent.appendChild(p); + } + + return p; + }, + + /** + * Function: addTransparentBackgroundFilter + * + * Adds a transparent background to the filter of the given node. This + * background can be used in IE8 standards mode (native IE8 only) to pass + * events through the node. + */ + addTransparentBackgroundFilter: function(node) + { + node.style.filter += 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + + mxClient.imageBasePath + '/transparent.gif\', sizingMethod=\'scale\')'; + }, + + /** + * Function: linkAction + * + * Adds a hyperlink to the specified parent that invokes action on the + * specified editor. + * + * Parameters: + * + * parent - DOM node to contain the new link. + * text - String that is used as the link label. + * editor - that will execute the action. + * action - String that defines the name of the action to be executed. + * pad - Optional left-padding for the link. Default is 0. + */ + linkAction: function(parent, text, editor, action, pad) + { + return mxUtils.link(parent, text, function() + { + editor.execute(action); + }, pad); + }, + + /** + * Function: linkInvoke + * + * Adds a hyperlink to the specified parent that invokes the specified + * function on the editor passing along the specified argument. The + * function name is the name of a function of the editor instance, + * not an action name. + * + * Parameters: + * + * parent - DOM node to contain the new link. + * text - String that is used as the link label. + * editor - instance to execute the function on. + * functName - String that represents the name of the function. + * arg - Object that represents the argument to the function. + * pad - Optional left-padding for the link. Default is 0. + */ + linkInvoke: function(parent, text, editor, functName, arg, pad) + { + return mxUtils.link(parent, text, function() + { + editor[functName](arg); + }, pad); + }, + + /** + * Function: link + * + * Adds a hyperlink to the specified parent and invokes the given function + * when the link is clicked. + * + * Parameters: + * + * parent - DOM node to contain the new link. + * text - String that is used as the link label. + * funct - Function to execute when the link is clicked. + * pad - Optional left-padding for the link. Default is 0. + */ + link: function(parent, text, funct, pad) + { + var a = document.createElement('span'); + + a.style.color = 'blue'; + a.style.textDecoration = 'underline'; + a.style.cursor = 'pointer'; + + if (pad != null) + { + a.style.paddingLeft = pad+'px'; + } + + mxEvent.addListener(a, 'click', funct); + mxUtils.write(a, text); + + if (parent != null) + { + parent.appendChild(a); + } + + return a; + }, + + /** + * Function: getDocumentSize + * + * Returns the client size for the current document as an . + */ + getDocumentSize: function() + { + var b = document.body; + var d = document.documentElement; + + try + { + return new mxRectangle(0, 0, b.clientWidth || d.clientWidth, Math.max(b.clientHeight || 0, d.clientHeight)); + } + catch (e) + { + return new mxRectangle(); + } + }, + + /** + * Function: fit + * + * Makes sure the given node is inside the visible area of the window. This + * is done by setting the left and top in the style. + */ + fit: function(node) + { + var ds = mxUtils.getDocumentSize(); + var left = parseInt(node.offsetLeft); + var width = parseInt(node.offsetWidth); + + var offset = mxUtils.getDocumentScrollOrigin(node.ownerDocument); + var sl = offset.x; + var st = offset.y; + + var b = document.body; + var d = document.documentElement; + var right = (sl) + ds.width; + + if (left + width > right) + { + node.style.left = Math.max(sl, right - width) + 'px'; + } + + var top = parseInt(node.offsetTop); + var height = parseInt(node.offsetHeight); + + var bottom = st + ds.height; + + if (top + height > bottom) + { + node.style.top = Math.max(st, bottom - height) + 'px'; + } + }, + + /** + * Function: load + * + * Loads the specified URL *synchronously* and returns the . + * Throws an exception if the file cannot be loaded. See for + * an asynchronous implementation. + * + * Example: + * + * (code) + * try + * { + * var req = mxUtils.load(filename); + * var root = req.getDocumentElement(); + * // Process XML DOM... + * } + * catch (ex) + * { + * mxUtils.alert('Cannot load '+filename+': '+ex); + * } + * (end) + * + * Parameters: + * + * url - URL to get the data from. + */ + load: function(url) + { + var req = new mxXmlRequest(url, null, 'GET', false); + req.send(); + + return req; + }, + + /** + * Function: get + * + * Loads the specified URL *asynchronously* and invokes the given functions + * depending on the request status. Returns the in use. Both + * functions take the as the only parameter. See + * for a synchronous implementation. + * + * Example: + * + * (code) + * mxUtils.get(url, function(req) + * { + * var node = req.getDocumentElement(); + * // Process XML DOM... + * }); + * (end) + * + * So for example, to load a diagram into an existing graph model, the + * following code is used. + * + * (code) + * mxUtils.get(url, function(req) + * { + * var node = req.getDocumentElement(); + * var dec = new mxCodec(node.ownerDocument); + * dec.decode(node, graph.getModel()); + * }); + * (end) + * + * Parameters: + * + * url - URL to get the data from. + * onload - Optional function to execute for a successful response. + * onerror - Optional function to execute on error. + * binary - Optional boolean parameter that specifies if the request is + * binary. + * timeout - Optional timeout in ms before calling ontimeout. + * ontimeout - Optional function to execute on timeout. + * headers - Optional with headers, eg. {'Authorization': 'token xyz'} + */ + get: function(url, onload, onerror, binary, timeout, ontimeout, headers) + { + var req = new mxXmlRequest(url, null, 'GET'); + var setRequestHeaders = req.setRequestHeaders; + + if (headers) + { + req.setRequestHeaders = function(request, params) + { + setRequestHeaders.apply(this, arguments); + + for (var key in headers) + { + request.setRequestHeader(key, headers[key]); + } + }; + } + + if (binary != null) + { + req.setBinary(binary); + } + + req.send(onload, onerror, timeout, ontimeout); + + return req; + }, + + /** + * Function: getAll + * + * Loads the URLs in the given array *asynchronously* and invokes the given function + * if all requests returned with a valid 2xx status. The error handler is invoked + * once on the first error or invalid response. + * + * Parameters: + * + * urls - Array of URLs to be loaded. + * onload - Callback with array of . + * onerror - Optional function to execute on error. + */ + getAll: function(urls, onload, onerror) + { + var remain = urls.length; + var result = []; + var errors = 0; + var err = function() + { + if (errors == 0 && onerror != null) + { + onerror(); + } + + errors++; + }; + + for (var i = 0; i < urls.length; i++) + { + (function(url, index) + { + mxUtils.get(url, function(req) + { + var status = req.getStatus(); + + if (status < 200 || status > 299) + { + err(); + } + else + { + result[index] = req; + remain--; + + if (remain == 0) + { + onload(result); + } + } + }, err); + })(urls[i], i); + } + + if (remain == 0) + { + onload(result); + } + }, + + /** + * Function: post + * + * Posts the specified params to the given URL *asynchronously* and invokes + * the given functions depending on the request status. Returns the + * in use. Both functions take the as the + * only parameter. Make sure to use encodeURIComponent for the parameter + * values. + * + * Example: + * + * (code) + * mxUtils.post(url, 'key=value', function(req) + * { + * mxUtils.alert('Ready: '+req.isReady()+' Status: '+req.getStatus()); + * // Process req.getDocumentElement() using DOM API if OK... + * }); + * (end) + * + * Parameters: + * + * url - URL to get the data from. + * params - Parameters for the post request. + * onload - Optional function to execute for a successful response. + * onerror - Optional function to execute on error. + */ + post: function(url, params, onload, onerror) + { + return new mxXmlRequest(url, params).send(onload, onerror); + }, + + /** + * Function: submit + * + * Submits the given parameters to the specified URL using + * and returns the . + * Make sure to use encodeURIComponent for the parameter + * values. + * + * Parameters: + * + * url - URL to get the data from. + * params - Parameters for the form. + * doc - Document to create the form in. + * target - Target to send the form result to. + */ + submit: function(url, params, doc, target) + { + return new mxXmlRequest(url, params).simulate(doc, target); + }, + + /** + * Function: loadInto + * + * Loads the specified URL *asynchronously* into the specified document, + * invoking onload after the document has been loaded. This implementation + * does not use , but the document.load method. + * + * Parameters: + * + * url - URL to get the data from. + * doc - The document to load the URL into. + * onload - Function to execute when the URL has been loaded. + */ + loadInto: function(url, doc, onload) + { + if (mxClient.IS_IE) + { + doc.onreadystatechange = function () + { + if (doc.readyState == 4) + { + onload(); + } + }; + } + else + { + doc.addEventListener('load', onload, false); + } + + doc.load(url); + }, + + /** + * Function: getValue + * + * Returns the value for the given key in the given associative array or + * the given default value if the value is null. + * + * Parameters: + * + * array - Associative array that contains the value for the key. + * key - Key whose value should be returned. + * defaultValue - Value to be returned if the value for the given + * key is null. + */ + getValue: function(array, key, defaultValue) + { + var value = (array != null) ? array[key] : null; + + if (value == null) + { + value = defaultValue; + } + + return value; + }, + + /** + * Function: getNumber + * + * Returns the numeric value for the given key in the given associative + * array or the given default value (or 0) if the value is null. The value + * is converted to a numeric value using the Number function. + * + * Parameters: + * + * array - Associative array that contains the value for the key. + * key - Key whose value should be returned. + * defaultValue - Value to be returned if the value for the given + * key is null. Default is 0. + */ + getNumber: function(array, key, defaultValue) + { + var value = (array != null) ? array[key] : null; + + if (value == null) + { + value = defaultValue || 0; + } + + return Number(value); + }, + + /** + * Function: getColor + * + * Returns the color value for the given key in the given associative + * array or the given default value if the value is null. If the value + * is then null is returned. + * + * Parameters: + * + * array - Associative array that contains the value for the key. + * key - Key whose value should be returned. + * defaultValue - Value to be returned if the value for the given + * key is null. Default is null. + */ + getColor: function(array, key, defaultValue) + { + var value = (array != null) ? array[key] : null; + + if (value == null) + { + value = defaultValue; + } + else if (value == mxConstants.NONE) + { + value = null; + } + + return value; + }, + + /** + * Function: clone + * + * Recursively clones the specified object ignoring all fieldnames in the + * given array of transient fields. is always + * ignored by this function. + * + * Parameters: + * + * obj - Object to be cloned. + * transients - Optional array of strings representing the fieldname to be + * ignored. + * shallow - Optional boolean argument to specify if a shallow clone should + * be created, that is, one where all object references are not cloned or, + * in other words, one where only atomic (strings, numbers) values are + * cloned. Default is false. + */ + clone: function(obj, transients, shallow) + { + shallow = (shallow != null) ? shallow : false; + var clone = null; + + if (obj != null && typeof(obj.constructor) == 'function') + { + clone = new obj.constructor(); + + for (var i in obj) + { + if (i != mxObjectIdentity.FIELD_NAME && (transients == null || + mxUtils.indexOf(transients, i) < 0)) + { + if (!shallow && typeof(obj[i]) == 'object') + { + clone[i] = mxUtils.clone(obj[i]); + } + else + { + clone[i] = obj[i]; + } + } + } + } + + return clone; + }, + + /** + * Function: equalPoints + * + * Compares all mxPoints in the given lists. + * + * Parameters: + * + * a - Array of to be compared. + * b - Array of to be compared. + */ + equalPoints: function(a, b) + { + if ((a == null && b != null) || (a != null && b == null) || + (a != null && b != null && a.length != b.length)) + { + return false; + } + else if (a != null && b != null) + { + for (var i = 0; i < a.length; i++) + { + if ((a[i] != null && b[i] == null) || + (a[i] == null && b[i] != null) || + (a[i] != null && b[i] != null && + (a[i].x != b[i].x || a[i].y != b[i].y))) + { + return false; + } + } + } + + return true; + }, + + /** + * Function: equalEntries + * + * Returns true if all properties of the given objects are equal. Values + * with NaN are equal to NaN and unequal to any other value. + * + * Parameters: + * + * a - First object to be compared. + * b - Second object to be compared. + */ + equalEntries: function(a, b) + { + // Counts keys in b to check if all values have been compared + var count = 0; + + if ((a == null && b != null) || (a != null && b == null) || + (a != null && b != null && a.length != b.length)) + { + return false; + } + else if (a != null && b != null) + { + for (var key in b) + { + count++; + } + + for (var key in a) + { + count-- + + if ((!mxUtils.isNaN(a[key]) || !mxUtils.isNaN(b[key])) && a[key] != b[key]) + { + return false; + } + } + } + + return count == 0; + }, + + /** + * Function: removeDuplicates + * + * Removes all duplicates from the given array. + */ + removeDuplicates: function(arr) + { + var dict = new mxDictionary(); + var result = []; + + for (var i = 0; i < arr.length; i++) + { + if (!dict.get(arr[i])) + { + result.push(arr[i]); + dict.put(arr[i], true); + } + } + + return result; + }, + + /** + * Function: isNaN + * + * Returns true if the given value is of type number and isNaN returns true. + */ + isNaN: function(value) + { + return typeof(value) == 'number' && isNaN(value); + }, + + /** + * Function: extend + * + * Assigns a copy of the superclass prototype to the subclass prototype. + * Note that this does not call the constructor of the superclass at this + * point, the superclass constructor should be called explicitely in the + * subclass constructor. Below is an example. + * + * (code) + * MyGraph = function(container, model, renderHint, stylesheet) + * { + * mxGraph.call(this, container, model, renderHint, stylesheet); + * } + * + * mxUtils.extend(MyGraph, mxGraph); + * (end) + * + * Parameters: + * + * ctor - Constructor of the subclass. + * superCtor - Constructor of the superclass. + */ + extend: function(ctor, superCtor) + { + var f = function() {}; + f.prototype = superCtor.prototype; + + ctor.prototype = new f(); + ctor.prototype.constructor = ctor; + }, + + /** + * Function: toString + * + * Returns a textual representation of the specified object. + * + * Parameters: + * + * obj - Object to return the string representation for. + */ + toString: function(obj) + { + var output = ''; + + for (var i in obj) + { + try + { + if (obj[i] == null) + { + output += i + ' = [null]\n'; + } + else if (typeof(obj[i]) == 'function') + { + output += i + ' => [Function]\n'; + } + else if (typeof(obj[i]) == 'object') + { + var ctor = mxUtils.getFunctionName(obj[i].constructor); + output += i + ' => [' + ctor + ']\n'; + } + else + { + output += i + ' = ' + obj[i] + '\n'; + } + } + catch (e) + { + output += i + '=' + e.message; + } + } + + return output; + }, + + /** + * Function: toRadians + * + * Converts the given degree to radians. + */ + toRadians: function(deg) + { + return Math.PI * deg / 180; + }, + + /** + * Function: toDegree + * + * Converts the given radians to degree. + */ + toDegree: function(rad) + { + return rad * 180 / Math.PI; + }, + + /** + * Function: arcToCurves + * + * Converts the given arc to a series of curves. + */ + arcToCurves: function(x0, y0, r1, r2, angle, largeArcFlag, sweepFlag, x, y) + { + x -= x0; + y -= y0; + + if (r1 === 0 || r2 === 0) + { + return result; + } + + var fS = sweepFlag; + var psai = angle; + r1 = Math.abs(r1); + r2 = Math.abs(r2); + var ctx = -x / 2; + var cty = -y / 2; + var cpsi = Math.cos(psai * Math.PI / 180); + var spsi = Math.sin(psai * Math.PI / 180); + var rxd = cpsi * ctx + spsi * cty; + var ryd = -1 * spsi * ctx + cpsi * cty; + var rxdd = rxd * rxd; + var rydd = ryd * ryd; + var r1x = r1 * r1; + var r2y = r2 * r2; + var lamda = rxdd / r1x + rydd / r2y; + var sds; + + if (lamda > 1) + { + r1 = Math.sqrt(lamda) * r1; + r2 = Math.sqrt(lamda) * r2; + sds = 0; + } + else + { + var seif = 1; + + if (largeArcFlag === fS) + { + seif = -1; + } + + sds = seif * Math.sqrt((r1x * r2y - r1x * rydd - r2y * rxdd) / (r1x * rydd + r2y * rxdd)); + } + + var txd = sds * r1 * ryd / r2; + var tyd = -1 * sds * r2 * rxd / r1; + var tx = cpsi * txd - spsi * tyd + x / 2; + var ty = spsi * txd + cpsi * tyd + y / 2; + var rad = Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1) - Math.atan2(0, 1); + var s1 = (rad >= 0) ? rad : 2 * Math.PI + rad; + rad = Math.atan2((-ryd - tyd) / r2, (-rxd - txd) / r1) - Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1); + var dr = (rad >= 0) ? rad : 2 * Math.PI + rad; + + if (fS == 0 && dr > 0) + { + dr -= 2 * Math.PI; + } + else if (fS != 0 && dr < 0) + { + dr += 2 * Math.PI; + } + + var sse = dr * 2 / Math.PI; + var seg = Math.ceil(sse < 0 ? -1 * sse : sse); + var segr = dr / seg; + var t = 8/3 * Math.sin(segr / 4) * Math.sin(segr / 4) / Math.sin(segr / 2); + var cpsir1 = cpsi * r1; + var cpsir2 = cpsi * r2; + var spsir1 = spsi * r1; + var spsir2 = spsi * r2; + var mc = Math.cos(s1); + var ms = Math.sin(s1); + var x2 = -t * (cpsir1 * ms + spsir2 * mc); + var y2 = -t * (spsir1 * ms - cpsir2 * mc); + var x3 = 0; + var y3 = 0; + + var result = []; + + for (var n = 0; n < seg; ++n) + { + s1 += segr; + mc = Math.cos(s1); + ms = Math.sin(s1); + + x3 = cpsir1 * mc - spsir2 * ms + tx; + y3 = spsir1 * mc + cpsir2 * ms + ty; + var dx = -t * (cpsir1 * ms + spsir2 * mc); + var dy = -t * (spsir1 * ms - cpsir2 * mc); + + // CurveTo updates x0, y0 so need to restore it + var index = n * 6; + result[index] = Number(x2 + x0); + result[index + 1] = Number(y2 + y0); + result[index + 2] = Number(x3 - dx + x0); + result[index + 3] = Number(y3 - dy + y0); + result[index + 4] = Number(x3 + x0); + result[index + 5] = Number(y3 + y0); + + x2 = x3 + dx; + y2 = y3 + dy; + } + + return result; + }, + + /** + * Function: getBoundingBox + * + * Returns the bounding box for the rotated rectangle. + * + * Parameters: + * + * rect - to be rotated. + * angle - Number that represents the angle (in degrees). + * cx - Optional that represents the rotation center. If no + * rotation center is given then the center of rect is used. + */ + getBoundingBox: function(rect, rotation, cx) + { + var result = null; + + if (rect != null && rotation != null && rotation != 0) + { + var rad = mxUtils.toRadians(rotation); + var cos = Math.cos(rad); + var sin = Math.sin(rad); + + cx = (cx != null) ? cx : new mxPoint(rect.x + rect.width / 2, rect.y + rect.height / 2); + + var p1 = new mxPoint(rect.x, rect.y); + var p2 = new mxPoint(rect.x + rect.width, rect.y); + var p3 = new mxPoint(p2.x, rect.y + rect.height); + var p4 = new mxPoint(rect.x, p3.y); + + p1 = mxUtils.getRotatedPoint(p1, cos, sin, cx); + p2 = mxUtils.getRotatedPoint(p2, cos, sin, cx); + p3 = mxUtils.getRotatedPoint(p3, cos, sin, cx); + p4 = mxUtils.getRotatedPoint(p4, cos, sin, cx); + + result = new mxRectangle(p1.x, p1.y, 0, 0); + result.add(new mxRectangle(p2.x, p2.y, 0, 0)); + result.add(new mxRectangle(p3.x, p3.y, 0, 0)); + result.add(new mxRectangle(p4.x, p4.y, 0, 0)); + } + + return result; + }, + + /** + * Function: getRotatedPoint + * + * Rotates the given point by the given cos and sin. + */ + getRotatedPoint: function(pt, cos, sin, c) + { + c = (c != null) ? c : new mxPoint(); + var x = pt.x - c.x; + var y = pt.y - c.y; + + var x1 = x * cos - y * sin; + var y1 = y * cos + x * sin; + + return new mxPoint(x1 + c.x, y1 + c.y); + }, + + /** + * Returns an integer mask of the port constraints of the given map + * @param dict the style map to determine the port constraints for + * @param defaultValue Default value to return if the key is undefined. + * @return the mask of port constraint directions + * + * Parameters: + * + * terminal - that represents the terminal. + * edge - that represents the edge. + * source - Boolean that specifies if the terminal is the source terminal. + * defaultValue - Default value to be returned. + */ + getPortConstraints: function(terminal, edge, source, defaultValue) + { + var value = mxUtils.getValue(terminal.style, mxConstants.STYLE_PORT_CONSTRAINT, + mxUtils.getValue(edge.style, (source) ? mxConstants.STYLE_SOURCE_PORT_CONSTRAINT : + mxConstants.STYLE_TARGET_PORT_CONSTRAINT, null)); + + if (value == null) + { + return defaultValue; + } + else + { + var directions = value.toString(); + var returnValue = mxConstants.DIRECTION_MASK_NONE; + var constraintRotationEnabled = mxUtils.getValue(terminal.style, mxConstants.STYLE_PORT_CONSTRAINT_ROTATION, 0); + var rotation = 0; + + if (constraintRotationEnabled == 1) + { + rotation = mxUtils.getValue(terminal.style, mxConstants.STYLE_ROTATION, 0); + } + + var quad = 0; + + if (rotation > 45) + { + quad = 1; + + if (rotation >= 135) + { + quad = 2; + } + } + else if (rotation < -45) + { + quad = 3; + + if (rotation <= -135) + { + quad = 2; + } + } + + if (directions.indexOf(mxConstants.DIRECTION_NORTH) >= 0) + { + switch (quad) + { + case 0: + returnValue |= mxConstants.DIRECTION_MASK_NORTH; + break; + case 1: + returnValue |= mxConstants.DIRECTION_MASK_EAST; + break; + case 2: + returnValue |= mxConstants.DIRECTION_MASK_SOUTH; + break; + case 3: + returnValue |= mxConstants.DIRECTION_MASK_WEST; + break; + } + } + if (directions.indexOf(mxConstants.DIRECTION_WEST) >= 0) + { + switch (quad) + { + case 0: + returnValue |= mxConstants.DIRECTION_MASK_WEST; + break; + case 1: + returnValue |= mxConstants.DIRECTION_MASK_NORTH; + break; + case 2: + returnValue |= mxConstants.DIRECTION_MASK_EAST; + break; + case 3: + returnValue |= mxConstants.DIRECTION_MASK_SOUTH; + break; + } + } + if (directions.indexOf(mxConstants.DIRECTION_SOUTH) >= 0) + { + switch (quad) + { + case 0: + returnValue |= mxConstants.DIRECTION_MASK_SOUTH; + break; + case 1: + returnValue |= mxConstants.DIRECTION_MASK_WEST; + break; + case 2: + returnValue |= mxConstants.DIRECTION_MASK_NORTH; + break; + case 3: + returnValue |= mxConstants.DIRECTION_MASK_EAST; + break; + } + } + if (directions.indexOf(mxConstants.DIRECTION_EAST) >= 0) + { + switch (quad) + { + case 0: + returnValue |= mxConstants.DIRECTION_MASK_EAST; + break; + case 1: + returnValue |= mxConstants.DIRECTION_MASK_SOUTH; + break; + case 2: + returnValue |= mxConstants.DIRECTION_MASK_WEST; + break; + case 3: + returnValue |= mxConstants.DIRECTION_MASK_NORTH; + break; + } + } + + return returnValue; + } + }, + + /** + * Function: reversePortConstraints + * + * Reverse the port constraint bitmask. For example, north | east + * becomes south | west + */ + reversePortConstraints: function(constraint) + { + var result = 0; + + result = (constraint & mxConstants.DIRECTION_MASK_WEST) << 3; + result |= (constraint & mxConstants.DIRECTION_MASK_NORTH) << 1; + result |= (constraint & mxConstants.DIRECTION_MASK_SOUTH) >> 1; + result |= (constraint & mxConstants.DIRECTION_MASK_EAST) >> 3; + + return result; + }, + + /** + * Function: findNearestSegment + * + * Finds the index of the nearest segment on the given cell state for + * the specified coordinate pair. + */ + findNearestSegment: function(state, x, y) + { + var index = -1; + + if (state.absolutePoints.length > 0) + { + var last = state.absolutePoints[0]; + var min = null; + + for (var i = 1; i < state.absolutePoints.length; i++) + { + var current = state.absolutePoints[i]; + var dist = mxUtils.ptSegDistSq(last.x, last.y, + current.x, current.y, x, y); + + if (min == null || dist < min) + { + min = dist; + index = i - 1; + } + + last = current; + } + } + + return index; + }, + + /** + * Function: getDirectedBounds + * + * Adds the given margins to the given rectangle and rotates and flips the + * rectangle according to the respective styles in style. + */ + getDirectedBounds: function (rect, m, style, flipH, flipV) + { + var d = mxUtils.getValue(style, mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_EAST); + flipH = (flipH != null) ? flipH : mxUtils.getValue(style, mxConstants.STYLE_FLIPH, false); + flipV = (flipV != null) ? flipV : mxUtils.getValue(style, mxConstants.STYLE_FLIPV, false); + + m.x = Math.round(Math.max(0, Math.min(rect.width, m.x))); + m.y = Math.round(Math.max(0, Math.min(rect.height, m.y))); + m.width = Math.round(Math.max(0, Math.min(rect.width, m.width))); + m.height = Math.round(Math.max(0, Math.min(rect.height, m.height))); + + if ((flipV && (d == mxConstants.DIRECTION_SOUTH || d == mxConstants.DIRECTION_NORTH)) || + (flipH && (d == mxConstants.DIRECTION_EAST || d == mxConstants.DIRECTION_WEST))) + { + var tmp = m.x; + m.x = m.width; + m.width = tmp; + } + + if ((flipH && (d == mxConstants.DIRECTION_SOUTH || d == mxConstants.DIRECTION_NORTH)) || + (flipV && (d == mxConstants.DIRECTION_EAST || d == mxConstants.DIRECTION_WEST))) + { + var tmp = m.y; + m.y = m.height; + m.height = tmp; + } + + var m2 = mxRectangle.fromRectangle(m); + + if (d == mxConstants.DIRECTION_SOUTH) + { + m2.y = m.x; + m2.x = m.height; + m2.width = m.y; + m2.height = m.width; + } + else if (d == mxConstants.DIRECTION_WEST) + { + m2.y = m.height; + m2.x = m.width; + m2.width = m.x; + m2.height = m.y; + } + else if (d == mxConstants.DIRECTION_NORTH) + { + m2.y = m.width; + m2.x = m.y; + m2.width = m.height; + m2.height = m.x; + } + + return new mxRectangle(rect.x + m2.x, rect.y + m2.y, rect.width - m2.width - m2.x, rect.height - m2.height - m2.y); + }, + + /** + * Function: getPerimeterPoint + * + * Returns the intersection between the polygon defined by the array of + * points and the line between center and point. + */ + getPerimeterPoint: function (pts, center, point) + { + var min = null; + + for (var i = 0; i < pts.length - 1; i++) + { + var pt = mxUtils.intersection(pts[i].x, pts[i].y, pts[i + 1].x, pts[i + 1].y, + center.x, center.y, point.x, point.y); + + if (pt != null) + { + var dx = point.x - pt.x; + var dy = point.y - pt.y; + var ip = {p: pt, distSq: dy * dy + dx * dx}; + + if (ip != null && (min == null || min.distSq > ip.distSq)) + { + min = ip; + } + } + } + + return (min != null) ? min.p : null; + }, + + /** + * Function: rectangleIntersectsSegment + * + * Returns true if the given rectangle intersects the given segment. + * + * Parameters: + * + * bounds - that represents the rectangle. + * p1 - that represents the first point of the segment. + * p2 - that represents the second point of the segment. + */ + rectangleIntersectsSegment: function(bounds, p1, p2) + { + var top = bounds.y; + var left = bounds.x; + var bottom = top + bounds.height; + var right = left + bounds.width; + + // Find min and max X for the segment + var minX = p1.x; + var maxX = p2.x; + + if (p1.x > p2.x) + { + minX = p2.x; + maxX = p1.x; + } + + // Find the intersection of the segment's and rectangle's x-projections + if (maxX > right) + { + maxX = right; + } + + if (minX < left) + { + minX = left; + } + + if (minX > maxX) // If their projections do not intersect return false + { + return false; + } + + // Find corresponding min and max Y for min and max X we found before + var minY = p1.y; + var maxY = p2.y; + var dx = p2.x - p1.x; + + if (Math.abs(dx) > 0.0000001) + { + var a = (p2.y - p1.y) / dx; + var b = p1.y - a * p1.x; + minY = a * minX + b; + maxY = a * maxX + b; + } + + if (minY > maxY) + { + var tmp = maxY; + maxY = minY; + minY = tmp; + } + + // Find the intersection of the segment's and rectangle's y-projections + if (maxY > bottom) + { + maxY = bottom; + } + + if (minY < top) + { + minY = top; + } + + if (minY > maxY) // If Y-projections do not intersect return false + { + return false; + } + + return true; + }, + + /** + * Function: contains + * + * Returns true if the specified point (x, y) is contained in the given rectangle. + * + * Parameters: + * + * bounds - that represents the area. + * x - X-coordinate of the point. + * y - Y-coordinate of the point. + */ + contains: function(bounds, x, y) + { + return (bounds.x <= x && bounds.x + bounds.width >= x && + bounds.y <= y && bounds.y + bounds.height >= y); + }, + + /** + * Function: intersects + * + * Returns true if the two rectangles intersect. + * + * Parameters: + * + * a - to be checked for intersection. + * b - to be checked for intersection. + */ + intersects: function(a, b) + { + var tw = a.width; + var th = a.height; + var rw = b.width; + var rh = b.height; + + if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) + { + return false; + } + + var tx = a.x; + var ty = a.y; + var rx = b.x; + var ry = b.y; + + rw += rx; + rh += ry; + tw += tx; + th += ty; + + return ((rw < rx || rw > tx) && + (rh < ry || rh > ty) && + (tw < tx || tw > rx) && + (th < ty || th > ry)); + }, + + /** + * Function: intersects + * + * Returns true if the two rectangles intersect. + * + * Parameters: + * + * a - to be checked for intersection. + * b - to be checked for intersection. + */ + intersectsHotspot: function(state, x, y, hotspot, min, max) + { + hotspot = (hotspot != null) ? hotspot : 1; + min = (min != null) ? min : 0; + max = (max != null) ? max : 0; + + if (hotspot > 0) + { + var cx = state.getCenterX(); + var cy = state.getCenterY(); + var w = state.width; + var h = state.height; + + var start = mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE) * state.view.scale; + + if (start > 0) + { + if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, true)) + { + cy = state.y + start / 2; + h = start; + } + else + { + cx = state.x + start / 2; + w = start; + } + } + + w = Math.max(min, w * hotspot); + h = Math.max(min, h * hotspot); + + if (max > 0) + { + w = Math.min(w, max); + h = Math.min(h, max); + } + + var rect = new mxRectangle(cx - w / 2, cy - h / 2, w, h); + var alpha = mxUtils.toRadians(mxUtils.getValue(state.style, mxConstants.STYLE_ROTATION) || 0); + + if (alpha != 0) + { + var cos = Math.cos(-alpha); + var sin = Math.sin(-alpha); + var cx = new mxPoint(state.getCenterX(), state.getCenterY()); + var pt = mxUtils.getRotatedPoint(new mxPoint(x, y), cos, sin, cx); + x = pt.x; + y = pt.y; + } + + return mxUtils.contains(rect, x, y); + } + + return true; + }, + + /** + * Function: getOffset + * + * Returns the offset for the specified container as an . The + * offset is the distance from the top left corner of the container to the + * top left corner of the document. + * + * Parameters: + * + * container - DOM node to return the offset for. + * scollOffset - Optional boolean to add the scroll offset of the document. + * Default is false. + */ + getOffset: function(container, scrollOffset) + { + var offsetLeft = 0; + var offsetTop = 0; + + // Ignores document scroll origin for fixed elements + var fixed = false; + var node = container; + var b = document.body; + var d = document.documentElement; + + while (node != null && node != b && node != d && !fixed) + { + var style = mxUtils.getCurrentStyle(node); + + if (style != null) + { + fixed = fixed || style.position == 'fixed'; + } + + node = node.parentNode; + } + + if (!scrollOffset && !fixed) + { + var offset = mxUtils.getDocumentScrollOrigin(container.ownerDocument); + offsetLeft += offset.x; + offsetTop += offset.y; + } + + var r = container.getBoundingClientRect(); + + if (r != null) + { + offsetLeft += r.left; + offsetTop += r.top; + } + + return new mxPoint(offsetLeft, offsetTop); + }, + + /** + * Function: getDocumentScrollOrigin + * + * Returns the scroll origin of the given document or the current document + * if no document is given. + */ + getDocumentScrollOrigin: function(doc) + { + if (mxClient.IS_QUIRKS) + { + return new mxPoint(doc.body.scrollLeft, doc.body.scrollTop); + } + else + { + var wnd = doc.defaultView || doc.parentWindow; + + var x = (wnd != null && window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft; + var y = (wnd != null && window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop; + + return new mxPoint(x, y); + } + }, + + /** + * Function: getScrollOrigin + * + * Returns the top, left corner of the viewrect as an . + * + * Parameters: + * + * node - DOM node whose scroll origin should be returned. + * includeAncestors - Whether the scroll origin of the ancestors should be + * included. Default is false. + * includeDocument - Whether the scroll origin of the document should be + * included. Default is true. + */ + getScrollOrigin: function(node, includeAncestors, includeDocument) + { + includeAncestors = (includeAncestors != null) ? includeAncestors : false; + includeDocument = (includeDocument != null) ? includeDocument : true; + + var doc = (node != null) ? node.ownerDocument : document; + var b = doc.body; + var d = doc.documentElement; + var result = new mxPoint(); + var fixed = false; + + while (node != null && node != b && node != d) + { + if (!isNaN(node.scrollLeft) && !isNaN(node.scrollTop)) + { + result.x += node.scrollLeft; + result.y += node.scrollTop; + } + + var style = mxUtils.getCurrentStyle(node); + + if (style != null) + { + fixed = fixed || style.position == 'fixed'; + } + + node = (includeAncestors) ? node.parentNode : null; + } + + if (!fixed && includeDocument) + { + var origin = mxUtils.getDocumentScrollOrigin(doc); + + result.x += origin.x; + result.y += origin.y; + } + + return result; + }, + + /** + * Function: convertPoint + * + * Converts the specified point (x, y) using the offset of the specified + * container and returns a new with the result. + * + * (code) + * var pt = mxUtils.convertPoint(graph.container, + * mxEvent.getClientX(evt), mxEvent.getClientY(evt)); + * (end) + * + * Parameters: + * + * container - DOM node to use for the offset. + * x - X-coordinate of the point to be converted. + * y - Y-coordinate of the point to be converted. + */ + convertPoint: function(container, x, y) + { + var origin = mxUtils.getScrollOrigin(container, false); + var offset = mxUtils.getOffset(container); + + offset.x -= origin.x; + offset.y -= origin.y; + + return new mxPoint(x - offset.x, y - offset.y); + }, + + /** + * Function: ltrim + * + * Strips all whitespaces from the beginning of the string. Without the + * second parameter, this will trim these characters: + * + * - " " (ASCII 32 (0x20)), an ordinary space + * - "\t" (ASCII 9 (0x09)), a tab + * - "\n" (ASCII 10 (0x0A)), a new line (line feed) + * - "\r" (ASCII 13 (0x0D)), a carriage return + * - "\0" (ASCII 0 (0x00)), the NUL-byte + * - "\x0B" (ASCII 11 (0x0B)), a vertical tab + */ + ltrim: function(str, chars) + { + chars = chars || "\\s"; + + return (str != null) ? str.replace(new RegExp("^[" + chars + "]+", "g"), "") : null; + }, + + /** + * Function: rtrim + * + * Strips all whitespaces from the end of the string. Without the second + * parameter, this will trim these characters: + * + * - " " (ASCII 32 (0x20)), an ordinary space + * - "\t" (ASCII 9 (0x09)), a tab + * - "\n" (ASCII 10 (0x0A)), a new line (line feed) + * - "\r" (ASCII 13 (0x0D)), a carriage return + * - "\0" (ASCII 0 (0x00)), the NUL-byte + * - "\x0B" (ASCII 11 (0x0B)), a vertical tab + */ + rtrim: function(str, chars) + { + chars = chars || "\\s"; + + return (str != null) ? str.replace(new RegExp("[" + chars + "]+$", "g"), "") : null; + }, + + /** + * Function: trim + * + * Strips all whitespaces from both end of the string. + * Without the second parameter, Javascript function will trim these + * characters: + * + * - " " (ASCII 32 (0x20)), an ordinary space + * - "\t" (ASCII 9 (0x09)), a tab + * - "\n" (ASCII 10 (0x0A)), a new line (line feed) + * - "\r" (ASCII 13 (0x0D)), a carriage return + * - "\0" (ASCII 0 (0x00)), the NUL-byte + * - "\x0B" (ASCII 11 (0x0B)), a vertical tab + */ + trim: function(str, chars) + { + return mxUtils.ltrim(mxUtils.rtrim(str, chars), chars); + }, + + /** + * Function: isNumeric + * + * Returns true if the specified value is numeric, that is, if it is not + * null, not an empty string, not a HEX number and isNaN returns false. + * + * Parameters: + * + * n - String representing the possibly numeric value. + */ + isNumeric: function(n) + { + return !isNaN(parseFloat(n)) && isFinite(n) && (typeof(n) != 'string' || n.toLowerCase().indexOf('0x') < 0); + }, + + /** + * Function: isInteger + * + * Returns true if the given value is an valid integer number. + * + * Parameters: + * + * n - String representing the possibly numeric value. + */ + isInteger: function(n) + { + return String(parseInt(n)) === String(n); + }, + + /** + * Function: mod + * + * Returns the remainder of division of n by m. You should use this instead + * of the built-in operation as the built-in operation does not properly + * handle negative numbers. + */ + mod: function(n, m) + { + return ((n % m) + m) % m; + }, + + /** + * Function: intersection + * + * Returns the intersection of two lines as an . + * + * Parameters: + * + * x0 - X-coordinate of the first line's startpoint. + * y0 - X-coordinate of the first line's startpoint. + * x1 - X-coordinate of the first line's endpoint. + * y1 - Y-coordinate of the first line's endpoint. + * x2 - X-coordinate of the second line's startpoint. + * y2 - Y-coordinate of the second line's startpoint. + * x3 - X-coordinate of the second line's endpoint. + * y3 - Y-coordinate of the second line's endpoint. + */ + intersection: function (x0, y0, x1, y1, x2, y2, x3, y3) + { + var denom = ((y3 - y2) * (x1 - x0)) - ((x3 - x2) * (y1 - y0)); + var nume_a = ((x3 - x2) * (y0 - y2)) - ((y3 - y2) * (x0 - x2)); + var nume_b = ((x1 - x0) * (y0 - y2)) - ((y1 - y0) * (x0 - x2)); + + var ua = nume_a / denom; + var ub = nume_b / denom; + + if(ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0) + { + // Get the intersection point + var x = x0 + ua * (x1 - x0); + var y = y0 + ua * (y1 - y0); + + return new mxPoint(x, y); + } + + // No intersection + return null; + }, + + /** + * Function: ptSegDistSq + * + * Returns the square distance between a segment and a point. To get the + * distance between a point and a line (with infinite length) use + * . + * + * Parameters: + * + * x1 - X-coordinate of the startpoint of the segment. + * y1 - Y-coordinate of the startpoint of the segment. + * x2 - X-coordinate of the endpoint of the segment. + * y2 - Y-coordinate of the endpoint of the segment. + * px - X-coordinate of the point. + * py - Y-coordinate of the point. + */ + ptSegDistSq: function(x1, y1, x2, y2, px, py) + { + x2 -= x1; + y2 -= y1; + + px -= x1; + py -= y1; + + var dotprod = px * x2 + py * y2; + var projlenSq; + + if (dotprod <= 0.0) + { + projlenSq = 0.0; + } + else + { + px = x2 - px; + py = y2 - py; + dotprod = px * x2 + py * y2; + + if (dotprod <= 0.0) + { + projlenSq = 0.0; + } + else + { + projlenSq = dotprod * dotprod / (x2 * x2 + y2 * y2); + } + } + + var lenSq = px * px + py * py - projlenSq; + + if (lenSq < 0) + { + lenSq = 0; + } + + return lenSq; + }, + + /** + * Function: ptLineDist + * + * Returns the distance between a line defined by two points and a point. + * To get the distance between a point and a segment (with a specific + * length) use . + * + * Parameters: + * + * x1 - X-coordinate of point 1 of the line. + * y1 - Y-coordinate of point 1 of the line. + * x2 - X-coordinate of point 1 of the line. + * y2 - Y-coordinate of point 1 of the line. + * px - X-coordinate of the point. + * py - Y-coordinate of the point. + */ + ptLineDist: function(x1, y1, x2, y2, px, py) + { + return Math.abs((y2 - y1) * px - (x2 - x1) * py + x2 * y1 - y2 * x1) / + Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); + }, + + /** + * Function: relativeCcw + * + * Returns 1 if the given point on the right side of the segment, 0 if its + * on the segment, and -1 if the point is on the left side of the segment. + * + * Parameters: + * + * x1 - X-coordinate of the startpoint of the segment. + * y1 - Y-coordinate of the startpoint of the segment. + * x2 - X-coordinate of the endpoint of the segment. + * y2 - Y-coordinate of the endpoint of the segment. + * px - X-coordinate of the point. + * py - Y-coordinate of the point. + */ + relativeCcw: function(x1, y1, x2, y2, px, py) + { + x2 -= x1; + y2 -= y1; + px -= x1; + py -= y1; + var ccw = px * y2 - py * x2; + + if (ccw == 0.0) + { + ccw = px * x2 + py * y2; + + if (ccw > 0.0) + { + px -= x2; + py -= y2; + ccw = px * x2 + py * y2; + + if (ccw < 0.0) + { + ccw = 0.0; + } + } + } + + return (ccw < 0.0) ? -1 : ((ccw > 0.0) ? 1 : 0); + }, + + /** + * Function: animateChanges + * + * See . This is for backwards compatibility and + * will be removed later. + */ + animateChanges: function(graph, changes) + { + // LATER: Deprecated, remove this function + mxEffects.animateChanges.apply(this, arguments); + }, + + /** + * Function: cascadeOpacity + * + * See . This is for backwards compatibility and + * will be removed later. + */ + cascadeOpacity: function(graph, cell, opacity) + { + mxEffects.cascadeOpacity.apply(this, arguments); + }, + + /** + * Function: fadeOut + * + * See . This is for backwards compatibility and + * will be removed later. + */ + fadeOut: function(node, from, remove, step, delay, isEnabled) + { + mxEffects.fadeOut.apply(this, arguments); + }, + + /** + * Function: setOpacity + * + * Sets the opacity of the specified DOM node to the given value in %. + * + * Parameters: + * + * node - DOM node to set the opacity for. + * value - Opacity in %. Possible values are between 0 and 100. + */ + setOpacity: function(node, value) + { + if (mxUtils.isVml(node)) + { + if (value >= 100) + { + node.style.filter = ''; + } + else + { + // TODO: Why is the division by 5 needed in VML? + node.style.filter = 'alpha(opacity=' + (value/5) + ')'; + } + } + else if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9)) + { + if (value >= 100) + { + node.style.filter = ''; + } + else + { + node.style.filter = 'alpha(opacity=' + value + ')'; + } + } + else + { + node.style.opacity = (value / 100); + } + }, + + /** + * Function: createImage + * + * Creates and returns an image (IMG node) or VML image (v:image) in IE6 in + * quirks mode. + * + * Parameters: + * + * src - URL that points to the image to be displayed. + */ + createImage: function(src) + { + var imageNode = null; + + if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat') + { + imageNode = document.createElement(mxClient.VML_PREFIX + ':image'); + imageNode.setAttribute('src', src); + imageNode.style.borderStyle = 'none'; + } + else + { + imageNode = document.createElement('img'); + imageNode.setAttribute('src', src); + imageNode.setAttribute('border', '0'); + } + + return imageNode; + }, + + /** + * Function: sortCells + * + * Sorts the given cells according to the order in the cell hierarchy. + * Ascending is optional and defaults to true. + */ + sortCells: function(cells, ascending) + { + ascending = (ascending != null) ? ascending : true; + var lookup = new mxDictionary(); + cells.sort(function(o1, o2) + { + var p1 = lookup.get(o1); + + if (p1 == null) + { + p1 = mxCellPath.create(o1).split(mxCellPath.PATH_SEPARATOR); + lookup.put(o1, p1); + } + + var p2 = lookup.get(o2); + + if (p2 == null) + { + p2 = mxCellPath.create(o2).split(mxCellPath.PATH_SEPARATOR); + lookup.put(o2, p2); + } + + var comp = mxCellPath.compare(p1, p2); + + return (comp == 0) ? 0 : (((comp > 0) == ascending) ? 1 : -1); + }); + + return cells; + }, + + /** + * Function: getStylename + * + * Returns the stylename in a style of the form [(stylename|key=value);] or + * an empty string if the given style does not contain a stylename. + * + * Parameters: + * + * style - String of the form [(stylename|key=value);]. + */ + getStylename: function(style) + { + if (style != null) + { + var pairs = style.split(';'); + var stylename = pairs[0]; + + if (stylename.indexOf('=') < 0) + { + return stylename; + } + } + + return ''; + }, + + /** + * Function: getStylenames + * + * Returns the stylenames in a style of the form [(stylename|key=value);] + * or an empty array if the given style does not contain any stylenames. + * + * Parameters: + * + * style - String of the form [(stylename|key=value);]. + */ + getStylenames: function(style) + { + var result = []; + + if (style != null) + { + var pairs = style.split(';'); + + for (var i = 0; i < pairs.length; i++) + { + if (pairs[i].indexOf('=') < 0) + { + result.push(pairs[i]); + } + } + } + + return result; + }, + + /** + * Function: indexOfStylename + * + * Returns the index of the given stylename in the given style. This + * returns -1 if the given stylename does not occur (as a stylename) in the + * given style, otherwise it returns the index of the first character. + */ + indexOfStylename: function(style, stylename) + { + if (style != null && stylename != null) + { + var tokens = style.split(';'); + var pos = 0; + + for (var i = 0; i < tokens.length; i++) + { + if (tokens[i] == stylename) + { + return pos; + } + + pos += tokens[i].length + 1; + } + } + + return -1; + }, + + /** + * Function: addStylename + * + * Adds the specified stylename to the given style if it does not already + * contain the stylename. + */ + addStylename: function(style, stylename) + { + if (mxUtils.indexOfStylename(style, stylename) < 0) + { + if (style == null) + { + style = ''; + } + else if (style.length > 0 && style.charAt(style.length - 1) != ';') + { + style += ';'; + } + + style += stylename; + } + + return style; + }, + + /** + * Function: removeStylename + * + * Removes all occurrences of the specified stylename in the given style + * and returns the updated style. Trailing semicolons are not preserved. + */ + removeStylename: function(style, stylename) + { + var result = []; + + if (style != null) + { + var tokens = style.split(';'); + + for (var i = 0; i < tokens.length; i++) + { + if (tokens[i] != stylename) + { + result.push(tokens[i]); + } + } + } + + return result.join(';'); + }, + + /** + * Function: removeAllStylenames + * + * Removes all stylenames from the given style and returns the updated + * style. + */ + removeAllStylenames: function(style) + { + var result = []; + + if (style != null) + { + var tokens = style.split(';'); + + for (var i = 0; i < tokens.length; i++) + { + // Keeps the key, value assignments + if (tokens[i].indexOf('=') >= 0) + { + result.push(tokens[i]); + } + } + } + + return result.join(';'); + }, + + /** + * Function: setCellStyles + * + * Assigns the value for the given key in the styles of the given cells, or + * removes the key from the styles if the value is null. + * + * Parameters: + * + * model - to execute the transaction in. + * cells - Array of to be updated. + * key - Key of the style to be changed. + * value - New value for the given key. + */ + setCellStyles: function(model, cells, key, value) + { + if (cells != null && cells.length > 0) + { + model.beginUpdate(); + try + { + for (var i = 0; i < cells.length; i++) + { + if (cells[i] != null) + { + var style = mxUtils.setStyle(model.getStyle(cells[i]), key, value); + model.setStyle(cells[i], style); + } + } + } + finally + { + model.endUpdate(); + } + } + }, + + /** + * Function: setStyle + * + * Adds or removes the given key, value pair to the style and returns the + * new style. If value is null or zero length then the key is removed from + * the style. This is for cell styles, not for CSS styles. + * + * Parameters: + * + * style - String of the form [(stylename|key=value);]. + * key - Key of the style to be changed. + * value - New value for the given key. + */ + setStyle: function(style, key, value) + { + var isValue = value != null && (typeof(value.length) == 'undefined' || value.length > 0); + + if (style == null || style.length == 0) + { + if (isValue) + { + style = key + '=' + value + ';'; + } + } + else + { + if (style.substring(0, key.length + 1) == key + '=') + { + var next = style.indexOf(';'); + + if (isValue) + { + style = key + '=' + value + ((next < 0) ? ';' : style.substring(next)); + } + else + { + style = (next < 0 || next == style.length - 1) ? '' : style.substring(next + 1); + } + } + else + { + var index = style.indexOf(';' + key + '='); + + if (index < 0) + { + if (isValue) + { + var sep = (style.charAt(style.length - 1) == ';') ? '' : ';'; + style = style + sep + key + '=' + value + ';'; + } + } + else + { + var next = style.indexOf(';', index + 1); + + if (isValue) + { + style = style.substring(0, index + 1) + key + '=' + value + ((next < 0) ? ';' : style.substring(next)); + } + else + { + style = style.substring(0, index) + ((next < 0) ? ';' : style.substring(next)); + } + } + } + } + + return style; + }, + + /** + * Function: setCellStyleFlags + * + * Sets or toggles the flag bit for the given key in the cell's styles. + * If value is null then the flag is toggled. + * + * Example: + * + * (code) + * var cells = graph.getSelectionCells(); + * mxUtils.setCellStyleFlags(graph.model, + * cells, + * mxConstants.STYLE_FONTSTYLE, + * mxConstants.FONT_BOLD); + * (end) + * + * Toggles the bold font style. + * + * Parameters: + * + * model - that contains the cells. + * cells - Array of to change the style for. + * key - Key of the style to be changed. + * flag - Integer for the bit to be changed. + * value - Optional boolean value for the flag. + */ + setCellStyleFlags: function(model, cells, key, flag, value) + { + if (cells != null && cells.length > 0) + { + model.beginUpdate(); + try + { + for (var i = 0; i < cells.length; i++) + { + if (cells[i] != null) + { + var style = mxUtils.setStyleFlag( + model.getStyle(cells[i]), + key, flag, value); + model.setStyle(cells[i], style); + } + } + } + finally + { + model.endUpdate(); + } + } + }, + + /** + * Function: setStyleFlag + * + * Sets or removes the given key from the specified style and returns the + * new style. If value is null then the flag is toggled. + * + * Parameters: + * + * style - String of the form [(stylename|key=value);]. + * key - Key of the style to be changed. + * flag - Integer for the bit to be changed. + * value - Optional boolean value for the given flag. + */ + setStyleFlag: function(style, key, flag, value) + { + if (style == null || style.length == 0) + { + if (value || value == null) + { + style = key+'='+flag; + } + else + { + style = key+'=0'; + } + } + else + { + var index = style.indexOf(key+'='); + + if (index < 0) + { + var sep = (style.charAt(style.length-1) == ';') ? '' : ';'; + + if (value || value == null) + { + style = style + sep + key + '=' + flag; + } + else + { + style = style + sep + key + '=0'; + } + } + else + { + var cont = style.indexOf(';', index); + var tmp = ''; + + if (cont < 0) + { + tmp = style.substring(index+key.length+1); + } + else + { + tmp = style.substring(index+key.length+1, cont); + } + + if (value == null) + { + tmp = parseInt(tmp) ^ flag; + } + else if (value) + { + tmp = parseInt(tmp) | flag; + } + else + { + tmp = parseInt(tmp) & ~flag; + } + + style = style.substring(0, index) + key + '=' + tmp + + ((cont >= 0) ? style.substring(cont) : ''); + } + } + + return style; + }, + + /** + * Function: getAlignmentAsPoint + * + * Returns an that represents the horizontal and vertical alignment + * for numeric computations. X is -0.5 for center, -1 for right and 0 for + * left alignment. Y is -0.5 for middle, -1 for bottom and 0 for top + * alignment. Default values for missing arguments is top, left. + */ + getAlignmentAsPoint: function(align, valign) + { + var dx = -0.5; + var dy = -0.5; + + // Horizontal alignment + if (align == mxConstants.ALIGN_LEFT) + { + dx = 0; + } + else if (align == mxConstants.ALIGN_RIGHT) + { + dx = -1; + } + + // Vertical alignment + if (valign == mxConstants.ALIGN_TOP) + { + dy = 0; + } + else if (valign == mxConstants.ALIGN_BOTTOM) + { + dy = -1; + } + + return new mxPoint(dx, dy); + }, + + /** + * Function: getSizeForString + * + * Returns an with the size (width and height in pixels) of + * the given string. The string may contain HTML markup. Newlines should be + * converted to
before calling this method. The caller is responsible + * for sanitizing the HTML markup. + * + * Example: + * + * (code) + * var label = graph.getLabel(cell).replace(/\n/g, "
"); + * var size = graph.getSizeForString(label); + * (end) + * + * Parameters: + * + * text - String whose size should be returned. + * fontSize - Integer that specifies the font size in pixels. Default is + * . + * fontFamily - String that specifies the name of the font family. Default + * is . + * textWidth - Optional width for text wrapping. + * fontStyle - Optional font style. + */ + getSizeForString: function(text, fontSize, fontFamily, textWidth, fontStyle) + { + fontSize = (fontSize != null) ? fontSize : mxConstants.DEFAULT_FONTSIZE; + fontFamily = (fontFamily != null) ? fontFamily : mxConstants.DEFAULT_FONTFAMILY; + var div = document.createElement('div'); + + // Sets the font size and family + div.style.fontFamily = fontFamily; + div.style.fontSize = Math.round(fontSize) + 'px'; + div.style.lineHeight = Math.round(fontSize * mxConstants.LINE_HEIGHT) + 'px'; + + // Sets the font style + if (fontStyle != null) + { + if ((fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) + { + div.style.fontWeight = 'bold'; + } + + if ((fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) + { + div.style.fontStyle = 'italic'; + } + + var txtDecor = []; + + if ((fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) + { + txtDecor.push('underline'); + } + + if ((fontStyle & mxConstants.FONT_STRIKETHROUGH) == mxConstants.FONT_STRIKETHROUGH) + { + txtDecor.push('line-through'); + } + + if (txtDecor.length > 0) + { + div.style.textDecoration = txtDecor.join(' '); + } + } + + // Disables block layout and outside wrapping and hides the div + div.style.position = 'absolute'; + div.style.visibility = 'hidden'; + div.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; + div.style.zoom = '1'; + + if (textWidth != null) + { + div.style.width = textWidth + 'px'; + div.style.whiteSpace = 'normal'; + } + else + { + div.style.whiteSpace = 'nowrap'; + } + + // Adds the text and inserts into DOM for updating of size + div.innerHTML = text; + document.body.appendChild(div); + + // Gets the size and removes from DOM + var size = new mxRectangle(0, 0, div.offsetWidth, div.offsetHeight); + document.body.removeChild(div); + + return size; + }, + + /** + * Function: getViewXml + */ + getViewXml: function(graph, scale, cells, x0, y0) + { + x0 = (x0 != null) ? x0 : 0; + y0 = (y0 != null) ? y0 : 0; + scale = (scale != null) ? scale : 1; + + if (cells == null) + { + var model = graph.getModel(); + cells = [model.getRoot()]; + } + + var view = graph.getView(); + var result = null; + + // Disables events on the view + var eventsEnabled = view.isEventsEnabled(); + view.setEventsEnabled(false); + + // Workaround for label bounds not taken into account for image export. + // Creates a temporary draw pane which is used for rendering the text. + // Text rendering is required for finding the bounds of the labels. + var drawPane = view.drawPane; + var overlayPane = view.overlayPane; + + if (graph.dialect == mxConstants.DIALECT_SVG) + { + view.drawPane = document.createElementNS(mxConstants.NS_SVG, 'g'); + view.canvas.appendChild(view.drawPane); + + // Redirects cell overlays into temporary container + view.overlayPane = document.createElementNS(mxConstants.NS_SVG, 'g'); + view.canvas.appendChild(view.overlayPane); + } + else + { + view.drawPane = view.drawPane.cloneNode(false); + view.canvas.appendChild(view.drawPane); + + // Redirects cell overlays into temporary container + view.overlayPane = view.overlayPane.cloneNode(false); + view.canvas.appendChild(view.overlayPane); + } + + // Resets the translation + var translate = view.getTranslate(); + view.translate = new mxPoint(x0, y0); + + // Creates the temporary cell states in the view + var temp = new mxTemporaryCellStates(graph.getView(), scale, cells); + + try + { + var enc = new mxCodec(); + result = enc.encode(graph.getView()); + } + finally + { + temp.destroy(); + view.translate = translate; + view.canvas.removeChild(view.drawPane); + view.canvas.removeChild(view.overlayPane); + view.drawPane = drawPane; + view.overlayPane = overlayPane; + view.setEventsEnabled(eventsEnabled); + } + + return result; + }, + + /** + * Function: getScaleForPageCount + * + * Returns the scale to be used for printing the graph with the given + * bounds across the specifies number of pages with the given format. The + * scale is always computed such that it given the given amount or fewer + * pages in the print output. See for an example. + * + * Parameters: + * + * pageCount - Specifies the number of pages in the print output. + * graph - that should be printed. + * pageFormat - Optional that specifies the page format. + * Default is . + * border - The border along each side of every page. + */ + getScaleForPageCount: function(pageCount, graph, pageFormat, border) + { + if (pageCount < 1) + { + // We can't work with less than 1 page, return no scale + // change + return 1; + } + + pageFormat = (pageFormat != null) ? pageFormat : mxConstants.PAGE_FORMAT_A4_PORTRAIT; + border = (border != null) ? border : 0; + + var availablePageWidth = pageFormat.width - (border * 2); + var availablePageHeight = pageFormat.height - (border * 2); + + // Work out the number of pages required if the + // graph is not scaled. + var graphBounds = graph.getGraphBounds().clone(); + var sc = graph.getView().getScale(); + graphBounds.width /= sc; + graphBounds.height /= sc; + var graphWidth = graphBounds.width; + var graphHeight = graphBounds.height; + + var scale = 1; + + // The ratio of the width/height for each printer page + var pageFormatAspectRatio = availablePageWidth / availablePageHeight; + // The ratio of the width/height for the graph to be printer + var graphAspectRatio = graphWidth / graphHeight; + + // The ratio of horizontal pages / vertical pages for this + // graph to maintain its aspect ratio on this page format + var pagesAspectRatio = graphAspectRatio / pageFormatAspectRatio; + + // Factor the square root of the page count up and down + // by the pages aspect ratio to obtain a horizontal and + // vertical page count that adds up to the page count + // and has the correct aspect ratio + var pageRoot = Math.sqrt(pageCount); + var pagesAspectRatioSqrt = Math.sqrt(pagesAspectRatio); + var numRowPages = pageRoot * pagesAspectRatioSqrt; + var numColumnPages = pageRoot / pagesAspectRatioSqrt; + + // These value are rarely more than 2 rounding downs away from + // a total that meets the page count. In cases of one being less + // than 1 page, the other value can be too high and take more iterations + // In this case, just change that value to be the page count, since + // we know the other value is 1 + if (numRowPages < 1 && numColumnPages > pageCount) + { + var scaleChange = numColumnPages / pageCount; + numColumnPages = pageCount; + numRowPages /= scaleChange; + } + + if (numColumnPages < 1 && numRowPages > pageCount) + { + var scaleChange = numRowPages / pageCount; + numRowPages = pageCount; + numColumnPages /= scaleChange; + } + + var currentTotalPages = Math.ceil(numRowPages) * Math.ceil(numColumnPages); + + var numLoops = 0; + + // Iterate through while the rounded up number of pages comes to + // a total greater than the required number + while (currentTotalPages > pageCount) + { + // Round down the page count (rows or columns) that is + // closest to its next integer down in percentage terms. + // i.e. Reduce the page total by reducing the total + // page area by the least possible amount + + var roundRowDownProportion = Math.floor(numRowPages) / numRowPages; + var roundColumnDownProportion = Math.floor(numColumnPages) / numColumnPages; + + // If the round down proportion is, work out the proportion to + // round down to 1 page less + if (roundRowDownProportion == 1) + { + roundRowDownProportion = Math.floor(numRowPages-1) / numRowPages; + } + if (roundColumnDownProportion == 1) + { + roundColumnDownProportion = Math.floor(numColumnPages-1) / numColumnPages; + } + + // Check which rounding down is smaller, but in the case of very small roundings + // try the other dimension instead + var scaleChange = 1; + + // Use the higher of the two values + if (roundRowDownProportion > roundColumnDownProportion) + { + scaleChange = roundRowDownProportion; + } + else + { + scaleChange = roundColumnDownProportion; + } + + numRowPages = numRowPages * scaleChange; + numColumnPages = numColumnPages * scaleChange; + currentTotalPages = Math.ceil(numRowPages) * Math.ceil(numColumnPages); + + numLoops++; + + if (numLoops > 10) + { + break; + } + } + + // Work out the scale from the number of row pages required + // The column pages will give the same value + var posterWidth = availablePageWidth * numRowPages; + scale = posterWidth / graphWidth; + + // Allow for rounding errors + return scale * 0.99999; + }, + + /** + * Function: show + * + * Copies the styles and the markup from the graph's container into the + * given document and removes all cursor styles. The document is returned. + * + * This function should be called from within the document with the graph. + * If you experience problems with missing stylesheets in IE then try adding + * the domain to the trusted sites. + * + * Parameters: + * + * graph - to be copied. + * doc - Document where the new graph is created. + * x0 - X-coordinate of the graph view origin. Default is 0. + * y0 - Y-coordinate of the graph view origin. Default is 0. + * w - Optional width of the graph view. + * h - Optional height of the graph view. + */ + show: function(graph, doc, x0, y0, w, h) + { + x0 = (x0 != null) ? x0 : 0; + y0 = (y0 != null) ? y0 : 0; + + if (doc == null) + { + var wnd = window.open(); + doc = wnd.document; + } + else + { + doc.open(); + } + + // Workaround for missing print output in IE9 standards + if (document.documentMode == 9) + { + doc.writeln(''); + } + + var bounds = graph.getGraphBounds(); + var dx = Math.ceil(x0 - bounds.x); + var dy = Math.ceil(y0 - bounds.y); + + if (w == null) + { + w = Math.ceil(bounds.width + x0) + Math.ceil(Math.ceil(bounds.x) - bounds.x); + } + + if (h == null) + { + h = Math.ceil(bounds.height + y0) + Math.ceil(Math.ceil(bounds.y) - bounds.y); + } + + // Needs a special way of creating the page so that no click is required + // to refresh the contents after the external CSS styles have been loaded. + // To avoid a click or programmatic refresh, the styleSheets[].cssText + // property is copied over from the original document. + if (mxClient.IS_IE || document.documentMode == 11) + { + var html = ''; + + var base = document.getElementsByTagName('base'); + + for (var i = 0; i < base.length; i++) + { + html += base[i].outerHTML; + } + + html += ''; + + // Copies the contents of the graph container + html += '
'; + html += graph.container.innerHTML; + html += '
'; + + doc.writeln(html); + doc.close(); + } + else + { + doc.writeln(''); + + var base = document.getElementsByTagName('base'); + + for (var i = 0; i < base.length; i++) + { + doc.writeln(mxUtils.getOuterHtml(base[i])); + } + + var links = document.getElementsByTagName('link'); + + for (var i = 0; i < links.length; i++) + { + doc.writeln(mxUtils.getOuterHtml(links[i])); + } + + var styles = document.getElementsByTagName('style'); + + for (var i = 0; i < styles.length; i++) + { + doc.writeln(mxUtils.getOuterHtml(styles[i])); + } + + doc.writeln(''); + doc.close(); + + var outer = doc.createElement('div'); + outer.position = 'absolute'; + outer.overflow = 'hidden'; + outer.style.width = w + 'px'; + outer.style.height = h + 'px'; + + // Required for HTML labels if foreignObjects are disabled + var div = doc.createElement('div'); + div.style.position = 'absolute'; + div.style.left = dx + 'px'; + div.style.top = dy + 'px'; + + var node = graph.container.firstChild; + var svg = null; + + while (node != null) + { + var clone = node.cloneNode(true); + + if (node == graph.view.drawPane.ownerSVGElement) + { + outer.appendChild(clone); + svg = clone; + } + else + { + div.appendChild(clone); + } + + node = node.nextSibling; + } + + doc.body.appendChild(outer); + + if (div.firstChild != null) + { + doc.body.appendChild(div); + } + + if (svg != null) + { + svg.style.minWidth = ''; + svg.style.minHeight = ''; + svg.firstChild.setAttribute('transform', 'translate(' + dx + ',' + dy + ')'); + } + } + + mxUtils.removeCursors(doc.body); + + return doc; + }, + + /** + * Function: printScreen + * + * Prints the specified graph using a new window and the built-in print + * dialog. + * + * This function should be called from within the document with the graph. + * + * Parameters: + * + * graph - to be printed. + */ + printScreen: function(graph) + { + var wnd = window.open(); + var bounds = graph.getGraphBounds(); + mxUtils.show(graph, wnd.document); + + var print = function() + { + wnd.focus(); + wnd.print(); + wnd.close(); + }; + + // Workaround for Google Chrome which needs a bit of a + // delay in order to render the SVG contents + if (mxClient.IS_GC) + { + wnd.setTimeout(print, 500); + } + else + { + print(); + } + }, + + /** + * Function: popup + * + * Shows the specified text content in a new or a new browser + * window if isInternalWindow is false. + * + * Parameters: + * + * content - String that specifies the text to be displayed. + * isInternalWindow - Optional boolean indicating if an mxWindow should be + * used instead of a new browser window. Default is false. + */ + popup: function(content, isInternalWindow) + { + if (isInternalWindow) + { + var div = document.createElement('div'); + + div.style.overflow = 'scroll'; + div.style.width = '636px'; + div.style.height = '460px'; + + var pre = document.createElement('pre'); + pre.innerHTML = mxUtils.htmlEntities(content, false). + replace(/\n/g,'
').replace(/ /g, ' '); + + div.appendChild(pre); + + var w = document.body.clientWidth; + var h = Math.max(document.body.clientHeight || 0, document.documentElement.clientHeight) + var wnd = new mxWindow('Popup Window', div, + w/2-320, h/2-240, 640, 480, false, true); + + wnd.setClosable(true); + wnd.setVisible(true); + } + else + { + // Wraps up the XML content in a textarea + if (mxClient.IS_NS) + { + var wnd = window.open(); + wnd.document.writeln('
'+mxUtils.htmlEntities(content)+'').replace(/ /g, ' ');
+			   	wnd.document.body.appendChild(pre);
+			}
+	   	}
+	},
+	
+	/**
+	 * Function: alert
+	 * 
+	 * Displayss the given alert in a new dialog. This implementation uses the
+	 * built-in alert function. This is used to display validation errors when
+	 * connections cannot be changed or created.
+	 * 
+	 * Parameters:
+	 * 
+	 * message - String specifying the message to be displayed.
+	 */
+	alert: function(message)
+	{
+		alert(message);
+	},
+	
+	/**
+	 * Function: prompt
+	 * 
+	 * Displays the given message in a prompt dialog. This implementation uses
+	 * the built-in prompt function.
+	 * 
+	 * Parameters:
+	 * 
+	 * message - String specifying the message to be displayed.
+	 * defaultValue - Optional string specifying the default value.
+	 */
+	prompt: function(message, defaultValue)
+	{
+		return prompt(message, (defaultValue != null) ? defaultValue : '');
+	},
+	
+	/**
+	 * Function: confirm
+	 * 
+	 * Displays the given message in a confirm dialog. This implementation uses
+	 * the built-in confirm function.
+	 * 
+	 * Parameters:
+	 * 
+	 * message - String specifying the message to be displayed.
+	 */
+	confirm: function(message)
+	{
+		return confirm(message);
+	},
+
+	/**
+	 * Function: error
+	 * 
+	 * Displays the given error message in a new  of the given width.
+	 * If close is true then an additional close button is added to the window.
+	 * The optional icon specifies the icon to be used for the window. Default
+	 * is .
+	 * 
+	 * Parameters:
+	 * 
+	 * message - String specifying the message to be displayed.
+	 * width - Integer specifying the width of the window.
+	 * close - Optional boolean indicating whether to add a close button.
+	 * icon - Optional icon for the window decoration.
+	 */
+	error: function(message, width, close, icon)
+	{
+		var div = document.createElement('div');
+		div.style.padding = '20px';
+
+		var img = document.createElement('img');
+		img.setAttribute('src', icon || mxUtils.errorImage);
+		img.setAttribute('valign', 'bottom');
+		img.style.verticalAlign = 'middle';
+		div.appendChild(img);
+
+		div.appendChild(document.createTextNode('\u00a0')); //  
+		div.appendChild(document.createTextNode('\u00a0')); //  
+		div.appendChild(document.createTextNode('\u00a0')); //  
+		mxUtils.write(div, message);
+
+		var w = document.body.clientWidth;
+		var h = (document.body.clientHeight || document.documentElement.clientHeight);
+		var warn = new mxWindow(mxResources.get(mxUtils.errorResource) ||
+			mxUtils.errorResource, div, (w-width)/2, h/4, width, null,
+			false, true);
+
+		if (close)
+		{
+			mxUtils.br(div);
+			
+			var tmp = document.createElement('p');
+			var button = document.createElement('button');
+
+			if (mxClient.IS_IE)
+			{
+				button.style.cssText = 'float:right';
+			}
+			else
+			{
+				button.setAttribute('style', 'float:right');
+			}
+
+			mxEvent.addListener(button, 'click', function(evt)
+			{
+				warn.destroy();
+			});
+
+			mxUtils.write(button, mxResources.get(mxUtils.closeResource) ||
+				mxUtils.closeResource);
+			
+			tmp.appendChild(button);
+			div.appendChild(tmp);
+			
+			mxUtils.br(div);
+			
+			warn.setClosable(true);
+		}
+		
+		warn.setVisible(true);
+		
+		return warn;
+	},
+
+	/**
+	 * Function: makeDraggable
+	 * 
+	 * Configures the given DOM element to act as a drag source for the
+	 * specified graph. Returns a a new . If
+	 *  is enabled then the x and y arguments must
+	 * be used in funct to match the preview location.
+	 * 
+	 * Example:
+	 * 
+	 * (code)
+	 * var funct = function(graph, evt, cell, x, y)
+	 * {
+	 *   if (graph.canImportCell(cell))
+	 *   {
+	 *     var parent = graph.getDefaultParent();
+	 *     var vertex = null;
+	 *     
+	 *     graph.getModel().beginUpdate();
+	 *     try
+	 *     {
+	 * 	     vertex = graph.insertVertex(parent, null, 'Hello', x, y, 80, 30);
+	 *     }
+	 *     finally
+	 *     {
+	 *       graph.getModel().endUpdate();
+	 *     }
+	 *
+	 *     graph.setSelectionCell(vertex);
+	 *   }
+	 * }
+	 * 
+	 * var img = document.createElement('img');
+	 * img.setAttribute('src', 'editors/images/rectangle.gif');
+	 * img.style.position = 'absolute';
+	 * img.style.left = '0px';
+	 * img.style.top = '0px';
+	 * img.style.width = '16px';
+	 * img.style.height = '16px';
+	 * 
+	 * var dragImage = img.cloneNode(true);
+	 * dragImage.style.width = '32px';
+	 * dragImage.style.height = '32px';
+	 * mxUtils.makeDraggable(img, graph, funct, dragImage);
+	 * document.body.appendChild(img);
+	 * (end)
+	 * 
+	 * Parameters:
+	 * 
+	 * element - DOM element to make draggable.
+	 * graphF -  that acts as the drop target or a function that takes a
+	 * mouse event and returns the current .
+	 * funct - Function to execute on a successful drop.
+	 * dragElement - Optional DOM node to be used for the drag preview.
+	 * dx - Optional horizontal offset between the cursor and the drag
+	 * preview.
+	 * dy - Optional vertical offset between the cursor and the drag
+	 * preview.
+	 * autoscroll - Optional boolean that specifies if autoscroll should be
+	 * used. Default is mxGraph.autoscroll.
+	 * scalePreview - Optional boolean that specifies if the preview element
+	 * should be scaled according to the graph scale. If this is true, then
+	 * the offsets will also be scaled. Default is false.
+	 * highlightDropTargets - Optional boolean that specifies if dropTargets
+	 * should be highlighted. Default is true.
+	 * getDropTarget - Optional function to return the drop target for a given
+	 * location (x, y). Default is mxGraph.getCellAt.
+	 */
+	makeDraggable: function(element, graphF, funct, dragElement, dx, dy, autoscroll,
+			scalePreview, highlightDropTargets, getDropTarget)
+	{
+		var dragSource = new mxDragSource(element, funct);
+		dragSource.dragOffset = new mxPoint((dx != null) ? dx : 0,
+			(dy != null) ? dy : mxConstants.TOOLTIP_VERTICAL_OFFSET);
+		dragSource.autoscroll = autoscroll;
+		
+		// Cannot enable this by default. This needs to be enabled in the caller
+		// if the funct argument uses the new x- and y-arguments.
+		dragSource.setGuidesEnabled(false);
+		
+		if (highlightDropTargets != null)
+		{
+			dragSource.highlightDropTargets = highlightDropTargets;
+		}
+		
+		// Overrides function to find drop target cell
+		if (getDropTarget != null)
+		{
+			dragSource.getDropTarget = getDropTarget;
+		}
+		
+		// Overrides function to get current graph
+		dragSource.getGraphForEvent = function(evt)
+		{
+			return (typeof(graphF) == 'function') ? graphF(evt) : graphF;
+		};
+		
+		// Translates switches into dragSource customizations
+		if (dragElement != null)
+		{
+			dragSource.createDragElement = function()
+			{
+				return dragElement.cloneNode(true);
+			};
+			
+			if (scalePreview)
+			{
+				dragSource.createPreviewElement = function(graph)
+				{
+					var elt = dragElement.cloneNode(true);
+
+					var w = parseInt(elt.style.width);
+					var h = parseInt(elt.style.height);
+					elt.style.width = Math.round(w * graph.view.scale) + 'px';
+					elt.style.height = Math.round(h * graph.view.scale) + 'px';
+					
+					return elt;
+				};
+			}
+		}
+		
+		return dragSource;
+	}
+
+};
diff --git a/public/js/grapheditor/src/js/util/mxVmlCanvas2D.js b/public/js/grapheditor/src/js/util/mxVmlCanvas2D.js
new file mode 100644
index 000000000..fd4380ced
--- /dev/null
+++ b/public/js/grapheditor/src/js/util/mxVmlCanvas2D.js
@@ -0,0 +1,1102 @@
+/**
+ * Copyright (c) 2006-2015, JGraph Ltd
+ * Copyright (c) 2006-2015, Gaudenz Alder
+ */
+/**
+ *
+ * Class: mxVmlCanvas2D
+ * 
+ * Implements a canvas to be used for rendering VML. Here is an example of implementing a
+ * fallback for SVG images which are not supported in VML-based browsers.
+ * 
+ * (code)
+ * var mxVmlCanvas2DImage = mxVmlCanvas2D.prototype.image;
+ * mxVmlCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV)
+ * {
+ *   if (src.substring(src.length - 4, src.length) == '.svg')
+ *   {
+ *     src = 'http://www.jgraph.com/images/mxgraph.gif';
+ *   }
+ *   
+ *   mxVmlCanvas2DImage.apply(this, arguments);
+ * };
+ * (end)
+ * 
+ * To disable anti-aliasing in the output, use the following code.
+ * 
+ * (code)
+ * document.createStyleSheet().cssText = mxClient.VML_PREFIX + '\\:*{antialias:false;)}';
+ * (end)
+ * 
+ * A description of the public API is available in . Note that
+ * there is a known issue in VML where gradients are painted using the outer
+ * bounding box of rotated shapes, not the actual bounds of the shape. See
+ * also  for plain text label restrictions in shapes for VML.
+ */
+var mxVmlCanvas2D = function(root)
+{
+	mxAbstractCanvas2D.call(this);
+
+	/**
+	 * Variable: root
+	 * 
+	 * Reference to the container for the SVG content.
+	 */
+	this.root = root;
+};
+
+/**
+ * Extends mxAbstractCanvas2D
+ */
+mxUtils.extend(mxVmlCanvas2D, mxAbstractCanvas2D);
+
+/**
+ * Variable: path
+ * 
+ * Holds the current DOM node.
+ */
+mxVmlCanvas2D.prototype.node = null;
+
+/**
+ * Variable: textEnabled
+ * 
+ * Specifies if text output should be enabledetB. Default is true.
+ */
+mxVmlCanvas2D.prototype.textEnabled = true;
+
+/**
+ * Variable: moveOp
+ * 
+ * Contains the string used for moving in paths. Default is 'm'.
+ */
+mxVmlCanvas2D.prototype.moveOp = 'm';
+
+/**
+ * Variable: lineOp
+ * 
+ * Contains the string used for moving in paths. Default is 'l'.
+ */
+mxVmlCanvas2D.prototype.lineOp = 'l';
+
+/**
+ * Variable: curveOp
+ * 
+ * Contains the string used for bezier curves. Default is 'c'.
+ */
+mxVmlCanvas2D.prototype.curveOp = 'c';
+
+/**
+ * Variable: closeOp
+ * 
+ * Holds the operator for closing curves. Default is 'x e'.
+ */
+mxVmlCanvas2D.prototype.closeOp = 'x';
+
+/**
+ * Variable: rotatedHtmlBackground
+ * 
+ * Background color for rotated HTML. Default is ''. This can be set to eg.
+ * white to improve rendering of rotated text in VML for IE9.
+ */
+mxVmlCanvas2D.prototype.rotatedHtmlBackground = '';
+
+/**
+ * Variable: vmlScale
+ * 
+ * Specifies the scale used to draw VML shapes.
+ */
+mxVmlCanvas2D.prototype.vmlScale = 1;
+
+/**
+ * Function: createElement
+ * 
+ * Creates the given element using the document.
+ */
+mxVmlCanvas2D.prototype.createElement = function(name)
+{
+	return document.createElement(name);
+};
+
+/**
+ * Function: createVmlElement
+ * 
+ * Creates a new element using  and prefixes the given name with
+ * .
+ */
+mxVmlCanvas2D.prototype.createVmlElement = function(name)
+{
+	return this.createElement(mxClient.VML_PREFIX + ':' + name);
+};
+
+/**
+ * Function: addNode
+ * 
+ * Adds the current node to the .
+ */
+mxVmlCanvas2D.prototype.addNode = function(filled, stroked)
+{
+	var node = this.node;
+	var s = this.state;
+	
+	if (node != null)
+	{
+		if (node.nodeName == 'shape')
+		{
+			// Checks if the path is not empty
+			if (this.path != null && this.path.length > 0)
+			{
+				node.path = this.path.join(' ') + ' e';
+				node.style.width = this.root.style.width;
+				node.style.height = this.root.style.height;
+				node.coordsize = parseInt(node.style.width) + ' ' + parseInt(node.style.height);
+			}
+			else
+			{
+				return;
+			}
+		}
+
+		node.strokeweight = this.format(Math.max(1, s.strokeWidth * s.scale / this.vmlScale)) + 'px';
+		
+		if (s.shadow)
+		{
+			this.root.appendChild(this.createShadow(node,
+				filled && s.fillColor != null,
+				stroked && s.strokeColor != null));
+		}
+		
+		if (stroked && s.strokeColor != null)
+		{
+			node.stroked = 'true';
+			node.strokecolor = s.strokeColor;
+		}
+		else
+		{
+			node.stroked = 'false';
+		}
+
+		node.appendChild(this.createStroke());
+
+		if (filled && s.fillColor != null)
+		{
+			node.appendChild(this.createFill());
+		}
+		else if (this.pointerEvents && (node.nodeName != 'shape' ||
+			this.path[this.path.length - 1] == this.closeOp))
+		{
+			node.appendChild(this.createTransparentFill());
+		}
+		else
+		{
+			node.filled = 'false';
+		}
+
+		// LATER: Update existing DOM for performance
+		this.root.appendChild(node);
+	}
+};
+
+/**
+ * Function: createTransparentFill
+ * 
+ * Creates a transparent fill.
+ */
+mxVmlCanvas2D.prototype.createTransparentFill = function()
+{
+	var fill = this.createVmlElement('fill');
+	fill.src = mxClient.imageBasePath + '/transparent.gif';
+	fill.type = 'tile';
+	
+	return fill;
+};
+
+/**
+ * Function: createFill
+ * 
+ * Creates a fill for the current state.
+ */
+mxVmlCanvas2D.prototype.createFill = function()
+{
+	var s = this.state;
+	
+	// Gradients in foregrounds not supported because special gradients
+	// with bounds must be created for each element in graphics-canvases
+	var fill = this.createVmlElement('fill');
+	fill.color = s.fillColor;
+
+	if (s.gradientColor != null)
+	{
+		fill.type = 'gradient';
+		fill.method = 'none';
+		fill.color2 = s.gradientColor;
+		var angle = 180 - s.rotation;
+		
+		if (s.gradientDirection == mxConstants.DIRECTION_WEST)
+		{
+			angle -= 90 + ((this.root.style.flip == 'x') ? 180 : 0);
+		}
+		else if (s.gradientDirection == mxConstants.DIRECTION_EAST)
+		{
+			angle += 90 + ((this.root.style.flip == 'x') ? 180 : 0);
+		}
+		else if (s.gradientDirection == mxConstants.DIRECTION_NORTH)
+		{
+			angle -= 180 + ((this.root.style.flip == 'y') ? -180 : 0);
+		}
+		else
+		{
+			 angle += ((this.root.style.flip == 'y') ? -180 : 0);
+		}
+		
+		if (this.root.style.flip == 'x' || this.root.style.flip == 'y')
+		{
+			angle *= -1;
+		}
+
+		// LATER: Fix outer bounding box for rotated shapes used in VML.
+		fill.angle = mxUtils.mod(angle, 360);
+		fill.opacity = (s.alpha * s.gradientFillAlpha * 100) + '%';
+		fill.setAttribute(mxClient.OFFICE_PREFIX + ':opacity2', (s.alpha * s.gradientAlpha * 100) + '%');
+	}
+	else if (s.alpha < 1 || s.fillAlpha < 1)
+	{
+		fill.opacity = (s.alpha * s.fillAlpha * 100) + '%';			
+	}
+	
+	return fill;
+};
+/**
+ * Function: createStroke
+ * 
+ * Creates a fill for the current state.
+ */
+mxVmlCanvas2D.prototype.createStroke = function()
+{
+	var s = this.state;
+	var stroke = this.createVmlElement('stroke');
+	stroke.endcap = s.lineCap || 'flat';
+	stroke.joinstyle = s.lineJoin || 'miter';
+	stroke.miterlimit = s.miterLimit || '10';
+	
+	if (s.alpha < 1 || s.strokeAlpha < 1)
+	{
+		stroke.opacity = (s.alpha * s.strokeAlpha * 100) + '%';
+	}
+	
+	if (s.dashed)
+	{
+		stroke.dashstyle = this.getVmlDashStyle();
+	}
+	
+	return stroke;
+};
+
+/**
+ * Function: getVmlDashPattern
+ * 
+ * Returns a VML dash pattern for the current dashPattern.
+ * See http://msdn.microsoft.com/en-us/library/bb264085(v=vs.85).aspx
+ */
+mxVmlCanvas2D.prototype.getVmlDashStyle = function()
+{
+	var result = 'dash';
+	
+	if (typeof(this.state.dashPattern) === 'string')
+	{
+		var tok = this.state.dashPattern.split(' ');
+		
+		if (tok.length > 0 && tok[0] == 1)
+		{
+			result = '0 2';
+		}
+	}
+	
+	return result;
+};
+
+/**
+ * Function: createShadow
+ * 
+ * Creates a shadow for the given node.
+ */
+mxVmlCanvas2D.prototype.createShadow = function(node, filled, stroked)
+{
+	var s = this.state;
+	var rad = -s.rotation * (Math.PI / 180);
+	var cos = Math.cos(rad);
+	var sin = Math.sin(rad);
+
+	var dx = s.shadowDx * s.scale;
+	var dy = s.shadowDy * s.scale;
+
+	if (this.root.style.flip == 'x')
+	{
+		dx *= -1;
+	}
+	else if (this.root.style.flip == 'y')
+	{
+		dy *= -1;
+	}
+	
+	var shadow = node.cloneNode(true);
+	shadow.style.marginLeft = Math.round(dx * cos - dy * sin) + 'px';
+	shadow.style.marginTop = Math.round(dx * sin + dy * cos) + 'px';
+
+	// Workaround for wrong cloning in IE8 standards mode
+	if (document.documentMode == 8)
+	{
+		shadow.strokeweight = node.strokeweight;
+		
+		if (node.nodeName == 'shape')
+		{
+			shadow.path = this.path.join(' ') + ' e';
+			shadow.style.width = this.root.style.width;
+			shadow.style.height = this.root.style.height;
+			shadow.coordsize = parseInt(node.style.width) + ' ' + parseInt(node.style.height);
+		}
+	}
+	
+	if (stroked)
+	{
+		shadow.strokecolor = s.shadowColor;
+		shadow.appendChild(this.createShadowStroke());
+	}
+	else
+	{
+		shadow.stroked = 'false';
+	}
+	
+	if (filled)
+	{
+		shadow.appendChild(this.createShadowFill());
+	}
+	else
+	{
+		shadow.filled = 'false';
+	}
+	
+	return shadow;
+};
+
+/**
+ * Function: createShadowFill
+ * 
+ * Creates the fill for the shadow.
+ */
+mxVmlCanvas2D.prototype.createShadowFill = function()
+{
+	var fill = this.createVmlElement('fill');
+	fill.color = this.state.shadowColor;
+	fill.opacity = (this.state.alpha * this.state.shadowAlpha * 100) + '%';
+	
+	return fill;
+};
+
+/**
+ * Function: createShadowStroke
+ * 
+ * Creates the stroke for the shadow.
+ */
+mxVmlCanvas2D.prototype.createShadowStroke = function()
+{
+	var stroke = this.createStroke();
+	stroke.opacity = (this.state.alpha * this.state.shadowAlpha * 100) + '%';
+	
+	return stroke;
+};
+
+/**
+ * Function: rotate
+ * 
+ * Sets the rotation of the canvas. Note that rotation cannot be concatenated.
+ */
+mxVmlCanvas2D.prototype.rotate = function(theta, flipH, flipV, cx, cy)
+{
+	if (flipH && flipV)
+	{
+		theta += 180;
+	}
+	else if (flipH)
+	{
+		this.root.style.flip = 'x';
+	}
+	else if (flipV)
+	{
+		this.root.style.flip = 'y';
+	}
+
+	if (flipH ? !flipV : flipV)
+	{
+		theta *= -1;
+	}
+
+	this.root.style.rotation = theta;
+	this.state.rotation = this.state.rotation + theta;
+	this.state.rotationCx = cx;
+	this.state.rotationCy = cy;
+};
+
+/**
+ * Function: begin
+ * 
+ * Extends superclass to create path.
+ */
+mxVmlCanvas2D.prototype.begin = function()
+{
+	mxAbstractCanvas2D.prototype.begin.apply(this, arguments);
+	this.node = this.createVmlElement('shape');
+	this.node.style.position = 'absolute';
+};
+
+/**
+ * Function: quadTo
+ * 
+ * Replaces quadratic curve with bezier curve in VML.
+ */
+mxVmlCanvas2D.prototype.quadTo = function(x1, y1, x2, y2)
+{
+	var s = this.state;
+
+	var cpx0 = (this.lastX + s.dx) * s.scale;
+	var cpy0 = (this.lastY + s.dy) * s.scale;
+	var qpx1 = (x1 + s.dx) * s.scale;
+	var qpy1 = (y1 + s.dy) * s.scale;
+	var cpx3 = (x2 + s.dx) * s.scale;
+	var cpy3 = (y2 + s.dy) * s.scale;
+	
+	var cpx1 = cpx0 + 2/3 * (qpx1 - cpx0);
+	var cpy1 = cpy0 + 2/3 * (qpy1 - cpy0);
+	
+	var cpx2 = cpx3 + 2/3 * (qpx1 - cpx3);
+	var cpy2 = cpy3 + 2/3 * (qpy1 - cpy3);
+	
+	this.path.push('c ' + this.format(cpx1) + ' ' + this.format(cpy1) +
+			' ' + this.format(cpx2) + ' ' + this.format(cpy2) +
+			' ' + this.format(cpx3) + ' ' + this.format(cpy3));
+	this.lastX = (cpx3 / s.scale) - s.dx;
+	this.lastY = (cpy3 / s.scale) - s.dy;
+	
+};
+
+/**
+ * Function: createRect
+ * 
+ * Sets the glass gradient.
+ */
+mxVmlCanvas2D.prototype.createRect = function(nodeName, x, y, w, h)
+{
+	var s = this.state;
+	var n = this.createVmlElement(nodeName);
+	n.style.position = 'absolute';
+	n.style.left = this.format((x + s.dx) * s.scale) + 'px';
+	n.style.top = this.format((y + s.dy) * s.scale) + 'px';
+	n.style.width = this.format(w * s.scale) + 'px';
+	n.style.height = this.format(h * s.scale) + 'px';
+	
+	return n;
+};
+
+/**
+ * Function: rect
+ * 
+ * Sets the current path to a rectangle.
+ */
+mxVmlCanvas2D.prototype.rect = function(x, y, w, h)
+{
+	this.node = this.createRect('rect', x, y, w, h);
+};
+
+/**
+ * Function: roundrect
+ * 
+ * Sets the current path to a rounded rectangle.
+ */
+mxVmlCanvas2D.prototype.roundrect = function(x, y, w, h, dx, dy)
+{
+	this.node = this.createRect('roundrect', x, y, w, h);
+	// SetAttribute needed here for IE8
+	this.node.setAttribute('arcsize', Math.max(dx * 100 / w, dy * 100 / h) + '%');
+};
+
+/**
+ * Function: ellipse
+ * 
+ * Sets the current path to an ellipse.
+ */
+mxVmlCanvas2D.prototype.ellipse = function(x, y, w, h)
+{
+	this.node = this.createRect('oval', x, y, w, h);
+};
+
+/**
+ * Function: image
+ * 
+ * Paints an image.
+ */
+mxVmlCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV)
+{
+	var node = null;
+	
+	if (!aspect)
+	{
+		node = this.createRect('image', x, y, w, h);
+		node.src = src;
+	}
+	else
+	{
+		// Uses fill with aspect to avoid asynchronous update of size
+		node = this.createRect('rect', x, y, w, h);
+		node.stroked = 'false';
+		
+		// Handles image aspect via fill
+		var fill = this.createVmlElement('fill');
+		fill.aspect = (aspect) ? 'atmost' : 'ignore';
+		fill.rotate = 'true';
+		fill.type = 'frame';
+		fill.src = src;
+
+		node.appendChild(fill);
+	}
+	
+	if (flipH && flipV)
+	{
+		node.style.rotation = '180';
+	}
+	else if (flipH)
+	{
+		node.style.flip = 'x';
+	}
+	else if (flipV)
+	{
+		node.style.flip = 'y';
+	}
+	
+	if (this.state.alpha < 1 || this.state.fillAlpha < 1)
+	{
+		// KNOWN: Borders around transparent images in IE<9. Using fill.opacity
+		// fixes this problem by adding a white background in all IE versions.
+		node.style.filter += 'alpha(opacity=' + (this.state.alpha * this.state.fillAlpha * 100) + ')';
+	}
+
+	this.root.appendChild(node);
+};
+
+/**
+ * Function: createText
+ * 
+ * Creates the innermost element that contains the HTML text.
+ */
+mxVmlCanvas2D.prototype.createDiv = function(str, align, valign, overflow)
+{
+	var div = this.createElement('div');
+	var state = this.state;
+
+	var css = '';
+	
+	if (state.fontBackgroundColor != null)
+	{
+		css += 'background-color:' + mxUtils.htmlEntities(state.fontBackgroundColor) + ';';
+	}
+	
+	if (state.fontBorderColor != null)
+	{
+		css += 'border:1px solid ' + mxUtils.htmlEntities(state.fontBorderColor) + ';';
+	}
+	
+	if (mxUtils.isNode(str))
+	{
+		div.appendChild(str);
+	}
+	else
+	{
+		if (overflow != 'fill' && overflow != 'width')
+		{
+			var div2 = this.createElement('div');
+			div2.style.cssText = css;
+			div2.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
+			div2.style.zoom = '1';
+			div2.style.textDecoration = 'inherit';
+			div2.innerHTML = str;
+			div.appendChild(div2);
+		}
+		else
+		{
+			div.style.cssText = css;
+			div.innerHTML = str;
+		}
+	}
+	
+	var style = div.style;
+
+	style.fontSize = (state.fontSize / this.vmlScale) + 'px';
+	style.fontFamily = state.fontFamily;
+	style.color = state.fontColor;
+	style.verticalAlign = 'top';
+	style.textAlign = align || 'left';
+	style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? (state.fontSize * mxConstants.LINE_HEIGHT / this.vmlScale) + 'px' : mxConstants.LINE_HEIGHT;
+
+	if ((state.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
+	{
+		style.fontWeight = 'bold';
+	}
+
+	if ((state.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
+	{
+		style.fontStyle = 'italic';
+	}
+	
+	if ((state.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
+	{
+		style.textDecoration = 'underline';
+	}
+	
+	return div;
+};
+
+/**
+ * Function: text
+ * 
+ * Paints the given text. Possible values for format are empty string for plain
+ * text and html for HTML markup. Clipping, text background and border are not
+ * supported for plain text in VML.
+ */
+mxVmlCanvas2D.prototype.text = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir)
+{
+	if (this.textEnabled && str != null)
+	{
+		var s = this.state;
+		
+		if (format == 'html')
+		{
+			if (s.rotation != null)
+			{
+				var pt = this.rotatePoint(x, y, s.rotation, s.rotationCx, s.rotationCy);
+				
+				x = pt.x;
+				y = pt.y;
+			}
+
+			if (document.documentMode == 8 && !mxClient.IS_EM)
+			{
+				x += s.dx;
+				y += s.dy;
+				
+				// Workaround for rendering offsets
+				if (overflow != 'fill' && valign == mxConstants.ALIGN_TOP)
+				{
+					y -= 1;
+				}
+			}
+			else
+			{
+				x *= s.scale;
+				y *= s.scale;
+			}
+
+			// Adds event transparency in IE8 standards without the transparent background
+			// filter which cannot be used due to bugs in the zoomed bounding box (too slow)
+			// FIXME: No event transparency if inside v:rect (ie part of shape)
+			// KNOWN: Offset wrong for rotated text with word that are longer than the wrapping
+			// width in IE8 because real width of text cannot be determined here.
+			// This should be fixed in mxText.updateBoundingBox by calling before this and
+			// passing the real width to this method if not clipped and wrapped.
+			var abs = (document.documentMode == 8 && !mxClient.IS_EM) ? this.createVmlElement('group') : this.createElement('div');
+			abs.style.position = 'absolute';
+			abs.style.display = 'inline';
+			abs.style.left = this.format(x) + 'px';
+			abs.style.top = this.format(y) + 'px';
+			abs.style.zoom = s.scale;
+
+			var box = this.createElement('div');
+			box.style.position = 'relative';
+			box.style.display = 'inline';
+			
+			var margin = mxUtils.getAlignmentAsPoint(align, valign);
+			var dx = margin.x;
+			var dy = margin.y;
+
+			var div = this.createDiv(str, align, valign, overflow);
+			var inner = this.createElement('div');
+			
+			if (dir != null)
+			{
+				div.setAttribute('dir', dir);
+			}
+
+			if (wrap && w > 0)
+			{
+				if (!clip)
+				{
+					div.style.width = Math.round(w) + 'px';
+				}
+				
+				div.style.wordWrap = mxConstants.WORD_WRAP;
+				div.style.whiteSpace = 'normal';
+				
+				// LATER: Check if other cases need to be handled
+				if (div.style.wordWrap == 'break-word')
+				{
+					var tmp = div;
+					
+					if (tmp.firstChild != null && tmp.firstChild.nodeName == 'DIV')
+					{
+						tmp.firstChild.style.width = '100%';
+					}
+				}
+			}
+			else
+			{
+				div.style.whiteSpace = 'nowrap';
+			}
+			
+			var rot = s.rotation + (rotation || 0);
+			
+			if (this.rotateHtml && rot != 0)
+			{
+				inner.style.display = 'inline';
+				inner.style.zoom = '1';
+				inner.appendChild(div);
+
+				// Box not needed for rendering in IE8 standards
+				if (document.documentMode == 8 && !mxClient.IS_EM && this.root.nodeName != 'DIV')
+				{
+					box.appendChild(inner);
+					abs.appendChild(box);
+				}
+				else
+				{
+					abs.appendChild(inner);
+				}
+			}
+			else if (document.documentMode == 8 && !mxClient.IS_EM)
+			{
+				box.appendChild(div);
+				abs.appendChild(box);
+			}
+			else
+			{
+				div.style.display = 'inline';
+				abs.appendChild(div);
+			}
+			
+			// Inserts the node into the DOM
+			if (this.root.nodeName != 'DIV')
+			{
+				// Rectangle to fix position in group
+				var rect = this.createVmlElement('rect');
+				rect.stroked = 'false';
+				rect.filled = 'false';
+
+				rect.appendChild(abs);
+				this.root.appendChild(rect);
+			}
+			else
+			{
+				this.root.appendChild(abs);
+			}
+			
+			if (clip)
+			{
+				div.style.overflow = 'hidden';
+				div.style.width = Math.round(w) + 'px';
+				
+				if (!mxClient.IS_QUIRKS)
+				{
+					div.style.maxHeight = Math.round(h) + 'px';
+				}
+			}
+			else if (overflow == 'fill')
+			{
+				// KNOWN: Affects horizontal alignment in quirks
+				// but fill should only be used with align=left
+				div.style.overflow = 'hidden';
+				div.style.width = (Math.max(0, w) + 1) + 'px';
+				div.style.height = (Math.max(0, h) + 1) + 'px';
+			}
+			else if (overflow == 'width')
+			{
+				// KNOWN: Affects horizontal alignment in quirks
+				// but fill should only be used with align=left
+				div.style.overflow = 'hidden';
+				div.style.width = (Math.max(0, w) + 1) + 'px';
+				div.style.maxHeight = (Math.max(0, h) + 1) + 'px';
+			}
+			
+			if (this.rotateHtml && rot != 0)
+			{
+				var rad = rot * (Math.PI / 180);
+				
+				// Precalculate cos and sin for the rotation
+				var real_cos = parseFloat(parseFloat(Math.cos(rad)).toFixed(8));
+				var real_sin = parseFloat(parseFloat(Math.sin(-rad)).toFixed(8));
+
+				rad %= 2 * Math.PI;
+				if (rad < 0) rad += 2 * Math.PI;
+				rad %= Math.PI;
+				if (rad > Math.PI / 2) rad = Math.PI - rad;
+				
+				var cos = Math.cos(rad);
+				var sin = Math.sin(rad);
+
+				// Adds div to document to measure size
+				if (document.documentMode == 8 && !mxClient.IS_EM)
+				{
+					div.style.display = 'inline-block';
+					inner.style.display = 'inline-block';
+					box.style.display = 'inline-block';
+				}
+				
+				div.style.visibility = 'hidden';
+				div.style.position = 'absolute';
+				document.body.appendChild(div);
+				
+				var sizeDiv = div;
+				
+				if (sizeDiv.firstChild != null && sizeDiv.firstChild.nodeName == 'DIV')
+				{
+					sizeDiv = sizeDiv.firstChild;
+				}
+				
+				var tmp = sizeDiv.offsetWidth + 3;
+				var oh = sizeDiv.offsetHeight;
+				
+				if (clip)
+				{
+					w = Math.min(w, tmp);
+					oh = Math.min(oh, h);
+				}
+				else
+				{
+					w = tmp;
+				}
+
+				// Handles words that are longer than the given wrapping width
+				if (wrap)
+				{
+					div.style.width = w + 'px';
+				}
+				
+				// Simulates max-height in quirks
+				if (mxClient.IS_QUIRKS && (clip || overflow == 'width') && oh > h)
+				{
+					oh = h;
+					
+					// Quirks does not support maxHeight
+					div.style.height = oh + 'px';
+				}
+				
+				h = oh;
+
+				var top_fix = (h - h * cos + w * -sin) / 2 - real_sin * w * (dx + 0.5) + real_cos * h * (dy + 0.5);
+				var left_fix = (w - w * cos + h * -sin) / 2 + real_cos * w * (dx + 0.5) + real_sin * h * (dy + 0.5);
+
+				if (abs.nodeName == 'group' && this.root.nodeName == 'DIV')
+				{
+					// Workaround for bug where group gets moved away if left and top are non-zero in IE8 standards
+					var pos = this.createElement('div');
+					pos.style.display = 'inline-block';
+					pos.style.position = 'absolute';
+					pos.style.left = this.format(x + (left_fix - w / 2) * s.scale) + 'px';
+					pos.style.top = this.format(y + (top_fix - h / 2) * s.scale) + 'px';
+					
+					abs.parentNode.appendChild(pos);
+					pos.appendChild(abs);
+				}
+				else
+				{
+					var sc = (document.documentMode == 8 && !mxClient.IS_EM) ? 1 : s.scale;
+					
+					abs.style.left = this.format(x + (left_fix - w / 2) * sc) + 'px';
+					abs.style.top = this.format(y + (top_fix - h / 2) * sc) + 'px';
+				}
+				
+				// KNOWN: Rotated text rendering quality is bad for IE9 quirks
+				inner.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+real_cos+", M12="+
+					real_sin+", M21="+(-real_sin)+", M22="+real_cos+", sizingMethod='auto expand')";
+				inner.style.backgroundColor = this.rotatedHtmlBackground;
+				
+				if (this.state.alpha < 1)
+				{
+					inner.style.filter += 'alpha(opacity=' + (this.state.alpha * 100) + ')';
+				}
+
+				// Restore parent node for DIV
+				inner.appendChild(div);
+				div.style.position = '';
+				div.style.visibility = '';
+			}
+			else if (document.documentMode != 8 || mxClient.IS_EM)
+			{
+				div.style.verticalAlign = 'top';
+				
+				if (this.state.alpha < 1)
+				{
+					abs.style.filter = 'alpha(opacity=' + (this.state.alpha * 100) + ')';
+				}
+				
+				// Adds div to document to measure size
+				var divParent = div.parentNode;
+				div.style.visibility = 'hidden';
+				document.body.appendChild(div);
+				
+				w = div.offsetWidth;
+				var oh = div.offsetHeight;
+				
+				// Simulates max-height in quirks
+				if (mxClient.IS_QUIRKS && clip && oh > h)
+				{
+					oh = h;
+					
+					// Quirks does not support maxHeight
+					div.style.height = oh + 'px';
+				}
+				
+				h = oh;
+				
+				div.style.visibility = '';
+				divParent.appendChild(div);
+				
+				abs.style.left = this.format(x + w * dx * this.state.scale) + 'px';
+				abs.style.top = this.format(y + h * dy * this.state.scale) + 'px';
+			}
+			else
+			{
+				if (this.state.alpha < 1)
+				{
+					div.style.filter = 'alpha(opacity=' + (this.state.alpha * 100) + ')';
+				}
+				
+				// Faster rendering in IE8 without offsetWidth/Height
+				box.style.left = (dx * 100) + '%';
+				box.style.top = (dy * 100) + '%';
+			}
+		}
+		else
+		{
+			this.plainText(x, y, w, h, mxUtils.htmlEntities(str, false), align, valign, wrap, format, overflow, clip, rotation, dir);
+		}
+	}
+};
+
+/**
+ * Function: plainText
+ * 
+ * Paints the outline of the current path.
+ */
+mxVmlCanvas2D.prototype.plainText = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir)
+{
+	// TextDirection is ignored since this code is not used (format is always HTML in the text function)
+	var s = this.state;
+	x = (x + s.dx) * s.scale;
+	y = (y + s.dy) * s.scale;
+	
+	var node = this.createVmlElement('shape');
+	node.style.width = '1px';
+	node.style.height = '1px';
+	node.stroked = 'false';
+
+	var fill = this.createVmlElement('fill');
+	fill.color = s.fontColor;
+	fill.opacity = (s.alpha * 100) + '%';
+	node.appendChild(fill);
+	
+	var path = this.createVmlElement('path');
+	path.textpathok = 'true';
+	path.v = 'm ' + this.format(0) + ' ' + this.format(0) + ' l ' + this.format(1) + ' ' + this.format(0);
+	
+	node.appendChild(path);
+	
+	// KNOWN: Font family and text decoration ignored
+	var tp = this.createVmlElement('textpath');
+	tp.style.cssText = 'v-text-align:' + align;
+	tp.style.align = align;
+	tp.style.fontFamily = s.fontFamily;
+	tp.string = str;
+	tp.on = 'true';
+	
+	// Scale via fontsize instead of node.style.zoom for correct offsets in IE8
+	var size = s.fontSize * s.scale / this.vmlScale;
+	tp.style.fontSize = size + 'px';
+	
+	// Bold
+	if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
+	{
+		tp.style.fontWeight = 'bold';
+	}
+	
+	// Italic
+	if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
+	{
+		tp.style.fontStyle = 'italic';
+	}
+
+	// Underline
+	if ((s.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
+	{
+		tp.style.textDecoration = 'underline';
+	}
+
+	var lines = str.split('\n');
+	var textHeight = size + (lines.length - 1) * size * mxConstants.LINE_HEIGHT;
+	var dx = 0;
+	var dy = 0;
+
+	if (valign == mxConstants.ALIGN_BOTTOM)
+	{
+		dy = - textHeight / 2;
+	}
+	else if (valign != mxConstants.ALIGN_MIDDLE) // top
+	{
+		dy = textHeight / 2;
+	}
+
+	if (rotation != null)
+	{
+		node.style.rotation = rotation;
+		var rad = rotation * (Math.PI / 180);
+		dx = Math.sin(rad) * dy;
+		dy = Math.cos(rad) * dy;
+	}
+
+	// FIXME: Clipping is relative to bounding box
+	/*if (clip)
+	{
+		node.style.clip = 'rect(0px ' + this.format(w) + 'px ' + this.format(h) + 'px 0px)';
+	}*/
+	
+	node.appendChild(tp);
+	node.style.left = this.format(x - dx) + 'px';
+	node.style.top = this.format(y + dy) + 'px';
+	
+	this.root.appendChild(node);
+};
+
+/**
+ * Function: stroke
+ * 
+ * Paints the outline of the current path.
+ */
+mxVmlCanvas2D.prototype.stroke = function()
+{
+	this.addNode(false, true);
+};
+
+/**
+ * Function: fill
+ * 
+ * Fills the current path.
+ */
+mxVmlCanvas2D.prototype.fill = function()
+{
+	this.addNode(true, false);
+};
+
+/**
+ * Function: fillAndStroke
+ * 
+ * Fills and paints the outline of the current path.
+ */
+mxVmlCanvas2D.prototype.fillAndStroke = function()
+{
+	this.addNode(true, true);
+};
diff --git a/public/js/grapheditor/src/js/util/mxWindow.js b/public/js/grapheditor/src/js/util/mxWindow.js
new file mode 100644
index 000000000..6ea7b5f3c
--- /dev/null
+++ b/public/js/grapheditor/src/js/util/mxWindow.js
@@ -0,0 +1,1132 @@
+/**
+ * Copyright (c) 2006-2015, JGraph Ltd
+ * Copyright (c) 2006-2015, Gaudenz Alder
+ */
+/**
+ * Class: mxWindow
+ * 
+ * Basic window inside a document.
+ * 
+ * Examples:
+ * 
+ * Creating a simple window.
+ *
+ * (code)
+ * var tb = document.createElement('div');
+ * var wnd = new mxWindow('Title', tb, 100, 100, 200, 200, true, true);
+ * wnd.setVisible(true); 
+ * (end)
+ *
+ * Creating a window that contains an iframe. 
+ * 
+ * (code)
+ * var frame = document.createElement('iframe');
+ * frame.setAttribute('width', '192px');
+ * frame.setAttribute('height', '172px');
+ * frame.setAttribute('src', 'http://www.example.com/');
+ * frame.style.backgroundColor = 'white';
+ * 
+ * var w = document.body.clientWidth;
+ * var h = (document.body.clientHeight || document.documentElement.clientHeight);
+ * var wnd = new mxWindow('Title', frame, (w-200)/2, (h-200)/3, 200, 200);
+ * wnd.setVisible(true);
+ * (end)
+ * 
+ * To limit the movement of a window, eg. to keep it from being moved beyond
+ * the top, left corner the following method can be overridden (recommended):
+ * 
+ * (code)
+ * wnd.setLocation = function(x, y)
+ * {
+ *   x = Math.max(0, x);
+ *   y = Math.max(0, y);
+ *   mxWindow.prototype.setLocation.apply(this, arguments);
+ * };
+ * (end)
+ * 
+ * Or the following event handler can be used:
+ * 
+ * (code)
+ * wnd.addListener(mxEvent.MOVE, function(e)
+ * {
+ *   wnd.setLocation(Math.max(0, wnd.getX()), Math.max(0, wnd.getY()));
+ * });
+ * (end)
+ * 
+ * To keep a window inside the current window:
+ * 
+ * (code)
+ * mxEvent.addListener(window, 'resize', mxUtils.bind(this, function()
+ * {
+ *   var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
+ *   var ih = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
+ *   
+ *   var x = this.window.getX();
+ *   var y = this.window.getY();
+ *   
+ *   if (x + this.window.table.clientWidth > iw)
+ *   {
+ *     x = Math.max(0, iw - this.window.table.clientWidth);
+ *   }
+ *   
+ *   if (y + this.window.table.clientHeight > ih)
+ *   {
+ *     y = Math.max(0, ih - this.window.table.clientHeight);
+ *   }
+ *   
+ *   if (this.window.getX() != x || this.window.getY() != y)
+ *   {
+ *     this.window.setLocation(x, y);
+ *   }
+ * }));
+ * (end)
+ *
+ * Event: mxEvent.MOVE_START
+ *
+ * Fires before the window is moved. The event property contains
+ * the corresponding mouse event.
+ *
+ * Event: mxEvent.MOVE
+ *
+ * Fires while the window is being moved. The event property
+ * contains the corresponding mouse event.
+ *
+ * Event: mxEvent.MOVE_END
+ *
+ * Fires after the window is moved. The event property contains
+ * the corresponding mouse event.
+ *
+ * Event: mxEvent.RESIZE_START
+ *
+ * Fires before the window is resized. The event property contains
+ * the corresponding mouse event.
+ *
+ * Event: mxEvent.RESIZE
+ *
+ * Fires while the window is being resized. The event property
+ * contains the corresponding mouse event.
+ *
+ * Event: mxEvent.RESIZE_END
+ *
+ * Fires after the window is resized. The event property contains
+ * the corresponding mouse event.
+ *
+ * Event: mxEvent.MAXIMIZE
+ * 
+ * Fires after the window is maximized. The event property
+ * contains the corresponding mouse event.
+ * 
+ * Event: mxEvent.MINIMIZE
+ * 
+ * Fires after the window is minimized. The event property
+ * contains the corresponding mouse event.
+ * 
+ * Event: mxEvent.NORMALIZE
+ * 
+ * Fires after the window is normalized, that is, it returned from
+ * maximized or minimized state. The event property contains the
+ * corresponding mouse event.
+ *  
+ * Event: mxEvent.ACTIVATE
+ * 
+ * Fires after a window is activated. The previousWindow property
+ * contains the previous window. The event sender is the active window.
+ * 
+ * Event: mxEvent.SHOW
+ * 
+ * Fires after the window is shown. This event has no properties.
+ * 
+ * Event: mxEvent.HIDE
+ * 
+ * Fires after the window is hidden. This event has no properties.
+ * 
+ * Event: mxEvent.CLOSE
+ * 
+ * Fires before the window is closed. The event property contains
+ * the corresponding mouse event.
+ * 
+ * Event: mxEvent.DESTROY
+ * 
+ * Fires before the window is destroyed. This event has no properties.
+ * 
+ * Constructor: mxWindow
+ * 
+ * Constructs a new window with the given dimension and title to display
+ * the specified content. The window elements use the given style as a
+ * prefix for the classnames of the respective window elements, namely,
+ * the window title and window pane. The respective postfixes are appended
+ * to the given stylename as follows:
+ * 
+ *   style - Base style for the window.
+ *   style+Title - Style for the window title.
+ *   style+Pane - Style for the window pane.
+ * 
+ * The default value for style is mxWindow, resulting in the following
+ * classnames for the window elements: mxWindow, mxWindowTitle and
+ * mxWindowPane.
+ * 
+ * If replaceNode is given then the window replaces the given DOM node in
+ * the document.
+ * 
+ * Parameters:
+ * 
+ * title - String that represents the title of the new window.
+ * content - DOM node that is used as the window content.
+ * x - X-coordinate of the window location.
+ * y - Y-coordinate of the window location.
+ * width - Width of the window.
+ * height - Optional height of the window. Default is to match the height
+ * of the content at the specified width.
+ * minimizable - Optional boolean indicating if the window is minimizable.
+ * Default is true.
+ * movable - Optional boolean indicating if the window is movable. Default
+ * is true.
+ * replaceNode - Optional DOM node that the window should replace.
+ * style - Optional base classname for the window elements. Default is
+ * mxWindow.
+ */
+function mxWindow(title, content, x, y, width, height, minimizable, movable, replaceNode, style)
+{
+	if (content != null)
+	{
+		minimizable = (minimizable != null) ? minimizable : true;
+		this.content = content;
+		this.init(x, y, width, height, style);
+		
+		this.installMaximizeHandler();
+		this.installMinimizeHandler();
+		this.installCloseHandler();
+		this.setMinimizable(minimizable);
+		this.setTitle(title);
+		
+		if (movable == null || movable)
+		{
+			this.installMoveHandler();
+		}
+
+		if (replaceNode != null && replaceNode.parentNode != null)
+		{
+			replaceNode.parentNode.replaceChild(this.div, replaceNode);
+		}
+		else
+		{
+			document.body.appendChild(this.div);
+		}
+	}
+};
+
+/**
+ * Extends mxEventSource.
+ */
+mxWindow.prototype = new mxEventSource();
+mxWindow.prototype.constructor = mxWindow;
+
+/**
+ * Variable: closeImage
+ * 
+ * URL of the image to be used for the close icon in the titlebar.
+ */
+mxWindow.prototype.closeImage = mxClient.imageBasePath + '/close.gif';
+
+/**
+ * Variable: minimizeImage
+ * 
+ * URL of the image to be used for the minimize icon in the titlebar.
+ */
+mxWindow.prototype.minimizeImage = mxClient.imageBasePath + '/minimize.gif';
+	
+/**
+ * Variable: normalizeImage
+ * 
+ * URL of the image to be used for the normalize icon in the titlebar.
+ */
+mxWindow.prototype.normalizeImage = mxClient.imageBasePath + '/normalize.gif';
+	
+/**
+ * Variable: maximizeImage
+ * 
+ * URL of the image to be used for the maximize icon in the titlebar.
+ */
+mxWindow.prototype.maximizeImage = mxClient.imageBasePath + '/maximize.gif';
+
+/**
+ * Variable: normalizeImage
+ * 
+ * URL of the image to be used for the resize icon.
+ */
+mxWindow.prototype.resizeImage = mxClient.imageBasePath + '/resize.gif';
+
+/**
+ * Variable: visible
+ * 
+ * Boolean flag that represents the visible state of the window.
+ */
+mxWindow.prototype.visible = false;
+
+/**
+ * Variable: minimumSize
+ * 
+ *  that specifies the minimum width and height of the window.
+ * Default is (50, 40).
+ */
+mxWindow.prototype.minimumSize = new mxRectangle(0, 0, 50, 40);
+
+/**
+ * Variable: destroyOnClose
+ * 
+ * Specifies if the window should be destroyed when it is closed. If this
+ * is false then the window is hidden using . Default is true.
+ */
+mxWindow.prototype.destroyOnClose = true;
+
+/**
+ * Variable: contentHeightCorrection
+ * 
+ * Defines the correction factor for computing the height of the contentWrapper.
+ * Default is 6 for IE 7/8 standards mode and 2 for all other browsers and modes.
+ */
+mxWindow.prototype.contentHeightCorrection = (document.documentMode == 8 || document.documentMode == 7) ? 6 : 2;
+
+/**
+ * Variable: title
+ * 
+ * Reference to the DOM node (TD) that contains the title.
+ */
+mxWindow.prototype.title = null;
+
+/**
+ * Variable: content
+ * 
+ * Reference to the DOM node that represents the window content.
+ */
+mxWindow.prototype.content = null;
+
+/**
+ * Function: init
+ * 
+ * Initializes the DOM tree that represents the window.
+ */
+mxWindow.prototype.init = function(x, y, width, height, style)
+{
+	style = (style != null) ? style : 'mxWindow';
+	
+	this.div = document.createElement('div');
+	this.div.className = style;
+
+	this.div.style.left = x + 'px';
+	this.div.style.top = y + 'px';
+	this.table = document.createElement('table');
+	this.table.className = style;
+
+	// Disables built-in pan and zoom in IE10 and later
+	if (mxClient.IS_POINTER)
+	{
+		this.div.style.touchAction = 'none';
+	}
+	
+	// Workaround for table size problems in FF
+	if (width != null)
+	{
+		if (!mxClient.IS_QUIRKS)
+		{
+			this.div.style.width = width + 'px'; 
+		}
+		
+		this.table.style.width = width + 'px';
+	} 
+	
+	if (height != null)
+	{
+		if (!mxClient.IS_QUIRKS)
+		{
+			this.div.style.height = height + 'px';
+		}
+		
+		this.table.style.height = height + 'px';
+	}		
+	
+	// Creates title row
+	var tbody = document.createElement('tbody');
+	var tr = document.createElement('tr');
+	
+	this.title = document.createElement('td');
+	this.title.className = style + 'Title';
+	
+	this.buttons = document.createElement('div');
+	this.buttons.style.position = 'absolute';
+	this.buttons.style.display = 'inline-block';
+	this.buttons.style.right = '4px';
+	this.buttons.style.top = '5px';
+	this.title.appendChild(this.buttons);
+	
+	tr.appendChild(this.title);
+	tbody.appendChild(tr);
+	
+	// Creates content row and table cell
+	tr = document.createElement('tr');
+	this.td = document.createElement('td');
+	this.td.className = style + 'Pane';
+	
+	if (document.documentMode == 7)
+	{
+		this.td.style.height = '100%';
+	}
+
+	this.contentWrapper = document.createElement('div');
+	this.contentWrapper.className = style + 'Pane';
+	this.contentWrapper.style.width = '100%';
+	this.contentWrapper.appendChild(this.content);
+
+	// Workaround for div around div restricts height
+	// of inner div if outerdiv has hidden overflow
+	if (mxClient.IS_QUIRKS || this.content.nodeName.toUpperCase() != 'DIV')
+	{
+		this.contentWrapper.style.height = '100%';
+	}
+
+	// Puts all content into the DOM
+	this.td.appendChild(this.contentWrapper);
+	tr.appendChild(this.td);
+	tbody.appendChild(tr);
+	this.table.appendChild(tbody);
+	this.div.appendChild(this.table);
+	
+	// Puts the window on top of other windows when clicked
+	var activator = mxUtils.bind(this, function(evt)
+	{
+		this.activate();
+	});
+	
+	mxEvent.addGestureListeners(this.title, activator);
+	mxEvent.addGestureListeners(this.table, activator);
+
+	this.hide();
+};
+
+/**
+ * Function: setTitle
+ * 
+ * Sets the window title to the given string. HTML markup inside the title
+ * will be escaped.
+ */
+mxWindow.prototype.setTitle = function(title)
+{
+	// Removes all text content nodes (normally just one)
+	var child = this.title.firstChild;
+	
+	while (child != null)
+	{
+		var next = child.nextSibling;
+		
+		if (child.nodeType == mxConstants.NODETYPE_TEXT)
+		{
+			child.parentNode.removeChild(child);
+		}
+		
+		child = next;
+	}
+	
+	mxUtils.write(this.title, title || '');
+	this.title.appendChild(this.buttons);
+};
+
+/**
+ * Function: setScrollable
+ * 
+ * Sets if the window contents should be scrollable.
+ */
+mxWindow.prototype.setScrollable = function(scrollable)
+{
+	// Workaround for hang in Presto 2.5.22 (Opera 10.5)
+	if (navigator.userAgent == null ||
+		navigator.userAgent.indexOf('Presto/2.5') < 0)
+	{
+		if (scrollable)
+		{
+			this.contentWrapper.style.overflow = 'auto';
+		}
+		else
+		{
+			this.contentWrapper.style.overflow = 'hidden';
+		}
+	}
+};
+
+/**
+ * Function: activate
+ * 
+ * Puts the window on top of all other windows.
+ */
+mxWindow.prototype.activate = function()
+{
+	if (mxWindow.activeWindow != this)
+	{
+		var style = mxUtils.getCurrentStyle(this.getElement());
+		var index = (style != null) ? style.zIndex : 3;
+
+		if (mxWindow.activeWindow)
+		{
+			var elt = mxWindow.activeWindow.getElement();
+			
+			if (elt != null && elt.style != null)
+			{
+				elt.style.zIndex = index;
+			}
+		}
+		
+		var previousWindow = mxWindow.activeWindow;
+		this.getElement().style.zIndex = parseInt(index) + 1;
+		mxWindow.activeWindow = this;
+		
+		this.fireEvent(new mxEventObject(mxEvent.ACTIVATE, 'previousWindow', previousWindow));
+	}
+};
+
+/**
+ * Function: getElement
+ * 
+ * Returuns the outermost DOM node that makes up the window.
+ */
+mxWindow.prototype.getElement = function()
+{
+	return this.div;
+};
+
+/**
+ * Function: fit
+ * 
+ * Makes sure the window is inside the client area of the window.
+ */
+mxWindow.prototype.fit = function()
+{
+	mxUtils.fit(this.div);
+};
+
+/**
+ * Function: isResizable
+ * 
+ * Returns true if the window is resizable.
+ */
+mxWindow.prototype.isResizable = function()
+{
+	if (this.resize != null)
+	{
+		return this.resize.style.display != 'none';
+	}
+	
+	return false;
+};
+
+/**
+ * Function: setResizable
+ * 
+ * Sets if the window should be resizable. To avoid interference with some
+ * built-in features of IE10 and later, the use of the following code is
+ * recommended if there are resizable s in the page:
+ * 
+ * (code)
+ * if (mxClient.IS_POINTER)
+ * {
+ *   document.body.style.msTouchAction = 'none';
+ * }
+ * (end)
+ */
+mxWindow.prototype.setResizable = function(resizable)
+{
+	if (resizable)
+	{
+		if (this.resize == null)
+		{
+			this.resize = document.createElement('img');
+			this.resize.style.position = 'absolute';
+			this.resize.style.bottom = '2px';
+			this.resize.style.right = '2px';
+
+			this.resize.setAttribute('src', this.resizeImage);
+			this.resize.style.cursor = 'nw-resize';
+			
+			var startX = null;
+			var startY = null;
+			var width = null;
+			var height = null;
+			
+			var start = mxUtils.bind(this, function(evt)
+			{
+				// LATER: pointerdown starting on border of resize does start
+				// the drag operation but does not fire consecutive events via
+				// one of the listeners below (does pan instead).
+				// Workaround: document.body.style.msTouchAction = 'none'
+				this.activate();
+				startX = mxEvent.getClientX(evt);
+				startY = mxEvent.getClientY(evt);
+				width = this.div.offsetWidth;
+				height = this.div.offsetHeight;
+				
+				mxEvent.addGestureListeners(document, null, dragHandler, dropHandler);
+				this.fireEvent(new mxEventObject(mxEvent.RESIZE_START, 'event', evt));
+				mxEvent.consume(evt);
+			});
+
+			// Adds a temporary pair of listeners to intercept
+			// the gesture event in the document
+			var dragHandler = mxUtils.bind(this, function(evt)
+			{
+				if (startX != null && startY != null)
+				{
+					var dx = mxEvent.getClientX(evt) - startX;
+					var dy = mxEvent.getClientY(evt) - startY;
+	
+					this.setSize(width + dx, height + dy);
+	
+					this.fireEvent(new mxEventObject(mxEvent.RESIZE, 'event', evt));
+					mxEvent.consume(evt);
+				}
+			});
+			
+			var dropHandler = mxUtils.bind(this, function(evt)
+			{
+				if (startX != null && startY != null)
+				{
+					startX = null;
+					startY = null;
+					mxEvent.removeGestureListeners(document, null, dragHandler, dropHandler);
+					this.fireEvent(new mxEventObject(mxEvent.RESIZE_END, 'event', evt));
+					mxEvent.consume(evt);
+				}
+			});
+			
+			mxEvent.addGestureListeners(this.resize, start, dragHandler, dropHandler);
+			this.div.appendChild(this.resize);
+		}
+		else 
+		{
+			this.resize.style.display = 'inline';
+		}
+	}
+	else if (this.resize != null)
+	{
+		this.resize.style.display = 'none';
+	}
+};
+	
+/**
+ * Function: setSize
+ * 
+ * Sets the size of the window.
+ */
+mxWindow.prototype.setSize = function(width, height)
+{
+	width = Math.max(this.minimumSize.width, width);
+	height = Math.max(this.minimumSize.height, height);
+
+	// Workaround for table size problems in FF
+	if (!mxClient.IS_QUIRKS)
+	{
+		this.div.style.width =  width + 'px';
+		this.div.style.height = height + 'px';
+	}
+	
+	this.table.style.width =  width + 'px';
+	this.table.style.height = height + 'px';
+
+	if (!mxClient.IS_QUIRKS)
+	{
+		this.contentWrapper.style.height = (this.div.offsetHeight -
+			this.title.offsetHeight - this.contentHeightCorrection) + 'px';
+	}
+};
+	
+/**
+ * Function: setMinimizable
+ * 
+ * Sets if the window is minimizable.
+ */
+mxWindow.prototype.setMinimizable = function(minimizable)
+{
+	this.minimize.style.display = (minimizable) ? '' : 'none';
+};
+
+/**
+ * Function: getMinimumSize
+ * 
+ * Returns an  that specifies the size for the minimized window.
+ * A width or height of 0 means keep the existing width or height. This
+ * implementation returns the height of the window title and keeps the width.
+ */
+mxWindow.prototype.getMinimumSize = function()
+{
+	return new mxRectangle(0, 0, 0, this.title.offsetHeight);
+};
+
+/**
+ * Function: installMinimizeHandler
+ * 
+ * Installs the event listeners required for minimizing the window.
+ */
+mxWindow.prototype.installMinimizeHandler = function()
+{
+	this.minimize = document.createElement('img');
+	
+	this.minimize.setAttribute('src', this.minimizeImage);
+	this.minimize.setAttribute('title', 'Minimize');
+	this.minimize.style.cursor = 'pointer';
+	this.minimize.style.marginLeft = '2px';
+	this.minimize.style.display = 'none';
+	
+	this.buttons.appendChild(this.minimize);
+	
+	var minimized = false;
+	var maxDisplay = null;
+	var height = null;
+
+	var funct = mxUtils.bind(this, function(evt)
+	{
+		this.activate();
+		
+		if (!minimized)
+		{
+			minimized = true;
+			
+			this.minimize.setAttribute('src', this.normalizeImage);
+			this.minimize.setAttribute('title', 'Normalize');
+			this.contentWrapper.style.display = 'none';
+			maxDisplay = this.maximize.style.display;
+			
+			this.maximize.style.display = 'none';
+			height = this.table.style.height;
+			
+			var minSize = this.getMinimumSize();
+			
+			if (minSize.height > 0)
+			{
+				if (!mxClient.IS_QUIRKS)
+				{
+					this.div.style.height = minSize.height + 'px';
+				}
+				
+				this.table.style.height = minSize.height + 'px';
+			}
+			
+			if (minSize.width > 0)
+			{
+				if (!mxClient.IS_QUIRKS)
+				{
+					this.div.style.width = minSize.width + 'px';
+				}
+				
+				this.table.style.width = minSize.width + 'px';
+			}
+			
+			if (this.resize != null)
+			{
+				this.resize.style.visibility = 'hidden';
+			}
+			
+			this.fireEvent(new mxEventObject(mxEvent.MINIMIZE, 'event', evt));
+		}
+		else
+		{
+			minimized = false;
+			
+			this.minimize.setAttribute('src', this.minimizeImage);
+			this.minimize.setAttribute('title', 'Minimize');
+			this.contentWrapper.style.display = ''; // default
+			this.maximize.style.display = maxDisplay;
+			
+			if (!mxClient.IS_QUIRKS)
+			{
+				this.div.style.height = height;
+			}
+			
+			this.table.style.height = height;
+
+			if (this.resize != null)
+			{
+				this.resize.style.visibility = '';
+			}
+			
+			this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, 'event', evt));
+		}
+		
+		mxEvent.consume(evt);
+	});
+	
+	mxEvent.addGestureListeners(this.minimize, funct);
+};
+	
+/**
+ * Function: setMaximizable
+ * 
+ * Sets if the window is maximizable.
+ */
+mxWindow.prototype.setMaximizable = function(maximizable)
+{
+	this.maximize.style.display = (maximizable) ? '' : 'none';
+};
+
+/**
+ * Function: installMaximizeHandler
+ * 
+ * Installs the event listeners required for maximizing the window.
+ */
+mxWindow.prototype.installMaximizeHandler = function()
+{
+	this.maximize = document.createElement('img');
+	
+	this.maximize.setAttribute('src', this.maximizeImage);
+	this.maximize.setAttribute('title', 'Maximize');
+	this.maximize.style.cursor = 'default';
+	this.maximize.style.marginLeft = '2px';
+	this.maximize.style.cursor = 'pointer';
+	this.maximize.style.display = 'none';
+	
+	this.buttons.appendChild(this.maximize);
+	
+	var maximized = false;
+	var x = null;
+	var y = null;
+	var height = null;
+	var width = null;
+	var minDisplay = null;
+
+	var funct = mxUtils.bind(this, function(evt)
+	{
+		this.activate();
+		
+		if (this.maximize.style.display != 'none')
+		{
+			if (!maximized)
+			{
+				maximized = true;
+				
+				this.maximize.setAttribute('src', this.normalizeImage);
+				this.maximize.setAttribute('title', 'Normalize');
+				this.contentWrapper.style.display = '';
+				minDisplay = this.minimize.style.display;
+				this.minimize.style.display = 'none';
+				
+				// Saves window state
+				x = parseInt(this.div.style.left);
+				y = parseInt(this.div.style.top);
+				height = this.table.style.height;
+				width = this.table.style.width;
+
+				this.div.style.left = '0px';
+				this.div.style.top = '0px';
+				var docHeight = Math.max(document.body.clientHeight || 0, document.documentElement.clientHeight || 0);
+
+				if (!mxClient.IS_QUIRKS)
+				{
+					this.div.style.width = (document.body.clientWidth - 2) + 'px';
+					this.div.style.height = (docHeight - 2) + 'px';
+				}
+
+				this.table.style.width = (document.body.clientWidth - 2) + 'px';
+				this.table.style.height = (docHeight - 2) + 'px';
+				
+				if (this.resize != null)
+				{
+					this.resize.style.visibility = 'hidden';
+				}
+
+				if (!mxClient.IS_QUIRKS)
+				{
+					var style = mxUtils.getCurrentStyle(this.contentWrapper);
+		
+					if (style.overflow == 'auto' || this.resize != null)
+					{
+						this.contentWrapper.style.height = (this.div.offsetHeight -
+							this.title.offsetHeight - this.contentHeightCorrection) + 'px';
+					}
+				}
+
+				this.fireEvent(new mxEventObject(mxEvent.MAXIMIZE, 'event', evt));
+			}
+			else
+			{
+				maximized = false;
+				
+				this.maximize.setAttribute('src', this.maximizeImage);
+				this.maximize.setAttribute('title', 'Maximize');
+				this.contentWrapper.style.display = '';
+				this.minimize.style.display = minDisplay;
+
+				// Restores window state
+				this.div.style.left = x+'px';
+				this.div.style.top = y+'px';
+				
+				if (!mxClient.IS_QUIRKS)
+				{
+					this.div.style.height = height;
+					this.div.style.width = width;
+
+					var style = mxUtils.getCurrentStyle(this.contentWrapper);
+		
+					if (style.overflow == 'auto' || this.resize != null)
+					{
+						this.contentWrapper.style.height = (this.div.offsetHeight -
+							this.title.offsetHeight - this.contentHeightCorrection) + 'px';
+					}
+				}
+				
+				this.table.style.height = height;
+				this.table.style.width = width;
+
+				if (this.resize != null)
+				{
+					this.resize.style.visibility = '';
+				}
+				
+				this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, 'event', evt));
+			}
+			
+			mxEvent.consume(evt);
+		}
+	});
+	
+	mxEvent.addGestureListeners(this.maximize, funct);
+	mxEvent.addListener(this.title, 'dblclick', funct);
+};
+	
+/**
+ * Function: installMoveHandler
+ * 
+ * Installs the event listeners required for moving the window.
+ */
+mxWindow.prototype.installMoveHandler = function()
+{
+	this.title.style.cursor = 'move';
+	
+	mxEvent.addGestureListeners(this.title,
+		mxUtils.bind(this, function(evt)
+		{
+			var startX = mxEvent.getClientX(evt);
+			var startY = mxEvent.getClientY(evt);
+			var x = this.getX();
+			var y = this.getY();
+						
+			// Adds a temporary pair of listeners to intercept
+			// the gesture event in the document
+			var dragHandler = mxUtils.bind(this, function(evt)
+			{
+				var dx = mxEvent.getClientX(evt) - startX;
+				var dy = mxEvent.getClientY(evt) - startY;
+				this.setLocation(x + dx, y + dy);
+				this.fireEvent(new mxEventObject(mxEvent.MOVE, 'event', evt));
+				mxEvent.consume(evt);
+			});
+			
+			var dropHandler = mxUtils.bind(this, function(evt)
+			{
+				mxEvent.removeGestureListeners(document, null, dragHandler, dropHandler);
+				this.fireEvent(new mxEventObject(mxEvent.MOVE_END, 'event', evt));
+				mxEvent.consume(evt);
+			});
+			
+			mxEvent.addGestureListeners(document, null, dragHandler, dropHandler);
+			this.fireEvent(new mxEventObject(mxEvent.MOVE_START, 'event', evt));
+			mxEvent.consume(evt);
+		}));
+	
+	// Disables built-in pan and zoom in IE10 and later
+	if (mxClient.IS_POINTER)
+	{
+		this.title.style.touchAction = 'none';
+	}
+};
+
+/**
+ * Function: setLocation
+ * 
+ * Sets the upper, left corner of the window.
+ */
+ mxWindow.prototype.setLocation = function(x, y)
+ {
+	this.div.style.left = x + 'px';
+	this.div.style.top = y + 'px';
+ };
+
+/**
+ * Function: getX
+ *
+ * Returns the current position on the x-axis.
+ */
+mxWindow.prototype.getX = function()
+{
+	return parseInt(this.div.style.left);
+};
+
+/**
+ * Function: getY
+ *
+ * Returns the current position on the y-axis.
+ */
+mxWindow.prototype.getY = function()
+{
+	return parseInt(this.div.style.top);
+};
+
+/**
+ * Function: installCloseHandler
+ *
+ * Adds the  as a new image node in  and installs the
+ *  event.
+ */
+mxWindow.prototype.installCloseHandler = function()
+{
+	this.closeImg = document.createElement('img');
+	
+	this.closeImg.setAttribute('src', this.closeImage);
+	this.closeImg.setAttribute('title', 'Close');
+	this.closeImg.style.marginLeft = '2px';
+	this.closeImg.style.cursor = 'pointer';
+	this.closeImg.style.display = 'none';
+	
+	this.buttons.appendChild(this.closeImg);
+
+	mxEvent.addGestureListeners(this.closeImg,
+		mxUtils.bind(this, function(evt)
+		{
+			this.fireEvent(new mxEventObject(mxEvent.CLOSE, 'event', evt));
+			
+			if (this.destroyOnClose)
+			{
+				this.destroy();
+			}
+			else
+			{
+				this.setVisible(false);
+			}
+			
+			mxEvent.consume(evt);
+		}));
+};
+
+/**
+ * Function: setImage
+ * 
+ * Sets the image associated with the window.
+ * 
+ * Parameters:
+ * 
+ * image - URL of the image to be used.
+ */
+mxWindow.prototype.setImage = function(image)
+{
+	this.image = document.createElement('img');
+	this.image.setAttribute('src', image);
+	this.image.setAttribute('align', 'left');
+	this.image.style.marginRight = '4px';
+	this.image.style.marginLeft = '0px';
+	this.image.style.marginTop = '-2px';
+	
+	this.title.insertBefore(this.image, this.title.firstChild);
+};
+
+/**
+ * Function: setClosable
+ * 
+ * Sets the image associated with the window.
+ * 
+ * Parameters:
+ * 
+ * closable - Boolean specifying if the window should be closable.
+ */
+mxWindow.prototype.setClosable = function(closable)
+{
+	this.closeImg.style.display = (closable) ? '' : 'none';
+};
+
+/**
+ * Function: isVisible
+ * 
+ * Returns true if the window is visible.
+ */
+mxWindow.prototype.isVisible = function()
+{
+	if (this.div != null)
+	{
+		return this.div.style.display != 'none';
+	}
+	
+	return false;
+};
+
+/**
+ * Function: setVisible
+ *
+ * Shows or hides the window depending on the given flag.
+ * 
+ * Parameters:
+ * 
+ * visible - Boolean indicating if the window should be made visible.
+ */
+mxWindow.prototype.setVisible = function(visible)
+{
+	if (this.div != null && this.isVisible() != visible)
+	{
+		if (visible)
+		{
+			this.show();
+		}
+		else
+		{
+			this.hide();
+		}
+	}
+};
+
+/**
+ * Function: show
+ *
+ * Shows the window.
+ */
+mxWindow.prototype.show = function()
+{
+	this.div.style.display = '';
+	this.activate();
+	
+	var style = mxUtils.getCurrentStyle(this.contentWrapper);
+	
+	if (!mxClient.IS_QUIRKS && (style.overflow == 'auto' || this.resize != null) &&
+		this.contentWrapper.style.display != 'none')
+	{
+		this.contentWrapper.style.height = (this.div.offsetHeight -
+				this.title.offsetHeight - this.contentHeightCorrection) + 'px';
+	}
+	
+	this.fireEvent(new mxEventObject(mxEvent.SHOW));
+};
+
+/**
+ * Function: hide
+ *
+ * Hides the window.
+ */
+mxWindow.prototype.hide = function()
+{
+	this.div.style.display = 'none';
+	this.fireEvent(new mxEventObject(mxEvent.HIDE));
+};
+
+/**
+ * Function: destroy
+ *
+ * Destroys the window and removes all associated resources. Fires a
+ *  event prior to destroying the window.
+ */
+mxWindow.prototype.destroy = function()
+{
+	this.fireEvent(new mxEventObject(mxEvent.DESTROY));
+	
+	if (this.div != null)
+	{
+		mxEvent.release(this.div);
+		this.div.parentNode.removeChild(this.div);
+		this.div = null;
+	}
+	
+	this.title = null;
+	this.content = null;
+	this.contentWrapper = null;
+};
diff --git a/public/js/grapheditor/src/js/util/mxXmlCanvas2D.js b/public/js/grapheditor/src/js/util/mxXmlCanvas2D.js
new file mode 100644
index 000000000..493ead6ee
--- /dev/null
+++ b/public/js/grapheditor/src/js/util/mxXmlCanvas2D.js
@@ -0,0 +1,1217 @@
+/**
+ * Copyright (c) 2006-2015, JGraph Ltd
+ * Copyright (c) 2006-2015, Gaudenz Alder
+ */
+/**
+ * Class: mxXmlCanvas2D
+ *
+ * Base class for all canvases. The following methods make up the public
+ * interface of the canvas 2D for all painting in mxGraph:
+ * 
+ * - , 
+ * - , , 
+ * - , , , , ,
+ *   , , , , , 
+ *   , 
+ * - , , , ,
+ *   , 
+ * - , , , 
+ * - , , , , 
+ * - , , , , 
+ * - , , 
+ * 
+ *  is an additional method for drawing paths. This is
+ * a synthetic method, meaning that it is turned into a sequence of curves by
+ * default. Subclassers may add native support for arcs.
+ * 
+ * Constructor: mxXmlCanvas2D
+ *
+ * Constructs a new abstract canvas.
+ */
+function mxXmlCanvas2D(root)
+{
+	mxAbstractCanvas2D.call(this);
+
+	/**
+	 * Variable: root
+	 * 
+	 * Reference to the container for the SVG content.
+	 */
+	this.root = root;
+
+	// Writes default settings;
+	this.writeDefaults();
+};
+
+/**
+ * Extends mxAbstractCanvas2D
+ */
+mxUtils.extend(mxXmlCanvas2D, mxAbstractCanvas2D);
+
+/**
+ * Variable: textEnabled
+ * 
+ * Specifies if text output should be enabled. Default is true.
+ */
+mxXmlCanvas2D.prototype.textEnabled = true;
+
+/**
+ * Variable: compressed
+ * 
+ * Specifies if the output should be compressed by removing redundant calls.
+ * Default is true.
+ */
+mxXmlCanvas2D.prototype.compressed = true;
+
+/**
+ * Function: writeDefaults
+ * 
+ * Writes the rendering defaults to :
+ */
+mxXmlCanvas2D.prototype.writeDefaults = function()
+{
+	var elem;
+	
+	// Writes font defaults
+	elem = this.createElement('fontfamily');
+	elem.setAttribute('family', mxConstants.DEFAULT_FONTFAMILY);
+	this.root.appendChild(elem);
+	
+	elem = this.createElement('fontsize');
+	elem.setAttribute('size', mxConstants.DEFAULT_FONTSIZE);
+	this.root.appendChild(elem);
+	
+	// Writes shadow defaults
+	elem = this.createElement('shadowcolor');
+	elem.setAttribute('color', mxConstants.SHADOWCOLOR);
+	this.root.appendChild(elem);
+	
+	elem = this.createElement('shadowalpha');
+	elem.setAttribute('alpha', mxConstants.SHADOW_OPACITY);
+	this.root.appendChild(elem);
+	
+	elem = this.createElement('shadowoffset');
+	elem.setAttribute('dx', mxConstants.SHADOW_OFFSET_X);
+	elem.setAttribute('dy', mxConstants.SHADOW_OFFSET_Y);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: format
+ * 
+ * Returns a formatted number with 2 decimal places.
+ */
+mxXmlCanvas2D.prototype.format = function(value)
+{
+	return parseFloat(parseFloat(value).toFixed(2));
+};
+
+/**
+ * Function: createElement
+ * 
+ * Creates the given element using the owner document of .
+ */
+mxXmlCanvas2D.prototype.createElement = function(name)
+{
+	return this.root.ownerDocument.createElement(name);
+};
+
+/**
+ * Function: save
+ * 
+ * Saves the drawing state.
+ */
+mxXmlCanvas2D.prototype.save = function()
+{
+	if (this.compressed)
+	{
+		mxAbstractCanvas2D.prototype.save.apply(this, arguments);
+	}
+	
+	this.root.appendChild(this.createElement('save'));
+};
+
+/**
+ * Function: restore
+ * 
+ * Restores the drawing state.
+ */
+mxXmlCanvas2D.prototype.restore = function()
+{
+	if (this.compressed)
+	{
+		mxAbstractCanvas2D.prototype.restore.apply(this, arguments);
+	}
+	
+	this.root.appendChild(this.createElement('restore'));
+};
+
+/**
+ * Function: scale
+ * 
+ * Scales the output.
+ * 
+ * Parameters:
+ * 
+ * scale - Number that represents the scale where 1 is equal to 100%.
+ */
+mxXmlCanvas2D.prototype.scale = function(value)
+{
+        var elem = this.createElement('scale');
+        elem.setAttribute('scale', value);
+        this.root.appendChild(elem);
+};
+
+/**
+ * Function: translate
+ * 
+ * Translates the output.
+ * 
+ * Parameters:
+ * 
+ * dx - Number that specifies the horizontal translation.
+ * dy - Number that specifies the vertical translation.
+ */
+mxXmlCanvas2D.prototype.translate = function(dx, dy)
+{
+	var elem = this.createElement('translate');
+	elem.setAttribute('dx', this.format(dx));
+	elem.setAttribute('dy', this.format(dy));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: rotate
+ * 
+ * Rotates and/or flips the output around a given center. (Note: Due to
+ * limitations in VML, the rotation cannot be concatenated.)
+ * 
+ * Parameters:
+ * 
+ * theta - Number that represents the angle of the rotation (in degrees).
+ * flipH - Boolean indicating if the output should be flipped horizontally.
+ * flipV - Boolean indicating if the output should be flipped vertically.
+ * cx - Number that represents the x-coordinate of the rotation center.
+ * cy - Number that represents the y-coordinate of the rotation center.
+ */
+mxXmlCanvas2D.prototype.rotate = function(theta, flipH, flipV, cx, cy)
+{
+	var elem = this.createElement('rotate');
+	
+	if (theta != 0 || flipH || flipV)
+	{
+		elem.setAttribute('theta', this.format(theta));
+		elem.setAttribute('flipH', (flipH) ? '1' : '0');
+		elem.setAttribute('flipV', (flipV) ? '1' : '0');
+		elem.setAttribute('cx', this.format(cx));
+		elem.setAttribute('cy', this.format(cy));
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setAlpha
+ * 
+ * Sets the current alpha.
+ * 
+ * Parameters:
+ * 
+ * value - Number that represents the new alpha. Possible values are between
+ * 1 (opaque) and 0 (transparent).
+ */
+mxXmlCanvas2D.prototype.setAlpha = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.alpha == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setAlpha.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('alpha');
+	elem.setAttribute('alpha', this.format(value));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setFillAlpha
+ * 
+ * Sets the current fill alpha.
+ * 
+ * Parameters:
+ * 
+ * value - Number that represents the new fill alpha. Possible values are between
+ * 1 (opaque) and 0 (transparent).
+ */
+mxXmlCanvas2D.prototype.setFillAlpha = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.fillAlpha == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setFillAlpha.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('fillalpha');
+	elem.setAttribute('alpha', this.format(value));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setStrokeAlpha
+ * 
+ * Sets the current stroke alpha.
+ * 
+ * Parameters:
+ * 
+ * value - Number that represents the new stroke alpha. Possible values are between
+ * 1 (opaque) and 0 (transparent).
+ */
+mxXmlCanvas2D.prototype.setStrokeAlpha = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.strokeAlpha == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setStrokeAlpha.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('strokealpha');
+	elem.setAttribute('alpha', this.format(value));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setFillColor
+ * 
+ * Sets the current fill color.
+ * 
+ * Parameters:
+ * 
+ * value - Hexadecimal representation of the color or 'none'.
+ */
+mxXmlCanvas2D.prototype.setFillColor = function(value)
+{
+	if (value == mxConstants.NONE)
+	{
+		value = null;
+	}
+	
+	if (this.compressed)
+	{
+		if (this.state.fillColor == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setFillColor.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('fillcolor');
+	elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setGradient
+ * 
+ * Sets the gradient. Note that the coordinates may be ignored by some implementations.
+ * 
+ * Parameters:
+ * 
+ * color1 - Hexadecimal representation of the start color.
+ * color2 - Hexadecimal representation of the end color.
+ * x - X-coordinate of the gradient region.
+ * y - y-coordinate of the gradient region.
+ * w - Width of the gradient region.
+ * h - Height of the gradient region.
+ * direction - One of , ,
+ *  or .
+ * alpha1 - Optional alpha of the start color. Default is 1. Possible values
+ * are between 1 (opaque) and 0 (transparent).
+ * alpha2 - Optional alpha of the end color. Default is 1. Possible values
+ * are between 1 (opaque) and 0 (transparent).
+ */
+mxXmlCanvas2D.prototype.setGradient = function(color1, color2, x, y, w, h, direction, alpha1, alpha2)
+{
+	if (color1 != null && color2 != null)
+	{
+		mxAbstractCanvas2D.prototype.setGradient.apply(this, arguments);
+		
+		var elem = this.createElement('gradient');
+		elem.setAttribute('c1', color1);
+		elem.setAttribute('c2', color2);
+		elem.setAttribute('x', this.format(x));
+		elem.setAttribute('y', this.format(y));
+		elem.setAttribute('w', this.format(w));
+		elem.setAttribute('h', this.format(h));
+		
+		// Default direction is south
+		if (direction != null)
+		{
+			elem.setAttribute('direction', direction);
+		}
+		
+		if (alpha1 != null)
+		{
+			elem.setAttribute('alpha1', alpha1);
+		}
+		
+		if (alpha2 != null)
+		{
+			elem.setAttribute('alpha2', alpha2);
+		}
+		
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setStrokeColor
+ * 
+ * Sets the current stroke color.
+ * 
+ * Parameters:
+ * 
+ * value - Hexadecimal representation of the color or 'none'.
+ */
+mxXmlCanvas2D.prototype.setStrokeColor = function(value)
+{
+	if (value == mxConstants.NONE)
+	{
+		value = null;
+	}
+	
+	if (this.compressed)
+	{
+		if (this.state.strokeColor == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setStrokeColor.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('strokecolor');
+	elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setStrokeWidth
+ * 
+ * Sets the current stroke width.
+ * 
+ * Parameters:
+ * 
+ * value - Numeric representation of the stroke width.
+ */
+mxXmlCanvas2D.prototype.setStrokeWidth = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.strokeWidth == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setStrokeWidth.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('strokewidth');
+	elem.setAttribute('width', this.format(value));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setDashed
+ * 
+ * Enables or disables dashed lines.
+ * 
+ * Parameters:
+ * 
+ * value - Boolean that specifies if dashed lines should be enabled.
+ * value - Boolean that specifies if the stroke width should be ignored
+ * for the dash pattern. Default is false.
+ */
+mxXmlCanvas2D.prototype.setDashed = function(value, fixDash)
+{
+	if (this.compressed)
+	{
+		if (this.state.dashed == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setDashed.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('dashed');
+	elem.setAttribute('dashed', (value) ? '1' : '0');
+	
+	if (fixDash != null)
+	{
+		elem.setAttribute('fixDash', (fixDash) ? '1' : '0');
+	}
+	
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setDashPattern
+ * 
+ * Sets the current dash pattern. Default is '3 3'.
+ * 
+ * Parameters:
+ * 
+ * value - String that represents the dash pattern, which is a sequence of
+ * numbers defining the length of the dashes and the length of the spaces
+ * between the dashes. The lengths are relative to the line width - a length
+ * of 1 is equals to the line width.
+ */
+mxXmlCanvas2D.prototype.setDashPattern = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.dashPattern == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setDashPattern.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('dashpattern');
+	elem.setAttribute('pattern', value);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setLineCap
+ * 
+ * Sets the line cap. Default is 'flat' which corresponds to 'butt' in SVG.
+ * 
+ * Parameters:
+ * 
+ * value - String that represents the line cap. Possible values are flat, round
+ * and square.
+ */
+mxXmlCanvas2D.prototype.setLineCap = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.lineCap == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setLineCap.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('linecap');
+	elem.setAttribute('cap', value);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setLineJoin
+ * 
+ * Sets the line join. Default is 'miter'.
+ * 
+ * Parameters:
+ * 
+ * value - String that represents the line join. Possible values are miter,
+ * round and bevel.
+ */
+mxXmlCanvas2D.prototype.setLineJoin = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.lineJoin == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setLineJoin.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('linejoin');
+	elem.setAttribute('join', value);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setMiterLimit
+ * 
+ * Sets the miter limit. Default is 10.
+ * 
+ * Parameters:
+ * 
+ * value - Number that represents the miter limit.
+ */
+mxXmlCanvas2D.prototype.setMiterLimit = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.miterLimit == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setMiterLimit.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('miterlimit');
+	elem.setAttribute('limit', value);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setFontColor
+ * 
+ * Sets the current font color. Default is '#000000'.
+ * 
+ * Parameters:
+ * 
+ * value - Hexadecimal representation of the color or 'none'.
+ */
+mxXmlCanvas2D.prototype.setFontColor = function(value)
+{
+	if (this.textEnabled)
+	{
+		if (value == mxConstants.NONE)
+		{
+			value = null;
+		}
+		
+		if (this.compressed)
+		{
+			if (this.state.fontColor == value)
+			{
+				return;
+			}
+			
+			mxAbstractCanvas2D.prototype.setFontColor.apply(this, arguments);
+		}
+		
+		var elem = this.createElement('fontcolor');
+		elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setFontBackgroundColor
+ * 
+ * Sets the current font background color.
+ * 
+ * Parameters:
+ * 
+ * value - Hexadecimal representation of the color or 'none'.
+ */
+mxXmlCanvas2D.prototype.setFontBackgroundColor = function(value)
+{
+	if (this.textEnabled)
+	{
+		if (value == mxConstants.NONE)
+		{
+			value = null;
+		}
+		
+		if (this.compressed)
+		{
+			if (this.state.fontBackgroundColor == value)
+			{
+				return;
+			}
+			
+			mxAbstractCanvas2D.prototype.setFontBackgroundColor.apply(this, arguments);
+		}
+
+		var elem = this.createElement('fontbackgroundcolor');
+		elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setFontBorderColor
+ * 
+ * Sets the current font border color.
+ * 
+ * Parameters:
+ * 
+ * value - Hexadecimal representation of the color or 'none'.
+ */
+mxXmlCanvas2D.prototype.setFontBorderColor = function(value)
+{
+	if (this.textEnabled)
+	{
+		if (value == mxConstants.NONE)
+		{
+			value = null;
+		}
+		
+		if (this.compressed)
+		{
+			if (this.state.fontBorderColor == value)
+			{
+				return;
+			}
+			
+			mxAbstractCanvas2D.prototype.setFontBorderColor.apply(this, arguments);
+		}
+		
+		var elem = this.createElement('fontbordercolor');
+		elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setFontSize
+ * 
+ * Sets the current font size. Default is .
+ * 
+ * Parameters:
+ * 
+ * value - Numeric representation of the font size.
+ */
+mxXmlCanvas2D.prototype.setFontSize = function(value)
+{
+	if (this.textEnabled)
+	{
+		if (this.compressed)
+		{
+			if (this.state.fontSize == value)
+			{
+				return;
+			}
+			
+			mxAbstractCanvas2D.prototype.setFontSize.apply(this, arguments);
+		}
+		
+		var elem = this.createElement('fontsize');
+		elem.setAttribute('size', value);
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setFontFamily
+ * 
+ * Sets the current font family. Default is .
+ * 
+ * Parameters:
+ * 
+ * value - String representation of the font family. This handles the same
+ * values as the CSS font-family property.
+ */
+mxXmlCanvas2D.prototype.setFontFamily = function(value)
+{
+	if (this.textEnabled)
+	{
+		if (this.compressed)
+		{
+			if (this.state.fontFamily == value)
+			{
+				return;
+			}
+			
+			mxAbstractCanvas2D.prototype.setFontFamily.apply(this, arguments);
+		}
+		
+		var elem = this.createElement('fontfamily');
+		elem.setAttribute('family', value);
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setFontStyle
+ * 
+ * Sets the current font style.
+ * 
+ * Parameters:
+ * 
+ * value - Numeric representation of the font family. This is the sum of the
+ * font styles from .
+ */
+mxXmlCanvas2D.prototype.setFontStyle = function(value)
+{
+	if (this.textEnabled)
+	{
+		if (value == null)
+		{
+			value = 0;
+		}
+		
+		if (this.compressed)
+		{
+			if (this.state.fontStyle == value)
+			{
+				return;
+			}
+			
+			mxAbstractCanvas2D.prototype.setFontStyle.apply(this, arguments);
+		}
+		
+		var elem = this.createElement('fontstyle');
+		elem.setAttribute('style', value);
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: setShadow
+ * 
+ * Enables or disables shadows.
+ * 
+ * Parameters:
+ * 
+ * value - Boolean that specifies if shadows should be enabled.
+ */
+mxXmlCanvas2D.prototype.setShadow = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.shadow == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setShadow.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('shadow');
+	elem.setAttribute('enabled', (value) ? '1' : '0');
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setShadowColor
+ * 
+ * Sets the current shadow color. Default is .
+ * 
+ * Parameters:
+ * 
+ * value - Hexadecimal representation of the color or 'none'.
+ */
+mxXmlCanvas2D.prototype.setShadowColor = function(value)
+{
+	if (this.compressed)
+	{
+		if (value == mxConstants.NONE)
+		{
+			value = null;
+		}
+		
+		if (this.state.shadowColor == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setShadowColor.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('shadowcolor');
+	elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: setShadowAlpha
+ * 
+ * Sets the current shadows alpha. Default is .
+ * 
+ * Parameters:
+ * 
+ * value - Number that represents the new alpha. Possible values are between
+ * 1 (opaque) and 0 (transparent).
+ */
+mxXmlCanvas2D.prototype.setShadowAlpha = function(value)
+{
+	if (this.compressed)
+	{
+		if (this.state.shadowAlpha == value)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setShadowAlpha.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('shadowalpha');
+	elem.setAttribute('alpha', value);
+	this.root.appendChild(elem);
+	
+};
+
+/**
+ * Function: setShadowOffset
+ * 
+ * Sets the current shadow offset.
+ * 
+ * Parameters:
+ * 
+ * dx - Number that represents the horizontal offset of the shadow.
+ * dy - Number that represents the vertical offset of the shadow.
+ */
+mxXmlCanvas2D.prototype.setShadowOffset = function(dx, dy)
+{
+	if (this.compressed)
+	{
+		if (this.state.shadowDx == dx && this.state.shadowDy == dy)
+		{
+			return;
+		}
+		
+		mxAbstractCanvas2D.prototype.setShadowOffset.apply(this, arguments);
+	}
+	
+	var elem = this.createElement('shadowoffset');
+	elem.setAttribute('dx', dx);
+	elem.setAttribute('dy', dy);
+	this.root.appendChild(elem);
+	
+};
+
+/**
+ * Function: rect
+ * 
+ * Puts a rectangle into the drawing buffer.
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the rectangle.
+ * y - Number that represents the y-coordinate of the rectangle.
+ * w - Number that represents the width of the rectangle.
+ * h - Number that represents the height of the rectangle.
+ */
+mxXmlCanvas2D.prototype.rect = function(x, y, w, h)
+{
+	var elem = this.createElement('rect');
+	elem.setAttribute('x', this.format(x));
+	elem.setAttribute('y', this.format(y));
+	elem.setAttribute('w', this.format(w));
+	elem.setAttribute('h', this.format(h));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: roundrect
+ * 
+ * Puts a rounded rectangle into the drawing buffer.
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the rectangle.
+ * y - Number that represents the y-coordinate of the rectangle.
+ * w - Number that represents the width of the rectangle.
+ * h - Number that represents the height of the rectangle.
+ * dx - Number that represents the horizontal rounding.
+ * dy - Number that represents the vertical rounding.
+ */
+mxXmlCanvas2D.prototype.roundrect = function(x, y, w, h, dx, dy)
+{
+	var elem = this.createElement('roundrect');
+	elem.setAttribute('x', this.format(x));
+	elem.setAttribute('y', this.format(y));
+	elem.setAttribute('w', this.format(w));
+	elem.setAttribute('h', this.format(h));
+	elem.setAttribute('dx', this.format(dx));
+	elem.setAttribute('dy', this.format(dy));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: ellipse
+ * 
+ * Puts an ellipse into the drawing buffer.
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the ellipse.
+ * y - Number that represents the y-coordinate of the ellipse.
+ * w - Number that represents the width of the ellipse.
+ * h - Number that represents the height of the ellipse.
+ */
+mxXmlCanvas2D.prototype.ellipse = function(x, y, w, h)
+{
+	var elem = this.createElement('ellipse');
+	elem.setAttribute('x', this.format(x));
+	elem.setAttribute('y', this.format(y));
+	elem.setAttribute('w', this.format(w));
+	elem.setAttribute('h', this.format(h));
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: image
+ * 
+ * Paints an image.
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the image.
+ * y - Number that represents the y-coordinate of the image.
+ * w - Number that represents the width of the image.
+ * h - Number that represents the height of the image.
+ * src - String that specifies the URL of the image.
+ * aspect - Boolean indicating if the aspect of the image should be preserved.
+ * flipH - Boolean indicating if the image should be flipped horizontally.
+ * flipV - Boolean indicating if the image should be flipped vertically.
+ */
+mxXmlCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV)
+{
+	src = this.converter.convert(src);
+	
+	// LATER: Add option for embedding images as base64.
+	var elem = this.createElement('image');
+	elem.setAttribute('x', this.format(x));
+	elem.setAttribute('y', this.format(y));
+	elem.setAttribute('w', this.format(w));
+	elem.setAttribute('h', this.format(h));
+	elem.setAttribute('src', src);
+	elem.setAttribute('aspect', (aspect) ? '1' : '0');
+	elem.setAttribute('flipH', (flipH) ? '1' : '0');
+	elem.setAttribute('flipV', (flipV) ? '1' : '0');
+	this.root.appendChild(elem);
+};
+
+/**
+ * Function: begin
+ * 
+ * Starts a new path and puts it into the drawing buffer.
+ */
+mxXmlCanvas2D.prototype.begin = function()
+{
+	this.root.appendChild(this.createElement('begin'));
+	this.lastX = 0;
+	this.lastY = 0;
+};
+
+/**
+ * Function: moveTo
+ * 
+ * Moves the current path the given point.
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the point.
+ * y - Number that represents the y-coordinate of the point.
+ */
+mxXmlCanvas2D.prototype.moveTo = function(x, y)
+{
+	var elem = this.createElement('move');
+	elem.setAttribute('x', this.format(x));
+	elem.setAttribute('y', this.format(y));
+	this.root.appendChild(elem);
+	this.lastX = x;
+	this.lastY = y;
+};
+
+/**
+ * Function: lineTo
+ * 
+ * Draws a line to the given coordinates.
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the endpoint.
+ * y - Number that represents the y-coordinate of the endpoint.
+ */
+mxXmlCanvas2D.prototype.lineTo = function(x, y)
+{
+	var elem = this.createElement('line');
+	elem.setAttribute('x', this.format(x));
+	elem.setAttribute('y', this.format(y));
+	this.root.appendChild(elem);
+	this.lastX = x;
+	this.lastY = y;
+};
+
+/**
+ * Function: quadTo
+ * 
+ * Adds a quadratic curve to the current path.
+ * 
+ * Parameters:
+ * 
+ * x1 - Number that represents the x-coordinate of the control point.
+ * y1 - Number that represents the y-coordinate of the control point.
+ * x2 - Number that represents the x-coordinate of the endpoint.
+ * y2 - Number that represents the y-coordinate of the endpoint.
+ */
+mxXmlCanvas2D.prototype.quadTo = function(x1, y1, x2, y2)
+{
+	var elem = this.createElement('quad');
+	elem.setAttribute('x1', this.format(x1));
+	elem.setAttribute('y1', this.format(y1));
+	elem.setAttribute('x2', this.format(x2));
+	elem.setAttribute('y2', this.format(y2));
+	this.root.appendChild(elem);
+	this.lastX = x2;
+	this.lastY = y2;
+};
+
+/**
+ * Function: curveTo
+ * 
+ * Adds a bezier curve to the current path.
+ * 
+ * Parameters:
+ * 
+ * x1 - Number that represents the x-coordinate of the first control point.
+ * y1 - Number that represents the y-coordinate of the first control point.
+ * x2 - Number that represents the x-coordinate of the second control point.
+ * y2 - Number that represents the y-coordinate of the second control point.
+ * x3 - Number that represents the x-coordinate of the endpoint.
+ * y3 - Number that represents the y-coordinate of the endpoint.
+ */
+mxXmlCanvas2D.prototype.curveTo = function(x1, y1, x2, y2, x3, y3)
+{
+	var elem = this.createElement('curve');
+	elem.setAttribute('x1', this.format(x1));
+	elem.setAttribute('y1', this.format(y1));
+	elem.setAttribute('x2', this.format(x2));
+	elem.setAttribute('y2', this.format(y2));
+	elem.setAttribute('x3', this.format(x3));
+	elem.setAttribute('y3', this.format(y3));
+	this.root.appendChild(elem);
+	this.lastX = x3;
+	this.lastY = y3;
+};
+
+/**
+ * Function: close
+ * 
+ * Closes the current path.
+ */
+mxXmlCanvas2D.prototype.close = function()
+{
+	this.root.appendChild(this.createElement('close'));
+};
+
+/**
+ * Function: text
+ * 
+ * Paints the given text. Possible values for format are empty string for
+ * plain text and html for HTML markup. Background and border color as well
+ * as clipping is not available in plain text labels for VML. HTML labels
+ * are not available as part of shapes with no foreignObject support in SVG
+ * (eg. IE9, IE10).
+ * 
+ * Parameters:
+ * 
+ * x - Number that represents the x-coordinate of the text.
+ * y - Number that represents the y-coordinate of the text.
+ * w - Number that represents the available width for the text or 0 for automatic width.
+ * h - Number that represents the available height for the text or 0 for automatic height.
+ * str - String that specifies the text to be painted.
+ * align - String that represents the horizontal alignment.
+ * valign - String that represents the vertical alignment.
+ * wrap - Boolean that specifies if word-wrapping is enabled. Requires w > 0.
+ * format - Empty string for plain text or 'html' for HTML markup.
+ * overflow - Specifies the overflow behaviour of the label. Requires w > 0 and/or h > 0.
+ * clip - Boolean that specifies if the label should be clipped. Requires w > 0 and/or h > 0.
+ * rotation - Number that specifies the angle of the rotation around the anchor point of the text.
+ * dir - Optional string that specifies the text direction. Possible values are rtl and lrt.
+ */
+mxXmlCanvas2D.prototype.text = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir)
+{
+	if (this.textEnabled && str != null)
+	{
+		if (mxUtils.isNode(str))
+		{
+			str = mxUtils.getOuterHtml(str);
+		}
+		
+		var elem = this.createElement('text');
+		elem.setAttribute('x', this.format(x));
+		elem.setAttribute('y', this.format(y));
+		elem.setAttribute('w', this.format(w));
+		elem.setAttribute('h', this.format(h));
+		elem.setAttribute('str', str);
+		
+		if (align != null)
+		{
+			elem.setAttribute('align', align);
+		}
+		
+		if (valign != null)
+		{
+			elem.setAttribute('valign', valign);
+		}
+		
+		elem.setAttribute('wrap', (wrap) ? '1' : '0');
+		
+		if (format == null)
+		{
+			format = '';
+		}
+		
+		elem.setAttribute('format', format);
+		
+		if (overflow != null)
+		{
+			elem.setAttribute('overflow', overflow);
+		}
+		
+		if (clip != null)
+		{
+			elem.setAttribute('clip', (clip) ? '1' : '0');
+		}
+		
+		if (rotation != null)
+		{
+			elem.setAttribute('rotation', rotation);
+		}
+		
+		if (dir != null)
+		{
+			elem.setAttribute('dir', dir);
+		}
+		
+		this.root.appendChild(elem);
+	}
+};
+
+/**
+ * Function: stroke
+ * 
+ * Paints the outline of the current drawing buffer.
+ */
+mxXmlCanvas2D.prototype.stroke = function()
+{
+	this.root.appendChild(this.createElement('stroke'));
+};
+
+/**
+ * Function: fill
+ * 
+ * Fills the current drawing buffer.
+ */
+mxXmlCanvas2D.prototype.fill = function()
+{
+	this.root.appendChild(this.createElement('fill'));
+};
+
+/**
+ * Function: fillAndStroke
+ * 
+ * Fills the current drawing buffer and its outline.
+ */
+mxXmlCanvas2D.prototype.fillAndStroke = function()
+{
+	this.root.appendChild(this.createElement('fillstroke'));
+};
diff --git a/public/js/grapheditor/src/js/util/mxXmlRequest.js b/public/js/grapheditor/src/js/util/mxXmlRequest.js
new file mode 100644
index 000000000..201cf345e
--- /dev/null
+++ b/public/js/grapheditor/src/js/util/mxXmlRequest.js
@@ -0,0 +1,465 @@
+/**
+ * Copyright (c) 2006-2020, JGraph Ltd
+ * Copyright (c) 2006-2020, draw.io AG
+ */
+/**
+ * Class: mxXmlRequest
+ * 
+ * XML HTTP request wrapper. See also: ,  and
+ * . This class provides a cross-browser abstraction for Ajax
+ * requests.
+ * 
+ * Encoding:
+ * 
+ * For encoding parameter values, the built-in encodeURIComponent JavaScript
+ * method must be used. For automatic encoding of post data in  the
+ *  switch can be set to true (default). The encoding
+ * will be carried out using the conte type of the page. That is, the page
+ * containting the editor should contain a meta tag in the header, eg.
+ * 
+ * 
+ * Example:
+ * 
+ * (code)
+ * var onload = function(req)
+ * {
+ *   mxUtils.alert(req.getDocumentElement());
+ * }
+ * 
+ * var onerror = function(req)
+ * {
+ *   mxUtils.alert('Error');
+ * }
+ * new mxXmlRequest(url, 'key=value').send(onload, onerror);
+ * (end)
+ * 
+ * Sends an asynchronous POST request to the specified URL.
+ * 
+ * Example:
+ * 
+ * (code)
+ * var req = new mxXmlRequest(url, 'key=value', 'POST', false);
+ * req.send();
+ * mxUtils.alert(req.getDocumentElement());
+ * (end)
+ * 
+ * Sends a synchronous POST request to the specified URL.
+ * 
+ * Example:
+ * 
+ * (code)
+ * var encoder = new mxCodec();
+ * var result = encoder.encode(graph.getModel());
+ * var xml = encodeURIComponent(mxUtils.getXml(result));
+ * new mxXmlRequest(url, 'xml='+xml).send();
+ * (end)
+ * 
+ * Sends an encoded graph model to the specified URL using xml as the
+ * parameter name. The parameter can then be retrieved in C# as follows:
+ * 
+ * (code)
+ * string xml = HttpUtility.UrlDecode(context.Request.Params["xml"]);
+ * (end)
+ * 
+ * Or in Java as follows:
+ * 
+ * (code)
+ * String xml = URLDecoder.decode(request.getParameter("xml"), "UTF-8").replace("\n", "
");
+ * (end)
+ *
+ * Note that the linefeeds should only be replaced if the XML is
+ * processed in Java, for example when creating an image.
+ * 
+ * Constructor: mxXmlRequest
+ * 
+ * Constructs an XML HTTP request.
+ * 
+ * Parameters:
+ * 
+ * url - Target URL of the request.
+ * params - Form encoded parameters to send with a POST request.
+ * method - String that specifies the request method. Possible values are
+ * POST and GET. Default is POST.
+ * async - Boolean specifying if an asynchronous request should be used.
+ * Default is true.
+ * username - String specifying the username to be used for the request.
+ * password - String specifying the password to be used for the request.
+ */
+function mxXmlRequest(url, params, method, async, username, password)
+{
+	this.url = url;
+	this.params = params;
+	this.method = method || 'POST';
+	this.async = (async != null) ? async : true;
+	this.username = username;
+	this.password = password;
+};
+
+/**
+ * Variable: url
+ * 
+ * Holds the target URL of the request.
+ */
+mxXmlRequest.prototype.url = null;
+
+/**
+ * Variable: params
+ * 
+ * Holds the form encoded data for the POST request.
+ */
+mxXmlRequest.prototype.params = null;
+
+/**
+ * Variable: method
+ * 
+ * Specifies the request method. Possible values are POST and GET. Default
+ * is POST.
+ */
+mxXmlRequest.prototype.method = null;
+
+/**
+ * Variable: async
+ * 
+ * Boolean indicating if the request is asynchronous.
+ */
+mxXmlRequest.prototype.async = null;
+
+/**
+ * Variable: binary
+ * 
+ * Boolean indicating if the request is binary. This option is ignored in IE.
+ * In all other browsers the requested mime type is set to
+ * text/plain; charset=x-user-defined. Default is false.
+ */
+mxXmlRequest.prototype.binary = false;
+
+/**
+ * Variable: withCredentials
+ * 
+ * Specifies if withCredentials should be used in HTML5-compliant browsers. Default is
+ * false.
+ */
+mxXmlRequest.prototype.withCredentials = false;
+
+/**
+ * Variable: username
+ * 
+ * Specifies the username to be used for authentication.
+ */
+mxXmlRequest.prototype.username = null;
+
+/**
+ * Variable: password
+ * 
+ * Specifies the password to be used for authentication.
+ */
+mxXmlRequest.prototype.password = null;
+
+/**
+ * Variable: request
+ * 
+ * Holds the inner, browser-specific request object.
+ */
+mxXmlRequest.prototype.request = null;
+
+/**
+ * Variable: decodeSimulateValues
+ * 
+ * Specifies if request values should be decoded as URIs before setting the
+ * textarea value in . Defaults to false for backwards compatibility,
+ * to avoid another decode on the server this should be set to true.
+ */
+mxXmlRequest.prototype.decodeSimulateValues = false;
+
+/**
+ * Function: isBinary
+ * 
+ * Returns .
+ */
+mxXmlRequest.prototype.isBinary = function()
+{
+	return this.binary;
+};
+
+/**
+ * Function: setBinary
+ * 
+ * Sets .
+ */
+mxXmlRequest.prototype.setBinary = function(value)
+{
+	this.binary = value;
+};
+
+/**
+ * Function: getText
+ * 
+ * Returns the response as a string.
+ */
+mxXmlRequest.prototype.getText = function()
+{
+	return this.request.responseText;
+};
+
+/**
+ * Function: isReady
+ * 
+ * Returns true if the response is ready.
+ */
+mxXmlRequest.prototype.isReady = function()
+{
+	return this.request.readyState == 4;
+};
+
+/**
+ * Function: getDocumentElement
+ * 
+ * Returns the document element of the response XML document.
+ */
+mxXmlRequest.prototype.getDocumentElement = function()
+{
+	var doc = this.getXml();
+	
+	if (doc != null)
+	{
+		return doc.documentElement;
+	}
+	
+	return null;
+};
+
+/**
+ * Function: getXml
+ * 
+ * Returns the response as an XML document. Use  to get
+ * the document element of the XML document.
+ */
+mxXmlRequest.prototype.getXml = function()
+{
+	var xml = this.request.responseXML;
+	
+	// Handles missing response headers in IE, the first condition handles
+	// the case where responseXML is there, but using its nodes leads to
+	// type errors in the mxCellCodec when putting the nodes into a new
+	// document. This happens in IE9 standards mode and with XML user
+	// objects only, as they are used directly as values in cells.
+	if (document.documentMode >= 9 || xml == null || xml.documentElement == null)
+	{
+		xml = mxUtils.parseXml(this.request.responseText);
+	}
+	
+	return xml;
+};
+
+/**
+ * Function: getText
+ * 
+ * Returns the response as a string.
+ */
+mxXmlRequest.prototype.getText = function()
+{
+	return this.request.responseText;
+};
+
+/**
+ * Function: getStatus
+ * 
+ * Returns the status as a number, eg. 404 for "Not found" or 200 for "OK".
+ * Note: The NS_ERROR_NOT_AVAILABLE for invalid responses cannot be cought.
+ */
+mxXmlRequest.prototype.getStatus = function()
+{
+	return (this.request != null) ? this.request.status : null;
+};
+
+/**
+ * Function: create
+ * 
+ * Creates and returns the inner  object.
+ */
+mxXmlRequest.prototype.create = function()
+{
+	if (window.XMLHttpRequest)
+	{
+		return function()
+		{
+			var req = new XMLHttpRequest();
+			
+			// TODO: Check for overrideMimeType required here?
+			if (this.isBinary() && req.overrideMimeType)
+			{
+				req.overrideMimeType('text/plain; charset=x-user-defined');
+			}
+
+			return req;
+		};
+	}
+	else if (typeof(ActiveXObject) != 'undefined')
+	{
+		return function()
+		{
+			// TODO: Implement binary option
+			return new ActiveXObject('Microsoft.XMLHTTP');
+		};
+	}
+}();
+
+/**
+ * Function: send
+ * 
+ * Send the  to the target URL using the specified functions to
+ * process the response asychronously.
+ * 
+ * Note: Due to technical limitations, onerror is currently ignored.
+ * 
+ * Parameters:
+ * 
+ * onload - Function to be invoked if a successful response was received.
+ * onerror - Function to be called on any error.
+ * timeout - Optional timeout in ms before calling ontimeout.
+ * ontimeout - Optional function to execute on timeout.
+ */
+mxXmlRequest.prototype.send = function(onload, onerror, timeout, ontimeout)
+{
+	this.request = this.create();
+	
+	if (this.request != null)
+	{
+		if (onload != null)
+		{
+			this.request.onreadystatechange = mxUtils.bind(this, function()
+			{
+				if (this.isReady())
+				{
+					onload(this);
+					this.request.onreadystatechange = null;
+				}
+			});
+		}
+
+		this.request.open(this.method, this.url, this.async,
+			this.username, this.password);
+		this.setRequestHeaders(this.request, this.params);
+		
+		if (window.XMLHttpRequest && this.withCredentials)
+		{
+			this.request.withCredentials = 'true';
+		}
+		
+		if (!mxClient.IS_QUIRKS && (document.documentMode == null || document.documentMode > 9) &&
+			window.XMLHttpRequest && timeout != null && ontimeout != null)
+		{
+			this.request.timeout = timeout;
+			this.request.ontimeout = ontimeout;
+		}
+				
+		this.request.send(this.params);
+	}
+};
+
+/**
+ * Function: setRequestHeaders
+ * 
+ * Sets the headers for the given request and parameters. This sets the
+ * content-type to application/x-www-form-urlencoded if any params exist.
+ * 
+ * Example:
+ * 
+ * (code)
+ * request.setRequestHeaders = function(request, params)
+ * {
+ *   if (params != null)
+ *   {
+ *     request.setRequestHeader('Content-Type',
+ *             'multipart/form-data');
+ *     request.setRequestHeader('Content-Length',
+ *             params.length);
+ *   }
+ * };
+ * (end)
+ * 
+ * Use the code above before calling  if you require a
+ * multipart/form-data request.   
+ */
+mxXmlRequest.prototype.setRequestHeaders = function(request, params)
+{
+	if (params != null)
+	{
+		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+	}
+};
+
+/**
+ * Function: simulate
+ * 
+ * Creates and posts a request to the given target URL using a dynamically
+ * created form inside the given document.
+ * 
+ * Parameters:
+ * 
+ * docs - Document that contains the form element.
+ * target - Target to send the form result to.
+ */
+mxXmlRequest.prototype.simulate = function(doc, target)
+{
+	doc = doc || document;
+	var old = null;
+
+	if (doc == document)
+	{
+		old = window.onbeforeunload;		
+		window.onbeforeunload = null;
+	}
+			
+	var form = doc.createElement('form');
+	form.setAttribute('method', this.method);
+	form.setAttribute('action', this.url);
+
+	if (target != null)
+	{
+		form.setAttribute('target', target);
+	}
+
+	form.style.display = 'none';
+	form.style.visibility = 'hidden';
+	
+	var pars = (this.params.indexOf('&') > 0) ?
+		this.params.split('&') :
+		this.params.split();
+
+	// Adds the parameters as textareas to the form
+	for (var i=0; i 0)
+		{
+			var name = pars[i].substring(0, pos);
+			var value = pars[i].substring(pos+1);
+			
+			if (this.decodeSimulateValues)
+			{
+				value = decodeURIComponent(value);
+			}
+			
+			var textarea = doc.createElement('textarea');
+			textarea.setAttribute('wrap', 'off');
+			textarea.setAttribute('name', name);
+			mxUtils.write(textarea, value);
+			form.appendChild(textarea);
+		}
+	}
+	
+	doc.body.appendChild(form);
+	form.submit();
+	
+	if (form.parentNode != null)
+	{
+		form.parentNode.removeChild(form);
+	}
+
+	if (old != null)
+	{		
+		window.onbeforeunload = old;
+	}
+};
diff --git a/public/js/grapheditor/src/js/view/mxCellEditor.js b/public/js/grapheditor/src/js/view/mxCellEditor.js
new file mode 100644
index 000000000..4e1132bc1
--- /dev/null
+++ b/public/js/grapheditor/src/js/view/mxCellEditor.js
@@ -0,0 +1,1220 @@
+/**
+ * Copyright (c) 2006-2015, JGraph Ltd
+ * Copyright (c) 2006-2015, Gaudenz Alder
+ */
+/**
+ * Class: mxCellEditor
+ *
+ * In-place editor for the graph. To control this editor, use
+ * ,  and
+ * . If  is true then
+ * ctrl-enter or shift-enter can be used to create a linefeed. The F2 and
+ * escape keys can always be used to stop editing.
+ * 
+ * To customize the location of the textbox in the graph, override
+ *  as follows:
+ * 
+ * (code)
+ * graph.cellEditor.getEditorBounds = function(state)
+ * {
+ *   var result = mxCellEditor.prototype.getEditorBounds.apply(this, arguments);
+ *   
+ *   if (this.graph.getModel().isEdge(state.cell))
+ *   {
+ *     result.x = state.getCenterX() - result.width / 2;
+ *     result.y = state.getCenterY() - result.height / 2;
+ *   }
+ *   
+ *   return result;
+ * };
+ * (end)
+ * 
+ * Note that this hook is only called if  is false. If  is true,
+ * then  is used to compute the current bounds of the textbox.
+ * 
+ * The textarea uses the mxCellEditor CSS class. You can modify this class in
+ * your custom CSS. Note: You should modify the CSS after loading the client
+ * in the page.
+ *
+ * Example:
+ * 
+ * To only allow numeric input in the in-place editor, use the following code.
+ *
+ * (code)
+ * var text = graph.cellEditor.textarea;
+ * 
+ * mxEvent.addListener(text, 'keydown', function (evt)
+ * {
+ *   if (!(evt.keyCode >= 48 && evt.keyCode <= 57) &&
+ *       !(evt.keyCode >= 96 && evt.keyCode <= 105))
+ *   {
+ *     mxEvent.consume(evt);
+ *   }
+ * }); 
+ * (end)
+ * 
+ * Placeholder:
+ * 
+ * To implement a placeholder for cells without a label, use the
+ *  variable.
+ * 
+ * Resize in Chrome:
+ * 
+ * Resize of the textarea is disabled by default. If you want to enable
+ * this feature extend  and set this.textarea.style.resize = ''.
+ * 
+ * To start editing on a key press event, the container of the graph
+ * should have focus or a focusable parent should be used to add the
+ * key press handler as follows.
+ * 
+ * (code)
+ * mxEvent.addListener(graph.container, 'keypress', mxUtils.bind(this, function(evt)
+ * {
+ *   if (!graph.isEditing() && !graph.isSelectionEmpty() && evt.which !== 0 &&
+ *       !mxEvent.isAltDown(evt) && !mxEvent.isControlDown(evt) && !mxEvent.isMetaDown(evt))
+ *   {
+ *     graph.startEditing();
+ *     
+ *     if (mxClient.IS_FF)
+ *     {
+ *       graph.cellEditor.textarea.value = String.fromCharCode(evt.which);
+ *     }
+ *   }
+ * }));
+ * (end)
+ * 
+ * To allow focus for a DIV, and hence to receive key press events, some browsers
+ * require it to have a valid tabindex attribute. In this case the following
+ * code may be used to keep the container focused.
+ * 
+ * (code)
+ * var graphFireMouseEvent = graph.fireMouseEvent;
+ * graph.fireMouseEvent = function(evtName, me, sender)
+ * {
+ *   if (evtName == mxEvent.MOUSE_DOWN)
+ *   {
+ *     this.container.focus();
+ *   }
+ *   
+ *   graphFireMouseEvent.apply(this, arguments);
+ * };
+ * (end)
+ *
+ * Constructor: mxCellEditor
+ *
+ * Constructs a new in-place editor for the specified graph.
+ * 
+ * Parameters:
+ * 
+ * graph - Reference to the enclosing .
+ */
+function mxCellEditor(graph)
+{
+	this.graph = graph;
+	
+	// Stops editing after zoom changes
+	this.zoomHandler = mxUtils.bind(this, function()
+	{
+		if (this.graph.isEditing())
+		{
+			this.resize();
+		}
+	});
+	
+	this.graph.view.addListener(mxEvent.SCALE, this.zoomHandler);
+	this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE, this.zoomHandler);
+	
+	// Adds handling of deleted cells while editing
+	this.changeHandler = mxUtils.bind(this, function(sender)
+	{
+		if (this.editingCell != null && this.graph.getView().getState(this.editingCell) == null)
+		{
+			this.stopEditing(true);
+		}
+	});
+
+	this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler);
+};
+
+/**
+ * Variable: graph
+ * 
+ * Reference to the enclosing .
+ */
+mxCellEditor.prototype.graph = null;
+
+/**
+ * Variable: textarea
+ *
+ * Holds the DIV that is used for text editing. Note that this may be null before the first
+ * edit. Instantiated in .
+ */
+mxCellEditor.prototype.textarea = null;
+
+/**
+ * Variable: editingCell
+ * 
+ * Reference to the  that is currently being edited.
+ */
+mxCellEditor.prototype.editingCell = null;
+
+/**
+ * Variable: trigger
+ * 
+ * Reference to the event that was used to start editing.
+ */
+mxCellEditor.prototype.trigger = null;
+
+/**
+ * Variable: modified
+ * 
+ * Specifies if the label has been modified.
+ */
+mxCellEditor.prototype.modified = false;
+
+/**
+ * Variable: autoSize
+ * 
+ * Specifies if the textarea should be resized while the text is being edited.
+ * Default is true.
+ */
+mxCellEditor.prototype.autoSize = true;
+
+/**
+ * Variable: selectText
+ * 
+ * Specifies if the text should be selected when editing starts. Default is
+ * true.
+ */
+mxCellEditor.prototype.selectText = true;
+
+/**
+ * Variable: emptyLabelText
+ * 
+ * Text to be displayed for empty labels. Default is '' or '
' in Firefox as + * a workaround for the missing cursor bug for empty content editable. This can + * be set to eg. "[Type Here]" to easier visualize editing of empty labels. The + * value is only displayed before the first keystroke and is never used as the + * actual editing value. + */ +mxCellEditor.prototype.emptyLabelText = (mxClient.IS_FF) ? '
' : ''; + +/** + * Variable: escapeCancelsEditing + * + * If true, pressing the escape key will stop editing and not accept the new + * value. Change this to false to accept the new value on escape, and cancel + * editing on Shift+Escape instead. Default is true. + */ +mxCellEditor.prototype.escapeCancelsEditing = true; + +/** + * Variable: textNode + * + * Reference to the label DOM node that has been hidden. + */ +mxCellEditor.prototype.textNode = ''; + +/** + * Variable: zIndex + * + * Specifies the zIndex for the textarea. Default is 5. + */ +mxCellEditor.prototype.zIndex = 5; + +/** + * Variable: minResize + * + * Defines the minimum width and height to be used in . Default is 0x20px. + */ +mxCellEditor.prototype.minResize = new mxRectangle(0, 20); + +/** + * Variable: wordWrapPadding + * + * Correction factor for word wrapping width. Default is 2 in quirks, 0 in IE + * 11 and 1 in all other browsers and modes. + */ +mxCellEditor.prototype.wordWrapPadding = (mxClient.IS_QUIRKS) ? 2 : (!mxClient.IS_IE11) ? 1 : 0; + +/** + * Variable: blurEnabled + * + * If should be called if ",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/Anton-Regular.ttf b/public/js/luckysheet/assets/iconfont/Anton-Regular.ttf similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/Anton-Regular.ttf rename to public/js/luckysheet/assets/iconfont/Anton-Regular.ttf diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/HanaleiFill-Regular.ttf b/public/js/luckysheet/assets/iconfont/HanaleiFill-Regular.ttf similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/HanaleiFill-Regular.ttf rename to public/js/luckysheet/assets/iconfont/HanaleiFill-Regular.ttf diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/Pacifico-Regular.ttf b/public/js/luckysheet/assets/iconfont/Pacifico-Regular.ttf similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/Pacifico-Regular.ttf rename to public/js/luckysheet/assets/iconfont/Pacifico-Regular.ttf diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/demo.css b/public/js/luckysheet/assets/iconfont/demo.css similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/demo.css rename to public/js/luckysheet/assets/iconfont/demo.css diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/demo_index.html b/public/js/luckysheet/assets/iconfont/demo_index.html similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/demo_index.html rename to public/js/luckysheet/assets/iconfont/demo_index.html diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.css b/public/js/luckysheet/assets/iconfont/iconfont.css similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.css rename to public/js/luckysheet/assets/iconfont/iconfont.css diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.eot b/public/js/luckysheet/assets/iconfont/iconfont.eot similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.eot rename to public/js/luckysheet/assets/iconfont/iconfont.eot diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.js b/public/js/luckysheet/assets/iconfont/iconfont.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.js rename to public/js/luckysheet/assets/iconfont/iconfont.js diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.json b/public/js/luckysheet/assets/iconfont/iconfont.json similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.json rename to public/js/luckysheet/assets/iconfont/iconfont.json diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.svg b/public/js/luckysheet/assets/iconfont/iconfont.svg similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.svg rename to public/js/luckysheet/assets/iconfont/iconfont.svg diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.ttf b/public/js/luckysheet/assets/iconfont/iconfont.ttf similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.ttf rename to public/js/luckysheet/assets/iconfont/iconfont.ttf diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.woff b/public/js/luckysheet/assets/iconfont/iconfont.woff similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.woff rename to public/js/luckysheet/assets/iconfont/iconfont.woff diff --git a/resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.woff2 b/public/js/luckysheet/assets/iconfont/iconfont.woff2 similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/assets/iconfont/iconfont.woff2 rename to public/js/luckysheet/assets/iconfont/iconfont.woff2 diff --git a/resources/assets/statics/public/plugins/luckysheet/css/EwaAntH.gif b/public/js/luckysheet/css/EwaAntH.gif similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/EwaAntH.gif rename to public/js/luckysheet/css/EwaAntH.gif diff --git a/resources/assets/statics/public/plugins/luckysheet/css/EwaAntV.gif b/public/js/luckysheet/css/EwaAntV.gif similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/EwaAntV.gif rename to public/js/luckysheet/css/EwaAntV.gif diff --git a/resources/assets/statics/public/plugins/luckysheet/css/arrow-down.png b/public/js/luckysheet/css/arrow-down.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/arrow-down.png rename to public/js/luckysheet/css/arrow-down.png diff --git a/resources/assets/statics/public/plugins/luckysheet/css/loading.gif b/public/js/luckysheet/css/loading.gif similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/loading.gif rename to public/js/luckysheet/css/loading.gif diff --git a/resources/assets/statics/public/plugins/luckysheet/css/luckysheet.css b/public/js/luckysheet/css/luckysheet.css similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/luckysheet.css rename to public/js/luckysheet/css/luckysheet.css diff --git a/resources/assets/statics/public/plugins/luckysheet/css/menuSprite.svg b/public/js/luckysheet/css/menuSprite.svg similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/menuSprite.svg rename to public/js/luckysheet/css/menuSprite.svg diff --git a/resources/assets/statics/public/plugins/luckysheet/css/paint_16px.ico b/public/js/luckysheet/css/paint_16px.ico similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/paint_16px.ico rename to public/js/luckysheet/css/paint_16px.ico diff --git a/resources/assets/statics/public/plugins/luckysheet/css/paint_24px.ico b/public/js/luckysheet/css/paint_24px.ico similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/paint_24px.ico rename to public/js/luckysheet/css/paint_24px.ico diff --git a/resources/assets/statics/public/plugins/luckysheet/css/paint_32px.ico b/public/js/luckysheet/css/paint_32px.ico similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/paint_32px.ico rename to public/js/luckysheet/css/paint_32px.ico diff --git a/resources/assets/statics/public/plugins/luckysheet/css/sprite38.svg b/public/js/luckysheet/css/sprite38.svg similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/sprite38.svg rename to public/js/luckysheet/css/sprite38.svg diff --git a/resources/assets/statics/public/plugins/luckysheet/css/waffle_sprite.png b/public/js/luckysheet/css/waffle_sprite.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/css/waffle_sprite.png rename to public/js/luckysheet/css/waffle_sprite.png diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/demoFeature.js b/public/js/luckysheet/demoData/demoFeature.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/demoFeature.js rename to public/js/luckysheet/demoData/demoFeature.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetCell.js b/public/js/luckysheet/demoData/sheetCell.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetCell.js rename to public/js/luckysheet/demoData/sheetCell.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetChart.js b/public/js/luckysheet/demoData/sheetChart.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetChart.js rename to public/js/luckysheet/demoData/sheetChart.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetComment.js b/public/js/luckysheet/demoData/sheetComment.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetComment.js rename to public/js/luckysheet/demoData/sheetComment.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetConditionFormat.js b/public/js/luckysheet/demoData/sheetConditionFormat.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetConditionFormat.js rename to public/js/luckysheet/demoData/sheetConditionFormat.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetDataVerification.js b/public/js/luckysheet/demoData/sheetDataVerification.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetDataVerification.js rename to public/js/luckysheet/demoData/sheetDataVerification.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetFormula.js b/public/js/luckysheet/demoData/sheetFormula.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetFormula.js rename to public/js/luckysheet/demoData/sheetFormula.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetPicture.js b/public/js/luckysheet/demoData/sheetPicture.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetPicture.js rename to public/js/luckysheet/demoData/sheetPicture.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetPivotTable.js b/public/js/luckysheet/demoData/sheetPivotTable.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetPivotTable.js rename to public/js/luckysheet/demoData/sheetPivotTable.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetPivotTableData.js b/public/js/luckysheet/demoData/sheetPivotTableData.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetPivotTableData.js rename to public/js/luckysheet/demoData/sheetPivotTableData.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetSparkline.js b/public/js/luckysheet/demoData/sheetSparkline.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetSparkline.js rename to public/js/luckysheet/demoData/sheetSparkline.js diff --git a/resources/assets/statics/public/plugins/luckysheet/demoData/sheetTable.js b/public/js/luckysheet/demoData/sheetTable.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/demoData/sheetTable.js rename to public/js/luckysheet/demoData/sheetTable.js diff --git a/resources/assets/statics/public/plugins/luckysheet/expendPlugins/chart/chartmix.css b/public/js/luckysheet/expendPlugins/chart/chartmix.css similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/expendPlugins/chart/chartmix.css rename to public/js/luckysheet/expendPlugins/chart/chartmix.css diff --git a/resources/assets/statics/public/plugins/luckysheet/expendPlugins/chart/chartmix.umd.min.js b/public/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/expendPlugins/chart/chartmix.umd.min.js rename to public/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js diff --git a/resources/assets/statics/public/plugins/luckysheet/fonts/FontAwesome.otf b/public/js/luckysheet/fonts/FontAwesome.otf similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/fonts/FontAwesome.otf rename to public/js/luckysheet/fonts/FontAwesome.otf diff --git a/resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.eot b/public/js/luckysheet/fonts/fontawesome-webfont.eot similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.eot rename to public/js/luckysheet/fonts/fontawesome-webfont.eot diff --git a/resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.svg b/public/js/luckysheet/fonts/fontawesome-webfont.svg similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.svg rename to public/js/luckysheet/fonts/fontawesome-webfont.svg diff --git a/resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.ttf b/public/js/luckysheet/fonts/fontawesome-webfont.ttf similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.ttf rename to public/js/luckysheet/fonts/fontawesome-webfont.ttf diff --git a/resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.woff b/public/js/luckysheet/fonts/fontawesome-webfont.woff similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.woff rename to public/js/luckysheet/fonts/fontawesome-webfont.woff diff --git a/resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.woff2 b/public/js/luckysheet/fonts/fontawesome-webfont.woff2 similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/fonts/fontawesome-webfont.woff2 rename to public/js/luckysheet/fonts/fontawesome-webfont.woff2 diff --git a/resources/assets/statics/public/plugins/luckysheet/index.html b/public/js/luckysheet/index.html similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/index.html rename to public/js/luckysheet/index.html diff --git a/resources/assets/statics/public/plugins/luckysheet/luckysheet.esm.js b/public/js/luckysheet/luckysheet.esm.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/luckysheet.esm.js rename to public/js/luckysheet/luckysheet.esm.js diff --git a/resources/assets/statics/public/plugins/luckysheet/luckysheet.esm.js.map b/public/js/luckysheet/luckysheet.esm.js.map similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/luckysheet.esm.js.map rename to public/js/luckysheet/luckysheet.esm.js.map diff --git a/resources/assets/statics/public/plugins/luckysheet/luckysheet.umd.js b/public/js/luckysheet/luckysheet.umd.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/luckysheet.umd.js rename to public/js/luckysheet/luckysheet.umd.js diff --git a/resources/assets/statics/public/plugins/luckysheet/luckysheet.umd.js.map b/public/js/luckysheet/luckysheet.umd.js.map similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/luckysheet.umd.js.map rename to public/js/luckysheet/luckysheet.umd.js.map diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/css/pluginsCss.css b/public/js/luckysheet/plugins/css/pluginsCss.css similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/css/pluginsCss.css rename to public/js/luckysheet/plugins/css/pluginsCss.css diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/CFcolorGradation.png b/public/js/luckysheet/plugins/images/CFcolorGradation.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/CFcolorGradation.png rename to public/js/luckysheet/plugins/images/CFcolorGradation.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/CFdataBar.png b/public/js/luckysheet/plugins/images/CFdataBar.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/CFdataBar.png rename to public/js/luckysheet/plugins/images/CFdataBar.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/CFicons.png b/public/js/luckysheet/plugins/images/CFicons.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/CFicons.png rename to public/js/luckysheet/plugins/images/CFicons.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/icon_dropCell.png b/public/js/luckysheet/plugins/images/icon_dropCell.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/icon_dropCell.png rename to public/js/luckysheet/plugins/images/icon_dropCell.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/js.png b/public/js/luckysheet/plugins/images/js.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/js.png rename to public/js/luckysheet/plugins/images/js.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_444444_256x240.png b/public/js/luckysheet/plugins/images/ui-icons_444444_256x240.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_444444_256x240.png rename to public/js/luckysheet/plugins/images/ui-icons_444444_256x240.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_555555_256x240.png b/public/js/luckysheet/plugins/images/ui-icons_555555_256x240.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_555555_256x240.png rename to public/js/luckysheet/plugins/images/ui-icons_555555_256x240.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_777620_256x240.png b/public/js/luckysheet/plugins/images/ui-icons_777620_256x240.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_777620_256x240.png rename to public/js/luckysheet/plugins/images/ui-icons_777620_256x240.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_777777_256x240.png b/public/js/luckysheet/plugins/images/ui-icons_777777_256x240.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_777777_256x240.png rename to public/js/luckysheet/plugins/images/ui-icons_777777_256x240.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_cc0000_256x240.png b/public/js/luckysheet/plugins/images/ui-icons_cc0000_256x240.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_cc0000_256x240.png rename to public/js/luckysheet/plugins/images/ui-icons_cc0000_256x240.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_ffffff_256x240.png b/public/js/luckysheet/plugins/images/ui-icons_ffffff_256x240.png similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/images/ui-icons_ffffff_256x240.png rename to public/js/luckysheet/plugins/images/ui-icons_ffffff_256x240.png diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/js/plugin.js b/public/js/luckysheet/plugins/js/plugin.js similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/js/plugin.js rename to public/js/luckysheet/plugins/js/plugin.js diff --git a/resources/assets/statics/public/plugins/luckysheet/plugins/plugins.css b/public/js/luckysheet/plugins/plugins.css similarity index 100% rename from resources/assets/statics/public/plugins/luckysheet/plugins/plugins.css rename to public/js/luckysheet/plugins/plugins.css diff --git a/public/js/scroll-into-view.min.js b/public/js/scroll-into-view.min.js new file mode 100644 index 000000000..b01f390f3 --- /dev/null +++ b/public/js/scroll-into-view.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).scrollIntoView=t()}(this,(function(){"use strict";function e(e){return"object"==typeof e&&null!=e&&1===e.nodeType}function t(e,t){return(!t||"hidden"!==e)&&"visible"!==e&&"clip"!==e}function n(e,n){if(e.clientHeightt||i>e&&l=t&&u>=n?i-e-o:l>t&&un?l-t+r:0}function r(t,r){var i=window,l=r.scrollMode,u=r.block,c=r.inline,f=r.boundary,d=r.skipOverflowHiddenElements,a="function"==typeof f?f:function(e){return e!==f};if(!e(t))throw new TypeError("Invalid target");for(var s=document.scrollingElement||document.documentElement,h=[],p=t;e(p)&&a(p);){if((p=p.parentElement)===s){h.push(p);break}null!=p&&p===document.body&&n(p)&&!n(document.documentElement)||null!=p&&n(p,d)&&h.push(p)}for(var m=i.visualViewport?i.visualViewport.width:innerWidth,g=i.visualViewport?i.visualViewport.height:innerHeight,v=window.scrollX||pageXOffset,w=window.scrollY||pageYOffset,b=t.getBoundingClientRect(),y=b.height,W=b.width,H=b.top,E=b.right,M=b.bottom,T=b.left,V="start"===u||"nearest"===u?H:"end"===u?M:H+y/2,k="center"===c?T+W/2:"end"===c?E:T,x=[],I=0;I=0&&T>=0&&M<=g&&E<=m&&H>=D&&M<=R&&T>=X&&E<=L)return x;var Y=getComputedStyle(O),S=parseInt(Y.borderLeftWidth,10),q=parseInt(Y.borderTopWidth,10),z=parseInt(Y.borderRightWidth,10),A=parseInt(Y.borderBottomWidth,10),F=0,G=0,J="offsetWidth"in O?O.offsetWidth-O.clientWidth-S-z:0,K="offsetHeight"in O?O.offsetHeight-O.clientHeight-q-A:0;if(s===O)F="start"===u?V:"end"===u?V-g:"nearest"===u?o(w,w+g,g,q,A,w+V,w+V+y,y):V-g/2,G="start"===c?k:"center"===c?k-m/2:"end"===c?k-m:o(v,v+m,m,S,z,v+k,v+k+W,W),F=Math.max(0,F+w),G=Math.max(0,G+v);else{F="start"===u?V-D-q:"end"===u?V-R+A+K:"nearest"===u?o(D,R,B,q,A+K,V,V+y,y):V-(D+B/2)+K/2,G="start"===c?k-X-S:"center"===c?k-(X+C/2)+J/2:"end"===c?k-L+z+J:o(X,L,C,S,z+J,k,k+W,W);var N=O.scrollLeft,P=O.scrollTop;V+=P-(F=Math.max(0,Math.min(P+F,O.scrollHeight-B+K))),k+=N-(G=Math.max(0,Math.min(N+G,O.scrollWidth-C+J)))}x.push({el:O,top:F,left:G})}return x}function i(e){return e===Object(e)&&0!==Object.keys(e).length}return function(e,t){var n=!e.ownerDocument.documentElement.contains(e);if(i(t)&&"function"==typeof t.behavior)return t.behavior(n?[]:r(e,t));if(!n){var o=function(e){return!1===e?{block:"end",inline:"nearest"}:i(e)?e:{block:"start",inline:"nearest"}}(t);return function(e,t){void 0===t&&(t="auto");var n="scrollBehavior"in document.body.style;e.forEach((function(e){var o=e.el,r=e.top,i=e.left;o.scroll&&n?o.scroll({top:r,left:i,behavior:t}):(o.scrollTop=r,o.scrollLeft=i)}))}(r(e,o),o.behavior)}}})); diff --git a/public/js/tinymce/icons/default/icons.js b/public/js/tinymce/icons/default/icons.js new file mode 100644 index 000000000..f47a947a3 --- /dev/null +++ b/public/js/tinymce/icons/default/icons.js @@ -0,0 +1,164 @@ +tinymce.IconManager.add('default', { + icons: { + 'accessibility-check': '', + 'action-next': '', + 'action-prev': '', + 'align-center': '', + 'align-justify': '', + 'align-left': '', + 'align-none': '', + 'align-right': '', + 'arrow-left': '', + 'arrow-right': '', + 'bold': '', + 'bookmark': '', + 'border-width': '', + 'brightness': '', + 'browse': '', + 'cancel': '', + 'change-case': '', + 'character-count': '', + 'checklist-rtl': '', + 'checklist': '', + 'checkmark': '', + 'chevron-down': '', + 'chevron-left': '', + 'chevron-right': '', + 'chevron-up': '', + 'close': '', + 'code-sample': '', + 'color-levels': '', + 'color-picker': '', + 'color-swatch-remove-color': '', + 'color-swatch': '', + 'comment-add': '', + 'comment': '', + 'contrast': '', + 'copy': '', + 'crop': '', + 'cut': '', + 'document-properties': '', + 'drag': '', + 'duplicate': '', + 'edit-block': '', + 'edit-image': '', + 'embed-page': '', + 'embed': '', + 'emoji': '', + 'fill': '', + 'flip-horizontally': '', + 'flip-vertically': '', + 'format-painter': '', + 'format': '', + 'fullscreen': '', + 'gallery': '', + 'gamma': '', + 'help': '', + 'highlight-bg-color': '', + 'home': '', + 'horizontal-rule': '', + 'image-options': '', + 'image': '', + 'indent': '', + 'info': '', + 'insert-character': '', + 'insert-time': '', + 'invert': '', + 'italic': '', + 'line': '', + 'link': '', + 'list-bull-circle': '', + 'list-bull-default': '', + 'list-bull-square': '', + 'list-num-default-rtl': '', + 'list-num-default': '', + 'list-num-lower-alpha-rtl': '', + 'list-num-lower-alpha': '', + 'list-num-lower-greek-rtl': '', + 'list-num-lower-greek': '', + 'list-num-lower-roman-rtl': '', + 'list-num-lower-roman': '', + 'list-num-upper-alpha-rtl': '', + 'list-num-upper-alpha': '', + 'list-num-upper-roman-rtl': '', + 'list-num-upper-roman': '', + 'lock': '', + 'ltr': '', + 'more-drawer': '', + 'new-document': '', + 'new-tab': '', + 'non-breaking': '', + 'notice': '', + 'ordered-list-rtl': '', + 'ordered-list': '', + 'orientation': '', + 'outdent': '', + 'page-break': '', + 'paragraph': '', + 'paste-text': '', + 'paste': '', + 'permanent-pen': '', + 'plus': '', + 'preferences': '', + 'preview': '', + 'print': '', + 'quote': '', + 'redo': '', + 'reload': '', + 'remove-formatting': '', + 'remove': '', + 'resize-handle': '', + 'resize': '', + 'restore-draft': '', + 'rotate-left': '', + 'rotate-right': '', + 'rtl': '', + 'save': '', + 'search': '', + 'select-all': '', + 'selected': '', + 'settings': '', + 'sharpen': '', + 'sort-asc': '', + 'sort-dsc': '', + 'sourcecode': '', + 'spell-check': '', + 'strike-through': '', + 'subscript': '', + 'superscript': '', + 'table-cell-properties': '', + 'table-cell-select-all': '', + 'table-cell-select-inner': '', + 'table-delete-column': '', + 'table-delete-row': '', + 'table-delete-table': '', + 'table-insert-column-after': '', + 'table-insert-column-before': '', + 'table-insert-row-above': '', + 'table-insert-row-after': '', + 'table-left-header': '', + 'table-merge-cells': '', + 'table-row-properties': '', + 'table-split-cells': '', + 'table-top-header': '', + 'table': '', + 'template': '', + 'temporary-placeholder': '', + 'text-color': '', + 'toc': '', + 'translate': '', + 'underline': '', + 'undo': '', + 'unlink': '', + 'unlock': '', + 'unordered-list': '', + 'unselected': '', + 'upload': '', + 'user': '', + 'visualblocks': '', + 'visualchars': '', + 'warning': '', + 'zoom-in': '', + 'zoom-out': '', + } +}); \ No newline at end of file diff --git a/public/js/tinymce/icons/default/icons.min.js b/public/js/tinymce/icons/default/icons.min.js new file mode 100644 index 000000000..101606a2f --- /dev/null +++ b/public/js/tinymce/icons/default/icons.min.js @@ -0,0 +1 @@ +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',cut:'',"document-properties":'',drag:'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',"sort-asc":'',"sort-dsc":'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/public/js/tinymce/icons/default/index.js b/public/js/tinymce/icons/default/index.js new file mode 100644 index 000000000..ca4184a42 --- /dev/null +++ b/public/js/tinymce/icons/default/index.js @@ -0,0 +1,7 @@ +// Exports the "default" icons for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/icons/default') +// ES2015: +// import 'tinymce/icons/default' +require('./icons.js'); \ No newline at end of file diff --git a/public/js/tinymce/langs/zh_CN.js b/public/js/tinymce/langs/zh_CN.js new file mode 100644 index 000000000..89b106c29 --- /dev/null +++ b/public/js/tinymce/langs/zh_CN.js @@ -0,0 +1,419 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/public/js/tinymce/plugins/advlist/index.js b/public/js/tinymce/plugins/advlist/index.js new file mode 100644 index 000000000..7428d1089 --- /dev/null +++ b/public/js/tinymce/plugins/advlist/index.js @@ -0,0 +1,7 @@ +// Exports the "advlist" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/advlist') +// ES2015: +// import 'tinymce/plugins/advlist' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/advlist/plugin.js b/public/js/tinymce/plugins/advlist/plugin.js new file mode 100644 index 000000000..09bc1f0d0 --- /dev/null +++ b/public/js/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,282 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + var style = editor.dom.getStyle(listElm, 'listStyleType'); + return Option.from(style); + }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var isWithinList = function (editor, e, nodeName) { + var tableCellIndex = findIndex(e.parents, isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, isListNode(editor)); + return lists.length > 0 && lists[0].nodeName === nodeName; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addSplitButton(id, { + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + presets: 'listpreview', + columns: 3, + fetch: function (callback) { + var items = global$1.map(styles, function (styleValue) { + var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + var itemValue = styleValue === 'default' ? '' : styleValue; + var displayText = styleValueToText(styleValue); + return { + type: 'choiceitem', + value: itemValue, + icon: 'list-' + iconStyle + '-' + iconName, + text: displayText + }; + }); + callback(items); + }, + onAction: function () { + return editor.execCommand(cmd); + }, + onItemAction: function (_splitButtonApi, value) { + applyListFormat(editor, nodeName, value); + }, + select: function (value) { + var listStyleType = getSelectedStyleType(editor); + return listStyleType.map(function (listStyle) { + return value === listStyle; + }).getOr(false); + }, + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, _styles) { + editor.ui.registry.addToggleButton(id, { + active: false, + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }, + onAction: function () { + return editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 0) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', getBulletStyles(editor)); + }; + + function Plugin () { + global.add('advlist', function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$1.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + if (hasPlugin(editor, 'lists')) { + register$1(editor); + register(editor); + } + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/advlist/plugin.min.js b/public/js/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 000000000..23d0b566e --- /dev/null +++ b/public/js/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var n,t,e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(n,t,e){var r="UL"===t?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===e?null:{"list-style-type":e})},o=function(n){return function(){return n}},u=o(!1),l=o(!0),i=function(){return a},a=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:u,isSome:u,isNone:l,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(undefined),or:e,orThunk:t,map:i,each:function(){},bind:i,exists:u,forall:l,filter:i,equals:n,equals_:n,toArray:function(){return[]},toString:o("none()")}),f=function(e){var n=o(e),t=function(){return i},r=function(n){return n(e)},i={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:l,isNone:u,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return f(n(e))},each:function(n){n(e)},bind:r,exists:r,forall:r,filter:function(n){return n(e)?i:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(u,function(n){return t(e,n)})}};return i},d=function(n){return null===n||n===undefined?a:f(n)},g=function(n){return n&&/^(TH|TD)$/.test(n.nodeName)},p=function(r){return function(n){return n&&/^(OL|UL|DL)$/.test(n.nodeName)&&(e=n,(t=r).$.contains(t.getBody(),e));var t,e}},m=function(n,t,e){var r=function(n,t){for(var e=0;e len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var rng, end, start, endContainer, bookmark, text, matches, prev, len, rngText; + var autoLinkPattern = getAutoLinkPattern(editor); + var defaultLinkTarget = getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + rng = editor.selection.getRng(true).cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + matches = text.match(autoLinkPattern); + var protocol = getDefaultLinkProtocol(editor); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = protocol + '://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget !== false) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.browser.isIE()) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + + function Plugin () { + global.add('autolink', function (editor) { + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/autolink/plugin.min.js b/public/js/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 000000000..bf5237987 --- /dev/null +++ b/public/js/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.Env"),o=function(e,t){if(t<0&&(t=0),3===e.nodeType){var n=e.data.length;n getAutoResizeMinHeight(editor)) { + resizeHeight = contentHeight + chromeHeight; + } + var maxHeight = getAutoResizeMaxHeight(editor); + if (maxHeight && resizeHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + fireResizeEditor(editor); + if (global$1.browser.isSafari() && global$1.mac) { + var win = editor.getWin(); + win.scrollTo(win.pageXOffset, win.pageYOffset); + } + if (editor.hasFocus()) { + editor.selection.scrollIntoView(editor.selection.getNode()); + } + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding = getAutoResizeOverflowPadding(editor); + var dom = editor.dom; + dom.setStyles(editor.getDoc().documentElement, { height: 'auto' }); + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + }); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () { + resize(editor, oldSize); + }); + if (shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + resize(editor, oldSize); + }); + }; + + function Plugin () { + global.add('autoresize', function (editor) { + if (!editor.settings.hasOwnProperty('resize')) { + editor.settings.resize = false; + } + if (!editor.inline) { + var oldSize = Cell(0); + register(editor, oldSize); + setup(editor, oldSize); + } + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/autoresize/plugin.min.js b/public/js/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 000000000..a78bf1cde --- /dev/null +++ b/public/js/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),h=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},s=function(e,t,n,i,o){r.setEditorTimeout(e,function(){b(e,t),n--?s(e,t,n,i,o):o&&o()},i)},y=function(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))},p=function(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o},b=function(e,t){var n,i,o,r=e.dom,a=e.getDoc();if(a)if((s=e).plugins.fullscreen&&s.plugins.fullscreen.isFullscreen())y(e,!0);else{var s,u=a.documentElement,g=e.getParam("autoresize_bottom_margin",50,"number");i=v(e);var l=p(r,u,"margin-top",!0),f=p(r,u,"margin-bottom",!0);(o=u.offsetHeight+l+f+g)<0&&(o=0);var c=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;o+c>v(e)&&(i=o+c);var m=e.getParam("max_height",0,"number");if(m&&m]*>((\xA0| |[ \t]|]*>)+?|)|
$', 'i').test(html); + }; + var hasDraft = function (editor) { + var time = parseInt(global$2.getItem(getAutoSavePrefix(editor) + 'time'), 10) || 0; + if (new Date().getTime() - time > getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$2.removeItem(prefix + 'draft'); + global$2.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$2.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$2.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor) { + var interval = getAutoSaveInterval(editor); + global$1.setInterval(function () { + if (!editor.removed) { + storeDraft(editor); + } + }, interval); + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + var get = function (editor) { + return { + hasDraft: function () { + return hasDraft(editor); + }, + storeDraft: function () { + return storeDraft(editor); + }, + restoreDraft: function () { + return restoreDraft(editor); + }, + removeDraft: function (fire) { + return removeDraft(editor, fire); + }, + isEmpty: function (html) { + return isEmpty(editor, html); + } + }; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var setup = function (editor) { + editor.editorManager.on('BeforeUnload', function (e) { + var msg; + global$3.each(global$4.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + if (msg) { + e.preventDefault(); + e.returnValue = msg; + } + }); + }; + + var makeSetupHandler = function (editor) { + return function (api) { + api.setDisabled(!hasDraft(editor)); + var editorEventCallback = function () { + return api.setDisabled(!hasDraft(editor)); + }; + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return function () { + return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + }; + }; + }; + var register = function (editor) { + startStoreDraft(editor); + editor.ui.registry.addButton('restoredraft', { + tooltip: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + editor.ui.registry.addMenuItem('restoredraft', { + text: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + }; + + function Plugin () { + global.add('autosave', function (editor) { + setup(editor); + register(editor); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/autosave/plugin.min.js b/public/js/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 000000000..cee2048a6 --- /dev/null +++ b/public/js/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(r){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Delay"),o=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),a=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)},u=function(t){var e=r.document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},s=function(t,e){var r=t.settings.forced_root_block;return""===(e=a.trim(void 0===e?t.getBody().innerHTML:e))||new RegExp("^<"+r+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
$","i").test(e)},f=function(t){var e=parseInt(o.getItem(u(t)+"time"),10)||0;return!((new Date).getTime()-e>i(t.settings.autosave_retention,"20m"))||(c(t,!1),!1)},c=function(t,e){var r=u(t);o.removeItem(r+"draft"),o.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},m=function(t){var e=u(t);!s(t)&&t.isDirty()&&(o.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),o.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))},l=function(t){var e=u(t);f(t)&&(t.setContent(o.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))},v=function(t){var e=i(t.settings.autosave_interval,"30s");n.setInterval(function(){t.removed||m(t)},e)},d=function(t){t.undoManager.transact(function(){l(t),c(t)}),t.focus()},g=tinymce.util.Tools.resolve("tinymce.EditorManager"),y=function(r){return function(t){t.setDisabled(!f(r));var e=function(){return t.setDisabled(!f(r))};return r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}};!function e(){t.add("autosave",function(t){var e,r;return t.editorManager.on("BeforeUnload",function(t){var e;a.each(g.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),v(e=t),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&l(t)}),r=t,{hasDraft:function(){return f(r)},storeDraft:function(){return m(r)},restoreDraft:function(){return l(r)},removeDraft:function(t){return c(r,t)},isEmpty:function(t){return s(r,t)}}})}()}(window); \ No newline at end of file diff --git a/public/js/tinymce/plugins/bbcode/index.js b/public/js/tinymce/plugins/bbcode/index.js new file mode 100644 index 000000000..2dd534e63 --- /dev/null +++ b/public/js/tinymce/plugins/bbcode/index.js @@ -0,0 +1,7 @@ +// Exports the "bbcode" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/bbcode') +// ES2015: +// import 'tinymce/plugins/bbcode' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/bbcode/plugin.js b/public/js/tinymce/plugins/bbcode/plugin.js new file mode 100644 index 000000000..f0d42fb6c --- /dev/null +++ b/public/js/tinymce/plugins/bbcode/plugin.js @@ -0,0 +1,99 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var html2bbcode = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
/gi, '\n'); + rep(//gi, '\n'); + rep(/
/gi, '\n'); + rep(/

/gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
'); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '$2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + + function Plugin () { + global.add('bbcode', function (editor) { + editor.on('BeforeSetContent', function (e) { + e.content = bbcode2html(e.content); + }); + editor.on('PostProcess', function (e) { + if (e.set) { + e.content = bbcode2html(e.content); + } + if (e.get) { + e.content = html2bbcode(e.content); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/bbcode/plugin.min.js b/public/js/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 000000000..a4d4f9ac3 --- /dev/null +++ b/public/js/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/\n/gi,"
"),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};!function i(){o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=t(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=t(o.content)),o.get&&(o.content=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
/gi,"\n"),o(//gi,"\n"),o(/
/gi,"\n"),o(/

/gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t}(o.content))})})}()}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/charmap/index.js b/public/js/tinymce/plugins/charmap/index.js new file mode 100644 index 000000000..13a16738c --- /dev/null +++ b/public/js/tinymce/plugins/charmap/index.js @@ -0,0 +1,7 @@ +// Exports the "charmap" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/charmap') +// ES2015: +// import 'tinymce/plugins/charmap' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/charmap/plugin.js b/public/js/tinymce/plugins/charmap/plugin.js new file mode 100644 index 000000000..943b0e447 --- /dev/null +++ b/public/js/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1706 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + + var insertChar = function (editor, chr) { + var evtChr = fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.settings.charmap; + }; + var getCharMapAppend = function (editor) { + return editor.settings.charmap_append; + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray = isType('array'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } else if (until(x, i)) { + break; + } + } + return Option.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + + var isArray$1 = global$1.isArray; + var UserDefined = 'User Defined'; + var getDefaultCharMap = function () { + return [ + { + name: 'Currency', + characters: [ + [ + 36, + 'dollar sign' + ], + [ + 162, + 'cent sign' + ], + [ + 8364, + 'euro sign' + ], + [ + 163, + 'pound sign' + ], + [ + 165, + 'yen sign' + ], + [ + 164, + 'currency sign' + ], + [ + 8352, + 'euro-currency sign' + ], + [ + 8353, + 'colon sign' + ], + [ + 8354, + 'cruzeiro sign' + ], + [ + 8355, + 'french franc sign' + ], + [ + 8356, + 'lira sign' + ], + [ + 8357, + 'mill sign' + ], + [ + 8358, + 'naira sign' + ], + [ + 8359, + 'peseta sign' + ], + [ + 8360, + 'rupee sign' + ], + [ + 8361, + 'won sign' + ], + [ + 8362, + 'new sheqel sign' + ], + [ + 8363, + 'dong sign' + ], + [ + 8365, + 'kip sign' + ], + [ + 8366, + 'tugrik sign' + ], + [ + 8367, + 'drachma sign' + ], + [ + 8368, + 'german penny symbol' + ], + [ + 8369, + 'peso sign' + ], + [ + 8370, + 'guarani sign' + ], + [ + 8371, + 'austral sign' + ], + [ + 8372, + 'hryvnia sign' + ], + [ + 8373, + 'cedi sign' + ], + [ + 8374, + 'livre tournois sign' + ], + [ + 8375, + 'spesmilo sign' + ], + [ + 8376, + 'tenge sign' + ], + [ + 8377, + 'indian rupee sign' + ], + [ + 8378, + 'turkish lira sign' + ], + [ + 8379, + 'nordic mark sign' + ], + [ + 8380, + 'manat sign' + ], + [ + 8381, + 'ruble sign' + ], + [ + 20870, + 'yen character' + ], + [ + 20803, + 'yuan character' + ], + [ + 22291, + 'yuan character, in hong kong and taiwan' + ], + [ + 22278, + 'yen/yuan character variant one' + ] + ] + }, + { + name: 'Text', + characters: [ + [ + 169, + 'copyright sign' + ], + [ + 174, + 'registered sign' + ], + [ + 8482, + 'trade mark sign' + ], + [ + 8240, + 'per mille sign' + ], + [ + 181, + 'micro sign' + ], + [ + 183, + 'middle dot' + ], + [ + 8226, + 'bullet' + ], + [ + 8230, + 'three dot leader' + ], + [ + 8242, + 'minutes / feet' + ], + [ + 8243, + 'seconds / inches' + ], + [ + 167, + 'section sign' + ], + [ + 182, + 'paragraph sign' + ], + [ + 223, + 'sharp s / ess-zed' + ] + ] + }, + { + name: 'Quotations', + characters: [ + [ + 8249, + 'single left-pointing angle quotation mark' + ], + [ + 8250, + 'single right-pointing angle quotation mark' + ], + [ + 171, + 'left pointing guillemet' + ], + [ + 187, + 'right pointing guillemet' + ], + [ + 8216, + 'left single quotation mark' + ], + [ + 8217, + 'right single quotation mark' + ], + [ + 8220, + 'left double quotation mark' + ], + [ + 8221, + 'right double quotation mark' + ], + [ + 8218, + 'single low-9 quotation mark' + ], + [ + 8222, + 'double low-9 quotation mark' + ], + [ + 60, + 'less-than sign' + ], + [ + 62, + 'greater-than sign' + ], + [ + 8804, + 'less-than or equal to' + ], + [ + 8805, + 'greater-than or equal to' + ], + [ + 8211, + 'en dash' + ], + [ + 8212, + 'em dash' + ], + [ + 175, + 'macron' + ], + [ + 8254, + 'overline' + ], + [ + 164, + 'currency sign' + ], + [ + 166, + 'broken bar' + ], + [ + 168, + 'diaeresis' + ], + [ + 161, + 'inverted exclamation mark' + ], + [ + 191, + 'turned question mark' + ], + [ + 710, + 'circumflex accent' + ], + [ + 732, + 'small tilde' + ], + [ + 176, + 'degree sign' + ], + [ + 8722, + 'minus sign' + ], + [ + 177, + 'plus-minus sign' + ], + [ + 247, + 'division sign' + ], + [ + 8260, + 'fraction slash' + ], + [ + 215, + 'multiplication sign' + ], + [ + 185, + 'superscript one' + ], + [ + 178, + 'superscript two' + ], + [ + 179, + 'superscript three' + ], + [ + 188, + 'fraction one quarter' + ], + [ + 189, + 'fraction one half' + ], + [ + 190, + 'fraction three quarters' + ] + ] + }, + { + name: 'Mathematical', + characters: [ + [ + 402, + 'function / florin' + ], + [ + 8747, + 'integral' + ], + [ + 8721, + 'n-ary sumation' + ], + [ + 8734, + 'infinity' + ], + [ + 8730, + 'square root' + ], + [ + 8764, + 'similar to' + ], + [ + 8773, + 'approximately equal to' + ], + [ + 8776, + 'almost equal to' + ], + [ + 8800, + 'not equal to' + ], + [ + 8801, + 'identical to' + ], + [ + 8712, + 'element of' + ], + [ + 8713, + 'not an element of' + ], + [ + 8715, + 'contains as member' + ], + [ + 8719, + 'n-ary product' + ], + [ + 8743, + 'logical and' + ], + [ + 8744, + 'logical or' + ], + [ + 172, + 'not sign' + ], + [ + 8745, + 'intersection' + ], + [ + 8746, + 'union' + ], + [ + 8706, + 'partial differential' + ], + [ + 8704, + 'for all' + ], + [ + 8707, + 'there exists' + ], + [ + 8709, + 'diameter' + ], + [ + 8711, + 'backward difference' + ], + [ + 8727, + 'asterisk operator' + ], + [ + 8733, + 'proportional to' + ], + [ + 8736, + 'angle' + ] + ] + }, + { + name: 'Extended Latin', + characters: [ + [ + 192, + 'A - grave' + ], + [ + 193, + 'A - acute' + ], + [ + 194, + 'A - circumflex' + ], + [ + 195, + 'A - tilde' + ], + [ + 196, + 'A - diaeresis' + ], + [ + 197, + 'A - ring above' + ], + [ + 256, + 'A - macron' + ], + [ + 198, + 'ligature AE' + ], + [ + 199, + 'C - cedilla' + ], + [ + 200, + 'E - grave' + ], + [ + 201, + 'E - acute' + ], + [ + 202, + 'E - circumflex' + ], + [ + 203, + 'E - diaeresis' + ], + [ + 274, + 'E - macron' + ], + [ + 204, + 'I - grave' + ], + [ + 205, + 'I - acute' + ], + [ + 206, + 'I - circumflex' + ], + [ + 207, + 'I - diaeresis' + ], + [ + 298, + 'I - macron' + ], + [ + 208, + 'ETH' + ], + [ + 209, + 'N - tilde' + ], + [ + 210, + 'O - grave' + ], + [ + 211, + 'O - acute' + ], + [ + 212, + 'O - circumflex' + ], + [ + 213, + 'O - tilde' + ], + [ + 214, + 'O - diaeresis' + ], + [ + 216, + 'O - slash' + ], + [ + 332, + 'O - macron' + ], + [ + 338, + 'ligature OE' + ], + [ + 352, + 'S - caron' + ], + [ + 217, + 'U - grave' + ], + [ + 218, + 'U - acute' + ], + [ + 219, + 'U - circumflex' + ], + [ + 220, + 'U - diaeresis' + ], + [ + 362, + 'U - macron' + ], + [ + 221, + 'Y - acute' + ], + [ + 376, + 'Y - diaeresis' + ], + [ + 562, + 'Y - macron' + ], + [ + 222, + 'THORN' + ], + [ + 224, + 'a - grave' + ], + [ + 225, + 'a - acute' + ], + [ + 226, + 'a - circumflex' + ], + [ + 227, + 'a - tilde' + ], + [ + 228, + 'a - diaeresis' + ], + [ + 229, + 'a - ring above' + ], + [ + 257, + 'a - macron' + ], + [ + 230, + 'ligature ae' + ], + [ + 231, + 'c - cedilla' + ], + [ + 232, + 'e - grave' + ], + [ + 233, + 'e - acute' + ], + [ + 234, + 'e - circumflex' + ], + [ + 235, + 'e - diaeresis' + ], + [ + 275, + 'e - macron' + ], + [ + 236, + 'i - grave' + ], + [ + 237, + 'i - acute' + ], + [ + 238, + 'i - circumflex' + ], + [ + 239, + 'i - diaeresis' + ], + [ + 299, + 'i - macron' + ], + [ + 240, + 'eth' + ], + [ + 241, + 'n - tilde' + ], + [ + 242, + 'o - grave' + ], + [ + 243, + 'o - acute' + ], + [ + 244, + 'o - circumflex' + ], + [ + 245, + 'o - tilde' + ], + [ + 246, + 'o - diaeresis' + ], + [ + 248, + 'o slash' + ], + [ + 333, + 'o macron' + ], + [ + 339, + 'ligature oe' + ], + [ + 353, + 's - caron' + ], + [ + 249, + 'u - grave' + ], + [ + 250, + 'u - acute' + ], + [ + 251, + 'u - circumflex' + ], + [ + 252, + 'u - diaeresis' + ], + [ + 363, + 'u - macron' + ], + [ + 253, + 'y - acute' + ], + [ + 254, + 'thorn' + ], + [ + 255, + 'y - diaeresis' + ], + [ + 563, + 'y - macron' + ], + [ + 913, + 'Alpha' + ], + [ + 914, + 'Beta' + ], + [ + 915, + 'Gamma' + ], + [ + 916, + 'Delta' + ], + [ + 917, + 'Epsilon' + ], + [ + 918, + 'Zeta' + ], + [ + 919, + 'Eta' + ], + [ + 920, + 'Theta' + ], + [ + 921, + 'Iota' + ], + [ + 922, + 'Kappa' + ], + [ + 923, + 'Lambda' + ], + [ + 924, + 'Mu' + ], + [ + 925, + 'Nu' + ], + [ + 926, + 'Xi' + ], + [ + 927, + 'Omicron' + ], + [ + 928, + 'Pi' + ], + [ + 929, + 'Rho' + ], + [ + 931, + 'Sigma' + ], + [ + 932, + 'Tau' + ], + [ + 933, + 'Upsilon' + ], + [ + 934, + 'Phi' + ], + [ + 935, + 'Chi' + ], + [ + 936, + 'Psi' + ], + [ + 937, + 'Omega' + ], + [ + 945, + 'alpha' + ], + [ + 946, + 'beta' + ], + [ + 947, + 'gamma' + ], + [ + 948, + 'delta' + ], + [ + 949, + 'epsilon' + ], + [ + 950, + 'zeta' + ], + [ + 951, + 'eta' + ], + [ + 952, + 'theta' + ], + [ + 953, + 'iota' + ], + [ + 954, + 'kappa' + ], + [ + 955, + 'lambda' + ], + [ + 956, + 'mu' + ], + [ + 957, + 'nu' + ], + [ + 958, + 'xi' + ], + [ + 959, + 'omicron' + ], + [ + 960, + 'pi' + ], + [ + 961, + 'rho' + ], + [ + 962, + 'final sigma' + ], + [ + 963, + 'sigma' + ], + [ + 964, + 'tau' + ], + [ + 965, + 'upsilon' + ], + [ + 966, + 'phi' + ], + [ + 967, + 'chi' + ], + [ + 968, + 'psi' + ], + [ + 969, + 'omega' + ] + ] + }, + { + name: 'Symbols', + characters: [ + [ + 8501, + 'alef symbol' + ], + [ + 982, + 'pi symbol' + ], + [ + 8476, + 'real part symbol' + ], + [ + 978, + 'upsilon - hook symbol' + ], + [ + 8472, + 'Weierstrass p' + ], + [ + 8465, + 'imaginary part' + ] + ] + }, + { + name: 'Arrows', + characters: [ + [ + 8592, + 'leftwards arrow' + ], + [ + 8593, + 'upwards arrow' + ], + [ + 8594, + 'rightwards arrow' + ], + [ + 8595, + 'downwards arrow' + ], + [ + 8596, + 'left right arrow' + ], + [ + 8629, + 'carriage return' + ], + [ + 8656, + 'leftwards double arrow' + ], + [ + 8657, + 'upwards double arrow' + ], + [ + 8658, + 'rightwards double arrow' + ], + [ + 8659, + 'downwards double arrow' + ], + [ + 8660, + 'left right double arrow' + ], + [ + 8756, + 'therefore' + ], + [ + 8834, + 'subset of' + ], + [ + 8835, + 'superset of' + ], + [ + 8836, + 'not a subset of' + ], + [ + 8838, + 'subset of or equal to' + ], + [ + 8839, + 'superset of or equal to' + ], + [ + 8853, + 'circled plus' + ], + [ + 8855, + 'circled times' + ], + [ + 8869, + 'perpendicular' + ], + [ + 8901, + 'dot operator' + ], + [ + 8968, + 'left ceiling' + ], + [ + 8969, + 'right ceiling' + ], + [ + 8970, + 'left floor' + ], + [ + 8971, + 'right floor' + ], + [ + 9001, + 'left-pointing angle bracket' + ], + [ + 9002, + 'right-pointing angle bracket' + ], + [ + 9674, + 'lozenge' + ], + [ + 9824, + 'black spade suit' + ], + [ + 9827, + 'black club suit' + ], + [ + 9829, + 'black heart suit' + ], + [ + 9830, + 'black diamond suit' + ], + [ + 8194, + 'en space' + ], + [ + 8195, + 'em space' + ], + [ + 8201, + 'thin space' + ], + [ + 8204, + 'zero width non-joiner' + ], + [ + 8205, + 'zero width joiner' + ], + [ + 8206, + 'left-to-right mark' + ], + [ + 8207, + 'right-to-left mark' + ] + ] + } + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray$1(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray$1(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = getCharMap(editor); + if (userCharMap) { + charmap = [{ + name: UserDefined, + characters: getCharsFromSetting(userCharMap) + }]; + } + var userCharMapAppend = getCharMapAppend(editor); + if (userCharMapAppend) { + var userDefinedGroup = global$1.grep(charmap, function (cg) { + return cg.name === UserDefined; + }); + if (userDefinedGroup.length) { + userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + return charmap; + } + return [].concat(charmap).concat({ + name: UserDefined, + characters: getCharsFromSetting(userCharMapAppend) + }); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + var groups = extendCharMap(editor, getDefaultCharMap()); + return groups.length > 1 ? [{ + name: 'All', + characters: bind(groups, function (g) { + return g.characters; + }) + }].concat(groups) : groups; + }; + + var get = function (editor) { + var getCharMap = function () { + return getCharMap$1(editor); + }; + var insertChar$1 = function (chr) { + insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar$1 + }; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var nativeFromCodePoint = String.fromCodePoint; + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + var fromCodePoint = function () { + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (nativeFromCodePoint) { + return nativeFromCodePoint.apply(void 0, codePoints); + } else { + var codeUnits = []; + var codeLen = 0; + var result = ''; + for (var index = 0, len = codePoints.length; index !== len; ++index) { + var codePoint = +codePoints[index]; + if (!(codePoint < 1114111 && codePoint >>> 0 === codePoint)) { + throw RangeError('Invalid code point: ' + codePoint); + } + if (codePoint <= 65535) { + codeLen = codeUnits.push(codePoint); + } else { + codePoint -= 65536; + codeLen = codeUnits.push((codePoint >> 10) + 55296, codePoint % 1024 + 56320); + } + if (codeLen >= 16383) { + result += String.fromCharCode.apply(null, codeUnits); + codeUnits.length = 0; + } + } + return result + String.fromCharCode.apply(null, codeUnits); + } + }; + + var charMatches = function (charCode, name, lowerCasePattern) { + if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) { + return true; + } else { + return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); + } + }; + var scan = function (group, pattern) { + var matches = []; + var lowerCasePattern = pattern.toLowerCase(); + each(group.characters, function (g) { + if (charMatches(g[0], g[1], lowerCasePattern)) { + matches.push(g); + } + }); + return map(matches, function (m) { + return { + text: m[1], + value: fromCodePoint(m[0]), + icon: fromCodePoint(m[0]) + }; + }); + }; + + var patternName = 'pattern'; + var open = function (editor, charMap) { + var makeGroupItems = function () { + return [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + }; + var makeTabs = function () { + return map(charMap, function (charGroup) { + return { + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + }; + }); + }; + var makePanel = function () { + return { + type: 'panel', + items: makeGroupItems() + }; + }; + var makeTabPanel = function () { + return { + type: 'tabpanel', + tabs: makeTabs() + }; + }; + var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + var scanAndSet = function (dialogApi, pattern) { + find(charMap, function (group) { + return group.name === currentTab.get(); + }).each(function (f) { + var items = scan(f, pattern); + dialogApi.setData({ results: items }); + }); + }; + var SEARCH_DELAY = 40; + var updateFilter = last(function (dialogApi) { + var pattern = dialogApi.getData().pattern; + scanAndSet(dialogApi, pattern); + }, SEARCH_DELAY); + var body = charMap.length === 1 ? makePanel() : makeTabPanel(); + var initialData = { + pattern: '', + results: scan(charMap[0], '') + }; + var bridgeSpec = { + title: 'Special Character', + size: 'normal', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: initialData, + onAction: function (api, details) { + if (details.name === 'results') { + insertChar(editor, details.value); + api.close(); + } + }, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: function (dialogApi, changeData) { + if (changeData.name === patternName) { + updateFilter.throttle(dialogApi); + } + } + }; + var dialogApi = editor.windowManager.open(bridgeSpec); + dialogApi.focus(patternName); + }; + + var register = function (editor, charMap) { + editor.addCommand('mceShowCharmap', function () { + open(editor, charMap); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var init = function (editor, all) { + editor.ui.registry.addAutocompleter('charmap', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, _maxResults) { + return new global$2(function (resolve, _reject) { + resolve(scan(all, pattern)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('charmap', { + icon: 'insert-character', + tooltip: 'Special character', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + editor.ui.registry.addMenuItem('charmap', { + icon: 'insert-character', + text: 'Special character...', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + }; + + function Plugin () { + global.add('charmap', function (editor) { + var charMap = getCharMap$1(editor); + register(editor, charMap); + register$1(editor); + init(editor, charMap[0]); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/charmap/plugin.min.js b/public/js/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 000000000..7881fcba7 --- /dev/null +++ b/public/js/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(s){"use strict";var e,n,r,t,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=function(e,n){var r,t=(r=n,e.fire("insertCustomChar",{chr:r}).chr);e.execCommand("mceInsertContent",!1,t)},i=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(e){return function(){return e}},c=o(!1),u=o(!0),g=function(){return m},m=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:c,isSome:c,isNone:u,getOr:r=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(undefined),or:r,orThunk:n,map:g,each:function(){},bind:g,exists:c,forall:u,filter:g,equals:e,equals_:e,toArray:function(){return[]},toString:o("none()")}),f=function(r){var e=o(r),n=function(){return a},t=function(e){return e(r)},a={fold:function(e,n){return n(r)},is:function(e){return r===e},isSome:u,isNone:c,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return f(e(r))},each:function(e){e(r)},bind:t,exists:t,forall:t,filter:function(e){return e(r)?a:m},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,n){return e.fold(c,function(e){return n(r,e)})}};return a},h={some:f,none:g,from:function(e){return null===e||e===undefined?m:f(e)}},d=(t="array",function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}),p=Array.prototype.push,y=function(e,n){for(var r=e.length,t=new Array(r),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?r.push(o):(o-=65536,r.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,r),r.length=0)}return t+String.fromCharCode.apply(null,r)},T=function(e,n){var a=[],i=n.toLowerCase();return function(e,n){for(var r=0,t=e.length;r>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/, + 'number': /(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + alias: 'property', + inside: { + 'string': { + pattern: /(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/, + lookbehind: true + }, + 'directive': { + pattern: /(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/, + lookbehind: true, + alias: 'keyword' + } + } + }, + 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ + }); + delete Prism.languages.c['boolean']; + }, + {} + ], + 2: [ + function (require, module, exports) { + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + }, + {} + ], + 3: [ + function (require, module, exports) { + (function (global) { + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; + var Prism = function (_self) { + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + var uniqueId = 0; + var _ = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function (tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias); + } else if (Array.isArray(tokens)) { + return tokens.map(_.util.encode); + } else { + return tokens.replace(/&/g, '&').replace(/ text.length) { + return; + } + if (str instanceof Token) { + continue; + } + if (greedy && i != strarr.length - 1) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + var from = match.index + (lookbehind && match[1] ? match[1].length : 0), to = match.index + match[0].length, k = i, p = pos; + for (var len = strarr.length; k < len && (p < to || !strarr[k].type && !strarr[k - 1].greedy); ++k) { + p += strarr[k].length; + if (from >= p) { + ++i; + pos = p; + } + } + if (strarr[i] instanceof Token) { + continue; + } + delNum = k - i; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + var match = pattern.exec(str), delNum = 1; + } + if (!match) { + if (oneshot) { + break; + } + continue; + } + if (lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + var from = match.index + lookbehindLength, match = match[0].slice(lookbehindLength), to = from + match.length, before = str.slice(0, from), after = str.slice(to); + var args = [ + i, + delNum + ]; + if (before) { + ++i; + pos += before.length; + args.push(before); + } + var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias, match, greedy); + args.push(wrapped); + if (after) { + args.push(after); + } + Array.prototype.splice.apply(strarr, args); + if (delNum != 1) + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); + if (oneshot) + break; + } + } + } + }, + tokenize: function (text, grammar) { + var strarr = [text]; + var rest = grammar.rest; + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; + } + delete grammar.rest; + } + _.matchGrammar(text, strarr, grammar, 0, 0, false); + return strarr; + }, + hooks: { + all: {}, + add: function (name, callback) { + var hooks = _.hooks.all; + hooks[name] = hooks[name] || []; + hooks[name].push(callback); + }, + run: function (name, env) { + var callbacks = _.hooks.all[name]; + if (!callbacks || !callbacks.length) { + return; + } + for (var i = 0, callback; callback = callbacks[i++];) { + callback(env); + } + } + }, + Token: Token + }; + _self.Prism = _; + function Token(type, content, alias, matchedStr, greedy) { + this.type = type; + this.content = content; + this.alias = alias; + this.length = (matchedStr || '').length | 0; + this.greedy = !!greedy; + } + Token.stringify = function (o, language) { + if (typeof o == 'string') { + return o; + } + if (Array.isArray(o)) { + return o.map(function (element) { + return Token.stringify(element, language); + }).join(''); + } + var env = { + type: o.type, + content: Token.stringify(o.content, language), + tag: 'span', + classes: [ + 'token', + o.type + ], + attributes: {}, + language: language + }; + if (o.alias) { + var aliases = Array.isArray(o.alias) ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + _.hooks.run('wrap', env); + var attributes = Object.keys(env.attributes).map(function (name) { + return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + }).join(' '); + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; + }; + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + if (!_.manual) { + var highlightAutomaticallyCallback = function () { + if (!_.manual) { + _.highlightAll(); + } + }; + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + }.call(this, typeof global$2 !== 'undefined' ? global$2 : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {})); + }, + {} + ], + 4: [ + function (require, module, exports) { + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': { + pattern: /(\b(?:class|enum|struct)\s+)\w+/, + lookbehind: true + }, + 'keyword': /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:true|false)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + }, + {} + ], + 5: [ + function (require, module, exports) { + Prism.languages.csharp = Prism.languages.extend('clike', { + 'keyword': /\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/, + 'string': [ + { + pattern: /@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/, + greedy: true + }, + { + pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/, + greedy: true + } + ], + 'class-name': [ + { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/, + inside: { punctuation: /\./ } + }, + { + pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + } + ], + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'generic-method': { + pattern: /\w+\s*<[^>\r\n]+?>\s*(?=\()/, + inside: { + function: /^\w+/, + 'class-name': { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b/, + inside: { punctuation: /\./ } + }, + keyword: Prism.languages.csharp.keyword, + punctuation: /[<>(),.:]/ + } + }, + 'preprocessor': { + pattern: /(^\s*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/, + lookbehind: true, + alias: 'keyword' + } + } + } + }); + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }, + {} + ], + 6: [ + function (require, module, exports) { + (function (Prism) { + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/, + inside: { 'rule': /@[\w-]+/ } + }, + 'url': { + pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'), + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/ + } + }, + 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), + 'string': { + pattern: string, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, markup.tag); + } + }(Prism)); + }, + {} + ], + 7: [ + function (require, module, exports) { + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/; + Prism.languages.java = Prism.languages.extend('clike', { + 'class-name': [ + className, + /\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/ + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, + { + pattern: /(\:\:)[a-z_]\w*/, + lookbehind: true + } + ], + 'number': /\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + } + }); + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, + greedy: true, + alias: 'string' + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + alias: 'punctuation', + pattern: /(^|[^.])@\w+/, + lookbehind: true + }, + 'namespace': { + pattern: /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/, + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'generics': { + pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/, + inside: { + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + } + }); + }(Prism)); + }, + {} + ], + 8: [ + function (require, module, exports) { + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, + 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'operator': /--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + lookbehind: true, + greedy: true + }, + 'function-variable': { + pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + }, + {} + ], + 9: [ + function (require, module, exports) { + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; + } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) + ++i; + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; + } + }, + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; + } + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } + } + return tokens; + } + walkTokens(env.tokens); + } + } + }); + }(Prism)); + }, + {} + ], + 10: [ + function (require, module, exports) { + Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i, + greedy: true + }, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i, + inside: { + 'punctuation': [ + /^=/, + { + pattern: /^(\s*)["']|["']$/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': /&#?[\da-z]{1,8};/i + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g, tagName), 'i'), + lookbehind: true, + greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + }, + {} + ], + 11: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.php = Prism.languages.extend('clike', { + 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, + 'boolean': { + pattern: /\b(?:false|true)\b/i, + alias: 'constant' + }, + 'constant': [ + /\b[A-Z_][A-Z0-9_]*\b/, + /\b(?:null)\b/i + ], + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'string', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'comment', { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + 'variable': /\$+(?:\w+\b|(?={))/i, + 'package': { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + 'property': { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + var string_interpolation = { + pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/, + lookbehind: true, + inside: Prism.languages.php + }; + Prism.languages.insertBefore('php', 'string', { + 'nowdoc-string': { + pattern: /<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } + } + } + }, + 'heredoc-string': { + pattern: /<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation + } + }, + 'single-quoted-string': { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + greedy: true, + alias: 'string' + }, + 'double-quoted-string': { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + greedy: true, + alias: 'string', + inside: { 'interpolation': string_interpolation } + } + }); + delete Prism.languages.php['string']; + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + }, + {} + ], + 12: [ + function (require, module, exports) { + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string-interpolation': { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:True|False|None)\b/, + 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + }, + {} + ], + 13: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': [ + /#.*/, + { + pattern: /^=begin\s[\s\S]*?^=end/m, + greedy: true + } + ], + 'class-name': { + pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.ruby + } + }; + delete Prism.languages.ruby.function; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex': [ + { + pattern: /%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, + lookbehind: true, + greedy: true + } + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': { + pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, + lookbehind: true + }, + 'method-definition': { + pattern: /(\bdef\s+)[\w.]+/, + lookbehind: true, + inside: { + 'function': /\w+$/, + rest: Prism.languages.ruby + } + } + }); + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + } + ]; + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); + }, + {} + ], + 14: [ + function (require, module, exports) { + var Prism = require('prismjs/components/prism-core'); + require('prismjs/components/prism-clike'); + require('prismjs/components/prism-markup-templating'); + require('prismjs/components/prism-c'); + require('prismjs/components/prism-cpp'); + require('prismjs/components/prism-csharp'); + require('prismjs/components/prism-css'); + require('prismjs/components/prism-java'); + require('prismjs/components/prism-javascript'); + require('prismjs/components/prism-markup'); + require('prismjs/components/prism-php'); + require('prismjs/components/prism-python'); + require('prismjs/components/prism-ruby'); + module.exports = { boltExport: Prism }; + }, + { + 'prismjs/components/prism-c': 1, + 'prismjs/components/prism-clike': 2, + 'prismjs/components/prism-core': 3, + 'prismjs/components/prism-cpp': 4, + 'prismjs/components/prism-csharp': 5, + 'prismjs/components/prism-css': 6, + 'prismjs/components/prism-java': 7, + 'prismjs/components/prism-javascript': 8, + 'prismjs/components/prism-markup': 10, + 'prismjs/components/prism-markup-templating': 9, + 'prismjs/components/prism-php': 11, + 'prismjs/components/prism-python': 12, + 'prismjs/components/prism-ruby': 13 + } + ] + }, {}, [14])(14); + })); + var prism = window.Prism; + window.Prism = oldprism; + return prism; + }(undefined, exports$1, module, undefined)); + var Prism$1 = module.exports.boltExport; + + var getLanguages = function (editor) { + return editor.getParam('codesample_languages'); + }; + var useGlobalPrismJS = function (editor) { + return editor.getParam('codesample_global_prismjs', false, 'boolean'); + }; + + var get = function (editor) { + return Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection ? editor.selection.getNode() : null; + if (isCodeSample(node)) { + return Option.some(node); + } + return Option.none(); + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + return node.fold(function () { + editor.insertContent('

' + code + '
'); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + }, function (n) { + editor.dom.setAttrib(n, 'class', 'language-' + language); + n.innerHTML = code; + get(editor).highlightElement(n); + editor.selection.select(n); + }); + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return ''; + }, function (n) { + return n.textContent; + }); + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor, fallback) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return fallback; + }, function (n) { + var matches = n.className.match(/language-(\w+)/); + return matches ? matches[1] : fallback; + }); + }; + + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + + var open = function (editor) { + var languages = getLanguages$1(editor); + var defaultLanguage = head(languages).fold(function () { + return ''; + }, function (l) { + return l.value; + }); + var currentLanguage = getCurrentLanguage(editor, defaultLanguage); + var currentCode = getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit Code Sample', + size: 'large', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'language', + label: 'Language', + items: languages + }, + { + type: 'textarea', + name: 'code', + label: 'Code view' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: { + language: currentLanguage, + code: currentCode + }, + onSubmit: function (api) { + var data = api.getData(); + insertCodeSample(editor, data.language, data.code); + api.close(); + } + }); + }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || isCodeSample(node)) { + open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(trimArg(isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(trimArg(isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = 'false'; + elm.innerHTML = editor.dom.encode(elm.textContent); + get(editor).highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + + var isCodeSampleSelection = function (editor) { + var node = editor.selection.getStart(); + return editor.dom.is(node, 'pre[class*="language-"]'); + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('codesample', { + icon: 'code-sample', + tooltip: 'Insert/edit code sample', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + var nodeChangeHandler = function () { + api.setActive(isCodeSampleSelection(editor)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + editor.ui.registry.addMenuItem('codesample', { + text: 'Code sample...', + icon: 'code-sample', + onAction: function () { + return open(editor); + } + }); + }; + + function Plugin () { + global.add('codesample', function (editor) { + setup(editor); + register$1(editor); + register(editor); + editor.on('dblclick', function (ev) { + if (isCodeSample(ev.target)) { + open(editor); + } + }); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/codesample/plugin.min.js b/public/js/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 000000000..72d732719 --- /dev/null +++ b/public/js/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(e){"use strict";var n,t,a,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e){return function(){return e}},s=i(!1),o=i(!0),l=function(){return u},u=(n=function(e){return e.isNone()},{fold:function(e,n){return e()},is:s,isSome:s,isNone:o,getOr:a=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:a,orThunk:t,map:l,each:function(){},bind:l,exists:s,forall:o,filter:l,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),c=function(t){var e=i(t),n=function(){return r},a=function(e){return e(t)},r={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:s,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return c(e(t))},each:function(e){e(t)},bind:a,exists:a,forall:a,filter:function(e){return e(t)?r:u},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(s,function(e){return n(t,e)})}};return r},d={some:c,none:l,from:function(e){return null===e||e===undefined?u:c(e)}},p=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");function g(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")}function m(t){return function(e,n){return t(n)}}var f="undefined"!=typeof e.window?e.window:Function("return this;")(),h={},b={exports:h},y={};!function(n,t,a,d){var e=window.Prism;window.Prism={manual:!0},function(e){if("object"==typeof t&&void 0!==a)a.exports=e();else if("function"==typeof n&&n.amd)n([],e);else{("undefined"!=typeof window?window:void 0!==y?y:"undefined"!=typeof self?self:this).EphoxContactWrapper=e()}}(function(){return function c(i,s,o){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof d&&d;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var a=new Error("Cannot find module '"+n+"'");throw a.code="MODULE_NOT_FOUND",a}var r=s[n]={exports:{}};i[n][0].call(r.exports,function(e){return l(i[n][1][e]||e)},r,r.exports,c,i,s,o)}return s[n].exports}for(var u="function"==typeof d&&d,e=0;e>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(e){var n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,C={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof O?new O(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof O)){if(g&&b!=n.length-1){if(c.lastIndex=y,!(P=c.exec(e)))break;for(var v=P.index+(p&&P[1]?P[1].length:0),k=P.index+P[0].length,x=b,_=y,F=n.length;x"+t.content+""},!u.document)return u.addEventListener&&(C.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(C.highlight(a,C.languages[t],t)),r&&u.close()},!1)),C;var e=C.util.currentScript();if(e&&(C.filename=e.src,e.hasAttribute("data-manual")&&(C.manual=!0)),!C.manual){var t=function(){C.manual||C.highlightAll()},a=document.readyState;"loading"===a||"interactive"===a&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return C}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=n),void 0!==e&&(e.Prism=n)}).call(this,void 0!==y?y:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}})},{}],5:[function(e,n,t){Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+n.source+"|[^\n\r()]*)\\)","i"),inside:{"function":/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var a,r,i;a=Prism,r=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,i=/\b[A-Z](?:\w*[a-z]\w*)?\b/,a.languages.java=a.languages.extend("clike",{"class-name":[i,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:r,"function":[a.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),a.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),a.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":i,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,i){if(a.language===r){var s=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof i&&!i(e))return e;for(var n,t=s.length;-1!==a.code.indexOf(n=b(r,t));)++t;return s[t]=e,n}),a.grammar=y.languages.markup}}},tokenizePlaceholders:{value:function(p,g){if(p.language===g&&p.tokenStack){p.grammar=y.languages[g];var m=0,f=Object.keys(p.tokenStack);!function h(e){for(var n=0;n=f.length);n++){var t=e[n];if("string"==typeof t||t.content&&"string"==typeof t.content){var a=f[m],r=p.tokenStack[a],i="string"==typeof t?t:t.content,s=b(g,a),o=i.indexOf(s);if(-1/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var a=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:a}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var r=window.Prism;window.Prism=e}(undefined,h,b,undefined);var w=b.exports.boltExport,v=function(e){return f.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?f.Prism:w},k=function(e){var n=e.selection?e.selection.getNode():null;return g(n)?d.some(n):d.none()},x=function(i){var e,t,n=i.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],a=(0===(e=n).length?d.none():d.some(e[0])).fold(function(){return""},function(e){return e.value}),r=(t=a,k(i).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),s=k(i).fold(function(){return""},function(e){return e.textContent});i.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:n},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:s},onSubmit:function(e){var n,t,a,r=e.getData();n=i,t=r.language,a=r.code,n.undoManager.transact(function(){var e=k(n);return a=p.DOM.encode(a),e.fold(function(){n.insertContent('
'+a+"
"),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=a,v(n).highlightElement(e),n.selection.select(e)})}),e.close()}})},_=function(a){a.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return x(a)},onSetup:function(t){var e=function(){var e,n;t.setActive((n=(e=a).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))};return a.on("NodeChange",e),function(){return a.off("NodeChange",e)}}}),a.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return x(a)}})};!function F(){r.add("codesample",function(n){var t,r,a;r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(m(g)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(m(g)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),v(t).highlightElement(n),n.className=r.trim(n.className)})})}),_(n),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||g(e)?x(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){g(e.target)&&x(n)})})}()}(window); \ No newline at end of file diff --git a/public/js/tinymce/plugins/colorpicker/index.js b/public/js/tinymce/plugins/colorpicker/index.js new file mode 100644 index 000000000..1af1ae63e --- /dev/null +++ b/public/js/tinymce/plugins/colorpicker/index.js @@ -0,0 +1,7 @@ +// Exports the "colorpicker" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/colorpicker') +// ES2015: +// import 'tinymce/plugins/colorpicker' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/colorpicker/plugin.js b/public/js/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 000000000..1d8994839 --- /dev/null +++ b/public/js/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('colorpicker', function () { + domGlobals.console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/colorpicker/plugin.min.js b/public/js/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 000000000..93afdae2a --- /dev/null +++ b/public/js/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(o){"use strict";var i=tinymce.util.Tools.resolve("tinymce.PluginManager");!function n(){i.add("colorpicker",function(){o.console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/public/js/tinymce/plugins/contextmenu/index.js b/public/js/tinymce/plugins/contextmenu/index.js new file mode 100644 index 000000000..ae837e243 --- /dev/null +++ b/public/js/tinymce/plugins/contextmenu/index.js @@ -0,0 +1,7 @@ +// Exports the "contextmenu" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/contextmenu') +// ES2015: +// import 'tinymce/plugins/contextmenu' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/contextmenu/plugin.js b/public/js/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 000000000..1bdafe8a6 --- /dev/null +++ b/public/js/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('contextmenu', function () { + domGlobals.console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/contextmenu/plugin.min.js b/public/js/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 000000000..021829baf --- /dev/null +++ b/public/js/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(n){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager");!function e(){o.add("contextmenu",function(){n.console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/public/js/tinymce/plugins/directionality/index.js b/public/js/tinymce/plugins/directionality/index.js new file mode 100644 index 000000000..e2740c3b8 --- /dev/null +++ b/public/js/tinymce/plugins/directionality/index.js @@ -0,0 +1,7 @@ +// Exports the "directionality" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/directionality') +// ES2015: +// import 'tinymce/plugins/directionality' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/directionality/plugin.js b/public/js/tinymce/plugins/directionality/plugin.js new file mode 100644 index 000000000..ebe8385c3 --- /dev/null +++ b/public/js/tinymce/plugins/directionality/plugin.js @@ -0,0 +1,278 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var setDir = function (editor, dir) { + var dom = editor.dom; + var curDir; + var blocks = editor.selection.getSelectedBlocks(); + if (blocks.length) { + curDir = dom.getAttrib(blocks[0], 'dir'); + global$1.each(blocks, function (block) { + if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) { + dom.setAttrib(block, 'dir', curDir !== dir ? dir : null); + } + }); + editor.nodeChanged(); + } + }; + + var register = function (editor) { + editor.addCommand('mceDirectionLTR', function () { + setDir(editor, 'ltr'); + }); + editor.addCommand('mceDirectionRTL', function () { + setDir(editor, 'rtl'); + }); + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isFunction = isSimpleType('function'); + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var TEXT = 3; + + var type = function (element) { + return element.dom().nodeType; + }; + var isType = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType(TEXT); + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); + }; + + var get = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var getDirection = function (element) { + return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + }; + + var getNodeChangeHandler = function (editor, dir) { + return function (api) { + var nodeChangeHandler = function (e) { + var element = Element.fromDom(e.element); + api.setActive(getDirection(element) === dir); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('ltr', { + tooltip: 'Left to right', + icon: 'ltr', + onAction: function () { + return editor.execCommand('mceDirectionLTR'); + }, + onSetup: getNodeChangeHandler(editor, 'ltr') + }); + editor.ui.registry.addToggleButton('rtl', { + tooltip: 'Right to left', + icon: 'rtl', + onAction: function () { + return editor.execCommand('mceDirectionRTL'); + }, + onSetup: getNodeChangeHandler(editor, 'rtl') + }); + }; + + function Plugin () { + global.add('directionality', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/directionality/plugin.min.js b/public/js/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 000000000..340b50cb7 --- /dev/null +++ b/public/js/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(u){"use strict";var n,t,e,r,o,i=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=function(n,t){var e,r=n.dom,o=n.selection.getSelectedBlocks();o.length&&(e=r.getAttrib(o[0],"dir"),c.each(o,function(n){r.getParent(n.parentNode,'*[dir="'+t+'"]',r.getRoot())||r.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},d=function(n){return function(){return n}},f=d(!1),a=d(!0),m=function(){return s},s=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:f,isSome:f,isNone:a,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:d(null),getOrUndefined:d(undefined),or:e,orThunk:t,map:m,each:function(){},bind:m,exists:f,forall:a,filter:m,equals:n,equals_:n,toArray:function(){return[]},toString:d("none()")}),g=function(e){var n=d(e),t=function(){return o},r=function(n){return n(e)},o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:a,isNone:f,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return g(n(e))},each:function(n){n(e)},bind:r,exists:r,forall:r,filter:function(n){return n(e)?o:s},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return o},h=function(n){return null===n||n===undefined?s:g(n)},y=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:d(n)}},T={fromHtml:function(n,t){var e=(t||u.document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1= max; + }; + }); + for (var i = 0; i < list.length; i++) { + if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { + matches.push({ + value: list[i].char, + text: list[i].title, + icon: list[i].char + }); + if (reachedLimit(matches.length)) { + break; + } + } + } + return matches; + }; + + var init = function (editor, database) { + editor.ui.registry.addAutocompleter('emoticons', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return database.waitForLoad().then(function () { + var candidates = database.listAll(); + return emojisFrom(candidates, pattern, Option.some(maxResults)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var insertEmoticon = function (editor, ch) { + editor.insertContent(ch); + }; + + 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); + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var keys = Object.keys; + var hasOwnProperty$1 = Object.hasOwnProperty; + var each = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var map$1 = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + var has = function (obj, key) { + return hasOwnProperty$1.call(obj, key); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var DEFAULT_ID = 'tinymce.plugins.emoticons'; + var getEmoticonDatabaseUrl = function (editor, pluginUrl) { + return editor.getParam('emoticons_database_url', pluginUrl + '/js/emojis' + editor.suffix + '.js'); + }; + var getEmoticonDatabaseId = function (editor) { + return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); + }; + var getAppendedEmoticons = function (editor) { + return editor.getParam('emoticons_append', {}, 'object'); + }; + + var ALL_CATEGORY = 'All'; + var categoryNameMap = { + symbols: 'Symbols', + people: 'People', + animals_and_nature: 'Animals and Nature', + food_and_drink: 'Food and Drink', + activity: 'Activity', + travel_and_places: 'Travel and Places', + objects: 'Objects', + flags: 'Flags', + user: 'User Defined' + }; + var translateCategory = function (categories, name) { + return has(categories, name) ? categories[name] : name; + }; + var getUserDefinedEmoticons = function (editor) { + var userDefinedEmoticons = getAppendedEmoticons(editor); + return map$1(userDefinedEmoticons, function (value) { + return __assign({ + keywords: [], + category: 'user' + }, value); + }); + }; + var initDatabase = function (editor, databaseUrl, databaseId) { + var categories = Cell(Option.none()); + var all = Cell(Option.none()); + var processEmojis = function (emojis) { + var cats = {}; + var everything = []; + each(emojis, function (lib, title) { + var entry = { + title: title, + keywords: lib.keywords, + char: lib.char, + category: translateCategory(categoryNameMap, lib.category) + }; + var current = cats[entry.category] !== undefined ? cats[entry.category] : []; + cats[entry.category] = current.concat([entry]); + everything.push(entry); + }); + categories.set(Option.some(cats)); + all.set(Option.some(everything)); + }; + editor.on('init', function () { + global$1.load(databaseId, databaseUrl).then(function (emojis) { + var userEmojis = getUserDefinedEmoticons(editor); + processEmojis(merge(emojis, userEmojis)); + }, function (err) { + domGlobals.console.log('Failed to load emoticons: ' + err); + categories.set(Option.some({})); + all.set(Option.some([])); + }); + }); + var listCategory = function (category) { + if (category === ALL_CATEGORY) { + return listAll(); + } + return categories.get().bind(function (cats) { + return Option.from(cats[category]); + }).getOr([]); + }; + var listAll = function () { + return all.get().getOr([]); + }; + var listCategories = function () { + return [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); + }; + var waitForLoad = function () { + if (hasLoaded()) { + return global$3.resolve(true); + } else { + return new global$3(function (resolve, reject) { + var numRetries = 15; + var interval = global$2.setInterval(function () { + if (hasLoaded()) { + global$2.clearInterval(interval); + resolve(true); + } else { + numRetries--; + if (numRetries < 0) { + domGlobals.console.log('Could not load emojis from url: ' + databaseUrl); + global$2.clearInterval(interval); + reject(false); + } + } + }, 100); + }); + } + }; + var hasLoaded = function () { + return categories.get().isSome() && all.get().isSome(); + }; + return { + listCategories: listCategories, + hasLoaded: hasLoaded, + waitForLoad: waitForLoad, + listAll: listAll, + listCategory: listCategory + }; + }; + + var patternName = 'pattern'; + var open = function (editor, database) { + var initialState = { + pattern: '', + results: emojisFrom(database.listAll(), '', Option.some(300)) + }; + var currentTab = Cell(ALL_CATEGORY); + var scan = function (dialogApi) { + var dialogData = dialogApi.getData(); + var category = currentTab.get(); + var candidates = database.listCategory(category); + var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Option.some(300) : Option.none()); + dialogApi.setData({ results: results }); + }; + var updateFilter = last(function (dialogApi) { + scan(dialogApi); + }, 200); + var searchField = { + label: 'Search', + type: 'input', + name: patternName + }; + var resultsField = { + type: 'collection', + name: 'results' + }; + var getInitialState = function () { + var body = { + type: 'tabpanel', + tabs: map(database.listCategories(), function (cat) { + return { + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + }; + }) + }; + return { + title: 'Emoticons', + size: 'normal', + body: body, + initialData: initialState, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: updateFilter.throttle, + onAction: function (dialogApi, actionData) { + if (actionData.name === 'results') { + insertEmoticon(editor, actionData.value); + dialogApi.close(); + } + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }] + }; + }; + var dialogApi = editor.windowManager.open(getInitialState()); + dialogApi.focus(patternName); + if (!database.hasLoaded()) { + dialogApi.block('Loading emoticons...'); + database.waitForLoad().then(function () { + dialogApi.redial(getInitialState()); + updateFilter.throttle(dialogApi); + dialogApi.focus(patternName); + dialogApi.unblock(); + }).catch(function (_err) { + dialogApi.redial({ + title: 'Emoticons', + body: { + type: 'panel', + items: [{ + type: 'alertbanner', + level: 'error', + icon: 'warning', + text: '

Could not load emoticons

' + }] + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }], + initialData: { + pattern: '', + results: [] + } + }); + dialogApi.focus(patternName); + dialogApi.unblock(); + }); + } + }; + + var register = function (editor, database) { + var onAction = function () { + return open(editor, database); + }; + editor.ui.registry.addButton('emoticons', { + tooltip: 'Emoticons', + icon: 'emoji', + onAction: onAction + }); + editor.ui.registry.addMenuItem('emoticons', { + text: 'Emoticons...', + icon: 'emoji', + onAction: onAction + }); + }; + + function Plugin () { + global.add('emoticons', function (editor, pluginUrl) { + var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl); + var databaseId = getEmoticonDatabaseId(editor); + var database = initDatabase(editor, databaseUrl, databaseId); + register(editor, database); + init(editor, database); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/emoticons/plugin.min.js b/public/js/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 000000000..0f3995b09 --- /dev/null +++ b/public/js/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(m){"use strict";var n,t,e,u,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return function(){return n}},a=i(!1),c=i(!0),r=function(){return l},l=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:a,isSome:a,isNone:c,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:e,orThunk:t,map:r,each:function(){},bind:r,exists:a,forall:c,filter:r,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),s=function(e){var n=i(e),t=function(){return r},o=function(n){return n(e)},r={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:c,isNone:a,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return s(n(e))},each:function(n){n(e)},bind:o,exists:o,forall:o,filter:function(n){return n(e)?r:l},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(a,function(n){return t(e,n)})}};return r},g={some:s,none:r,from:function(n){return null===n||n===undefined?l:s(n)}},f=function(n,t){return-1!==n.indexOf(t)},d=function(n,t){return f(n.title.toLowerCase(),t)||function(n,t){for(var e=0,o=n.length;eCould not load emoticons

"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(S),f.unblock()}))};!function E(){o.add("emoticons",function(n,t){var e,o,r,i,u,a,c,l=(o=t,(e=n).getParam("emoticons_database_url",o+"/js/emojis"+e.suffix+".js")),s=n.getParam("emoticons_database_id","tinymce.plugins.emoticons","string"),f=L(n,l,s);i=f,u=function(){return N(r,i)},(r=n).ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:u}),r.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:u}),c=f,(a=n).ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,e){return c.waitForLoad().then(function(){var n=c.listAll();return y(n,t,g.some(e))})},onAction:function(n,t,e){a.selection.setRng(t),a.insertContent(e),n.hide()}})})}()}(window); \ No newline at end of file diff --git a/public/js/tinymce/plugins/fullpage/index.js b/public/js/tinymce/plugins/fullpage/index.js new file mode 100644 index 000000000..c327d6a0d --- /dev/null +++ b/public/js/tinymce/plugins/fullpage/index.js @@ -0,0 +1,7 @@ +// Exports the "fullpage" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/fullpage') +// ES2015: +// import 'tinymce/plugins/fullpage' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/fullpage/plugin.js b/public/js/tinymce/plugins/fullpage/plugin.js new file mode 100644 index 000000000..84c02b9f7 --- /dev/null +++ b/public/js/tinymce/plugins/fullpage/plugin.js @@ -0,0 +1,541 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + 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); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); + + var shouldHideInSourceView = function (editor) { + return editor.getParam('fullpage_hide_in_source_view'); + }; + var getDefaultXmlPi = function (editor) { + return editor.getParam('fullpage_default_xml_pi'); + }; + var getDefaultEncoding = function (editor) { + return editor.getParam('fullpage_default_encoding'); + }; + var getDefaultFontFamily = function (editor) { + return editor.getParam('fullpage_default_font_family'); + }; + var getDefaultFontSize = function (editor) { + return editor.getParam('fullpage_default_font_size'); + }; + var getDefaultTextColor = function (editor) { + return editor.getParam('fullpage_default_text_color'); + }; + var getDefaultTitle = function (editor) { + return editor.getParam('fullpage_default_title'); + }; + var getDefaultDocType = function (editor) { + return editor.getParam('fullpage_default_doctype', ''); + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head, { format: 'xhtml' }); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = getDefaultFontFamily(editor); + data.fontsize = getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headerFragment, headElement, html, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + html = global$4({ + validate: false, + indent: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + + var open = function (editor, headState) { + var data = htmlToData(editor, headState.get()); + var defaultData = { + title: '', + keywords: '', + description: '', + robots: '', + author: '', + docencoding: '' + }; + var initialData = __assign(__assign({}, defaultData), data); + editor.windowManager.open({ + title: 'Metadata and Document Properties', + size: 'normal', + body: { + type: 'panel', + items: [ + { + name: 'title', + type: 'input', + label: 'Title' + }, + { + name: 'keywords', + type: 'input', + label: 'Keywords' + }, + { + name: 'description', + type: 'input', + label: 'Description' + }, + { + name: 'robots', + type: 'input', + label: 'Robots' + }, + { + name: 'author', + type: 'input', + label: 'Author' + }, + { + name: 'docencoding', + type: 'input', + label: 'Encoding' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onSubmit: function (api) { + var nuData = api.getData(); + var headHtml = dataToHtml(editor, global$1.extend(data, nuData), headState.get()); + headState.set(headHtml); + api.close(); + } + }); + }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + open(editor, headState); + }); + }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, headerFragment, styles = ''; + var dom = editor.dom; + if (evt.selection) { + return; + } + content = protectHtml(editor.settings.protect, evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + headerFragment = parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + var bodyElm = headerFragment.getAll('body')[0]; + if (bodyElm) { + dom.setAttribs(editor.getBody(), { + style: bodyElm.attr('style') || '', + dir: bodyElm.attr('dir') || '', + vLink: bodyElm.attr('vlink') || '', + link: bodyElm.attr('link') || '', + aLink: bodyElm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); + styleElm.appendChild(domGlobals.document.createTextNode(styles)); + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + href: href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (getDefaultXmlPi(editor)) { + var piEncoding = getDefaultEncoding(editor); + header += '\n'; + } + header += getDefaultDocType(editor); + header += '\n\n\n'; + if (value = getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (!evt.selection && (!evt.source_view || !shouldHideInSourceView(editor))) { + evt.content = unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('fullpage', { + tooltip: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + editor.ui.registry.addMenuItem('fullpage', { + text: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + }; + + function Plugin () { + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + register(editor, headState); + register$1(editor); + setup(editor, headState, footState); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/fullpage/plugin.min.js b/public/js/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 000000000..e371dc735 --- /dev/null +++ b/public/js/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(p){"use strict";var s=function(e){var t=e;return{get:function(){return t},set:function(e){t=e}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(){return(u=Object.assign||function(e){for(var t,n=1,l=arguments.length;n"),(n=r.getAll("title")[0])&&n.firstChild&&(a.title=n.firstChild.value),y.each(r.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?a[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(a.docencoding=t[1])}),(n=r.getAll("html")[0])&&(a.langcode=s(n,"lang")||s(n,"xml:lang")),a.stylesheets=[],y.each(r.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&a.stylesheets.push(e.attr("href"))}),(n=r.getAll("body")[0])&&(a.langdir=s(n,"dir"),a.style=s(n,"style"),a.visited_color=s(n,"vlink"),a.link_color=s(n,"link"),a.active_color=s(n,"alink")),a);function s(e,t){return e.attr(t)||""}var d=u(u({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),c);l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:d,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){var r,n,l,a,i,c=e.dom;function s(e,t,n){e.attr(t,n||undefined)}function d(e){n.firstChild?n.insert(e,n.firstChild):n.append(e)}r=_(t),(n=r.getAll("head")[0])||(a=r.getAll("html")[0],n=new m("head",1),a.firstChild?a.insert(n,a.firstChild,!0):a.append(n)),a=r.firstChild,o.xml_pi?(i='version="1.0"',o.docencoding&&(i+=' encoding="'+o.docencoding+'"'),7!==a.type&&(a=new m("xml",7),r.insert(a,r.firstChild,!0)),a.value=i):a&&7===a.type&&a.remove(),a=r.getAll("#doctype")[0],o.doctype?(a||(a=new m("#doctype",10),o.xml_pi?r.insert(a,r.firstChild):d(a)),a.value=o.doctype.substring(9,o.doctype.length-1)):a&&a.remove(),a=null,y.each(r.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(a=e)}),o.docencoding?(a||((a=new m("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,d(a)),a.attr("content","text/html; charset="+o.docencoding)):a&&a.remove(),a=r.getAll("title")[0],o.title?(a?a.empty():d(a=new m("title",1)),a.append(new m("#text",3)).value=o.title):a&&a.remove(),y.each("keywords,description,author,copyright,robots".split(","),function(e){var t,n,l=r.getAll("meta"),i=o[e];for(t=0;t"))}(l,y.extend(c,t),i.get());i.set(n),e.close()}})},b=y.each,x=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},k=function(e,t,n,l){var i,o,r,a,c,s,d="",u=e.dom;if(!l.selection&&(c=e.settings.protect,s=l.content,y.each(c,function(e){s=s.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=s,!("raw"===l.format&&t.get()||l.source_view&&h(e)))){0!==r.length||l.source_view||(r=y.trim(t.get())+"\n"+y.trim(r)+"\n"+y.trim(n.get())),-1!==(i=(r=r.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(x(r.substring(0,i+1))),-1===(o=r.indexOf("\n")),a=_(t.get()),b(a.getAll("style"),function(e){e.firstChild&&(d+=e.firstChild.value)});var m=a.getAll("body")[0];m&&u.setAttribs(e.getBody(),{style:m.attr("style")||"",dir:m.attr("dir")||"",vLink:m.attr("vlink")||"",link:m.attr("link")||"",aLink:m.attr("alink")||""}),u.remove("fullpage_styles");var f=e.getDoc().getElementsByTagName("head")[0];if(d)u.add(f,"style",{id:"fullpage_styles"}).appendChild(p.document.createTextNode(d));var g={};y.each(f.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(g[e.href]=e)}),y.each(a.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;g[t]||"stylesheet"!==e.attr("rel")||u.add(f,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete g[t]}),y.each(g,function(e){e.parentNode.removeChild(e)})}},C=function(e){var t,n="",l="";if(e.getParam("fullpage_default_xml_pi")){var i=o(e);n+='\n'}return n+=e.getParam("fullpage_default_doctype",""),n+="\n\n\n",(t=e.getParam("fullpage_default_title"))&&(n+=""+t+"\n"),(t=o(e))&&(n+='\n'),(t=g(e))&&(l+="font-family: "+t+";"),(t=v(e))&&(l+="font-size: "+t+";"),(t=e.getParam("fullpage_default_text_color"))&&(l+="color: "+t+";"),n+="\n\n"},A=function(e,t,n,l){l.selection||l.source_view&&h(e)||(l.content=(y.trim(t)+"\n"+y.trim(l.content)+"\n"+y.trim(n)).replace(//g,function(e,t){return unescape(t)}))};!function n(){e.add("fullpage",function(e){var t,n,l,i,o,r,a=s(""),c=s("");n=a,(t=e).addCommand("mceFullPageProperties",function(){d(t,n)}),(l=e).ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),l.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),o=a,r=c,(i=e).on("BeforeSetContent",function(e){k(i,o,r,e)}),i.on("GetContent",function(e){A(i,o.get(),r.get(),e)})})}()}(window); \ No newline at end of file diff --git a/public/js/tinymce/plugins/fullscreen/index.js b/public/js/tinymce/plugins/fullscreen/index.js new file mode 100644 index 000000000..6b4e26329 --- /dev/null +++ b/public/js/tinymce/plugins/fullscreen/index.js @@ -0,0 +1,7 @@ +// Exports the "fullscreen" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/fullscreen') +// ES2015: +// import 'tinymce/plugins/fullscreen' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/fullscreen/plugin.js b/public/js/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 000000000..3b5ccb562 --- /dev/null +++ b/public/js/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,789 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + + var noop = function () { + }; + var compose = function (fa, fb) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fa(fb.apply(null, args)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var revocable = function (doRevoke) { + var subject = Cell(Option.none()); + var revoke = function () { + subject.get().each(doRevoke); + }; + var clear = function () { + revoke(); + subject.set(Option.none()); + }; + var set = function (s) { + revoke(); + subject.set(Option.some(s)); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + isSet: isSet, + set: set + }; + }; + var unbindable = function () { + return revocable(function (s) { + s.unbind(); + }); + }; + var value = function () { + var subject = Cell(Option.none()); + var clear = function () { + subject.set(Option.none()); + }; + var set = function (s) { + subject.set(Option.some(s)); + }; + var on = function (f) { + subject.get().each(f); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + set: set, + isSet: isSet, + on: on + }; + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isBoolean = isSimpleType('boolean'); + var isFunction = isSimpleType('function'); + var isNumber = isSimpleType('number'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var DOCUMENT = 9; + var ELEMENT = 1; + var TEXT = 3; + + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType$1(TEXT); + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + var get$1 = function (element, key) { + var v = element.dom().getAttribute(key); + return v === null ? undefined : v; + }; + var remove = function (element, key) { + element.dom().removeAttribute(key); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var setAll = function (element, css) { + var dom = element.dom(); + each$1(css, function (v, k) { + internalSet(dom, k, v); + }); + }; + var get$2 = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + return { + target: constant(target), + x: constant(x), + y: constant(y), + stop: stop, + prevent: prevent, + kill: kill, + raw: constant(raw) + }; + }; + var fromRawEvent = function (rawEvent) { + var target = Element.fromDom(rawEvent.target); + var stop = function () { + return rawEvent.stopPropagation(); + }; + var prevent = function () { + return rawEvent.preventDefault(); + }; + var kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + + var ELEMENT$1 = ELEMENT; + var DOCUMENT$1 = DOCUMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? domGlobals.document : scope.dom(); + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var parents = function (element, isRoot) { + var stop = isFunction(isRoot) ? isRoot : never; + var dom = element.dom(); + var ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + var rawParent = dom.parentNode; + var p = Element.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + var siblings = function (element) { + var filterSelf = function (elements) { + return filter(elements, function (x) { + return !eq(element, x); + }); + }; + return parent(element).map(children).map(filterSelf).getOr([]); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + + var r = function (left, top) { + var translate = function (x, y) { + return r(left + x, top + y); + }; + return { + left: constant(left), + top: constant(top), + translate: translate + }; + }; + var Position = r; + + var get$3 = function (_DOC) { + var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; + var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + var y = doc.body.scrollTop || doc.documentElement.scrollTop; + return Position(x, y); + }; + + var get$4 = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + return Option.from(win['visualViewport']); + }; + var bounds = function (x, y, width, height) { + return { + x: x, + y: y, + width: width, + height: height, + right: x + width, + bottom: y + height + }; + }; + var getBounds = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + var doc = win.document; + var scroll = get$3(Element.fromDom(doc)); + return get$4(win).fold(function () { + var html = win.document.documentElement; + var width = html.clientWidth; + var height = html.clientHeight; + return bounds(scroll.left(), scroll.top(), width, height); + }, function (visualViewport) { + return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height); + }); + }; + var bind$1 = function (name, callback, _win) { + return get$4(_win).map(function (visualViewport) { + var handler = function (e) { + return fromRawEvent(e); + }; + visualViewport.addEventListener(name, handler); + return { + unbind: function () { + return visualViewport.removeEventListener(name, handler); + } + }; + }).getOrThunk(function () { + return { unbind: noop }; + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + + var ancestors = function (scope, predicate, isRoot) { + return filter(parents(scope, isRoot), predicate); + }; + var siblings$1 = function (scope, predicate) { + return filter(siblings(scope), predicate); + }; + + var all$1 = function (selector) { + return all(selector); + }; + var ancestors$1 = function (scope, selector, isRoot) { + return ancestors(scope, function (e) { + return is(e, selector); + }, isRoot); + }; + var siblings$2 = function (scope, selector) { + return siblings$1(scope, function (e) { + return is(e, selector); + }); + }; + + var attr = 'data-ephox-mobile-fullscreen-style'; + var siblingStyles = 'display:none!important;'; + var ancestorPosition = 'position:absolute!important;'; + var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + var bgFallback = 'background-color:rgb(255,255,255)!important;'; + var isAndroid = global$2.os.isAndroid(); + var matchColor = function (editorBody) { + var color = get$2(editorBody, 'background-color'); + return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; + }; + var clobberStyles = function (dom, container, editorBody) { + var gatherSibilings = function (element) { + return siblings$2(element, '*:not(.tox-silver-sink)'); + }; + var clobber = function (clobberStyle) { + return function (element) { + var styles = get$1(element, 'style'); + var backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } + }; + }; + var ancestors = ancestors$1(container, '*'); + var siblings = bind(ancestors, gatherSibilings); + var bgColor = matchColor(editorBody); + each(siblings, clobber(siblingStyles)); + each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); + var containerStyles = isAndroid === true ? '' : ancestorPosition; + clobber(containerStyles + ancestorStyles + bgColor)(container); + }; + var restoreStyles = function (dom) { + var clobberedEls = all$1('[' + attr + ']'); + each(clobberedEls, function (element) { + var restore = get$1(element, attr); + if (restore !== 'no-styles') { + setAll(element, dom.parseStyle(restore)); + } else { + remove(element, 'style'); + } + remove(element, attr); + }); + }; + + var DOM = global$1.DOM; + var getScrollPos = function () { + var vp = getBounds(domGlobals.window); + return { + x: vp.x, + y: vp.y + }; + }; + var setScrollPos = function (pos) { + domGlobals.window.scrollTo(pos.x, pos.y); + }; + var viewportUpdate = get$4().fold(function () { + return { + bind: noop, + unbind: noop + }; + }, function (visualViewport) { + var editorContainer = value(); + var resizeBinder = unbindable(); + var scrollBinder = unbindable(); + var refreshScroll = function () { + domGlobals.document.body.scrollTop = 0; + domGlobals.document.documentElement.scrollTop = 0; + }; + var refreshVisualViewport = function () { + domGlobals.window.requestAnimationFrame(function () { + editorContainer.on(function (container) { + return setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + }); + }); + }); + }; + var update = global$3.throttle(function () { + refreshScroll(); + refreshVisualViewport(); + }, 50); + var bind = function (element) { + editorContainer.set(element); + update(); + resizeBinder.set(bind$1('resize')); + scrollBinder.set(bind$1('scroll')); + }; + var unbind = function () { + editorContainer.on(function () { + resizeBinder.clear(); + scrollBinder.clear(); + }); + editorContainer.clear(); + }; + return { + bind: bind, + unbind: unbind + }; + }); + var toggleFullscreen = function (editor, fullscreenState) { + var body = domGlobals.document.body; + var documentElement = domGlobals.document.documentElement; + var editorContainerStyle; + var editorContainer, iframe, iframeStyle; + editorContainer = editor.getContainer(); + var editorContainerS = Element.fromDom(editorContainer); + var fullscreenInfo = fullscreenState.get(); + var editorBody = Element.fromDom(editor.getBody()); + var isTouch = global$2.deviceType.isTouch(); + editorContainerStyle = editorContainer.style; + iframe = editor.getContentAreaContainer().firstChild; + iframeStyle = iframe.style; + if (!fullscreenInfo) { + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + containerTop: editorContainerStyle.top, + containerLeft: editorContainerStyle.left, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height + }; + if (isTouch) { + clobberStyles(editor.dom, editorContainerS, editorBody); + } + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + DOM.addClass(body, 'tox-fullscreen'); + DOM.addClass(documentElement, 'tox-fullscreen'); + DOM.addClass(editorContainer, 'tox-fullscreen'); + viewportUpdate.bind(editorContainerS); + editor.on('remove', viewportUpdate.unbind); + fullscreenState.set(newFullScreenInfo); + fireFullscreenStateChanged(editor, true); + } else { + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + editorContainerStyle.width = fullscreenInfo.containerWidth; + editorContainerStyle.height = fullscreenInfo.containerHeight; + editorContainerStyle.top = fullscreenInfo.containerTop; + editorContainerStyle.left = fullscreenInfo.containerLeft; + if (isTouch) { + restoreStyles(editor.dom); + } + DOM.removeClass(body, 'tox-fullscreen'); + DOM.removeClass(documentElement, 'tox-fullscreen'); + DOM.removeClass(editorContainer, 'tox-fullscreen'); + setScrollPos(fullscreenInfo.scrollPos); + fullscreenState.set(null); + fireFullscreenStateChanged(editor, false); + viewportUpdate.unbind(); + editor.off('remove', viewportUpdate.unbind); + } + }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + toggleFullscreen(editor, fullscreenState); + }); + }; + + var makeSetupHandler = function (editor, fullscreenState) { + return function (api) { + api.setActive(fullscreenState.get() !== null); + var editorEventCallback = function (e) { + return api.setActive(e.state); + }; + editor.on('FullscreenStateChanged', editorEventCallback); + return function () { + return editor.off('FullscreenStateChanged', editorEventCallback); + }; + }; + }; + var register$1 = function (editor, fullscreenState) { + editor.ui.registry.addToggleMenuItem('fullscreen', { + text: 'Fullscreen', + icon: 'fullscreen', + shortcut: 'Meta+Shift+F', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + editor.ui.registry.addToggleButton('fullscreen', { + tooltip: 'Fullscreen', + icon: 'fullscreen', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + }; + + function Plugin () { + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.settings.inline) { + return get(fullscreenState); + } + register(editor, fullscreenState); + register$1(editor, fullscreenState); + editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); + return get(fullscreenState); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/fullscreen/plugin.min.js b/public/js/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 000000000..c19618dc4 --- /dev/null +++ b/public/js/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(g){"use strict";var n,t,e,r,c=function(n){var t=n;return{get:function(){return t},set:function(n){t=n}}},o=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(n){return{isFullscreen:function(){return null!==n.get()}}},i=function(){},a=function(n){return function(){return n}},l=a(!1),f=a(!0),d=function(){return s},s=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:l,isSome:l,isNone:f,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:a(null),getOrUndefined:a(undefined),or:e,orThunk:t,map:d,each:i,bind:d,exists:l,forall:f,filter:d,equals:n,equals_:n,toArray:function(){return[]},toString:a("none()")}),m=function(e){var n=a(e),t=function(){return o},r=function(n){return n(e)},o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:f,isNone:l,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return m(n(e))},each:function(n){n(e)},bind:r,exists:r,forall:r,filter:function(n){return n(e)?o:s},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(l,function(n){return t(e,n)})}};return o},h={some:m,none:d,from:function(n){return null===n||n===undefined?s:m(n)}},p=function(){return n=function(n){n.unbind()},t=c(h.none()),e=function(){t.get().each(n)},{clear:function(){e(),t.set(h.none())},isSet:function(){return t.get().isSome()},set:function(n){e(),t.set(h.some(n))}};var n,t,e},v=function(r){return function(n){return e=typeof(t=n),(null===t?"null":"object"==e&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":e)===r;var t,e}},y=function(t){return function(n){return typeof n===t}},w=v("string"),b=v("array"),S=y("boolean"),T=y("function"),x=y("number"),C=Array.prototype.push,A=function(n,t){for(var e=n.length,r=new Array(e),o=0;o -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } else if (until(x, i)) { + break; + } + } + return Option.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var get$1 = function (obj, key) { + return has(obj, key) ? Option.from(obj[key]) : Option.none(); + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getHelpTabs = function (editor) { + return Option.from(editor.getParam('help_tabs')); + }; + + var shortcuts = [ + { + shortcuts: ['Meta + B'], + action: 'Bold' + }, + { + shortcuts: ['Meta + I'], + action: 'Italic' + }, + { + shortcuts: ['Meta + U'], + action: 'Underline' + }, + { + shortcuts: ['Meta + A'], + action: 'Select all' + }, + { + shortcuts: [ + 'Meta + Y', + 'Meta + Shift + Z' + ], + action: 'Redo' + }, + { + shortcuts: ['Meta + Z'], + action: 'Undo' + }, + { + shortcuts: ['Access + 1'], + action: 'Header 1' + }, + { + shortcuts: ['Access + 2'], + action: 'Header 2' + }, + { + shortcuts: ['Access + 3'], + action: 'Header 3' + }, + { + shortcuts: ['Access + 4'], + action: 'Header 4' + }, + { + shortcuts: ['Access + 5'], + action: 'Header 5' + }, + { + shortcuts: ['Access + 6'], + action: 'Header 6' + }, + { + shortcuts: ['Access + 7'], + action: 'Paragraph' + }, + { + shortcuts: ['Access + 8'], + action: 'Div' + }, + { + shortcuts: ['Access + 9'], + action: 'Address' + }, + { + shortcuts: ['Alt + 0'], + action: 'Open help dialog' + }, + { + shortcuts: ['Alt + F9'], + action: 'Focus to menubar' + }, + { + shortcuts: ['Alt + F10'], + action: 'Focus to toolbar' + }, + { + shortcuts: ['Alt + F11'], + action: 'Focus to element path' + }, + { + shortcuts: ['Ctrl + F9'], + action: 'Focus to contextual toolbar' + }, + { + shortcuts: ['Shift + Enter'], + action: 'Open popup menu for split buttons' + }, + { + shortcuts: ['Meta + K'], + action: 'Insert link (if link plugin activated)' + }, + { + shortcuts: ['Meta + S'], + action: 'Save (if save plugin activated)' + }, + { + shortcuts: ['Meta + F'], + action: 'Find (if searchreplace plugin activated)' + }, + { + shortcuts: ['Meta + Shift + F'], + action: 'Switch to or from fullscreen mode' + } + ]; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var convertText = function (source) { + var mac = { + alt: '⌥', + ctrl: '⌃', + shift: '⇧', + meta: '⌘', + access: '⌃⌥' + }; + var other = { + meta: 'Ctrl ', + access: 'Shift + Alt ' + }; + var replace = global$1.mac ? mac : other; + var shortcut = source.split('+'); + var updated = map(shortcut, function (segment) { + var search = segment.toLowerCase().trim(); + return has(replace, search) ? replace[search] : segment; + }); + return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + }; + + var tab = function () { + var shortcutList = map(shortcuts, function (shortcut) { + var shortcutText = map(shortcut.shortcuts, convertText).join(' or '); + return [ + shortcut.action, + shortcutText + ]; + }); + var tablePanel = { + type: 'table', + header: [ + 'Action', + 'Shortcut' + ], + cells: shortcutList + }; + return { + name: 'shortcuts', + title: 'Handy Shortcuts', + items: [tablePanel] + }; + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + }, + { + key: 'advcode', + name: 'Advanced Code Editor*' + }, + { + key: 'formatpainter', + name: 'Format Painter*' + }, + { + key: 'powerpaste', + name: 'PowerPaste*' + }, + { + key: 'tinydrive', + name: 'Tiny Drive*' + }, + { + key: 'tinymcespellchecker', + name: 'Spell Checker Pro*' + }, + { + key: 'a11ychecker', + name: 'Accessibility Checker*' + }, + { + key: 'linkchecker', + name: 'Link Checker*' + }, + { + key: 'mentions', + name: 'Mentions*' + }, + { + key: 'mediaembed', + name: 'Enhanced Media Embed*' + }, + { + key: 'checklist', + name: 'Checklist*' + }, + { + key: 'casechange', + name: 'Case Change*' + }, + { + key: 'permanentpen', + name: 'Permanent Pen*' + }, + { + key: 'pageembed', + name: 'Page Embed*' + }, + { + key: 'tinycomments', + name: 'Tiny Comments*' + }, + { + key: 'advtable', + name: 'Advanced Tables*' + }, + { + key: 'autocorrect', + name: 'Autocorrect*' + } + ]; + + var tab$1 = function (editor) { + var availablePlugins = function () { + var premiumPlugins = [ + 'Accessibility Checker', + 'Advanced Code Editor', + 'Advanced Tables', + 'Case Change', + 'Checklist', + 'Tiny Comments', + 'Tiny Drive', + 'Enhanced Media Embed', + 'Format Painter', + 'Link Checker', + 'Mentions', + 'MoxieManager', + 'Page Embed', + 'Permanent Pen', + 'PowerPaste', + 'Spell Checker Pro' + ]; + var premiumPluginList = map(premiumPlugins, function (plugin) { + return '
  • ' + global$2.translate(plugin) + '
  • '; + }).join(''); + return '
    ' + '

    ' + global$2.translate('Premium plugins:') + '

    ' + '' + '
    '; + }; + var makeLink = function (p) { + return '' + p.name + ''; + }; + var maybeUrlize = function (editor, key) { + return find(urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + return makeLink({ + name: x.name, + url: 'https://www.tiny.cloud/docs/plugins/' + x.key + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + return editor.settings.forced_plugins === undefined ? keys$1 : filter(keys$1, function (k) { + return !contains(editor.settings.forced_plugins, k); + }); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
  • ' + maybeUrlize(editor, key) + '
  • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + var html = '

    ' + global$2.translate([ + 'Plugins installed ({0}):', + count + ]) + '

    ' + '
      ' + pluginsString + '
    '; + return html; + }; + var installedPlugins = function (editor) { + if (editor == null) { + return ''; + } + return '
    ' + pluginLister(editor) + '
    '; + }; + var htmlPanel = { + type: 'htmlpanel', + presets: 'document', + html: [ + installedPlugins(editor), + availablePlugins() + ].join('') + }; + return { + name: 'plugins', + title: 'Plugins', + items: [htmlPanel] + }; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var tab$2 = function () { + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + var htmlPanel = { + type: 'htmlpanel', + html: '

    ' + global$2.translate([ + 'You are using {0}', + changeLogLink + ]) + '

    ', + presets: 'document' + }; + return { + name: 'versions', + title: 'Version', + items: [htmlPanel] + }; + }; + + var description = '

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    '; + var tab$3 = function () { + var body = { + type: 'htmlpanel', + presets: 'document', + html: description + }; + return { + name: 'keyboardnav', + title: 'Keyboard Navigation', + items: [body] + }; + }; + + var parseHelpTabsSetting = function (tabsFromSettings, tabs) { + var newTabs = {}; + var names = map(tabsFromSettings, function (t) { + if (typeof t === 'string') { + if (has(tabs, t)) { + newTabs[t] = tabs[t]; + } + return t; + } else { + newTabs[t.name] = t; + return t.name; + } + }); + return { + tabs: newTabs, + names: names + }; + }; + var getNamesFromTabs = function (tabs) { + var names = keys(tabs); + var idx = names.indexOf('versions'); + if (idx !== -1) { + names.splice(idx, 1); + names.push('versions'); + } + return { + tabs: tabs, + names: names + }; + }; + var parseCustomTabs = function (editor, customTabs) { + var _a; + var shortcuts = tab(); + var nav = tab$3(); + var plugins = tab$1(editor); + var versions = tab$2(); + var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); + return getHelpTabs(editor).fold(function () { + return getNamesFromTabs(tabs); + }, function (tabsFromSettings) { + return parseHelpTabsSetting(tabsFromSettings, tabs); + }); + }; + var init = function (editor, customTabs) { + return function () { + var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; + var foundTabs = map(names, function (name) { + return get$1(tabs, name); + }); + var dialogTabs = cat(foundTabs); + var body = { + type: 'tabpanel', + tabs: dialogTabs + }; + editor.windowManager.open({ + title: 'Help', + size: 'medium', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: {} + }); + }; + }; + + function Plugin () { + global.add('help', function (editor) { + var customTabs = Cell({}); + var api = get(customTabs); + var dialogOpener = init(editor, customTabs); + register$1(editor, dialogOpener); + register(editor, dialogOpener); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + return api; + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/help/plugin.min.js b/public/js/tinymce/plugins/help/plugin.min.js new file mode 100644 index 000000000..ce2ff32e6 --- /dev/null +++ b/public/js/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var e,t,n,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(e){for(var t,n=1,a=arguments.length;n'+e.name+""};return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==(n=e)?"":'
    '+function(a){var t,e,n=(e=f((t=a).plugins),t.settings.forced_plugins===undefined?e:function(e,t){for(var n=[],a=0,o=e.length;a"+(t=a,n=e,g(C,function(e){return e.key===n}).fold(function(){var e=t.plugins[n].getMetadata;return"function"==typeof e?s(e()):n},function(e){return s({name:e.name,url:"https://www.tiny.cloud/docs/plugins/"+e.key})}))+"";var t,n}),i=o.length,r=o.join("");return"

    "+A.translate(["Plugins installed ({0}):",i])+"

      "+r+"
    "}(n)+"
    ",(t=p(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
  • "+A.translate(e)+"
  • "}).join(""),'

    '+A.translate("Premium plugins:")+"

    ")].join("")}]}},x=tinymce.util.Tools.resolve("tinymce.EditorManager"),M=function(e,t){var n,a,o,i,r,s={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:p(k,function(e){var t=p(e.shortcuts,w).join(" or ");return[e.action,t]})}]},c={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    "}]},l=T(e),u=(i='TinyMCE '+(a=x.majorVersion,o=x.minorVersion,0===a.indexOf("@")?"X.X.X":a+"."+o)+"",{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+A.translate(["You are using {0}",i])+"

    ",presets:"document"}]}),h=m(((n={})[s.name]=s,n[c.name]=c,n[l.name]=l,n[u.name]=u,n),t.get());return r=e,d.from(r.getParam("help_tabs")).fold(function(){return t=f(e=h),-1!==(n=t.indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=h,n={},a=p(e,function(e){return"string"==typeof e?(y(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})},P=function(o,i){return function(){var e=M(o,i),a=e.tabs,t=e.names,n={type:"tabpanel",tabs:function(e){for(var t=[],n=function(e){t.push(e)},a=0;a'); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('hr', { + icon: 'horizontal-rule', + tooltip: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + editor.ui.registry.addMenuItem('hr', { + icon: 'horizontal-rule', + text: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + }; + + function Plugin () { + global.add('hr', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/hr/plugin.min.js b/public/js/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 000000000..66d78240a --- /dev/null +++ b/public/js/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");!function o(){n.add("hr",function(n){var o,t;(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"
    ")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}})})}()}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/image/index.js b/public/js/tinymce/plugins/image/index.js new file mode 100644 index 000000000..092c73ad6 --- /dev/null +++ b/public/js/tinymce/plugins/image/index.js @@ -0,0 +1,7 @@ +// Exports the "image" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/image') +// ES2015: +// import 'tinymce/plugins/image' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/image/plugin.js b/public/js/tinymce/plugins/image/plugin.js new file mode 100644 index 000000000..41dfe30d1 --- /dev/null +++ b/public/js/tinymce/plugins/image/plugin.js @@ -0,0 +1,1662 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var eq = function (t) { + return function (a) { + return t === a; + }; + }; + var isString = isType('string'); + var isObject = isType('object'); + var isArray = isType('array'); + var isNull = eq(null); + var isBoolean = isSimpleType('boolean'); + var isNumber = isSimpleType('number'); + + var nativePush = Array.prototype.push; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var deep = function (old, nu) { + var bothObjects = isObject(old) && isObject(nu); + return bothObjects ? deepMerge(old, nu) : nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var deepMerge = baseMerge(deep); + + 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); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + var remove = function (element, key) { + element.dom().removeAttribute(key); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var hasDimensions = function (editor) { + return editor.getParam('image_dimensions', true, 'boolean'); + }; + var hasAdvTab = function (editor) { + return editor.getParam('image_advtab', false, 'boolean'); + }; + var hasUploadTab = function (editor) { + return editor.getParam('image_uploadtab', true, 'boolean'); + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', '', 'string'); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.getParam('image_description', true, 'boolean'); + }; + var hasImageTitle = function (editor) { + return editor.getParam('image_title', false, 'boolean'); + }; + var hasImageCaption = function (editor) { + return editor.getParam('image_caption', false, 'boolean'); + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return !!getUploadUrl(editor); + }; + var hasUploadHandler = function (editor) { + return !!getUploadHandler(editor); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url', '', 'string'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', undefined, 'function'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path', undefined, 'string'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials', false, 'boolean'); + }; + var showAccessibilityOptions = function (editor) { + return editor.getParam('a11y_advanced_options', false, 'boolean'); + }; + var isAutomaticUploadsEnabled = function (editor) { + return editor.getParam('automatic_uploads', true, 'boolean'); + }; + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url) { + return new global$2(function (callback) { + var img = domGlobals.document.createElement('img'); + var done = function (dimensions) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + var dimensions = { + width: width, + height: height + }; + done(global$2.resolve(dimensions)); + }; + img.onerror = function () { + done(global$2.reject('Failed to get image dimensions for: ' + url)); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + domGlobals.document.body.appendChild(img); + img.src = url; + }); + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = String(css.margin).split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = getImageList(editor); + if (typeof imageList === 'string') { + global$3.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + var selectImage = function () { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + }; + imgElm.onload = function () { + if (!data.width && !data.height && hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: String(imgElm.clientWidth), + height: String(imgElm.clientHeight) + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$2(function (resolve, reject) { + var reader = new domGlobals.FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var isPlaceholderImage = function (imgElm) { + return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + }; + + var DOM = global$1.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var updateAttrib = function (image, name, value) { + if (value === '') { + image.removeAttribute(name); + } else { + image.setAttribute(name, value); + } + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + updateAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var isImage = function (elm) { + return elm.nodeName === 'IMG'; + }; + var getIsDecorative = function (image) { + return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + }; + var getAlt = function (image) { + if (getIsDecorative(image)) { + return ''; + } else { + return getAttrib(image, 'alt'); + } + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + updateAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + write(normalizeCss, __assign(__assign({}, data), { caption: false }), image); + setAlt(image, data.alt, data.isDecorative); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle'), + isDecorative: getIsDecorative(image) + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var setAlt = function (image, alt, isDecorative) { + if (isDecorative) { + DOM.setAttrib(image, 'role', 'presentation'); + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', ''); + } else { + if (isNull(alt)) { + var sugarImage = Element.fromDom(image); + remove(sugarImage, 'alt'); + } else { + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', alt); + } + if (DOM.getAttrib(image, 'role') === 'presentation') { + DOM.setAttrib(image, 'role', ''); + } + } + }; + var updateAlt = function (image, oldData, newData) { + if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { + setAlt(image, newData.alt, newData.isDecorative); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', updateAttrib); + updateProp(image, oldData, newData, 'title', updateAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', updateAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return updateAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + updateAlt(image, oldData, newData); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || isPlaceholderImage(imgElm))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return !!editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, partialData) { + var image = getSelectedImage(editor); + if (image) { + var selectedImageData = read(function (css) { + return normalizeCss(editor, css); + }, image); + var data = __assign(__assign({}, selectedImageData), partialData); + if (data.src) { + writeImageDataToSelection(editor, data); + } else { + deleteImage(editor, image); + } + } else if (partialData.src) { + insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData)); + } + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$4.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizer = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + if (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + } else { + return Option.none(); + } + }; + }; + var sanitize = function (list) { + return sanitizer(getValue)(list); + }; + var isGroup = function (item) { + return Object.prototype.hasOwnProperty.call(item, 'items'); + }; + var findEntryDelegate = function (list, value) { + return findMap(list, function (item) { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Option.some(item); + } else { + return Option.none(); + } + }); + }; + var findEntry = function (optList, value) { + return optList.bind(function (list) { + return findEntryDelegate(list, value); + }); + }; + var ListUtils = { + sanitizer: sanitizer, + sanitize: sanitize, + findEntry: findEntry + }; + + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr, formData; + xhr = new domGlobals.XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + var json; + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + formData = new domGlobals.FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$2(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$2.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$4.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var makeTab = function (_info) { + return { + title: 'Advanced', + name: 'advanced', + items: [ + { + type: 'input', + label: 'Style', + name: 'style' + }, + { + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'selectbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var collect = function (editor) { + var urlListSanitizer = ListUtils.sanitizer(function (item) { + return editor.convertURL(item.value || item.url, 'src'); + }); + var futureImageList = new global$2(function (completer) { + createImageList(editor, function (imageList) { + completer(urlListSanitizer(imageList).map(function (items) { + return flatten([ + [{ + text: 'None', + value: '' + }], + items + ]); + })); + }); + }); + var classList = ListUtils.sanitize(getClassList(editor)); + var hasAdvTab$1 = hasAdvTab(editor); + var hasUploadTab$1 = hasUploadTab(editor); + var hasUploadUrl$1 = hasUploadUrl(editor); + var hasUploadHandler$1 = hasUploadHandler(editor); + var image = readImageDataFromSelection(editor); + var hasDescription$1 = hasDescription(editor); + var hasImageTitle$1 = hasImageTitle(editor); + var hasDimensions$1 = hasDimensions(editor); + var hasImageCaption$1 = hasImageCaption(editor); + var hasAccessibilityOptions = showAccessibilityOptions(editor); + var url = getUploadUrl(editor); + var basePath = getUploadBasePath(editor); + var credentials = getUploadCredentials(editor); + var handler = getUploadHandler(editor); + var automaticUploads = isAutomaticUploadsEnabled(editor); + var prependURL = Option.some(getPrependUrl(editor)).filter(function (preUrl) { + return isString(preUrl) && preUrl.length > 0; + }); + return futureImageList.then(function (imageList) { + return { + image: image, + imageList: imageList, + classList: classList, + hasAdvTab: hasAdvTab$1, + hasUploadTab: hasUploadTab$1, + hasUploadUrl: hasUploadUrl$1, + hasUploadHandler: hasUploadHandler$1, + hasDescription: hasDescription$1, + hasImageTitle: hasImageTitle$1, + hasDimensions: hasDimensions$1, + hasImageCaption: hasImageCaption$1, + url: url, + basePath: basePath, + credentials: credentials, + handler: handler, + prependURL: prependURL, + hasAccessibilityOptions: hasAccessibilityOptions, + automaticUploads: automaticUploads + }; + }); + }; + + var makeItems = function (info) { + var imageUrl = { + name: 'src', + type: 'urlinput', + filetype: 'image', + label: 'Source' + }; + var imageList = info.imageList.map(function (items) { + return { + name: 'images', + type: 'selectbox', + label: 'Image list', + items: items + }; + }); + var imageDescription = { + name: 'alt', + type: 'input', + label: 'Alternative description', + disabled: info.hasAccessibilityOptions && info.image.isDecorative + }; + var imageTitle = { + name: 'title', + type: 'input', + label: 'Image title' + }; + var imageDimensions = { + name: 'dimensions', + type: 'sizeinput' + }; + var isDecorative = { + type: 'label', + label: 'Accessibility', + items: [{ + name: 'isDecorative', + type: 'checkbox', + label: 'Image is decorative' + }] + }; + var classList = info.classList.map(function (items) { + return { + name: 'classes', + type: 'selectbox', + label: 'Class', + items: items + }; + }); + var caption = { + type: 'label', + label: 'Caption', + items: [{ + type: 'checkbox', + name: 'caption', + label: 'Show caption' + }] + }; + return flatten([ + [imageUrl], + imageList.toArray(), + info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [], + info.hasDescription ? [imageDescription] : [], + info.hasImageTitle ? [imageTitle] : [], + info.hasDimensions ? [imageDimensions] : [], + [{ + type: 'grid', + columns: 2, + items: flatten([ + classList.toArray(), + info.hasImageCaption ? [caption] : [] + ]) + }] + ]); + }; + var makeTab$1 = function (info) { + return { + title: 'General', + name: 'general', + items: makeItems(info) + }; + }; + var MainTab = { + makeTab: makeTab$1, + makeItems: makeItems + }; + + var makeTab$2 = function (_info) { + var items = [{ + type: 'dropzone', + name: 'fileinput' + }]; + return { + title: 'Upload', + name: 'upload', + items: items + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + var createState = function (info) { + return { + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }; + }; + var fromImageData = function (image) { + return { + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }; + }; + var toImageData = function (data, removeEmptyAlt) { + return { + src: data.src.value, + alt: data.alt.length === 0 && removeEmptyAlt ? null : data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }; + }; + var addPrependUrl2 = function (info, srcURL) { + if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { + return info.prependURL.bind(function (prependUrl) { + if (srcURL.substring(0, prependUrl.length) !== prependUrl) { + return Option.some(prependUrl + srcURL); + } + return Option.none(); + }); + } + return Option.none(); + }; + var addPrependUrl = function (info, api) { + var data = api.getData(); + addPrependUrl2(info, data.src.value).each(function (srcURL) { + api.setData({ + src: { + value: srcURL, + meta: data.src.meta + } + }); + }); + }; + var formFillFromMeta2 = function (info, data, meta) { + if (info.hasDescription && isString(meta.alt)) { + data.alt = meta.alt; + } + if (info.hasAccessibilityOptions) { + data.isDecorative = meta.isDecorative || data.isDecorative || false; + } + if (info.hasImageTitle && isString(meta.title)) { + data.title = meta.title; + } + if (info.hasDimensions) { + if (isString(meta.width)) { + data.dimensions.width = meta.width; + } + if (isString(meta.height)) { + data.dimensions.height = meta.height; + } + } + if (isString(meta.class)) { + ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + data.classes = entry.value; + }); + } + if (info.hasImageCaption) { + if (isBoolean(meta.caption)) { + data.caption = meta.caption; + } + } + if (info.hasAdvTab) { + if (isString(meta.style)) { + data.style = meta.style; + } + if (isString(meta.vspace)) { + data.vspace = meta.vspace; + } + if (isString(meta.border)) { + data.border = meta.border; + } + if (isString(meta.hspace)) { + data.hspace = meta.hspace; + } + if (isString(meta.borderstyle)) { + data.borderstyle = meta.borderstyle; + } + } + }; + var formFillFromMeta = function (info, api) { + var data = api.getData(); + var meta = data.src.meta; + if (meta !== undefined) { + var newData = deepMerge({}, data); + formFillFromMeta2(info, newData, meta); + api.setData(newData); + } + }; + var calculateImageSize = function (helpers, info, state, api) { + var data = api.getData(); + var url = data.src.value; + var meta = data.src.meta || {}; + if (!meta.width && !meta.height && info.hasDimensions) { + helpers.imageSize(url).then(function (size) { + if (state.open) { + api.setData({ dimensions: size }); + } + }); + } + }; + var updateImagesDropdown = function (info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.src.value); + state.prevImage = image; + api.setData({ + images: image.map(function (entry) { + return entry.value; + }).getOr('') + }); + }; + var changeSrc = function (helpers, info, state, api) { + addPrependUrl(info, api); + formFillFromMeta(info, api); + calculateImageSize(helpers, info, state, api); + updateImagesDropdown(info, state, api); + }; + var changeImages = function (helpers, info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.images); + image.each(function (img) { + var updateAlt = data.alt === '' || state.prevImage.map(function (image) { + return image.text === data.alt; + }).getOr(false); + if (updateAlt) { + if (img.value === '') { + api.setData({ + src: img, + alt: state.prevAlt + }); + } else { + api.setData({ + src: img, + alt: img.text + }); + } + } else { + api.setData({ src: img }); + } + }); + state.prevImage = image; + changeSrc(helpers, info, state, api); + }; + var calcVSpace = function (css) { + var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; + return matchingTopBottom ? removePixelSuffix(String(css['margin-top'])) : ''; + }; + var calcHSpace = function (css) { + var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; + return matchingLeftRight ? removePixelSuffix(String(css['margin-right'])) : ''; + }; + var calcBorderWidth = function (css) { + return css['border-width'] ? removePixelSuffix(String(css['border-width'])) : ''; + }; + var calcBorderStyle = function (css) { + return css['border-style'] ? String(css['border-style']) : ''; + }; + var calcStyle = function (parseStyle, serializeStyle, css) { + return serializeStyle(parseStyle(serializeStyle(css))); + }; + var changeStyle2 = function (parseStyle, serializeStyle, data) { + var css = mergeMargins(parseStyle(data.style)); + var dataCopy = deepMerge({}, data); + dataCopy.vspace = calcVSpace(css); + dataCopy.hspace = calcHSpace(css); + dataCopy.border = calcBorderWidth(css); + dataCopy.borderstyle = calcBorderStyle(css); + dataCopy.style = calcStyle(parseStyle, serializeStyle, css); + return dataCopy; + }; + var changeStyle = function (helpers, api) { + var data = api.getData(); + var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); + api.setData(newData); + }; + var changeAStyle = function (helpers, info, api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + var style = getStyleValue(helpers.normalizeCss, toImageData(data, false)); + api.setData({ style: style }); + }; + var changeFileInput = function (helpers, info, state, api) { + var data = api.getData(); + api.block('Uploading image'); + head(data.fileinput).fold(function () { + api.unblock(); + }, function (file) { + var blobUri = domGlobals.URL.createObjectURL(file); + var uploader = Uploader({ + url: info.url, + basePath: info.basePath, + credentials: info.credentials, + handler: info.handler + }); + var finalize = function () { + api.unblock(); + domGlobals.URL.revokeObjectURL(blobUri); + }; + var updateSrcAndSwitchTab = function (url) { + api.setData({ + src: { + value: url, + meta: {} + } + }); + api.showTab('general'); + changeSrc(helpers, info, state, api); + }; + blobToDataUri(file).then(function (dataUrl) { + var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + if (info.automaticUploads) { + uploader.upload(blobInfo).then(function (url) { + updateSrcAndSwitchTab(url); + finalize(); + }).catch(function (err) { + finalize(); + helpers.alertErr(api, err); + }); + } else { + helpers.addToBlobCache(blobInfo); + updateSrcAndSwitchTab(blobInfo.blobUri()); + api.unblock(); + } + }); + }); + }; + var changeHandler = function (helpers, info, state) { + return function (api, evt) { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'style') { + changeStyle(helpers, api); + } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { + changeAStyle(helpers, info, api); + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + if (api.getData().isDecorative) { + api.disable('alt'); + } else { + api.enable('alt'); + } + } + }; + }; + var closeHandler = function (state) { + return function () { + state.open = false; + }; + }; + var makeDialogBody = function (info) { + if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { + var tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [MainTab.makeTab(info)], + info.hasAdvTab ? [AdvTab.makeTab(info)] : [], + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + ]) + }; + return tabPanel; + } else { + var panel = { + type: 'panel', + items: MainTab.makeItems(info) + }; + return panel; + } + }; + var makeDialog = function (helpers) { + return function (info) { + var state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: helpers.onSubmit(info), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }; + }; + var submitHandler = function (editor) { + return function (info) { + return function (api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + editor.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions)); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + }; + }; + var imageSize = function (editor) { + return function (url) { + return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) { + return { + width: String(dimensions.width), + height: String(dimensions.height) + }; + }); + }; + }; + var createBlobCache = function (editor) { + return function (file, blobUri, dataUrl) { + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + base64: dataUrl.split(',')[1] + }); + }; + }; + var addToBlobCache = function (editor) { + return function (blobInfo) { + editor.editorUpload.blobCache.add(blobInfo); + }; + }; + var alertErr = function (editor) { + return function (api, message) { + editor.windowManager.alert(message, api.close); + }; + }; + var normalizeCss$1 = function (editor) { + return function (cssText) { + return normalizeCss(editor, cssText); + }; + }; + var parseStyle = function (editor) { + return function (cssText) { + return editor.dom.parseStyle(cssText); + }; + }; + var serializeStyle = function (editor) { + return function (stylesArg, name) { + return editor.dom.serializeStyle(stylesArg, name); + }; + }; + var Dialog = function (editor) { + var helpers = { + onSubmit: submitHandler(editor), + imageSize: imageSize(editor), + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + normalizeCss: normalizeCss$1(editor), + parseStyle: parseStyle(editor), + serializeStyle: serializeStyle(editor) + }; + var open = function () { + return collect(editor).then(makeDialog(helpers)).then(function (spec) { + return editor.windowManager.open(spec); + }); + }; + var openLater = function () { + open(); + }; + return { + open: open, + openLater: openLater + }; + }; + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).openLater); + editor.addCommand('mceUpdateImage', function (_ui, data) { + editor.undoManager.transact(function () { + return insertOrUpdateImage(editor, data); + }); + }); + }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + var node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$4.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('PreInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onAction: Dialog(editor).openLater, + onSetup: function (buttonApi) { + return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + } + }); + editor.ui.registry.addMenuItem('image', { + icon: 'image', + text: 'Image...', + onAction: Dialog(editor).openLater + }); + editor.ui.registry.addContextMenu('image', { + update: function (element) { + return isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : []; + } + }); + }; + + function Plugin () { + global.add('image', function (editor) { + setup(editor); + register$1(editor); + register(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/image/plugin.min.js b/public/js/tinymce/plugins/image/plugin.min.js new file mode 100644 index 000000000..32bfc5641 --- /dev/null +++ b/public/js/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(m){"use strict";var e,t,n,r,o,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(){},l=function(e){return function(){return e}},s=l(!1),u=l(!0),c=function(){return d},d=(e=function(e){return e.isNone()},{fold:function(e,t){return e()},is:s,isSome:s,isNone:u,getOr:n=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:l(null),getOrUndefined:l(undefined),or:n,orThunk:t,map:c,each:i,bind:c,exists:s,forall:u,filter:c,equals:e,equals_:e,toArray:function(){return[]},toString:l("none()")}),g=function(n){var e=l(n),t=function(){return a},r=function(e){return e(n)},a={fold:function(e,t){return t(n)},is:function(e){return n===e},isSome:u,isNone:s,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:t,orThunk:t,map:function(e){return g(e(n))},each:function(e){e(n)},bind:r,exists:r,forall:r,filter:function(e){return e(n)?a:d},toArray:function(){return[n]},toString:function(){return"some("+n+")"},equals:function(e){return e.is(n)},equals_:function(e,t){return e.fold(s,function(e){return t(n,e)})}};return a},A={some:g,none:c,from:function(e){return null===e||e===undefined?d:g(e)}},f=function(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}},p=function(t){return function(e){return typeof e===t}},S=f("string"),h=f("object"),b=f("array"),v=(r=null,function(e){return r===e}),y=p("boolean"),w=p("number"),D=Array.prototype.push,x=function(e){for(var t=[],n=0,r=e.length;n= 300 ? handleServiceErrorResponse(result.status, result.blob) : global$3.resolve(result.blob); + }); + }; + function requestBlob(url, withCredentials) { + return requestUrlAsBlob(url, {}, withCredentials).then(function (result) { + return result.status < 200 || result.status >= 300 ? handleHttpError(result.status) : global$3.resolve(result.blob); + }); + } + var getUrl = function (url, apiKey, withCredentials) { + return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ELEMENT = 1; + + var ELEMENT$1 = ELEMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var child = function (scope, predicate) { + var pred = function (node) { + return predicate(Element.fromDom(node)); + }; + var result = find(scope.dom().childNodes, pred); + return result.map(Element.fromDom); + }; + + var child$1 = function (scope, selector) { + return child(scope, function (e) { + return is(e, selector); + }); + }; + + var count = 0; + var getFigureImg = function (elem) { + return child$1(Element.fromDom(elem), 'img'); + }; + var isFigure = function (editor, elem) { + return editor.dom.is(elem, 'figure'); + }; + var getEditableImage = function (editor, elem) { + var isImage = function (imgNode) { + return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); + }; + var isEditable = function (imgNode) { + return isImage(imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || editor.settings.imagetools_proxy); + }; + if (isFigure(editor, elem)) { + var imgOpt = getFigureImg(elem); + return imgOpt.map(function (img) { + return isEditable(img.dom()) ? Option.some(img.dom()) : Option.none(); + }); + } + return isEditable(elem) ? Option.some(elem) : Option.none(); + }; + var displayError = function (editor, error) { + editor.notificationManager.open({ + text: error, + type: 'error' + }); + }; + var getSelectedImage = function (editor) { + var elem = editor.selection.getNode(); + if (isFigure(editor, elem)) { + return getFigureImg(elem); + } else { + return Option.some(Element.fromDom(elem)); + } + }; + var extractFilename = function (editor, url) { + var m = url.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i); + if (m) { + return editor.dom.encode(m[1]); + } + return null; + }; + var createId = function () { + return 'imagetools' + count++; + }; + var isLocalImage = function (editor, img) { + var url = img.src; + return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host; + }; + var isCorsImage = function (editor, img) { + return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1; + }; + var isCorsWithCredentialsImage = function (editor, img) { + return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1; + }; + var defaultFetchImage = function (editor, img) { + var src = img.src, apiKey; + if (isCorsImage(editor, img)) { + return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); + } + if (!isLocalImage(editor, img)) { + src = getProxyUrl(editor); + src += (src.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); + apiKey = getApiKey(editor); + return getUrl(src, apiKey, false); + } + return imageToBlob$1(img); + }; + var imageToBlob$2 = function (editor, img) { + return getFetchImage(editor).fold(function () { + return defaultFetchImage(editor, img); + }, function (customFetchImage) { + return customFetchImage(img); + }); + }; + var findBlob = function (editor, img) { + var blobInfo; + blobInfo = editor.editorUpload.blobCache.getByUri(img.src); + if (blobInfo) { + return global$3.resolve(blobInfo.blob()); + } + return imageToBlob$2(editor, img); + }; + var startTimedUpload = function (editor, imageUploadTimerState) { + var imageUploadTimer = global$2.setEditorTimeout(editor, function () { + editor.editorUpload.uploadImagesAuto(); + }, getUploadTimeout(editor)); + imageUploadTimerState.set(imageUploadTimer); + }; + var cancelTimedUpload = function (imageUploadTimerState) { + global$2.clearTimeout(imageUploadTimerState.get()); + }; + var updateSelectedImage = function (editor, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { + return ir.toBlob().then(function (blob) { + var uri, name, blobCache, blobInfo; + blobCache = editor.editorUpload.blobCache; + uri = selectedImage.src; + if (shouldReuseFilename(editor)) { + blobInfo = blobCache.getByUri(uri); + if (blobInfo) { + uri = blobInfo.uri(); + name = blobInfo.name(); + } else { + name = extractFilename(editor, uri); + } + } + blobInfo = blobCache.create({ + id: createId(), + blob: blob, + base64: ir.toBase64(), + uri: uri, + name: name + }); + blobCache.add(blobInfo); + editor.undoManager.transact(function () { + function imageLoadedHandler() { + editor.$(selectedImage).off('load', imageLoadedHandler); + editor.nodeChanged(); + if (uploadImmediately) { + editor.editorUpload.uploadImagesAuto(); + } else { + cancelTimedUpload(imageUploadTimerState); + startTimedUpload(editor, imageUploadTimerState); + } + } + editor.$(selectedImage).on('load', imageLoadedHandler); + if (size) { + editor.$(selectedImage).attr({ + width: size.w, + height: size.h + }); + } + editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); + }); + return blobInfo; + }); + }; + var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { + return function () { + var imgOpt = getSelectedImage(editor); + return imgOpt.fold(function () { + displayError(editor, 'Could not find selected image'); + }, function (img) { + return editor._scanForImages().then(function () { + return findBlob(editor, img.dom()); + }).then(blobToImageResult).then(fn).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, false, imageUploadTimerState, img.dom(), size); + }, function (error) { + displayError(editor, error); + }); + }); + }; + }; + var rotate$2 = function (editor, imageUploadTimerState, angle) { + return function () { + var imgOpt = getSelectedImage(editor); + var flippedSize = imgOpt.fold(function () { + return null; + }, function (img) { + var size = getImageSize(img.dom()); + return size ? { + w: size.h, + h: size.w + } : null; + }); + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return rotate$1(imageResult, angle); + }, flippedSize)(); + }; + }; + var flip$2 = function (editor, imageUploadTimerState, axis) { + return function () { + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return flip$1(imageResult, axis); + })(); + }; + }; + var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { + return blobToImage$1(blob).then(function (newImage) { + var newSize = getNaturalImageSize(newImage); + if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { + if (getImageSize(img)) { + setImageSize(img, newSize); + } + } + domGlobals.URL.revokeObjectURL(newImage.src); + return blob; + }).then(blobToImageResult).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, true, imageUploadTimerState, img); + }, function () { + }); + }; + + var saveState = 'save-state'; + var disable = 'disable'; + var enable = 'enable'; + + var createState = function (blob) { + return { + blob: blob, + url: domGlobals.URL.createObjectURL(blob) + }; + }; + var makeOpen = function (editor, imageUploadTimerState) { + return function () { + var getLoadedSpec = function (currentState) { + return { + title: 'Edit Image', + size: 'large', + body: { + type: 'panel', + items: [{ + type: 'imagetools', + name: 'imagetools', + label: 'Edit Image', + currentState: currentState + }] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true, + disabled: true + } + ], + onSubmit: function (api) { + var blob = api.getData().imagetools.blob; + originalImgOpt.each(function (originalImg) { + originalSizeOpt.each(function (originalSize) { + handleDialogBlob(editor, imageUploadTimerState, originalImg.dom(), originalSize, blob); + }); + }); + api.close(); + }, + onCancel: function () { + }, + onAction: function (api, details) { + switch (details.name) { + case saveState: + if (details.value) { + api.enable('save'); + } else { + api.disable('save'); + } + break; + case disable: + api.disable('save'); + api.disable('cancel'); + break; + case enable: + api.enable('cancel'); + break; + } + } + }; + }; + var originalImgOpt = getSelectedImage(editor); + var originalSizeOpt = originalImgOpt.map(function (origImg) { + return getNaturalImageSize(origImg.dom()); + }); + var imgOpt = getSelectedImage(editor); + imgOpt.each(function (img) { + getEditableImage(editor, img.dom()).each(function (_) { + findBlob(editor, img.dom()).then(function (blob) { + var state = createState(blob); + editor.windowManager.open(getLoadedSpec(state)); + }); + }); + }); + }; + }; + + var register = function (editor, imageUploadTimerState) { + global$1.each({ + mceImageRotateLeft: rotate$2(editor, imageUploadTimerState, -90), + mceImageRotateRight: rotate$2(editor, imageUploadTimerState, 90), + mceImageFlipVertical: flip$2(editor, imageUploadTimerState, 'v'), + mceImageFlipHorizontal: flip$2(editor, imageUploadTimerState, 'h'), + mceEditImage: makeOpen(editor, imageUploadTimerState) + }, function (fn, cmd) { + editor.addCommand(cmd, fn); + }); + }; + + var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { + editor.on('NodeChange', function (e) { + var lastSelectedImage = lastSelectedImageState.get(); + if (lastSelectedImage && lastSelectedImage.src !== e.element.src) { + cancelTimedUpload(imageUploadTimerState); + editor.editorUpload.uploadImagesAuto(); + lastSelectedImageState.set(null); + } + getEditableImage(editor, e.element).each(lastSelectedImageState.set); + }); + }; + + var register$1 = function (editor) { + var cmd = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + editor.ui.registry.addButton('rotateleft', { + tooltip: 'Rotate counterclockwise', + icon: 'rotate-left', + onAction: cmd('mceImageRotateLeft') + }); + editor.ui.registry.addButton('rotateright', { + tooltip: 'Rotate clockwise', + icon: 'rotate-right', + onAction: cmd('mceImageRotateRight') + }); + editor.ui.registry.addButton('flipv', { + tooltip: 'Flip vertically', + icon: 'flip-vertically', + onAction: cmd('mceImageFlipVertical') + }); + editor.ui.registry.addButton('fliph', { + tooltip: 'Flip horizontally', + icon: 'flip-horizontally', + onAction: cmd('mceImageFlipHorizontal') + }); + editor.ui.registry.addButton('editimage', { + tooltip: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage'), + onSetup: function (buttonApi) { + var setDisabled = function () { + var elementOpt = getSelectedImage(editor); + elementOpt.each(function (element) { + var disabled = getEditableImage(editor, element.dom()).isNone(); + buttonApi.setDisabled(disabled); + }); + }; + editor.on('NodeChange', setDisabled); + return function () { + editor.off('NodeChange', setDisabled); + }; + } + }); + editor.ui.registry.addButton('imageoptions', { + tooltip: 'Image options', + icon: 'image-options', + onAction: cmd('mceImage') + }); + editor.ui.registry.addContextMenu('imagetools', { + update: function (element) { + return getEditableImage(editor, element).fold(function () { + return []; + }, function (_) { + return [{ + text: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage') + }]; + }); + } + }); + }; + + var register$2 = function (editor) { + editor.ui.registry.addContextToolbar('imagetools', { + items: getToolbarItems(editor), + predicate: function (elem) { + return getEditableImage(editor, elem).isSome(); + }, + position: 'node', + scope: 'node' + }); + }; + + function Plugin () { + global.add('imagetools', function (editor) { + var imageUploadTimerState = Cell(0); + var lastSelectedImageState = Cell(null); + register(editor, imageUploadTimerState); + register$1(editor); + register$2(editor); + setup(editor, imageUploadTimerState, lastSelectedImageState); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/imagetools/plugin.min.js b/public/js/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 000000000..dc5f8fc1c --- /dev/null +++ b/public/js/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(p){"use strict";var t,e,n,l=function(t){var e=t;return{get:function(){return e},set:function(t){e=t}}},r=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(){},f=function(t){return function(){return t}},i=f(!1),u=f(!0),a=function(){return c},c=(t=function(t){return t.isNone()},{fold:function(t,e){return t()},is:i,isSome:i,isNone:u,getOr:n=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:f(null),getOrUndefined:f(undefined),or:n,orThunk:e,map:a,each:o,bind:a,exists:i,forall:u,filter:a,equals:t,equals_:t,toArray:function(){return[]},toString:f("none()")}),s=function(n){var t=f(n),e=function(){return o},r=function(t){return t(n)},o={fold:function(t,e){return e(n)},is:function(t){return n===t},isSome:u,isNone:i,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:e,orThunk:e,map:function(t){return s(t(n))},each:function(t){t(n)},bind:r,exists:r,forall:r,filter:function(t){return t(n)?o:c},toArray:function(){return[n]},toString:function(){return"some("+n+")"},equals:function(t){return t.is(n)},equals_:function(t,e){return t.fold(i,function(t){return e(n,t)})}};return o},v={some:s,none:a,from:function(t){return null===t||t===undefined?c:s(t)}};function m(t,e){return y(p.document.createElement("canvas"),t,e)}function h(t){var e=m(t.width,t.height);return g(e).drawImage(t,0,0),e}function g(t){return t.getContext("2d")}function y(t,e,n){return t.width=e,t.height=n,t}var w,b,I,T=window.Promise?window.Promise:(b=(w=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],L(t,_(U,this),_(A,this))}).immediateFn||"function"==typeof window.setImmediate&&window.setImmediate||function(t){p.setTimeout(t,1)},I=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},w.prototype["catch"]=function(t){return this.then(null,t)},w.prototype.then=function(n,r){var o=this;return new w(function(t,e){R.call(o,new E(n,r,t,e))})},w.all=function(){for(var t=[],e=0;e 0) { + global$4.each(selectorGroups, function (group) { + var menuItem = processSelector(selector, group); + if (menuItem) { + model.addItemToGroup(group.title, menuItem); + } + }); + } else { + var menuItem = processSelector(selector, null); + if (menuItem) { + model.addItem(menuItem); + } + } + } + } + }); + var items = model.toFormats(); + editor.fire('addStyleModifications', { + items: items, + replace: !shouldAppend(editor) + }); + }); + }; + + var get = function (editor) { + var convertSelectorToFormat = function (selectorText) { + return defaultConvertSelectorToFormat(editor, selectorText); + }; + return { convertSelectorToFormat: convertSelectorToFormat }; + }; + + function Plugin () { + global.add('importcss', function (editor) { + setup(editor); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/importcss/plugin.min.js b/public/js/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 000000000..023f4d218 --- /dev/null +++ b/public/js/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var n,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),f=tinymce.util.Tools.resolve("tinymce.EditorManager"),m=tinymce.util.Tools.resolve("tinymce.Env"),h=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(t){return t.getParam("importcss_selector_converter")},i=(n="array",function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}),o=Array.prototype.push,l=function(t,e){return function(t){for(var e=[],r=0,n=t.length;r 0 ? formats[0] : getTimeFormat(editor); + }; + var shouldInsertTimeElement = function (editor) { + return editor.getParam('insertdatetime_element', false); + }; + + var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + var monthsLong = 'January February March April May June July August September October November December'.split(' '); + var addZeros = function (value, len) { + value = '' + value; + if (value.length < len) { + for (var i = 0; i < len - value.length; i++) { + value = '0' + value; + } + } + return value; + }; + var getDateTime = function (editor, fmt, date) { + date = date || new Date(); + fmt = fmt.replace('%D', '%m/%d/%Y'); + fmt = fmt.replace('%r', '%I:%M:%S %p'); + fmt = fmt.replace('%Y', '' + date.getFullYear()); + fmt = fmt.replace('%y', '' + date.getYear()); + fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); + fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); + fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); + fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); + fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); + fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); + fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); + fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); + fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); + fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); + fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); + fmt = fmt.replace('%%', '%'); + return fmt; + }; + var updateElement = function (editor, timeElm, computerTime, userTime) { + var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + timeElm.parentNode.insertBefore(newTimeElm, timeElm); + editor.dom.remove(timeElm); + editor.selection.select(newTimeElm, true); + editor.selection.collapse(false); + }; + var insertDateTime = function (editor, format) { + if (shouldInsertTimeElement(editor)) { + var userTime = getDateTime(editor, format); + var computerTime = void 0; + if (/%[HMSIp]/.test(format)) { + computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); + } else { + computerTime = getDateTime(editor, '%Y-%m-%d'); + } + var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + if (timeElm) { + updateElement(editor, timeElm, computerTime, userTime); + } else { + editor.insertContent(''); + } + } else { + editor.insertContent(getDateTime(editor, format)); + } + }; + + var register = function (editor) { + editor.addCommand('mceInsertDate', function () { + insertDateTime(editor, getDateFormat(editor)); + }); + editor.addCommand('mceInsertTime', function () { + insertDateTime(editor, getTimeFormat(editor)); + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var register$1 = function (editor) { + var formats = getFormats(editor); + var defaultFormat = Cell(getDefaultDateTime(editor)); + editor.ui.registry.addSplitButton('insertdatetime', { + icon: 'insert-time', + tooltip: 'Insert date/time', + select: function (value) { + return value === defaultFormat.get(); + }, + fetch: function (done) { + done(global$1.map(formats, function (format) { + return { + type: 'choiceitem', + text: getDateTime(editor, format), + value: format + }; + })); + }, + onAction: function (_api) { + insertDateTime(editor, defaultFormat.get()); + }, + onItemAction: function (_api, value) { + defaultFormat.set(value); + insertDateTime(editor, value); + } + }); + var makeMenuItemHandler = function (format) { + return function () { + defaultFormat.set(format); + insertDateTime(editor, format); + }; + }; + editor.ui.registry.addNestedMenuItem('insertdatetime', { + icon: 'insert-time', + text: 'Date/time', + getSubmenuItems: function () { + return global$1.map(formats, function (format) { + return { + type: 'menuitem', + text: getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + }; + }); + } + }); + }; + + function Plugin () { + global.add('insertdatetime', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/insertdatetime/plugin.min.js b/public/js/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 000000000..90bd52da6 --- /dev/null +++ b/public/js/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},c=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},r="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),a="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),i="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),o="January February March April May June July August September October November December".split(" "),m=function(e,t){if((e=""+e).length'+n+"")}else e.insertContent(s(e,t));var i,o,u,c,m},t=function(t){t.addCommand("mceInsertDate",function(){var e;l(t,(e=t).getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d")))}),t.addCommand("mceInsertTime",function(){l(t,u(t))})},d=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(n){var e,t,r,a,i=c(n),o=(a=c(r=n),e=0 -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var hasRtcPlugin = function (editor) { + if (/(^|[ ,])rtc([, ]|$)/.test(editor.settings.plugins) && global.get('rtc')) { + return true; + } else { + return false; + } + }; + + var hasProtocol = function (url) { + return /^\w+:/i.test(url); + }; + var getHref = function (elm) { + var href = elm.getAttribute('data-mce-href'); + return href ? href : elm.getAttribute('href'); + }; + var applyRelTargetRules = function (rel, isUnsafe) { + var rules = ['noopener']; + var rels = rel ? rel.split(/\s+/) : []; + var toString = function (rels) { + return global$2.trim(rels.sort().join(' ')); + }; + var addTargetRules = function (rels) { + rels = removeTargetRules(rels); + return rels.length > 0 ? rels.concat(rules) : rules; + }; + var removeTargetRules = function (rels) { + return rels.filter(function (val) { + return global$2.inArray(rules, val) === -1; + }); + }; + var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + return newRels.length > 0 ? toString(newRels) : ''; + }; + var trimCaretContainers = function (text) { + return text.replace(/\uFEFF/g, ''); + }; + var getAnchorElement = function (editor, selectedElm) { + selectedElm = selectedElm || editor.selection.getNode(); + if (isImageFigure(selectedElm)) { + return editor.dom.select('a[href]', selectedElm)[0]; + } else { + return editor.dom.getParent(selectedElm, 'a[href]'); + } + }; + var getAnchorText = function (selection, anchorElm) { + var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + return trimCaretContainers(text); + }; + var isLink = function (elm) { + return elm && elm.nodeName === 'A' && !!getHref(elm); + }; + var hasLinks = function (elements) { + return global$2.grep(elements, isLink).length > 0; + }; + var isOnlyTextSelected = function (html) { + if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) { + return false; + } + return true; + }; + var isImageFigure = function (elm) { + return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + }; + var getLinkAttrs = function (data) { + return foldl([ + 'title', + 'rel', + 'class', + 'target' + ], function (acc, key) { + data[key].each(function (value) { + acc[key] = value.length > 0 ? value : null; + }); + return acc; + }, { href: data.href }); + }; + var handleExternalTargets = function (href, assumeExternalTargets) { + if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { + return assumeExternalTargets + '://' + href; + } + return href; + }; + var applyLinkOverrides = function (editor, linkAttrs) { + var newLinkAttrs = __assign({}, linkAttrs); + if (!(getRelList(editor).length > 0) && allowUnsafeLinkTarget(editor) === false) { + var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + newLinkAttrs.rel = newRel ? newRel : null; + } + if (Option.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) { + newLinkAttrs.target = getDefaultLinkTarget(editor); + } + newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor)); + return newLinkAttrs; + }; + var updateLink = function (editor, anchorElm, text, linkAttrs) { + text.each(function (text) { + if (anchorElm.hasOwnProperty('innerText')) { + anchorElm.innerText = text; + } else { + anchorElm.textContent = text; + } + }); + editor.dom.setAttribs(anchorElm, linkAttrs); + editor.selection.select(anchorElm); + }; + var createLink = function (editor, selectedElm, text, linkAttrs) { + if (isImageFigure(selectedElm)) { + linkImageFigure(editor, selectedElm, linkAttrs); + } else { + text.fold(function () { + editor.execCommand('mceInsertLink', false, linkAttrs); + }, function (text) { + editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }); + } + }; + var linkDomMutation = function (editor, attachState, data) { + var selectedElm = editor.selection.getNode(); + var anchorElm = getAnchorElement(editor, selectedElm); + var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(function () { + if (data.href === attachState.href) { + attachState.attach(); + } + if (anchorElm) { + editor.focus(); + updateLink(editor, anchorElm, data.text, linkAttrs); + } else { + createLink(editor, selectedElm, data.text, linkAttrs); + } + }); + }; + var unlinkDomMutation = function (editor) { + editor.undoManager.transact(function () { + var node = editor.selection.getNode(); + if (isImageFigure(node)) { + unlinkImageFigure(editor, node); + } else { + var anchorElm = editor.dom.getParent(node, 'a[href]', editor.getBody()); + if (anchorElm) { + editor.dom.remove(anchorElm, true); + } + } + editor.focus(); + }); + }; + var unwrapOptions = function (data) { + var cls = data.class, href = data.href, rel = data.rel, target = data.target, text = data.text, title = data.title; + return filter({ + class: cls.getOrNull(), + href: href, + rel: rel.getOrNull(), + target: target.getOrNull(), + text: text.getOrNull(), + title: title.getOrNull() + }, function (v, _k) { + return isNull(v) === false; + }); + }; + var link = function (editor, attachState, data) { + hasRtcPlugin(editor) ? editor.execCommand('createlink', false, unwrapOptions(data)) : linkDomMutation(editor, attachState, data); + }; + var unlink = function (editor) { + hasRtcPlugin(editor) ? editor.execCommand('unlink') : unlinkDomMutation(editor); + }; + var unlinkImageFigure = function (editor, fig) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + if (a) { + a.parentNode.insertBefore(img, a); + editor.dom.remove(a); + } + } + }; + var linkImageFigure = function (editor, fig, attrs) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.create('a', attrs); + img.parentNode.insertBefore(a, img); + a.appendChild(img); + } + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$2.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) ; else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizeWith = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + }; + }; + var sanitize = function (list) { + return sanitizeWith(getValue)(list); + }; + var createUi = function (name, label) { + return function (items) { + return { + name: name, + type: 'selectbox', + label: label, + items: items + }; + }; + }; + var ListOptions = { + sanitize: sanitize, + sanitizeWith: sanitizeWith, + createUi: createUi, + getValue: getValue + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var findTextByValue = function (value, catalog) { + return findMap(catalog, function (item) { + return Option.some(item).filter(function (i) { + return i.value === value; + }); + }); + }; + var getDelta = function (persistentText, fieldName, catalog, data) { + var value = data[fieldName]; + var hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(function (i) { + return { + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + }; + }) : Option.none(); + }; + var findCatalog = function (settings, fieldName) { + if (fieldName === 'link') { + return settings.catalogs.link; + } else if (fieldName === 'anchor') { + return settings.catalogs.anchor; + } else { + return Option.none(); + } + }; + var init = function (initialData, linkSettings) { + var persistentText = Cell(initialData.text); + var onUrlChange = function (data) { + if (persistentText.get().length <= 0) { + var urlText = data.url.meta.text !== undefined ? data.url.meta.text : data.url.value; + var urlTitle = data.url.meta.title !== undefined ? data.url.meta.title : ''; + return Option.some({ + text: urlText, + title: urlTitle + }); + } else { + return Option.none(); + } + }; + var onCatalogChange = function (data, change) { + var catalog = findCatalog(linkSettings, change.name).getOr([]); + return getDelta(persistentText.get(), change.name, catalog, data); + }; + var onChange = function (getData, change) { + if (change.name === 'url') { + return onUrlChange(getData()); + } else if (contains([ + 'anchor', + 'link' + ], change.name)) { + return onCatalogChange(getData(), change); + } else if (change.name === 'text') { + persistentText.set(getData().text); + return Option.none(); + } else { + return Option.none(); + } + }; + return { onChange: onChange }; + }; + var DialogChanges = { + init: init, + getDelta: getDelta + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var delayedConfirm = function (editor, message, callback) { + var rng = editor.selection.getRng(); + global$3.setEditorTimeout(editor, function () { + editor.windowManager.confirm(message, function (state) { + editor.selection.setRng(rng); + callback(state); + }); + }); + }; + var tryEmailTransform = function (data) { + var url = data.href; + var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('//') === -1 && url.indexOf('mailto:') === -1; + return suggestMailTo ? Option.some({ + message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: 'mailto:' + url }); + } + }) : Option.none(); + }; + var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { + return function (data) { + var url = data.href; + var suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www[\.|\d\.]/i.test(url); + return suggestProtocol ? Option.some({ + message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); + } + }) : Option.none(); + }; + }; + var preprocess = function (editor, data) { + return findMap([ + tryEmailTransform, + tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor)) + ], function (f) { + return f(data); + }).fold(function () { + return global$4.resolve(data); + }, function (transform) { + return new global$4(function (callback) { + delayedConfirm(editor, transform.message, function (state) { + callback(state ? transform.preprocess(data) : data); + }); + }); + }); + }; + var DialogConfirms = { preprocess: preprocess }; + + var getAnchors = function (editor) { + var anchorNodes = editor.dom.select('a:not([href])'); + var anchors = bind(anchorNodes, function (anchor) { + var id = anchor.name || anchor.id; + return id ? [{ + text: id, + value: '#' + id + }] : []; + }); + return anchors.length > 0 ? Option.some([{ + text: 'None', + value: '' + }].concat(anchors)) : Option.none(); + }; + var AnchorListOptions = { getAnchors: getAnchors }; + + var getClasses = function (editor) { + var list = getLinkClassList(editor); + if (list.length > 0) { + return ListOptions.sanitize(list); + } + return Option.none(); + }; + var ClassListOptions = { getClasses: getClasses }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseJson = function (text) { + try { + return Option.some(JSON.parse(text)); + } catch (err) { + return Option.none(); + } + }; + var getLinks = function (editor) { + var extractor = function (item) { + return editor.convertURL(item.value || item.url, 'href'); + }; + var linkList = getLinkList(editor); + return new global$4(function (callback) { + if (isString(linkList)) { + global$5.send({ + url: linkList, + success: function (text) { + return callback(parseJson(text)); + }, + error: function (_) { + return callback(Option.none()); + } + }); + } else if (isFunction(linkList)) { + linkList(function (output) { + return callback(Option.some(output)); + }); + } else { + callback(Option.from(linkList)); + } + }).then(function (optItems) { + return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { + if (items.length > 0) { + return [{ + text: 'None', + value: '' + }].concat(items); + } else { + return items; + } + }); + }); + }; + var LinkListOptions = { getLinks: getLinks }; + + var getRels = function (editor, initialTarget) { + var list = getRelList(editor); + if (list.length > 0) { + var isTargetBlank_1 = initialTarget.is('_blank'); + var enforceSafe = allowUnsafeLinkTarget(editor) === false; + var safeRelExtractor = function (item) { + return applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); + }; + var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + return sanitizer(list); + } + return Option.none(); + }; + var RelOptions = { getRels: getRels }; + + var fallbacks = [ + { + text: 'Current window', + value: '' + }, + { + text: 'New window', + value: '_blank' + } + ]; + var getTargets = function (editor) { + var list = getTargetList(editor); + if (isArray(list)) { + return ListOptions.sanitize(list).orThunk(function () { + return Option.some(fallbacks); + }); + } else if (list === false) { + return Option.none(); + } + return Option.some(fallbacks); + }; + var TargetOptions = { getTargets: getTargets }; + + var nonEmptyAttr = function (dom, elem, name) { + var val = dom.getAttrib(elem, name); + return val !== null && val.length > 0 ? Option.some(val) : Option.none(); + }; + var extractFromAnchor = function (editor, anchor) { + var dom = editor.dom; + var onlyText = isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(getAnchorText(editor.selection, anchor)) : Option.none(); + var url = anchor ? Option.some(dom.getAttrib(anchor, 'href')) : Option.none(); + var target = anchor ? Option.from(dom.getAttrib(anchor, 'target')) : Option.none(); + var rel = nonEmptyAttr(dom, anchor, 'rel'); + var linkClass = nonEmptyAttr(dom, anchor, 'class'); + var title = nonEmptyAttr(dom, anchor, 'title'); + return { + url: url, + text: text, + title: title, + target: target, + rel: rel, + linkClass: linkClass + }; + }; + var collect = function (editor, linkNode) { + return LinkListOptions.getLinks(editor).then(function (links) { + var anchor = extractFromAnchor(editor, linkNode); + return { + anchor: anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: Option.from(linkNode), + flags: { titleEnabled: shouldShowLinkTitle(editor) } + }; + }); + }; + var DialogInfo = { collect: collect }; + + var handleSubmit = function (editor, info) { + return function (api) { + var data = api.getData(); + if (!data.url.value) { + unlink(editor); + api.close(); + return; + } + var getChangedValue = function (key) { + return Option.from(data[key]).filter(function (value) { + return !info.anchor[key].is(value); + }); + }; + var changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + var attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () { + } + }; + DialogConfirms.preprocess(editor, changedData).then(function (pData) { + link(editor, attachState, pData); + }); + api.close(); + }; + }; + var collectData = function (editor) { + var anchorNode = getAnchorElement(editor); + return DialogInfo.collect(editor, anchorNode); + }; + var getInitialData = function (info, defaultTarget) { + return { + url: { + value: info.anchor.url.getOr(''), + meta: { + attach: function () { + }, + text: info.anchor.url.fold(function () { + return ''; + }, function () { + return info.anchor.text.getOr(''); + }), + original: { value: info.anchor.url.getOr('') } + } + }, + text: info.anchor.text.getOr(''), + title: info.anchor.title.getOr(''), + anchor: info.anchor.url.getOr(''), + link: info.anchor.url.getOr(''), + rel: info.anchor.rel.getOr(''), + target: info.anchor.target.or(defaultTarget).getOr(''), + linkClass: info.anchor.linkClass.getOr('') + }; + }; + var makeDialog = function (settings, onSubmit, editor) { + var urlInput = [{ + name: 'url', + type: 'urlinput', + filetype: 'file', + label: 'URL' + }]; + var displayText = settings.anchor.text.map(function () { + return { + name: 'text', + type: 'input', + label: 'Text to display' + }; + }).toArray(); + var titleText = settings.flags.titleEnabled ? [{ + name: 'title', + type: 'input', + label: 'Title' + }] : []; + var defaultTarget = Option.from(getDefaultLinkTarget(editor)); + var initialData = getInitialData(settings, defaultTarget); + var dialogDelta = DialogChanges.init(initialData, settings); + var catalogs = settings.catalogs; + var body = { + type: 'panel', + items: flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]) + }; + return { + title: 'Insert/Edit Link', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onChange: function (api, _a) { + var name = _a.name; + dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + api.setData(newData); + }); + }, + onSubmit: onSubmit + }; + }; + var open$1 = function (editor) { + var data = collectData(editor); + data.then(function (info) { + var onSubmit = handleSubmit(editor, info); + return makeDialog(info, onSubmit, editor); + }).then(function (spec) { + editor.windowManager.open(spec); + }); + }; + + var getLink = function (editor, elm) { + return editor.dom.getParent(elm, 'a[href]'); + }; + var getSelectedLink = function (editor) { + return getLink(editor, editor.selection.getStart()); + }; + var hasOnlyAltModifier = function (e) { + return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; + }; + var gotoLink = function (editor, a) { + if (a) { + var href = getHref(a); + if (/^#/.test(href)) { + var targetEl = editor.$(href); + if (targetEl.length) { + editor.selection.scrollIntoView(targetEl[0], true); + } + } else { + open(a.href); + } + } + }; + var openDialog = function (editor) { + return function () { + open$1(editor); + }; + }; + var gotoSelectedLink = function (editor) { + return function () { + gotoLink(editor, getSelectedLink(editor)); + }; + }; + var setupGotoLinks = function (editor) { + editor.on('click', function (e) { + var link = getLink(editor, e.target); + if (link && global$1.metaKeyPressed(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + editor.on('keydown', function (e) { + var link = getSelectedLink(editor); + if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + }; + var toggleActiveState = function (editor) { + return function (api) { + var nodeChangeHandler = function (e) { + return api.setActive(!editor.mode.isReadOnly() && !!getAnchorElement(editor, e.element)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var toggleEnabledState = function (editor) { + return function (api) { + var parents = editor.dom.getParents(editor.selection.getStart()); + api.setDisabled(!hasLinks(parents)); + var nodeChangeHandler = function (e) { + return api.setDisabled(!hasLinks(e.parents)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + + var register = function (editor) { + editor.addCommand('mceLink', function () { + if (useQuickLink(editor)) { + editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } else { + openDialog(editor)(); + } + }); + }; + + var setup = function (editor) { + editor.addShortcut('Meta+K', '', function () { + editor.execCommand('mceLink'); + }); + }; + + var setupButtons = function (editor) { + editor.ui.registry.addToggleButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + onAction: openDialog(editor), + onSetup: toggleActiveState(editor) + }); + editor.ui.registry.addButton('openlink', { + icon: 'new-tab', + tooltip: 'Open link', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleEnabledState(editor) + }); + }; + var setupMenuItems = function (editor) { + editor.ui.registry.addMenuItem('openlink', { + text: 'Open link', + icon: 'new-tab', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addMenuItem('link', { + icon: 'link', + text: 'Link...', + shortcut: 'Meta+K', + onAction: openDialog(editor) + }); + editor.ui.registry.addMenuItem('unlink', { + icon: 'unlink', + text: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleEnabledState(editor) + }); + }; + var setupContextMenu = function (editor) { + var inLink = 'link unlink openlink'; + var noLink = 'link'; + editor.ui.registry.addContextMenu('link', { + update: function (element) { + return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; + } + }); + }; + var setupContextToolbars = function (editor) { + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var onSetupLink = function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setDisabled(!getAnchorElement(editor, node)); + return function () { + }; + }; + editor.ui.registry.addContextForm('quicklink', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + onSetup: toggleActiveState(editor) + }, + label: 'Link', + predicate: function (node) { + return !!getAnchorElement(editor, node) && hasContextToolbar(editor); + }, + initValue: function () { + var elm = getAnchorElement(editor); + return !!elm ? getHref(elm) : ''; + }, + commands: [ + { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + primary: true, + onSetup: function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setActive(!!getAnchorElement(editor, node)); + return toggleActiveState(editor)(buttonApi); + }, + onAction: function (formApi) { + var anchor = getAnchorElement(editor); + var value = formApi.getValue(); + if (!anchor) { + var attachState = { + href: value, + attach: function () { + } + }; + var onlyText = isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(getAnchorText(editor.selection, anchor)).filter(function (t) { + return t.length > 0; + }).or(Option.from(value)) : Option.none(); + link(editor, attachState, { + href: value, + text: text, + title: Option.none(), + rel: Option.none(), + target: Option.none(), + class: Option.none() + }); + formApi.hide(); + } else { + editor.dom.setAttrib(anchor, 'href', value); + collapseSelectionToEnd(editor); + formApi.hide(); + } + } + }, + { + type: 'contextformbutton', + icon: 'unlink', + tooltip: 'Remove link', + onSetup: onSetupLink, + onAction: function (formApi) { + unlink(editor); + formApi.hide(); + } + }, + { + type: 'contextformbutton', + icon: 'new-tab', + tooltip: 'Open link', + onSetup: onSetupLink, + onAction: function (formApi) { + gotoSelectedLink(editor)(); + formApi.hide(); + } + } + ] + }); + }; + + function Plugin () { + global.add('link', function (editor) { + setupButtons(editor); + setupMenuItems(editor); + setupContextMenu(editor); + setupContextToolbars(editor); + setupGotoLinks(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/link/plugin.min.js b/public/js/tinymce/plugins/link/plugin.min.js new file mode 100644 index 000000000..e84228df3 --- /dev/null +++ b/public/js/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(i){"use strict";var n,t,e,r,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.VK"),a=function(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}},l=function(n){return function(t){return typeof t===n}},c=a("string"),f=a("array"),s=function(t){return n===t},m=l("boolean"),g=l("function"),d=function(t){var n=t.getParam("link_assume_external_targets",!1);return m(n)&&n?1:!c(n)||"http"!==n&&"https"!==n?0:n},h=function(t){return t.getParam("default_link_target")},v=function(t){return t.getParam("target_list",!0)},p=function(t){return t.getParam("rel_list",[],"array")},y=function(t){return t.getParam("allow_unsafe_link_target",!1,"boolean")},k=function(t){var n=i.document.createElement("a");n.target="_blank",n.href=t,n.rel="noreferrer noopener";var e,r,o=i.document.createEvent("MouseEvents");o.initMouseEvent("click",!0,!0,i.window,0,0,0,0,0,!1,!1,!1,!1,0,null),e=n,r=o,i.document.body.appendChild(e),e.dispatchEvent(r),i.document.body.removeChild(e)},x=function(){return(x=Object.assign||function(t){for(var n,e=1,r=arguments.length;e]+>[^<]+<\/a>$/.test(t)||-1===t.indexOf("href=")))},G=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},J=function(t){return n=["title","rel","class","target"],e=function(n,e){return t[e].each(function(t){n[e]=0 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ELEMENT = 1; + + var ELEMENT$1 = ELEMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var contains$1 = function (e1, e2) { + return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); + }; + var is$1 = is; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var lift2 = function (oa, ob, f) { + return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none(); + }; + + var fromElements = function (elements, scope) { + var doc = scope || domGlobals.document; + var fragment = doc.createDocumentFragment(); + each(elements, function (element) { + fragment.appendChild(element.dom()); + }); + return Element.fromDom(fragment); + }; + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + var child = function (element, index) { + var cs = element.dom().childNodes; + return Option.from(cs[index]).map(Element.fromDom); + }; + var firstChild = function (element) { + return child(element, 0); + }; + var lastChild = function (element) { + return child(element, element.dom().childNodes.length - 1); + }; + + var before = function (marker, element) { + var parent$1 = parent(marker); + parent$1.each(function (v) { + v.dom().insertBefore(element.dom(), marker.dom()); + }); + }; + var append = function (parent, element) { + parent.dom().appendChild(element.dom()); + }; + + var before$1 = function (marker, elements) { + each(elements, function (x) { + before(marker, x); + }); + }; + var append$1 = function (parent, elements) { + each(elements, function (x) { + append(parent, x); + }); + }; + + var remove = function (element) { + var dom = element.dom(); + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + + var fireListEvent = function (editor, action, element) { + return editor.fire('ListMutation', { + action: action, + element: element + }); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var matchNodeName = function (name) { + return function (node) { + return node && node.nodeName.toLowerCase() === name; + }; + }; + var matchNodeNames = function (regex) { + return function (node) { + return node && regex.test(node.nodeName); + }; + }; + var isTextNode = function (node) { + return node && node.nodeType === 3; + }; + var isListNode = matchNodeNames(/^(OL|UL|DL)$/); + var isOlUlNode = matchNodeNames(/^(OL|UL)$/); + var isOlNode = matchNodeName('ol'); + var isListItemNode = matchNodeNames(/^(LI|DT|DD)$/); + var isDlItemNode = matchNodeNames(/^(DT|DD)$/); + var isTableCellNode = matchNodeNames(/^(TH|TD)$/); + var isBr = matchNodeName('br'); + var isFirstChild = function (node) { + return node.parentNode.firstChild === node; + }; + var isTextBlock = function (editor, node) { + return node && !!editor.schema.getTextBlockElements()[node.nodeName]; + }; + var isBlock = function (node, blockElements) { + return node && node.nodeName in blockElements; + }; + var isBogusBr = function (dom, node) { + if (!isBr(node)) { + return false; + } + if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) { + return true; + } + return false; + }; + var isEmpty = function (dom, elm, keepBookmarks) { + var empty = dom.isEmpty(elm); + if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { + return false; + } + return empty; + }; + var isChildOfBody = function (dom, elm) { + return dom.isChildOf(elm, dom.getRoot()); + }; + + var getParentList = function (editor, node) { + var selectionStart = node || editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); + }; + var isParentListSelected = function (parentList, selectedBlocks) { + return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + }; + var findSubLists = function (parentList) { + return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) { + return isListNode(elm); + }); + }; + var getSelectedSubLists = function (editor) { + var parentList = getParentList(editor); + var selectedBlocks = editor.selection.getSelectedBlocks(); + if (isParentListSelected(parentList, selectedBlocks)) { + return findSubLists(parentList); + } else { + return global$5.grep(selectedBlocks, function (elm) { + return isListNode(elm) && parentList !== elm; + }); + } + }; + var findParentListItemsNodes = function (editor, elms) { + var listItemsElms = global$5.map(elms, function (elm) { + var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + return parentLi ? parentLi : elm; + }); + return global$4.unique(listItemsElms); + }; + var getSelectedListItems = function (editor) { + var selectedBlocks = editor.selection.getSelectedBlocks(); + return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) { + return isListItemNode(block); + }); + }; + var getSelectedDlItems = function (editor) { + return filter(getSelectedListItems(editor), isDlItemNode); + }; + var getClosestListRootElm = function (editor, elm) { + var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); + return root; + }; + var findLastParentListNode = function (editor, elm) { + var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + return last(parentLists); + }; + var getSelectedLists = function (editor) { + var firstList = findLastParentListNode(editor, editor.selection.getStart()); + var subsequentLists = filter(editor.selection.getSelectedBlocks(), isOlUlNode); + return firstList.toArray().concat(subsequentLists); + }; + var getSelectedListRoots = function (editor) { + var selectedLists = getSelectedLists(editor); + return getUniqueListRoots(editor, selectedLists); + }; + var getUniqueListRoots = function (editor, lists) { + var listRoots = map(lists, function (list) { + return findLastParentListNode(editor, list).getOr(list); + }); + return global$4.unique(listRoots); + }; + + var shouldIndentOnTab = function (editor) { + return editor.getParam('lists_indent_on_tab', true); + }; + var getForcedRootBlock = function (editor) { + var block = editor.getParam('forced_root_block', 'p'); + if (block === false) { + return ''; + } else if (block === true) { + return 'p'; + } else { + return block; + } + }; + var getForcedRootBlockAttrs = function (editor) { + return editor.getParam('forced_root_block_attrs', {}); + }; + + var createTextBlock = function (editor, contentNode) { + var dom = editor.dom; + var blockElements = editor.schema.getBlockElements(); + var fragment = dom.createFragment(); + var blockName = getForcedRootBlock(editor); + var node, textBlock, hasContentNode; + if (blockName) { + textBlock = dom.create(blockName); + if (textBlock.tagName === blockName.toUpperCase()) { + dom.setAttribs(textBlock, getForcedRootBlockAttrs(editor)); + } + if (!isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + } + if (contentNode) { + while (node = contentNode.firstChild) { + var nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; + } + if (isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (blockName) { + if (!textBlock) { + textBlock = dom.create(blockName); + fragment.appendChild(textBlock); + } + textBlock.appendChild(node); + } else { + fragment.appendChild(node); + } + } + } + } + if (!blockName) { + fragment.appendChild(dom.create('br')); + } else { + if (!hasContentNode) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); + } + } + return fragment; + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter$1 = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + var name = function (element) { + var r = element.dom().nodeName; + return r.toLowerCase(); + }; + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var setAll = function (element, attrs) { + var dom = element.dom(); + each$1(attrs, function (v, k) { + rawSet(dom, k, v); + }); + }; + var clone = function (element) { + return foldl(element.dom().attributes, function (acc, attr) { + acc[attr.name] = attr.value; + return acc; + }, {}); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var set = function (element, property, value) { + var dom = element.dom(); + internalSet(dom, property, value); + }; + + var clone$1 = function (original, isDeep) { + return Element.fromDom(original.dom().cloneNode(isDeep)); + }; + var deep = function (original) { + return clone$1(original, true); + }; + var shallowAs = function (original, tag) { + var nu = Element.fromTag(tag); + var attributes = clone(original); + setAll(nu, attributes); + return nu; + }; + var mutate = function (original, tag) { + var nu = shallowAs(original, tag); + before(original, nu); + var children$1 = children(original); + append$1(nu, children$1); + remove(original); + return nu; + }; + + var joinSegment = function (parent, child) { + append(parent.item, child.list); + }; + var joinSegments = function (segments) { + for (var i = 1; i < segments.length; i++) { + joinSegment(segments[i - 1], segments[i]); + } + }; + var appendSegments = function (head$1, tail) { + lift2(last(head$1), head(tail), joinSegment); + }; + var createSegment = function (scope, listType) { + var segment = { + list: Element.fromTag(listType, scope), + item: Element.fromTag('li', scope) + }; + append(segment.list, segment.item); + return segment; + }; + var createSegments = function (scope, entry, size) { + var segments = []; + for (var i = 0; i < size; i++) { + segments.push(createSegment(scope, entry.listType)); + } + return segments; + }; + var populateSegments = function (segments, entry) { + for (var i = 0; i < segments.length - 1; i++) { + set(segments[i].item, 'list-style-type', 'none'); + } + last(segments).each(function (segment) { + setAll(segment.list, entry.listAttributes); + setAll(segment.item, entry.itemAttributes); + append$1(segment.item, entry.content); + }); + }; + var normalizeSegment = function (segment, entry) { + if (name(segment.list) !== entry.listType) { + segment.list = mutate(segment.list, entry.listType); + } + setAll(segment.list, entry.listAttributes); + }; + var createItem = function (scope, attr, content) { + var item = Element.fromTag('li', scope); + setAll(item, attr); + append$1(item, content); + return item; + }; + var appendItem = function (segment, item) { + append(segment.list, item); + segment.item = item; + }; + var writeShallow = function (scope, cast, entry) { + var newCast = cast.slice(0, entry.depth); + last(newCast).each(function (segment) { + var item = createItem(scope, entry.itemAttributes, entry.content); + appendItem(segment, item); + normalizeSegment(segment, entry); + }); + return newCast; + }; + var writeDeep = function (scope, cast, entry) { + var segments = createSegments(scope, entry, entry.depth - cast.length); + joinSegments(segments); + populateSegments(segments, entry); + appendSegments(cast, segments); + return cast.concat(segments); + }; + var composeList = function (scope, entries) { + var cast = foldl(entries, function (cast, entry) { + return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); + }, []); + return head(cast).map(function (segment) { + return segment.list; + }); + }; + + var isList = function (el) { + return is$1(el, 'OL,UL'); + }; + var hasFirstChildList = function (el) { + return firstChild(el).map(isList).getOr(false); + }; + var hasLastChildList = function (el) { + return lastChild(el).map(isList).getOr(false); + }; + + var isIndented = function (entry) { + return entry.depth > 0; + }; + var isSelected = function (entry) { + return entry.isSelected; + }; + var cloneItemContent = function (li) { + var children$1 = children(li); + var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + return map(content, deep); + }; + var createEntry = function (li, depth, isSelected) { + return parent(li).filter(isElement).map(function (list) { + return { + depth: depth, + dirty: false, + isSelected: isSelected, + content: cloneItemContent(li), + itemAttributes: clone(li), + listAttributes: clone(list), + listType: name(list) + }; + }); + }; + + var indentEntry = function (indentation, entry) { + switch (indentation) { + case 'Indent': + entry.depth++; + break; + case 'Outdent': + entry.depth--; + break; + case 'Flatten': + entry.depth = 0; + } + entry.dirty = true; + }; + + var cloneListProperties = function (target, source) { + target.listType = source.listType; + target.listAttributes = __assign({}, source.listAttributes); + }; + var cleanListProperties = function (entry) { + entry.listAttributes = filter$1(entry.listAttributes, function (_value, key) { + return key !== 'start'; + }); + }; + var closestSiblingEntry = function (entries, start) { + var depth = entries[start].depth; + var matches = function (entry) { + return entry.depth === depth && !entry.dirty; + }; + var until = function (entry) { + return entry.depth < depth; + }; + return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(function () { + return findUntil(entries.slice(start + 1), matches, until); + }); + }; + var normalizeEntries = function (entries) { + each(entries, function (entry, i) { + closestSiblingEntry(entries, i).fold(function () { + if (entry.dirty) { + cleanListProperties(entry); + } + }, function (matchingEntry) { + return cloneListProperties(entry, matchingEntry); + }); + }); + return entries; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var parseItem = function (depth, itemSelection, selectionState, item) { + return firstChild(item).filter(isList).fold(function () { + itemSelection.each(function (selection) { + if (eq(selection.start, item)) { + selectionState.set(true); + } + }); + var currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(function (selection) { + if (eq(selection.end, item)) { + selectionState.set(false); + } + }); + var childListEntries = lastChild(item).filter(isList).map(function (list) { + return parseList(depth, itemSelection, selectionState, list); + }).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, function (list) { + return parseList(depth, itemSelection, selectionState, list); + }); + }; + var parseList = function (depth, itemSelection, selectionState, list) { + return bind(children(list), function (element) { + var parser = isList(element) ? parseList : parseItem; + var newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + }; + var parseLists = function (lists, itemSelection) { + var selectionState = Cell(false); + var initialDepth = 0; + return map(lists, function (list) { + return { + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + }; + }); + }; + + var outdentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return map(normalizedEntries, function (entry) { + var content = fromElements(entry.content); + return Element.fromDom(createTextBlock(editor, content.dom())); + }); + }; + var indentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return composeList(editor.contentDocument, normalizedEntries).toArray(); + }; + var composeEntries = function (editor, entries) { + return bind(groupBy(entries, isIndented), function (entries) { + var groupIsIndented = head(entries).map(isIndented).getOr(false); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + }; + var indentSelectedEntries = function (entries, indentation) { + each(filter(entries, isSelected), function (entry) { + return indentEntry(indentation, entry); + }); + }; + var getItemSelection = function (editor) { + var selectedListItems = map(getSelectedListItems(editor), Element.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { + return { + start: start, + end: end + }; + }); + }; + var listIndentation = function (editor, lists, indentation) { + var entrySets = parseLists(lists, getItemSelection(editor)); + each(entrySets, function (entrySet) { + indentSelectedEntries(entrySet.entries, indentation); + var composedLists = composeEntries(editor, entrySet.entries); + each(composedLists, function (composedList) { + fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom()); + }); + before$1(entrySet.sourceList, composedLists); + remove(entrySet.sourceList); + }); + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var DOM = global$6.DOM; + var splitList = function (editor, ul, li) { + var tmpRng, fragment, bookmarks, node, newBlock; + var removeAndKeepBookmarks = function (targetNode) { + global$5.each(bookmarks, function (node) { + targetNode.parentNode.insertBefore(node, li.parentNode); + }); + DOM.remove(targetNode); + }; + bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); + newBlock = createTextBlock(editor, li); + tmpRng = DOM.createRng(); + tmpRng.setStartAfter(li); + tmpRng.setEndAfter(ul); + fragment = tmpRng.extractContents(); + for (node = fragment.firstChild; node; node = node.firstChild) { + if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { + DOM.remove(node); + break; + } + } + if (!editor.dom.isEmpty(fragment)) { + DOM.insertAfter(fragment, ul); + } + DOM.insertAfter(newBlock, ul); + if (isEmpty(editor.dom, li.parentNode)) { + removeAndKeepBookmarks(li.parentNode); + } + DOM.remove(li); + if (isEmpty(editor.dom, ul)) { + DOM.remove(ul); + } + }; + + var outdentDlItem = function (editor, item) { + if (is$1(item, 'dd')) { + mutate(item, 'dt'); + } else if (is$1(item, 'dt')) { + parent(item).each(function (dl) { + return splitList(editor, dl.dom(), item.dom()); + }); + } + }; + var indentDlItem = function (item) { + if (is$1(item, 'dt')) { + mutate(item, 'dd'); + } + }; + var dlIndentation = function (editor, indentation, dlItems) { + if (indentation === 'Indent') { + each(dlItems, indentDlItem); + } else { + each(dlItems, function (item) { + return outdentDlItem(editor, item); + }); + } + }; + + var getNormalizedPoint = function (container, offset) { + if (isTextNode(container)) { + return { + container: container, + offset: offset + }; + } + var node = global$1.getNode(container, offset); + if (isTextNode(node)) { + return { + container: node, + offset: offset >= container.childNodes.length ? node.data.length : 0 + }; + } else if (node.previousSibling && isTextNode(node.previousSibling)) { + return { + container: node.previousSibling, + offset: node.previousSibling.data.length + }; + } else if (node.nextSibling && isTextNode(node.nextSibling)) { + return { + container: node.nextSibling, + offset: 0 + }; + } + return { + container: container, + offset: offset + }; + }; + var normalizeRange = function (rng) { + var outRng = rng.cloneRange(); + var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + outRng.setStart(rangeStart.container, rangeStart.offset); + var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + outRng.setEnd(rangeEnd.container, rangeEnd.offset); + return outRng; + }; + + var selectionIndentation = function (editor, indentation) { + var lists = map(getSelectedListRoots(editor), Element.fromDom); + var dlItems = map(getSelectedDlItems(editor), Element.fromDom); + var isHandled = false; + if (lists.length || dlItems.length) { + var bookmark = editor.selection.getBookmark(); + listIndentation(editor, lists, indentation); + dlIndentation(editor, indentation, dlItems); + editor.selection.moveToBookmark(bookmark); + editor.selection.setRng(normalizeRange(editor.selection.getRng())); + editor.nodeChanged(); + isHandled = true; + } + return isHandled; + }; + var indentListSelection = function (editor) { + return selectionIndentation(editor, 'Indent'); + }; + var outdentListSelection = function (editor) { + return selectionIndentation(editor, 'Outdent'); + }; + var flattenListSelection = function (editor) { + return selectionIndentation(editor, 'Flatten'); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + var DOM$1 = global$6.DOM; + var createBookmark = function (rng) { + var bookmark = {}; + var setupEndPoint = function (start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + DOM$1.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + }; + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolveBookmark = function (bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + var nodeIndex = function (container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + }; + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + DOM$1.remove(node); + if (!container.hasChildNodes() && DOM$1.isBlock(container)) { + container.appendChild(DOM$1.create('br')); + } + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = DOM$1.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return normalizeRange(rng); + }; + + var isCustomList = function (list) { + return /\btox\-/.test(list.className); + }; + var listState = function (editor, listName, activate) { + return function () { + var nodeChangeHandler = function (e) { + var inList = findUntil(e.parents, isListNode, isTableCellNode).filter(function (list) { + return list.nodeName === listName && !isCustomList(list); + }).isSome(); + activate(inList); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + + var listToggleActionFromListName = function (listName) { + switch (listName) { + case 'UL': + return 'ToggleUlList'; + case 'OL': + return 'ToggleOlList'; + case 'DL': + return 'ToggleDLList'; + } + }; + + var updateListStyle = function (dom, el, detail) { + var type = detail['list-style-type'] ? detail['list-style-type'] : null; + dom.setStyle(el, 'list-style-type', type); + }; + var setAttribs = function (elm, attrs) { + global$5.each(attrs, function (value, key) { + elm.setAttribute(key, value); + }); + }; + var updateListAttrs = function (dom, el, detail) { + setAttribs(el, detail['list-attributes']); + global$5.each(dom.select('li', el), function (li) { + setAttribs(li, detail['list-item-attributes']); + }); + }; + var updateListWithDetails = function (dom, el, detail) { + updateListStyle(dom, el, detail); + updateListAttrs(dom, el, detail); + }; + var removeStyles = function (dom, element, styles) { + global$5.each(styles, function (style) { + var _a; + return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); + }); + }; + var getEndPointNode = function (editor, rng, start, root) { + var container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; + } + if (!start && isBr(container.nextSibling)) { + container = container.nextSibling; + } + while (container.parentNode !== root) { + if (isTextBlock(editor, container)) { + return container; + } + if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + return container; + } + container = container.parentNode; + } + return container; + }; + var getSelectedTextBlocks = function (editor, rng, root) { + var textBlocks = [], dom = editor.dom; + var startNode = getEndPointNode(editor, rng, true, root); + var endNode = getEndPointNode(editor, rng, false, root); + var block; + var siblings = []; + for (var node = startNode; node; node = node.nextSibling) { + siblings.push(node); + if (node === endNode) { + break; + } + } + global$5.each(siblings, function (node) { + if (isTextBlock(editor, node)) { + textBlocks.push(node); + block = null; + return; + } + if (dom.isBlock(node) || isBr(node)) { + if (isBr(node)) { + dom.remove(node); + } + block = null; + return; + } + var nextSibling = node.nextSibling; + if (global$7.isBookmarkNode(node)) { + if (isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { + block = null; + return; + } + } + if (!block) { + block = dom.create('p'); + node.parentNode.insertBefore(block, node); + textBlocks.push(block); + } + block.appendChild(node); + }); + return textBlocks; + }; + var hasCompatibleStyle = function (dom, sib, detail) { + var sibStyle = dom.getStyle(sib, 'list-style-type'); + var detailStyle = detail ? detail['list-style-type'] : ''; + detailStyle = detailStyle === null ? '' : detailStyle; + return sibStyle === detailStyle; + }; + var applyList = function (editor, listName, detail) { + if (detail === void 0) { + detail = {}; + } + var rng = editor.selection.getRng(true); + var bookmark; + var listItemName = 'LI'; + var root = getClosestListRootElm(editor, editor.selection.getStart(true)); + var dom = editor.dom; + if (dom.getContentEditable(editor.selection.getNode()) === 'false') { + return; + } + listName = listName.toUpperCase(); + if (listName === 'DL') { + listItemName = 'DT'; + } + bookmark = createBookmark(rng); + global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) { + var listBlock, sibling; + sibling = block.previousSibling; + if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { + listBlock = sibling; + block = dom.rename(block, listItemName); + sibling.appendChild(block); + } else { + listBlock = dom.create(listName); + block.parentNode.insertBefore(listBlock, block); + listBlock.appendChild(block); + block = dom.rename(block, listItemName); + } + removeStyles(dom, block, [ + 'margin', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-top', + 'padding', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-top' + ]); + updateListWithDetails(dom, listBlock, detail); + mergeWithAdjacentLists(editor.dom, listBlock); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + }; + var isValidLists = function (list1, list2) { + return list1 && list2 && isListNode(list1) && list1.nodeName === list2.nodeName; + }; + var hasSameListStyle = function (dom, list1, list2) { + var targetStyle = dom.getStyle(list1, 'list-style-type', true); + var style = dom.getStyle(list2, 'list-style-type', true); + return targetStyle === style; + }; + var hasSameClasses = function (elm1, elm2) { + return elm1.className === elm2.className; + }; + var shouldMerge = function (dom, list1, list2) { + return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); + }; + var mergeWithAdjacentLists = function (dom, listBlock) { + var sibling, node; + sibling = listBlock.nextSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.firstChild) { + listBlock.appendChild(node); + } + dom.remove(sibling); + } + sibling = listBlock.previousSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.lastChild) { + listBlock.insertBefore(node, listBlock.firstChild); + } + dom.remove(sibling); + } + }; + var updateList = function (editor, list, listName, detail) { + if (list.nodeName !== listName) { + var newList = editor.dom.rename(list, listName); + updateListWithDetails(editor.dom, newList, detail); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } else { + updateListWithDetails(editor.dom, list, detail); + fireListEvent(editor, listToggleActionFromListName(listName), list); + } + }; + var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + global$5.each([parentList].concat(lists), function (elm) { + updateList(editor, elm, listName, detail); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var hasListStyleDetail = function (detail) { + return 'list-style-type' in detail; + }; + var toggleSingleList = function (editor, parentList, listName, detail) { + if (parentList === editor.getBody()) { + return; + } + if (parentList) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + updateListWithDetails(editor.dom, parentList, detail); + var newList = editor.dom.rename(parentList, listName); + mergeWithAdjacentLists(editor.dom, newList); + editor.selection.setRng(resolveBookmark(bookmark)); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } + } else { + applyList(editor, listName, detail); + fireListEvent(editor, listToggleActionFromListName(listName), parentList); + } + }; + var toggleList = function (editor, listName, detail) { + var parentList = getParentList(editor); + var selectedSubLists = getSelectedSubLists(editor); + detail = detail ? detail : {}; + if (parentList && selectedSubLists.length > 0) { + toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); + } else { + toggleSingleList(editor, parentList, listName, detail); + } + }; + + var DOM$2 = global$6.DOM; + var normalizeList = function (dom, ul) { + var sibling; + var parentNode = ul.parentNode; + if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + if (isEmpty(dom, parentNode)) { + DOM$2.remove(parentNode); + } + } else { + DOM$2.setStyle(parentNode, 'listStyleType', 'none'); + } + } + if (isListNode(parentNode)) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + } + } + }; + var normalizeLists = function (dom, element) { + global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) { + normalizeList(dom, ul); + }); + }; + + var findNextCaretContainer = function (editor, rng, isForward, root) { + var node = rng.startContainer; + var offset = rng.startOffset; + if (isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + return node; + } + var nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (node.nodeType === 1) { + node = global$1.getNode(node, offset); + } + var walker = new global$2(node, root); + if (isForward) { + if (isBogusBr(editor.dom, node)) { + walker.next(); + } + } + while (node = walker[isForward ? 'next' : 'prev2']()) { + if (node.nodeName === 'LI' && !node.hasChildNodes()) { + return node; + } + if (nonEmptyBlocks[node.nodeName]) { + return node; + } + if (isTextNode(node) && node.data.length > 0) { + return node; + } + } + }; + var hasOnlyOneBlockChild = function (dom, elm) { + var childNodes = elm.childNodes; + return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); + }; + var unwrapSingleBlockChild = function (dom, elm) { + if (hasOnlyOneBlockChild(dom, elm)) { + dom.remove(elm.firstChild, true); + } + }; + var moveChildren = function (dom, fromElm, toElm) { + var node, targetElm; + targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + unwrapSingleBlockChild(dom, fromElm); + if (!isEmpty(dom, fromElm, true)) { + while (node = fromElm.firstChild) { + targetElm.appendChild(node); + } + } + }; + var mergeLiElements = function (dom, fromElm, toElm) { + var node, listNode; + var ul = fromElm.parentNode; + if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) { + return; + } + if (isListNode(toElm.lastChild)) { + listNode = toElm.lastChild; + } + if (ul === toElm.lastChild) { + if (isBr(ul.previousSibling)) { + dom.remove(ul.previousSibling); + } + } + node = toElm.lastChild; + if (node && isBr(node) && fromElm.hasChildNodes()) { + dom.remove(node); + } + if (isEmpty(dom, toElm, true)) { + dom.$(toElm).empty(); + } + moveChildren(dom, fromElm, toElm); + if (listNode) { + toElm.appendChild(listNode); + } + var contains = contains$1(Element.fromDom(toElm), Element.fromDom(fromElm)); + var nestedLists = contains ? dom.getParents(fromElm, isListNode, toElm) : []; + dom.remove(fromElm); + each(nestedLists, function (list) { + if (isEmpty(dom, list) && list !== dom.getRoot()) { + dom.remove(list); + } + }); + }; + var mergeIntoEmptyLi = function (editor, fromLi, toLi) { + editor.dom.$(toLi).empty(); + mergeLiElements(editor.dom, fromLi, toLi); + editor.selection.setCursorLocation(toLi); + }; + var mergeForward = function (editor, rng, fromLi, toLi) { + var dom = editor.dom; + if (dom.isEmpty(toLi)) { + mergeIntoEmptyLi(editor, fromLi, toLi); + } else { + var bookmark = createBookmark(rng); + mergeLiElements(dom, fromLi, toLi); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var mergeBackward = function (editor, rng, fromLi, toLi) { + var bookmark = createBookmark(rng); + mergeLiElements(editor.dom, fromLi, toLi); + var resolvedBookmark = resolveBookmark(bookmark); + editor.selection.setRng(resolvedBookmark); + }; + var backspaceDeleteFromListToListCaret = function (editor, isForward) { + var dom = editor.dom, selection = editor.selection; + var selectionStartElm = selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var li = dom.getParent(selection.getStart(), 'LI', root); + if (li) { + var ul = li.parentNode; + if (ul === editor.getBody() && isEmpty(dom, ul)) { + return true; + } + var rng_1 = normalizeRange(selection.getRng()); + var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); + if (otherLi_1 && otherLi_1 !== li) { + editor.undoManager.transact(function () { + if (isForward) { + mergeForward(editor, rng_1, otherLi_1, li); + } else { + if (isFirstChild(li)) { + outdentListSelection(editor); + } else { + mergeBackward(editor, rng_1, li, otherLi_1); + } + } + }); + return true; + } else if (!otherLi_1) { + if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { + editor.undoManager.transact(function () { + flattenListSelection(editor); + }); + return true; + } + } + } + return false; + }; + var removeBlock = function (dom, block, root) { + var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + dom.remove(block); + if (parentBlock && dom.isEmpty(parentBlock)) { + dom.remove(parentBlock); + } + }; + var backspaceDeleteIntoListCaret = function (editor, isForward) { + var dom = editor.dom; + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var block = dom.getParent(selectionStartElm, dom.isBlock, root); + if (block && dom.isEmpty(block)) { + var rng = normalizeRange(editor.selection.getRng()); + var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi_2) { + editor.undoManager.transact(function () { + removeBlock(dom, block, root); + mergeWithAdjacentLists(dom, otherLi_2.parentNode); + editor.selection.select(otherLi_2, true); + editor.selection.collapse(isForward); + }); + return true; + } + } + return false; + }; + var backspaceDeleteCaret = function (editor, isForward) { + return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); + }; + var backspaceDeleteRange = function (editor) { + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + if (startListParent || getSelectedListItems(editor).length > 0) { + editor.undoManager.transact(function () { + editor.execCommand('Delete'); + normalizeLists(editor.dom, editor.getBody()); + }); + return true; + } + return false; + }; + var backspaceDelete = function (editor, isForward) { + return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + }; + var setup = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode === global$3.BACKSPACE) { + if (backspaceDelete(editor, false)) { + e.preventDefault(); + } + } else if (e.keyCode === global$3.DELETE) { + if (backspaceDelete(editor, true)) { + e.preventDefault(); + } + } + }); + }; + + var get = function (editor) { + return { + backspaceDelete: function (isForward) { + backspaceDelete(editor, isForward); + } + }; + }; + + var open = function (editor) { + var dom = editor.dom; + var currentList = getParentList(editor); + if (!isOlNode(currentList)) { + return; + } + editor.windowManager.open({ + title: 'List Properties', + body: { + type: 'panel', + items: [{ + type: 'input', + name: 'start', + label: 'Start list at number', + inputMode: 'numeric' + }] + }, + initialData: { start: dom.getAttrib(currentList, 'start') || '1' }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var data = api.getData(); + editor.undoManager.transact(function () { + dom.setAttrib(getParentList(editor), 'start', data.start === '1' ? '' : data.start); + }); + api.close(); + } + }); + }; + + var queryListCommandState = function (editor, listName) { + return function () { + var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); + return parentList && parentList.nodeName === listName; + }; + }; + var register = function (editor) { + editor.on('BeforeExecCommand', function (e) { + var cmd = e.command.toLowerCase(); + if (cmd === 'indent') { + indentListSelection(editor); + } else if (cmd === 'outdent') { + outdentListSelection(editor); + } + }); + editor.addCommand('InsertUnorderedList', function (ui, detail) { + toggleList(editor, 'UL', detail); + }); + editor.addCommand('InsertOrderedList', function (ui, detail) { + toggleList(editor, 'OL', detail); + }); + editor.addCommand('InsertDefinitionList', function (ui, detail) { + toggleList(editor, 'DL', detail); + }); + editor.addCommand('RemoveList', function () { + flattenListSelection(editor); + }); + editor.addCommand('mceListProps', function () { + open(editor); + }); + editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); + editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); + editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); + }; + + var hasRtcPlugin = function (editor) { + if (/(^|[ ,])rtc([, ]|$)/.test(editor.settings.plugins) && global.get('rtc')) { + return true; + } else { + return false; + } + }; + + var setupTabKey = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) { + return; + } + editor.undoManager.transact(function () { + if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { + e.preventDefault(); + } + }); + }); + }; + var setup$1 = function (editor) { + if (shouldIndentOnTab(editor)) { + setupTabKey(editor); + } + setup(editor); + }; + + var register$1 = function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$5.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + var exec = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + if (!hasPlugin(editor, 'advlist')) { + editor.ui.registry.addToggleButton('numlist', { + icon: 'ordered-list', + active: false, + tooltip: 'Numbered list', + onAction: exec('InsertOrderedList'), + onSetup: function (api) { + return listState(editor, 'OL', api.setActive); + } + }); + editor.ui.registry.addToggleButton('bullist', { + icon: 'unordered-list', + active: false, + tooltip: 'Bullet list', + onAction: exec('InsertUnorderedList'), + onSetup: function (api) { + return listState(editor, 'UL', api.setActive); + } + }); + } + }; + + var register$2 = function (editor) { + var listProperties = { + text: 'List properties...', + icon: 'ordered-list', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + return listState(editor, 'OL', function (active) { + return api.setDisabled(!active); + }); + } + }; + editor.ui.registry.addMenuItem('listprops', listProperties); + editor.ui.registry.addContextMenu('lists', { + update: function (node) { + var parentList = getParentList(editor, node); + return isOlNode(parentList) ? ['listprops'] : []; + } + }); + }; + + function Plugin () { + global.add('lists', function (editor) { + if (hasRtcPlugin(editor) === false) { + setup$1(editor); + register(editor); + } + register$1(editor); + register$2(editor); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/public/js/tinymce/plugins/lists/plugin.min.js b/public/js/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 000000000..62f81b879 --- /dev/null +++ b/public/js/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(a){"use strict";var e,n,t,r,o,i,u,f=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(){},y=function(e){return function(){return e}},c=function(n){return function(e){return!n(e)}},d=y(!1),l=y(!0),m=function(){return p},p=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:d,isSome:d,isNone:l,getOr:t=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(undefined),or:t,orThunk:n,map:m,each:s,bind:m,exists:d,forall:l,filter:m,equals:e,equals_:e,toArray:function(){return[]},toString:y("none()")}),g=function(t){var e=y(t),n=function(){return o},r=function(e){return e(t)},o={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:l,isNone:d,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return g(e(t))},each:function(e){e(t)},bind:r,exists:r,forall:r,filter:function(e){return e(t)?o:p},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(d,function(e){return n(t,e)})}};return o},v={some:g,none:m,from:function(e){return null===e||e===undefined?p:g(e)}},h=function(r){return function(e){return t=typeof(n=e),(null===n?"null":"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t)===r;var n,t}},S=function(n){return function(e){return typeof e===n}},b=h("string"),C=h("array"),O=S("boolean"),N=S("function"),L=S("number"),T=Array.prototype.slice,w=Array.prototype.push,D=function(e,n){for(var t=e.length,r=new Array(t),o=0;oe.length?hn:vn)(t,e,n)},[]),P(r).map(function(e){return e.list}).toArray()},xn=function(a,e,s){var n,t=wn(e,(n=D(Je(a),ge.fromDom),Ne(B(n,c(Sn)),B(R(n),c(Sn)),function(e,n){return{start:e,end:n}})));k(t,function(e){var n,t;n=e.entries,t=s,k(x(n,Cn),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0}(t,e)});var r,o,i,u=(r=a,o=e.entries,I(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i=e.childNodes.length?t.data.length:0}:t.previousSibling&&_e(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&_e(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},Pn=function(e){var n=e.cloneRange(),t=Rn(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=Rn(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},Mn=function(e,n){var t,r=D(nn(e),ge.fromDom),o=D(x(Je(e),qe),ge.fromDom),i=!1;if(r.length||o.length){var u=e.selection.getBookmark();xn(e,r,n),t=e,k(o,"Indent"===n?In:function(e){return Bn(t,e)}),e.selection.moveToBookmark(u),e.selection.setRng(Pn(e.selection.getRng())),e.nodeChanged(),i=!0}return i},Un=function(e){return Mn(e,"Indent")},_n=function(e){return Mn(e,"Outdent")},Fn=function(e){return Mn(e,"Flatten")},$n=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager"),Hn=An.DOM,jn=function(o){var i={},e=function(e){var n,t,r;t=o[e?"startContainer":"endContainer"],r=o[e?"startOffset":"endOffset"],1===t.nodeType&&(n=Hn.create("span",{"data-mce-type":"bookmark"}),t.hasChildNodes()?(r=Math.min(r,t.childNodes.length-1),e?t.insertBefore(n,t.childNodes[r]):Hn.insertAfter(n,t.childNodes[r])):t.appendChild(n),t=n,r=0),i[e?"startContainer":"endContainer"]=t,i[e?"startOffset":"endOffset"]=r};return e(!0),o.collapsed||e(),i},qn=function(o){function e(e){var n,t,r;n=r=o[e?"startContainer":"endContainer"],t=o[e?"startOffset":"endOffset"],n&&(1===n.nodeType&&(t=function(e){for(var n=e.parentNode.firstChild,t=0;n;){if(n===e)return t;1===n.nodeType&&"bookmark"===n.getAttribute("data-mce-type")||t++,n=n.nextSibling}return-1}(n),n=n.parentNode,Hn.remove(r),!n.hasChildNodes()&&Hn.isBlock(n)&&n.appendChild(Hn.create("br"))),o[e?"startContainer":"endContainer"]=n,o[e?"startOffset":"endOffset"]=t)}e(!0),e();var n=Hn.createRng();return n.setStart(o.startContainer,o.startOffset),o.endContainer&&n.setEnd(o.endContainer,o.endOffset),Pn(n)},Kn=function(e){return/\btox\-/.test(e.className)},Vn=function(n,t,r){return function(){var e=function(e){var n=E(e.parents,Fe,Ke).filter(function(e){return e.nodeName===t&&!Kn(e)}).isSome();r(n)};return n.on("NodeChange",e),function(){return n.off("NodeChange",e)}}},Wn=function(e){switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},Qn=function(t,e){Pe.each(e,function(e,n){t.setAttribute(n,e)})},Xn=function(e,n,t){var r,o,i,u,a,s,c;r=e,o=n,u=(i=t)["list-style-type"]?i["list-style-type"]:null,r.setStyle(o,"list-style-type",u),a=e,Qn(s=n,(c=t)["list-attributes"]),Pe.each(a.select("li",s),function(e){Qn(e,c["list-item-attributes"])})},zn=function(e,n,t,r){var o,i;for(o=n[t?"startContainer":"endContainer"],i=n[t?"startOffset":"endOffset"],1===o.nodeType&&(o=o.childNodes[Math.min(i,o.childNodes.length-1)]||o),!t&&Ve(o.nextSibling)&&(o=o.nextSibling);o.parentNode!==r;){if(We(e,o))return o;if(/^(TD|TH)$/.test(o.parentNode.nodeName))return o;o=o.parentNode}return o},Yn=function(f,d,l){void 0===l&&(l={});var e,n=f.selection.getRng(!0),m="LI",t=Ze(f,f.selection.getStart(!0)),p=f.dom;"false"!==p.getContentEditable(f.selection.getNode())&&("DL"===(d=d.toUpperCase())&&(m="DT"),e=jn(n),Pe.each(function(t,e,r){for(var o,i=[],u=t.dom,n=zn(t,e,!0,r),a=zn(t,e,!1,r),s=[],c=n;c&&(s.push(c),c!==a);c=c.nextSibling);return Pe.each(s,function(e){if(We(t,e))return i.push(e),void(o=null);if(u.isBlock(e)||Ve(e))return Ve(e)&&u.remove(e),void(o=null);var n=e.nextSibling;$n.isBookmarkNode(e)&&(We(t,n)||!n&&e.parentNode===r)?o=null:(o||(o=u.create("p"),e.parentNode.insertBefore(o,e),i.push(o)),o.appendChild(e))}),i}(f,n,t),function(e){var n,t,r,o,i,u,a,s,c;(t=e.previousSibling)&&Fe(t)&&t.nodeName===d&&(r=t,o=l,i=p.getStyle(r,"list-style-type"),u=o?o["list-style-type"]:"",i===(u=null===u?"":u))?(n=t,e=p.rename(e,m),t.appendChild(e)):(n=p.create(d),e.parentNode.insertBefore(n,e),n.appendChild(e),e=p.rename(e,m)),a=p,s=e,c=["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],Pe.each(c,function(e){var n;return a.setStyle(s,((n={})[e]="",n))}),Xn(p,n,l),Jn(f.dom,n)}),f.selection.setRng(qn(e)))},Gn=function(e,n,t){return s=t,(a=n)&&s&&Fe(a)&&a.nodeName===s.nodeName&&(i=n,u=t,(o=e).getStyle(i,"list-style-type",!0)===o.getStyle(u,"list-style-type",!0))&&(r=t,n.className===r.className);var r,o,i,u,a,s},Jn=function(e,n){var t,r;if(t=n.nextSibling,Gn(e,n,t)){for(;r=t.firstChild;)n.appendChild(r);e.remove(t)}if(t=n.previousSibling,Gn(e,n,t)){for(;r=t.lastChild;)n.insertBefore(r,n.firstChild);e.remove(t)}},Zn=function(n,e,t,r,o){if(e.nodeName!==r||et(o)){var i=jn(n.selection.getRng(!0));Pe.each([e].concat(t),function(e){!function(e,n,t,r){if(n.nodeName!==t){var o=e.dom.rename(n,t);Xn(e.dom,o,r),Ie(e,Wn(t),o)}else Xn(e.dom,n,r),Ie(e,Wn(t),n)}(n,e,r,o)}),n.selection.setRng(qn(i))}else Fn(n)},et=function(e){return"list-style-type"in e},nt=function(e,n,t){var r=Ye(e),o=Ge(e);t=t||{},r&&0 1) { + return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; + } else { + return 'https://'; + } + }; + var getUrl = function (pattern, url) { + var protocol = getProtocol(url); + var match = pattern.regex.exec(url); + var newUrl = protocol + pattern.url; + var _loop_1 = function (i) { + newUrl = newUrl.replace('$' + i, function () { + return match[i] ? match[i] : ''; + }); + }; + for (var i = 0; i < match.length; i++) { + _loop_1(i); + } + return newUrl.replace(/\?$/, ''); + }; + var matchPattern = function (url) { + var patterns = urlPatterns.filter(function (pattern) { + return pattern.regex.test(url); + }); + if (patterns.length > 0) { + return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + } else { + return null; + } + }; + + var getIframeHtml = function (data) { + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; + return ''; + }; + var getFlashHtml = function (data) { + var html = ''; + if (data.poster) { + html += ''; + } + html += ''; + return html; + }; + var getAudioHtml = function (data, audioTemplateCallback) { + if (audioTemplateCallback) { + return audioTemplateCallback(data); + } else { + return ''; + } + }; + var getVideoHtml = function (data, videoTemplateCallback) { + if (videoTemplateCallback) { + return videoTemplateCallback(data); + } else { + return ''; + } + }; + var getScriptHtml = function (data) { + return ''; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = guess(data.source); + data.altsourcemime = guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = getAudioTemplateCallback(editor); + var videoTemplateCallback = getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Option.some(v) : Option.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Option.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Option.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + + var get$1 = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + return { showDialog: showDialog$1 }; + }; + + var register = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog$1); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$5(); + var blocked; + global$3({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$4({})).parse(html); + return writer.getContent(); + }; + + var createPlaceholderNode = function (editor, node) { + var placeHolder; + var name = node.name; + placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var previewWrapper; + var previewNode; + var shimNode; + var name = node.name; + previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var attribs; + var ai; + var innerHtml; + attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + + function Plugin () { + global.add('media', function (editor) { + register(editor); + register$1(editor); + setup$1(editor); + setup(editor); + setup$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/media/plugin.min.js b/public/js/tinymce/plugins/media/plugin.min.js new file mode 100644 index 000000000..1cb7135ea --- /dev/null +++ b/public/js/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var e,t,r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):'"):"script"===n.type?' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + + var open = function (editor) { + var content = getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + + function Plugin () { + global.add('preview', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/js/tinymce/plugins/preview/plugin.min.js b/public/js/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 000000000..d794abcb2 --- /dev/null +++ b/public/js/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.3.0 (2020-05-21) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),m=tinymce.util.Tools.resolve("tinymce.Env"),i=function(e){var t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","");n+='',e&&(n+='");var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";l.each(t.contentCSS,function(e){n+='"});var r=t.settings.body_id||"tinymce";-1!==r.indexOf("=")&&(r=(r=t.getParam("body_id","","hash"))[t.id]||r);var a=t.settings.body_class||"";-1!==a.indexOf("=")&&(a=(a=t.getParam("body_class","","hash"))[t.id]||"");var c=' + + + + + + +
    +

    + +
    +
    +
      + +
    • + +
      链接
      +
      &#xe7f8;
      +
    • + +
    • + +
      打印区域
      +
      &#xe7f5;
      +
    • + +
    • + +
      打印页面配置
      +
      &#xe7f6;
      +
    • + +
    • + +
      打印标题
      +
      &#xe7f7;
      +
    • + +
    • + +
      分页预览
      +
      &#xe7f2;
      +
    • + +
    • + +
      普通
      +
      &#xe7f3;
      +
    • + +
    • + +
      页面布局
      +
      &#xe7f4;
      +
    • + +
    • + +
      表格锁定
      +
      &#xe7ee;
      +
    • + +
    • + +
      转到
      +
      &#xe7f1;
      +
    • + +
    • + +
      右箭头
      +
      &#xe7ed;
      +
    • + +
    • + +
      菜单
      +
      &#xe7ef;
      +
    • + +
    • + +
      替换
      +
      &#xe7f0;
      +
    • + +
    • + +
      冻结
      +
      &#xe7e1;
      +
    • + +
    • + +
      +
      &#xe7e2;
      +
    • + +
    • + +
      +
      &#xe7e3;
      +
    • + +
    • + +
      溢出
      +
      &#xe7e4;
      +
    • + +
    • + +
      升序
      +
      &#xe7e5;
      +
    • + +
    • + +
      内框线
      +
      &#xe7e6;
      +
    • + +
    • + +
      清除筛选
      +
      &#xe7e7;
      +
    • + +
    • + +
      文本向上
      +
      &#xe7e8;
      +
    • + +
    • + +
      降序
      +
      &#xe7e9;
      +
    • + +
    • + +
      内框横线
      +
      &#xe7ea;
      +
    • + +
    • + +
      内框竖线
      +
      &#xe7eb;
      +
    • + +
    • + +
      自定义排序
      +
      &#xe7ec;
      +
    • + +
    • + +
      logo2
      +
      &#xe7df;
      +
    • + +
    • + +
      logo
      +
      &#xe7e0;
      +
    • + +
    • + +
      文本倾斜
      +
      &#xe7de;
      +
    • + +
    • + +
      加粗
      +
      &#xe7d9;
      +
    • + +
    • + +
      搜索
      +
      &#xe78a;
      +
    • + +
    • + +
      关闭
      +
      &#xe78b;
      +
    • + +
    • + +
      下一个
      +
      &#xe78c;
      +
    • + +
    • + +
      下拉
      +
      &#xe78d;
      +
    • + +
    • + +
      文本颜色
      +
      &#xe78e;
      +
    • + +
    • + +
      上一个
      +
      &#xe78f;
      +
    • + +
    • + +
      数据透视
      +
      &#xe790;
      +
    • + +
    • + +
      填充
      +
      &#xe791;
      +
    • + +
    • + +
      增加小数位
      +
      &#xe792;
      +
    • + +
    • + +
      编辑2
      +
      &#xe793;
      +
    • + +
    • + +
      截屏
      +
      &#xe794;
      +
    • + +
    • + +
      减小小数位
      +
      &#xe796;
      +
    • + +
    • + +
      菜单
      +
      &#xe797;
      +
    • + +
    • + +
      数据库
      +
      &#xe798;
      +
    • + +
    • + +
      无边框
      +
      &#xe799;
      +
    • + +
    • + +
      编辑
      +
      &#xe79a;
      +
    • + +
    • + +
      清除样式
      +
      &#xe79b;
      +
    • + +
    • + +
      删除
      +
      &#xe79c;
      +
    • + +
    • + +
      文本居中对齐
      +
      &#xe79d;
      +
    • + +
    • + +
      打印
      +
      &#xe79e;
      +
    • + +
    • + +
      文本分割
      +
      &#xe79f;
      +
    • + +
    • + +
      函数‘
      +
      &#xe7a0;
      +
    • + +
    • + +
      降序
      +
      &#xe7a1;
      +
    • + +
    • + +
      顶部对齐
      +
      &#xe7a2;
      +
    • + +
    • + +
      图片
      +
      &#xe7a3;
      +
    • + +
    • + +
      向下90
      +
      &#xe7a4;
      +
    • + +
    • + +
      竖排文字
      +
      &#xe7a5;
      +
    • + +
    • + +
      全加边框
      +
      &#xe7a6;
      +
    • + +
    • + +
      升序
      +
      &#xe7a7;
      +
    • + +
    • + +
      裁剪
      +
      &#xe7a8;
      +
    • + +
    • + +
      金额
      +
      &#xe7a9;
      +
    • + +
    • + +
      菜单1
      +
      &#xe7aa;
      +
    • + +
    • + +
      取消合并
      +
      &#xe7ab;
      +
    • + +
    • + +
      文本下划线
      +
      &#xe7ac;
      +
    • + +
    • + +
      上边框
      +
      &#xe7ad;
      +
    • + +
    • + +
      定位
      +
      &#xe7ae;
      +
    • + +
    • + +
      四周加边框
      +
      &#xe7af;
      +
    • + +
    • + +
      侧边栏收起
      +
      &#xe7b0;
      +
    • + +
    • + +
      合并
      +
      &#xe7b1;
      +
    • + +
    • + +
      向上倾斜
      +
      &#xe7b2;
      +
    • + +
    • + +
      水平对齐
      +
      &#xe7b3;
      +
    • + +
    • + +
      文本删除线
      +
      &#xe7b4;
      +
    • + +
    • + +
      文本右对齐
      +
      &#xe7b5;
      +
    • + +
    • + +
      前进
      +
      &#xe7b6;
      +
    • + +
    • + +
      图表
      +
      &#xe7b7;
      +
    • + +
    • + +
      右边框
      +
      &#xe7b8;
      +
    • + +
    • + +
      百分号
      +
      &#xe7b9;
      +
    • + +
    • + +
      格式刷
      +
      &#xe7ba;
      +
    • + +
    • + +
      保存
      +
      &#xe7bb;
      +
    • + +
    • + +
      数据验证
      +
      &#xe7bc;
      +
    • + +
    • + +
      截断
      +
      &#xe7bd;
      +
    • + +
    • + +
      格式条件
      +
      &#xe7be;
      +
    • + +
    • + +
      自动换行
      +
      &#xe7bf;
      +
    • + +
    • + +
      侧边栏展开
      +
      &#xe7c0;
      +
    • + +
    • + +
      筛选2
      +
      &#xe7c1;
      +
    • + +
    • + +
      向下倾斜
      +
      &#xe7c2;
      +
    • + +
    • + +
      溢出
      +
      &#xe7c3;
      +
    • + +
    • + +
      垂直合并
      +
      &#xe7c4;
      +
    • + +
    • + +
      文本分散对齐
      +
      &#xe7c5;
      +
    • + +
    • + +
      左边框
      +
      &#xe7c6;
      +
    • + +
    • + +
      分页查看
      +
      &#xe7c7;
      +
    • + +
    • + +
      运行
      +
      &#xe7c8;
      +
    • + +
    • + +
      +
      &#xe7c9;
      +
    • + +
    • + +
      全屏
      +
      &#xe7ca;
      +
    • + +
    • + +
      筛选
      +
      &#xe7cb;
      +
    • + +
    • + +
      更新
      +
      &#xe7cc;
      +
    • + +
    • + +
      清除
      +
      &#xe7cd;
      +
    • + +
    • + +
      +
      &#xe7ce;
      +
    • + +
    • + +
      注释
      +
      &#xe7cf;
      +
    • + +
    • + +
      +
      &#xe7d0;
      +
    • + +
    • + +
      计算
      +
      &#xe7d1;
      +
    • + +
    • + +
      +
      &#xe7d2;
      +
    • + +
    • + +
      底部对齐
      +
      &#xe7d3;
      +
    • + +
    • + +
      向上90
      +
      &#xe7d4;
      +
    • + +
    • + +
      无选装
      +
      &#xe7d5;
      +
    • + +
    • + +
      显示隐藏网格
      +
      &#xe7d6;
      +
    • + +
    • + +
      冻结
      +
      &#xe7d7;
      +
    • + +
    • + +
      文本左对齐
      +
      &#xe7d8;
      +
    • + +
    • + +
      后退
      +
      &#xe7da;
      +
    • + +
    • + +
      水平合并
      +
      &#xe7db;
      +
    • + +
    • + +
      下边框
      +
      &#xe7dc;
      +
    • + +
    • + +
      设置
      +
      &#xe7dd;
      +
    • + +
    +
    +

    Unicode 引用

    +
    + +

    Unicode 是字体在网页端最原始的应用方式,特点是:

    +
      +
    • 兼容性最好,支持 IE6+,及所有现代浏览器。
    • +
    • 支持按字体的方式去动态调整图标大小,颜色等等。
    • +
    • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
    • +
    +
    +

    注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式

    +
    +

    Unicode 使用步骤如下:

    +

    第一步:拷贝项目下面生成的 @font-face

    +
    @font-face {
    +  font-family: 'iconfont';
    +  src: url('iconfont.eot');
    +  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
    +      url('iconfont.woff2') format('woff2'),
    +      url('iconfont.woff') format('woff'),
    +      url('iconfont.ttf') format('truetype'),
    +      url('iconfont.svg#iconfont') format('svg');
    +}
    +
    +

    第二步:定义使用 iconfont 的样式

    +
    .iconfont {
    +  font-family: "iconfont" !important;
    +  font-size: 16px;
    +  font-style: normal;
    +  -webkit-font-smoothing: antialiased;
    +  -moz-osx-font-smoothing: grayscale;
    +}
    +
    +

    第三步:挑选相应图标并获取字体编码,应用于页面

    +
    +<span class="iconfont">&#x33;</span>
    +
    +
    +

    "iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

    +
    +
    +
    +
    +
      + +
    • + +
      + 链接 +
      +
      .luckysheet-iconfont-lianjie +
      +
    • + +
    • + +
      + 打印区域 +
      +
      .luckysheet-iconfont-dayinquyu +
      +
    • + +
    • + +
      + 打印页面配置 +
      +
      .luckysheet-iconfont-dayinyemianpeizhi +
      +
    • + +
    • + +
      + 打印标题 +
      +
      .luckysheet-iconfont-dayinbiaoti +
      +
    • + +
    • + +
      + 分页预览 +
      +
      .luckysheet-iconfont-fenyeyulan +
      +
    • + +
    • + +
      + 普通 +
      +
      .luckysheet-iconfont-putong +
      +
    • + +
    • + +
      + 页面布局 +
      +
      .luckysheet-iconfont-yemianbuju +
      +
    • + +
    • + +
      + 表格锁定 +
      +
      .luckysheet-iconfont-biaogesuoding +
      +
    • + +
    • + +
      + 转到 +
      +
      .luckysheet-iconfont-zhuandao1 +
      +
    • + +
    • + +
      + 右箭头 +
      +
      .luckysheet-iconfont-youjiantou +
      +
    • + +
    • + +
      + 菜单 +
      +
      .luckysheet-iconfont-caidan2 +
      +
    • + +
    • + +
      + 替换 +
      +
      .luckysheet-iconfont-tihuan +
      +
    • + +
    • + +
      + 冻结 +
      +
      .luckysheet-iconfont-dongjie1 +
      +
    • + +
    • + +
      + 剪 +
      +
      .luckysheet-iconfont-jian1 +
      +
    • + +
    • + +
      + 加 +
      +
      .luckysheet-iconfont-jia1 +
      +
    • + +
    • + +
      + 溢出 +
      +
      .luckysheet-iconfont-yichu1 +
      +
    • + +
    • + +
      + 升序 +
      +
      .luckysheet-iconfont-shengxu1 +
      +
    • + +
    • + +
      + 内框线 +
      +
      .luckysheet-iconfont-neikuangxian +
      +
    • + +
    • + +
      + 清除筛选 +
      +
      .luckysheet-iconfont-qingchushaixuan +
      +
    • + +
    • + +
      + 文本向上 +
      +
      .luckysheet-iconfont-wenbenxiangshang +
      +
    • + +
    • + +
      + 降序 +
      +
      .luckysheet-iconfont-jiangxu1 +
      +
    • + +
    • + +
      + 内框横线 +
      +
      .luckysheet-iconfont-neikuanghengxian +
      +
    • + +
    • + +
      + 内框竖线 +
      +
      .luckysheet-iconfont-neikuangshuxian +
      +
    • + +
    • + +
      + 自定义排序 +
      +
      .luckysheet-iconfont-zidingyipaixu +
      +
    • + +
    • + +
      + logo2 +
      +
      .luckysheet-iconfont-logo2 +
      +
    • + +
    • + +
      + logo +
      +
      .luckysheet-iconfont-logo +
      +
    • + +
    • + +
      + 文本倾斜 +
      +
      .luckysheet-iconfont-wenbenqingxie1 +
      +
    • + +
    • + +
      + 加粗 +
      +
      .luckysheet-iconfont-jiacu +
      +
    • + +
    • + +
      + 搜索 +
      +
      .luckysheet-iconfont-sousuo +
      +
    • + +
    • + +
      + 关闭 +
      +
      .luckysheet-iconfont-guanbi +
      +
    • + +
    • + +
      + 下一个 +
      +
      .luckysheet-iconfont-xiayige +
      +
    • + +
    • + +
      + 下拉 +
      +
      .luckysheet-iconfont-xiala +
      +
    • + +
    • + +
      + 文本颜色 +
      +
      .luckysheet-iconfont-wenbenyanse +
      +
    • + +
    • + +
      + 上一个 +
      +
      .luckysheet-iconfont-shangyige +
      +
    • + +
    • + +
      + 数据透视 +
      +
      .luckysheet-iconfont-shujutoushi +
      +
    • + +
    • + +
      + 填充 +
      +
      .luckysheet-iconfont-tianchong +
      +
    • + +
    • + +
      + 增加小数位 +
      +
      .luckysheet-iconfont-zengjiaxiaoshuwei +
      +
    • + +
    • + +
      + 编辑2 +
      +
      .luckysheet-iconfont-bianji2 +
      +
    • + +
    • + +
      + 截屏 +
      +
      .luckysheet-iconfont-jieping +
      +
    • + +
    • + +
      + 减小小数位 +
      +
      .luckysheet-iconfont-jianxiaoxiaoshuwei +
      +
    • + +
    • + +
      + 菜单 +
      +
      .luckysheet-iconfont-caidan +
      +
    • + +
    • + +
      + 数据库 +
      +
      .luckysheet-iconfont-shujuku +
      +
    • + +
    • + +
      + 无边框 +
      +
      .luckysheet-iconfont-wubiankuang +
      +
    • + +
    • + +
      + 编辑 +
      +
      .luckysheet-iconfont-bianji +
      +
    • + +
    • + +
      + 清除样式 +
      +
      .luckysheet-iconfont-qingchuyangshi +
      +
    • + +
    • + +
      + 删除 +
      +
      .luckysheet-iconfont-shanchu +
      +
    • + +
    • + +
      + 文本居中对齐 +
      +
      .luckysheet-iconfont-wenbenjuzhongduiqi +
      +
    • + +
    • + +
      + 打印 +
      +
      .luckysheet-iconfont-dayin +
      +
    • + +
    • + +
      + 文本分割 +
      +
      .luckysheet-iconfont-wenbenfenge +
      +
    • + +
    • + +
      + 函数‘ +
      +
      .luckysheet-iconfont-hanshu +
      +
    • + +
    • + +
      + 降序 +
      +
      .luckysheet-iconfont-jiangxu +
      +
    • + +
    • + +
      + 顶部对齐 +
      +
      .luckysheet-iconfont-dingbuduiqi +
      +
    • + +
    • + +
      + 图片 +
      +
      .luckysheet-iconfont-tupian +
      +
    • + +
    • + +
      + 向下90 +
      +
      .luckysheet-iconfont-xiangxia90 +
      +
    • + +
    • + +
      + 竖排文字 +
      +
      .luckysheet-iconfont-shupaiwenzi +
      +
    • + +
    • + +
      + 全加边框 +
      +
      .luckysheet-iconfont-quanjiabiankuang +
      +
    • + +
    • + +
      + 升序 +
      +
      .luckysheet-iconfont-shengxu +
      +
    • + +
    • + +
      + 裁剪 +
      +
      .luckysheet-iconfont-caijian +
      +
    • + +
    • + +
      + 金额 +
      +
      .luckysheet-iconfont-jine +
      +
    • + +
    • + +
      + 菜单1 +
      +
      .luckysheet-iconfont-caidan1 +
      +
    • + +
    • + +
      + 取消合并 +
      +
      .luckysheet-iconfont-quxiaohebing +
      +
    • + +
    • + +
      + 文本下划线 +
      +
      .luckysheet-iconfont-wenbenxiahuaxian +
      +
    • + +
    • + +
      + 上边框 +
      +
      .luckysheet-iconfont-shangbiankuang +
      +
    • + +
    • + +
      + 定位 +
      +
      .luckysheet-iconfont-dingwei +
      +
    • + +
    • + +
      + 四周加边框 +
      +
      .luckysheet-iconfont-sizhoujiabiankuang +
      +
    • + +
    • + +
      + 侧边栏收起 +
      +
      .luckysheet-iconfont-cebianlanshouqi +
      +
    • + +
    • + +
      + 合并 +
      +
      .luckysheet-iconfont-hebing +
      +
    • + +
    • + +
      + 向上倾斜 +
      +
      .luckysheet-iconfont-xiangshangqingxie +
      +
    • + +
    • + +
      + 水平对齐 +
      +
      .luckysheet-iconfont-shuipingduiqi +
      +
    • + +
    • + +
      + 文本删除线 +
      +
      .luckysheet-iconfont-wenbenshanchuxian +
      +
    • + +
    • + +
      + 文本右对齐 +
      +
      .luckysheet-iconfont-wenbenyouduiqi +
      +
    • + +
    • + +
      + 前进 +
      +
      .luckysheet-iconfont-qianjin +
      +
    • + +
    • + +
      + 图表 +
      +
      .luckysheet-iconfont-tubiao +
      +
    • + +
    • + +
      + 右边框 +
      +
      .luckysheet-iconfont-youbiankuang +
      +
    • + +
    • + +
      + 百分号 +
      +
      .luckysheet-iconfont-baifenhao +
      +
    • + +
    • + +
      + 格式刷 +
      +
      .luckysheet-iconfont-geshishua +
      +
    • + +
    • + +
      + 保存 +
      +
      .luckysheet-iconfont-baocun +
      +
    • + +
    • + +
      + 数据验证 +
      +
      .luckysheet-iconfont-shujuyanzheng +
      +
    • + +
    • + +
      + 截断 +
      +
      .luckysheet-iconfont-jieduan +
      +
    • + +
    • + +
      + 格式条件 +
      +
      .luckysheet-iconfont-geshitiaojian +
      +
    • + +
    • + +
      + 自动换行 +
      +
      .luckysheet-iconfont-zidonghuanhang +
      +
    • + +
    • + +
      + 侧边栏展开 +
      +
      .luckysheet-iconfont-cebianlanzhankai +
      +
    • + +
    • + +
      + 筛选2 +
      +
      .luckysheet-iconfont-shaixuan2 +
      +
    • + +
    • + +
      + 向下倾斜 +
      +
      .luckysheet-iconfont-xiangxiaqingxie +
      +
    • + +
    • + +
      + 溢出 +
      +
      .luckysheet-iconfont-yichu +
      +
    • + +
    • + +
      + 垂直合并 +
      +
      .luckysheet-iconfont-chuizhihebing +
      +
    • + +
    • + +
      + 文本分散对齐 +
      +
      .luckysheet-iconfont-wenbenfensanduiqi +
      +
    • + +
    • + +
      + 左边框 +
      +
      .luckysheet-iconfont-zuobiankuang +
      +
    • + +
    • + +
      + 分页查看 +
      +
      .luckysheet-iconfont-fenyechakan +
      +
    • + +
    • + +
      + 运行 +
      +
      .luckysheet-iconfont-yunhang +
      +
    • + +
    • + +
      + 列 +
      +
      .luckysheet-iconfont-lie +
      +
    • + +
    • + +
      + 全屏 +
      +
      .luckysheet-iconfont-quanping +
      +
    • + +
    • + +
      + 筛选 +
      +
      .luckysheet-iconfont-shaixuan +
      +
    • + +
    • + +
      + 更新 +
      +
      .luckysheet-iconfont-gengxin +
      +
    • + +
    • + +
      + 清除 +
      +
      .luckysheet-iconfont-qingchu +
      +
    • + +
    • + +
      + 行 +
      +
      .luckysheet-iconfont-hang +
      +
    • + +
    • + +
      + 注释 +
      +
      .luckysheet-iconfont-zhushi +
      +
    • + +
    • + +
      + 剪 +
      +
      .luckysheet-iconfont-jian +
      +
    • + +
    • + +
      + 计算 +
      +
      .luckysheet-iconfont-jisuan +
      +
    • + +
    • + +
      + 加 +
      +
      .luckysheet-iconfont-jia +
      +
    • + +
    • + +
      + 底部对齐 +
      +
      .luckysheet-iconfont-dibuduiqi +
      +
    • + +
    • + +
      + 向上90 +
      +
      .luckysheet-iconfont-xiangshang90 +
      +
    • + +
    • + +
      + 无选装 +
      +
      .luckysheet-iconfont-wuxuanzhuang +
      +
    • + +
    • + +
      + 显示隐藏网格 +
      +
      .luckysheet-iconfont-xianshiyincangwangge +
      +
    • + +
    • + +
      + 冻结 +
      +
      .luckysheet-iconfont-dongjie +
      +
    • + +
    • + +
      + 文本左对齐 +
      +
      .luckysheet-iconfont-wenbenzuoduiqi +
      +
    • + +
    • + +
      + 后退 +
      +
      .luckysheet-iconfont-houtui +
      +
    • + +
    • + +
      + 水平合并 +
      +
      .luckysheet-iconfont-shuipinghebing +
      +
    • + +
    • + +
      + 下边框 +
      +
      .luckysheet-iconfont-xiabiankuang +
      +
    • + +
    • + +
      + 设置 +
      +
      .luckysheet-iconfont-shezhi +
      +
    • + +
    +
    +

    font-class 引用

    +
    + +

    font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

    +

    与 Unicode 使用方式相比,具有如下特点:

    +
      +
    • 兼容性良好,支持 IE8+,及所有现代浏览器。
    • +
    • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
    • +
    • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
    • +
    • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
    • +
    +

    使用步骤如下:

    +

    第一步:引入项目下面生成的 fontclass 代码:

    +
    <link rel="stylesheet" href="./iconfont.css">
    +
    +

    第二步:挑选相应图标并获取类名,应用于页面:

    +
    <span class="iconfont luckysheet-iconfont-xxx"></span>
    +
    +
    +

    " + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

    +
    +
    +
    +
    +
      + +
    • + +
      链接
      +
      #luckysheet-iconfont-lianjie
      +
    • + +
    • + +
      打印区域
      +
      #luckysheet-iconfont-dayinquyu
      +
    • + +
    • + +
      打印页面配置
      +
      #luckysheet-iconfont-dayinyemianpeizhi
      +
    • + +
    • + +
      打印标题
      +
      #luckysheet-iconfont-dayinbiaoti
      +
    • + +
    • + +
      分页预览
      +
      #luckysheet-iconfont-fenyeyulan
      +
    • + +
    • + +
      普通
      +
      #luckysheet-iconfont-putong
      +
    • + +
    • + +
      页面布局
      +
      #luckysheet-iconfont-yemianbuju
      +
    • + +
    • + +
      表格锁定
      +
      #luckysheet-iconfont-biaogesuoding
      +
    • + +
    • + +
      转到
      +
      #luckysheet-iconfont-zhuandao1
      +
    • + +
    • + +
      右箭头
      +
      #luckysheet-iconfont-youjiantou
      +
    • + +
    • + +
      菜单
      +
      #luckysheet-iconfont-caidan2
      +
    • + +
    • + +
      替换
      +
      #luckysheet-iconfont-tihuan
      +
    • + +
    • + +
      冻结
      +
      #luckysheet-iconfont-dongjie1
      +
    • + +
    • + +
      +
      #luckysheet-iconfont-jian1
      +
    • + +
    • + +
      +
      #luckysheet-iconfont-jia1
      +
    • + +
    • + +
      溢出
      +
      #luckysheet-iconfont-yichu1
      +
    • + +
    • + +
      升序
      +
      #luckysheet-iconfont-shengxu1
      +
    • + +
    • + +
      内框线
      +
      #luckysheet-iconfont-neikuangxian
      +
    • + +
    • + +
      清除筛选
      +
      #luckysheet-iconfont-qingchushaixuan
      +
    • + +
    • + +
      文本向上
      +
      #luckysheet-iconfont-wenbenxiangshang
      +
    • + +
    • + +
      降序
      +
      #luckysheet-iconfont-jiangxu1
      +
    • + +
    • + +
      内框横线
      +
      #luckysheet-iconfont-neikuanghengxian
      +
    • + +
    • + +
      内框竖线
      +
      #luckysheet-iconfont-neikuangshuxian
      +
    • + +
    • + +
      自定义排序
      +
      #luckysheet-iconfont-zidingyipaixu
      +
    • + +
    • + +
      logo2
      +
      #luckysheet-iconfont-logo2
      +
    • + +
    • + +
      logo
      +
      #luckysheet-iconfont-logo
      +
    • + +
    • + +
      文本倾斜
      +
      #luckysheet-iconfont-wenbenqingxie1
      +
    • + +
    • + +
      加粗
      +
      #luckysheet-iconfont-jiacu
      +
    • + +
    • + +
      搜索
      +
      #luckysheet-iconfont-sousuo
      +
    • + +
    • + +
      关闭
      +
      #luckysheet-iconfont-guanbi
      +
    • + +
    • + +
      下一个
      +
      #luckysheet-iconfont-xiayige
      +
    • + +
    • + +
      下拉
      +
      #luckysheet-iconfont-xiala
      +
    • + +
    • + +
      文本颜色
      +
      #luckysheet-iconfont-wenbenyanse
      +
    • + +
    • + +
      上一个
      +
      #luckysheet-iconfont-shangyige
      +
    • + +
    • + +
      数据透视
      +
      #luckysheet-iconfont-shujutoushi
      +
    • + +
    • + +
      填充
      +
      #luckysheet-iconfont-tianchong
      +
    • + +
    • + +
      增加小数位
      +
      #luckysheet-iconfont-zengjiaxiaoshuwei
      +
    • + +
    • + +
      编辑2
      +
      #luckysheet-iconfont-bianji2
      +
    • + +
    • + +
      截屏
      +
      #luckysheet-iconfont-jieping
      +
    • + +
    • + +
      减小小数位
      +
      #luckysheet-iconfont-jianxiaoxiaoshuwei
      +
    • + +
    • + +
      菜单
      +
      #luckysheet-iconfont-caidan
      +
    • + +
    • + +
      数据库
      +
      #luckysheet-iconfont-shujuku
      +
    • + +
    • + +
      无边框
      +
      #luckysheet-iconfont-wubiankuang
      +
    • + +
    • + +
      编辑
      +
      #luckysheet-iconfont-bianji
      +
    • + +
    • + +
      清除样式
      +
      #luckysheet-iconfont-qingchuyangshi
      +
    • + +
    • + +
      删除
      +
      #luckysheet-iconfont-shanchu
      +
    • + +
    • + +
      文本居中对齐
      +
      #luckysheet-iconfont-wenbenjuzhongduiqi
      +
    • + +
    • + +
      打印
      +
      #luckysheet-iconfont-dayin
      +
    • + +
    • + +
      文本分割
      +
      #luckysheet-iconfont-wenbenfenge
      +
    • + +
    • + +
      函数‘
      +
      #luckysheet-iconfont-hanshu
      +
    • + +
    • + +
      降序
      +
      #luckysheet-iconfont-jiangxu
      +
    • + +
    • + +
      顶部对齐
      +
      #luckysheet-iconfont-dingbuduiqi
      +
    • + +
    • + +
      图片
      +
      #luckysheet-iconfont-tupian
      +
    • + +
    • + +
      向下90
      +
      #luckysheet-iconfont-xiangxia90
      +
    • + +
    • + +
      竖排文字
      +
      #luckysheet-iconfont-shupaiwenzi
      +
    • + +
    • + +
      全加边框
      +
      #luckysheet-iconfont-quanjiabiankuang
      +
    • + +
    • + +
      升序
      +
      #luckysheet-iconfont-shengxu
      +
    • + +
    • + +
      裁剪
      +
      #luckysheet-iconfont-caijian
      +
    • + +
    • + +
      金额
      +
      #luckysheet-iconfont-jine
      +
    • + +
    • + +
      菜单1
      +
      #luckysheet-iconfont-caidan1
      +
    • + +
    • + +
      取消合并
      +
      #luckysheet-iconfont-quxiaohebing
      +
    • + +
    • + +
      文本下划线
      +
      #luckysheet-iconfont-wenbenxiahuaxian
      +
    • + +
    • + +
      上边框
      +
      #luckysheet-iconfont-shangbiankuang
      +
    • + +
    • + +
      定位
      +
      #luckysheet-iconfont-dingwei
      +
    • + +
    • + +
      四周加边框
      +
      #luckysheet-iconfont-sizhoujiabiankuang
      +
    • + +
    • + +
      侧边栏收起
      +
      #luckysheet-iconfont-cebianlanshouqi
      +
    • + +
    • + +
      合并
      +
      #luckysheet-iconfont-hebing
      +
    • + +
    • + +
      向上倾斜
      +
      #luckysheet-iconfont-xiangshangqingxie
      +
    • + +
    • + +
      水平对齐
      +
      #luckysheet-iconfont-shuipingduiqi
      +
    • + +
    • + +
      文本删除线
      +
      #luckysheet-iconfont-wenbenshanchuxian
      +
    • + +
    • + +
      文本右对齐
      +
      #luckysheet-iconfont-wenbenyouduiqi
      +
    • + +
    • + +
      前进
      +
      #luckysheet-iconfont-qianjin
      +
    • + +
    • + +
      图表
      +
      #luckysheet-iconfont-tubiao
      +
    • + +
    • + +
      右边框
      +
      #luckysheet-iconfont-youbiankuang
      +
    • + +
    • + +
      百分号
      +
      #luckysheet-iconfont-baifenhao
      +
    • + +
    • + +
      格式刷
      +
      #luckysheet-iconfont-geshishua
      +
    • + +
    • + +
      保存
      +
      #luckysheet-iconfont-baocun
      +
    • + +
    • + +
      数据验证
      +
      #luckysheet-iconfont-shujuyanzheng
      +
    • + +
    • + +
      截断
      +
      #luckysheet-iconfont-jieduan
      +
    • + +
    • + +
      格式条件
      +
      #luckysheet-iconfont-geshitiaojian
      +
    • + +
    • + +
      自动换行
      +
      #luckysheet-iconfont-zidonghuanhang
      +
    • + +
    • + +
      侧边栏展开
      +
      #luckysheet-iconfont-cebianlanzhankai
      +
    • + +
    • + +
      筛选2
      +
      #luckysheet-iconfont-shaixuan2
      +
    • + +
    • + +
      向下倾斜
      +
      #luckysheet-iconfont-xiangxiaqingxie
      +
    • + +
    • + +
      溢出
      +
      #luckysheet-iconfont-yichu
      +
    • + +
    • + +
      垂直合并
      +
      #luckysheet-iconfont-chuizhihebing
      +
    • + +
    • + +
      文本分散对齐
      +
      #luckysheet-iconfont-wenbenfensanduiqi
      +
    • + +
    • + +
      左边框
      +
      #luckysheet-iconfont-zuobiankuang
      +
    • + +
    • + +
      分页查看
      +
      #luckysheet-iconfont-fenyechakan
      +
    • + +
    • + +
      运行
      +
      #luckysheet-iconfont-yunhang
      +
    • + +
    • + +
      +
      #luckysheet-iconfont-lie
      +
    • + +
    • + +
      全屏
      +
      #luckysheet-iconfont-quanping
      +
    • + +
    • + +
      筛选
      +
      #luckysheet-iconfont-shaixuan
      +
    • + +
    • + +
      更新
      +
      #luckysheet-iconfont-gengxin
      +
    • + +
    • + +
      清除
      +
      #luckysheet-iconfont-qingchu
      +
    • + +
    • + +
      +
      #luckysheet-iconfont-hang
      +
    • + +
    • + +
      注释
      +
      #luckysheet-iconfont-zhushi
      +
    • + +
    • + +
      +
      #luckysheet-iconfont-jian
      +
    • + +
    • + +
      计算
      +
      #luckysheet-iconfont-jisuan
      +
    • + +
    • + +
      +
      #luckysheet-iconfont-jia
      +
    • + +
    • + +
      底部对齐
      +
      #luckysheet-iconfont-dibuduiqi
      +
    • + +
    • + +
      向上90
      +
      #luckysheet-iconfont-xiangshang90
      +
    • + +
    • + +
      无选装
      +
      #luckysheet-iconfont-wuxuanzhuang
      +
    • + +
    • + +
      显示隐藏网格
      +
      #luckysheet-iconfont-xianshiyincangwangge
      +
    • + +
    • + +
      冻结
      +
      #luckysheet-iconfont-dongjie
      +
    • + +
    • + +
      文本左对齐
      +
      #luckysheet-iconfont-wenbenzuoduiqi
      +
    • + +
    • + +
      后退
      +
      #luckysheet-iconfont-houtui
      +
    • + +
    • + +
      水平合并
      +
      #luckysheet-iconfont-shuipinghebing
      +
    • + +
    • + +
      下边框
      +
      #luckysheet-iconfont-xiabiankuang
      +
    • + +
    • + +
      设置
      +
      #luckysheet-iconfont-shezhi
      +
    • + +
    +
    +

    Symbol 引用

    +
    + +

    这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

    +
      +
    • 支持多色图标了,不再受单色限制。
    • +
    • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
    • +
    • 兼容性较差,支持 IE9+,及现代浏览器。
    • +
    • 浏览器渲染 SVG 的性能一般,还不如 png。
    • +
    +

    使用步骤如下:

    +

    第一步:引入项目下面生成的 symbol 代码:

    +
    <script src="./iconfont.js"></script>
    +
    +

    第二步:加入通用 CSS 代码(引入一次就行):

    +
    <style>
    +.icon {
    +  width: 1em;
    +  height: 1em;
    +  vertical-align: -0.15em;
    +  fill: currentColor;
    +  overflow: hidden;
    +}
    +</style>
    +
    +

    第三步:挑选相应图标并获取类名,应用于页面:

    +
    <svg class="icon" aria-hidden="true">
    +  <use xlink:href="#icon-xxx"></use>
    +</svg>
    +
    +
    +
    + +
    +
    + + + diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.css b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.css new file mode 100644 index 000000000..d76bed697 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.css @@ -0,0 +1,457 @@ +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1605236775724'); /* IE9 */ + src: url('iconfont.eot?t=1605236775724#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1605236775724') format('woff'), + url('iconfont.ttf?t=1605236775724') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1605236775724#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.luckysheet-iconfont-lianjie:before { + content: "\e7f8"; +} + +.luckysheet-iconfont-dayinquyu:before { + content: "\e7f5"; +} + +.luckysheet-iconfont-dayinyemianpeizhi:before { + content: "\e7f6"; +} + +.luckysheet-iconfont-dayinbiaoti:before { + content: "\e7f7"; +} + +.luckysheet-iconfont-fenyeyulan:before { + content: "\e7f2"; +} + +.luckysheet-iconfont-putong:before { + content: "\e7f3"; +} + +.luckysheet-iconfont-yemianbuju:before { + content: "\e7f4"; +} + +.luckysheet-iconfont-biaogesuoding:before { + content: "\e7ee"; +} + +.luckysheet-iconfont-zhuandao1:before { + content: "\e7f1"; +} + +.luckysheet-iconfont-youjiantou:before { + content: "\e7ed"; +} + +.luckysheet-iconfont-caidan2:before { + content: "\e7ef"; +} + +.luckysheet-iconfont-tihuan:before { + content: "\e7f0"; +} + +.luckysheet-iconfont-dongjie1:before { + content: "\e7e1"; +} + +.luckysheet-iconfont-jian1:before { + content: "\e7e2"; +} + +.luckysheet-iconfont-jia1:before { + content: "\e7e3"; +} + +.luckysheet-iconfont-yichu1:before { + content: "\e7e4"; +} + +.luckysheet-iconfont-shengxu1:before { + content: "\e7e5"; +} + +.luckysheet-iconfont-neikuangxian:before { + content: "\e7e6"; +} + +.luckysheet-iconfont-qingchushaixuan:before { + content: "\e7e7"; +} + +.luckysheet-iconfont-wenbenxiangshang:before { + content: "\e7e8"; +} + +.luckysheet-iconfont-jiangxu1:before { + content: "\e7e9"; +} + +.luckysheet-iconfont-neikuanghengxian:before { + content: "\e7ea"; +} + +.luckysheet-iconfont-neikuangshuxian:before { + content: "\e7eb"; +} + +.luckysheet-iconfont-zidingyipaixu:before { + content: "\e7ec"; +} + +.luckysheet-iconfont-logo2:before { + content: "\e7df"; +} + +.luckysheet-iconfont-logo:before { + content: "\e7e0"; +} + +.luckysheet-iconfont-wenbenqingxie1:before { + content: "\e7de"; +} + +.luckysheet-iconfont-jiacu:before { + content: "\e7d9"; +} + +.luckysheet-iconfont-sousuo:before { + content: "\e78a"; +} + +.luckysheet-iconfont-guanbi:before { + content: "\e78b"; +} + +.luckysheet-iconfont-xiayige:before { + content: "\e78c"; +} + +.luckysheet-iconfont-xiala:before { + content: "\e78d"; +} + +.luckysheet-iconfont-wenbenyanse:before { + content: "\e78e"; +} + +.luckysheet-iconfont-shangyige:before { + content: "\e78f"; +} + +.luckysheet-iconfont-shujutoushi:before { + content: "\e790"; +} + +.luckysheet-iconfont-tianchong:before { + content: "\e791"; +} + +.luckysheet-iconfont-zengjiaxiaoshuwei:before { + content: "\e792"; +} + +.luckysheet-iconfont-bianji2:before { + content: "\e793"; +} + +.luckysheet-iconfont-jieping:before { + content: "\e794"; +} + +.luckysheet-iconfont-jianxiaoxiaoshuwei:before { + content: "\e796"; +} + +.luckysheet-iconfont-caidan:before { + content: "\e797"; +} + +.luckysheet-iconfont-shujuku:before { + content: "\e798"; +} + +.luckysheet-iconfont-wubiankuang:before { + content: "\e799"; +} + +.luckysheet-iconfont-bianji:before { + content: "\e79a"; +} + +.luckysheet-iconfont-qingchuyangshi:before { + content: "\e79b"; +} + +.luckysheet-iconfont-shanchu:before { + content: "\e79c"; +} + +.luckysheet-iconfont-wenbenjuzhongduiqi:before { + content: "\e79d"; +} + +.luckysheet-iconfont-dayin:before { + content: "\e79e"; +} + +.luckysheet-iconfont-wenbenfenge:before { + content: "\e79f"; +} + +.luckysheet-iconfont-hanshu:before { + content: "\e7a0"; +} + +.luckysheet-iconfont-jiangxu:before { + content: "\e7a1"; +} + +.luckysheet-iconfont-dingbuduiqi:before { + content: "\e7a2"; +} + +.luckysheet-iconfont-tupian:before { + content: "\e7a3"; +} + +.luckysheet-iconfont-xiangxia90:before { + content: "\e7a4"; +} + +.luckysheet-iconfont-shupaiwenzi:before { + content: "\e7a5"; +} + +.luckysheet-iconfont-quanjiabiankuang:before { + content: "\e7a6"; +} + +.luckysheet-iconfont-shengxu:before { + content: "\e7a7"; +} + +.luckysheet-iconfont-caijian:before { + content: "\e7a8"; +} + +.luckysheet-iconfont-jine:before { + content: "\e7a9"; +} + +.luckysheet-iconfont-caidan1:before { + content: "\e7aa"; +} + +.luckysheet-iconfont-quxiaohebing:before { + content: "\e7ab"; +} + +.luckysheet-iconfont-wenbenxiahuaxian:before { + content: "\e7ac"; +} + +.luckysheet-iconfont-shangbiankuang:before { + content: "\e7ad"; +} + +.luckysheet-iconfont-dingwei:before { + content: "\e7ae"; +} + +.luckysheet-iconfont-sizhoujiabiankuang:before { + content: "\e7af"; +} + +.luckysheet-iconfont-cebianlanshouqi:before { + content: "\e7b0"; +} + +.luckysheet-iconfont-hebing:before { + content: "\e7b1"; +} + +.luckysheet-iconfont-xiangshangqingxie:before { + content: "\e7b2"; +} + +.luckysheet-iconfont-shuipingduiqi:before { + content: "\e7b3"; +} + +.luckysheet-iconfont-wenbenshanchuxian:before { + content: "\e7b4"; +} + +.luckysheet-iconfont-wenbenyouduiqi:before { + content: "\e7b5"; +} + +.luckysheet-iconfont-qianjin:before { + content: "\e7b6"; +} + +.luckysheet-iconfont-tubiao:before { + content: "\e7b7"; +} + +.luckysheet-iconfont-youbiankuang:before { + content: "\e7b8"; +} + +.luckysheet-iconfont-baifenhao:before { + content: "\e7b9"; +} + +.luckysheet-iconfont-geshishua:before { + content: "\e7ba"; +} + +.luckysheet-iconfont-baocun:before { + content: "\e7bb"; +} + +.luckysheet-iconfont-shujuyanzheng:before { + content: "\e7bc"; +} + +.luckysheet-iconfont-jieduan:before { + content: "\e7bd"; +} + +.luckysheet-iconfont-geshitiaojian:before { + content: "\e7be"; +} + +.luckysheet-iconfont-zidonghuanhang:before { + content: "\e7bf"; +} + +.luckysheet-iconfont-cebianlanzhankai:before { + content: "\e7c0"; +} + +.luckysheet-iconfont-shaixuan2:before { + content: "\e7c1"; +} + +.luckysheet-iconfont-xiangxiaqingxie:before { + content: "\e7c2"; +} + +.luckysheet-iconfont-yichu:before { + content: "\e7c3"; +} + +.luckysheet-iconfont-chuizhihebing:before { + content: "\e7c4"; +} + +.luckysheet-iconfont-wenbenfensanduiqi:before { + content: "\e7c5"; +} + +.luckysheet-iconfont-zuobiankuang:before { + content: "\e7c6"; +} + +.luckysheet-iconfont-fenyechakan:before { + content: "\e7c7"; +} + +.luckysheet-iconfont-yunhang:before { + content: "\e7c8"; +} + +.luckysheet-iconfont-lie:before { + content: "\e7c9"; +} + +.luckysheet-iconfont-quanping:before { + content: "\e7ca"; +} + +.luckysheet-iconfont-shaixuan:before { + content: "\e7cb"; +} + +.luckysheet-iconfont-gengxin:before { + content: "\e7cc"; +} + +.luckysheet-iconfont-qingchu:before { + content: "\e7cd"; +} + +.luckysheet-iconfont-hang:before { + content: "\e7ce"; +} + +.luckysheet-iconfont-zhushi:before { + content: "\e7cf"; +} + +.luckysheet-iconfont-jian:before { + content: "\e7d0"; +} + +.luckysheet-iconfont-jisuan:before { + content: "\e7d1"; +} + +.luckysheet-iconfont-jia:before { + content: "\e7d2"; +} + +.luckysheet-iconfont-dibuduiqi:before { + content: "\e7d3"; +} + +.luckysheet-iconfont-xiangshang90:before { + content: "\e7d4"; +} + +.luckysheet-iconfont-wuxuanzhuang:before { + content: "\e7d5"; +} + +.luckysheet-iconfont-xianshiyincangwangge:before { + content: "\e7d6"; +} + +.luckysheet-iconfont-dongjie:before { + content: "\e7d7"; +} + +.luckysheet-iconfont-wenbenzuoduiqi:before { + content: "\e7d8"; +} + +.luckysheet-iconfont-houtui:before { + content: "\e7da"; +} + +.luckysheet-iconfont-shuipinghebing:before { + content: "\e7db"; +} + +.luckysheet-iconfont-xiabiankuang:before { + content: "\e7dc"; +} + +.luckysheet-iconfont-shezhi:before { + content: "\e7dd"; +} + diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.eot b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.eot new file mode 100644 index 000000000..7cc74131a Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.eot differ diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.js b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.js new file mode 100644 index 000000000..803f0f592 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +!function(h){var l,a,v,i,t,z,o='',M=(M=document.getElementsByTagName("script"))[M.length-1].getAttribute("data-injectcss");if(M&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}function e(){t||(t=!0,v())}l=function(){var h,l,a,v;(v=document.createElement("div")).innerHTML=o,o=null,(a=v.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",h=a,(l=document.body).firstChild?(v=h,(a=l.firstChild).parentNode.insertBefore(v,a)):l.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),l()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(v=l,i=h.document,t=!1,(z=function(){try{i.documentElement.doScroll("left")}catch(h){return void setTimeout(z,50)}e()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}(window); \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.json b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.json new file mode 100644 index 000000000..3d547f726 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.json @@ -0,0 +1,779 @@ +{ + "id": "1990368", + "name": "lucksheet", + "font_family": "iconfont", + "css_prefix_text": "luckysheet-iconfont-", + "description": "", + "glyphs": [ + { + "icon_id": "17878780", + "name": "链接", + "font_class": "lianjie", + "unicode": "e7f8", + "unicode_decimal": 59384 + }, + { + "icon_id": "17612330", + "name": "打印区域", + "font_class": "dayinquyu", + "unicode": "e7f5", + "unicode_decimal": 59381 + }, + { + "icon_id": "17612331", + "name": "打印页面配置", + "font_class": "dayinyemianpeizhi", + "unicode": "e7f6", + "unicode_decimal": 59382 + }, + { + "icon_id": "17612332", + "name": "打印标题", + "font_class": "dayinbiaoti", + "unicode": "e7f7", + "unicode_decimal": 59383 + }, + { + "icon_id": "17600443", + "name": "分页预览", + "font_class": "fenyeyulan", + "unicode": "e7f2", + "unicode_decimal": 59378 + }, + { + "icon_id": "17600444", + "name": "普通", + "font_class": "putong", + "unicode": "e7f3", + "unicode_decimal": 59379 + }, + { + "icon_id": "17600445", + "name": "页面布局", + "font_class": "yemianbuju", + "unicode": "e7f4", + "unicode_decimal": 59380 + }, + { + "icon_id": "17597312", + "name": "表格锁定", + "font_class": "biaogesuoding", + "unicode": "e7ee", + "unicode_decimal": 59374 + }, + { + "icon_id": "17444514", + "name": "转到", + "font_class": "zhuandao1", + "unicode": "e7f1", + "unicode_decimal": 59377 + }, + { + "icon_id": "17444503", + "name": "右箭头", + "font_class": "youjiantou", + "unicode": "e7ed", + "unicode_decimal": 59373 + }, + { + "icon_id": "17444507", + "name": "菜单", + "font_class": "caidan2", + "unicode": "e7ef", + "unicode_decimal": 59375 + }, + { + "icon_id": "17444508", + "name": "替换", + "font_class": "tihuan", + "unicode": "e7f0", + "unicode_decimal": 59376 + }, + { + "icon_id": "17392794", + "name": "冻结", + "font_class": "dongjie1", + "unicode": "e7e1", + "unicode_decimal": 59361 + }, + { + "icon_id": "17392795", + "name": "剪", + "font_class": "jian1", + "unicode": "e7e2", + "unicode_decimal": 59362 + }, + { + "icon_id": "17392796", + "name": "加", + "font_class": "jia1", + "unicode": "e7e3", + "unicode_decimal": 59363 + }, + { + "icon_id": "17392797", + "name": "溢出", + "font_class": "yichu1", + "unicode": "e7e4", + "unicode_decimal": 59364 + }, + { + "icon_id": "17392798", + "name": "升序", + "font_class": "shengxu1", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "17392799", + "name": "内框线", + "font_class": "neikuangxian", + "unicode": "e7e6", + "unicode_decimal": 59366 + }, + { + "icon_id": "17392800", + "name": "清除筛选", + "font_class": "qingchushaixuan", + "unicode": "e7e7", + "unicode_decimal": 59367 + }, + { + "icon_id": "17392801", + "name": "文本向上", + "font_class": "wenbenxiangshang", + "unicode": "e7e8", + "unicode_decimal": 59368 + }, + { + "icon_id": "17392802", + "name": "降序", + "font_class": "jiangxu1", + "unicode": "e7e9", + "unicode_decimal": 59369 + }, + { + "icon_id": "17392803", + "name": "内框横线", + "font_class": "neikuanghengxian", + "unicode": "e7ea", + "unicode_decimal": 59370 + }, + { + "icon_id": "17392804", + "name": "内框竖线", + "font_class": "neikuangshuxian", + "unicode": "e7eb", + "unicode_decimal": 59371 + }, + { + "icon_id": "17392805", + "name": "自定义排序", + "font_class": "zidingyipaixu", + "unicode": "e7ec", + "unicode_decimal": 59372 + }, + { + "icon_id": "16746498", + "name": "logo2", + "font_class": "logo2", + "unicode": "e7df", + "unicode_decimal": 59359 + }, + { + "icon_id": "16746532", + "name": "logo", + "font_class": "logo", + "unicode": "e7e0", + "unicode_decimal": 59360 + }, + { + "icon_id": "16730159", + "name": "文本倾斜", + "font_class": "wenbenqingxie1", + "unicode": "e7de", + "unicode_decimal": 59358 + }, + { + "icon_id": "16728412", + "name": "加粗", + "font_class": "jiacu", + "unicode": "e7d9", + "unicode_decimal": 59353 + }, + { + "icon_id": "16728080", + "name": "搜索", + "font_class": "sousuo", + "unicode": "e78a", + "unicode_decimal": 59274 + }, + { + "icon_id": "16728081", + "name": "关闭", + "font_class": "guanbi", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "16728082", + "name": "下一个", + "font_class": "xiayige", + "unicode": "e78c", + "unicode_decimal": 59276 + }, + { + "icon_id": "16728083", + "name": "下拉", + "font_class": "xiala", + "unicode": "e78d", + "unicode_decimal": 59277 + }, + { + "icon_id": "16728084", + "name": "文本颜色", + "font_class": "wenbenyanse", + "unicode": "e78e", + "unicode_decimal": 59278 + }, + { + "icon_id": "16728085", + "name": "上一个", + "font_class": "shangyige", + "unicode": "e78f", + "unicode_decimal": 59279 + }, + { + "icon_id": "16728086", + "name": "数据透视", + "font_class": "shujutoushi", + "unicode": "e790", + "unicode_decimal": 59280 + }, + { + "icon_id": "16728087", + "name": "填充", + "font_class": "tianchong", + "unicode": "e791", + "unicode_decimal": 59281 + }, + { + "icon_id": "16728088", + "name": "增加小数位", + "font_class": "zengjiaxiaoshuwei", + "unicode": "e792", + "unicode_decimal": 59282 + }, + { + "icon_id": "16728089", + "name": "编辑2", + "font_class": "bianji2", + "unicode": "e793", + "unicode_decimal": 59283 + }, + { + "icon_id": "16728090", + "name": "截屏", + "font_class": "jieping", + "unicode": "e794", + "unicode_decimal": 59284 + }, + { + "icon_id": "16728092", + "name": "减小小数位", + "font_class": "jianxiaoxiaoshuwei", + "unicode": "e796", + "unicode_decimal": 59286 + }, + { + "icon_id": "16728093", + "name": "菜单", + "font_class": "caidan", + "unicode": "e797", + "unicode_decimal": 59287 + }, + { + "icon_id": "16728094", + "name": "数据库", + "font_class": "shujuku", + "unicode": "e798", + "unicode_decimal": 59288 + }, + { + "icon_id": "16728095", + "name": "无边框", + "font_class": "wubiankuang", + "unicode": "e799", + "unicode_decimal": 59289 + }, + { + "icon_id": "16728096", + "name": "编辑", + "font_class": "bianji", + "unicode": "e79a", + "unicode_decimal": 59290 + }, + { + "icon_id": "16728097", + "name": "清除样式", + "font_class": "qingchuyangshi", + "unicode": "e79b", + "unicode_decimal": 59291 + }, + { + "icon_id": "16728099", + "name": "删除", + "font_class": "shanchu", + "unicode": "e79c", + "unicode_decimal": 59292 + }, + { + "icon_id": "16728100", + "name": "文本居中对齐", + "font_class": "wenbenjuzhongduiqi", + "unicode": "e79d", + "unicode_decimal": 59293 + }, + { + "icon_id": "16728101", + "name": "打印", + "font_class": "dayin", + "unicode": "e79e", + "unicode_decimal": 59294 + }, + { + "icon_id": "16728102", + "name": "文本分割", + "font_class": "wenbenfenge", + "unicode": "e79f", + "unicode_decimal": 59295 + }, + { + "icon_id": "16728103", + "name": "函数‘", + "font_class": "hanshu", + "unicode": "e7a0", + "unicode_decimal": 59296 + }, + { + "icon_id": "16728104", + "name": "降序", + "font_class": "jiangxu", + "unicode": "e7a1", + "unicode_decimal": 59297 + }, + { + "icon_id": "16728105", + "name": "顶部对齐", + "font_class": "dingbuduiqi", + "unicode": "e7a2", + "unicode_decimal": 59298 + }, + { + "icon_id": "16728106", + "name": "图片", + "font_class": "tupian", + "unicode": "e7a3", + "unicode_decimal": 59299 + }, + { + "icon_id": "16728107", + "name": "向下90", + "font_class": "xiangxia90", + "unicode": "e7a4", + "unicode_decimal": 59300 + }, + { + "icon_id": "16728108", + "name": "竖排文字", + "font_class": "shupaiwenzi", + "unicode": "e7a5", + "unicode_decimal": 59301 + }, + { + "icon_id": "16728109", + "name": "全加边框", + "font_class": "quanjiabiankuang", + "unicode": "e7a6", + "unicode_decimal": 59302 + }, + { + "icon_id": "16728110", + "name": "升序", + "font_class": "shengxu", + "unicode": "e7a7", + "unicode_decimal": 59303 + }, + { + "icon_id": "16728111", + "name": "裁剪", + "font_class": "caijian", + "unicode": "e7a8", + "unicode_decimal": 59304 + }, + { + "icon_id": "16728112", + "name": "金额", + "font_class": "jine", + "unicode": "e7a9", + "unicode_decimal": 59305 + }, + { + "icon_id": "16728113", + "name": "菜单1", + "font_class": "caidan1", + "unicode": "e7aa", + "unicode_decimal": 59306 + }, + { + "icon_id": "16728114", + "name": "取消合并", + "font_class": "quxiaohebing", + "unicode": "e7ab", + "unicode_decimal": 59307 + }, + { + "icon_id": "16728115", + "name": "文本下划线", + "font_class": "wenbenxiahuaxian", + "unicode": "e7ac", + "unicode_decimal": 59308 + }, + { + "icon_id": "16728116", + "name": "上边框", + "font_class": "shangbiankuang", + "unicode": "e7ad", + "unicode_decimal": 59309 + }, + { + "icon_id": "16728117", + "name": "定位", + "font_class": "dingwei", + "unicode": "e7ae", + "unicode_decimal": 59310 + }, + { + "icon_id": "16728118", + "name": "四周加边框", + "font_class": "sizhoujiabiankuang", + "unicode": "e7af", + "unicode_decimal": 59311 + }, + { + "icon_id": "16728119", + "name": "侧边栏收起", + "font_class": "cebianlanshouqi", + "unicode": "e7b0", + "unicode_decimal": 59312 + }, + { + "icon_id": "16728120", + "name": "合并", + "font_class": "hebing", + "unicode": "e7b1", + "unicode_decimal": 59313 + }, + { + "icon_id": "16728121", + "name": "向上倾斜", + "font_class": "xiangshangqingxie", + "unicode": "e7b2", + "unicode_decimal": 59314 + }, + { + "icon_id": "16728122", + "name": "水平对齐", + "font_class": "shuipingduiqi", + "unicode": "e7b3", + "unicode_decimal": 59315 + }, + { + "icon_id": "16728123", + "name": "文本删除线", + "font_class": "wenbenshanchuxian", + "unicode": "e7b4", + "unicode_decimal": 59316 + }, + { + "icon_id": "16728124", + "name": "文本右对齐", + "font_class": "wenbenyouduiqi", + "unicode": "e7b5", + "unicode_decimal": 59317 + }, + { + "icon_id": "16728125", + "name": "前进", + "font_class": "qianjin", + "unicode": "e7b6", + "unicode_decimal": 59318 + }, + { + "icon_id": "16728126", + "name": "图表", + "font_class": "tubiao", + "unicode": "e7b7", + "unicode_decimal": 59319 + }, + { + "icon_id": "16728127", + "name": "右边框", + "font_class": "youbiankuang", + "unicode": "e7b8", + "unicode_decimal": 59320 + }, + { + "icon_id": "16728128", + "name": "百分号", + "font_class": "baifenhao", + "unicode": "e7b9", + "unicode_decimal": 59321 + }, + { + "icon_id": "16728129", + "name": "格式刷", + "font_class": "geshishua", + "unicode": "e7ba", + "unicode_decimal": 59322 + }, + { + "icon_id": "16728130", + "name": "保存", + "font_class": "baocun", + "unicode": "e7bb", + "unicode_decimal": 59323 + }, + { + "icon_id": "16728131", + "name": "数据验证", + "font_class": "shujuyanzheng", + "unicode": "e7bc", + "unicode_decimal": 59324 + }, + { + "icon_id": "16728132", + "name": "截断", + "font_class": "jieduan", + "unicode": "e7bd", + "unicode_decimal": 59325 + }, + { + "icon_id": "16728133", + "name": "格式条件", + "font_class": "geshitiaojian", + "unicode": "e7be", + "unicode_decimal": 59326 + }, + { + "icon_id": "16728134", + "name": "自动换行", + "font_class": "zidonghuanhang", + "unicode": "e7bf", + "unicode_decimal": 59327 + }, + { + "icon_id": "16728135", + "name": "侧边栏展开", + "font_class": "cebianlanzhankai", + "unicode": "e7c0", + "unicode_decimal": 59328 + }, + { + "icon_id": "16728136", + "name": "筛选2", + "font_class": "shaixuan2", + "unicode": "e7c1", + "unicode_decimal": 59329 + }, + { + "icon_id": "16728137", + "name": "向下倾斜", + "font_class": "xiangxiaqingxie", + "unicode": "e7c2", + "unicode_decimal": 59330 + }, + { + "icon_id": "16728138", + "name": "溢出", + "font_class": "yichu", + "unicode": "e7c3", + "unicode_decimal": 59331 + }, + { + "icon_id": "16728139", + "name": "垂直合并", + "font_class": "chuizhihebing", + "unicode": "e7c4", + "unicode_decimal": 59332 + }, + { + "icon_id": "16728140", + "name": "文本分散对齐", + "font_class": "wenbenfensanduiqi", + "unicode": "e7c5", + "unicode_decimal": 59333 + }, + { + "icon_id": "16728141", + "name": "左边框", + "font_class": "zuobiankuang", + "unicode": "e7c6", + "unicode_decimal": 59334 + }, + { + "icon_id": "16728142", + "name": "分页查看", + "font_class": "fenyechakan", + "unicode": "e7c7", + "unicode_decimal": 59335 + }, + { + "icon_id": "16728143", + "name": "运行", + "font_class": "yunhang", + "unicode": "e7c8", + "unicode_decimal": 59336 + }, + { + "icon_id": "16728144", + "name": "列", + "font_class": "lie", + "unicode": "e7c9", + "unicode_decimal": 59337 + }, + { + "icon_id": "16728145", + "name": "全屏", + "font_class": "quanping", + "unicode": "e7ca", + "unicode_decimal": 59338 + }, + { + "icon_id": "16728146", + "name": "筛选", + "font_class": "shaixuan", + "unicode": "e7cb", + "unicode_decimal": 59339 + }, + { + "icon_id": "16728147", + "name": "更新", + "font_class": "gengxin", + "unicode": "e7cc", + "unicode_decimal": 59340 + }, + { + "icon_id": "16728148", + "name": "清除", + "font_class": "qingchu", + "unicode": "e7cd", + "unicode_decimal": 59341 + }, + { + "icon_id": "16728149", + "name": "行", + "font_class": "hang", + "unicode": "e7ce", + "unicode_decimal": 59342 + }, + { + "icon_id": "16728150", + "name": "注释", + "font_class": "zhushi", + "unicode": "e7cf", + "unicode_decimal": 59343 + }, + { + "icon_id": "16728151", + "name": "剪", + "font_class": "jian", + "unicode": "e7d0", + "unicode_decimal": 59344 + }, + { + "icon_id": "16728152", + "name": "计算", + "font_class": "jisuan", + "unicode": "e7d1", + "unicode_decimal": 59345 + }, + { + "icon_id": "16728153", + "name": "加", + "font_class": "jia", + "unicode": "e7d2", + "unicode_decimal": 59346 + }, + { + "icon_id": "16728154", + "name": "底部对齐", + "font_class": "dibuduiqi", + "unicode": "e7d3", + "unicode_decimal": 59347 + }, + { + "icon_id": "16728155", + "name": "向上90", + "font_class": "xiangshang90", + "unicode": "e7d4", + "unicode_decimal": 59348 + }, + { + "icon_id": "16728156", + "name": "无选装", + "font_class": "wuxuanzhuang", + "unicode": "e7d5", + "unicode_decimal": 59349 + }, + { + "icon_id": "16728157", + "name": "显示隐藏网格", + "font_class": "xianshiyincangwangge", + "unicode": "e7d6", + "unicode_decimal": 59350 + }, + { + "icon_id": "16728158", + "name": "冻结", + "font_class": "dongjie", + "unicode": "e7d7", + "unicode_decimal": 59351 + }, + { + "icon_id": "16728159", + "name": "文本左对齐", + "font_class": "wenbenzuoduiqi", + "unicode": "e7d8", + "unicode_decimal": 59352 + }, + { + "icon_id": "16728161", + "name": "后退", + "font_class": "houtui", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "16728162", + "name": "水平合并", + "font_class": "shuipinghebing", + "unicode": "e7db", + "unicode_decimal": 59355 + }, + { + "icon_id": "16728163", + "name": "下边框", + "font_class": "xiabiankuang", + "unicode": "e7dc", + "unicode_decimal": 59356 + }, + { + "icon_id": "16728164", + "name": "设置", + "font_class": "shezhi", + "unicode": "e7dd", + "unicode_decimal": 59357 + } + ] +} diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.svg b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.svg new file mode 100644 index 000000000..3964a24c6 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.svg @@ -0,0 +1,356 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.ttf b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.ttf new file mode 100644 index 000000000..aadcc0902 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.ttf differ diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.woff b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.woff new file mode 100644 index 000000000..cebb184a1 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.woff differ diff --git a/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.woff2 b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.woff2 new file mode 100644 index 000000000..6a1edbcb8 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/assets/iconfont/iconfont.woff2 differ diff --git a/resources/assets/statics/public/js/luckysheet/css/EwaAntH.gif b/resources/assets/statics/public/js/luckysheet/css/EwaAntH.gif new file mode 100644 index 000000000..d593cf072 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/EwaAntH.gif differ diff --git a/resources/assets/statics/public/js/luckysheet/css/EwaAntV.gif b/resources/assets/statics/public/js/luckysheet/css/EwaAntV.gif new file mode 100644 index 000000000..44d324095 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/EwaAntV.gif differ diff --git a/resources/assets/statics/public/js/luckysheet/css/arrow-down.png b/resources/assets/statics/public/js/luckysheet/css/arrow-down.png new file mode 100644 index 000000000..89a612f6e Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/arrow-down.png differ diff --git a/resources/assets/statics/public/js/luckysheet/css/loading.gif b/resources/assets/statics/public/js/luckysheet/css/loading.gif new file mode 100644 index 000000000..7980d81e8 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/loading.gif differ diff --git a/resources/assets/statics/public/js/luckysheet/css/luckysheet.css b/resources/assets/statics/public/js/luckysheet/css/luckysheet.css new file mode 100644 index 000000000..33349a9f2 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/css/luckysheet.css @@ -0,0 +1 @@ +.luckysheet-icon-img-container.iconfont,.luckysheet-submenu-arrow .iconfont{font-size:24px}.luckysheet-toolbar-combo-button .luckysheet-iconfont-xiayige,.luckysheet-toolbar-menu-button .luckysheet-iconfont-xiayige{font-size:12px;top:-8px;left:-3px}.luckysheet-toolbar-select .luckysheet-iconfont-xiayige{margin-right:4px}#luckysheet-icon-morebtn{position:absolute;right:15px;transform:translate(0,-50%);top:50%}.toolbar .luckysheet-icon-border-all,.toolbar .luckysheet-icon-cell-color,.toolbar .luckysheet-icon-text-color,.toolbar .luckysheet-icon-textwrap,.toolbar .luckysheet-icon-valign{margin-right:-3px}.toolbar .luckysheet-freezen-btn-horizontal,.toolbar .luckysheet-icon-align,.toolbar .luckysheet-icon-function,.toolbar .luckysheet-icon-merge-button,.toolbar .luckysheet-icon-rotation{margin-right:-4px}#luckysheet-icon-morebtn{padding:2px 13px 0 5px}#luckysheet-icon-morebtn .iconfont{top:-9px}.lucky-button-custom{cursor:pointer;display:flex;align-items:center;justify-content:center}.lucky-button-custom:hover{background-color:#e1e4e8}#luckysheet-icon-morebtn-div{border:1px solid #d4d4d4}.luckysheet-sheets-add .iconfont,.luckysheet-sheets-m .iconfont{font-size:21px}#luckysheet-sheets-leftscroll,#luckysheet-sheets-rightscroll{padding:6px 10px}input.luckysheet-mousedown-cancel{border:1px solid #a1a1a1}input.luckysheet-mousedown-cancel:focus{border:1px solid #0188fb;outline:0}.luckysheet-cellFormat-config{display:none}.luckysheet-cellFormat-config .luckysheet-modal-dialog-content{position:relative;height:550px;width:600px}.luckysheet-cellFormat-menu-c{position:absolute;width:100%;height:30px;border-right:1px solid #fff;border-bottom:1px solid #d4d4d4;font-size:12px}.luckysheet-cellFormat-menu{position:relative;display:inline-block;height:30px;width:80px;text-align:center;line-height:30px;border:1px solid #d4d4d4;border-bottom:none;background:#f0f0f0;cursor:pointer}.luckysheet-cellFormat-menu:hover{background:#e7e7e7}.luckysheet-cellFormat-menu-active{background:#fff;cursor:default}.luckysheet-cellFormat-menu-active:hover{background:#fff}.luckysheet-cellFormat-content{position:absolute;top:30px;bottom:0;width:100%;border:1px solid #d4d4d4;border-top:none}.luckysheet-cellFormat-protection{position:relative;margin-top:30px;margin-left:40px}.luckysheet-cellFormat-protection span{font-size:12px;color:#ff2929;padding-left:12px}::-webkit-scrollbar-track{background-color:transparent}.luckysheet-noselected-text{-moz-user-select:-moz-test;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.chart-moveable{cursor:move}.luckysheet{position:absolute;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,"PingFang SC","Hiragino Sans GB","Heiti SC","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;border:1px solid #e5e5e5;background:#fff}.luckysheet *{box-sizing:initial;outline:0}.luckysheet-work-area{height:90px;width:100%;position:relative}.luckysheet_info_detail{position:relative;left:0;top:0;margin:0;padding:0 17px;height:56px;display:flex;align-items:center;background:#fff;box-shadow:0 -1px 0 0 #e6e7e8;border-bottom:1px solid #d4d4d4}.luckysheet_info_detail .sheet-name{margin:auto}.luckysheet_info_detail div.luckysheet_info_detail_back{font-size:14px;padding:0 8px;margin-right:18px;border-radius:3px;cursor:pointer}.luckysheet_info_detail div.luckysheet_info_detail_back:hover{background:#eee}.luckysheet_info_detail .luckysheet_info_detail_input{border:1px solid transparent;border-radius:3px!important;color:#000;font-size:16px;height:26px;line-height:22px;margin:0;min-width:1px;padding:2px 7px;visibility:hidden}.luckysheet_info_detail .luckysheet_info_detail_input:hover{border:1px solid #e5e5e5}.luckysheet_info_detail .luckysheet_info_detail_input:focus{-webkit-appearance:none;-moz-appearance:none;border:1px solid #0188fb!important;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);color:#000;outline:0}.luckysheet_info_detail_update{color:#cbcbcb;font-size:12px;margin-left:15px}.luckysheet_info_detail_user{font-size:12px;cursor:pointer;margin-left:10px}#luckysheet_info_detail_user_img{vertical-align:middle;height:20px;line-height:20px;border-radius:50%;object-fit:cover}.luckysheet_info_detail_save{color:#828282;font-size:12px;margin:0 5px}.luckysheet-share-logo{height:32px;width:152px;z-index:1;background-image:url(data:image/png;base64,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)}.luckysheet-wa-editor{height:32px;background:#fafafc;position:relative;padding:5px 0 3px 15px;border-bottom:1px solid #d4d4d4;white-space:nowrap;transition:all .2s}.luckysheet-toolbar-left-theme{width:15px;position:absolute;left:0;top:1px;bottom:1px}.luckysheet-inline-block{position:relative;display:-moz-inline-box;display:inline-block}.luckysheet-toolbar-separator{line-height:normal;list-style:none;outline:0;overflow:hidden;padding:0;text-decoration:none;width:0;height:20px;vertical-align:top;border-left:1px solid #e0e0e0;margin:5px 1px}.luckysheet-toolbar-combo-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:0;border-color:transparent;border-style:solid;border-width:1px;outline:0;padding:0;color:#333;list-style:none;font-size:11px;font-weight:700;text-decoration:none;cursor:default;height:26px;line-height:26px;vertical-align:inherit;margin:0 1px}.luckysheet-toolbar-combo-button:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(to bottom,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(to bottom,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(to bottom,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(to bottom,#f8f8f8,#f1f1f1);background-image:linear-gradient(to bottom,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important;color:#222;border-width:1px;border-color:transparent!important;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;cursor:pointer}.luckysheet-toolbar-combo-button:hover .luckysheet-toolbar-combo-button-input{border-right-color:rgba(0,0,0,.12)}.luckysheet-toolbar-combo-button-open{color:#222;border-width:1px;border-color:transparent!important;background-color:rgba(0,0,0,.12);background-image:none;cursor:pointer}.luckysheet-toolbar-combo-button-open .luckysheet-toolbar-combo-button-input{background:0 0;border-right:1px solid transparent!important}.luckysheet-toolbar-combo-button-inner-box,.luckysheet-toolbar-combo-button-outer-box{border:0;vertical-align:top;margin:0;padding:0}.luckysheet-toolbar-zoom-combobox .luckysheet-toolbar-combo-button-caption{width:36px!important}.luckysheet-toolbar-combo-button-caption{padding:0;margin:0 0 0 -3px}.luckysheet-toolbar-combo-button-input{background:0 0;border:1px solid transparent!important;color:#333;font-family:Arial,sans-serif!important;font-size:11px!important;font-weight:700!important;height:20px!important;overflow:hidden!important;color:rgba(0,0,0,.7);height:22px!important;width:22px}.luckysheet-toolbar-combo-button-input:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,.3);background:#fff;outline:0;border:1px solid #0188fb!important}.luckysheet-toolbar-textinput{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid silver;font-size:13px;height:25px;padding:1px 0 1px 8px}.luckysheet-toolbar-combo-button-dropdown{float:right;margin:9px 0 0 0;padding:0 0 0 1px;min-width:7px;opacity:.8;vertical-align:middle;width:5px;height:7px;margin-top:10px}.luckysheet-toolbar-color-menu-button .luckysheet-toolbar-menu-button-caption{top:-2px}.luckysheet-color-menu-button-indicator{position:relative;height:20px}.luckysheet-color-menu-button-indicator .text-color-bar{position:absolute;bottom:0;background-color:#0081f9;height:3px;width:55%;left:30%}.luckysheet-toolbar-button-inner-box .luckysheet-icon,.luckysheet-toolbar-menu-button-caption .luckysheet-color-menu-button-indicator .luckysheet-icon,.luckysheet-toolbar-menu-button-caption .luckysheet-icon{margin-top:0}.luckysheet-toolbar-menu-button-caption{padding:0;margin:0}.luckysheet-toolbar-menu-button-inner-box{margin:0 2px}.luckysheet-toolbar-menu-button-dropdown{float:right;margin:10px 2px 0 3px;padding:0;opacity:.8;vertical-align:middle;width:5px;height:7px;margin-left:4px;margin-right:0;margin-top:10px}.luckysheet-toolbar-button-split-right .luckysheet-toolbar-menu-button-dropdown{padding:0 3px}.luckysheet-toolbar-button-split-left,.luckysheet-toolbar-button-split-left *{border-top-right-radius:0!important;border-bottom-right-radius:0!important;margin-right:0}.luckysheet-toolbar-button-split-right,.luckysheet-toolbar-button-split-right *{border-top-left-radius:0!important;border-bottom-left-radius:0!important;min-width:5px!important;margin-left:0}#luckysheet-icon-merge-menu{margin-right:1px}.luckysheet-toolbar-button,.luckysheet-toolbar-menu-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:0;border:1px solid transparent;outline:0;padding:0;list-style:none;font-size:11px;text-decoration:none;vertical-align:middle;cursor:default;height:26px;line-height:26px;color:#333}.luckysheet-toolbar-button-hover,.luckysheet-toolbar-button:hover,.luckysheet-toolbar-menu-button:hover{border:1px solid transparent;background-color:rgba(0,0,0,.06);background-image:none;box-shadow:none;cursor:pointer}.luckysheet-toolbar-button-split-right.luckysheet-toolbar-menu-button:hover{border-left-color:rgba(0,0,0,.12)!important}.luckysheet-toolbar-button-split-right-hover{border-width:1px;border-color:transparent!important;background-color:rgba(0,0,0,.06);cursor:pointer;box-shadow:none;border-left-color:rgba(0,0,0,.12)!important}.luckysheet-toolbar-button:active,.luckysheet-toolbar-menu-button:active{border:1px solid transparent;background-color:rgba(0,0,0,.12);background-image:none;box-shadow:none;cursor:pointer}.luckysheet-toolbar-button-outer-box,.luckysheet-toolbar-menu-button-outer-box{border:0;vertical-align:top;margin:0;padding:0}.luckysheet-toolbar-button-inner-box,.luckysheet-toolbar-menu-button-inner-box{padding:0 2px;padding:0;text-align:center;height:26px;min-width:26px}.luckysheet-icon{direction:ltr;text-align:center;overflow:hidden;vertical-align:middle;height:26px;width:26px;margin:2px}#luckysheet-icon-fmt-other .luckysheet-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:55px;margin-left:1px;text-align:center}#luckysheet-icon-font-family .luckysheet-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:55px;margin-left:1px;text-align:center}#luckysheet-icon-function .luckysheet-toolbar-menu-button-caption{margin-right:5px;margin-left:-5px}#luckysheet-icon-function .luckysheet-icon{margin-right:0}#luckysheet-icon-pivotTable .luckysheet-toolbar-menu-button-caption{color:#0188fb}#luckysheet-icon-chart .luckysheet-toolbar-menu-button-caption{color:#0188fb}.luckysheet-rightgclick-menu-sub .sp-container{background-color:#fff;border:solid 1px #fff}#luckysheet-icon-cell-color-menu-menuButton .sp-palette-container,#luckysheet-icon-text-color-menu-menuButton .sp-palette-container{margin-bottom:-300px}#luckysheet-icon-cell-color-menu-menuButton .sp-palette,#luckysheet-icon-text-color-menu-menuButton .sp-palette{margin-top:-10px}.luckysheet-wa-calculate{height:28px;background:#fff;position:relative;padding-right:44px;border-bottom:1px solid #d4d4d4}.luckysheet-wa-calculate-help{height:100%;width:99px;border-right:1px solid #d4d4d4}.luckysheet-wa-calculate-help-box{height:100%;width:85px;position:absolute;top:0;left:0}#luckysheet-helpbox{left:0;position:absolute;right:0;top:6px;resize:none;font-family:arial,sans,sans-serif;font-size:14px;line-height:14px;background-color:#fff;padding:2px 5px}.luckysheet-helpbox-cell-input{width:100%;height:100%;margin:0;outline:0;cursor:text;-webkit-user-modify:read-write-plaintext-only;white-space:nowrap;overflow:hidden;-webkit-transform:translateZ(0);background-color:#fff;word-wrap:break-word;-webkit-nbsp-mode:space;-webkit-line-break:after-white-space}.luckysheet-wa-calculate-help-tool{position:absolute;left:85px;text-align:center;height:100%;width:13px;border-left:1px solid transparent;border-right:1px solid transparent}.luckysheet-wa-calculate-help-tool:hover{background:#efefef;cursor:pointer;border-left:1px solid #e5e5e5;border-right:1px solid #e5e5e5}.luckysheet-wa-calculate-size{position:absolute;height:3px;width:100%;left:0;bottom:0;z-index:1000}.luckysheet-wa-calculate-size:hover{background:#5e5e5e;cursor:ns-resize}#luckysheet-wa-functionbox-cancel{left:104px}#luckysheet-wa-functionbox-confirm{left:130px}.luckysheet-wa-functionbox{position:absolute;top:50%;transform:translateY(-50%);text-align:center;left:156px;color:#d6d6d6}.luckysheet-wa-functionbox span{vertical-align:middle;width:30px;height:30px}.luckysheet-wa-functionbox i{font-size:24px}.luckysheet-wa-calculate-active{color:#585858;cursor:pointer}.luckysheet-wa-calculate-active:hover{color:#0188fb}.luckysheet-grid-container{width:100%;position:absolute;top:90px;bottom:0}.luckysheet-stat-area{position:absolute;height:23px;bottom:0;background:#ff00dc;width:100%}.luckysheet-sta-c{height:22px;background-color:#fff;border-top:1px solid #e1e1e1;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.luckysheet-stat-area:hover .luckysheet-sta-c{-moz-user-select:-moz-all;-khtml-user-select:initial;-webkit-user-select:initial;-ms-user-select:initial;user-select:initial}.luckysheet-sta-c .luckysheet-sta-content{height:22px;line-height:22px;text-align:right;white-space:nowrap;overflow:hidden}.luckysheet-sta-c .luckysheet-sta-content span{margin-right:10px}.luckysheet-grid-window{position:absolute;top:0;bottom:23px;left:0;right:0;overflow:hidden;background:#0ff}.luckysheet-sheet-area{position:absolute;right:0;bottom:0;left:0;background-color:#fafafc;color:#444;height:31px;padding:0 0 0 44px;margin:0;-webkit-touch-callout:none;cursor:default;transition:.3s ease all}.luckysheet-sheet-area .luckysheet-sheets-item,.luckysheet-sheet-area>div{display:inline-block}div.luckysheet-sheets-scroll{display:none}div.luckysheet-sheets-add:hover,div.luckysheet-sheets-m:hover{color:#2a2a2a}.docs-sheet-fade{position:absolute;display:block;top:0;width:6px;height:100%;z-index:1}.docs-sheet-fade div{background-color:#d7d7d7;width:2px;float:right;position:relative;height:100%}.docs-sheet-fade-left{left:0}.docs-sheet-fade-right{right:0}.docs-sheet-fade1{opacity:.82}.docs-sheet-fade2{opacity:.62}.docs-sheet-fade3{opacity:.4}.luckysheet-sheet-area div.luckysheet-sheet-container{padding:0 0;margin-left:0;position:relative;max-width:50%;vertical-align:bottom}.luckysheet-sheet-area div.luckysheet-sheet-container div.luckysheet-sheet-container-c{padding:0 0;margin-left:0;overflow:hidden;white-space:nowrap;position:relative;max-width:100%;vertical-align:bottom;display:inline-block}.luckysheet-sheet-container-menu-hide .luckysheet-sheets-item{padding-right:5px!important}.luckysheet-sheet-container-menu-hide .luckysheet-sheets-item-menu{display:none!important}.luckysheet-sheet-area div.luckysheet-sheets-item{padding:2px 6px;height:29px;line-height:29px;background-color:#fafafc;color:#676464;min-width:30px;top:0;position:relative;margin-right:-1px;cursor:pointer;transition:all .1s;font-size:13px;padding:2px 19px 0 5px;box-sizing:border-box;border-left:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.luckysheet-sheet-area div.luckysheet-sheets-item:last-child{margin-right:1px}.luckysheet-sheet-area div.luckysheet-sheets-item:hover{background-color:#efefef;color:#490500}.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-menu{margin-left:2px;display:inline-block;top:-2px;position:relative;color:#a1a1a1;position:absolute;height:100%;width:15px;right:0;text-align:center}.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-menu:hover{color:#2a2a2a;cursor:pointer}.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-name{padding:0 3px}.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-name[contenteditable=true]{border:1px solid #d9d9d9;display:inline-block;height:18px;line-height:18px;min-width:8px;margin:-4px -1px;-moz-user-modify:read-write-plaintext-only;-webkit-user-modify:read-write-plaintext-only;-moz-user-select:text!important;-ms-user-select:text!important;-webkit-user-select:text!important}.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-name[contenteditable=true]:focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3);border:1px solid #4d90fe;outline:0}.luckysheet-sheet-area div.luckysheet-sheets-item-active{height:29px;line-height:29px;background-color:#efefef;border-top-color:#fff;color:#222;cursor:default}.luckysheet-sheet-area div.luckysheet-sheets-item-active:hover{background-color:#ececec;color:#222}.luckysheet-grid-window-1{position:absolute;top:0;right:0;bottom:27px;left:0;min-width:200px;background-color:#fff!important;overflow:hidden;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.luckysheetTableContent{position:absolute;z-index:2;left:0;top:0;width:100%;height:100%;pointer-events:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.luckysheet-grid-window-2{height:100%;width:100%;outline:0;border-collapse:collapse;display:table}.luckysheet-paneswrapper{overflow:hidden;height:1px}.luckysheet-left-top{width:44.5px;height:18.5px;border:solid 0 #dfdfdf;position:relative;padding-top:0;border-width:0 1px 1px 0;margin:-1px 0 0 -1px;padding-left:0;cursor:pointer}.luckysheet-cols-h-c{color:#5e5e5e;overflow:hidden;padding:0;cursor:default;height:19px;outline-style:none;position:relative;-webkit-user-select:none;background:#f3f3f2}.luckysheet-rows-h{position:relative;outline-style:none;color:#5e5e5e;overflow:hidden;padding:0;margin-top:-2px;padding-top:2px;cursor:default;width:38px;background:#f3f3f2}.luckysheet-cols-menu-btn{color:#5e5e5e;cursor:pointer;position:absolute;z-index:12;border:1px solid #5e5e5e;border-radius:1px;top:3px;margin-left:0;display:none;padding:0 2px;font-size:12px;height:12px;opacity:.5}.luckysheet-cols-menu-btn:hover{opacity:1}.luckysheet-cols-h-hover{color:#5e5e5e;cursor:default;position:absolute;z-index:11;border:0 none;bottom:0;height:100%;margin-left:0;display:none;background-color:rgba(194,194,194,.4)}.luckysheet-cols-h-selected{color:#5e5e5e;cursor:default;position:absolute;z-index:10;border-bottom:1px solid #0188fb;bottom:0;height:100%;margin-left:0;display:none;transition:all .1s;background-color:rgba(76,76,76,.1)}.luckysheet-cols-h-cells{margin:0;padding:0;border:none 0;position:relative;height:inherit}.luckysheet-cols-h-cells-c{color:#5e5e5e;cursor:default;width:5000000px;height:inherit}.luckysheet-cols-h-cells-clip{color:#5e5e5e;cursor:default;margin:0;padding:0;border:none 0;position:relative;float:left;direction:ltr;height:inherit;width:2561px;color:#5e5e5e;border-bottom:solid 1px #bbb;position:relative;top:-1px}.luckysheet-cols-h-cell-nosel{position:absolute;cursor:pointer;border:0 solid;border-color:#dfdfdf;display:inline-block;min-height:19px;touch-action:manipulation;border-right-width:1px;height:inherit}.luckysheet-cols-h-cell-sel{direction:ltr;height:inherit;position:absolute;cursor:pointer;border:0 solid;border-color:#bfbfbf;background-color:#e1e1e1;display:inline-block;min-height:19px;color:#0188fb;font-weight:700;touch-action:manipulation;border-right-width:1px}.luckysheet-col-flow-h{float:left;direction:ltr;position:relative;margin:0;padding:0;border:none 0;height:inherit;overflow:hidden}.luckysheet-col-flow-h-sheet{width:inherit;height:inherit;position:relative;float:left;direction:ltr}body:not(.ewa-ipad) .luckysheet-cols-h-cell-nosel:hover,body:not(.ewa-ipad) .luckysheet-cols-h-cell-sel:hover,body:not(.ewa-ipad) .luckysheet-rows-h-cell-nosel:hover,body:not(.ewa-ipad) .luckysheet-rows-h-cell-sel:hover{background-color:#fcc3c3}.luckysheet-cols-h-cell-txt{cursor:pointer;height:inherit;position:relative;text-align:center;overflow:hidden;touch-action:manipulation;font-size:14px;padding-top:2px}.luckysheet-rows-h{position:relative;outline-style:none;color:#5e5e5e;overflow:hidden;padding:0;margin-top:-2px;padding-top:2px;cursor:default;width:45px}.luckysheet-rows-h-hover{position:absolute;z-index:11;border:0 none;right:0;width:100%;margin-top:2px;display:none;background-color:rgba(194,194,194,.4)}.luckysheet-rows-h-selected{position:absolute;z-index:10;border-right:1px solid #0188fb;right:0;width:100%;margin-top:2px;display:none;transition:all .1s;background-color:rgba(76,76,76,.1)}.luckysheet-rows-h-cells{margin:0;padding:0;border:none 0;position:relative;width:100%}.luckysheet-rows-h-cells-c{margin:0;padding:0;border:none 0;position:relative;float:left;direction:ltr;width:100%}.luckysheet-rows-h-cells-clip{cursor:default;color:#5e5e5e;direction:ltr;border-right:solid 1px #bbb;width:inherit;height:inherit;position:relative;left:-1px;height:inherit}.luckysheet-rows-h-cell-nosel{direction:ltr;width:100%;position:absolute;cursor:pointer;border:0 solid;border-color:#dfdfdf;border-bottom-width:1px;touch-action:manipulation}.luckysheet-rows-h-cell-sel{direction:ltr;width:100%;position:absolute;cursor:pointer;border:0 solid;border-color:#bfbfbf;background-color:#e1e1e1;border-bottom-width:1px;color:#0188fb;font-weight:700;touch-action:manipulation}.luckysheet-rows-h-cell-txt{width:100%;position:absolute;bottom:0;text-align:center;padding-bottom:1px;max-height:100%;overflow:hidden;font-size:14px}.luckysheet-cell-loading{width:100%;height:100%;background-color:rgba(255,255,255,.3);position:absolute;overflow:hidden;outline-style:none;cursor:not-allowed;font-size:28px;z-index:2;display:none}.luckysheet-cell-loading-inner{position:relative;top:40%;width:100%;margin:0 auto;text-align:center}.luckysheet-cell-loading-inner span{margin-left:10px}.luckysheet-cell-main{background-color:#fff;width:15px;height:15px;background-color:#f3f3f2;border-collapse:collapse;position:relative;overflow:hidden;outline-style:none;cursor:default}.luckysheet-menu,.luckysheet-scrollbars{scrollbar-base-color:#fff;scrollbar-track-color:#e7e7e7;scrollbar-darkshadow-color:#fff;scrollbar-3dlight-color:#fff;scrollbar-arrow-color:#757778;scrollbar-shadow-color:#bec1c4;scrollbar-highlight-color:#bec1c4;-ms-scroll-chaining:none;overflow:auto}.luckysheet-scrollbar-ltr{position:absolute;overflow:hidden;z-index:1003}.luckysheet-scrollbar-ltr div{height:1px;width:1px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button{height:0;width:0}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:start{display:none}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:end{display:block}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button{border:1px solid #d9d9d9}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal{border-width:1px 0 0 0}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical{border-width:0 0 0 1px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical{border-width:0 1px 0 0}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:increment{background:no-repeat url(waffle_sprite.png) -663px -13px;width:15px;padding-left:1px;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8;border-bottom:1px solid #d9d9d9}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:increment:hover{background:no-repeat url(waffle_sprite.png) -395px -62px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:increment:active{background:no-repeat url(waffle_sprite.png) -679px -13px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:decrement{border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;background:no-repeat url(waffle_sprite.png) -283px -62px;width:17px;border-bottom:1px solid #d9d9d9}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:hover{background:no-repeat url(waffle_sprite.png) -145px -70px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:active{background:no-repeat url(waffle_sprite.png) -552px 0}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:increment{padding-top:1px;background:no-repeat url(waffle_sprite.png) -531px -24px;border-left:1px solid #d9d9d9;height:15px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:increment:hover{background:no-repeat url(waffle_sprite.png) -570px -42px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:increment:active{background:no-repeat url(waffle_sprite.png) -83px -46px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:decrement{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;border-left:1px solid #d9d9d9;background:no-repeat url(waffle_sprite.png) -631px -27px;height:17px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:decrement:hover{background:no-repeat url(waffle_sprite.png) -180px -58px}.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:decrement:active{background:no-repeat url(waffle_sprite.png) -776px -28px}.luckysheet-scrollbar-x{bottom:0;left:44px;overflow-x:scroll}.luckysheet-scrollbar-y{right:0;top:0;overflow-y:scroll}.luckysheet-cell-flow{margin:0;padding:0;border:none 0;position:relative;touch-action:manipulation;overflow:hidden}.luckysheet-cell-flow-clip{border-collapse:collapse;cursor:default;width:5000000px;touch-action:manipulation;overflow:hidden}.luckysheet-cell-flow-col{margin:0;padding:0;border:none 0;position:relative;touch-action:manipulation;overflow:hidden;float:left;direction:ltr}.luckysheet-cell-sheettable{position:relative;text-align:left;font-size:11pt;color:#000;text-decoration:none}.luckysheet-bottom-controll-row{position:absolute;height:30px;bottom:38px;left:0;z-index:1000}#luckysheet-bottom-add-row{padding:5px 20px;margin-right:5px;margin-top:-2px}#luckysheet-bottom-add-row-input{width:40px;min-width:40px}#luckysheet-bottom-return-top{padding:5px 6px;margin-left:10px;margin-top:-2px}.luckysheet-cell-flow-column{position:absolute;height:inherit;width:inherit;top:0;left:0;z-index:1;touch-action:manipulation}.luckysheet-cell-flow-column-line{position:absolute;border-right:1px solid #d4d4d4;height:inherit}.luckysheet-cell-flow-row{text-align:left;position:absolute;height:inherit;width:inherit;top:0;left:0;z-index:1;touch-action:manipulation}.luckysheet-cell-flow-row-line{position:absolute;border-bottom:1px solid #d4d4d4;width:inherit}.luckysheet-cell-selected-focus{position:absolute;pointer-events:none;z-index:14;margin:0;background:rgba(0,80,208,.15);display:none}.luckysheet-selection-copy{position:absolute;pointer-events:none;z-index:18;border:none;margin:0;display:none}.luckysheet-selection-copy .luckysheet-copy{position:absolute;z-index:18;background-color:transparent}.luckysheet-selection-copy-top{left:0;right:0;height:2px;top:0;background-position:bottom;background-image:url(EwaAntH.gif)}.luckysheet-selection-copy-right{top:0;bottom:0;width:2px;right:0;background-image:url(EwaAntV.gif)}.luckysheet-selection-copy-bottom{left:0;right:0;height:2px;bottom:0;background-image:url(EwaAntH.gif)}.luckysheet-selection-copy-left{top:0;bottom:0;width:2px;left:0;background-position:right;background-image:url(EwaAntV.gif)}.luckysheet-selection-copy-hc{position:absolute;top:0;right:0;bottom:0;left:0;border:2px dashed #12a5ff;z-index:8}.luckysheet-selection-highlight{position:absolute;z-index:14;border:none;margin:0;display:none}.luckysheet-formula-functionrange-highlight .luckysheet-copy{background-image:none;background:#0188fb;position:absolute;z-index:18;cursor:move;opacity:.9}.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-top{top:-2px;border-top:2px solid #fff;border-bottom:2px solid #fff}.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-right{right:-2px;border-left:2px solid #fff;border-right:2px solid #fff}.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-bottom{bottom:-2px;border-top:2px solid #fff;border-bottom:2px solid #fff}.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-left{left:-2px;border-left:2px solid #fff;border-right:2px solid #fff}.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-hc{border:2px solid #5e5e5e;opacity:.03;z-index:initial}.luckysheet-selection-highlight-topleft{left:-3px;top:-3px;cursor:se-resize}.luckysheet-selection-highlight-topright{right:-3px;top:-3px;cursor:ne-resize}.luckysheet-selection-highlight-bottomleft{left:-3px;bottom:-3px;cursor:ne-resize}.luckysheet-selection-highlight-bottomright{right:-3px;bottom:-3px;cursor:se-resize}.luckysheet-formula-functionrange-highlight .luckysheet-highlight{position:absolute;z-index:19;border:1px solid #fff;background:#0188fb;width:6px;height:6px}.luckysheet-cell-selected-extend{position:absolute;pointer-events:none;z-index:16;border:1px dashed #0188fb;margin:-1px 0 0 -1px;display:none}.luckysheet-cell-selected-move{position:absolute;pointer-events:none;z-index:16;border:2px solid #0188fb;margin:-1px 0 0 -1px;display:none}.luckysheet-cell-selected{position:absolute;pointer-events:none;z-index:15;border:1px solid #0188fb;margin:-1px 0 0 -1px;background:rgba(1,136,251,.15);display:none}.luckysheet-cs-inner-border{pointer-events:none;border:1px solid #fff;position:absolute;top:0;bottom:0;left:0;right:0}.luckysheet-cs-fillhandle{position:absolute;width:6px;height:6px;bottom:-5px;cursor:crosshair;background-color:#0188fb;border:solid 1px #fff;z-index:16;pointer-events:auto;right:-5px}.luckysheet-cs-draghandle{position:absolute;cursor:move;background-color:#fff;opacity:.01;z-index:15;pointer-events:auto;border:2px solid #fff}.luckysheet-cs-draghandle-top{top:-4px;left:-2px;right:-2px;height:2px}.luckysheet-cs-draghandle-bottom{right:0;left:-2px;bottom:-4px;height:2px}.luckysheet-cs-draghandle-left{top:0;left:-4px;bottom:0;width:2px}.luckysheet-cs-draghandle-right{top:0;right:-4px;bottom:0;width:2px}.luckysheet-cs-touchhandle{display:none;position:absolute;width:16px;height:16px;padding:5px;z-index:100;pointer-events:auto;touch-action:auto}.luckysheet-cs-touchhandle:before{content:'';display:block;width:16px;height:16px;border:.5px solid rgba(0,0,0,.15);background-color:#fff;box-sizing:border-box;border-radius:50%}.luckysheet-cs-touchhandle-lt{left:-13px;top:-13px}.luckysheet-cs-touchhandle-lb{left:-13px;bottom:-13px}.luckysheet-cs-touchhandle-rt{right:-13px;top:-13px}.luckysheet-cs-touchhandle-rb{right:-13px;bottom:-13px}.luckysheet-cs-touchhandle .luckysheet-cs-touchhandle-btn{position:absolute;width:10px;height:10px;left:8px;top:8px;background-color:#018ffb;background-position:center;box-sizing:border-box;border-radius:50%;z-index:11}#luckysheet-dynamicArray-hightShow{position:absolute;pointer-events:none;z-index:15;border:1px solid #00f;margin:-1px 0 0 -1px;display:none}.luckysheet-scrollbars::-webkit-scrollbar-track{background-color:#fff;border:1px solid #d9d9d9}.luckysheet-scrollbar-x::-webkit-scrollbar-track{border-left:1px solid #d9d9d9;border-right:none}.luckysheet-scrollbar-y::-webkit-scrollbar-track{border-top:none;border-bottom:none}.luckysheet-scrollbars::-webkit-scrollbar{width:12px;height:12px;background-color:#fff}.luckysheet-scrollbars::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-radius:12px;border-width:2px 1px 1px 2px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.luckysheet-scrollbars::-webkit-scrollbar-thumb:hover{background-color:#969696;border:1px solid #a0a0a0;border-radius:12px}.luckysheet-grdusedrange{position:absolute;visibility:hidden;width:1px;height:1px}.luckysheet-grdblkflowpush{margin:0;padding:0;border:none 0;width:1px}.luckysheet-grdblkpush{margin:0;padding:0;border:none 0;height:1px;float:left;direction:ltr}.luckysheet-cell-flow-data{position:absolute;height:inherit;width:inherit;top:0;left:0;z-index:1}.luckysheet-cell-flow-data-row{position:absolute;width:inherit}.luckysheet-cell-flow-data-cell{position:absolute;height:inherit}.luckysheet-cell-flow-data-value{position:absolute!important;bottom:0;letter-spacing:-.02em;white-space:nowrap;padding-left:2px;overflow:hidden}.luckysheet canvas{position:absolute}.luckysheetcolumeHeader{margin-left:-1px}.luckysheetrowHeader{margin-top:1px}.luckysheetsheettable{margin-left:-1px;margin-top:-1px}.luckysheet-cols-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);-webkit-transition:opacity 218ms;-moz-transition:opacity 218ms;-o-transition:opacity 218ms;transition:opacity 218ms;background:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);cursor:default;font-size:13px;margin:0;outline:0;padding:6px 0;position:absolute;z-index:1004;box-sizing:border-box;user-select:none;display:none}.luckysheet-cols-menu .luckysheet-cols-menuitem{position:relative;color:#333;cursor:pointer;list-style:none;margin:0;padding:1px 6em 1px 20px;white-space:nowrap;padding-left:8px;vertical-align:middle;padding-right:24px;user-select:none}.luckysheet-cols-menu .luckysheet-cols-menuitem-hover,.luckysheet-cols-menu .luckysheet-cols-menuitem:hover{background:#efefef}.luckysheet-cols-menu .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content{position:relative;color:#333;cursor:pointer;list-style:none;margin:0;padding:6px 7em 6px 30px;white-space:nowrap;user-select:none}.luckysheet-rightgclick-menu .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content{position:relative;color:#333;cursor:pointer;list-style:none;margin:0;padding:6px 15px 6px 20px;white-space:nowrap;user-select:none}#luckysheet-cols-menu .luckysheet-cols-menuitem,#luckysheet-pivotTable-config-option .luckysheet-cols-menuitem,.luckysheet-filter-menu .luckysheet-cols-menuitem{padding-right:10px;padding-left:12px}#luckysheet-pivotTable-config-option-sumtype .luckysheet-cols-menuitem{padding-right:15px;padding-left:12px;padding-top:1px;padding-bottom:1px}#luckysheet-cols-menu .luckysheet-cols-menuitem-content,.luckysheet-filter-menu .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content{padding-right:10px;padding-left:12px}#luckysheet-sheet-list .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content{padding-right:0;max-width:430px;min-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.luckysheet-filter-menu div.luckysheet-cols-menuitem{padding-top:0;padding-bottom:0}.luckysheet-filter-submenu div.luckysheet-cols-menuitem{padding-top:1px;padding-bottom:1px}.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem,.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem{padding-top:2px;padding-bottom:0;cursor:default}.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content,.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content{padding-top:2px;padding-bottom:0;cursor:default}.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content input,.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content input{height:24px;width:191px;padding-right:25px;padding-left:3px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid silver;font-size:13px}.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content input:focus,.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content input:focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3);border:1px solid #4d90fe;outline:0}.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content .luckysheet-filter-byvalue-input-icon,.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content .luckysheet-pivotTableFilter-byvalue-input-icon{position:absolute;right:17px;top:7px}.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem:hover,.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem:hover{background:#fff}.luckysheet-filter-menu .luckysheet-cols-menuitem:last-child:hover{background:#fff}.luckysheet-filter-menu .luckysheet-cols-menuitem:last-child,.luckysheet-filter-menu .luckysheet-cols-menuitem:last-child .luckysheet-cols-menuitem-content{cursor:default}#luckysheet-filter-byvalue-select,#luckysheet-pivotTableFilter-byvalue-select{min-height:100px;width:200px}.luckysheet-filter-menu .luckysheet-mousedown-filter-byvalue-btn span,.luckysheet-filter-menu .luckysheet-mousedown-pivotTableFilter-byvalue-btn span{color:#00f;cursor:pointer;text-decoration:underline}.luckysheet-filter-menu .luckysheet-mousedown-filter-byvalue-btn div,.luckysheet-filter-menu .luckysheet-mousedown-pivotTableFilter-byvalue-btn div{position:absolute;right:14px;top:0;font-size:18px}.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input,.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input{padding-left:8px;padding-right:8px;margin-top:3px;display:none}.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input input,.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input input{height:24px;width:100%;padding-right:3px;padding-left:3px;margin-left:-3px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid silver;font-size:13px}.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input2 input,.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input2 input{height:24px;width:92px;padding-right:3px;padding-left:3px;margin-left:-3px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid silver;font-size:13px}.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input2 span,.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input2 span{margin-left:2px;margin-right:5px}.luckysheet-menuseparator{border-top:1px solid #ebebeb;margin-top:6px;margin-bottom:6px}.luckysheet-submenu-arrow{-webkit-transition:all 218ms;-moz-transition:all 218ms;-o-transition:all 218ms;transition:all 218ms;font-size:12px;left:auto;right:-15px;padding-top:1px;padding-right:0;position:absolute;text-align:right;opacity:.5;color:#000;user-select:none;font-family:Arial;line-height:100%}#luckysheet-pivotTable-config-option-sumtype .luckysheet-submenu-arrow{right:-5px;font-size:16px;padding-top:0;color:#00f}#luckysheet-filter-byvalue-select table,#luckysheet-pivotTableFilter-byvalue-select table{table-layout:fixed}#luckysheet-filter-byvalue-select tr td,#luckysheet-pivotTableFilter-byvalue-select tr td{padding:2px 3px}#luckysheet-filter-byvalue-select tr:hover td,#luckysheet-pivotTableFilter-byvalue-select tr:hover td{background:#e1e1e1}.luckysheet-cols-menu .cf:after,.luckysheet-cols-menu .cf:before{content:"";display:table}.luckysheet-cols-menu .cf:after{clear:both}#luckysheet-filter-byvalue-select .yearBox .monthList,#luckysheet-pivotTableFilter-byvalue-select .yearBox .monthList{padding-left:20px}#luckysheet-filter-byvalue-select .yearBox .dayList,#luckysheet-pivotTableFilter-byvalue-select .yearBox .dayList{padding-left:20px}#luckysheet-filter-byvalue-select .yearBox .fa-caret-right,#luckysheet-pivotTableFilter-byvalue-select .yearBox .fa-caret-right{padding:0 2px;float:left;margin-top:3px;cursor:pointer}#luckysheet-filter-byvalue-select .count,#luckysheet-pivotTableFilter-byvalue-select .count{color:gray;margin-left:5px}#luckysheet-filter-byvalue-select input[type=checkbox],#luckysheet-pivotTableFilter-byvalue-select input[type=checkbox]{width:auto;height:auto;float:left}#luckysheet-filter-orderby-color-submenu{font-size:12px}#luckysheet-filter-orderby-color-submenu .title{padding:10px;font-weight:600;color:#333;background-color:#f4f4f4;text-align:center}#luckysheet-filter-orderby-color-submenu .item{padding:5px 40px 5px 20px;cursor:pointer;position:relative}#luckysheet-filter-orderby-color-submenu .item:hover{background-color:#d3d3d3}#luckysheet-filter-orderby-color-submenu .item label{display:block;width:70px;height:20px;border:1px solid #d1d1d1}#luckysheet-filter-orderby-color-submenu .item input[type=checkbox]{position:absolute;right:10px;top:6px}#luckysheet-copy-content{position:fixed;height:0;width:0;left:-100px;padding-left:999999px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:4px 8px;font-size:14px;line-height:1.42857143;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#2d7ff9;border-color:transparent}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:transparent}.btn-primary:hover{color:#fff;background-color:#5391ff;border-color:transparent}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#5391ff}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:transparent}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:transparent}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-primary,.label-default,.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{background:#0188fb;border-color:transparent}.btn-primary:focus,.btn-primary:hover{background:#5391ff;border-color:transparent}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.luckysheet-change-size-line,.luckysheet-cols-change-size,.luckysheet-rows-change-size{position:absolute;z-index:12}.luckysheet-cols-change-size{width:5px;height:100%;background:#0188fb;cursor:ew-resize;opacity:0}.luckysheet-rows-change-size{width:100%;height:5px;background:#0188fb;cursor:ns-resize;opacity:0}.luckysheet-change-size-line{border-color:#0188fb;border-style:solid;z-index:15;display:none}.luckysheet-count-show{position:absolute;z-index:15;background:rgba(76,76,76,.8);color:#fff;padding:2px 3px;border-radius:3px;transition:all .3s;display:none;white-space:nowrap}.luckysheet-row-count-show{text-align:center}.luckysheet-row-count-show div{writing-mode:vertical-rl;writing-mode:vertical-rl;-ms-writing-mode:initial}.luckysheet-row-count-show div:last-child{writing-mode:initial}#luckysheet-sheet-list{max-height:60%;overflow:auto}#luckysheet-sheet-list .luckysheet-cols-menuitem{padding-left:0;padding-right:10px}#luckysheet-sheet-list .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content{padding-left:5px}#luckysheet-sheet-list .icon{width:15px;margin-left:4px;display:inline-block}.luckysheet-input-box{position:absolute;font:normal normal 400 13px arial,sans,sans-serif;text-align:left;top:-10000px;max-height:9900px;max-width:9900px;border:2px #5292f7 solid;padding:0 2px;margin:0;z-index:15;resize:none;overflow:auto;overflow:initial;white-space:pre-wrap;outline:0;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.4);-moz-box-shadow:0 2px 5px rgba(0,0,0,.4);box-shadow:0 2px 5px rgba(0,0,0,.4);word-wrap:break-word}.luckysheet-cell-input{width:100%;height:100%;margin:0;outline:0;cursor:text;-webkit-user-modify:read-write-plaintext-only;white-space:pre-wrap;-webkit-transform:translateZ(0)}#luckysheet-rich-text-editor{-webkit-user-modify:read-write}.luckysheet-input-box-index{display:none;position:absolute;height:14px;line-height:16px;font-size:12px;padding:1px 6px;background-color:#5292f7;border-radius:2px;box-shadow:0 1px 2px rgba(0,0,0,.5);color:#fff}.luckysheet-modal-dialog{-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);background:#fff;background-clip:padding-box;border:1px solid #acacac;border:1px solid rgba(0,0,0,.333);outline:0;position:absolute;color:#000;padding:30px 42px;z-index:100002}.luckysheet-modal-dialog-mask{position:absolute;height:100%;width:100%;background:#fff;opacity:.6;display:none;left:0;top:0;z-index:1010}.luckysheet-modal-dialog-title{background-color:#fff;color:#000;cursor:default;font-size:16px;font-weight:400;line-height:24px;margin:0 0 16px}.luckysheet-modal-dialog-title-close{height:11px;opacity:.7;padding:17px;position:absolute;right:0;top:0;width:11px;color:#d4d4d4;outline:0}.luckysheet-modal-dialog-chart{padding:20px 10px;webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.luckysheet-modal-dialog-resize{position:absolute;border:2px solid #0188fb;margin:0;padding:0;top:-2px;left:-2px;bottom:-2px;right:-2px;pointer-events:none}.luckysheet-modal-dialog-resize-item{position:absolute;height:6px;width:6px;background:#fff;border:2px solid #0188fb;pointer-events:all;border-radius:6px}.luckysheet-modal-dialog-resize-item-lt{left:-6px;top:-6px;cursor:se-resize}.luckysheet-modal-dialog-resize-item-mt{left:50%;top:-6px;margin-left:-4px;cursor:s-resize}.luckysheet-modal-dialog-resize-item-rt{right:-6px;top:-6px;cursor:ne-resize}.luckysheet-modal-dialog-resize-item-lm{top:50%;left:-6px;margin-top:-4px;cursor:w-resize}.luckysheet-modal-dialog-resize-item-rm{top:50%;right:-6px;margin-top:-4px;cursor:w-resize}.luckysheet-modal-dialog-resize-item-lb{left:-6px;bottom:-6px;cursor:ne-resize}.luckysheet-modal-dialog-resize-item-mb{left:50%;bottom:-6px;margin-left:-4px;cursor:s-resize}.luckysheet-modal-dialog-resize-item-rb{right:-6px;bottom:-6px;cursor:se-resize}.luckysheet-modal-dialog-controll{position:absolute;margin:0;padding:0;right:-35px;font-size:14px;top:0}.luckysheet-modal-controll-btn{height:13px;padding:8px;width:13px;color:#d4d4d4;outline:0;border:1px solid #b6b6b6;display:block;background:#fff;margin-bottom:3px;cursor:pointer;transition:all .2s;-moz-transition:all .2s;-webkit-transition:all .2s;-o-transition:all .2s}.luckysheet-modal-controll-btn:hover{border:1px solid #a1a1a1;color:#0188fb}.luckysheet-modal-controll-btn:active{border:1px solid #bbb;background:#efefef;color:#0188fb}.luckysheet-modal-controll-del{font-size:16px}.luckysheet-modal-controll-max-close{font-size:22px;width:42px;height:42px;line-height:42px;background:#383838;opacity:.7;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;color:#fff;position:absolute;right:0;top:0;z-index:100000;text-align:center}.luckysheet-modal-controll-max-close:hover{background:#0188fb;cursor:pointer}.luckysheet-sort-item-close{margin-right:3px;font-size:14px;color:#bbb;cursor:pointer}.luckysheet-sort-item-close:hover{color:#494949}.luckysheet-modal-dialog-title-close:hover{color:#5e5e5e;cursor:pointer}.luckysheet-modal-dialog-content{background-color:#fff;line-height:1.4em;word-wrap:break-word}.luckysheet-modal-dialog-buttons{margin-top:10px}.luckysheet-modal-dialog-buttons button{margin-right:10px}.luckysheet-modal-dialog-title-text span{font-family:Arial}.luckysheet-sort-modal{font-size:12px}.luckysheet-sort-modal label input,.luckysheet-sort-modal label span{vertical-align:middle}.luckysheet-sort-modal table,.luckysheet-sort-modal>div{margin-bottom:10px}.luckysheet-sort-modal table tr{margin-bottom:10px}.luckysheet-sort-modal table tr td{padding:5px;white-space:nowrap;border-top:1px solid #ffc6c6}.luckysheet-sort-modal table tr td>div:first-child{margin-bottom:8px}.luckysheet-sort-modal table tr td select{max-width:180px;min-width:50px}.luckysheet-sort-modal table tr:first-child td{border-top:none}.luckysheet-filter-options{color:#897bff;cursor:pointer;position:absolute;z-index:20;border:1px solid #897bff;border-radius:3px;top:3px;margin-left:0;display:none;padding:0 4px;font-size:12px;height:15px;background:#fff}.luckysheet-filter-options:hover{color:#fff;border:1px solid #fff;background:#897bff}.luckysheet-filter-options-active{color:#fff;border:1px solid #897bff;background:#897bff}.luckysheet-flat-menu-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(to bottom,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(to bottom,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(to bottom,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(to bottom,#f5f5f5,#f1f1f1);background-image:linear-gradient(to bottom,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;color:#333;cursor:default;font-size:11px;font-weight:700;line-height:27px;list-style:none;margin:0 2px;min-width:46px;outline:0;padding:0 18px 0 6px;text-align:left;text-decoration:none;position:relative;padding-left:15px}.luckysheet-flat-menu-button:hover{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(to bottom,#f1f1f1,#f5f5f5);background-image:-moz-linear-gradient(to bottom,#f1f1f1,#f5f5f5);background-image:-ms-linear-gradient(to bottom,#f1f1f1,#f5f5f5);background-image:-o-linear-gradient(to bottom,#f1f1f1,#f5f5f5);background-image:linear-gradient(to bottom,#f1f1f1,#f5f5f5);border:1px solid #d0d0d0;color:#000}.luckysheet-flat-menu-button div{display:inline-block;vertical-align:middle;position:absolute;right:15px}.luckysheet-data-visualization{width:60%;min-width:860px}.luckysheet-data-pivotTable-selection,.luckysheet-data-visualization-selection{width:30%;min-width:200px;display:none}.luckysheet-data-visualization-chart{width:50%;height:50%}.luckysheet-data-visualization-chart .luckysheet-modal-dialog-content{width:100%;height:100%;overflow:hidden}.luckysheet-datavisual-modal{font-size:12px;height:100%;width:100%}.luckysheet-datavisual-left{display:inline-block;width:100%;height:100%;position:relative;overflow:hidden}.luckysheet-datavisual-tabs{border-bottom:1px solid #dedede;width:80%;height:26px;padding-left:20px}.luckysheet-datavisual-tabs .luckysheet-datavisual-tab{padding:0 5px;text-align:center;display:inline-block;cursor:pointer;border:1px solid #fff;border-bottom:none;height:24px;line-height:24px;background:#fff;color:#777}.luckysheet-datavisual-tabs .luckysheet-datavisual-tab:hover{color:#000}.luckysheet-datavisual-tabs .luckysheet-datavisual-tab-active{border:1px solid #dedede;border-bottom:none;cursor:default;height:26px;color:#000}.luckysheet-datavisual-tab-content{position:absolute;top:28px;bottom:0;width:100%;display:none}.luckysheet-datavisual-quick-menu{width:90px;overflow:auto;margin-top:5px}.luckysheet-datavisual-quick-menu::-webkit-scrollbar{display:none}.luckysheet-datavisual-quick-menu>div{text-align:left;padding:4px 4px;border-right:3px solid #fff;color:#777;cursor:pointer;line-height:1.4em;word-wrap:break-word}.luckysheet-datavisual-quick-menu>div:hover{color:#000}.luckysheet-datavisual-quick-menu>div i{width:15px}.luckysheet-datavisual-quick-menu>div:hover i{color:#ff7e7e}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active{border-right:3px solid #ff7e7e;color:#000;font-weight:700}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active:hover i{color:#000}.luckysheet-datavisual-quick-range{padding:5px 0}.luckysheet-datavisual-range-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid silver;min-width:20px;width:100%;max-width:200px;display:inline-block}.luckysheet-datavisual-range-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,.3);outline:0}.luckysheet-datavisual-range-input,.luckysheet-datavisual-range-input:focus{background:0 0!important;border:none!important;box-sizing:border-box;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;height:25px;margin:0;outline:0!important;padding:1px 8px!important;width:100%}.luckysheet-datavisual-range-button-container{overflow:hidden;padding:0 0 0 8px;text-align:right;width:21px}.luckysheet-datavisual-range-button-container div{padding:2px 10px 0 10px;font-size:18px;cursor:pointer;color:#6598f3}.luckysheet-datavisual-range-button-container div:hover{color:#ff7e7e}.luckysheet-datavisual-quick-m{margin-top:5px}.luckysheet-datavisual-quick-list{left:90px;right:0;bottom:0;top:110px;position:absolute;overflow:auto;border-top:1px solid #e5e5e5;padding:5px 3px 35px 3px}.luckysheet-datavisual-quick-list-title{padding:4px 6px;background:#e5e5e5;margin-top:10px}.luckysheet-datavisual-quick-list-ul{overflow:hidden}.luckysheet-datavisual-quick-list-item{display:inline-block;margin:5px 8px;border:1px solid #dadada;width:100px;height:80px}.luckysheet-datavisual-quick-list-item:hover{border:1px solid #ff7e7e;box-shadow:0 0 20px #ff7e7e}.luckysheet-datavisual-quick-list-item img{display:inline-block;width:100px;height:80px}.luckysheet-datavisual-quick-list-item-active{border:1px solid #6598f3;box-shadow:0 0 20px #6598f3}.jfk-tooltip{z-index:300000}.jfk-tooltip-hide{-webkit-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;-moz-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;-o-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;opacity:0;left:20px!important;top:20px!important;visibility:hidden!important}.jfk-tooltip{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-transition:visibility 0,opacity .13s ease-in;-moz-transition:visibility 0,opacity .13s ease-in;-o-transition:visibility 0,opacity .13s ease-in;transition:visibility 0,opacity .13s ease-in;background-color:#2a2a2a;border:1px solid #fff;color:#fff;cursor:default;display:block;font-size:11px;font-weight:700;margin-left:-1px;opacity:1;padding:7px 9px;position:absolute;visibility:visible;white-space:pre-wrap;word-break:break-all;word-break:break-word}.jfk-tooltip-arrowup{top:-6px}.jfk-tooltip-arrow{pointer-events:none;position:absolute}.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter{border:5px solid}.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore{border:6px solid}.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter,.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore{content:'';display:block;height:0;position:absolute;width:0}.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter{border-top-width:0;top:1px}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter,.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter{border-color:#2a2a2a transparent;left:-5px}.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore{border-top-width:0}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore{border-color:#fff transparent;left:-6px}.luckysheet-datavisual-config{position:relative;width:100%;height:97%;overflow:auto;top:0}.luckysheet-datavisual-config input{outline:0}.luckysheet-datavisual-config .luckysheet-datavisual-accordion-title{position:relative;width:97%;height:33px;background:#f5f5f5;border:1px solid #e5e5e5;margin-top:30px;line-height:30px;font-weight:700;color:#d14836;cursor:pointer}.luckysheet-datavisual-config .luckysheet-datavisual-accordion-title:hover{background:#efefef;border:1px solid #e0e0e0}.luckysheet-datavisual-config .luckysheet-datavisual-accordion-content{position:relative;width:97%;border:1px solid #e5e5e5;border-top:1px solid #fff;display:none;color:#505050;padding-bottom:20px}.luckysheet-datavisual-config-input,.luckysheet-datavisual-config-input-no{background:#fff;border:1px solid #d9d9d9;border-top:1px solid silver;min-width:50px;width:90%;display:inline-block;height:24px;line-height:24px;padding:3px}.luckysheet-datavisual-config-input-no:focus,.luckysheet-datavisual-config-input:focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,.3);outline:0}.luckysheet-datavisual-content-row{margin-left:15px;margin-bottom:5px;margin-top:15px;height:30px;line-height:30px}.luckysheet-datavisual-content-column{display:inline-block;position:relative}.luckysheet-datavisual-content-column-title{text-align:left;font-size:14px}.luckysheet-datavisual-content-column-right{text-align:right}.luckysheet-datavisual-content-rowsplit{height:5px;border-top:1px solid #e5e5e5;width:100%;margin-top:25px}.luckysheet-datavisual-content-rowsplit-sub{height:2px;border-top:1px dashed #e5e5e5;width:90%;margin:0 auto;margin-top:18px;text-align:center}.sp-replacer{padding:2px;border:solid 1px #e5e5e5;background:#f5f5f5}.ui-visual-focus{box-shadow:none}.luckysheet-datavisual-config-slider,.luckysheet-datavisual-config-slider-range{width:70%;display:inline-block}.luckysheet-datavisual-config-slider-range .luckysheet-slider-handle{width:45px;height:26px;top:50%;margin-top:-13px;text-align:center;line-height:26px}.luckysheet-datavisual-content-row-subtitle{display:none}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:48%}.luckysheet-datavisual-content-column-italic{font-style:italic;font-weight:700;font-family:'Times New Roman',Times,serif}.luckysheetChartAxisShow{display:none}.luckysheet-datavisual-chart-axistitle-show{display:none}.luckysheetChartseriesShow{display:none}#luckysheetswichxy-button,#piecutselect-button{width:70%}.ui-selectmenu-menu .ui-menu.customicons .ui-menu-item-wrapper{padding:.5em 0 .5em 3em}.ui-selectmenu-menu .ui-menu.customicons .ui-menu-item .ui-icon{height:26px;width:26px;top:.1em;background-image:none}#luckysheetscatterselectshow-menu .ui-state-active,#luckysheetswichseries-menu .ui-state-active,#pie0cutselect-menu .ui-state-active,#pie1cutselect-menu .ui-state-active,#pie2cutselect-menu .ui-state-active{border:1px solid #f5f5f5;background:#f5f5f5;color:#333}.ui-front{z-index:100003}.luckysheet-datavisual-skin-menu{top:5px;position:absolute;left:0;width:90%;height:30px}#luckysheet-chart-theme-content{height:21px;width:120px}.luckysheet-datavisual-skin-c{position:absolute;left:0;top:38px;bottom:0;width:100%;overflow:auto}.luckysheet-datavisual-skin-c .luckysheet-datavisual-skin-item{display:inline-block;width:46%;height:152px;margin-right:5px;border:4px solid #efefef;border-radius:4px;position:relative;cursor:pointer}.luckysheet-datavisual-skin-c .luckysheet-datavisual-skin-item-more{display:inline-block;width:94%;height:32px;position:relative;cursor:pointer;font-size:20px;line-height:32px;margin-bottom:20px;text-align:center}.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-canvas,.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-cover{position:absolute;width:100%;height:100%;bottom:0}.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-cover{background-color:rgba(0,0,0,.4);color:#fff;font-size:14px;height:30%;transition:opacity .15s ease;-moz-transition:opacity .15s ease;-webkit-transition:opacity .15s ease;-o-transition:opacity .15s ease}.luckysheet-datavisual-skin-item:hover .luckysheet-datavisual-skin-cover{opacity:1;z-index:2}.luckysheet-datavisual-skin-cover .luckysheet-datavisual-skin-cover-txt{position:absolute;width:80%;height:80%;top:10%;left:10%;text-align:center}.luckysheet-chart-point-config{position:relative;width:100%;height:100%;margin:0;font-size:12px}.luckysheet-chart-point-config-set{position:absolute;width:60%;height:100%;left:0;top:0}.luckysheet-chart-point-config-left{position:absolute;height:100%;width:50%;left:0;top:0}.luckysheet-chart-point-config-left-top{position:absolute;top:0;height:120px;width:100%}.luckysheet-chart-point-searchcondition{position:absolute;top:10px;bottom:10px;left:10px;right:10px}.luckysheet-chart-point-config-left-mid{position:absolute;top:120px;height:25px;width:100%;text-align:left;margin-left:20px;line-height:35px}.luckysheet-chart-point-config-left-mid span{color:#00f;cursor:pointer;text-decoration:underline;font-size:12px}.luckysheet-chart-point-config-left-bottom{position:absolute;top:0;bottom:0;margin-top:145px;width:100%}.luckysheet-chart-point-searchitem-c{position:absolute;width:100%;height:100%;overflow:hidden;overflow-y:auto;cursor:default}.luckysheet-chart-point-searchitem{display:inline-block;margin-left:5px;margin-top:5px;width:90px;border:2px solid #f5f5f5;background:#fff;text-align:center;padding:5px 0;user-select:none;cursor:default;position:relative}.luckysheet-chart-point-searchitem-selected{position:absolute;color:#616161;left:-6px;top:-10px;font-size:20px;display:none;font-weight:400}.luckysheet-chart-point-searchitem-active{box-shadow:0 0 4px #656565}.luckysheet-chart-point-searchitem-active .luckysheet-chart-point-searchitem-selected{display:block}.luckysheet-chart-point-searchitem-name{font-size:12px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.luckysheet-chart-point-searchitem-dim{font-size:12px;opacity:.7;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#luckysheet-chart-point-selectedhelp{pointer-events:none;position:absolute;border:1px dotted #535353}.luckysheet-chart-point-config-right{position:absolute;height:100%;width:50%;top:0;right:0}.luckysheet-chart-point-itemconfig{position:absolute;top:10px;bottom:10px;left:10px;right:10px;overflow:auto}.luckysheet-chart-point-config-chart{position:absolute;width:40%;height:100%;right:0;top:0}.luckysheet-chart-point-config-chart-c{width:100%;height:80%;top:10%;position:relative}@media (max-width:776px){.luckysheet-chart-point-config-set{width:90%}.luckysheet-chart-point-config-chart{width:10%}}@media (min-width:768px){.luckysheet-chart-point-config-set{width:80%}.luckysheet-chart-point-config-chart{width:20%}}@media (min-width:1024px){.luckysheet-chart-point-config-set{width:70%}.luckysheet-chart-point-config-chart{width:30%}}@media (min-width:1280px){.luckysheet-chart-point-config-set{width:60%}.luckysheet-chart-point-config-chart{width:40%}}@media (min-width:1680px){.luckysheet-chart-point-config-set{width:50%}.luckysheet-chart-point-config-chart{width:50%}}.luckysheet-modal-dialog-slider{top:1px;bottom:1px;position:absolute;right:0;width:260px;border:1px solid #e5e5e5;z-index:1004;box-shadow:0 2px 4px rgba(0,0,0,.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.luckysheet-modal-dialog-slider .luckysheet-modal-dialog-slider-title{background:#333;color:#fff;height:39px;width:100%;position:absolute;top:0;left:0;line-height:39px;font-size:13px}.luckysheet-modal-dialog-slider .luckysheet-modal-dialog-slider-title>span:first-child{margin-left:5px;font-weight:700}.luckysheet-modal-dialog-slider .luckysheet-modal-dialog-slider-title>span:last-child{position:relative;float:right;margin-right:20px;cursor:pointer}.luckysheet-modal-dialog-slider-content{background:#efefef;margin-top:39px;width:100%;position:absolute;top:0;bottom:0;font-size:12px}.luckysheet-modal-dialog-slider-range{background:#e1e1de;color:#1b1b19;height:40px;font-size:13px;line-height:40px}.luckysheet-modal-dialog-slider-range>div:first-child{font-weight:700;overflow:hidden;text-overflow:ellipsis;float:left;max-width:170px;margin-right:10px;margin-left:5px;white-space:nowrap}.luckysheet-modal-dialog-slider-range>div:last-child{color:#00f;cursor:pointer;float:left}.luckysheet-modal-dialog-slider-list{width:250px;height:320px;overflow-y:scroll;margin:5px 0;margin-left:5px;border-top:1px solid #e5e5e5;border-bottom:1px solid #e5e5e5;background:#fff}.luckysheet-modal-dialog-slider-list-title{height:20px;line-height:25px;padding:0 5px}.luckysheet-modal-dialog-slider-list .luckysheet-modal-dialog-slider-list-item{padding:0 4px;position:relative;width:228px;height:25px;user-select:none;border:1px solid #fff}.luckysheet-modal-dialog-slider-list .luckysheet-modal-dialog-slider-list-item:hover{background:#fff6cb;border:1px solid #ffe463}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-name{cursor:pointer;height:25px;line-height:25px;cursor:move;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:absolute;left:22px;right:40px;top:0}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected{width:20px;cursor:pointer;text-align:center;position:absolute;left:0;top:0;height:25px}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected i{margin-top:4px;font-size:16px}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected div{border:1px solid #9c9c9c;top:4px;left:1px;position:absolute;height:14px;width:14px;-moz-box-shadow:1px 1px 1px #dbdbdb inset;-webkit-box-shadow:1px 1px 1px #dbdbdb inset;box-shadow:1px 1px 1px #dbdbdb inset}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected div:hover{border:1px solid #5e5e5e}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered{width:20px;cursor:pointer;text-align:center;position:absolute;right:20px;top:2px;height:25px;display:none}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered i{margin-top:2px;font-size:16px}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered:hover i{color:#fb8686}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered i.fa-times{right:0;bottom:3px;color:red;font-size:9px;position:absolute}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filter{width:20px;cursor:pointer;text-align:center;position:absolute;right:0;top:0;height:25px}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filter i{margin-top:2px;font-size:16px}.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filter:hover i{color:#fb8686}.luckysheet-modal-dialog-slider-config-c{width:100%;position:absolute;margin-top:390px;top:0;bottom:3px}.luckysheet-modal-dialog-slider-config{height:50%;width:50%;position:absolute}.luckysheet-modal-dialog-slider-config>div:first-child{color:#1b1b19;font-size:13px;height:20px;line-height:20px;padding-left:5px}.luckysheet-modal-dialog-slider-config>div:first-child span{font-weight:700;font-weight:700;overflow:hidden}.luckysheet-modal-dialog-slider-config .luckysheet-modal-dialog-slider-config-list{position:absolute;margin-top:22px;margin-left:5px;left:0;right:5px;top:0;bottom:3px;border:1px solid #e5e5e5;user-select:none;overflow-y:auto;background:#fff}.luckysheet-modal-dialog-slider-config-list .luckysheet-modal-dialog-slider-config-item{position:relative;height:19px;line-height:19px;font-size:12px;border:1px solid #88adfd;background:#aac1fe;margin:2px}.luckysheet-modal-dialog-slider-config-list .luckysheet-modal-dialog-slider-config-item:hover{border:1px solid #0188fb;background:#5f9afc}.luckysheet-modal-dialog-slider-config-item-txt{position:absolute;height:100%;left:5px;right:25px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:move}.luckysheet-modal-dialog-slider-config-item-icon{position:absolute;height:100%;width:15px;right:0;top:-4px;cursor:pointer;font-size:14px}.luckysheet-modal-dialog-slider-config-item-icon:hover{color:#fa7272}.luckysheet-modal-dialog-config-filter{top:0;left:0}.luckysheet-modal-dialog-config-column{top:0;left:50%}.luckysheet-modal-dialog-config-row{top:50%;left:0}.luckysheet-modal-dialog-config-value{top:50%;left:50%}#luckysheet-modal-dialog-slider-pivot-move{position:absolute;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#fff;border:1px dotted #000;color:#000;font-size:14px;opacity:.6;z-index:1005;padding:3px 8px;pointer-events:none;user-select:none}.luckysheet-modal-dialog-slider-chart{width:445px}.luckysheet-modal-dialog-slider-chart .luckysheet-modal-dialog-slider-title{background:#b94045}.luckysheet-modal-dialog-slider-chart .luckysheet-modal-dialog-slider-content{background:#fff}#luckysheet-dialog-pivotTable-clearitem{color:#00f;cursor:pointer;float:right;margin-right:30px}.luckysheet-freezebar-drop,.luckysheet-freezebar-handle{position:absolute;z-index:999}.luckysheet-freezebar-vertical-handle{width:4px;display:none}.luckysheet-freezebar-vertical-drop{width:4px}.luckysheet-freezebar-active .luckysheet-freezebar-vertical-handle{display:block;z-index:1003}.luckysheet-freezebar-vertical-handle-bar{width:2px;background:#dbe5f7;border-color:#a5c6fe;border-style:solid;border-width:0 1px;opacity:.45;margin-top:19px;top:0;bottom:0}.luckysheet-freezebar-vertical-handle-title{width:4px;background:#9dbefb;opacity:.8;height:19px;top:0}.luckysheet-freezebar-drop-bar,.luckysheet-freezebar-handle-bar{position:absolute;z-index:7}.luckysheet-freezebar-vertical-drop-bar{width:2px;background:rgba(0,0,0,.45);border-width:2px 1px 2px 2px;margin-top:19px;top:0;bottom:0}.luckysheet-freezebar-vertical-drop-title{width:2px;background:#bcbdbc;height:19px;top:0}.luckysheet-freezebar-active .luckysheet-freezebar-vertical-drop-bar,.luckysheet-freezebar-hover .luckysheet-freezebar-vertical-drop-bar{background:#c1c1c1;width:4px}.luckysheet-freezebar-active .luckysheet-freezebar-vertical-drop-title,.luckysheet-freezebar-hover .luckysheet-freezebar-vertical-drop-title{background:#5d88db;width:4px}.luckysheet-freezebar-horizontal-handle{height:4px;display:none}.luckysheet-freezebar-horizontal-drop{height:4px}.luckysheet-freezebar-active .luckysheet-freezebar-horizontal-handle{display:block;z-index:1003}.luckysheet-freezebar-horizontal-handle-bar{height:2px;background:#dbe5f7;border-color:#a5c6fe;border-style:solid;border-width:1px 0;opacity:.45;margin-left:45px;left:0;right:0}.luckysheet-freezebar-horizontal-handle-title{height:4px;background:#9dbefb;opacity:.8;width:45px;left:0}.luckysheet-freezebar-horizontal-drop-bar{height:2px;overflow:hidden;background:rgba(0,0,0,.45);border-width:2px 2px 1px 2px;margin-left:45px;left:0;right:0}.luckysheet-freezebar-horizontal-drop-title{height:2px;background:#bcbdbc;width:45px;left:0}.luckysheet-freezebar-active .luckysheet-freezebar-horizontal-drop-bar,.luckysheet-freezebar-hover .luckysheet-freezebar-horizontal-drop-bar{background:#c1c1c1;height:4px}.luckysheet-freezebar-active .luckysheet-freezebar-horizontal-drop-title,.luckysheet-freezebar-hover .luckysheet-freezebar-horizontal-drop-title{background:#5d88db;height:4px}#luckysheet-functionbox-container{height:100%;padding-left:10px;overflow:hidden;position:absolute;padding:0;top:0;left:185px;right:10px;border-left:1px solid #e5e5e5}#luckysheet-functionbox-container>div{height:100%;overflow-x:hidden;overflow-y:auto;position:relative}#luckysheet-functionbox{bottom:6px;left:0;position:absolute;right:0;top:6px;resize:none;font-family:arial,sans,sans-serif;font-size:14px;line-height:14px;background-color:#fff;padding:0 5px}#luckysheet-functionbox .luckysheet-functionbox-cell-input{word-wrap:break-word;-webkit-nbsp-mode:space;-webkit-line-break:after-white-space}.luckysheet-functionbox-cell-input{width:100%;height:100%;margin:0;outline:0;cursor:text;-webkit-user-modify:read-write-plaintext-only;white-space:pre-wrap;-webkit-transform:translateZ(0);background-color:#fff}.luckysheet-formula-text-color{color:#000}.luckysheet-formula-text-string{color:#228b22}.luckysheet-formula-search-c{position:absolute;left:50%;top:50%;border:1px solid rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);color:#535353;font-size:12px;background:#fff;z-index:1003;width:300px;display:none}.luckysheet-formula-search-c .luckysheet-formula-search-item{background:#fff;padding:5px 10px;cursor:pointer}.luckysheet-formula-search-c .luckysheet-formula-search-item .luckysheet-formula-search-detail{display:none;color:#444}.luckysheet-formula-search-c .luckysheet-formula-search-item .luckysheet-formula-search-func{color:#222;font-size:14px}.luckysheet-formula-search-c .luckysheet-formula-search-item-active{display:block;border-top:1px solid #ebebeb;border-bottom:1px solid #ebebeb;background:#f5f5f5}.luckysheet-formula-search-c .luckysheet-formula-search-item-active .luckysheet-formula-search-detail{display:block}.luckysheet-formula-help-c{display:none;position:absolute;left:20%;top:20%;border:1px solid rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);color:#535353;font-size:12px;background:#fff;z-index:1003;width:300px}.luckysheet-formula-help-c .luckysheet-formula-help-content{max-height:300px;overflow-y:scroll}.luckysheet-formula-help-content-example{margin-top:5px}.luckysheet-formula-help-title{display:block;border-top:1px solid #ebebeb;border-bottom:1px solid #ebebeb;background:#f5f5f5;padding:2px 10px;font-size:14px}.luckysheet-formula-help-title-formula{width:250px;word-break:break-word}.luckysheet-arguments-help-section{margin-top:5px;margin-bottom:5px;color:#222}.luckysheet-arguments-help-section-title{padding:1px 10px;color:#666}.luckysheet-arguments-help-parameter-content{padding:1px 10px;display:inline-block;word-wrap:break-word}.luckysheet-arguments-help-formula{padding:1px 10px;font-size:14px}.luckysheet-arguments-help-parameter-active{background-color:#fff9b2}.luckysheet-formula-help-collapse{position:absolute;top:0;right:25px;font-size:16px;cursor:pointer;color:#bbb}.luckysheet-formula-help-close{position:absolute;top:0;right:5px;font-size:16px;cursor:pointer;color:#bbb}.luckysheet-formula-help-close:hover,.luckysheet-formula-help-collapse:hover{color:#555}.luckysheetLoader{font-size:20px;width:1em;height:1em;border-radius:50%;text-indent:-9999em;position:absolute;top:50%;left:50%;animation:load-effect 1s infinite linear}.luckysheetLoaderGif{width:8em;height:8em;position:absolute;top:50%;left:50%;-ms-transform:translate(-50%,-100%);-moz-transform:translate(-50%,-100%);-o-transform:translate(-50%,-100%);transform:translate(-50%,-100%);background-image:url(loading.gif);background-repeat:no-repeat;background-position:center;background-size:100% 100%}@keyframes load-effect{0%{box-shadow:0 -3em 0 .2em #0188fb,2em -2em 0 0 #0188fb,3em 0 0 -.5em #0188fb,2em 2em 0 -.5em #0188fb,0 3em 0 -.5em #0188fb,-2em 2em 0 -.5em #0188fb,-3em 0 0 -.5em #0188fb,-2em -2em 0 0 #0188fb}12.5%{box-shadow:0 -3em 0 0 #0188fb,2em -2em 0 .2em #0188fb,3em 0 0 0 #0188fb,2em 2em 0 -.5em #0188fb,0 3em 0 -.5em #0188fb,-2em 2em 0 -.5em #0188fb,-3em 0 0 -.5em #0188fb,-2em -2em 0 -.5em #0188fb}25%{box-shadow:0 -3em 0 -.5em #0188fb,2em -2em 0 0 #0188fb,3em 0 0 .2em #0188fb,2em 2em 0 0 #0188fb,0 3em 0 -.5em #0188fb,-2em 2em 0 -.5em #0188fb,-3em 0 0 -.5em #0188fb,-2em -2em 0 -.5em #0188fb}37.5%{box-shadow:0 -3em 0 -.5em #0188fb,2em -2em 0 -.5em #0188fb,3em 0 0 0 #0188fb,2em 2em 0 .2em #0188fb,0 3em 0 0 #0188fb,-2em 2em 0 -.5em #0188fb,-3em 0 0 -.5em #0188fb,-2em -2em 0 -.5em #0188fb}50%{box-shadow:0 -3em 0 -.5em #0188fb,2em -2em 0 -.5em #0188fb,3em 0 0 -.5em #0188fb,2em 2em 0 0 #0188fb,0 3em 0 .2em #0188fb,-2em 2em 0 0 #0188fb,-3em 0 0 -.5em #0188fb,-2em -2em 0 -.5em #0188fb}62.5%{box-shadow:0 -3em 0 -.5em #0188fb,2em -2em 0 -.5em #0188fb,3em 0 0 -.5em #0188fb,2em 2em 0 -.5em #0188fb,0 3em 0 0 #0188fb,-2em 2em 0 .2em #0188fb,-3em 0 0 0 #0188fb,-2em -2em 0 -.5em #0188fb}75%{box-shadow:0 -3em 0 -.5em #0188fb,2em -2em 0 -.5em #0188fb,3em 0 0 -.5em #0188fb,2em 2em 0 -.5em #0188fb,0 3em 0 -.5em #0188fb,-2em 2em 0 0 #0188fb,-3em 0 0 .2em #0188fb,-2em -2em 0 0 #0188fb}87.5%{box-shadow:0 -3em 0 0 #0188fb,2em -2em 0 -.5em #0188fb,3em 0 0 -.5em #0188fb,2em 2em 0 -.5em #0188fb,0 3em 0 -.5em #0188fb,-2em 2em 0 0 #0188fb,-3em 0 0 0 #0188fb,-2em -2em 0 .2em #0188fb}100%{box-shadow:0 -3em 0 .2em #0188fb,2em -2em 0 0 #0188fb,3em 0 0 -.5em #0188fb,2em 2em 0 -.5em #0188fb,0 3em 0 -.5em #0188fb,-2em 2em 0 -.5em #0188fb,-3em 0 0 -.5em #0188fb,-2em -2em 0 0 #0188fb}}.luckysheetpopover{position:absolute;background:rgba(0,0,0,.65);color:#fff;font-size:18px;padding:20px 100px;text-align:center;z-index:10000;border-radius:4px;user-select:none;display:none}.luckysheetpopover .luckysheetpopover-btn{position:absolute;right:10px;top:50%;margin-top:-12px;border:1px solid #fff;border-radius:4px;padding:2px 4px;cursor:pointer;font-size:14px}.luckysheetpopover .luckysheetpopover-btn:hover{border:1px solid #fea2a2;color:#fea2a2}.luckysheetPaintCursor{cursor:url(paint_24px.ico),auto}#luckysheet-search-replace .tabBox{margin-top:20px;font-size:0}#luckysheet-search-replace .tabBox span{display:inline-block;text-align:center;width:100px;border:1px solid #d4d4d4;font-size:14px;line-height:2}#luckysheet-search-replace .tabBox span.on{background-color:#8c89fe;border-color:#726efe;color:#fff}#luckysheet-search-replace .ctBox{padding:5px 10px;border:solid 1px #d4d4d4;font-size:14px}#luckysheet-search-replace .inputBox{height:90px;position:relative}#luckysheet-search-replace .inputBox .textboxs{height:30px;line-height:30px}#luckysheet-search-replace .inputBox .checkboxs{height:90px;position:absolute;right:0;top:0}#luckysheet-search-replace .inputBox .checkboxs div{height:30px;line-height:30px}#luckysheet-search-replace .inputBox .checkboxs input[type=checkbox]{float:left;margin-top:9px}#luckysheet-search-replace .btnBox{margin-top:10px}#luckysheet-search-replace .btnBox button{margin:0 2.5px}#luckysheet-search-replace #searchAllbox{height:210px;border:1px solid #d4d4d4;margin-top:10px;overflow-y:auto;position:relative}#luckysheet-search-replace #searchAllbox .boxTitle{width:100%;height:30px;line-height:29px;padding:0 5px;background-color:#fff;border-bottom:1px solid #d4d4d4;box-sizing:border-box;position:sticky;left:0;top:0}#luckysheet-search-replace #searchAllbox .boxTitle span{display:inline-block;text-align:center}#luckysheet-search-replace #searchAllbox .boxTitle span:nth-of-type(1){width:25%}#luckysheet-search-replace #searchAllbox .boxTitle span:nth-of-type(2){width:25%}#luckysheet-search-replace #searchAllbox .boxTitle span:nth-of-type(3){width:50%}#luckysheet-search-replace #searchAllbox .boxMain .boxItem{height:30px;line-height:29px;border-bottom:1px solid #d4d4d4;padding:0 5px;box-sizing:border-box}#luckysheet-search-replace #searchAllbox .boxMain .boxItem.on{background-color:#8c89fe;color:#fff}#luckysheet-search-replace #searchAllbox .boxMain .boxItem span{display:block;text-align:center;float:left}#luckysheet-search-replace #searchAllbox .boxMain .boxItem span:nth-of-type(1){width:25%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#luckysheet-search-replace #searchAllbox .boxMain .boxItem span:nth-of-type(2){width:25%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#luckysheet-search-replace #searchAllbox .boxMain .boxItem span:nth-of-type(3){width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#luckysheet-search-formula{font-size:12px}#luckysheet-search-formula .inpbox{margin-bottom:5px}#luckysheet-search-formula .inpbox label{display:block;margin-bottom:5px}#luckysheet-search-formula .inpbox input{width:100%;height:24px;line-height:24px;border:1px solid #d4d4d4;padding:0 10px;box-sizing:border-box;font-size:12px}#luckysheet-search-formula .selbox{margin-bottom:5px}#luckysheet-search-formula .selbox select{width:50%;height:24px;line-height:24px;border:1px solid #d4d4d4;box-sizing:border-box;font-size:12px}#luckysheet-search-formula .listbox label{display:block;margin-bottom:5px}#formulaTypeList{width:300px;height:170px;border:1px solid #d4d4d4;overflow-y:scroll}#formulaTypeList .listBox{padding:5px;border-bottom:1px solid #d4d4d4}#formulaTypeList .listBox.on{background-color:#8c89fe;color:#fff}#formulaTypeList .listBox span:nth-of-type(1){display:block}#formulaTypeList .listBox span:nth-of-type(2){display:block}#luckysheet-search-formula-parm{width:502px;font-size:12px}#luckysheet-search-formula-parm .parmListBox{width:500px;padding:5px 0;border:1px solid #d4d4d4}#luckysheet-search-formula-parm .parmBox{height:30px;line-height:30px;margin-bottom:5px}#luckysheet-search-formula-parm .parmBox:last-child{margin-bottom:0}#luckysheet-search-formula-parm .parmBox .name{width:90px;height:30px;padding:0 5px;float:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#luckysheet-search-formula-parm .parmBox .txt{width:198px;height:28px;border:1px solid #d4d4d4;float:left}#luckysheet-search-formula-parm .parmBox .txt input{width:150px;height:28px;padding:0 10px;border:none;outline-style:none;float:left}#luckysheet-search-formula-parm .parmBox .txt i{float:right;margin-top:8px;margin-right:5px}#luckysheet-search-formula-parm .fa-table{cursor:pointer;color:#6598f3}#luckysheet-search-formula-parm .fa-table:hover{color:#ff7e7e}#luckysheet-search-formula-parm .parmBox .val{width:190px;height:30px;line-height:30px;padding:0 5px;float:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#luckysheet-search-formula-parm .formulaDetails{padding:5px}#luckysheet-search-formula-parm .parmDetailsBox{max-height:100px;padding:5px 0 5px 20px;overflow-y:scroll}#luckysheet-search-formula-parm .parmDetailsBox span{display:inline-block}#luckysheet-search-formula-parm .result{padding:5px;border-top:1px solid #d4d4d4}#textCellColor{border:1px solid #d4d4d4;padding:5px 10px}#textCellColor .colorbox{height:30px;line-height:30px;margin-bottom:10px}#textCellColor .colorbox input[type=checkbox]{float:left;margin-top:10px}#textCellColor .colorbox label{display:inline-block;width:80px}#luckysheet-multiRange-dialog input,#luckysheet-singleRange-dialog input{border:1px solid #d4d4d4;padding:0 10px;height:30px}#luckysheet-conditionformat-dialog{font-size:12px}#luckysheet-conditionformat-dialog .box .boxTitleOne{margin:5px 0;font-weight:600}#luckysheet-conditionformat-dialog .box .inpbox{width:198px;height:28px;border:1px solid #d4d4d4}#luckysheet-conditionformat-dialog .box .inpbox input{width:150px;height:28px;padding:0 10px;border:none;outline-style:none;float:left}#luckysheet-conditionformat-dialog .box .inpbox2{float:left;width:108px;height:28px;border:1px solid #d4d4d4}#luckysheet-conditionformat-dialog .box .inpbox2 input{width:60px;height:28px;padding:0 10px;border:none;outline-style:none;float:left}#luckysheet-conditionformat-dialog .box i.fa-table{float:right;margin-top:8px;margin-right:5px}#luckysheet-conditionformat-dialog .box .fa-table{cursor:pointer;color:#6598f3}#luckysheet-conditionformat-dialog .box .fa-table:hover{color:#ff7e7e}#luckysheet-conditionformat-dialog .box #daterange-btn{width:188px;height:28px;padding:0 5px;line-height:28px;border:1px solid #d4d4d4;cursor:pointer}#luckysheet-conditionformat-dialog .box .selectbox{width:150px;height:30px}#luckysheet-icon-dataBar-menuButton .bgImgBox{width:28px;height:26px;background:url(../plugins/images/CFdataBar.png) no-repeat}#luckysheet-icon-colorGradation-menuButton .bgImgBox{width:28px;height:26px;background:url(../plugins/images/CFcolorGradation.png) no-repeat}#luckysheet-administerRule-dialog{font-size:12px}#luckysheet-administerRule-dialog .chooseSheet{height:24px;line-height:24px;margin-bottom:5px}#luckysheet-administerRule-dialog .chooseSheet select{height:24px;padding:0 5px;box-sizing:border-box;font-size:12px}#luckysheet-administerRule-dialog .ruleBox{border:1px solid #d4d4d4}#luckysheet-administerRule-dialog .ruleBox .ruleBtn{padding:2.5px 5px;border-bottom:1px solid #d4d4d4}#luckysheet-administerRule-dialog .ruleBox .ruleBtn button{margin-right:10px;font-size:12px}#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle{height:30px;padding:0 10px;border-bottom:1px solid #d4d4d4}#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span{display:block;height:100%;line-height:29px;float:left}#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span:nth-of-type(1){width:30%}#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span:nth-of-type(2){width:20%}#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span:nth-of-type(3){width:45%}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox{height:150px;overflow-y:scroll}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item{height:24px;padding:2.5px 10px;border-bottom:1px solid #d4d4d4}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item.on{background-color:#8c89fe}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleName{width:30%;height:100%;line-height:24px;padding-right:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;float:left;box-sizing:border-box}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item.on .ruleName{color:#fff}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .format{width:20%;height:100%;line-height:24px;float:left;position:relative}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .format .colorbox{display:inline-block;width:16px;height:16px;border:solid 1px #d0d0d0;margin:3px 5px;cursor:pointer}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange{width:45%;height:100%;border:1px solid #d4d4d4;float:left;margin-left:10px;box-sizing:border-box;background-color:#fff}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange input{width:130px;height:22px;padding:0 5px;border:none;outline-style:none;float:left}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange i.fa-table{float:right;cursor:pointer;color:#6598f3;margin-top:6px;margin-right:5px}#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange i.fa-table:hover{color:#ff7e7e}.luckysheet-newEditorRule-dialog{font-size:12px}.luckysheet-newEditorRule-dialog .boxTitle{margin-bottom:5px}.luckysheet-newEditorRule-dialog .ruleTypeBox{border:1px solid #d4d4d4;margin-bottom:10px}.luckysheet-newEditorRule-dialog .ruleTypeBox .ruleTypeItem{padding:3px 5px;cursor:pointer}.luckysheet-newEditorRule-dialog .ruleTypeBox .ruleTypeItem.on{background-color:#7c79fe;color:#fff}.luckysheet-newEditorRule-dialog .ruleTypeBox .ruleTypeItem .icon{font-family:Arial,Helvetica,sans-serif}.luckysheet-newEditorRule-dialog .ruleExplainBox{border:1px solid #d4d4d4;padding:10px}.luckysheet-newEditorRule-dialog .ruleExplainBox .title{display:block;font-weight:600;margin-bottom:5px}.luckysheet-newEditorRule-dialog .ruleExplainBox select{height:30px;font-size:12px;float:left;margin-right:5px}.luckysheet-newEditorRule-dialog .ruleExplainBox .inpbox{width:100px;height:30px;border:1px solid #d4d4d4;box-sizing:border-box;font-size:12px;float:left}.luckysheet-newEditorRule-dialog .ruleExplainBox .inpbox input{width:70px;height:100%;border:none;outline-style:none;padding:0 5px}.luckysheet-newEditorRule-dialog .ruleExplainBox .txt{display:block;height:100%;line-height:30px;float:left;margin:0 5px}.luckysheet-newEditorRule-dialog .ruleExplainBox #isPercent{float:left;margin:9px 0 8px 10px}.luckysheet-newEditorRule-dialog i.fa-table{float:right;margin-top:8px;margin-right:5px}.luckysheet-newEditorRule-dialog .fa-table{cursor:pointer;color:#6598f3}.luckysheet-newEditorRule-dialog .fa-table:hover{color:#ff7e7e}.luckysheet-newEditorRule-dialog .iconsBox{height:30px;margin-bottom:5px;position:relative}.luckysheet-newEditorRule-dialog .iconsBox label{display:block;width:80px;height:30px;line-height:30px;float:left}.luckysheet-newEditorRule-dialog .iconsBox .showbox{width:150px;height:20px;padding:4px 4px 4px 10px;border:1px solid #e5e5e5;background-color:#f5f5f5;float:left;cursor:pointer}.luckysheet-newEditorRule-dialog .iconsBox .showbox .model{width:125px;height:20px;background:url(../plugins/images/CFicons.png) no-repeat;background-size:256px;float:left}.luckysheet-newEditorRule-dialog .iconsBox ul{display:none;width:164px;max-height:150px;overflow-y:auto;background-color:#fff;border:1px solid #e5e5e5;position:absolute;left:80px;top:30px;list-style:none;margin:0;padding:0}.luckysheet-newEditorRule-dialog .iconsBox ul li{padding:5px 10px;background-color:#fff;cursor:pointer}.luckysheet-newEditorRule-dialog .iconsBox ul li:hover{background-color:#dfdfdf}.luckysheet-newEditorRule-dialog .iconsBox ul li div{width:125px;height:20px;background:url(../plugins/images/CFicons.png) no-repeat;background-size:256px}#luckysheet-CFicons-dialog .box{padding:10px;border:1px solid #dfdfdf;font-size:14px}#luckysheet-CFicons-dialog .box .title{height:20px;line-height:20px;padding:0 10px;background-color:#ebebeb}#luckysheet-CFicons-dialog .box .list{width:300px;padding:5px 0}#luckysheet-CFicons-dialog .box .list .left{width:50%;float:left}#luckysheet-CFicons-dialog .box .list .right{width:50%;float:right}#luckysheet-CFicons-dialog .box .list .item{width:125px;height:20px;padding:2.5px 10px;background-color:#fff;cursor:pointer}#luckysheet-CFicons-dialog .box .list .item:hover{background-color:#dfdfdf}#luckysheet-CFicons-dialog .box .list .item div{width:125px;height:20px;background:url(../plugins/images/CFicons.png) no-repeat;background-size:256px}#luckysheet-modal-dialog-slider-alternateformat{width:280px;font-size:12px}#luckysheet-modal-dialog-slider-alternateformat .luckysheet-modal-dialog-slider-content{background-color:#fff;overflow-y:scroll}#luckysheet-modal-dialog-slider-alternateformat .textTitle{padding:5px 10px;font-weight:600}#luckysheet-alternateformat-range{width:198px;height:28px;border:1px solid #d4d4d4;margin-left:10px}#luckysheet-alternateformat-range input{width:150px;height:28px;padding:0 10px;border:none;outline-style:none;float:left}#luckysheet-alternateformat-range .fa-table{float:right;margin-top:8px;margin-right:5px;cursor:pointer;color:#6598f3}#luckysheet-alternateformat-range .fa-table:hover{color:#ff7e7e}#luckysheet-alternateformat-checkbox{padding:5px 10px;border-top:1px solid #d4d4d4;border-bottom:1px solid #d4d4d4;margin:10px 0}#luckysheet-alternateformat-checkbox div{height:20px;line-height:20px}#luckysheet-alternateformat-checkbox div:first-child{margin-bottom:5px}#luckysheet-alternateformat-checkbox input[type=checkbox]{float:left;cursor:pointer;margin-top:4px}#luckysheet-alternateformat-modelList{padding:0 10px;margin-bottom:10px}#luckysheet-alternateformat-modelCustom{padding:0 10px;margin-bottom:10px}#luckysheet-modal-dialog-slider-alternateformat .modelbox{display:inline-block;width:36px;padding:2px;border:2px solid #fff;box-sizing:border-box;margin-right:4px;margin-bottom:4px;cursor:pointer}#luckysheet-modal-dialog-slider-alternateformat .modelbox.on{border-color:#726efe}#luckysheet-modal-dialog-slider-alternateformat .modelbox .box{width:100%;border:1px solid #d4d4d4;box-sizing:border-box}#luckysheet-modal-dialog-slider-alternateformat .modelbox .box span{display:block;width:100%;height:10px;line-height:9px;text-align:center;border-bottom:1px solid #d4d4d4;box-sizing:border-box}#luckysheet-modal-dialog-slider-alternateformat .modelbox .box span:last-child{line-height:10px;border-bottom:none}#luckysheet-alternateformat-modelToning{padding:10px}#luckysheet-alternateformat-modelToning .toningbox{height:25px;margin-bottom:5px}#luckysheet-alternateformat-modelToning .toningbox .toningShow{width:150px;height:100%;line-height:23px;text-align:center;border:1px solid #d4d4d4;float:left;margin-right:10px}#luckysheet-alternateformat-modelToning .toningbox .luckysheet-color-menu-button-indicator{width:20px;float:left;user-select:none;cursor:pointer}#luckysheet-alternateformat-modelToning .toningbox .luckysheet-color-menu-button-indicator .luckysheet-icon{user-select:none;margin-bottom:-6px}#luckysheet-alternateformat-colorSelect-dialog .currenColor{font-size:12px;margin-bottom:5px}#luckysheet-alternateformat-colorSelect-dialog .currenColor span{display:inline-block;width:16px;height:16px;border:solid 1px #d0d0d0;margin-left:5px;margin-bottom:-5px;cursor:pointer}#luckysheet-alternateformat-rangeDialog input{border:1px solid #d4d4d4;padding:0 10px;height:30px}#luckysheet-ifFormulaGenerator-dialog{font-size:12px}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox{height:30px;margin-bottom:10px}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox label{display:block;width:100px;height:100%;line-height:30px;padding:0 5px;text-align:right;float:left}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox{width:150px;height:100%;padding:0 10px;border:1px solid #d4d4d4;box-sizing:border-box;float:left}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox input{width:100px;height:100%;padding:0;border:none;outline-style:none;background:0 0;float:left}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox i.fa-table{font-size:14px;color:#6598f3;float:right;margin-right:0;margin-top:8px;cursor:pointer}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox i.fa-table:hover{color:#ff7e7e}#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox span.text{height:100%;line-height:30px;padding:0 5px;float:left}#luckysheet-ifFormulaGenerator-dialog #largeRange,#luckysheet-ifFormulaGenerator-dialog #smallRange{width:100px;height:100%;padding:0 10px;border:1px solid #d4d4d4;box-sizing:border-box;float:left}#luckysheet-ifFormulaGenerator-dialog #rangeAssess{height:100%;line-height:30px;float:left;margin-left:20px}#luckysheet-ifFormulaGenerator-dialog #rangeAssess i.fa-table{color:#6598f3;cursor:pointer}#luckysheet-ifFormulaGenerator-dialog #rangeAssess i.fa-table:hover{color:#ff7e7e}#luckysheet-ifFormulaGenerator-dialog #DivisionMethod{width:100px;height:100%;border:1px solid #d4d4d4;box-sizing:border-box;float:left}#luckysheet-ifFormulaGenerator-dialog #DivisionMethodVal{width:120px;height:100%;border:1px solid #d4d4d4;padding:0 10px;box-sizing:border-box;float:left;margin-left:10px}#luckysheet-ifFormulaGenerator-dialog #createBtn{width:100px;height:100%;line-height:30px;border-radius:5px;text-align:center;font-size:14px;color:#fff;background-color:#8c89fe;float:right;cursor:pointer}#luckysheet-ifFormulaGenerator-dialog .ifList{border-top:1px solid #d4d4d4;height:180px;padding:10px;overflow-y:scroll}#luckysheet-ifFormulaGenerator-dialog .ifList .item{height:30px;margin-bottom:10px}#luckysheet-ifFormulaGenerator-dialog .ifList .item input{width:80px;height:100%;border:1px solid #d4d4d4;padding:0 5px;background:0 0;box-sizing:border-box;float:left}#luckysheet-ifFormulaGenerator-dialog .ifList .item input.markText{width:140px}#luckysheet-ifFormulaGenerator-dialog .ifList .item select{width:50px;height:100%;padding:0 5px;border:1px solid #d4d4d4;box-sizing:border-box;float:left;margin:0 10px}#luckysheet-ifFormulaGenerator-dialog .ifList .item span{height:100%;line-height:30px;float:left;margin:0 10px}#luckysheet-ifFormulaGenerator-dialog .ifList .item i.fa-remove{font-size:16px;float:left;margin-left:15px;margin-top:7px;color:#d6d6d6;cursor:pointer}#luckysheet-ifFormulaGenerator-dialog .ifList .item i.fa-remove:hover{color:#333}#luckysheet-ifFormulaGenerator-multiRange-dialog input,#luckysheet-ifFormulaGenerator-singleRange-dialog input{border:1px solid #d4d4d4;padding:0 10px;height:30px}.pictorialBarUploadImg:hover{border:1px solid #ccc!important;background:#efefef}#luckysheet-dropCell-icon #icon_dropCell{width:25px;height:15px;background-image:url(../plugins/images/icon_dropCell.png);background-repeat:no-repeat;background-position:center;background-size:100% 100%}#luckysheet-locationCell-dialog .listbox{border:1px solid #dfdfdf;padding:10px;font-size:14px;color:#000}#luckysheet-locationCell-dialog .listbox .listItem{padding:5px 0}#luckysheet-locationCell-dialog .listbox .listItem input[type=radio]{float:left;margin-top:5px}#luckysheet-locationCell-dialog .listbox .listItem .subbox{height:30px;padding:0 10px}#luckysheet-locationCell-dialog .listbox .listItem .subbox .subItem{float:left;margin-right:5px}#luckysheet-moreFormat-dialog{font-size:14px;color:#000}#luckysheet-moreFormat-dialog .decimal{margin-bottom:5px;height:30px;line-height:30px}#luckysheet-moreFormat-dialog .decimal input{width:80px;height:24px;padding:0 5px}#luckysheet-moreFormat-dialog .listbox{border:1px solid #666;height:240px;overflow-y:auto}#luckysheet-moreFormat-dialog .listbox .listItem{height:30px;padding:0 20px 0 10px;border-bottom:1px solid #dfdfdf}#luckysheet-moreFormat-dialog .listbox .listItem.on{background-color:#7c79fe;color:#fff}#luckysheet-moreFormat-dialog .listbox .listItem .name{line-height:29px;float:left}#luckysheet-moreFormat-dialog .listbox .listItem .value{line-height:30px;float:right;color:gray}#luckysheet-moreFormat-dialog .listbox .listItem.on .value{color:#fff}#luckysheet-splitColumn-dialog{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#luckysheet-splitColumn-dialog .box{font-size:14px}#luckysheet-splitColumn-dialog .box .boxTitle{padding:5px}#luckysheet-splitColumn-dialog .box .boxMain{padding:5px;border:1px solid #dfdfdf}#luckysheet-splitColumn-dialog .box input[type=checkbox]{float:left;margin-top:5px}#luckysheet-splitColumn-dialog .box .boxMain input[type=text]{margin-left:5px;width:50px;padding:0 5px}#luckysheet-splitColumn-dialog .box #splitColumnData{height:100px;overflow-y:auto}#luckysheet-splitColumn-dialog .box #splitColumnData table{border-collapse:collapse}#luckysheet-splitColumn-dialog .box #splitColumnData td{border:1px solid #333}.luckysheet-datavisual-config .luckysheet-datavisual-accordion-content:last-child{padding-bottom:100px}.luckysheet-postil-dialog-move{position:absolute;margin:0;padding:0;top:0;left:0;bottom:0;right:0;pointer-events:none}.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item{position:absolute;pointer-events:all;cursor:move}.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-t{width:100%;height:3px;border-bottom:1px solid #000;left:0;top:-4px}.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-r{width:3px;height:100%;border-left:1px solid #000;right:-4px;top:0}.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-b{width:100%;height:3px;border-top:1px solid #000;left:0;bottom:-4px}.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-l{width:3px;height:100%;border-right:1px solid #000;left:-4px;top:0}.luckysheet-postil-show-active .luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item{border-color:#0188fb}.luckysheet-postil-dialog-resize{position:absolute;margin:0;padding:0;top:-2px;left:-2px;bottom:-2px;right:-2px;pointer-events:none}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item{position:absolute;height:6px;width:6px;border:1px solid #0188fb;pointer-events:all}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-lt{left:-6px;top:-6px;cursor:se-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-mt{left:50%;top:-6px;margin-left:-4px;cursor:s-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-lm{top:50%;left:-6px;margin-top:-4px;cursor:w-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-rm{top:50%;right:-6px;margin-top:-4px;cursor:w-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-rt{right:-6px;top:-6px;cursor:ne-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-lb{left:-6px;bottom:-6px;cursor:ne-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-mb{left:50%;bottom:-6px;margin-left:-4px;cursor:s-resize}.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-rb{right:-6px;bottom:-6px;cursor:se-resize}.luckysheet-datavisual-config .luckysheet-datavisual-accordion-content:last-child{padding-bottom:100px}.luckysheet-datavisual-left .el-tabs__content{overflow:auto}#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content{width:100%;height:100%;position:absolute;left:0;top:0;cursor:move;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}#luckysheet-modal-dialog-cropping::before{content:"";outline:1px solid #fff;position:absolute;left:33.3%;right:33.3%;top:0;bottom:0;z-index:1;pointer-events:none}#luckysheet-modal-dialog-cropping::after{content:"";outline:1px solid #fff;position:absolute;left:0;right:0;top:33.3%;bottom:33.3%;z-index:1;pointer-events:none}#luckysheet-modal-dialog-cropping .cropping-mask{filter:brightness(.5);position:absolute;background-size:100% 100%;left:0;top:0}#luckysheet-modal-dialog-cropping .cropping-content{position:absolute;overflow:hidden;background-position:0 0;left:0;top:0;width:100%;height:100%}#luckysheet-modal-dialog-cropping .luckysheet-modal-dialog-resize{border:none;position:absolute;margin:0;padding:0;top:0;left:0;bottom:0;right:0;pointer-events:all}#luckysheet-modal-dialog-cropping .resize-item{width:0;height:0;background:0 0;border:none;position:absolute;z-index:3}#luckysheet-modal-dialog-cropping .resize-item::before{content:"";display:block;position:absolute;background:#000}#luckysheet-modal-dialog-cropping .resize-item::after{content:"";display:block;position:absolute;background:#000}#luckysheet-modal-dialog-cropping .lt{left:0;top:0;cursor:nwse-resize}#luckysheet-modal-dialog-cropping .lt::before{width:18px;height:4px;left:0;top:0;border-right:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .lt::after{width:4px;height:14px;left:0;top:4px;border-right:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .mt{left:50%;top:0;cursor:ns-resize}#luckysheet-modal-dialog-cropping .mt::before{width:18px;height:4px;left:-11px;top:0;border-left:2px solid #fff;border-right:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .rt{right:0;top:0;cursor:nesw-resize}#luckysheet-modal-dialog-cropping .rt::before{width:18px;height:4px;right:0;top:0;border-left:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .rt::after{width:4px;height:14px;right:0;top:4px;border-left:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .lm{left:0;top:50%;cursor:ew-resize}#luckysheet-modal-dialog-cropping .lm::before{width:4px;height:18px;left:0;top:-11px;border-right:2px solid #fff;border-top:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .rm{right:0;top:50%;cursor:ew-resize}#luckysheet-modal-dialog-cropping .rm::before{width:4px;height:18px;right:0;top:-11px;border-left:2px solid #fff;border-top:2px solid #fff;border-bottom:2px solid #fff}#luckysheet-modal-dialog-cropping .lb{left:0;bottom:0;cursor:nesw-resize}#luckysheet-modal-dialog-cropping .lb::before{width:18px;height:4px;left:0;bottom:0;border-right:2px solid #fff;border-top:2px solid #fff}#luckysheet-modal-dialog-cropping .lb::after{width:4px;height:14px;left:0;bottom:4px;border-right:2px solid #fff;border-top:2px solid #fff}#luckysheet-modal-dialog-cropping .rb{right:0;bottom:0;cursor:nwse-resize}#luckysheet-modal-dialog-cropping .rb::before{width:18px;height:4px;right:0;bottom:0;border-left:2px solid #fff;border-top:2px solid #fff}#luckysheet-modal-dialog-cropping .rb::after{width:4px;height:14px;right:0;bottom:4px;border-left:2px solid #fff;border-top:2px solid #fff}#luckysheet-modal-dialog-cropping .mb{left:50%;bottom:0;cursor:ns-resize}#luckysheet-modal-dialog-cropping .mb::before{width:18px;height:4px;left:-11px;bottom:0;border-left:2px solid #fff;border-right:2px solid #fff;border-top:2px solid #fff}#luckysheet-modal-dialog-slider-imageCtrl .luckysheet-modal-dialog-slider-content{background-color:#fff}#luckysheet-modal-dialog-slider-imageCtrl .slider-box{border-bottom:1px solid #e1e4e8}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-title{padding:10px 20px;font-weight:600}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-radios{padding:10px 30px}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .radio-item{margin-bottom:10px}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .radio-item:last-child{margin-bottom:0}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .radio-item input{vertical-align:sub}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-checkbox{padding:10px 30px;border-top:1px solid #e1e4e8}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-checkbox input{vertical-align:middle}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-borderConfig{padding:10px 30px}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item{margin-bottom:10px}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item:last-child{margin-bottom:0}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item label{display:inline-block;width:40px}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item input{width:130px;padding:5px}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item .imgItemBorderColor{display:inline-block;width:20px;height:20px;padding:2px;border:1px solid #e1e4e8;vertical-align:middle;cursor:pointer}#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item .imgItemBorderColor span{display:block;width:100%;height:100%}#luckysheet-imageCtrl-colorSelect-dialog .currenColor{font-size:12px;margin-bottom:5px}#luckysheet-imageCtrl-colorSelect-dialog .currenColor span{display:inline-block;width:16px;height:16px;border:solid 1px #d0d0d0;margin-left:5px;margin-bottom:-5px;cursor:pointer}#luckysheet-modal-dialog-activeImage,#luckysheet-modal-dialog-cropping{background:0 0;box-shadow:none}.luckysheet-modal-dialog-image{border:none;box-shadow:none;background:0 0;box-shadow:none;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content,.luckysheet-modal-dialog-image .luckysheet-modal-dialog-content{background:0 0}.cell-date-picker{position:absolute;display:none}#luckysheet-insertLink-dialog{user-select:none}#luckysheet-insertLink-dialog .box{font-size:12px}#luckysheet-insertLink-dialog .box-item{height:30px;line-height:30px;margin-bottom:10px}#luckysheet-insertLink-dialog .box-item label{display:inline-block;width:80px;text-align:right;margin-right:10px}#luckysheet-insertLink-dialog .box-item input{width:200px;height:30px;padding:0 10px;border:1px solid #d4d4d4;outline-style:none;box-sizing:border-box}#luckysheet-insertLink-dialog .box-item select{width:200px;height:30px;padding:0 5px;border:1px solid #d4d4d4;outline-style:none;box-sizing:border-box}#luckysheet-dataVerification-dialog{user-select:none}#luckysheet-dataVerification-dialog .box{font-size:12px}#luckysheet-dataVerification-dialog .box select{width:100%;height:30px;border-color:#d4d4d4;outline-style:none}#luckysheet-dataVerification-dialog .box input::-webkit-input-placeholder{color:#d4d4d4}#luckysheet-dataVerification-dialog .box input:-moz-placeholder{color:#d4d4d4}#luckysheet-dataVerification-dialog .box input::-moz-placeholder{color:#d4d4d4}#luckysheet-dataVerification-dialog .box input:-ms-input-placeholder{color:#d4d4d4}#luckysheet-dataVerification-dialog .box-item{padding:10px;border-bottom:1px solid #e1e4e8}#luckysheet-dataVerification-dialog .box-item .box-item-title{font-size:14px;font-weight:600;margin-bottom:10px}#luckysheet-dataVerification-dialog .box-item .range{width:100%;height:30px;border:1px solid #d4d4d4}#luckysheet-dataVerification-dialog .box-item .range input{width:calc(100% - 30px);height:30px;padding:0 10px;float:left;border:none;outline-style:none;box-sizing:border-box}#luckysheet-dataVerification-dialog .box-item .range i.fa-table{float:right;margin-top:9px;margin-right:5px;cursor:pointer;color:#6598f3}#luckysheet-dataVerification-dialog .box-item .show-box{margin-top:10px}#luckysheet-dataVerification-dialog .box-item .check-box{height:30px;line-height:30px;margin-bottom:10px}#luckysheet-dataVerification-dialog .box-item .check-box:last-child{margin-bottom:0}#luckysheet-dataVerification-dialog .box-item .check-box input{height:30px;padding:0 10px;border:1px solid #d4d4d4;box-sizing:border-box}#luckysheet-dataVerification-dialog .box-item .check{line-height:30px}#luckysheet-dataVerification-dialog .box-item .check input{vertical-align:text-top}#luckysheet-dataVerification-dialog .box-item .input{height:30px;line-height:30px;margin-top:10px}#luckysheet-dataVerification-dialog .box-item .input input{height:30px;padding:4px 10px 4px 10px;border:1px solid #d4d4d4;box-sizing:border-box}#luckysheet-dataVerification-dialog .box-item .input1 input{width:150px}#luckysheet-dataVerification-dialog .box-item .input2 input{width:100%}#luckysheet-dataVerification-dialog .box-item .input span{display:inline-block;width:30px;text-align:center}#luckysheet-dataVerification-dialog .data-verification-hint-text{width:100%;height:30px;border:1px solid #d4d4d4;margin-top:10px}#luckysheet-dataVerification-dialog .data-verification-hint-text input{display:block;width:100%;height:100%;padding:0 10px;border:none;outline-style:none;box-sizing:border-box}#luckysheet-dataVerification-dialog .show-box .show-box-item{display:none}#luckysheet-dataVerificationRange-dialog input{height:30px;padding:0 10px;border:1px solid #d4d4d4;outline-style:none}#luckysheet-dataVerification-dropdown-btn{display:none;width:20px;height:20px;background-color:#fff;position:absolute;z-index:10;overflow:hidden}#luckysheet-dataVerification-dropdown-btn::after{content:'';width:10px;height:10px;background:url(arrow-down.png) center no-repeat;position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}#luckysheet-dataVerification-dropdown-List{display:none;background-color:#fff;border:1px solid #ccc;box-shadow:0 2px 4px rgba(0,0,0,.2);position:absolute;z-index:10000;box-sizing:border-box}#luckysheet-dataVerification-dropdown-List .dropdown-List-item{padding:5px 10px;box-sizing:border-box;cursor:pointer}#luckysheet-dataVerification-dropdown-List .dropdown-List-item:hover{background-color:#e1e1e1}#luckysheet-dataVerification-showHintBox{display:none;padding:10px;background-color:#fff;border:1px solid #ccc;box-shadow:0 2px 4px rgba(0,0,0,.2);position:absolute;z-index:1000;user-select:none;cursor:default;white-space:nowrap}.luckysheet-print-viewList{position:relative;float:right;width:126px;height:22px;line-height:22px;text-align:center;white-space:nowrap;overflow:hidden;display:flex;align-items:center;user-select:none}.luckysheet-print-viewBtn{position:absolute;top:0;left:0;width:42px;height:22px;align-items:center;justify-content:center;cursor:pointer}.luckysheet-print-viewBtn .iconfont{font-size:22px}.luckysheet-print-viewBtn:hover{background:#e1e4e8}.luckysheet-print-viewBtn-active{background:#dcdcdc;cursor:default}.luckysheet-print-viewBtn-active:hover{background:#dcdcdc}.luckysheet-print-viewNormal{left:0}.luckysheet-print-viewLayout{left:42px}.luckysheet-print-viewPage{left:84px}#luckysheet-modal-dialog-slider-protection .luckysheet-modal-dialog-slider-content{background:#fff}.luckysheet-slider-protection-config{position:absolute;width:100%}.luckysheet-slider-protection-row{position:relative;width:98%;height:35px;left:1%}.luckysheet-slider-protection-column{position:absolute;height:100%}.luckysheet-protection-rangeItem-dialog input,.luckysheet-protection-rangeItem-dialog textarea,.luckysheet-protection-sheet-validation input,.luckysheet-slider-protection-config input,.luckysheet-slider-protection-config textarea{border:1px solid #d4d4d4;outline:0}.luckysheet-protection-rangeItem-dialog input:focus,.luckysheet-protection-rangeItem-dialog textarea:focus,.luckysheet-protection-sheet-validation input:focus,.luckysheet-slider-protection-config input:focus,.luckysheet-slider-protection-config textarea:focus{border:1px solid #0389fb;outline:0}.luckysheet-protection-input{width:100%;height:19px;position:relative}.luckysheet-protection-textarea{width:100%;height:47px;position:relative;resize:none}.luckysheet-protection-column-2x{width:20%}.luckysheet-protection-column-3x{width:30%}.luckysheet-protection-column-4x{width:40%}.luckysheet-protection-column-5x{width:50%}.luckysheet-protection-column-6x{width:60%}.luckysheet-protection-column-7x{width:70%}.luckysheet-protection-column-8x{width:80%}.luckysheet-protection-column-9x{width:90%}.luckysheet-protection-column-10x{width:100%}.luckysheet-protection-column-left{text-align:left}.luckysheet-protection-column-center{text-align:center}.luckysheet-protection-column-right{text-align:right}.luckysheet-slider-protection-ok{position:absolute;width:100%;height:100%;background:#0188fb;color:#fff;text-align:center;line-height:45px;font-size:16px;cursor:pointer}.luckysheet-slider-protection-ok:hover{background:#0181ee}.luckysheet-slider-protection-ok:active{background:#0074da}.luckysheet-slider-protection-cancel{position:absolute;width:100%;height:100%;background:#e6e6e6;color:#353535;text-align:center;line-height:45px;font-size:16px;cursor:pointer}.luckysheet-slider-protection-cancel:hover{background:#d6d6d6}.luckysheet-slider-protection-cancel:active{background:#c7c7c7}.luckysheet-slider-protection-addRange{line-height:23px;font-size:12px;top:2px;height:23px}.luckysheet-protection-rangeItem{position:relative;width:100%;height:30px;line-height:30px;font-size:12px;overflow:hidden}.luckysheet-protection-rangeItem:hover{background:#d5d5d5}.luckysheet-protection-rangeItem>div{position:absolute;height:100%;text-align:center;overflow:hidden}.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-del{left:5px;top:5px;height:20px;width:20px;font-size:14px;line-height:20px;cursor:pointer}.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-name{left:30px;width:80px;text-align:left}.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-range{left:110px;width:120px}.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-update{left:230px;width:30px;font-size:14px;top:5px;height:20px;width:20px;line-height:20px;cursor:pointer}.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-del:hover,.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-update:hover{background:#0181ee;color:#fff}.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-del:active,.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-update:active{background:#0074da;color:#fff}.luckysheet-protection-rangeItem-content{position:relative;width:350px;height:270px}#luckysheet-protection-rangeItem-dialog .luckysheet-slider-protection-column .range{width:100%;height:30px;border:1px solid #d4d4d4}#luckysheet-protection-rangeItem-dialog .luckysheet-slider-protection-column .range input{width:calc(100% - 30px);height:30px;padding:0 10px;float:left;border:none;outline-style:none;box-sizing:border-box}#luckysheet-protection-rangeItem-dialog .luckysheet-slider-protection-column .range i.fa-table{float:right;margin-top:9px;margin-right:5px;cursor:pointer;color:#6598f3}.luckysheet-protection-rangeItemTextarea{width:100%;height:120px;position:relative;resize:none}.luckysheet-protection-rangeItemiInput{width:100%;height:23px;position:relative}.luckysheet-protection-sheet-validation{width:390px;height:180px;display:none}.luckysheet-zoom-content{position:relative;float:right;width:210px;height:22px;line-height:22px;text-align:right;padding-right:10px;white-space:nowrap;overflow:hidden;display:flex;align-items:center;user-select:none}.luckysheet-zoom-content .luckysheet-zoom-minus{position:absolute;top:0;left:0;width:20px;height:20px;cursor:pointer;display:flex;align-items:center;justify-content:center}.luckysheet-zoom-content .luckysheet-zoom-minus-icon{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIycHgiIHZpZXdCb3g9IjAgMCAxNCAyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA2MyAoOTI0NDUpIC0gaHR0cHM6Ly9za2V0Y2guY29tIC0tPgogICAgPHRpdGxlPnJpcWlxdWppYW7lpIfku70gNDU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iMjAyMC8wOC8xNCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IueUu+adv+Wkh+S7vS0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcwNC4wMDAwMDAsIC0xMDY0LjAwMDAwMCkiIGZpbGw9IiM0NDRENUEiPgogICAgICAgICAgICA8ZyBpZD0icmlxaXF1amlhbuWkh+S7vS0xMjYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2OTkuMDAwMDAwLCAxMDUzLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPGcgaWQ9Iue8lue7hCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMDAwMDAsIDExLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==);width:14px;height:2px}.luckysheet-zoom-content .luckysheet-zoom-minus:hover{background-color:#e1e4e8}.luckysheet-zoom-content .luckysheet-zoom-slider{position:absolute;top:0;left:25px;width:100px;height:100%;display:flex;align-items:center}.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-line{position:absolute;top:10px;width:100px;height:2px;background:#e1e4e8}.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-cursor{position:absolute;top:7px;width:8px;height:8px;border-radius:8px;background:#b5bdb8;cursor:pointer;z-index:2;transition:all .3s}.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-cursor:hover{transform:scale(1.2);transform-origin:center center;background:#a0a0a0}.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-hundred{position:absolute;top:9px;width:2px;height:4px;left:49px;background:#1e1e1f}.luckysheet-zoom-content .luckysheet-zoom-plus{position:absolute;top:0;left:130px;width:20px;height:20px;cursor:pointer;display:flex;align-items:center;justify-content:center}.luckysheet-zoom-content .luckysheet-zoom-plus .luckysheet-zoom-plus-icon{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYzICg5MjQ0NSkgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+cmlxaXF1amlhbuWkh+S7vSA0NjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSIyMDIwLzA4LzE0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i55S75p2/5aSH5Lu9LTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xODQ4LjAwMDAwMCwgLTEwNTguMDAwMDAwKSIgZmlsbD0iIzQ0NEQ1QSI+CiAgICAgICAgICAgIDxnIGlkPSJyaXFpcXVqaWFu5aSH5Lu9LTExOSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTg0My4wMDAwMDAsIDEwNTMuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0i57yW57uEIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LjAwMDAwMCwgNS4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cmVjdCBpZD0i55+p5b2iIiB4PSIwIiB5PSI2IiB3aWR0aD0iMTQiIGhlaWdodD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuMDAwMDAwLCA3LjAwMDAwMCkgcm90YXRlKC0yNzAuMDAwMDAwKSB0cmFuc2xhdGUoLTcuMDAwMDAwLCAtNy4wMDAwMDApICIgeD0iMCIgeT0iNiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);width:14px;height:14px}.luckysheet-zoom-content .luckysheet-zoom-plus:hover{background-color:#e1e4e8}.luckysheet-zoom-content .luckysheet-zoom-ratioText{position:absolute;top:0;left:155px;width:60px;color:#1e1e1f;font-size:12px;text-align:left;cursor:pointer}.luckysheet-zoom-content .luckysheet-zoom-ratioText:hover{background-color:#e1e4e8}.flatpickr-calendar{background:0 0;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-box-shadow:0 3px 13px rgba(0,0,0,.08);box-shadow:0 3px 13px rgba(0,0,0,.08)}.flatpickr-calendar.inline,.flatpickr-calendar.open{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasTime .dayContainer,.flatpickr-calendar .hasWeeks .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #eceef1}.flatpickr-calendar.hasTime .flatpickr-innerContainer{border-bottom:0}.flatpickr-calendar.hasTime .flatpickr-time{border:1px solid #eceef1}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:after,.flatpickr-calendar:before{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.arrowRight:after,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.rightMost:before{left:auto;right:22px}.flatpickr-calendar.arrowCenter:after,.flatpickr-calendar.arrowCenter:before{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:after,.flatpickr-calendar.arrowTop:before{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#eceef1}.flatpickr-calendar.arrowTop:after{border-bottom-color:#eceef1}.flatpickr-calendar.arrowBottom:after,.flatpickr-calendar.arrowBottom:before{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#eceef1}.flatpickr-calendar.arrowBottom:after{border-top-color:#eceef1}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{border-radius:5px 5px 0 0;background:#eceef1;color:#5a6171;fill:#5a6171;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-next-month,.flatpickr-months .flatpickr-prev-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#5a6171;fill:#5a6171}.flatpickr-months .flatpickr-next-month.flatpickr-disabled,.flatpickr-months .flatpickr-prev-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-next-month i,.flatpickr-months .flatpickr-prev-month i{position:relative}.flatpickr-months .flatpickr-next-month.flatpickr-prev-month,.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-next-month.flatpickr-next-month,.flatpickr-months .flatpickr-prev-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-next-month:hover,.flatpickr-months .flatpickr-prev-month:hover{color:#bbb}.flatpickr-months .flatpickr-next-month:hover svg,.flatpickr-months .flatpickr-prev-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-next-month svg,.flatpickr-months .flatpickr-prev-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-next-month svg path,.flatpickr-months .flatpickr-prev-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-inner-spin-button,.numInputWrapper input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(72,72,72,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(72,72,72,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(72,72,72,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(90,97,113,.5)}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#5a6171}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#5a6171}.flatpickr-current-month input.cur-year{background:0 0;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(90,97,113,.5);background:0 0;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:#eceef1;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:0;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:active,.flatpickr-current-month .flatpickr-monthDropdown-months:focus{outline:0}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:#eceef1;outline:0;padding:0}.flatpickr-weekdays{background:#eceef1;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:#eceef1;color:#5a6171;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px;border-left:1px solid #eceef1;border-right:1px solid #eceef1}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #eceef1;box-shadow:-1px 0 0 #eceef1}.flatpickr-day{background:0 0;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#484848;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day.nextMonthDay:focus,.flatpickr-day.nextMonthDay:hover,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.today.inRange,.flatpickr-day:focus,.flatpickr-day:hover{cursor:pointer;outline:0;background:#e2e2e2;border-color:#e2e2e2}.flatpickr-day.today{border-color:#bbb}.flatpickr-day.today:focus,.flatpickr-day.today:hover{border-color:#bbb;background:#bbb;color:#fff}.flatpickr-day.endRange,.flatpickr-day.endRange.inRange,.flatpickr-day.endRange.nextMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.endRange:focus,.flatpickr-day.endRange:hover,.flatpickr-day.selected,.flatpickr-day.selected.inRange,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.selected:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange,.flatpickr-day.startRange.inRange,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.startRange:focus,.flatpickr-day.startRange:hover{background:#ff5a5f;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#ff5a5f}.flatpickr-day.endRange.startRange,.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.endRange.endRange,.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #ff5a5f;box-shadow:-10px 0 0 #ff5a5f}.flatpickr-day.endRange.startRange.endRange,.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e2e2e2,5px 0 0 #e2e2e2;box-shadow:-5px 0 0 #e2e2e2,5px 0 0 #e2e2e2}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.nextMonthDay,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.prevMonthDay{color:rgba(72,72,72,.3);background:0 0;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(72,72,72,.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #ff5a5f,5px 0 0 #ff5a5f;box-shadow:-5px 0 0 #ff5a5f,5px 0 0 #ff5a5f}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;border-left:1px solid #eceef1}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(72,72,72,.3);background:0 0;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;background:#fff;border-bottom:1px solid #eceef1}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background:#fff;border-radius:0 0 5px 5px}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#484848}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#484848}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:0 0;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#484848;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-am-pm,.flatpickr-time .flatpickr-time-separator{height:inherit;float:left;line-height:inherit;color:#484848;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time .flatpickr-am-pm:focus,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time input:hover{background:#eaeaea}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}span.flatpickr-day.selected{font-weight:700} \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/css/menuSprite.svg b/resources/assets/statics/public/js/luckysheet/css/menuSprite.svg new file mode 100644 index 000000000..b32266608 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/css/menuSprite.svg @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diagram_icon_18dp + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Artboard 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +slide_18_18 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ic_process_1_18px + +ic_timeline_1_18px + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/css/paint_16px.ico b/resources/assets/statics/public/js/luckysheet/css/paint_16px.ico new file mode 100644 index 000000000..7ae58fc45 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/paint_16px.ico differ diff --git a/resources/assets/statics/public/js/luckysheet/css/paint_24px.ico b/resources/assets/statics/public/js/luckysheet/css/paint_24px.ico new file mode 100644 index 000000000..c816fcc15 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/paint_24px.ico differ diff --git a/resources/assets/statics/public/js/luckysheet/css/paint_32px.ico b/resources/assets/statics/public/js/luckysheet/css/paint_32px.ico new file mode 100644 index 000000000..8044fff70 Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/paint_32px.ico differ diff --git a/resources/assets/statics/public/js/luckysheet/css/sprite38.svg b/resources/assets/statics/public/js/luckysheet/css/sprite38.svg new file mode 100644 index 000000000..741d72b60 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/css/sprite38.svg @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diagram_icon_18dp + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ic_process_1_18px + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ic_timeline_1_18px + Artboard 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + +slide_18_18 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/css/waffle_sprite.png b/resources/assets/statics/public/js/luckysheet/css/waffle_sprite.png new file mode 100644 index 000000000..336ce4f1d Binary files /dev/null and b/resources/assets/statics/public/js/luckysheet/css/waffle_sprite.png differ diff --git a/resources/assets/statics/public/js/luckysheet/demoData/demoFeature.js b/resources/assets/statics/public/js/luckysheet/demoData/demoFeature.js new file mode 100644 index 000000000..c404cb39f --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/demoFeature.js @@ -0,0 +1,42 @@ + +// Features specially written for demo + +(function() { + + // language + function language(params) { + + var lang = navigator.language||navigator.userLanguage;//常规浏览器语言和IE浏览器 + lang = lang.substr(0, 2);//截取lang前2位字符 + + return lang; + + } + // Tencent Forum Link Button + function supportButton() { + const text = language() === 'zh' ? '反馈' : 'Forum'; + const link = language() === 'zh' ? 'https://support.qq.com/product/288322' : 'https://groups.google.com/g/luckysheet'; + + document.querySelector("body").insertAdjacentHTML('beforeend', ''+ text +''); + } + + supportButton() + + /** + * Get url parameters + */ + function getRequest() { + var vars = {}; + var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, + function(m,key,value) { + vars[key] = value; + }); + return vars; + } + + window.luckysheetDemoUtil = { + language:language, + getRequest:getRequest + } + +})() \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetCell.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetCell.js new file mode 100644 index 000000000..ed73a0746 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetCell.js @@ -0,0 +1,1578 @@ +window.sheetCell = { + "name": "Cell", + "config": { + "merge": { + "13_5": { + "r": 13, + "c": 5, + "rs": 3, + "cs": 1 + }, + "13_7": { + "r": 13, + "c": 7, + "rs": 3, + "cs": 2 + }, + "14_2": { + "r": 14, + "c": 2, + "rs": 1, + "cs": 2 + }, + "15_10": { + "r": 15, + "c": 10, + "rs": 4, + "cs": 3 + } + }, + "borderInfo": [ + { + "rangeType": "cell", + "value": { + "row_index": 3, + "col_index": 3, + "l": { + "style": 10, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 10, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 10, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 10, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 3, + "col_index": 4, + "l": { + "style": 10, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 10, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 10, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 10, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 3, + "col_index": 5, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 3, + "col_index": 6, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 3, + "col_index": 7, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 3, + "col_index": 8, + "l": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 1, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 2, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 3, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 4, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 5, + "l": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 6, + "l": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 1, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 7, + "l": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 1, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 1, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 5, + "col_index": 8, + "l": { + "style": 2, + "color": "rgb(255, 0, 0)" + }, + "r": { + "style": 2, + "color": "rgb(255, 0, 0)" + }, + "t": { + "style": 2, + "color": "rgb(255, 0, 0)" + }, + "b": { + "style": 2, + "color": "rgb(255, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 2, + "l": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "r": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "t": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "b": { + "style": 9, + "color": "rgb(0, 0, 255)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 3, + "l": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "r": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "t": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "b": { + "style": 9, + "color": "rgb(0, 0, 255)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 5, + "l": { + "style": 2, + "color": "rgb(154, 205, 50)" + }, + "t": { + "style": 2, + "color": "rgb(154, 205, 50)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 6, + "r": { + "style": 2, + "color": "rgb(154, 205, 50)" + }, + "t": { + "style": 2, + "color": "rgb(154, 205, 50)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 8, + "r": { + "style": 9, + "color": "rgb(0, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(0, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 9, + "l": { + "style": 9, + "color": "rgb(0, 0, 0)" + }, + "b": { + "style": 9, + "color": "rgb(0, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 8, + "col_index": 2, + "l": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "r": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "t": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "b": { + "style": 9, + "color": "rgb(0, 0, 255)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 8, + "col_index": 3, + "l": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "r": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "t": { + "style": 9, + "color": "rgb(0, 0, 255)" + }, + "b": { + "style": 9, + "color": "rgb(0, 0, 255)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 8, + "col_index": 5, + "l": { + "style": 2, + "color": "rgb(154, 205, 50)" + }, + "b": { + "style": 2, + "color": "rgb(154, 205, 50)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 8, + "col_index": 6, + "r": { + "style": 2, + "color": "rgb(154, 205, 50)" + }, + "b": { + "style": 2, + "color": "rgb(154, 205, 50)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 8, + "col_index": 8, + "r": { + "style": 9, + "color": "rgb(0, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(0, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 8, + "col_index": 9, + "l": { + "style": 9, + "color": "rgb(0, 0, 0)" + }, + "t": { + "style": 9, + "color": "rgb(0, 0, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 2, + "l": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "t": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "b": { + "style": 1, + "color": "rgb(144, 238, 144)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 3, + "r": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "t": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "b": { + "style": 1, + "color": "rgb(144, 238, 144)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 5, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "t": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 6, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "t": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 7, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "t": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 11, + "col_index": 2, + "l": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "t": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "b": { + "style": 1, + "color": "rgb(144, 238, 144)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 11, + "col_index": 3, + "r": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "t": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "b": { + "style": 1, + "color": "rgb(144, 238, 144)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 11, + "col_index": 5, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 11, + "col_index": 6, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 11, + "col_index": 7, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 12, + "col_index": 2, + "l": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "t": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "b": { + "style": 1, + "color": "rgb(144, 238, 144)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 12, + "col_index": 3, + "r": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "t": { + "style": 1, + "color": "rgb(144, 238, 144)" + }, + "b": { + "style": 1, + "color": "rgb(144, 238, 144)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 12, + "col_index": 5, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "b": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 12, + "col_index": 6, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "b": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 12, + "col_index": 7, + "l": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "r": { + "style": 1, + "color": "rgb(205, 205, 0)" + }, + "b": { + "style": 1, + "color": "rgb(205, 205, 0)" + } + } + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "2", + "color": "#000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 3, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 3, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "4", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 4, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "3", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 4, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "3", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 3, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 3, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 5, + 5 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 8, + 8 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 3, + 8 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "4", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 7, + 7 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "1", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 8, + 8 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "5", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 6, + 6 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "6", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 5, + 5 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "3", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 4, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "3", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 4, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 3, + 3 + ], + "column": [ + 3, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "2", + "color": "#ff0000", + "range": [ + { + "row": [ + 5, + 5 + ], + "column": [ + 2, + 9 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "9", + "color": "#ff0000", + "range": [ + { + "row": [ + 5, + 5 + ], + "column": [ + 5, + 5 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "8", + "color": "#ff0000", + "range": [ + { + "row": [ + 5, + 5 + ], + "column": [ + 6, + 6 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "13", + "color": "#ff0000", + "range": [ + { + "row": [ + 5, + 5 + ], + "column": [ + 7, + 7 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "13", + "color": "#ff0000", + "range": [ + { + "row": [ + 6, + 6 + ], + "column": [ + 11, + 11 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "10", + "color": "#ff0000", + "range": [ + { + "row": [ + 5, + 5 + ], + "column": [ + 4, + 4 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "11", + "color": "#ff0000", + "range": [ + { + "row": [ + 5, + 5 + ], + "column": [ + 3, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "11", + "color": "#ff0000", + "range": [ + { + "row": [ + 7, + 8 + ], + "column": [ + 2, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-all", + "style": "3", + "color": "#0000ff", + "range": [ + { + "row": [ + 7, + 8 + ], + "column": [ + 2, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-inside", + "style": "3", + "color": "#0000ff", + "range": [ + { + "row": [ + 7, + 8 + ], + "column": [ + 8, + 9 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-inside", + "style": "9", + "color": "#0000ff", + "range": [ + { + "row": [ + 7, + 8 + ], + "column": [ + 8, + 9 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-inside", + "style": "2", + "color": "#0000ff", + "range": [ + { + "row": [ + 7, + 8 + ], + "column": [ + 8, + 9 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-inside", + "style": "9", + "color": "#0000ff", + "range": [ + { + "row": [ + 7, + 8 + ], + "column": [ + 8, + 9 + ] + } + ] + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 10, + "l": { + "color": "#ff0000", + "style": "13" + }, + "r": { + "color": "#ff0000", + "style": "13" + }, + "t": { + "color": "#ff0000", + "style": "13" + }, + "b": { + "color": "#ff0000", + "style": "13" + } + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 6, + "col_index": 11, + "l": null, + "r": null, + "t": null, + "b": null + } + }, + { + "rangeType": "cell", + "value": { + "row_index": 10, + "col_index": 10, + "l": null, + "r": null, + "t": null, + "b": null + } + }, + { + "rangeType": "range", + "borderType": "border-outside", + "style": "13", + "color": "#00ff00", + "range": [ + { + "row": [ + 10, + 12 + ], + "column": [ + 2, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-horizontal", + "style": "13", + "color": "#00ff00", + "range": [ + { + "row": [ + 10, + 12 + ], + "column": [ + 2, + 3 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-vertical", + "style": "13", + "color": "#ff9900", + "range": [ + { + "row": [ + 10, + 12 + ], + "column": [ + 5, + 7 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-outside", + "style": "13", + "color": "#ff9900", + "range": [ + { + "row": [ + 10, + 12 + ], + "column": [ + 5, + 7 + ] + } + ] + }, + { + "rangeType": "range", + "borderType": "border-none", + "style": "1", + "color": "#ff9900", + "range": [ + { + "row": [ + 19, + 19 + ], + "column": [ + 6, + 6 + ] + } + ] + } + ], + "rowlen": { + "0": 20, + "1": 20, + "2": 20, + "3": 20, + "4": 20, + "5": 20, + "6": 20, + "7": 20, + "8": 20, + "9": 20, + "10": 20, + "11": 20, + "12": 20, + "13": 20, + "14": 20, + "15": 20, + "16": 20, + "17": 31, + "18": 20, + "19": 20, + "20": 20, + "21": 20, + "22": 20, + "23": 20, + "24": 20, + "25": 79, + "26": 20, + "27": 20, + "28": 80, + "29": 36 + }, + "columnlen": { + "0": 131, + "2": 153, + "3": 128, + "4": 136, + "5": 122, + "6": 138, + "7": 131, + "8": 128, + "9": 140, + "10": 144 + }, + "rowhidden": { + "30": 0, + "31": 0 + }, + "customHeight": { + "29": 1 + }, + "customWidth": { + "2": 1 + } + }, + "index": "0", + "zoomRatio": 1, + "order": "0", + "column": 18, + "row": 36, + "status": 1, + "celldata": [{"r":0,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":1,"ct":{"fa":"General","t":"n"},"m":"1"}},{"r":0,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":2,"ct":{"fa":"General","t":"n"},"m":"2"}},{"r":0,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":3,"ct":{"fa":"General","t":"n"},"m":"3"}},{"r":0,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":0,"ct":{"fa":"General","t":"n"},"m":"0","f":"=Formula!D3+Formula!D4"}},{"r":0,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":0,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":0,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":0,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":0,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":0,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":0,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":0,"v":{"v":"Background","ct":{"fa":"General","t":"g"},"m":"Background","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":2,"v":{"bg":"rgb(30, 144, 255)","bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":4,"v":{"bg":"rgb(0, 255, 0)","bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":1,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":2,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":0,"v":{"v":"Border","ct":{"fa":"General","t":"g"},"m":"Border","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":3,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":4,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"ct":{"fa":"General","t":"inlineStr","s":[{"ff":"Arial","fc":"rgb(255, 0, 0)","fs":12,"cl":0,"un":0,"bl":0,"it":0,"v":"Inline"},{"ff":"Arial","fc":"#000000","fs":12,"cl":0,"un":0,"bl":0,"it":0,"v":" "},{"ff":"Arial","fc":"#000000","fs":16,"cl":1,"un":0,"bl":0,"it":1,"v":"Style"},{"ff":"Arial","fc":"#000000","fs":12,"cl":0,"un":0,"bl":0,"it":0,"v":" "},{"ff":"Arial","fc":"#000000","fs":12,"cl":0,"un":0,"bl":1,"it":0,"v":"Cell"}]}}},{"r":5,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":5,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":6,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":7,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":8,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":9,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":10,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":11,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":12,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":13,"c":5,"rs":3,"cs":1}}},{"r":13,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":13,"c":7,"rs":3,"cs":2}}},{"r":13,"c":8,"v":{"mc":{"r":13,"c":7}}},{"r":13,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":13,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":14,"c":0,"v":{"v":"Span","ct":{"fa":"General","t":"g"},"m":"Span","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":14,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":14,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":14,"c":2,"rs":1,"cs":2}}},{"r":14,"c":3,"v":{"mc":{"r":14,"c":2}}},{"r":14,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":14,"c":5,"v":{"mc":{"r":13,"c":5}}},{"r":14,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":14,"c":7,"v":{"mc":{"r":13,"c":7}}},{"r":14,"c":8,"v":{"mc":{"r":13,"c":7}}},{"r":14,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":14,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":5,"v":{"mc":{"r":13,"c":5}}},{"r":15,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":7,"v":{"mc":{"r":13,"c":7}}},{"r":15,"c":8,"v":{"mc":{"r":13,"c":7}}},{"r":15,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":15,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":15,"c":10,"rs":4,"cs":3}}},{"r":15,"c":11,"v":{"mc":{"r":15,"c":10}}},{"r":15,"c":12,"v":{"mc":{"r":15,"c":10}}},{"r":16,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":16,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":15,"c":10}}},{"r":16,"c":11,"v":{"mc":{"r":15,"c":10}}},{"r":16,"c":12,"v":{"mc":{"r":15,"c":10}}},{"r":17,"c":0,"v":{"v":"Font","ct":{"fa":"General","t":"g"},"m":"Font","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":17,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":17,"c":2,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":"11","fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":17,"c":3,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":13,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":17,"c":4,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":9,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":17,"c":5,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":13,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":17,"c":6,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":"rgb(255, 215, 0)","bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":17,"c":7,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(67, 110, 238)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":17,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":17,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":17,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":15,"c":10}}},{"r":17,"c":11,"v":{"mc":{"r":15,"c":10}}},{"r":17,"c":12,"v":{"mc":{"r":15,"c":10}}},{"r":18,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":18,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"mc":{"r":15,"c":10}}},{"r":18,"c":11,"v":{"mc":{"r":15,"c":10}}},{"r":18,"c":12,"v":{"mc":{"r":15,"c":10}}},{"r":19,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":19,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":19,"c":2,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":"rgb(67, 110, 238)","bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(255, 215, 0)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":19,"c":3,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":1,"it":0,"ff":0,"fs":"10","fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":19,"c":4,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":1,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}},{"r":19,"c":5,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"cl":1,"m":"Luckysheet"}},{"r":19,"c":6,"v":{"ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"1","vt":"0","cl":1}},{"r":19,"c":7,"v":{"ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":19,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":19,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":19,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":20,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":21,"c":0,"v":{"v":"Format","ct":{"fa":"General","t":"g"},"m":"Format","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":21,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":21,"c":2,"v":{"ct":{"fa":"##0.00","t":"n"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"0.25","v":0.25}},{"r":21,"c":3,"v":{"ct":{"fa":"$#,##0.00_);($#,##0.00)","t":"n"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"$0.25 ","v":0.25}},{"r":21,"c":4,"v":{"ct":{"fa":"\"$\" 0.00","t":"n"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"$ 0.25","v":0.25}},{"r":21,"c":5,"v":{"ct":{"fa":"0%","t":"n"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"25%","v":0.25}},{"r":21,"c":6,"v":{"ct":{"fa":"# ?/?","t":"n"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":" 1/4","v":0.25}},{"r":21,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":21,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":21,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":21,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":22,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":2,"v":{"ct":{"fa":"0.00E+00","t":"n"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"2.50E-01","v":0.25}},{"r":23,"c":3,"v":{"v":0.25,"ct":{"fa":"0.00","t":"n"},"m":"0.25","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":4,"v":{"ct":{"fa":"AM/PM h:mm:ss","t":"d"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":44032,"m":"AM 12:00:00"}},{"r":23,"c":5,"v":{"ct":{"fa":"yyyy/MM/dd","t":"d"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":44032,"m":"2020/07/20"}},{"r":23,"c":6,"v":{"ct":{"fa":"yyyy\"年\"M\"月\"d\"日\"","t":"d"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":44032,"m":"2020年7月20日"}},{"r":23,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":23,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":24,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":25,"c":0,"v":{"v":"Alignment","ct":{"fa":"General","t":"g"},"m":"Alignment","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":25,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":25,"c":2,"v":{"v":"Top Left","ct":{"fa":"General","t":"g"},"m":"Top Left","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"1","vt":"1"}},{"r":25,"c":3,"v":{"v":"Top Center","ct":{"fa":"General","t":"g"},"m":"Top Center","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"0","vt":"1"}},{"r":25,"c":4,"v":{"v":"Top Right","ct":{"fa":"General","t":"g"},"m":"Top Right","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"2","vt":"1"}},{"r":25,"c":5,"v":{"v":"Center Left","ct":{"fa":"General","t":"g"},"m":"Center Left","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"1","vt":"0"}},{"r":25,"c":6,"v":{"v":"Center Center","ct":{"fa":"General","t":"g"},"m":"Center Center","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"0","vt":"0"}},{"r":25,"c":7,"v":{"v":"Center Right","ct":{"fa":"General","t":"g"},"m":"Center Right","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"2","vt":"0"}},{"r":25,"c":8,"v":{"v":"Bottom Left","ct":{"fa":"General","t":"g"},"m":"Bottom Left","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"1","vt":"2"}},{"r":25,"c":9,"v":{"v":"Bottom Center","ct":{"fa":"General","t":"g"},"m":"Bottom Center","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"0","vt":"2"}},{"r":25,"c":10,"v":{"v":"Bottom Right","ct":{"fa":"General","t":"g"},"m":"Bottom Right","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":"2","vt":"2"}},{"r":26,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":26,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":2,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":3,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":27,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":0,"v":{"v":"WordWrap","ct":{"fa":"General","t":"g"},"m":"WordWrap","bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":1,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":2,"v":{"v":"ABCDEFGHIJKLMNOPQRSTUVWXYZ","ct":{"fa":"General","t":"g"},"m":"ABCDEFGHIJKLMNOPQRSTUVWXYZ","bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"tb":"2"}},{"r":28,"c":3,"v":{"ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"tb":"1"}},{"r":28,"c":4,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":5,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":6,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":7,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":8,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":9,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":28,"c":10,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}},{"r":29,"c":0,"v":{"ct":{"fa":"General","t":"inlineStr","s":[{"ff":"\"times new roman\"","fc":"rgb(51, 51, 51)","fs":"12","cl":0,"un":0,"bl":1,"it":0,"v":"TextRotate"}]},"ht":"1","vt":"0"}},{"r":29,"c":2,"v":{"ct":{"fa":"General","t":"g"},"v":"I am Luckysheet text rotate style","m":"I am Luckysheet text rotate style","tr":"1","tb":"2","ht":"1","fs":"12"}},{"r":29,"c":3,"v":{"ct":{"fa":"General","t":"g"},"v":"I am Luckysheet text rotate style","m":"I am Luckysheet text rotate style","tr":"2","tb":"2","ht":"0","fs":"12"}},{"r":29,"c":4,"v":{"ct":{"fa":"General","t":"g"},"v":"I am Luckysheet text rotate style","m":"I am Luckysheet text rotate style","tr":"4","tb":"2","ht":"1","fs":"12","vt":"2"}},{"r":29,"c":5,"v":{"ct":{"fa":"General","t":"g"},"v":"I am Luckysheet text rotate style","m":"I am Luckysheet text rotate style","tr":"5","tb":"2","ht":"1","fs":"12"}},{"r":29,"c":6,"v":{"ct":{"fa":"General","t":"g"},"v":"I am Luckysheet text rotate style","m":"I am Luckysheet text rotate style","tr":"1","tb":"1","ht":"1","fs":"12","vt":"0"}},{"r":30,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"hidden1","m":"hidden1"}},{"r":31,"c":0,"v":{"m":"hidden2","ct":{"fa":"General","t":"g"},"v":"hidden2"}},{"r":33,"c":0,"v":{"ct":{"fa":"General","t":"g"},"bg":null,"bl":1,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1}}], + "ch_width": 2361, + "rh_height": 936, + "luckysheet_select_save": [ + { + "left": 741, + "width": 138, + "top": 796, + "height": 19, + "left_move": 741, + "width_move": 138, + "top_move": 796, + "height_move": 19, + "row": [ + 33, + 33 + ], + "column": [ + 6, + 6 + ], + "row_focus": 33, + "column_focus": 6 + } + ], + "calcChain": [ + { + "r": 0, + "c": 3, + "index": "0", + "func": [ + true, + 3, + "=Formula!A1+Formula!B1" + ], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + } + ], + "scrollLeft": 0, + "scrollTop": 0 +} +// export default sheetCell \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetChart.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetChart.js new file mode 100644 index 000000000..4d10493d0 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetChart.js @@ -0,0 +1,4918 @@ +window.sheetChart = { + "name": "Chart", + "color": "", + "status": 0, + "order": 8, + "index": "Sheet_6az6nei65t1i_1596209937084", + "celldata": [{ + "r": 0, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 1, + "v": { + "v": "Mon", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Mon", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 2, + "v": { + "v": "Tues", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Tues", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 3, + "v": { + "v": "Wed", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Wed", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 4, + "v": { + "v": "Thur", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Thur", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 5, + "v": { + "v": "Fri", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fri", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 6, + "v": { + "v": "Sat", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sat", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 7, + "v": { + "v": "Sun", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sun", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 0, + "v": { + "v": "BUS", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "BUS", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 1, + "v": { + "v": 320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 2, + "v": { + "v": 302, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "302", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 3, + "v": { + "v": 301, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "301", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 4, + "v": { + "v": 334, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "334", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 5, + "v": { + "v": 390, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "390", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 6, + "v": { + "v": 330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 7, + "v": { + "v": 320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 0, + "v": { + "v": "UBER", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "UBER", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 1, + "v": { + "v": 120, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "120", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 2, + "v": { + "v": 132, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "132", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 3, + "v": { + "v": 101, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "101", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 4, + "v": { + "v": 134, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "134", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 5, + "v": { + "v": 90, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "90", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 6, + "v": { + "v": 230, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "230", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 7, + "v": { + "v": 210, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "210", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 0, + "v": { + "v": "TAXI", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "TAXI", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 1, + "v": { + "v": 220, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "220", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 2, + "v": { + "v": 182, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "182", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 3, + "v": { + "v": 191, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "191", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 4, + "v": { + "v": 234, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "234", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 5, + "v": { + "v": 290, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "290", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 6, + "v": { + "v": 330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 7, + "v": { + "v": 310, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "310", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 0, + "v": { + "v": "SUBWAY", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "SUBWAY", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 1, + "v": { + "v": 820, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "820", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 2, + "v": { + "v": 832, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "832", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 3, + "v": { + "v": 901, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "901", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 4, + "v": { + "v": 934, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "934", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 5, + "v": { + "v": 1290, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1290", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 6, + "v": { + "v": 1330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 7, + "v": { + "v": 1320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 0, + "v": { + "v": "country", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "country", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 1, + "v": { + "v": "Population", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Population", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 0, + "v": { + "v": "India", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "India", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 1, + "v": { + "v": 1354051854, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1354051854", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 24, + "c": 0, + "v": { + "v": "Pakistan", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Pakistan", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 24, + "c": 1, + "v": { + "v": 200813818, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "200813818", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 0, + "v": { + "v": "China", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "China", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 1, + "v": { + "v": 1415045928, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1415045928", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 26, + "c": 0, + "v": { + "v": "Japan", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Japan", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 26, + "c": 1, + "v": { + "v": 127185332, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "127185332", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 27, + "c": 0, + "v": { + "v": "South-Eastern", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "South-Eastern", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 27, + "c": 1, + "v": { + "v": 655636576, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "655636576", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 28, + "c": 0, + "v": { + "v": "Western", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Western", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 28, + "c": 1, + "v": { + "v": 272298399, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "272298399", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 29, + "c": 0, + "v": { + "v": "Eastern", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Eastern", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 29, + "c": 1, + "v": { + "v": 433643132, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "433643132", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 30, + "c": 0, + "v": { + "v": "Western", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Western", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 30, + "c": 1, + "v": { + "v": 381980688, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "381980688", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 31, + "c": 0, + "v": { + "v": "Northern", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Northern", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 31, + "c": 1, + "v": { + "v": 237784677, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "237784677", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 32, + "c": 0, + "v": { + "v": "Others", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Others", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 32, + "c": 1, + "v": { + "v": 234512021, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "234512021", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 33, + "c": 0, + "v": { + "v": "Europe", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Europe", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 33, + "c": 1, + "v": { + "v": 742648010, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "742648010", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }], + "row": 84, + "column": 60, + "config": { + "merge": {}, + "rowlen": { + "0": 20, + "1": 20, + "2": 20, + "3": 20, + "4": 20, + "22": 20, + "23": 20, + "24": 20, + "25": 20, + "26": 20, + "27": 20, + "28": 20, + "29": 20, + "30": 20, + "31": 20, + "32": 20, + "33": 20 + } + }, + "pivotTable": null, + "isPivotTable": false, + "ch_width": 4560, + "rh_height": 1807, + "luckysheet_select_save": [{ + "left": 0, + "width": 73, + "top": 445, + "height": 20, + "left_move": 0, + "width_move": 147, + "top_move": 445, + "height_move": 251, + "row": [22, 33], + "column": [0, 1], + "row_focus": 22, + "column_focus": 0 + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 185, + "chart": [{ + "chart_id": "chart_p145W6i73otw_1596209943446", + "width": 400, + "height": 250, + "left": 20, + "top": 120, + "sheetIndex": "Sheet_6az6nei65t1i_1596209937084", + "needRangeShow": true, + "chartOptions": { + "chart_id": "chart_p145W6i73otw_1596209943446", + "chartAllType": "echarts|column|default", + "chartPro": "echarts", + "chartType": "pie", + "chartStyle": "default", + "chartData": [ + [{ + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Mon", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Mon", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Tues", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Tues", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Wed", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Wed", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Thur", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Thur", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Fri", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fri", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Sat", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sat", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Sun", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sun", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "BUS", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "BUS", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 302, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "302", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 301, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "301", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 334, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "334", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 390, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "390", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "UBER", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "UBER", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 120, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "120", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 132, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "132", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 101, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "101", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 134, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "134", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 90, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "90", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 230, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "230", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 210, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "210", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "TAXI", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "TAXI", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 220, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "220", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 182, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "182", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 191, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "191", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 234, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "234", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 290, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "290", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 310, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "310", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "SUBWAY", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "SUBWAY", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 820, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "820", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 832, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "832", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 901, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "901", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 934, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "934", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1290, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1290", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }] + ], + "rangeArray": [{ + "row": [0, 4], + "column": [0, 7] + }], + "rangeTxt": "A1:H5", + "rangeColCheck": { + "exits": true, + "range": [0, 0] + }, + "rangeRowCheck": { + "exits": true, + "range": [0, 0] + }, + "rangeConfigCheck": false, + "rangeSplitArray": { + "title": { + "row": [0, 0], + "column": [0, 0] + }, + "rowtitle": { + "row": [0, 0], + "column": [1, 7] + }, + "coltitle": { + "row": [1, 4], + "column": [0, 0] + }, + "content": { + "row": [1, 4], + "column": [1, 7] + }, + "type": "normal", + "range": { + "row": [0, 4], + "column": [0, 7] + } + }, + "chartDataCache": { + "label": ["Mon", "Tues", "Wed", "Thur", "Fri", "Sat", "Sun"], + "xAxis": ["BUS", "UBER", "TAXI", "SUBWAY"], + "series": [ + [320, 302, 301, 334, 390, 330, 320], + [120, 132, 101, 134, 90, 230, 210], + [220, 182, 191, 234, 290, 330, 310], + [820, 832, 901, 934, 1290, 1330, 1320] + ], + "series_tpye": { + "0": "num", + "1": "num", + "2": "num", + "3": "num", + "4": "num", + "5": "num", + "6": "num" + } + }, + "chartDataSeriesOrder": { + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "length": 7 + }, + "defaultOption": { + "title": { + "show": false, + "text": "默认标题", + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "position": { + "value": "left-top", + "offsetX": 40, + "offsetY": 50 + } + }, + "subtitle": { + "show": false, + "text": "", + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "distance": { + "value": "auto", + "cusGap": 40 + } + }, + "config": { + "color": "transparent", + "fontFamily": "Sans-serif", + "grid": { + "value": "normal", + "top": 5, + "left": 10, + "right": 20, + "bottom": 10 + } + }, + "legend": { + "show": true, + "selectMode": "multiple", + "selected": [{ + "seriesName": "衣服", + "isShow": true + }, { + "seriesName": "食材", + "isShow": true + }, { + "seriesName": "图书", + "isShow": true + }], + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "position": { + "value": "left-top", + "offsetX": 40, + "offsetY": 50, + "direction": "horizontal" + }, + "width": { + "value": "auto", + "cusSize": 25 + }, + "height": { + "value": "auto", + "cusSize": 14 + }, + "distance": { + "value": "auto", + "cusGap": 10 + }, + "itemGap": 10, + "data": ["Mon", "Tues", "Wed", "Thur", "Fri", "Sat", "Sun"] + }, + "tooltip": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "backgroundColor": "rgba(50,50,50,0.7)", + "triggerOn": "mousemove", + "triggerType": "item", + "axisPointer": { + "type": "line", + "style": { + "color": "#555", + "width": "normal", + "type": "solid" + } + }, + "format": [{ + "seriesName": "衣服", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, { + "seriesName": "食材", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, { + "seriesName": "图书", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }], + "position": "auto" + }, + "axis": { + "axisType": "xAxisDown", + "xAxisUp": { + "show": false, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示X轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "prefix": "", + "suffix": "", + "optimize": 0, + "distance": 0, + "min": "auto", + "max": "auto", + "ratio": 1, + "digit": "auto" + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "axisLine": { + "onZero": false + } + }, + "xAxisDown": { + "show": true, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示X轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "prefix": "", + "suffix": "", + "optimize": 0, + "distance": 0, + "min": null, + "max": null, + "ratio": 1, + "digit": "auto" + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "data": ["BUS", "UBER", "TAXI", "SUBWAY"], + "type": "category" + }, + "yAxisLeft": { + "show": true, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示Y轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "formatter": { + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, + "split": 5, + "min": null, + "max": null, + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto", + "distance": 0 + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "type": "value" + }, + "yAxisRight": { + "show": false, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示Y轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "formatter": { + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, + "split": 5, + "min": null, + "max": null, + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto", + "distance": 0 + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + } + } + }, + "series": [{ + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [320, 120, 220, 820], + "type": "bar", + "name": "Mon", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [302, 132, 182, 832], + "type": "bar", + "name": "Tues", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [301, 101, 191, 901], + "type": "bar", + "name": "Wed", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [334, 134, 234, 934], + "type": "bar", + "name": "Thur", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [390, 90, 290, 1290], + "type": "bar", + "name": "Fri", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [330, 230, 330, 1330], + "type": "bar", + "name": "Sat", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [320, 210, 310, 1320], + "type": "bar", + "name": "Sun", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }], + "seriesData": [ + [320, 120, 220, 820], + [302, 132, 182, 832], + [301, 101, 191, 901], + [334, 134, 234, 934], + [390, 90, 290, 1290], + [330, 230, 330, 1330], + [320, 210, 310, 1320] + ] + } + } + }, { + "chart_id": "chart_lpiiaae1543z_1596209948642", + "width": 400, + "height": 250, + "left": 500, + "top": 120, + "sheetIndex": "Sheet_6az6nei65t1i_1596209937084", + "needRangeShow": false, + "chartOptions": { + "chart_id": "chart_lpiiaae1543z_1596209948642", + "chartAllType": "echarts|line|default", + "chartPro": "echarts", + "chartType": "pie", + "chartStyle": "default", + "chartData": [ + [{ + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Mon", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Mon", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Tues", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Tues", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Wed", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Wed", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Thur", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Thur", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Fri", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fri", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Sat", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sat", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Sun", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sun", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "BUS", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "BUS", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 302, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "302", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 301, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "301", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 334, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "334", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 390, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "390", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "UBER", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "UBER", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 120, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "120", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 132, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "132", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 101, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "101", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 134, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "134", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 90, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "90", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 230, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "230", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 210, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "210", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "TAXI", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "TAXI", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 220, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "220", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 182, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "182", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 191, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "191", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 234, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "234", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 290, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "290", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 310, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "310", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "SUBWAY", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "SUBWAY", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 820, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "820", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 832, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "832", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 901, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "901", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 934, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "934", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1290, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1290", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1330, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1330", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1320, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1320", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }] + ], + "rangeArray": [{ + "left": 0, + "width": 73, + "top": 0, + "height": 20, + "left_move": 0, + "width_move": 591, + "top_move": 0, + "height_move": 104, + "row": [0, 4], + "column": [0, 7], + "row_focus": 0, + "column_focus": 0 + }], + "rangeTxt": "A1:H5", + "rangeColCheck": { + "exits": true, + "range": [0, 0] + }, + "rangeRowCheck": { + "exits": true, + "range": [0, 0] + }, + "rangeConfigCheck": false, + "rangeSplitArray": { + "title": { + "row": [0, 0], + "column": [0, 0] + }, + "rowtitle": { + "row": [0, 0], + "column": [1, 7] + }, + "coltitle": { + "row": [1, 4], + "column": [0, 0] + }, + "content": { + "row": [1, 4], + "column": [1, 7] + }, + "type": "normal", + "range": { + "left": 0, + "width": 73, + "top": 0, + "height": 20, + "left_move": 0, + "width_move": 591, + "top_move": 0, + "height_move": 104, + "row": [0, 4], + "column": [0, 7], + "row_focus": 0, + "column_focus": 0 + } + }, + "chartDataCache": { + "label": ["Mon", "Tues", "Wed", "Thur", "Fri", "Sat", "Sun"], + "xAxis": ["BUS", "UBER", "TAXI", "SUBWAY"], + "series": [ + [320, 302, 301, 334, 390, 330, 320], + [120, 132, 101, 134, 90, 230, 210], + [220, 182, 191, 234, 290, 330, 310], + [820, 832, 901, 934, 1290, 1330, 1320] + ], + "series_tpye": { + "0": "num", + "1": "num", + "2": "num", + "3": "num", + "4": "num", + "5": "num", + "6": "num" + } + }, + "chartDataSeriesOrder": { + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "length": 7 + }, + "defaultOption": { + "title": { + "show": false, + "text": "默认标题", + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "position": { + "value": "left-top", + "offsetX": 40, + "offsetY": 50 + } + }, + "subtitle": { + "show": false, + "text": "", + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "distance": { + "value": "auto", + "cusGap": 40 + } + }, + "config": { + "color": "transparent", + "fontFamily": "Sans-serif", + "grid": { + "value": "normal", + "top": 5, + "left": 10, + "right": 20, + "bottom": 10 + } + }, + "legend": { + "show": true, + "selectMode": "multiple", + "selected": [{ + "seriesName": "衣服", + "isShow": true + }, { + "seriesName": "食材", + "isShow": true + }, { + "seriesName": "图书", + "isShow": true + }], + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "position": { + "value": "left-top", + "offsetX": 40, + "offsetY": 50, + "direction": "horizontal" + }, + "width": { + "value": "auto", + "cusSize": 25 + }, + "height": { + "value": "auto", + "cusSize": 14 + }, + "distance": { + "value": "auto", + "cusGap": 10 + }, + "itemGap": 10, + "data": ["Mon", "Tues", "Wed", "Thur", "Fri", "Sat", "Sun"] + }, + "tooltip": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "backgroundColor": "rgba(50,50,50,0.7)", + "triggerOn": "mousemove", + "triggerType": "item", + "axisPointer": { + "type": "line", + "style": { + "color": "#555", + "width": "normal", + "type": "solid" + } + }, + "format": [{ + "seriesName": "衣服", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, { + "seriesName": "食材", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, { + "seriesName": "图书", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }], + "position": "auto" + }, + "axis": { + "axisType": "xAxisDown", + "xAxisUp": { + "show": false, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示X轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "prefix": "", + "suffix": "", + "optimize": 0, + "distance": 0, + "min": "auto", + "max": "auto", + "ratio": 1, + "digit": "auto" + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "axisLine": { + "onZero": false + } + }, + "xAxisDown": { + "show": true, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示X轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "prefix": "", + "suffix": "", + "optimize": 0, + "distance": 0, + "min": null, + "max": null, + "ratio": 1, + "digit": "auto" + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "data": ["BUS", "UBER", "TAXI", "SUBWAY"], + "type": "category" + }, + "yAxisLeft": { + "show": true, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示Y轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "formatter": { + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, + "split": 5, + "min": null, + "max": null, + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto", + "distance": 0 + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "type": "value" + }, + "yAxisRight": { + "show": false, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示Y轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "formatter": { + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, + "split": 5, + "min": null, + "max": null, + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto", + "distance": 0 + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + } + } + }, + "series": [{ + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [320, 120, 220, 820], + "type": "line", + "name": "Mon", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [302, 132, 182, 832], + "type": "line", + "name": "Tues", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [301, 101, 191, 901], + "type": "line", + "name": "Wed", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [334, 134, 234, 934], + "type": "line", + "name": "Thur", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [390, 90, 290, 1290], + "type": "line", + "name": "Fri", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [330, 230, 330, 1330], + "type": "line", + "name": "Sat", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }, { + "itemStyle": { + "color": null, + "borderColor": "#000", + "borderType": "solid", + "borderWidth": 1 + }, + "lineStyle": { + "color": null, + "width": 1, + "type": "solid" + }, + "data": [320, 210, 310, 1320], + "type": "line", + "name": "Sun", + "markPoint": { + "data": [] + }, + "markLine": { + "data": [] + }, + "markArea": { + "data": [] + } + }], + "seriesData": [ + [320, 120, 220, 820], + [302, 132, 182, 832], + [301, 101, 191, 901], + [334, 134, 234, 934], + [390, 90, 290, 1290], + [330, 230, 330, 1330], + [320, 210, 310, 1320] + ] + } + } + }, { + "chart_id": "chart_ei765e0iKkoe_1596210011748", + "width": 600, + "height": 250, + "left": 150, + "top": 450, + "sheetIndex": "Sheet_6az6nei65t1i_1596209937084", + "needRangeShow": false, + "chartOptions": { + "chart_id": "chart_ei765e0iKkoe_1596210011748", + "chartAllType": "echarts|pie|default", + "chartPro": "echarts", + "chartType": "pie", + "chartStyle": "default", + "chartData": [ + [{ + "v": "country", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "country", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": "Population", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Population", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "India", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "India", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1354051854, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1354051854", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Pakistan", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Pakistan", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 200813818, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "200813818", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "China", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "China", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 1415045928, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1415045928", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Japan", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Japan", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 127185332, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "127185332", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "South-Eastern", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "South-Eastern", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 655636576, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "655636576", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Western", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Western", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 272298399, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "272298399", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Eastern", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Eastern", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 433643132, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "433643132", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Western", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Western", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 381980688, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "381980688", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Northern", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Northern", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 237784677, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "237784677", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Others", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Others", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 234512021, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "234512021", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }], + [{ + "v": "Europe", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Europe", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }, { + "v": 742648010, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "742648010", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + }] + ], + "rangeArray": [{ + "left": 0, + "width": 73, + "top": 445, + "height": 20, + "left_move": 0, + "width_move": 147, + "top_move": 445, + "height_move": 251, + "row": [22, 33], + "column": [0, 1], + "row_focus": 22, + "column_focus": 0 + }], + "rangeTxt": "A23:B34", + "rangeColCheck": { + "exits": true, + "range": [0, 0] + }, + "rangeRowCheck": { + "exits": true, + "range": [0, 0] + }, + "rangeConfigCheck": false, + "rangeSplitArray": { + "title": { + "row": [0, 0], + "column": [0, 0] + }, + "rowtitle": { + "row": [0, 0], + "column": [1, 1] + }, + "coltitle": { + "row": [1, 11], + "column": [0, 0] + }, + "content": { + "row": [1, 11], + "column": [1, 1] + }, + "type": "normal", + "range": { + "left": 0, + "width": 73, + "top": 445, + "height": 20, + "left_move": 0, + "width_move": 147, + "top_move": 445, + "height_move": 251, + "row": [22, 33], + "column": [0, 1], + "row_focus": 22, + "column_focus": 0 + } + }, + "chartDataCache": { + "label": ["Population"], + "xAxis": ["India", "Pakistan", "China", "Japan", "South-Eastern", "Western", "Eastern", "Western", "Northern", "Others", "Europe"], + "series": [ + [1354051854], + [200813818], + [1415045928], + [127185332], + [655636576], + [272298399], + [433643132], + [381980688], + [237784677], + [234512021], + [742648010] + ], + "series_tpye": { + "0": "num" + } + }, + "chartDataSeriesOrder": { + "0": 0, + "length": 1 + }, + "defaultOption": { + "title": { + "show": false, + "text": "默认标题", + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "position": { + "value": "left-top", + "offsetX": 40, + "offsetY": 50 + } + }, + "subtitle": { + "show": false, + "text": "", + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "distance": { + "value": "auto", + "cusGap": 40 + } + }, + "config": { + "color": "transparent", + "fontFamily": "Sans-serif", + "grid": { + "value": "normal", + "top": 5, + "left": 10, + "right": 20, + "bottom": 10 + } + }, + "legend": { + "show": true, + "selectMode": "multiple", + "selected": [{ + "seriesName": "衣服", + "isShow": true + }, { + "seriesName": "食材", + "isShow": true + }, { + "seriesName": "图书", + "isShow": true + }], + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "position": { + "value": "left-top", + "offsetX": 40, + "offsetY": 50, + "direction": "horizontal" + }, + "width": { + "value": "auto", + "cusSize": 25 + }, + "height": { + "value": "auto", + "cusSize": 14 + }, + "distance": { + "value": "auto", + "cusGap": 10 + }, + "itemGap": 10, + "data": [{ + "name": "India", + "textStyle": { + "color": null + }, + "value": 1354051854 + }, { + "name": "Pakistan", + "textStyle": { + "color": null + }, + "value": 200813818 + }, { + "name": "China", + "textStyle": { + "color": null + }, + "value": 1415045928 + }, { + "name": "Japan", + "textStyle": { + "color": null + }, + "value": 127185332 + }, { + "name": "South-Eastern", + "textStyle": { + "color": null + }, + "value": 655636576 + }, { + "name": "Western", + "textStyle": { + "color": null + }, + "value": 272298399 + }, { + "name": "Eastern", + "textStyle": { + "color": null + }, + "value": 433643132 + }, { + "name": "Western", + "textStyle": { + "color": null + }, + "value": 381980688 + }, { + "name": "Northern", + "textStyle": { + "color": null + }, + "value": 237784677 + }, { + "name": "Others", + "textStyle": { + "color": null + }, + "value": 234512021 + }, { + "name": "Europe", + "textStyle": { + "color": null + }, + "value": 742648010 + }] + }, + "tooltip": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "backgroundColor": "rgba(50,50,50,0.7)", + "triggerOn": "mousemove", + "triggerType": "item", + "axisPointer": { + "type": "line", + "style": { + "color": "#555", + "width": "normal", + "type": "solid" + } + }, + "format": [{ + "seriesName": "衣服", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, { + "seriesName": "食材", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, { + "seriesName": "图书", + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }], + "position": "auto" + }, + "axis": { + "axisType": "xAxisDown", + "xAxisUp": { + "show": false, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示X轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "prefix": "", + "suffix": "", + "optimize": 0, + "distance": 0, + "min": "auto", + "max": "auto", + "ratio": 1, + "digit": "auto" + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "axisLine": { + "onZero": false + } + }, + "xAxisDown": { + "show": true, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示X轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "prefix": "", + "suffix": "", + "optimize": 0, + "distance": 0, + "min": null, + "max": null, + "ratio": 1, + "digit": "auto" + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "data": ["India", "Pakistan", "China", "Japan", "South-Eastern", "Western", "Eastern", "Western", "Northern", "Others", "Europe"], + "type": "category" + }, + "yAxisLeft": { + "show": true, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示Y轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "formatter": { + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, + "split": 5, + "min": null, + "max": null, + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto", + "distance": 0 + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + }, + "type": "value" + }, + "yAxisRight": { + "show": false, + "title": { + "showTitle": false, + "text": "", + "nameGap": 15, + "rotate": 0, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "fzPosition": "end" + }, + "name": "显示Y轴", + "inverse": false, + "tickLine": { + "show": true, + "width": 1, + "color": "auto" + }, + "tick": { + "show": true, + "position": "outside", + "length": 5, + "width": 1, + "color": "auto" + }, + "tickLabel": { + "show": true, + "label": { + "fontSize": 12, + "color": "#333", + "fontFamily": "sans-serif", + "fontGroup": [], + "cusFontSize": 12 + }, + "rotate": 0, + "formatter": { + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto" + }, + "split": 5, + "min": null, + "max": null, + "prefix": "", + "suffix": "", + "ratio": 1, + "digit": "auto", + "distance": 0 + }, + "netLine": { + "show": false, + "width": 1, + "type": "solid", + "color": "auto", + "interval": { + "value": "auto", + "cusNumber": 0 + } + }, + "netArea": { + "show": false, + "interval": { + "value": "auto", + "cusNumber": 0 + }, + "colorOne": "auto", + "colorTwo": "auto" + } + } + }, + "series": [{ + "name": "Population", + "type": "pie", + "radius": ["0%", "75%"], + "data": [{ + "value": 1354051854, + "name": "India", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 200813818, + "name": "Pakistan", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 1415045928, + "name": "China", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 127185332, + "name": "Japan", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 655636576, + "name": "South-Eastern", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 272298399, + "name": "Western", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 433643132, + "name": "Eastern", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 381980688, + "name": "Western", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 237784677, + "name": "Northern", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 234512021, + "name": "Others", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }, { + "value": 742648010, + "name": "Europe", + "label": {}, + "labelLine": { + "lineStyle": {} + }, + "itemStyle": {} + }], + "dataLabels": {}, + "seLabel": {}, + "seLine": {}, + "roseType": false + }], + "seriesData": [ + [1354051854, 200813818, 1415045928, 127185332, 655636576, 272298399, 433643132, 381980688, 237784677, 234512021, 742648010] + ] + } + } + }] +} + +// export default sheetChart \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetComment.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetComment.js new file mode 100644 index 000000000..326d9a9e3 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetComment.js @@ -0,0 +1,67 @@ +window.sheetComment = { + "name": "Comment", + "color": "", + "config": { + "columnlen": { + "2": 102 + } + }, + "index": "5", + "chart": [], + "status": 0, + "order": "5", + "column": 18, + "row": 36, + "celldata": [{ + "r": 2, + "c": 2, + "v": { + "m": "HoverShown", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "HoverShown", + "bl": 1, + "ps": { + "left": null, + "top": null, + "width": null, + "height": null, + "value": "Hello world!", + "isshow": false + } + } + }, { + "r": 7, + "c": 2, + "v": { + "m": "Size", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Size", + "bl": 1, + "ps": { + "left": null, + "top": null, + "width": null, + "height": null, + "value": "Hello,world!", + "isshow": true + } + } + }], + "ch_width": 4748, + "rh_height": 1790, + "luckysheet_select_save": [{ + "row": [0, 0], + "column": [0, 0] + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 0 +} + +// export default sheetComment; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetConditionFormat.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetConditionFormat.js new file mode 100644 index 000000000..e91f9b810 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetConditionFormat.js @@ -0,0 +1,6541 @@ +window.sheetConditionFormat = { + "name": "Conditional Format", + "color": "", + "zoomRatio":1, + "config": { + "merge": { + "8_10": { + "rs": 1, + "cs": 2, + "r": 8, + "c": 10 + }, + "18_2": { + "rs": 1, + "cs": 10, + "r": 18, + "c": 2 + }, + "24_2": { + "rs": 1, + "cs": 10, + "r": 24, + "c": 2 + }, + "2_10": { + "rs": 1, + "cs": 2, + "r": 2, + "c": 10 + }, + "3_10": { + "rs": 1, + "cs": 2, + "r": 3, + "c": 10 + }, + "6_10": { + "rs": 1, + "cs": 2, + "r": 6, + "c": 10 + }, + "7_10": { + "rs": 1, + "cs": 2, + "r": 7, + "c": 10 + }, + "4_10": { + "rs": 1, + "cs": 2, + "r": 4, + "c": 10 + }, + "5_10": { + "rs": 1, + "cs": 2, + "r": 5, + "c": 10 + }, + "9_10": { + "rs": 1, + "cs": 2, + "r": 9, + "c": 10 + }, + "10_10": { + "rs": 1, + "cs": 2, + "r": 10, + "c": 10 + }, + "11_10": { + "rs": 1, + "cs": 2, + "r": 11, + "c": 10 + }, + "12_10": { + "rs": 1, + "cs": 2, + "r": 12, + "c": 10 + }, + "13_10": { + "rs": 1, + "cs": 2, + "r": 13, + "c": 10 + }, + "14_10": { + "rs": 1, + "cs": 2, + "r": 14, + "c": 10 + }, + "15_10": { + "rs": 1, + "cs": 2, + "r": 15, + "c": 10 + }, + "1_10": { + "r": 1, + "c": 10, + "rs": 1, + "cs": 2 + } + }, + "rowlen": { + "0": 20, + "1": 20, + "2": 20, + "3": 20, + "4": 20, + "5": 20, + "6": 20, + "7": 20, + "8": 20, + "9": 20, + "10": 20, + "11": 20, + "12": 20, + "13": 20, + "14": 20, + "15": 20, + "16": 20, + "17": 20, + "18": 20, + "19": 20, + "20": 20, + "21": 20, + "22": 20, + "23": 20, + "24": 20, + "25": 20, + "26": 20, + "27": 20, + "28": 20, + "29": 20 + }, + "columnlen": { + "0": 30, + "1": 30, + "2": 86, + "3": 85, + "4": 92, + "5": 93, + "6": 100, + "7": 100, + "8": 99, + "9": 90, + "10": 96, + "11": 96 + } + }, + "index": "2", + "chart": [], + "status": 0, + "order": "2", + "column": 18, + "row": 36, + "celldata": [{ + "r": 0, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 2, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 4, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 6, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 8, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 10, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 0, + "c": 11, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 2, + "v": { + "v": "Cell Value", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Cell Value", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": 1 + } + }, { + "r": 1, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 4, + "v": { + "v": "Specific Text", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Specific Text", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 6, + "v": { + "v": "Unique", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Unique", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 8, + "v": { + "v": "Duplicate", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Duplicate", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 1, + "c": 10, + "v": { + "v": "Date Occurring", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Date Occurring", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0", + "mc": { + "r": 1, + "c": 10, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 1, + "c": 11, + "v": { + "mc": { + "r": 1, + "c": 10 + } + } + }, { + "r": 2, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 2, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 2, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 4, + "v": { + "v": "test", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "test", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 2, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 6, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 2, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 8, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 2, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 10, + "v": { + "v": 44033.77921296296, + "ct": { + "fa": "yyyy-MM-dd hh:mm", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "0", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 2, + "c": 10 + }, + "m": "2020-07-21 18:42" + } + }, { + "r": 2, + "c": 11, + "v": { + "mc": { + "r": 2, + "c": 10 + }, + "ht": "0", + "vt": "0", + "fs": "10" + } + }, { + "r": 3, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 2, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 3, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 4, + "v": { + "v": "bad", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "bad", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 3, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 6, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 3, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 8, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 3, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 10, + "v": { + "v": 44034.77921296296, + "ct": { + "fa": "yyyy-MM-dd hh:mm", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "0", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 3, + "c": 10 + }, + "m": "2020-07-22 18:42" + } + }, { + "r": 3, + "c": 11, + "v": { + "mc": { + "r": 3, + "c": 10 + }, + "ht": "0", + "vt": "0", + "fs": "10" + } + }, { + "r": 4, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 2, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 4, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 4, + "v": { + "v": "good", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "good", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 4, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 6, + "v": { + "v": 11, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "11", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 4, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 8, + "v": { + "v": 11, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "11", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 4, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 10, + "v": { + "v": 44039.77921296296, + "ct": { + "fa": "yyyy-MM-dd hh:mm", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "0", + "vt": "0", + "m": "2020-07-27 18:42", + "mc": { + "rs": 1, + "cs": 2, + "r": 4, + "c": 10 + } + } + }, { + "r": 4, + "c": 11, + "v": { + "mc": { + "r": 4, + "c": 10 + } + } + }, { + "r": 5, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 5, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 5, + "c": 2, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 5, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 5, + "c": 4, + "v": { + "v": "testing", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "testing", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 5, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 5, + "c": 6, + "v": { + "v": 5, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "5", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 5, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 5, + "c": 8, + "v": { + "v": 5, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "5", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 5, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 5, + "c": 10, + "v": { + "v": 44040.77921296296, + "ct": { + "fa": "yyyy-MM-dd hh:mm", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "0", + "vt": "0", + "m": "2020-07-28 18:42", + "mc": { + "rs": 1, + "cs": 2, + "r": 5, + "c": 10 + } + } + }, { + "r": 5, + "c": 11, + "v": { + "mc": { + "r": 5, + "c": 10 + } + } + }, { + "r": 6, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 6, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 6, + "c": 2, + "v": { + "v": 4, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "4", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 6, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 6, + "c": 4, + "v": { + "v": "tested", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "tested", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 6, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 6, + "c": 6, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 6, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 6, + "c": 8, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 6, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 6, + "c": 10, + "v": { + "v": 44047.77921296296, + "ct": { + "fa": "yyyy-MM-dd hh:mm", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "0", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 6, + "c": 10 + }, + "m": "2020-08-04 18:42" + } + }, { + "r": 6, + "c": 11, + "v": { + "mc": { + "r": 6, + "c": 10 + }, + "ht": "0", + "vt": "0", + "fs": "10" + } + }, { + "r": 7, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 2, + "v": { + "v": 5, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "5", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 7, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 4, + "v": { + "v": "general", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "general", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 7, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 6, + "v": { + "v": 120, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "120", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 7, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 8, + "v": { + "v": 120, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "120", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 7, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 10, + "v": { + "v": 44055.77921296296, + "ct": { + "fa": "yyyy-MM-dd hh:mm", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "0", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 7, + "c": 10 + }, + "m": "2020-08-12 18:42" + } + }, { + "r": 7, + "c": 11, + "v": { + "mc": { + "r": 7, + "c": 10 + }, + "ht": "0", + "vt": "0", + "fs": "10" + } + }, { + "r": 8, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 2, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": 1 + } + }, { + "r": 8, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 4, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 6, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "ct": { + "fa": "General", + "t": "n" + } + } + }, { + "r": 8, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 8, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 10, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "rs": 1, + "cs": 2, + "r": 8, + "c": 10 + } + } + }, { + "r": 8, + "c": 11, + "v": { + "mc": { + "r": 8, + "c": 10 + } + } + }, { + "r": 9, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 2, + "v": { + "v": "Top/Bottom", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Top/Bottom", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 9, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 4, + "v": { + "v": "Average", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Average", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 9, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 6, + "v": { + "v": "2-Color Scale", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "2-Color Scale", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 9, + "c": 8, + "v": { + "v": "3-Color Scale", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "3-Color Scale", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0" + } + }, { + "r": 9, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 10, + "v": { + "v": "Data Bar", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Data Bar", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 9, + "c": 10 + } + } + }, { + "r": 9, + "c": 11, + "v": { + "mc": { + "r": 9, + "c": 10 + } + } + }, { + "r": 10, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 2, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 10, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 4, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 10, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 6, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 10, + "c": 8, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 10, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 10, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 10, + "c": 10 + } + } + }, { + "r": 10, + "c": 11, + "v": { + "mc": { + "r": 10, + "c": 10 + } + } + }, { + "r": 11, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 11, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 11, + "c": 2, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 11, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 11, + "c": 4, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 11, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 11, + "c": 6, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 11, + "c": 8, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 11, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 11, + "c": 10, + "v": { + "v": 15, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "15", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 11, + "c": 10 + } + } + }, { + "r": 11, + "c": 11, + "v": { + "mc": { + "r": 11, + "c": 10 + } + } + }, { + "r": 12, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 12, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 12, + "c": 2, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 12, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 12, + "c": 4, + "v": { + "v": 100, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "100", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 12, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 12, + "c": 6, + "v": { + "v": 100, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "100", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 12, + "c": 8, + "v": { + "v": 100, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "100", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 12, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 12, + "c": 10, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 12, + "c": 10 + } + } + }, { + "r": 12, + "c": 11, + "v": { + "mc": { + "r": 12, + "c": 10 + } + } + }, { + "r": 13, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 13, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 13, + "c": 2, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 13, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 13, + "c": 4, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 13, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 13, + "c": 6, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 13, + "c": 8, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 13, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 13, + "c": 10, + "v": { + "v": -1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 13, + "c": 10 + } + } + }, { + "r": 13, + "c": 11, + "v": { + "mc": { + "r": 13, + "c": 10 + } + } + }, { + "r": 14, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 2, + "v": { + "v": 4, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "4", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 14, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 4, + "v": { + "v": 60, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "60", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 14, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 6, + "v": { + "v": 60, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "60", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 14, + "c": 8, + "v": { + "v": 60, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "60", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 14, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 10, + "v": { + "v": -15, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-15", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 14, + "c": 10 + } + } + }, { + "r": 14, + "c": 11, + "v": { + "mc": { + "r": 14, + "c": 10 + } + } + }, { + "r": 15, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 15, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 15, + "c": 2, + "v": { + "v": 5, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "5", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 15, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 15, + "c": 4, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 15, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 15, + "c": 6, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 15, + "c": 8, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 15, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 15, + "c": 10, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "mc": { + "rs": 1, + "cs": 2, + "r": 15, + "c": 10 + } + } + }, { + "r": 15, + "c": 11, + "v": { + "mc": { + "r": 15, + "c": 10 + } + } + }, { + "r": 16, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 2, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 4, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0", + "ct": { + "fa": "General", + "t": "n" + } + } + }, { + "r": 16, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 6, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 8, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 10, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 11, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 2, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 4, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 5, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 6, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 7, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 8, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 10, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 11, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 18, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 18, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 18, + "c": 2, + "v": { + "v": "Icon Set", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Icon Set", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "1", + "vt": "0", + "mc": { + "rs": 1, + "cs": 10, + "r": 18, + "c": 2 + } + } + }, { + "r": 18, + "c": 3, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 4, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 5, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 6, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 7, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 8, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 9, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 10, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 18, + "c": 11, + "v": { + "mc": { + "r": 18, + "c": 2 + }, + "ht": "1", + "vt": "0", + "fs": "10" + } + }, { + "r": 19, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 19, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 19, + "c": 2, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 3, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 4, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 5, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 6, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 7, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 8, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 9, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 10, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 19, + "c": 11, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 20, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 20, + "c": 2, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 3, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 4, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 5, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 6, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 7, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 8, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 9, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 10, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 20, + "c": 11, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 21, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 21, + "c": 2, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 3, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 4, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 5, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 6, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 7, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 8, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 9, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 10, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 21, + "c": 11, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 2, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 3, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 4, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 5, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 6, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 7, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 8, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 9, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 10, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 22, + "c": 11, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 2, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 3, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 4, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 5, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 6, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 7, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 8, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 9, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 10, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 23, + "c": 11, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 24, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 24, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 24, + "c": 2, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "rs": 1, + "cs": 10, + "r": 24, + "c": 2 + } + } + }, { + "r": 24, + "c": 3, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 4, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 5, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 6, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 7, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 8, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 9, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 10, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 24, + "c": 11, + "v": { + "mc": { + "r": 24, + "c": 2 + }, + "fs": "10" + } + }, { + "r": 25, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 2, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 3, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 4, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 5, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 6, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 7, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 8, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 9, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 10, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 25, + "c": 11, + "v": { + "v": -50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 26, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 26, + "c": 2, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 3, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 4, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 5, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 6, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 7, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 8, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 9, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 10, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 26, + "c": 11, + "v": { + "v": -25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 27, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 27, + "c": 2, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 3, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 4, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 5, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 6, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 7, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 8, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 9, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 10, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 27, + "c": 11, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 28, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 28, + "c": 2, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 3, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 4, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 5, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 6, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 7, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 8, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 9, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 10, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 28, + "c": 11, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 29, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 29, + "c": 2, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 3, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 4, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 5, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 6, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 7, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 8, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 9, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 10, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }, { + "r": 29, + "c": 11, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(51, 51, 51)", + "ht": "2", + "vt": "0" + } + }], + "ch_width": 4748, + "rh_height": 1790, + "luckysheet_select_save": [{ + "row": [0, 0], + "column": [0, 0] + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 0, + "luckysheet_conditionformat_save": [{ + "type": "default", + "cellrange": [{ + "row": [2, 7], + "column": [2, 2] + }], + "format": { + "textColor": "#000000", + "cellColor": "#ff0000" + }, + "conditionName": "betweenness", + "conditionRange": [{ + "row": [4, 4], + "column": [2, 2] + }, { + "row": [6, 6], + "column": [2, 2] + }], + "conditionValue": [2, 4] + }, { + "type": "default", + "cellrange": [{ + "row": [2, 7], + "column": [4, 4] + }], + "format": { + "textColor": "#000000", + "cellColor": "#ff0000" + }, + "conditionName": "textContains", + "conditionRange": [{ + "row": [2, 2], + "column": [4, 4] + }], + "conditionValue": ["test"] + }, { + "type": "default", + "cellrange": [{ + "row": [2, 7], + "column": [6, 6] + }], + "format": { + "textColor": "#000000", + "cellColor": "#ff0000" + }, + "conditionName": "duplicateValue", + "conditionRange": [], + "conditionValue": ["1"] + }, { + "type": "default", + "cellrange": [{ + "row": [2, 7], + "column": [8, 8] + }], + "format": { + "textColor": "#000000", + "cellColor": "#ff0000" + }, + "conditionName": "duplicateValue", + "conditionRange": [], + "conditionValue": ["0"] + }, { + "type": "default", + "cellrange": [{ + "row": [10, 15], + "column": [2, 2] + }], + "format": { + "textColor": "#000000", + "cellColor": "#ff0000" + }, + "conditionName": "greaterThan", + "conditionRange": [{ + "row": [11, 11], + "column": [2, 2] + }], + "conditionValue": [1] + }, { + "type": "default", + "cellrange": [{ + "row": [10, 15], + "column": [4, 4] + }], + "format": { + "textColor": null, + "cellColor": "#ff0000" + }, + "conditionName": "AboveAverage", + "conditionRange": [], + "conditionValue": ["AboveAverage"] + }, { + "type": "dataBar", + "cellrange": [{ + "row": [10, 15], + "column": [10, 11] + }], + "format": ["#6aa84f", "#ffffff"] + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [2, 2] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "0" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [3, 3] + }], + "format": { + "len": "3", + "leftMin": "5", + "top": "0" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [4, 4] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "1" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [5, 5] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "9" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [6, 6] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "8" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [7, 7] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "4" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [8, 8] + }], + "format": { + "len": "3", + "leftMin": "5", + "top": "4" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [9, 9] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "5" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [10, 10] + }], + "format": { + "len": "3", + "leftMin": "0", + "top": "7" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [19, 23], + "column": [11, 11] + }], + "format": { + "len": "3", + "leftMin": "5", + "top": "7" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [2, 2] + }], + "format": { + "len": "4", + "leftMin": "0", + "top": "2" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [3, 3] + }], + "format": { + "len": "4", + "leftMin": "5", + "top": "1" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [4, 4] + }], + "format": { + "len": "4", + "leftMin": "0", + "top": "6" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [5, 5] + }], + "format": { + "len": "4", + "leftMin": "5", + "top": "9" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [6, 6] + }], + "format": { + "len": "4", + "leftMin": "0", + "top": "6" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [6, 6] + }], + "format": { + "len": "4", + "leftMin": "5", + "top": "5" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [7, 7] + }], + "format": { + "len": "5", + "leftMin": "0", + "top": "3" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [8, 8] + }], + "format": { + "len": "5", + "leftMin": "5", + "top": "2" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [9, 9] + }], + "format": { + "len": "5", + "leftMin": "5", + "top": "10" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [10, 10] + }], + "format": { + "len": "5", + "leftMin": "0", + "top": "10" + } + }, { + "type": "icons", + "cellrange": [{ + "row": [25, 29], + "column": [11, 11] + }], + "format": { + "len": "5", + "leftMin": "0", + "top": "11" + } + }, { + "type": "default", + "cellrange": [{ + "row": [2, 7], + "column": [10, 11] + }], + "format": { + "textColor": null, + "cellColor": "#ff0000" + }, + "conditionName": "occurrenceDate", + "conditionRange": [], + "conditionValue": ["2020/07/23 - 2020/07/29"] + }, { + "type": "colorGradation", + "cellrange": [{ + "left": 422, + "width": 100, + "top": 210, + "height": 20, + "left_move": 422, + "width_move": 100, + "top_move": 210, + "height_move": 125, + "row": [10, 15], + "column": [6, 6], + "row_focus": 10, + "column_focus": 6 + }], + "format": ["rgb(99, 190, 123)", "rgb(255, 235, 132)", "rgb(248, 105, 107)"] + }, { + "type": "colorGradation", + "cellrange": [{ + "left": 422, + "width": 100, + "top": 210, + "height": 20, + "left_move": 422, + "width_move": 100, + "top_move": 210, + "height_move": 125, + "row": [10, 15], + "column": [6, 6], + "row_focus": 10, + "column_focus": 6 + }], + "format": ["rgb(248, 105, 107)", "rgb(255, 235, 132)", "rgb(99, 190, 123)"] + }, { + "type": "colorGradation", + "cellrange": [{ + "left": 422, + "width": 100, + "top": 210, + "height": 20, + "left_move": 422, + "width_move": 100, + "top_move": 210, + "height_move": 125, + "row": [10, 15], + "column": [6, 6], + "row_focus": 10, + "column_focus": 6 + }], + "format": ["rgb(99, 190, 123)", "rgb(255, 235, 132)", "rgb(248, 105, 107)"] + }, { + "type": "colorGradation", + "cellrange": [{ + "left": 422, + "width": 100, + "top": 210, + "height": 20, + "left_move": 422, + "width_move": 100, + "top_move": 210, + "height_move": 125, + "row": [10, 15], + "column": [6, 6], + "row_focus": 10, + "column_focus": 6 + }], + "format": ["rgb(99, 190, 123)", "rgb(255, 235, 132)"] + }, { + "type": "colorGradation", + "cellrange": [{ + "left": 624, + "width": 99, + "top": 210, + "height": 20, + "left_move": 624, + "width_move": 99, + "top_move": 210, + "height_move": 125, + "row": [10, 15], + "column": [8, 8], + "row_focus": 10, + "column_focus": 8 + }], + "format": ["rgb(248, 105, 107)", "rgb(255, 235, 132)", "rgb(99, 190, 123)"] + }] +} + +// export default sheetConditionFormat; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetDataVerification.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetDataVerification.js new file mode 100644 index 000000000..ee93a9175 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetDataVerification.js @@ -0,0 +1,579 @@ +window.sheetDataVerification = { + "name": "Data Verification", + "index": "Sheet_pdolzzie5xwi_1600927444446", + "celldata": [{"r":0,"c":0,"v":{"ct":{"fa":"General","t":"g"},"m":"Drop Down List","v":"Drop Down List","bl":1}},{"r":0,"c":1,"v":{"m":"Checkbox","ct":{"fa":"General","t":"g"},"v":"Checkbox","bl":1}},{"r":0,"c":2,"v":{"ct":{"fa":"General","t":"g"},"v":"Number between 1-10","bl":1,"m":"Number between 1-10"}},{"r":0,"c":3,"v":{"m":"Text content include Luckysheet","ct":{"fa":"General","t":"g"},"v":"Text content include Luckysheet","bl":1}},{"r":0,"c":4,"v":{"ct":{"fa":"General","t":"g"},"v":"Text length between 1-5","m":"Text length between 1-5","bl":1}},{"r":0,"c":5,"v":{"m":"Date","ct":{"fa":"General","t":"g"},"v":"Date","bl":1}},{"r":0,"c":6,"v":{"m":"Identification Number","ct":{"fa":"General","t":"g"},"v":"Identification Number","bl":1}},{"r":0,"c":7,"v":{"m":"Phone Number","ct":{"fa":"General","t":"g"},"v":"Phone Number","bl":1}},{"r":1,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"Fix","m":"Fix"}},{"r":1,"c":1,"v":{"m":"Fail","ct":{"fa":"General","t":"g"},"v":"Fail"}},{"r":1,"c":2,"v":{"v":1,"ct":{"fa":"General","t":"n"},"m":"1"}},{"r":1,"c":3,"v":{"m":"Luckysheet is good","ct":{"fa":"General","t":"g"},"v":"Luckysheet is good"}},{"r":1,"c":4,"v":{"m":"Welcome","ct":{"fa":"General","t":"g"},"v":"Welcome"}},{"r":1,"c":5,"v":{"m":"2020-09-24","ct":{"fa":"yyyy-MM-dd","t":"d"},"v":44098}},{"r":1,"c":6,"v":{"v":"311414199009138910","ct":{"fa":"@","t":"s"},"m":"311414199009138910"}},{"r":1,"c":7,"v":{"v":13678765439,"ct":{"fa":"General","t":"n"},"m":"13678765439"}},{"r":2,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"Done","m":"Done"}},{"r":2,"c":1,"v":{"m":"Pass","ct":{"fa":"General","t":"g"},"v":"Pass"}},{"r":2,"c":2,"v":{"v":2,"ct":{"fa":"General","t":"n"},"m":"2"}},{"r":2,"c":3,"v":{"m":"I am Luckysheet","ct":{"fa":"General","t":"g"},"v":"I am Luckysheet"}},{"r":2,"c":4,"v":{"m":"Good","ct":{"fa":"General","t":"g"},"v":"Good"}},{"r":2,"c":5,"v":{"ct":{"fa":"General","t":"g"},"v":"Time","m":"Time"}},{"r":2,"c":6,"v":{"v":"31141419900913891","ct":{"fa":"@","t":"s"},"m":"31141419900913891"}},{"r":2,"c":7,"v":{"v":1367876544,"ct":{"fa":"General","t":"n"},"m":"1367876544"}},{"r":3,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"Develop","m":"Develop"}},{"r":3,"c":1,"v":{"m":"Fail","ct":{"fa":"General","t":"g"},"v":"Fail"}},{"r":3,"c":2,"v":{"v":5,"ct":{"fa":"General","t":"n"},"m":"5"}},{"r":3,"c":3,"v":{"ct":{"fa":"General","t":"g"},"v":"I am luckyDemo","m":"I am luckyDemo"}},{"r":3,"c":4,"v":{"m":"Nice","ct":{"fa":"General","t":"g"},"v":"Nice"}},{"r":3,"c":5,"v":{"m":"2020-09-26","ct":{"fa":"yyyy-MM-dd","t":"d"},"v":44100}},{"r":3,"c":6,"v":{"v":"3114141990091389102","ct":{"fa":"@","t":"s"},"m":"3114141990091389102"}},{"r":3,"c":7,"v":{"v":136787654412,"ct":{"fa":"##0","t":"n"},"m":"136787654412"}},{"r":4,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"Doing","m":"Doing"}},{"r":4,"c":1,"v":{"m":"Fail","ct":{"fa":"General","t":"g"},"v":"Fail"}},{"r":4,"c":2,"v":{"v":11,"ct":{"fa":"General","t":"n"},"m":"11"}},{"r":4,"c":3,"v":{"ct":{"fa":"General","t":"g"},"v":"Luckysheet Documentation","m":"Luckysheet Documentation"}},{"r":4,"c":4,"v":{"ct":{"fa":"General","t":"g"},"v":"Morning","m":"Morning"}},{"r":4,"c":5,"v":{"m":"2020-09-27","ct":{"fa":"yyyy-MM-dd","t":"d"},"v":44101}},{"r":4,"c":6,"v":{"v":"31141419900913891X","ct":{"fa":"@","t":"s"},"m":"31141419900913891X"}},{"r":4,"c":7,"v":{"v":49865342456,"ct":{"fa":"General","t":"n"},"m":"49865342456"}},{"r":5,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"Develop","m":"Develop"}},{"r":5,"c":1,"v":{"m":"Fail","ct":{"fa":"General","t":"g"},"v":"Fail"}},{"r":5,"c":2,"v":{"v":3,"ct":{"fa":"General","t":"n"},"m":"3"}},{"r":5,"c":3,"v":{"m":"Luckyexcel","ct":{"fa":"General","t":"g"},"v":"Luckyexcel"}},{"r":5,"c":4,"v":{"ct":{"fa":"General","t":"g"},"v":"Tomorrow","m":"Tomorrow"}},{"r":5,"c":5,"v":{"ct":{"fa":"yyyy-MM-dd","t":"d"},"v":44071,"m":"2020-08-28"}},{"r":5,"c":6,"v":{"v":"Number","ct":{"fa":"@","t":"s"},"m":"Number"}},{"r":5,"c":7,"v":{"v":"Number","ct":{"fa":"General","t":"g"},"m":"Number"}},{"r":6,"c":0,"v":{"ct":{"fa":"General","t":"g"},"v":"Done","m":"Done"}},{"r":6,"c":1,"v":{"m":"Pass","ct":{"fa":"General","t":"g"},"v":"Pass"}},{"r":6,"c":2,"v":{"v":0,"ct":{"fa":"General","t":"n"},"m":"0"}},{"r":6,"c":3,"v":{"m":"Luckysheet Online","ct":{"fa":"General","t":"g"},"v":"Luckysheet Online"}},{"r":6,"c":4,"v":{"m":"Three","ct":{"fa":"General","t":"g"},"v":"Three"}},{"r":6,"c":5,"v":{"m":"2020-09-29","ct":{"fa":"yyyy-MM-dd","t":"d"},"v":44103}},{"r":6,"c":6,"v":{"v":"311414199301118910","ct":{"fa":"@","t":"s"},"m":"311414199301118910"}},{"r":6,"c":7,"v":{"v":23309873564,"ct":{"fa":"General","t":"n"},"m":"23309873564"}},{"r":7,"c":8,"v":{"v":null,"ct":{"fa":"General","t":"g"},"bl":1}}], + "row": 84, + "column": 60, + "config": { + "merge": {}, + "rowlen": {}, + "columnlen": { + "0": 109, + "2": 143, + "3": 200, + "4": 180, + "6": 178, + "7": 125 + }, + "customWidth": { + "2": 1, + "3": 1, + "4": 1, + "6": 1, + "7": 1 + } + }, + "luckysheet_select_save": [ + { + "left": 963, + "width": 125, + "top": 240, + "height": 19, + "left_move": 963, + "width_move": 125, + "top_move": 240, + "height_move": 19, + "row": [ + 12, + 12 + ], + "column": [ + 7, + 7 + ], + "row_focus": 12, + "column_focus": 7 + } + ], + "dataVerification": { + "1_0": { + "type": "dropdown", + "type2": null, + "value1": "Develop,Fix,Done", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "2_0": { + "type": "dropdown", + "type2": null, + "value1": "Develop,Fix,Done", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "3_0": { + "type": "dropdown", + "type2": null, + "value1": "Develop,Fix,Done", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "4_0": { + "type": "dropdown", + "type2": null, + "value1": "Develop,Fix,Done", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "5_0": { + "type": "dropdown", + "type2": null, + "value1": "Develop,Fix,Done", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "6_0": { + "type": "dropdown", + "type2": null, + "value1": "Develop,Fix,Done", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "1_1": { + "type": "checkbox", + "type2": null, + "value1": "Pass", + "value2": "Fail", + "checked": false, + "remote": true, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "2_1": { + "type": "checkbox", + "type2": null, + "value1": "Pass", + "value2": "Fail", + "checked": true, + "remote": true, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "3_1": { + "type": "checkbox", + "type2": null, + "value1": "Pass", + "value2": "Fail", + "checked": false, + "remote": true, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "4_1": { + "type": "checkbox", + "type2": null, + "value1": "Pass", + "value2": "Fail", + "checked": false, + "remote": true, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "5_1": { + "type": "checkbox", + "type2": null, + "value1": "Pass", + "value2": "Fail", + "checked": false, + "remote": true, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "6_1": { + "type": "checkbox", + "type2": null, + "value1": "Pass", + "value2": "Fail", + "checked": true, + "remote": true, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "1_2": { + "type": "number", + "type2": "bw", + "value1": "1", + "value2": "10", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "2_2": { + "type": "number", + "type2": "bw", + "value1": "1", + "value2": "10", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "3_2": { + "type": "number", + "type2": "bw", + "value1": "1", + "value2": "10", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "4_2": { + "type": "number", + "type2": "bw", + "value1": "1", + "value2": "10", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "5_2": { + "type": "number", + "type2": "bw", + "value1": "1", + "value2": "10", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "6_2": { + "type": "number", + "type2": "bw", + "value1": "1", + "value2": "10", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "1_3": { + "type": "text_content", + "type2": "include", + "value1": "Luckysheet", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": true, + "hintText": "include Luckysheet" + }, + "2_3": { + "type": "text_content", + "type2": "include", + "value1": "Luckysheet", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": true, + "hintText": "include Luckysheet" + }, + "3_3": { + "type": "text_content", + "type2": "include", + "value1": "Luckysheet", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": true, + "hintText": "include Luckysheet" + }, + "4_3": { + "type": "text_content", + "type2": "include", + "value1": "Luckysheet", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": true, + "hintText": "include Luckysheet" + }, + "5_3": { + "type": "text_content", + "type2": "include", + "value1": "Luckysheet", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": true, + "hintText": "include Luckysheet" + }, + "6_3": { + "type": "text_content", + "type2": "include", + "value1": "Luckysheet", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": true, + "hintText": "include Luckysheet" + }, + "1_4": { + "type": "text_length", + "type2": "bw", + "value1": "1", + "value2": "5", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "2_4": { + "type": "text_length", + "type2": "bw", + "value1": "1", + "value2": "5", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "3_4": { + "type": "text_length", + "type2": "bw", + "value1": "1", + "value2": "5", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "4_4": { + "type": "text_length", + "type2": "bw", + "value1": "1", + "value2": "5", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "5_4": { + "type": "text_length", + "type2": "bw", + "value1": "1", + "value2": "5", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "6_4": { + "type": "text_length", + "type2": "bw", + "value1": "1", + "value2": "5", + "checked": false, + "remote": false, + "prohibitInput": true, + "hintShow": false, + "hintText": "" + }, + "1_5": { + "type": "date", + "type2": "bw", + "value1": "2020-09-23", + "value2": "2020-10-10", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "2_5": { + "type": "date", + "type2": "bw", + "value1": "2020-09-23", + "value2": "2020-10-10", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "3_5": { + "type": "date", + "type2": "bw", + "value1": "2020-09-23", + "value2": "2020-10-10", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "4_5": { + "type": "date", + "type2": "bw", + "value1": "2020-09-23", + "value2": "2020-10-10", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "5_5": { + "type": "date", + "type2": "bw", + "value1": "2020-09-23", + "value2": "2020-10-10", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "6_5": { + "type": "date", + "type2": "bw", + "value1": "2020-09-23", + "value2": "2020-10-10", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "1_6": { + "type": "validity", + "type2": "card", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "2_6": { + "type": "validity", + "type2": "card", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "3_6": { + "type": "validity", + "type2": "card", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "4_6": { + "type": "validity", + "type2": "card", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "5_6": { + "type": "validity", + "type2": "card", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "6_6": { + "type": "validity", + "type2": "card", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "1_7": { + "type": "validity", + "type2": "phone", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "2_7": { + "type": "validity", + "type2": "phone", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "3_7": { + "type": "validity", + "type2": "phone", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "4_7": { + "type": "validity", + "type2": "phone", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "5_7": { + "type": "validity", + "type2": "phone", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + }, + "6_7": { + "type": "validity", + "type2": "phone", + "value1": "", + "value2": "", + "checked": false, + "remote": false, + "prohibitInput": false, + "hintShow": false, + "hintText": "" + } + } +} +// export default sheetDataVerification; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetFormula.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetFormula.js new file mode 100644 index 000000000..1f1ee3682 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetFormula.js @@ -0,0 +1,6600 @@ + window.sheetFormula = { + "name": "Formula", + "color": "", + "config": { + "merge": { + "12_2": { + "rs": 1, + "cs": 6, + "r": 12, + "c": 2 + }, + "19_2": { + "rs": 1, + "cs": 6, + "r": 19, + "c": 2 + }, + "20_6": { + "rs": 1, + "cs": 5, + "r": 20, + "c": 6 + }, + "22_6": { + "rs": 1, + "cs": 2, + "r": 22, + "c": 6 + }, + "23_6": { + "rs": 1, + "cs": 2, + "r": 23, + "c": 6 + }, + "28_2": { + "rs": 1, + "cs": 6, + "r": 28, + "c": 2 + }, + "31_6": { + "rs": 1, + "cs": 3, + "r": 31, + "c": 6 + }, + "33_6": { + "rs": 1, + "cs": 3, + "r": 33, + "c": 6 + }, + "35_6": { + "rs": 1, + "cs": 3, + "r": 35, + "c": 6 + }, + "37_6": { + "rs": 1, + "cs": 3, + "r": 37, + "c": 6 + }, + "29_6": { + "r": 29, + "c": 6, + "rs": 1, + "cs": 3 + } + }, + "rowlen": {}, + "columnlen": { + "0": 111, + "2": 105, + "3": 82, + "4": 71, + "5": 84, + "6": 123, + "7": 48, + "8": 192, + "9": 56, + "10": 56 + } + }, + "index": "1", + "chart": [], + "order": "1", + "column": 18, + "row": 45, + "celldata": [{ + "r": 0, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 0, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 0, + "v": { + "v": "Basic Function", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Basic Function", + "bg": null, + "bl": 1, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 2, + "v": { + "v": "Name", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Name", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 3, + "v": { + "v": "Age", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Age", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 6, + "v": { + "v": "Indirect Function", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Indirect Function", + "bg": null, + "bl": 1, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 8, + "v": { + "v": "J2", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "J2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 9, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 1, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 2, + "v": { + "v": "Jack", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Jack", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 3, + "v": { + "v": 17, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "17", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 8, + "v": { + "v": "I", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "I", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 9, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 2, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 2, + "v": { + "v": "Lily", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Lily", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 3, + "v": { + "v": 23, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "23", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 8, + "v": { + "v": "J", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "J", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 9, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 3, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 2, + "v": { + "v": "Bob", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Bob", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 3, + "v": { + "v": 30, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "30", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 4, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 2, + "v": { + "v": "Mary", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Mary", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 3, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 8, + "v": { + "v": "=INDIRECT(\"I2\")", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "=INDIRECT(\"I2\")", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 5, + "c": 9, + "v": { + "v": "J2", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "J2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=INDIRECT(\"I2\")" + } + }, { + "r": 5, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 2, + "v": { + "v": "Average Age:", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Average Age:", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 3, + "v": { + "v": 23.75, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "23.75", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=AVERAGE(D3:D6)" + } + }, { + "r": 6, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 8, + "v": { + "v": "=INDIRECT(I2)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "=INDIRECT(I2)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 6, + "c": 9, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=INDIRECT(I2)" + } + }, { + "r": 6, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 2, + "v": { + "v": "Max Age:", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Max Age:", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 3, + "v": { + "v": 30, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "30", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=MAX(D3:D6)" + } + }, { + "r": 7, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 8, + "v": { + "v": "=INDIRECT(\"I\"&(1+2))", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "=INDIRECT(\"I\"&(1+2))", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 7, + "c": 9, + "v": { + "v": "I", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "I", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=INDIRECT(\"I\"&(1+2))" + } + }, { + "r": 7, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 2, + "v": { + "v": "Min Age:", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Min Age:", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 3, + "v": { + "v": 17, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "17", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=MIN(D3:D6)" + } + }, { + "r": 8, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 8, + "v": { + "v": "=INDIRECT(I4&J3)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "=INDIRECT(I4&J3)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 8, + "c": 9, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=INDIRECT(I4&J3)" + } + }, { + "r": 8, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 8, + "v": { + "v": "=INDIRECT(\"Formula!\"&I2)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "=INDIRECT(\"Formula!\"&I2)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 9, + "c": 9, + "v": { + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "v": 1, + "m": "1", + "f": "=INDIRECT(\"Formula!\"&I2)" + } + }, { + "r": 9, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 8, + "v": { + "v": "=INDIRECT(\"Formula!I2\")", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "=INDIRECT(\"Formula!I2\")", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 10, + "c": 9, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "m": "J2", + "v": "J2", + "f": "=INDIRECT(\"Formula!I2\")" + } + }, { + "r": 10, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 11, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 12, + "c": 0, + "v": { + "v": "Array Formula", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Array Formula", + "bg": null, + "bl": 1, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 12, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 12, + "c": 2, + "v": { + "v": "Calculation", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Calculation", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 6, + "r": 12, + "c": 2 + } + } + }, { + "r": 12, + "c": 3, + "v": { + "mc": { + "r": 12, + "c": 2 + } + } + }, { + "r": 12, + "c": 4, + "v": { + "mc": { + "r": 12, + "c": 2 + } + } + }, { + "r": 12, + "c": 5, + "v": { + "mc": { + "r": 12, + "c": 2 + } + } + }, { + "r": 12, + "c": 6, + "v": { + "mc": { + "r": 12, + "c": 2 + } + } + }, { + "r": 12, + "c": 7, + "v": { + "mc": { + "r": 12, + "c": 2 + } + } + }, { + "r": 12, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 12, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 12, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 3, + "v": { + "v": "Match", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Match", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 4, + "v": { + "v": "Physical", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Physical", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 5, + "v": { + "v": "Chemistry", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Chemistry", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 6, + "v": { + "v": "Alex", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Alex", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 7, + "v": { + "v": "Sum", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sum", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 13, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 2, + "v": { + "v": "Alice", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Alice", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 3, + "v": { + "v": 97, + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "m": "97" + } + }, { + "r": 14, + "c": 4, + "v": { + "v": 61, + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "m": "61" + } + }, { + "r": 14, + "c": 5, + "v": { + "v": 53, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "53", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 6, + "v": { + "v": 43, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "43", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 7, + "v": { + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "v": 207, + "m": "207", + "f": "=SUBTOTAL(9,OFFSET($D$15,ROW($D$15:$D$18)-ROW($D$15),1,3))" + } + }, { + "r": 14, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 14, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 2, + "v": { + "v": "John", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "John", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 3, + "v": { + "v": 65, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "65", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 4, + "v": { + "v": 76, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "76", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 5, + "v": { + "v": 65, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "65", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 6, + "v": { + "v": 55, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "55", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 7, + "v": { + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "v": 182, + "m": "182", + "f": "=SUBTOTAL(9,OFFSET(E15,ROW(E15:E18)-ROW(E15),1,3))" + } + }, { + "r": 15, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "ct": { + "fa": "General", + "t": "n" + } + } + }, { + "r": 15, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 15, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 2, + "v": { + "v": "Bob", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Bob", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 3, + "v": { + "v": 55, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "55", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 4, + "v": { + "v": 70, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "70", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 5, + "v": { + "v": 64, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "64", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 6, + "v": { + "v": 54, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "54", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 7, + "v": { + "v": 152, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "152", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUBTOTAL(9,OFFSET(F15,ROW(F15:F18)-ROW(F15),1,3))" + } + }, { + "r": 16, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 16, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 2, + "v": { + "v": "Jack", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Jack", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 3, + "v": { + "v": 89, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "89", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 4, + "v": { + "v": 77, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "77", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 5, + "v": { + "v": 73, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "73", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 6, + "v": { + "v": 73, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "73", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 7, + "v": { + "v": 541, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "541", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUBTOTAL(9,OFFSET(G15,ROW(G15:G18)-ROW(G15),1,3))" + } + }, { + "r": 17, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 17, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 18, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 19, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 19, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 19, + "c": 2, + "v": { + "v": "Search", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Search", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 6, + "r": 19, + "c": 2 + } + } + }, { + "r": 19, + "c": 3, + "v": { + "mc": { + "r": 19, + "c": 2 + } + } + }, { + "r": 19, + "c": 4, + "v": { + "mc": { + "r": 19, + "c": 2 + } + } + }, { + "r": 19, + "c": 5, + "v": { + "mc": { + "r": 19, + "c": 2 + } + } + }, { + "r": 19, + "c": 6, + "v": { + "mc": { + "r": 19, + "c": 2 + } + } + }, { + "r": 19, + "c": 7, + "v": { + "mc": { + "r": 19, + "c": 2 + } + } + }, { + "r": 19, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 19, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 19, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 2, + "v": { + "v": "apple", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "apple", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 3, + "v": { + "v": "apple", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "apple", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 20, + "c": 6, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 5, + "r": 20, + "c": 6 + } + } + }, { + "r": 20, + "c": 7, + "v": { + "mc": { + "r": 20, + "c": 6 + } + } + }, { + "r": 20, + "c": 8, + "v": { + "mc": { + "r": 20, + "c": 6 + } + } + }, { + "r": 20, + "c": 9, + "v": { + "mc": { + "r": 20, + "c": 6 + } + } + }, { + "r": 20, + "c": 10, + "v": { + "mc": { + "r": 20, + "c": 6 + } + } + }, { + "r": 21, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 2, + "v": { + "v": "banana", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "banana", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 3, + "v": { + "v": "pear", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "pear", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 21, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 2, + "v": { + "v": "pear", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "pear", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 3, + "v": { + "v": "potato", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "potato", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 22, + "c": 6, + "v": { + "v": "ArrayFormula Result:", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "ArrayFormula Result:", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 2, + "r": 22, + "c": 6 + } + } + }, { + "r": 22, + "c": 7, + "v": { + "mc": { + "r": 22, + "c": 6 + } + } + }, { + "r": 22, + "c": 8, + "v": { + "v": "dumpling", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "dumpling", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=INDEX(D21:D25,MATCH(\"dumpling\",D21:D25),1)" + } + }, { + "r": 22, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "ct": { + "fa": "General", + "t": "b" + } + } + }, { + "r": 22, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "ct": { + "fa": "General", + "t": "n" + } + } + }, { + "r": 23, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 23, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 23, + "c": 2, + "v": { + "v": "tomato", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "tomato", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 23, + "c": 3, + "v": { + "v": "potato", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "potato", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 23, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 23, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 23, + "c": 6, + "v": { + "v": "NomalFormula Result:", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "NomalFormula Result:", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 2, + "r": 23, + "c": 6 + } + } + }, { + "r": 23, + "c": 7, + "v": { + "mc": { + "r": 23, + "c": 6 + } + } + }, { + "r": 23, + "c": 8, + "v": { + "ct": { + "fa": "General", + "t": "b" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "m": "FALSE", + "v": false, + "f": "=ISNA(MATCH(D21:D25,C21:C27,0))" + } + }, { + "r": 23, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "ct": { + "fa": "General", + "t": "b" + } + } + }, { + "r": 23, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 2, + "v": { + "v": "potato", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "potato", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 3, + "v": { + "v": "dumpling", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "dumpling", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "ct": { + "fa": "General", + "t": "e" + } + } + }, { + "r": 24, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 24, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 2, + "v": { + "v": "cake", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "cake", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 25, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 2, + "v": { + "v": "noodel", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "noodel", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 26, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 3, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 4, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 6, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 27, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 28, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 28, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 28, + "c": 2, + "v": { + "v": "Statistics", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Statistics", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 6, + "r": 28, + "c": 2 + } + } + }, { + "r": 28, + "c": 3, + "v": { + "mc": { + "r": 28, + "c": 2 + } + } + }, { + "r": 28, + "c": 4, + "v": { + "mc": { + "r": 28, + "c": 2 + } + } + }, { + "r": 28, + "c": 5, + "v": { + "mc": { + "r": 28, + "c": 2 + } + } + }, { + "r": 28, + "c": 6, + "v": { + "mc": { + "r": 28, + "c": 2 + } + } + }, { + "r": 28, + "c": 7, + "v": { + "mc": { + "r": 28, + "c": 2 + } + } + }, { + "r": 28, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 28, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 28, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 2, + "v": { + "v": "Product", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Product", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 3, + "v": { + "v": "Salesman", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Salesman", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 4, + "v": { + "v": "Units Sold", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Units Sold", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 6, + "v": { + "v": "Summing Sales: Faxes Sold By Brown", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Summing Sales: Faxes Sold By Brown", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "r": 29, + "c": 6, + "rs": 1, + "cs": 3 + } + } + }, { + "r": 29, + "c": 7, + "v": { + "mc": { + "r": 29, + "c": 6 + } + } + }, { + "r": 29, + "c": 8, + "v": { + "mc": { + "r": 29, + "c": 6 + } + } + }, { + "r": 29, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 29, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 2, + "v": { + "v": "Fax", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fax", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 3, + "v": { + "v": "Brown", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Brown", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 4, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 6, + "v": { + "v": 61, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "61", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUM((C31:C39=\"Fax\")*(D31:D39=\"Brown\")*(E31:E39))" + } + }, { + "r": 30, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 30, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 2, + "v": { + "v": "Phone", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Phone", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 3, + "v": { + "v": "Smith", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Smith", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 4, + "v": { + "v": 10, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "10", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 6, + "v": { + "v": "Logical AND (Faxes And Brown)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Logical AND (Faxes And Brown)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 3, + "r": 31, + "c": 6 + } + } + }, { + "r": 31, + "c": 7, + "v": { + "mc": { + "r": 31, + "c": 6 + } + } + }, { + "r": 31, + "c": 8, + "v": { + "mc": { + "r": 31, + "c": 6 + } + } + }, { + "r": 31, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 31, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 2, + "v": { + "v": "Fax", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fax", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 3, + "v": { + "v": "Jones", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Jones", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 4, + "v": { + "v": 20, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "20", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 6, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUM((C31:C39=\"Fax\")*(D31:D39=\"Brown\"))" + } + }, { + "r": 32, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 32, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 2, + "v": { + "v": "Fax", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fax", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 3, + "v": { + "v": "Smith", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Smith", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 4, + "v": { + "v": 30, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "30", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 6, + "v": { + "v": "Logical OR (Faxes Or Jones)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Logical OR (Faxes Or Jones)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 3, + "r": 33, + "c": 6 + } + } + }, { + "r": 33, + "c": 7, + "v": { + "mc": { + "r": 33, + "c": 6 + } + } + }, { + "r": 33, + "c": 8, + "v": { + "mc": { + "r": 33, + "c": 6 + } + } + }, { + "r": 33, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 33, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 2, + "v": { + "v": "Phone", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Phone", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 3, + "v": { + "v": "Jones", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Jones", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 4, + "v": { + "v": 40, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "40", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 6, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUM(IF((C31:C39=\"Fax\")+(D31:D39=\"Jones\"),1,0))" + } + }, { + "r": 34, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 34, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 2, + "v": { + "v": "PC", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "PC", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 3, + "v": { + "v": "Smith", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Smith", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 4, + "v": { + "v": 50, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "50", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 6, + "v": { + "v": "Logical XOR (Fax Or Jones but not both)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Logical XOR (Fax Or Jones but not both)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 3, + "r": 35, + "c": 6 + } + } + }, { + "r": 35, + "c": 7, + "v": { + "mc": { + "r": 35, + "c": 6 + } + } + }, { + "r": 35, + "c": 8, + "v": { + "mc": { + "r": 35, + "c": 6 + } + } + }, { + "r": 35, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 35, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 2, + "v": { + "v": "Fax", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Fax", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 3, + "v": { + "v": "Brown", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Brown", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 4, + "v": { + "v": 60, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "60", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 6, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUM(IF(MOD((C31:C39=\"Fax\")+(D31:D39=\"Jones\"),2),1,0))" + } + }, { + "r": 36, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 36, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 2, + "v": { + "v": "Phone", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Phone", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 3, + "v": { + "v": "Davis", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Davis", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 4, + "v": { + "v": 70, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "70", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 6, + "v": { + "v": "Logical NAND (All Sales Except Fax And Jones)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Logical NAND (All Sales Except Fax And Jones)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "mc": { + "rs": 1, + "cs": 3, + "r": 37, + "c": 6 + } + } + }, { + "r": 37, + "c": 7, + "v": { + "mc": { + "r": 37, + "c": 6 + } + } + }, { + "r": 37, + "c": 8, + "v": { + "mc": { + "r": 37, + "c": 6 + } + } + }, { + "r": 37, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 37, + "c": 10, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 0, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 1, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 2, + "v": { + "v": "PC", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "PC", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 3, + "v": { + "v": "Jones", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Jones", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 4, + "v": { + "v": 80, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "80", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 5, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 6, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0, + "f": "=SUM(IF((C31:C39=\"Fax\")+(D31:D39=\"Jones\")<>2,1,0))" + } + }, { + "r": 38, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 8, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 9, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 10, + "fc": "rgb(0, 0, 0)", + "ht": 1, + "vt": 0 + } + }, { + "r": 38, + "c": 10, + "v": {} + }], + "calcChain": [{ + "r": 6, + "c": 3, + "index": 1, + // "func": [true, 23.75, "=AVERAGE(D3:D6)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 7, + "c": 3, + "index": 1, + // "func": [true, 30, "=MAX(D3:D6)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 8, + "c": 3, + "index": 1, + // "func": [true, 17, "=MIN(D3:D6)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 5, + "c": 9, + "index": 1, + // "func": [true, "J2", "=INDIRECT(\"I2\")"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 6, + "c": 9, + "index": 1, + // "func": [true, 1, "=INDIRECT(I2)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 7, + "c": 9, + "index": 1, + // "func": [true, "I", "=INDIRECT(\"I\"&(1+2))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 8, + "c": 9, + "index": 1, + // "func": [true, 1, "=INDIRECT(I4&J3)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 16, + "c": 7, + "index": 1, + // "func": [true, 152, "=SUBTOTAL(9,OFFSET(F15,ROW(F15:F18)-ROW(F15),1,3))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 17, + "c": 7, + "index": 1, + // "func": [true, 541, "=SUBTOTAL(9,OFFSET(G15,ROW(G15:G18)-ROW(G15),1,3))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 22, + "c": 8, + "index": 1, + // "func": [true, "dumpling", "=INDEX(D21:D25,MATCH(\"dumpling\",D21:D25),1)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 38, + "c": 6, + "index": 1, + // "func": [true, 1, "=SUM(IF((C31:C39=\"Fax\")+(D31:D39=\"Jones\")<>2,1,0))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 30, + "c": 6, + "index": 1, + // "func": [true, "#NAME?", "=SUM((C31:C39=\"Fax\")*(D31:D39=\"Brown\")*(E31:E39))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 32, + "c": 6, + "index": 1, + // "func": [true, "#NAME?", "=SUM((C31:C39=\"Fax\")*(D31:D39=\"Brown\"))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 34, + "c": 6, + "index": 1, + // "func": [true, 1, "=SUM(IF((C31:C39=\"Fax\")+(D31:D39=\"Jones\"),1,0))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 36, + "c": 6, + "index": 1, + // "func": [true, 1, "=SUM(IF(MOD((C31:C39=\"Fax\")+(D31:D39=\"Jones\"),2),1,0))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 9, + "c": 9, + "index": 1, + // "func": [true, 1, "=INDIRECT(\"Formula!\"&I2)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 10, + "c": 9, + "index": 1, + // "func": [true, "J2", "=INDIRECT(\"Formula!I2\")"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 14, + "c": 7, + "index": 1, + // "func": [true, 207, "=SUBTOTAL(9,OFFSET($D$15,ROW($D$15:$D$18)-ROW($D$15),1,3))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 15, + "c": 7, + "index": 1, + // "func": [true, 182, "=SUBTOTAL(9,OFFSET(E15,ROW(E15:E18)-ROW(E15),1,3))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 23, + "c": 8, + "index": 1, + // "func": [true, false, "=ISNA(MATCH(D21:D25,C21:C27,0))"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }], + "ch_width": 1723, + "rh_height": 1010, + "luckysheet_select_save": [{ + "left": 532, + "width": 123, + "top": 780, + "height": 19, + "left_move": 532, + "width_move": 123, + "top_move": 780, + "height_move": 19, + "row": [39, 39], + "column": [6, 6], + "row_focus": 39, + "column_focus": 6 + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 0, + "frozen": {"type":"row"} +} + +// export default sheetFormula \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetPicture.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetPicture.js new file mode 100644 index 000000000..c328988f4 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetPicture.js @@ -0,0 +1,159 @@ +window.sheetPicture = { + "name": "Picture", + "index": "Sheet_3e4oe25C757r_1600925108337", + "celldata": [], + "row": 84, + "column": 60, + "config": { + "rowlen": { + "2": 31, + "4": 66 + }, + "customHeight": { + "2": 1, + "4": 1 + }, + "merge": {}, + "columnlen": { + "8": 105 + }, + "customWidth": { + "8": 1 + } + }, + celldata:[{"r":0,"c":0,"v":{"v":null,"bl":1}},{"r":1,"c":1,"v":{"ct":{"fa":"General","t":"g"},"v":"Border","bl":1,"tb":"1","m":"Border"}},{"r":1,"c":8,"v":{"m":"Fixed Position","ct":{"fa":"General","t":"g"},"v":"Fixed Position","bl":1}},{"r":4,"c":8,"v":{}},{"r":5,"c":1,"v":{"ct":{"fa":"General","t":"g"},"v":"Move and resize cells","bl":1,"tb":"1","m":"Move and resize cells"}},{"r":5,"c":8,"v":{"m":"Move and don't resize the cell","ct":{"fa":"General","t":"g"},"v":"Move and don't resize the cell","bl":1,"tb":"1"}},{"r":6,"c":0,"v":{"v":"","ct":{"fa":"General","t":"g"},"m":""}}], + "luckysheet_select_save": [ + { + "left": 444, + "width": 73, + "top": 239, + "height": 19, + "left_move": 444, + "width_move": 73, + "top_move": 239, + "height_move": 19, + "row": [ + 9, + 9 + ], + "column": [ + 6, + 6 + ], + "row_focus": 9, + "column_focus": 6 + } + ], + "images": { + "img_wx5a6n0A1ael_1600925814407": { + "type": "3", + "src": "data:image/png;base64,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", + "originWidth": 304, + "originHeight": 64, + "default": { + "width": 304, + "height": 64, + "left": 80, + "top": 45 + }, + "crop": { + "width": 304, + "height": 64, + "offsetLeft": 0, + "offsetTop": 0 + }, + "isFixedPos": false, + "fixedLeft": 268, + "fixedTop": 297, + "border": { + "width": 2, + "radius": "dashed", + "style": "solid", + "color": "#ff0000" + } + }, + "img_5034067dpM6W_1600925833775": { + "type": "1", + "src": "data:image/png;base64,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", + "originWidth": 304, + "originHeight": 64, + "default": { + "width": 304, + "height": 64, + "left": 79, + "top": 187 + }, + "crop": { + "width": 304, + "height": 64, + "offsetLeft": 0, + "offsetTop": 0 + }, + "isFixedPos": false, + "fixedLeft": 268, + "fixedTop": 297, + "border": { + "width": 0, + "radius": 0, + "style": "solid", + "color": "#000" + } + }, + "img_8s8lnsidWmWo_1600925835996": { + "type": "3", + "src": "data:image/png;base64,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", + "originWidth": 304, + "originHeight": 64, + "default": { + "width": 304, + "height": 64, + "left": 563, + "top": 50 + }, + "crop": { + "width": 304, + "height": 64, + "offsetLeft": 0, + "offsetTop": 0 + }, + "isFixedPos": true, + "fixedLeft": 641, + "fixedTop": 193, + "border": { + "width": 0, + "radius": 0, + "style": "solid", + "color": "#000" + } + }, + "img_ni1an0tek2ko_1600926607293": { + "type": "2", + "src": "data:image/png;base64,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", + "originWidth": 304, + "originHeight": 64, + "default": { + "width": 304, + "height": 64, + "left": 598, + "top": 187 + }, + "crop": { + "width": 304, + "height": 64, + "offsetLeft": 0, + "offsetTop": 0 + }, + "isFixedPos": false, + "fixedLeft": 638, + "fixedTop": 309, + "border": { + "width": 0, + "radius": 0, + "style": "solid", + "color": "#000" + } + } + } +} + +// export default sheetPicture; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetPivotTable.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetPivotTable.js new file mode 100644 index 000000000..b938b4142 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetPivotTable.js @@ -0,0 +1,189 @@ +window.sheetPivotTable = { + "name": "PivotTable", + "color": "", + "config": {}, + "index": "7", + "chart": [], + "status": 0, + "order": "7", + "column": 18, + "row": 36, + "celldata": [{ + "r": 0, + "c": 0, + "v": "count:score" + }, { + "r": 0, + "c": 1, + "v": "science" + }, { + "r": 0, + "c": 2, + "v": "mathematics" + }, { + "r": 0, + "c": 3, + "v": "foreign language" + }, { + "r": 0, + "c": 4, + "v": "English" + }, { + "r": 0, + "c": 5, + "v": "total" + }, { + "r": 1, + "c": 0, + "v": "Alex" + }, { + "r": 1, + "c": 1, + "v": 1 + }, { + "r": 1, + "c": 2, + "v": 1 + }, { + "r": 1, + "c": 3, + "v": 1 + }, { + "r": 1, + "c": 4, + "v": 1 + }, { + "r": 1, + "c": 5, + "v": 4 + }, { + "r": 2, + "c": 0, + "v": "Joy" + }, { + "r": 2, + "c": 1, + "v": 1 + }, { + "r": 2, + "c": 2, + "v": 1 + }, { + "r": 2, + "c": 3, + "v": 1 + }, { + "r": 2, + "c": 4, + "v": 1 + }, { + "r": 2, + "c": 5, + "v": 4 + }, { + "r": 3, + "c": 0, + "v": "Tim" + }, { + "r": 3, + "c": 1, + "v": 1 + }, { + "r": 3, + "c": 2, + "v": 1 + }, { + "r": 3, + "c": 3, + "v": 1 + }, { + "r": 3, + "c": 4, + "v": 1 + }, { + "r": 3, + "c": 5, + "v": 4 + }, { + "r": 4, + "c": 0, + "v": "total" + }, { + "r": 4, + "c": 1, + "v": 3 + }, { + "r": 4, + "c": 2, + "v": 3 + }, { + "r": 4, + "c": 3, + "v": 3 + }, { + "r": 4, + "c": 4, + "v": 3 + }, { + "r": 4, + "c": 5, + "v": 12 + }], + "ch_width": 4748, + "rh_height": 1790, + "luckysheet_select_save": [{ + "row": [0, 0], + "column": [0, 0] + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 0, + "isPivotTable": true, + "pivotTable": { + "pivot_select_save": { + "left": 0, + "width": 73, + "top": 0, + "height": 19, + "left_move": 0, + "width_move": 369, + "top_move": 0, + "height_move": 259, + "row": [0, 12], + "column": [0, 4], + "row_focus": 0, + "column_focus": 0 + }, + "pivotDataSheetIndex": 6, //The sheet index where the source data is located + "column": [{ + "index": 3, + "name": "subject", + "fullname": "subject" + }], + "row": [{ + "index": 1, + "name": "student", + "fullname": "student" + }], + "filter": [], + "values": [{ + "index": 4, + "name": "score", + "fullname": "count:score", + "sumtype": "COUNTA", + "nameindex": 0 + }], + "showType": "column", + "pivotDatas": [ + ["count:score", "science", "mathematics", "foreign language", "English", "total"], + ["Alex", 1, 1, 1, 1, 4], + ["Joy", 1, 1, 1, 1, 4], + ["Tim", 1, 1, 1, 1, 4], + ["total", 3, 3, 3, 3, 12] + ], + "drawPivotTable": false, + "pivotTableBoundary": [5, 6] + } +} + +// export default sheetPivotTable; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetPivotTableData.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetPivotTableData.js new file mode 100644 index 000000000..3e3407c0c --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetPivotTableData.js @@ -0,0 +1,741 @@ +window.sheetPivotTableData = { + "name": "PivotTableData", + "color": "", + "config": { + "merge": {} + }, + "index": "6", + "chart": [], + "status": 0, + "order": "6", + "hide": 0, + "column": 18, + "row": 36, + "celldata": [{ + "r": 0, + "c": 0, + "v": { + "m": "Mock test", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Mock test" + } + }, { + "r": 0, + "c": 1, + "v": { + "m": "student", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "student" + } + }, { + "r": 0, + "c": 2, + "v": { + "m": "class", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "class" + } + }, { + "r": 0, + "c": 3, + "v": { + "m": "subject", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "subject" + } + }, { + "r": 0, + "c": 4, + "v": { + "m": "score", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "score" + } + }, { + "r": 1, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 1, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Joy", + "m": "Joy" + } + }, { + "r": 1, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 1, + "c": 3, + "v": { + "m": "English", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "English" + } + }, { + "r": 1, + "c": 4, + "v": { + "v": 96, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "96" + } + }, { + "r": 2, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 2, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Joy", + "m": "Joy" + } + }, { + "r": 2, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 2, + "c": 3, + "v": { + "m": "mathematics", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "mathematics" + } + }, { + "r": 2, + "c": 4, + "v": { + "v": 110, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "110" + } + }, { + "r": 3, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 3, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Joy", + "m": "Joy" + } + }, { + "r": 3, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 3, + "c": 3, + "v": { + "m": "foreign language", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "foreign language" + } + }, { + "r": 3, + "c": 4, + "v": { + "v": 87, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "87" + } + }, { + "r": 4, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 4, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Joy", + "m": "Joy" + } + }, { + "r": 4, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 4, + "c": 3, + "v": { + "m": "science", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "science" + } + }, { + "r": 4, + "c": 4, + "v": { + "v": 266, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "266" + } + }, { + "r": 5, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 5, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Tim", + "m": "Tim" + } + }, { + "r": 5, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 5, + "c": 3, + "v": { + "m": "English", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "English" + } + }, { + "r": 5, + "c": 4, + "v": { + "v": 92, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "92" + } + }, { + "r": 6, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 6, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Tim", + "m": "Tim" + } + }, { + "r": 6, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 6, + "c": 3, + "v": { + "m": "mathematics", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "mathematics" + } + }, { + "r": 6, + "c": 4, + "v": { + "v": 100, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "100" + } + }, { + "r": 7, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 7, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Tim", + "m": "Tim" + } + }, { + "r": 7, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 7, + "c": 3, + "v": { + "m": "foreign language", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "foreign language" + } + }, { + "r": 7, + "c": 4, + "v": { + "v": 90, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "90" + } + }, { + "r": 8, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 8, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Tim", + "m": "Tim" + } + }, { + "r": 8, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 8, + "c": 3, + "v": { + "m": "science", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "science" + } + }, { + "r": 8, + "c": 4, + "v": { + "v": 255, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "255" + } + }, { + "r": 9, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 9, + "c": 1, + "v": { + "m": "Alex", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Alex" + } + }, { + "r": 9, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 9, + "c": 3, + "v": { + "m": "English", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "English" + } + }, { + "r": 9, + "c": 4, + "v": { + "v": 108, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "108" + } + }, { + "r": 10, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 10, + "c": 1, + "v": { + "m": "Alex", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Alex" + } + }, { + "r": 10, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 10, + "c": 3, + "v": { + "m": "mathematics", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "mathematics" + } + }, { + "r": 10, + "c": 4, + "v": { + "v": 117, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "117" + } + }, { + "r": 11, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 11, + "c": 1, + "v": { + "m": "Alex", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Alex" + } + }, { + "r": 11, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 11, + "c": 3, + "v": { + "m": "foreign language", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "foreign language" + } + }, { + "r": 11, + "c": 4, + "v": { + "v": 88, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "88" + } + }, { + "r": 12, + "c": 0, + "v": { + "m": "first round", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "first round" + } + }, { + "r": 12, + "c": 1, + "v": { + "m": "Alex", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Alex" + } + }, { + "r": 12, + "c": 2, + "v": { + "m": "Class one", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Class one" + } + }, { + "r": 12, + "c": 3, + "v": { + "m": "science", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "science" + } + }, { + "r": 12, + "c": 4, + "v": { + "v": 278, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "278" + } + }], + "ch_width": 4748, + "rh_height": 1790, + "luckysheet_select_save": [{ + "row": [0, 0], + "column": [0, 0] + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 0 +} + +// export default sheetPivotTableData; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetSparkline.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetSparkline.js new file mode 100644 index 000000000..031c445b0 --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetSparkline.js @@ -0,0 +1,7066 @@ +window.sheetSparkline = { + "name": "Sparkline", + "color": "", + "config": { + "merge": { + "1_2": { + "r": 1, + "c": 2, + "rs": 1, + "cs": 2 + }, + "1_4": { + "r": 1, + "c": 4, + "rs": 1, + "cs": 2 + }, + "0_0": { + "r": 0, + "c": 0, + "rs": 1, + "cs": 6 + }, + "2_2": { + "r": 2, + "c": 2, + "rs": 3, + "cs": 2 + }, + "2_4": { + "r": 2, + "c": 4, + "rs": 3, + "cs": 2 + }, + "6_0": { + "r": 6, + "c": 0, + "rs": 1, + "cs": 5 + }, + "7_2": { + "r": 7, + "c": 2, + "rs": 1, + "cs": 2 + }, + "8_2": { + "r": 8, + "c": 2, + "rs": 3, + "cs": 2 + }, + "12_0": { + "r": 12, + "c": 0, + "rs": 1, + "cs": 5 + }, + "13_2": { + "r": 13, + "c": 2, + "rs": 1, + "cs": 3 + }, + "14_2": { + "r": 14, + "c": 2, + "rs": 4, + "cs": 3 + }, + "19_0": { + "r": 19, + "c": 0, + "rs": 1, + "cs": 5 + }, + "0_9": { + "r": 0, + "c": 9, + "rs": 1, + "cs": 5 + }, + "1_12": { + "r": 1, + "c": 12, + "rs": 1, + "cs": 2 + }, + "2_12": { + "r": 2, + "c": 12, + "rs": 1, + "cs": 2 + }, + "3_12": { + "r": 3, + "c": 12, + "rs": 1, + "cs": 2 + }, + "4_12": { + "r": 4, + "c": 12, + "rs": 1, + "cs": 2 + }, + "6_6": { + "r": 6, + "c": 6, + "rs": 1, + "cs": 8 + }, + "7_6": { + "r": 7, + "c": 6, + "rs": 1, + "cs": 2 + }, + "7_11": { + "r": 7, + "c": 11, + "rs": 1, + "cs": 3 + }, + "8_6": { + "r": 8, + "c": 6, + "rs": 1, + "cs": 2 + }, + "9_6": { + "r": 9, + "c": 6, + "rs": 1, + "cs": 2 + }, + "10_6": { + "r": 10, + "c": 6, + "rs": 1, + "cs": 2 + }, + "8_11": { + "r": 8, + "c": 11, + "rs": 3, + "cs": 3 + }, + "13_6": { + "r": 13, + "c": 6, + "rs": 1, + "cs": 7 + }, + "14_7": { + "r": 14, + "c": 7, + "rs": 1, + "cs": 2 + }, + "14_9": { + "r": 14, + "c": 9, + "rs": 1, + "cs": 2 + }, + "14_11": { + "r": 14, + "c": 11, + "rs": 1, + "cs": 2 + }, + "15_6": { + "r": 15, + "c": 6, + "rs": 2, + "cs": 1 + }, + "17_7": { + "r": 17, + "c": 7, + "rs": 1, + "cs": 2 + }, + "17_9": { + "r": 17, + "c": 9, + "rs": 1, + "cs": 2 + }, + "17_11": { + "r": 17, + "c": 11, + "rs": 1, + "cs": 2 + }, + "18_7": { + "r": 18, + "c": 7, + "rs": 1, + "cs": 2 + }, + "18_9": { + "r": 18, + "c": 9, + "rs": 1, + "cs": 2 + }, + "18_11": { + "r": 18, + "c": 11, + "rs": 1, + "cs": 2 + }, + "19_7": { + "r": 19, + "c": 7, + "rs": 1, + "cs": 2 + }, + "19_9": { + "r": 19, + "c": 9, + "rs": 1, + "cs": 2 + }, + "19_11": { + "r": 19, + "c": 11, + "rs": 1, + "cs": 2 + }, + "20_7": { + "r": 20, + "c": 7, + "rs": 1, + "cs": 2 + }, + "20_9": { + "r": 20, + "c": 9, + "rs": 1, + "cs": 2 + }, + "20_11": { + "r": 20, + "c": 11, + "rs": 1, + "cs": 2 + }, + "21_7": { + "r": 21, + "c": 7, + "rs": 1, + "cs": 2 + }, + "21_9": { + "r": 21, + "c": 9, + "rs": 1, + "cs": 2 + }, + "21_11": { + "r": 21, + "c": 11, + "rs": 1, + "cs": 2 + }, + "15_7": { + "r": 15, + "c": 7, + "rs": 2, + "cs": 7 + }, + "20_0": { + "r": 20, + "c": 0, + "rs": 1, + "cs": 5 + }, + "21_3": { + "r": 21, + "c": 3, + "rs": 1, + "cs": 2 + }, + "22_3": { + "r": 22, + "c": 3, + "rs": 3, + "cs": 2 + }, + "27_2": { + "r": 27, + "c": 2, + "rs": 1, + "cs": 3 + } + }, + "rowlen": { + "0": 29, + "1": 20, + "2": 20, + "3": 20, + "4": 20, + "6": 29, + "7": 20, + "8": 20, + "9": 20, + "10": 20, + "12": 29, + "13": 29, + "14": 20, + "15": 20, + "16": 26, + "17": 20, + "18": 20, + "19": 29, + "20": 29, + "21": 20, + "22": 20, + "23": 20, + "24": 20, + "25": 20, + "27": 100, + "28": 20, + "29": 20, + "30": 20, + "31": 20, + "32": 20, + "33": 20, + "34": 26, + "35": 20, + "36": 20, + "37": 20, + "38": 20, + "39": 20, + "40": 20, + "41": 20, + "42": 20, + "43": 20, + "44": 20, + "45": 20, + "46": 20, + "47": 20, + "48": 20, + "49": 20, + "50": 20, + "51": 20, + "52": 20, + "53": 20, + "54": 20, + "55": 20, + "56": 20, + "57": 20 + }, + "columnlen": { + "0": 101, + "2": 131, + "3": 30, + "4": 90 + }, + "borderInfo": [{ + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 6, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 7, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 8, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 9, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 10, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 11, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 12, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }, { + "rangeType": "cell", + "value": { + "row_index": 7, + "col_index": 13, + "b": { + "style": 13, + "color": "rgb(0, 0, 0)" + } + } + }] + }, + "index": "4", + "chart": [], + "status": 0, + "order": "4", + "column": 18, + "row": 36, + "celldata": [{ + "r": 0, + "c": 0, + "v": { + "v": "The company revenue in 2014", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "The company revenue in 2014", + "mc": { + "r": 0, + "c": 0, + "rs": 1, + "cs": 6 + }, + "fs": "14", + "ht": "0", + "vt": "0" + } + }, { + "r": 0, + "c": 1, + "v": { + "mc": { + "r": 0, + "c": 0 + }, + "fs": "14", + "ht": "0", + "vt": "0" + } + }, { + "r": 0, + "c": 2, + "v": { + "mc": { + "r": 0, + "c": 0 + }, + "fs": "14", + "ht": "0", + "vt": "0" + } + }, { + "r": 0, + "c": 3, + "v": { + "mc": { + "r": 0, + "c": 0 + }, + "fs": "14", + "ht": "0", + "vt": "0" + } + }, { + "r": 0, + "c": 4, + "v": { + "mc": { + "r": 0, + "c": 0 + }, + "fs": "14", + "ht": "0", + "vt": "0" + } + }, { + "r": 0, + "c": 5, + "v": { + "mc": { + "r": 0, + "c": 0 + }, + "fs": "14", + "ht": "0", + "vt": "0" + } + }, { + "r": 0, + "c": 9, + "v": { + "v": "Mobile Phone Contrast", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Mobile Phone Contrast", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 16, + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 0, + "c": 9, + "rs": 1, + "cs": 5 + } + } + }, { + "r": 0, + "c": 10, + "v": { + "mc": { + "r": 0, + "c": 9 + } + } + }, { + "r": 0, + "c": 11, + "v": { + "mc": { + "r": 0, + "c": 9 + } + } + }, { + "r": 0, + "c": 12, + "v": { + "mc": { + "r": 0, + "c": 9 + } + } + }, { + "r": 0, + "c": 13, + "v": { + "mc": { + "r": 0, + "c": 9 + } + } + }, { + "r": 1, + "c": 0, + "v": { + "m": "Month", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Month", + "bg": "#f1c232", + "fc": "#ffffff", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 1, + "v": { + "m": "Revenue", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Revenue", + "bg": "#f1c232", + "fc": "#ffffff", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 2, + "v": { + "m": "Diagram 1", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Diagram 1", + "mc": { + "r": 1, + "c": 2, + "rs": 1, + "cs": 2 + }, + "bg": "#f1c232", + "fc": "#ffffff", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 3, + "v": { + "mc": { + "r": 1, + "c": 2 + }, + "bg": "#f1c232", + "fc": "#ffffff", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 4, + "v": { + "m": "Diagram 2", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Diagram 2", + "mc": { + "r": 1, + "c": 4, + "rs": 1, + "cs": 2 + }, + "bg": "#f1c232", + "fc": "#ffffff", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 5, + "v": { + "mc": { + "r": 1, + "c": 4 + }, + "bg": "#f1c232", + "fc": "#ffffff", + "ht": "1", + "vt": "0" + } + }, { + "r": 1, + "c": 9, + "v": { + "v": null, + "m": "", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 1, + "c": 10, + "v": { + "v": "Phone I", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Phone I", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 1, + "c": 11, + "v": { + "v": "Phone II", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Phone II", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 1, + "c": 12, + "v": { + "v": "Diagram", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Diagram", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0, + "mc": { + "r": 1, + "c": 12, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 1, + "c": 13, + "v": { + "mc": { + "r": 1, + "c": 12 + } + } + }, { + "r": 2, + "c": 0, + "v": { + "m": "2014-02-01", + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "v": 41671 + } + }, { + "r": 2, + "c": 1, + "v": { + "v": 30, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "30", + "ht": "0", + "vt": "0" + } + }, { + "r": 2, + "c": 2, + "v": { + "mc": { + "r": 2, + "c": 2, + "rs": 3, + "cs": 2 + }, + "f": "=LINESPLINES(B3:B5,'pink',4,'avg','yellow','red','green',3)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Shape", + "args": [0, [ + [0, 21], + [0, 21], + [80, 54], + [159, 3] + ], "pink", null, 4] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, null, 159, null, null, "yellow"] + }, + "2": { + "id": 2, + "type": "Circle", + "args": [2, 80, 54, 3, null, "green", null] + }, + "3": { + "id": 3, + "type": "Circle", + "args": [3, 159, 3, 3, null, "red", null] + } + }, + "shapeseq": [0, 1, 2, 3], + "offsetX": 0, + "offsetY": 5, + "pixelWidth": 162, + "pixelHeight": 58 + } + } + }, { + "r": 2, + "c": 3, + "v": { + "mc": { + "r": 2, + "c": 2 + } + } + }, { + "r": 2, + "c": 4, + "v": { + "mc": { + "r": 2, + "c": 4, + "rs": 3, + "cs": 2 + }, + "f": "=COLUMNSPLINES(B3:B5,35,'red','green','auto','brown')", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 108, 1, 18, 29, "red", "red"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 54, 31, 18, 21, "green", "green"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 0, 20, 18, 10, "brown", "brown"] + } + }, + "shapeseq": [0, 1, 2], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 164, + "pixelHeight": 63 + } + } + }, { + "r": 2, + "c": 5, + "v": { + "mc": { + "r": 2, + "c": 4 + } + } + }, { + "r": 2, + "c": 9, + "v": { + "v": "Size(inch)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Size(inch)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 10, + "v": { + "v": 5, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "5", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 2, + "c": 11, + "v": { + "v": 3.7, + "ct": { + "fa": "0.0", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "3.7" + } + }, { + "r": 2, + "c": 12, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 2, + "c": 12, + "rs": 1, + "cs": 2 + }, + "f": "=STACKBARSPLINES(K3:L3)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 10, 107, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 0, 145, 8, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 147, + "pixelHeight": 21 + }, + "ct": { + "fa": "General", + "t": "n" + } + } + }, { + "r": 2, + "c": 13, + "v": { + "mc": { + "r": 2, + "c": 12 + } + } + }, { + "r": 3, + "c": 0, + "v": { + "m": "2014-03-01", + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "v": 41699 + } + }, { + "r": 3, + "c": 1, + "v": { + "v": -60, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "-60", + "ht": "0", + "vt": "0" + } + }, { + "r": 3, + "c": 2, + "v": { + "mc": { + "r": 2, + "c": 2 + } + } + }, { + "r": 3, + "c": 3, + "v": { + "mc": { + "r": 2, + "c": 2 + } + } + }, { + "r": 3, + "c": 4, + "v": { + "mc": { + "r": 2, + "c": 4 + } + } + }, { + "r": 3, + "c": 5, + "v": { + "mc": { + "r": 2, + "c": 4 + } + } + }, { + "r": 3, + "c": 9, + "v": { + "v": "RAM(G)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "RAM(G)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 10, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 11, + "v": { + "v": 1, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 3, + "c": 12, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 3, + "c": 12, + "rs": 1, + "cs": 2 + }, + "f": "=STACKBARSPLINES(K4:L4)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 10, 47, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 0, 145, 8, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 147, + "pixelHeight": 21 + } + } + }, { + "r": 3, + "c": 13, + "v": { + "mc": { + "r": 3, + "c": 12 + } + } + }, { + "r": 4, + "c": 0, + "v": { + "m": "2014-04-01", + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "v": 41730 + } + }, { + "r": 4, + "c": 1, + "v": { + "v": 80, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "80", + "ht": "0", + "vt": "0" + } + }, { + "r": 4, + "c": 2, + "v": { + "mc": { + "r": 2, + "c": 2 + } + } + }, { + "r": 4, + "c": 3, + "v": { + "mc": { + "r": 2, + "c": 2 + } + } + }, { + "r": 4, + "c": 4, + "v": { + "mc": { + "r": 2, + "c": 4 + } + } + }, { + "r": 4, + "c": 5, + "v": { + "mc": { + "r": 2, + "c": 4 + } + } + }, { + "r": 4, + "c": 9, + "v": { + "v": "Weight(g)", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Weight(g)", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 10, + "v": { + "v": 149, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "149", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 11, + "v": { + "v": 129, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "129", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 4, + "c": 12, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 4, + "c": 12, + "rs": 1, + "cs": 2 + }, + "f": "=STACKBARSPLINES(K5:L5)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 10, 125, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 0, 145, 8, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 147, + "pixelHeight": 21 + } + } + }, { + "r": 4, + "c": 13, + "v": { + "mc": { + "r": 4, + "c": 12 + } + } + }, { + "r": 6, + "c": 0, + "v": { + "v": "My Assets", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "My Assets", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": "14", + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 6, + "c": 0, + "rs": 1, + "cs": 5 + } + } + }, { + "r": 6, + "c": 1, + "v": { + "mc": { + "r": 6, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 6, + "c": 2, + "v": { + "mc": { + "r": 6, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 6, + "c": 3, + "v": { + "mc": { + "r": 6, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 6, + "c": 4, + "v": { + "mc": { + "r": 6, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 6, + "c": 6, + "v": { + "v": "Checkbook Register", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Checkbook Register", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 16, + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 6, + "c": 6, + "rs": 1, + "cs": 8 + } + } + }, { + "r": 6, + "c": 7, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 6, + "c": 8, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 6, + "c": 9, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 6, + "c": 10, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 6, + "c": 11, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 6, + "c": 12, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 6, + "c": 13, + "v": { + "mc": { + "r": 6, + "c": 6 + } + } + }, { + "r": 7, + "c": 0, + "v": { + "v": "Asset Type", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Asset Type", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": "0" + } + }, { + "r": 7, + "c": 1, + "v": { + "v": "Amount", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Amount", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": "0" + } + }, { + "r": 7, + "c": 2, + "v": { + "v": "Diagram", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Diagram", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": "0", + "mc": { + "r": 7, + "c": 2, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 7, + "c": 3, + "v": { + "mc": { + "r": 7, + "c": 2 + }, + "fs": "10", + "ht": "1", + "vt": "0" + } + }, { + "r": 7, + "c": 4, + "v": { + "v": "Note", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Note", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": "10", + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": "0" + } + }, { + "r": 7, + "c": 6, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 7, + "c": 6, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 7, + "c": 7, + "v": { + "mc": { + "r": 7, + "c": 6 + } + } + }, { + "r": 7, + "c": 8, + "v": { + "v": "InitialValue", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "InitialValue", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 9, + "v": { + "v": 815.25, + "ct": { + "fa": "0.00", + "t": "n" + }, + "m": "815.25", + "bg": null, + "bl": 1, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 7, + "c": 10, + "v": { + "v": "Σ", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Σ", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 1 + } + }, { + "r": 7, + "c": 11, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 7, + "c": 11, + "rs": 1, + "cs": 3 + } + } + }, { + "r": 7, + "c": 12, + "v": { + "mc": { + "r": 7, + "c": 11 + } + } + }, { + "r": 7, + "c": 13, + "v": { + "mc": { + "r": 7, + "c": 11 + } + } + }, { + "r": 8, + "c": 0, + "v": { + "v": "Savings", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Savings", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 1, + "v": { + "v": 25000, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 25000" + } + }, { + "r": 8, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 8, + "c": 2, + "rs": 3, + "cs": 2 + }, + "f": "=PIESPLINES(B9:B11)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "PieSlice", + "args": [0, 31, 31, 31, 5.291103416572283, 6.283185307179586, null, "#5ab1ef"] + }, + "1": { + "id": 1, + "type": "PieSlice", + "args": [1, 31, 31, 31, 1.6534698176788385, 5.291103416572283, null, "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "PieSlice", + "args": [2, 31, 31, 31, 0, 1.6534698176788385, null, "#2ec7c9"] + } + }, + "shapeseq": [0, 1, 2], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 162, + "pixelHeight": 63 + } + } + }, { + "r": 8, + "c": 3, + "v": { + "mc": { + "r": 8, + "c": 2 + } + } + }, { + "r": 8, + "c": 4, + "v": { + "v": 0.2631578947368421, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0.263157895", + "bg": "rgb(145, 159, 129)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "f": "=B9/SUM(B9:B11)" + } + }, { + "r": 8, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 8, + "c": 6, + "v": { + "v": "12/11/2012", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "12/11/2012", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 8, + "c": 6, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 8, + "c": 7, + "v": { + "mc": { + "r": 8, + "c": 6 + } + } + }, { + "r": 8, + "c": 8, + "v": { + "v": "CVS", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "CVS", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 9, + "v": { + "v": -200, + "ct": { + "fa": "0.00", + "t": "n" + }, + "m": "-200.00", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 10, + "v": { + "v": 615.25, + "ct": { + "fa": "0.00", + "t": "n" + }, + "m": "615.25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 8, + "c": 11, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "f": "=BARSPLINES(J9:J11)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 56, 42, 53, 19, "#97b552", "#97b552"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 110, 21, 108, 19, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 89, 0, 20, 19, "#97b552", "#97b552"] + } + }, + "shapeseq": [0, 1, 2], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 221, + "pixelHeight": 63 + }, + "mc": { + "r": 8, + "c": 11, + "rs": 3, + "cs": 3 + } + } + }, { + "r": 8, + "c": 12, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 8, + "c": 13, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 9, + "c": 0, + "v": { + "v": "401k", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "401k", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 1, + "v": { + "v": 55000, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 55000" + } + }, { + "r": 9, + "c": 2, + "v": { + "mc": { + "r": 8, + "c": 2 + } + } + }, { + "r": 9, + "c": 3, + "v": { + "mc": { + "r": 8, + "c": 2 + } + } + }, { + "r": 9, + "c": 4, + "v": { + "v": 0.5789473684210527, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0.578947368", + "bg": "rgb(215, 145, 62)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "f": "=B10/SUM(B9:B11)" + } + }, { + "r": 9, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 9, + "c": 6, + "v": { + "v": "12/12/2012", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "12/12/2012", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 9, + "c": 6, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 9, + "c": 7, + "v": { + "mc": { + "r": 9, + "c": 6 + } + } + }, { + "r": 9, + "c": 8, + "v": { + "v": "Bank", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Bank", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 9, + "v": { + "v": 1000.12, + "ct": { + "fa": "#,##0.00", + "t": "n" + }, + "m": "1,000.12", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 10, + "v": { + "v": 1615.37, + "ct": { + "fa": "#,##0.00", + "t": "n" + }, + "m": "1,615.37", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 9, + "c": 11, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 9, + "c": 12, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 9, + "c": 13, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 10, + "c": 0, + "v": { + "v": "Stocks", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Stocks", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 1, + "v": { + "v": 15000, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 15000" + } + }, { + "r": 10, + "c": 2, + "v": { + "mc": { + "r": 8, + "c": 2 + } + } + }, { + "r": 10, + "c": 3, + "v": { + "mc": { + "r": 8, + "c": 2 + } + } + }, { + "r": 10, + "c": 4, + "v": { + "v": 0.15789473684210525, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0.157894737", + "bg": "rgb(206, 167, 34)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "f": "=B11/SUM(B9:B11)" + } + }, { + "r": 10, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 10, + "c": 6, + "v": { + "v": "12/13/2012", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "12/13/2012", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 10, + "c": 6, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 10, + "c": 7, + "v": { + "mc": { + "r": 10, + "c": 6 + } + } + }, { + "r": 10, + "c": 8, + "v": { + "v": "Starbucks", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Starbucks", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 9, + "v": { + "v": -500.43, + "ct": { + "fa": "0.00", + "t": "n" + }, + "m": "-500.43", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 10, + "v": { + "v": 1114.94, + "ct": { + "fa": "#,##0.00", + "t": "n" + }, + "m": "1,114.94", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 10, + "c": 11, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 10, + "c": 12, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 10, + "c": 13, + "v": { + "mc": { + "r": 8, + "c": 11 + } + } + }, { + "r": 12, + "c": 0, + "v": { + "v": "Sales by State", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sales by State", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": "14", + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 12, + "c": 0, + "rs": 1, + "cs": 5 + } + } + }, { + "r": 12, + "c": 1, + "v": { + "mc": { + "r": 12, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 12, + "c": 2, + "v": { + "mc": { + "r": 12, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 12, + "c": 3, + "v": { + "mc": { + "r": 12, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 12, + "c": 4, + "v": { + "mc": { + "r": 12, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 13, + "c": 0, + "v": { + "v": "State", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "State", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": 1 + } + }, { + "r": 13, + "c": 1, + "v": { + "v": "Sales", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Sales", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": 1 + } + }, { + "r": 13, + "c": 2, + "v": { + "v": "Diagram", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Diagram", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": "1", + "vt": 1, + "mc": { + "r": 13, + "c": 2, + "rs": 1, + "cs": 3 + } + } + }, { + "r": 13, + "c": 3, + "v": { + "mc": { + "r": 13, + "c": 2 + }, + "ht": "1" + } + }, { + "r": 13, + "c": 4, + "v": { + "mc": { + "r": 13, + "c": 2 + }, + "ht": "1" + } + }, { + "r": 13, + "c": 6, + "v": { + "v": "Student Grade Statistics", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Student Grade Statistics", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 16, + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 13, + "c": 6, + "rs": 1, + "cs": 7 + } + } + }, { + "r": 13, + "c": 7, + "v": { + "mc": { + "r": 13, + "c": 6 + } + } + }, { + "r": 13, + "c": 8, + "v": { + "mc": { + "r": 13, + "c": 6 + } + } + }, { + "r": 13, + "c": 9, + "v": { + "mc": { + "r": 13, + "c": 6 + } + } + }, { + "r": 13, + "c": 10, + "v": { + "mc": { + "r": 13, + "c": 6 + } + } + }, { + "r": 13, + "c": 11, + "v": { + "mc": { + "r": 13, + "c": 6 + } + } + }, { + "r": 13, + "c": 12, + "v": { + "mc": { + "r": 13, + "c": 6 + } + } + }, { + "r": 13, + "c": 13, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 0, + "v": { + "v": "Idaho", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Idaho", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 14, + "c": 1, + "v": { + "v": 3500, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 3500" + } + }, { + "r": 14, + "c": 2, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 14, + "c": 2, + "rs": 4, + "cs": 3 + }, + "f": "=AREASPLINES(B15:B18)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Shape", + "args": [0, [ + [0, 87], + [0, 61], + [84, 0], + [169, 87], + [253, 35], + [253, 87] + ], "#CCF3F4", "#CCF3F4", null] + }, + "1": { + "id": 1, + "type": "Shape", + "args": [1, [ + [0, 61], + [0, 61], + [84, 0], + [169, 87], + [253, 35] + ], "#2ec7c9", null, 1] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 2, + "pixelWidth": 253, + "pixelHeight": 88 + } + } + }, { + "r": 14, + "c": 3, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 14, + "c": 4, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 14, + "c": 6, + "v": { + "v": "Name", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Name", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 14, + "c": 7, + "v": { + "v": "Chinese", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Chinese", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0, + "mc": { + "r": 14, + "c": 7, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 14, + "c": 8, + "v": { + "mc": { + "r": 14, + "c": 7 + } + } + }, { + "r": 14, + "c": 9, + "v": { + "v": "Math", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Math", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0, + "mc": { + "r": 14, + "c": 9, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 14, + "c": 10, + "v": { + "mc": { + "r": 14, + "c": 9 + } + } + }, { + "r": 14, + "c": 11, + "v": { + "v": "English", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "English", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0, + "mc": { + "r": 14, + "c": 11, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 14, + "c": 12, + "v": { + "mc": { + "r": 14, + "c": 11 + } + } + }, { + "r": 14, + "c": 13, + "v": { + "v": "Total", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Total", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 15, + "c": 0, + "v": { + "v": "Montana", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Montana", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 15, + "c": 1, + "v": { + "v": 7000, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 7000" + } + }, { + "r": 15, + "c": 2, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 15, + "c": 3, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 15, + "c": 4, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 15, + "c": 6, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 15, + "c": 6, + "rs": 2, + "cs": 1 + } + } + }, { + "r": 15, + "c": 7, + "v": { + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "ct": { + "fa": "General", + "t": "g" + }, + "f": "=TRISTATESPLINES(H18:N22,10)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 476, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 462, 23, 3, 1, "#999", "#999"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 448, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 434, 23, 3, 1, "#999", "#999"] + }, + "4": { + "id": 4, + "type": "Rect", + "args": [4, 420, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "5": { + "id": 5, + "type": "Rect", + "args": [5, 406, 23, 3, 1, "#999", "#999"] + }, + "6": { + "id": 6, + "type": "Rect", + "args": [6, 392, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "7": { + "id": 7, + "type": "Rect", + "args": [7, 378, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "8": { + "id": 8, + "type": "Rect", + "args": [8, 364, 23, 3, 1, "#999", "#999"] + }, + "9": { + "id": 9, + "type": "Rect", + "args": [9, 350, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "10": { + "id": 10, + "type": "Rect", + "args": [10, 336, 23, 3, 1, "#999", "#999"] + }, + "11": { + "id": 11, + "type": "Rect", + "args": [11, 322, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "12": { + "id": 12, + "type": "Rect", + "args": [12, 308, 23, 3, 1, "#999", "#999"] + }, + "13": { + "id": 13, + "type": "Rect", + "args": [13, 294, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "14": { + "id": 14, + "type": "Rect", + "args": [14, 280, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "15": { + "id": 15, + "type": "Rect", + "args": [15, 266, 23, 3, 1, "#999", "#999"] + }, + "16": { + "id": 16, + "type": "Rect", + "args": [16, 252, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "17": { + "id": 17, + "type": "Rect", + "args": [17, 238, 23, 3, 1, "#999", "#999"] + }, + "18": { + "id": 18, + "type": "Rect", + "args": [18, 224, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "19": { + "id": 19, + "type": "Rect", + "args": [19, 210, 23, 3, 1, "#999", "#999"] + }, + "20": { + "id": 20, + "type": "Rect", + "args": [20, 196, 24, 3, 22, "#97b552", "#97b552"] + }, + "21": { + "id": 21, + "type": "Rect", + "args": [21, 182, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "22": { + "id": 22, + "type": "Rect", + "args": [22, 168, 23, 3, 1, "#999", "#999"] + }, + "23": { + "id": 23, + "type": "Rect", + "args": [23, 154, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "24": { + "id": 24, + "type": "Rect", + "args": [24, 140, 23, 3, 1, "#999", "#999"] + }, + "25": { + "id": 25, + "type": "Rect", + "args": [25, 126, 24, 3, 22, "#97b552", "#97b552"] + }, + "26": { + "id": 26, + "type": "Rect", + "args": [26, 112, 23, 3, 1, "#999", "#999"] + }, + "27": { + "id": 27, + "type": "Rect", + "args": [27, 98, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "28": { + "id": 28, + "type": "Rect", + "args": [28, 84, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "29": { + "id": 29, + "type": "Rect", + "args": [29, 70, 23, 3, 1, "#999", "#999"] + }, + "30": { + "id": 30, + "type": "Rect", + "args": [30, 56, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "31": { + "id": 31, + "type": "Rect", + "args": [31, 42, 23, 3, 1, "#999", "#999"] + }, + "32": { + "id": 32, + "type": "Rect", + "args": [32, 28, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "33": { + "id": 33, + "type": "Rect", + "args": [33, 14, 23, 3, 1, "#999", "#999"] + }, + "34": { + "id": 34, + "type": "Rect", + "args": [34, 0, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 517, + "pixelHeight": 48 + }, + "mc": { + "r": 15, + "c": 7, + "rs": 2, + "cs": 7 + } + } + }, { + "r": 15, + "c": 8, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 15, + "c": 9, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 15, + "c": 10, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 15, + "c": 11, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 15, + "c": 12, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 15, + "c": 13, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 0, + "v": { + "v": "Oregon", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Oregon", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 16, + "c": 1, + "v": { + "v": 2000, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 2000" + } + }, { + "r": 16, + "c": 2, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 16, + "c": 3, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 16, + "c": 4, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 16, + "c": 6, + "v": { + "mc": { + "r": 15, + "c": 6 + } + } + }, { + "r": 16, + "c": 7, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 8, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 9, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 10, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 11, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 12, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 16, + "c": 13, + "v": { + "mc": { + "r": 15, + "c": 7 + } + } + }, { + "r": 17, + "c": 0, + "v": { + "v": "Washington", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Washington", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 1, + "v": { + "v": 5000, + "ct": { + "fa": "\"$\" #", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "$ 5000" + } + }, { + "r": 17, + "c": 2, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 17, + "c": 3, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 17, + "c": 4, + "v": { + "mc": { + "r": 14, + "c": 2 + } + } + }, { + "r": 17, + "c": 6, + "v": { + "v": "Student 1", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Student 1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 17, + "c": 7, + "v": { + "v": 70, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "70", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 17, + "c": 7, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 17, + "c": 8, + "v": { + "mc": { + "r": 17, + "c": 7 + } + } + }, { + "r": 17, + "c": 9, + "v": { + "v": 90, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "90", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 17, + "c": 9, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 17, + "c": 10, + "v": { + "mc": { + "r": 17, + "c": 9 + } + } + }, { + "r": 17, + "c": 11, + "v": { + "v": 51, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "51", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 17, + "c": 11, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 17, + "c": 12, + "v": { + "mc": { + "r": 17, + "c": 11 + } + } + }, { + "r": 17, + "c": 13, + "v": { + "v": 211, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "211", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 18, + "c": 6, + "v": { + "v": "Student 2", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Student 2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 18, + "c": 7, + "v": { + "v": 99, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "99", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 18, + "c": 7, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 18, + "c": 8, + "v": { + "mc": { + "r": 18, + "c": 7 + } + } + }, { + "r": 18, + "c": 9, + "v": { + "v": -59, + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 18, + "c": 9, + "rs": 1, + "cs": 2 + }, + "m": "-59" + } + }, { + "r": 18, + "c": 10, + "v": { + "mc": { + "r": 18, + "c": 9 + } + } + }, { + "r": 18, + "c": 11, + "v": { + "v": 63, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "63", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 18, + "c": 11, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 18, + "c": 12, + "v": { + "mc": { + "r": 18, + "c": 11 + } + } + }, { + "r": 18, + "c": 13, + "v": { + "v": 221, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "221", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 19, + "c": 0, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": "14", + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 19, + "c": 0, + "rs": 1, + "cs": 5 + } + } + }, { + "r": 19, + "c": 1, + "v": { + "mc": { + "r": 19, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 19, + "c": 2, + "v": { + "mc": { + "r": 19, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 19, + "c": 3, + "v": { + "mc": { + "r": 19, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 19, + "c": 4, + "v": { + "mc": { + "r": 19, + "c": 0 + }, + "fs": "14" + } + }, { + "r": 19, + "c": 6, + "v": { + "v": "Student 3", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Student 3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 19, + "c": 7, + "v": { + "v": -90, + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 19, + "c": 7, + "rs": 1, + "cs": 2 + }, + "m": "-90" + } + }, { + "r": 19, + "c": 8, + "v": { + "mc": { + "r": 19, + "c": 7 + } + } + }, { + "r": 19, + "c": 9, + "v": { + "v": 128, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "128", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 19, + "c": 9, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 19, + "c": 10, + "v": { + "mc": { + "r": 19, + "c": 9 + } + } + }, { + "r": 19, + "c": 11, + "v": { + "v": 74, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "74", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 19, + "c": 11, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 19, + "c": 12, + "v": { + "mc": { + "r": 19, + "c": 11 + } + } + }, { + "r": 19, + "c": 13, + "v": { + "v": 291, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "291", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 20, + "c": 0, + "v": { + "v": "Employee KPI", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Employee KPI", + "bg": null, + "bl": 0, + "it": 0, + "ff": 9, + "fs": 16, + "fc": "rgb(51, 51, 51)", + "ht": 0, + "vt": 0, + "mc": { + "r": 20, + "c": 0, + "rs": 1, + "cs": 5 + } + } + }, { + "r": 20, + "c": 1, + "v": { + "mc": { + "r": 20, + "c": 0 + } + } + }, { + "r": 20, + "c": 2, + "v": { + "mc": { + "r": 20, + "c": 0 + } + } + }, { + "r": 20, + "c": 3, + "v": { + "mc": { + "r": 20, + "c": 0 + } + } + }, { + "r": 20, + "c": 4, + "v": { + "mc": { + "r": 20, + "c": 0 + } + } + }, { + "r": 20, + "c": 6, + "v": { + "v": "Student 4", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Student 4", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 20, + "c": 7, + "v": { + "v": 93, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "93", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 20, + "c": 7, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 20, + "c": 8, + "v": { + "mc": { + "r": 20, + "c": 7 + } + } + }, { + "r": 20, + "c": 9, + "v": { + "v": 61, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "61", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 20, + "c": 9, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 20, + "c": 10, + "v": { + "mc": { + "r": 20, + "c": 9 + } + } + }, { + "r": 20, + "c": 11, + "v": { + "v": 53, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "53", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 20, + "c": 11, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 20, + "c": 12, + "v": { + "mc": { + "r": 20, + "c": 11 + } + } + }, { + "r": 20, + "c": 13, + "v": { + "v": 207, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "207", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 21, + "c": 0, + "v": { + "v": "Name", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Name", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 21, + "c": 1, + "v": { + "v": "Forecast", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Forecast", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 21, + "c": 2, + "v": { + "v": "Actuality", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Actuality", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0 + } + }, { + "r": 21, + "c": 3, + "v": { + "v": "Diagram", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Diagram", + "bg": "rgb(255, 192, 0)", + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(255, 255, 255)", + "ht": 0, + "vt": 0, + "mc": { + "r": 21, + "c": 3, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 21, + "c": 4, + "v": { + "mc": { + "r": 21, + "c": 3 + } + } + }, { + "r": 21, + "c": 6, + "v": { + "v": "Student 5", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Student 5", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 21, + "c": 7, + "v": { + "v": 106, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "106", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 21, + "c": 7, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 21, + "c": 8, + "v": { + "mc": { + "r": 21, + "c": 7 + } + } + }, { + "r": 21, + "c": 9, + "v": { + "v": 82, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "82", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 21, + "c": 9, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 21, + "c": 10, + "v": { + "mc": { + "r": 21, + "c": 9 + } + } + }, { + "r": 21, + "c": 11, + "v": { + "v": 80, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "80", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "mc": { + "r": 21, + "c": 11, + "rs": 1, + "cs": 2 + } + } + }, { + "r": 21, + "c": 12, + "v": { + "mc": { + "r": 21, + "c": 11 + } + } + }, { + "r": 21, + "c": 13, + "v": { + "v": 268, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "268", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 0, + "v": { + "v": "Employee 1", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Employee 1", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 1, + "v": { + "v": 6, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "6", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 22, + "c": 2, + "v": { + "v": 2, + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2" + } + }, { + "r": 22, + "c": 3, + "v": { + "mc": { + "r": 22, + "c": 3, + "rs": 3, + "cs": 2 + }, + "f": "=STACKCOLUMNSPLINES(B23:C25)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 60, 57, 58, 5, "#2ec7c9", "#2ec7c9"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 60, 36, 58, 20, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 60, 27, 58, 8, "#5ab1ef", "#5ab1ef"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 0, 45, 58, 17, "#2ec7c9", "#2ec7c9"] + }, + "4": { + "id": 4, + "type": "Rect", + "args": [4, 0, 21, 58, 23, "#fc5c5c", "#fc5c5c"] + }, + "5": { + "id": 5, + "type": "Rect", + "args": [5, 0, 3, 58, 17, "#5ab1ef", "#5ab1ef"] + } + }, + "shapeseq": [0, 1, 2, 3, 4, 5], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 121, + "pixelHeight": 63 + } + } + }, { + "r": 22, + "c": 4, + "v": { + "mc": { + "r": 22, + "c": 3 + } + } + }, { + "r": 23, + "c": 0, + "v": { + "v": "Employee 2", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Employee 2", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 1, + "v": { + "v": 8, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "8", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 2, + "v": { + "v": 7, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "7", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 23, + "c": 3, + "v": { + "mc": { + "r": 22, + "c": 3 + } + } + }, { + "r": 23, + "c": 4, + "v": { + "mc": { + "r": 22, + "c": 3 + } + } + }, { + "r": 23, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 24, + "c": 0, + "v": { + "v": "Employee 3", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Employee 3", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 24, + "c": 1, + "v": { + "v": 6, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "6", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 24, + "c": 2, + "v": { + "v": 3, + "ct": { + "fa": "General", + "t": "n" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "3" + } + }, { + "r": 24, + "c": 3, + "v": { + "mc": { + "r": 22, + "c": 3 + } + } + }, { + "r": 24, + "c": 4, + "v": { + "mc": { + "r": 22, + "c": 3 + } + } + }, { + "r": 25, + "c": 0, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 1, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 2, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 3, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 25, + "c": 4, + "v": { + "v": null, + "m": "", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 27, + "c": 0, + "v": { + "v": 42370, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-01" + } + }, { + "r": 27, + "c": 1, + "v": { + "v": 12, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "12", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 27, + "c": 2, + "v": { + "f": "=DISCRETESPLINES(B28:B58,30)", + "spl": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 240, 14, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 232, 55, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 224, 57, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 216, 49, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "4": { + "id": 4, + "type": "Rect", + "args": [4, 208, 68, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "5": { + "id": 5, + "type": "Rect", + "args": [5, 200, 71, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "6": { + "id": 6, + "type": "Rect", + "args": [6, 192, 45, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "7": { + "id": 7, + "type": "Rect", + "args": [7, 184, 64, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "8": { + "id": 8, + "type": "Rect", + "args": [8, 176, 30, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "9": { + "id": 9, + "type": "Rect", + "args": [9, 168, 32, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "10": { + "id": 10, + "type": "Rect", + "args": [10, 160, 14, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "11": { + "id": 11, + "type": "Rect", + "args": [11, 152, 12, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "12": { + "id": 12, + "type": "Rect", + "args": [12, 144, 0, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "13": { + "id": 13, + "type": "Rect", + "args": [13, 136, 65, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "14": { + "id": 14, + "type": "Rect", + "args": [14, 128, 7, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "15": { + "id": 15, + "type": "Rect", + "args": [15, 120, 9, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "16": { + "id": 16, + "type": "Rect", + "args": [16, 112, 54, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "17": { + "id": 17, + "type": "Rect", + "args": [17, 104, 3, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "18": { + "id": 18, + "type": "Rect", + "args": [18, 96, 33, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "19": { + "id": 19, + "type": "Rect", + "args": [19, 88, 1, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "20": { + "id": 20, + "type": "Rect", + "args": [20, 80, 53, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "21": { + "id": 21, + "type": "Rect", + "args": [21, 72, 7, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "22": { + "id": 22, + "type": "Rect", + "args": [22, 64, 25, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "23": { + "id": 23, + "type": "Rect", + "args": [23, 56, 8, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "24": { + "id": 24, + "type": "Rect", + "args": [24, 48, 59, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "25": { + "id": 25, + "type": "Rect", + "args": [25, 40, 22, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "26": { + "id": 26, + "type": "Rect", + "args": [26, 32, 46, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "27": { + "id": 27, + "type": "Rect", + "args": [27, 24, 60, 6, 30, "#fc5c5c", "#fc5c5c"] + }, + "28": { + "id": 28, + "type": "Rect", + "args": [28, 16, 32, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "29": { + "id": 29, + "type": "Rect", + "args": [29, 8, 25, 6, 30, "#2ec7c9", "#2ec7c9"] + }, + "30": { + "id": 30, + "type": "Rect", + "args": [30, 0, 62, 6, 30, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 253, + "pixelHeight": 101 + }, + "mc": { + "r": 27, + "c": 2, + "rs": 1, + "cs": 3 + } + } + }, { + "r": 27, + "c": 3, + "v": { + "mc": { + "r": 27, + "c": 2 + } + } + }, { + "r": 27, + "c": 4, + "v": { + "mc": { + "r": 27, + "c": 2 + } + } + }, { + "r": 28, + "c": 0, + "v": { + "v": 42371, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-02" + } + }, { + "r": 28, + "c": 1, + "v": { + "v": 64, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "64", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 29, + "c": 0, + "v": { + "v": 42372, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-03" + } + }, { + "r": 29, + "c": 1, + "v": { + "v": 54, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "54", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 30, + "c": 0, + "v": { + "v": 42373, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-04" + } + }, { + "r": 30, + "c": 1, + "v": { + "v": 15, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "15", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 31, + "c": 0, + "v": { + "v": 42374, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-05" + } + }, { + "r": 31, + "c": 1, + "v": { + "v": 35, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "35", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 31, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 32, + "c": 0, + "v": { + "v": 42375, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-06" + } + }, { + "r": 32, + "c": 1, + "v": { + "v": 67, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "67", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 32, + "c": 2, + "v": { + "f": "=BARSPLINES(B22:B25)" + } + }, { + "r": 32, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 33, + "c": 0, + "v": { + "v": 42376, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-07" + } + }, { + "r": 33, + "c": 1, + "v": { + "v": 16, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "16", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 33, + "c": 2, + "v": { + "f": "=STACKBARSPLINES(B22:B25)" + } + }, { + "r": 33, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 34, + "c": 0, + "v": { + "v": 42377, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-08" + } + }, { + "r": 34, + "c": 1, + "v": { + "v": 87, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "87", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 34, + "c": 2, + "v": { + "f": "=DISCRETESPLINES(B22:B25)" + } + }, { + "r": 34, + "c": 5, + "v": { + "ct": { + "fa": "General", + "t": "g" + } + } + }, { + "r": 34, + "c": 7, + "v": { + "ct": { + "fa": "General", + "t": "n" + } + } + }, { + "r": 35, + "c": 0, + "v": { + "v": 42378, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-09" + } + }, { + "r": 35, + "c": 1, + "v": { + "v": 64, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "64", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 35, + "c": 2, + "v": { + "f": "=TRISTATESPLINES(B22:B25)" + } + }, { + "r": 36, + "c": 0, + "v": { + "v": 42379, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-10" + } + }, { + "r": 36, + "c": 1, + "v": { + "v": 88, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "88", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 36, + "c": 2, + "v": { + "ct": { + "fa": "General", + "t": "e" + } + } + }, { + "r": 37, + "c": 0, + "v": { + "v": 42380, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-11" + } + }, { + "r": 37, + "c": 1, + "v": { + "v": 25, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "25", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 38, + "c": 0, + "v": { + "v": 42381, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-12" + } + }, { + "r": 38, + "c": 1, + "v": { + "v": 96, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "96", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 39, + "c": 0, + "v": { + "v": 42382, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-13" + } + }, { + "r": 39, + "c": 1, + "v": { + "v": 53, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "53", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 40, + "c": 0, + "v": { + "v": 42383, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-14" + } + }, { + "r": 40, + "c": 1, + "v": { + "v": 94, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "94", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 41, + "c": 0, + "v": { + "v": 42384, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-15" + } + }, { + "r": 41, + "c": 1, + "v": { + "v": 23, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "23", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 42, + "c": 0, + "v": { + "v": 42385, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-16" + } + }, { + "r": 42, + "c": 1, + "v": { + "v": 85, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "85", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 43, + "c": 0, + "v": { + "v": 42386, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-17" + } + }, { + "r": 43, + "c": 1, + "v": { + "v": 89, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "89", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 44, + "c": 0, + "v": { + "v": 42387, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-18" + } + }, { + "r": 44, + "c": 1, + "v": { + "v": 8, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "8", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 45, + "c": 0, + "v": { + "v": 42388, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-19" + } + }, { + "r": 45, + "c": 1, + "v": { + "v": 98, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "98", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 46, + "c": 0, + "v": { + "v": 42389, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-20" + } + }, { + "r": 46, + "c": 1, + "v": { + "v": 82, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "82", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 47, + "c": 0, + "v": { + "v": 42390, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-21" + } + }, { + "r": 47, + "c": 1, + "v": { + "v": 79, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "79", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 48, + "c": 0, + "v": { + "v": 42391, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-22" + } + }, { + "r": 48, + "c": 1, + "v": { + "v": 54, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "54", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 49, + "c": 0, + "v": { + "v": 42392, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-23" + } + }, { + "r": 49, + "c": 1, + "v": { + "v": 56, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "56", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 50, + "c": 0, + "v": { + "v": 42393, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-24" + } + }, { + "r": 50, + "c": 1, + "v": { + "v": 10, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "10", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 51, + "c": 0, + "v": { + "v": 42394, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-25" + } + }, { + "r": 51, + "c": 1, + "v": { + "v": 36, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "36", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 52, + "c": 0, + "v": { + "v": 42395, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-26" + } + }, { + "r": 52, + "c": 1, + "v": { + "v": 0, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "0", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 53, + "c": 0, + "v": { + "v": 42396, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-27" + } + }, { + "r": 53, + "c": 1, + "v": { + "v": 4, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "4", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 54, + "c": 0, + "v": { + "v": 42397, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-28" + } + }, { + "r": 54, + "c": 1, + "v": { + "v": 31, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "31", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 55, + "c": 0, + "v": { + "v": 42398, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-29" + } + }, { + "r": 55, + "c": 1, + "v": { + "v": 19, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "19", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 56, + "c": 0, + "v": { + "v": 42399, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-30" + } + }, { + "r": 56, + "c": 1, + "v": { + "v": 22, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "22", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }, { + "r": 57, + "c": 0, + "v": { + "v": 42400, + "ct": { + "fa": "yyyy-MM-dd", + "t": "d" + }, + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1, + "m": "2016-01-31" + } + }, { + "r": 57, + "c": 1, + "v": { + "v": 78, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "78", + "bg": null, + "bl": 0, + "it": 0, + "ff": 0, + "fs": 11, + "fc": "rgb(51, 51, 51)", + "ht": 1, + "vt": 1 + } + }], + "ch_width": 1524, + "rh_height": 1571, + "luckysheet_select_save": [{ + "left": 504, + "width": 73, + "top": 746, + "height": 20, + "left_move": 504, + "width_move": 73, + "top_move": 746, + "height_move": 20, + "row": [29, 29], + "column": [6, 6], + "row_focus": 29, + "column_focus": 6 + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 562, + "calcChain": [{ + "r": 2, + "c": 2, + "index": "4", + "func": [true, "", "=LINESPLINES(B3:B5,'pink',4,'avg','yellow','red','green',3)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Shape", + "args": [0, [ + [0, 21], + [0, 21], + [80, 54], + [159, 3] + ], "pink", null, 4] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, null, 159, null, null, "yellow"] + }, + "2": { + "id": 2, + "type": "Circle", + "args": [2, 80, 54, 3, null, "green", null] + }, + "3": { + "id": 3, + "type": "Circle", + "args": [3, 159, 3, 3, null, "red", null] + } + }, + "shapeseq": [0, 1, 2, 3], + "offsetX": 0, + "offsetY": 5, + "pixelWidth": 162, + "pixelHeight": 58 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 2, + "c": 4, + "index": "4", + "func": [true, "", "=COLUMNSPLINES(B3:B5,35,'red','green','auto','brown')", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 108, 1, 18, 29, "red", "red"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 54, 31, 18, 21, "green", "green"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 0, 20, 18, 10, "brown", "brown"] + } + }, + "shapeseq": [0, 1, 2], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 164, + "pixelHeight": 63 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 8, + "c": 4, + "index": 4, + "func": [true, 0.2631578947368421, "=B9/SUM(B9:B11)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 9, + "c": 4, + "index": 4, + "func": [true, 0.5789473684210527, "=B10/SUM(B9:B11)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 10, + "c": 4, + "index": 4, + "func": [true, 0.15789473684210525, "=B11/SUM(B9:B11)"], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 8, + "c": 2, + "index": 4, + "func": [true, "", "=PIESPLINES(B9:B11)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "PieSlice", + "args": [0, 31, 31, 31, 5.291103416572283, 6.283185307179586, null, "#5ab1ef"] + }, + "1": { + "id": 1, + "type": "PieSlice", + "args": [1, 31, 31, 31, 1.6534698176788385, 5.291103416572283, null, "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "PieSlice", + "args": [2, 31, 31, 31, 0, 1.6534698176788385, null, "#2ec7c9"] + } + }, + "shapeseq": [0, 1, 2], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 162, + "pixelHeight": 63 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 14, + "c": 2, + "index": 4, + "func": [true, "", "=AREASPLINES(B15:B18)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Shape", + "args": [0, [ + [0, 87], + [0, 61], + [84, 0], + [169, 87], + [253, 35], + [253, 87] + ], "#CCF3F4", "#CCF3F4", null] + }, + "1": { + "id": 1, + "type": "Shape", + "args": [1, [ + [0, 61], + [0, 61], + [84, 0], + [169, 87], + [253, 35] + ], "#2ec7c9", null, 1] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 2, + "pixelWidth": 253, + "pixelHeight": 88 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 32, + "c": 2, + "index": 4, + "func": [true, "", "=BARSPLINES(B22:B25)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 15, 129, 3, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 10, 129, 3, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 0, 5, 129, 3, "#fc5c5c", "#fc5c5c"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 0, 0, 129, 3, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1, 2, 3], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 131, + "pixelHeight": 20 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 33, + "c": 2, + "index": 4, + "func": [true, "", "=STACKBARSPLINES(B22:B25)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 0, 129, 18, "#2ec7c9", "#2ec7c9"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 130, 0, 129, 18, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 260, 0, 129, 18, "#5ab1ef", "#5ab1ef"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 390, 0, 129, 18, "#ffb980", "#ffb980"] + } + }, + "shapeseq": [0, 1, 2, 3], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 131, + "pixelHeight": 20 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 34, + "c": 2, + "index": 4, + "func": [true, "", "=DISCRETESPLINES(B22:B25)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 96, null, 30, 6, "#2ec7c9", "#2ec7c9"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 64, null, 30, 6, "#2ec7c9", "#2ec7c9"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 32, null, 30, 6, "#2ec7c9", "#2ec7c9"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 0, null, 30, 6, "#2ec7c9", "#2ec7c9"] + } + }, + "shapeseq": [0, 1, 2, 3], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 131, + "pixelHeight": 20 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 35, + "c": 2, + "index": 4, + "func": [true, "", "=TRISTATESPLINES(B22:B25)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 15, 0, 3, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 10, 0, 3, 8, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 5, 0, 3, 8, "#fc5c5c", "#fc5c5c"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 0, 9, 3, 1, "#999", "#999"] + } + }, + "shapeseq": [0, 1, 2, 3], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 131, + "pixelHeight": 20 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 2, + "c": 12, + "index": 4, + "func": [true, "", "=STACKBARSPLINES(K3:L3)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 10, 107, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 0, 145, 8, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 147, + "pixelHeight": 21 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 27, + "c": 2, + "index": 4, + "func": [true, "", "=DISCRETESPLINES(B28:B58,30)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 120, 3, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 116, 10, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 112, 10, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 108, 9, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "4": { + "id": 4, + "type": "Rect", + "args": [4, 104, 12, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "5": { + "id": 5, + "type": "Rect", + "args": [5, 100, 13, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "6": { + "id": 6, + "type": "Rect", + "args": [6, 96, 8, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "7": { + "id": 7, + "type": "Rect", + "args": [7, 92, 12, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "8": { + "id": 8, + "type": "Rect", + "args": [8, 88, 6, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "9": { + "id": 9, + "type": "Rect", + "args": [9, 84, 6, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "10": { + "id": 10, + "type": "Rect", + "args": [10, 80, 3, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "11": { + "id": 11, + "type": "Rect", + "args": [11, 76, 2, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "12": { + "id": 12, + "type": "Rect", + "args": [12, 72, 0, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "13": { + "id": 13, + "type": "Rect", + "args": [13, 68, 12, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "14": { + "id": 14, + "type": "Rect", + "args": [14, 64, 1, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "15": { + "id": 15, + "type": "Rect", + "args": [15, 60, 2, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "16": { + "id": 16, + "type": "Rect", + "args": [16, 56, 10, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "17": { + "id": 17, + "type": "Rect", + "args": [17, 52, 1, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "18": { + "id": 18, + "type": "Rect", + "args": [18, 48, 6, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "19": { + "id": 19, + "type": "Rect", + "args": [19, 44, 0, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "20": { + "id": 20, + "type": "Rect", + "args": [20, 40, 10, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "21": { + "id": 21, + "type": "Rect", + "args": [21, 36, 1, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "22": { + "id": 22, + "type": "Rect", + "args": [22, 32, 5, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "23": { + "id": 23, + "type": "Rect", + "args": [23, 28, 1, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "24": { + "id": 24, + "type": "Rect", + "args": [24, 24, 11, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "25": { + "id": 25, + "type": "Rect", + "args": [25, 20, 4, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "26": { + "id": 26, + "type": "Rect", + "args": [26, 16, 8, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "27": { + "id": 27, + "type": "Rect", + "args": [27, 12, 11, 2, 6, "#fc5c5c", "#fc5c5c"] + }, + "28": { + "id": 28, + "type": "Rect", + "args": [28, 8, 6, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "29": { + "id": 29, + "type": "Rect", + "args": [29, 4, 5, 2, 6, "#2ec7c9", "#2ec7c9"] + }, + "30": { + "id": 30, + "type": "Rect", + "args": [30, 0, 11, 2, 6, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 131, + "pixelHeight": 19 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 3, + "c": 12, + "index": 4, + "func": [true, "", "=STACKBARSPLINES(K4:L4)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 10, 47, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 0, 145, 8, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 147, + "pixelHeight": 21 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 4, + "c": 12, + "index": 4, + "func": [true, "", "=STACKBARSPLINES(K5:L5)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 0, 10, 125, 8, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 0, 0, 145, 8, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 147, + "pixelHeight": 21 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 8, + "c": 11, + "index": 4, + "func": [true, "", "=BARSPLINES(J9:J11)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 56, 42, 53, 19, "#97b552", "#97b552"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 110, 21, 108, 19, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 89, 0, 20, 19, "#97b552", "#97b552"] + } + }, + "shapeseq": [0, 1, 2], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 221, + "pixelHeight": 63 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 15, + "c": 7, + "index": 4, + "func": [true, "", "=TRISTATESPLINES(H18:N22,10)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 476, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 462, 23, 3, 1, "#999", "#999"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 448, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 434, 23, 3, 1, "#999", "#999"] + }, + "4": { + "id": 4, + "type": "Rect", + "args": [4, 420, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "5": { + "id": 5, + "type": "Rect", + "args": [5, 406, 23, 3, 1, "#999", "#999"] + }, + "6": { + "id": 6, + "type": "Rect", + "args": [6, 392, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "7": { + "id": 7, + "type": "Rect", + "args": [7, 378, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "8": { + "id": 8, + "type": "Rect", + "args": [8, 364, 23, 3, 1, "#999", "#999"] + }, + "9": { + "id": 9, + "type": "Rect", + "args": [9, 350, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "10": { + "id": 10, + "type": "Rect", + "args": [10, 336, 23, 3, 1, "#999", "#999"] + }, + "11": { + "id": 11, + "type": "Rect", + "args": [11, 322, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "12": { + "id": 12, + "type": "Rect", + "args": [12, 308, 23, 3, 1, "#999", "#999"] + }, + "13": { + "id": 13, + "type": "Rect", + "args": [13, 294, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "14": { + "id": 14, + "type": "Rect", + "args": [14, 280, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "15": { + "id": 15, + "type": "Rect", + "args": [15, 266, 23, 3, 1, "#999", "#999"] + }, + "16": { + "id": 16, + "type": "Rect", + "args": [16, 252, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "17": { + "id": 17, + "type": "Rect", + "args": [17, 238, 23, 3, 1, "#999", "#999"] + }, + "18": { + "id": 18, + "type": "Rect", + "args": [18, 224, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "19": { + "id": 19, + "type": "Rect", + "args": [19, 210, 23, 3, 1, "#999", "#999"] + }, + "20": { + "id": 20, + "type": "Rect", + "args": [20, 196, 24, 3, 22, "#97b552", "#97b552"] + }, + "21": { + "id": 21, + "type": "Rect", + "args": [21, 182, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "22": { + "id": 22, + "type": "Rect", + "args": [22, 168, 23, 3, 1, "#999", "#999"] + }, + "23": { + "id": 23, + "type": "Rect", + "args": [23, 154, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "24": { + "id": 24, + "type": "Rect", + "args": [24, 140, 23, 3, 1, "#999", "#999"] + }, + "25": { + "id": 25, + "type": "Rect", + "args": [25, 126, 24, 3, 22, "#97b552", "#97b552"] + }, + "26": { + "id": 26, + "type": "Rect", + "args": [26, 112, 23, 3, 1, "#999", "#999"] + }, + "27": { + "id": 27, + "type": "Rect", + "args": [27, 98, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "28": { + "id": 28, + "type": "Rect", + "args": [28, 84, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "29": { + "id": 29, + "type": "Rect", + "args": [29, 70, 23, 3, 1, "#999", "#999"] + }, + "30": { + "id": 30, + "type": "Rect", + "args": [30, 56, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "31": { + "id": 31, + "type": "Rect", + "args": [31, 42, 23, 3, 1, "#999", "#999"] + }, + "32": { + "id": 32, + "type": "Rect", + "args": [32, 28, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + }, + "33": { + "id": 33, + "type": "Rect", + "args": [33, 14, 23, 3, 1, "#999", "#999"] + }, + "34": { + "id": 34, + "type": "Rect", + "args": [34, 0, 0, 3, 22, "#fc5c5c", "#fc5c5c"] + } + }, + "shapeseq": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 517, + "pixelHeight": 48 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }, { + "r": 22, + "c": 3, + "index": 4, + "func": [true, "", "=STACKCOLUMNSPLINES(B23:C25)", { + "type": "sparklines", + "data": { + "shapes": { + "0": { + "id": 0, + "type": "Rect", + "args": [0, 60, 57, 58, 5, "#2ec7c9", "#2ec7c9"] + }, + "1": { + "id": 1, + "type": "Rect", + "args": [1, 60, 36, 58, 20, "#fc5c5c", "#fc5c5c"] + }, + "2": { + "id": 2, + "type": "Rect", + "args": [2, 60, 27, 58, 8, "#5ab1ef", "#5ab1ef"] + }, + "3": { + "id": 3, + "type": "Rect", + "args": [3, 0, 45, 58, 17, "#2ec7c9", "#2ec7c9"] + }, + "4": { + "id": 4, + "type": "Rect", + "args": [4, 0, 21, 58, 23, "#fc5c5c", "#fc5c5c"] + }, + "5": { + "id": 5, + "type": "Rect", + "args": [5, 0, 3, 58, 17, "#5ab1ef", "#5ab1ef"] + } + }, + "shapeseq": [0, 1, 2, 3, 4, 5], + "offsetX": 0, + "offsetY": 0, + "pixelWidth": 121, + "pixelHeight": 63 + } + }], + "color": "w", + "parent": null, + "chidren": {}, + "times": 0 + }], + "luckysheet_conditionformat_save": [], + "filter_select": null, + "filter": null, + "luckysheet_alternateformat_save": [] +} + +// export default sheetSparkline; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/demoData/sheetTable.js b/resources/assets/statics/public/js/luckysheet/demoData/sheetTable.js new file mode 100644 index 000000000..c3ba4baff --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/demoData/sheetTable.js @@ -0,0 +1,1068 @@ +window.sheetTable = { + "name": "Table", + "color": "", + "config": { + "merge": { + "0_1": { + "r": 0, + "c": 1, + "rs": 1, + "cs": 5 + }, + "0_8": { + "r": 0, + "c": 8, + "rs": 1, + "cs": 5 + }, + "8_1": { + "r": 8, + "c": 1, + "rs": 1, + "cs": 5 + }, + "16_1": { + "r": 16, + "c": 1, + "rs": 1, + "cs": 5 + }, + "8_8": { + "r": 8, + "c": 8, + "rs": 1, + "cs": 5 + }, + "16_8": { + "r": 16, + "c": 8, + "rs": 1, + "cs": 5 + } + } + }, + "index": "3", + "chart": [], + "status": 0, + "order": "3", + "column": 18, + "row": 36, + "celldata": [{ + "r": 0, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Table Style - light3, Filter", + "mc": { + "r": 0, + "c": 1, + "rs": 1, + "cs": 5 + }, + "bl": 1, + "m": "Table Style - light3, Filter" + } + }, { + "r": 0, + "c": 2, + "v": { + "mc": { + "r": 0, + "c": 1 + }, + "bl": 1 + } + }, { + "r": 0, + "c": 3, + "v": { + "mc": { + "r": 0, + "c": 1 + }, + "bl": 1 + } + }, { + "r": 0, + "c": 4, + "v": { + "mc": { + "r": 0, + "c": 1 + }, + "bl": 1 + } + }, { + "r": 0, + "c": 5, + "v": { + "mc": { + "r": 0, + "c": 1 + }, + "bl": 1 + } + }, { + "r": 0, + "c": 8, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "mc": { + "r": 0, + "c": 8, + "rs": 1, + "cs": 5 + }, + "bl": 1, + "m": "Table Style - light6", + "v": "Table Style - light6" + } + }, { + "r": 0, + "c": 9, + "v": { + "mc": { + "r": 0, + "c": 8 + } + } + }, { + "r": 0, + "c": 10, + "v": { + "mc": { + "r": 0, + "c": 8 + } + } + }, { + "r": 0, + "c": 11, + "v": { + "mc": { + "r": 0, + "c": 8 + } + } + }, { + "r": 0, + "c": 12, + "v": { + "mc": { + "r": 0, + "c": 8 + } + } + }, { + "r": 1, + "c": 1, + "v": { + "v": "Column1", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column1" + } + }, { + "r": 1, + "c": 2, + "v": { + "v": "Column2", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column2" + } + }, { + "r": 1, + "c": 3, + "v": { + "v": "Column3", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column3" + } + }, { + "r": 1, + "c": 4, + "v": { + "v": "Column4", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column4" + } + }, { + "r": 1, + "c": 5, + "v": { + "v": "Column5", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column5" + } + }, { + "r": 8, + "c": 1, + "v": { + "v": "Table Style - medium3,Header", + "ct": { + "fa": "General", + "t": "g" + }, + "mc": { + "r": 8, + "c": 1, + "rs": 1, + "cs": 5 + }, + "bl": 1, + "m": "Table Style - medium3,Header" + } + }, { + "r": 8, + "c": 2, + "v": { + "mc": { + "r": 8, + "c": 1 + } + } + }, { + "r": 8, + "c": 3, + "v": { + "mc": { + "r": 8, + "c": 1 + } + } + }, { + "r": 8, + "c": 4, + "v": { + "mc": { + "r": 8, + "c": 1 + } + } + }, { + "r": 8, + "c": 5, + "v": { + "mc": { + "r": 8, + "c": 1 + } + } + }, { + "r": 8, + "c": 8, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Table Style - medium8,Footer", + "mc": { + "r": 8, + "c": 8, + "rs": 1, + "cs": 5 + }, + "bl": 1, + "m": "Table Style - medium8,Footer" + } + }, { + "r": 8, + "c": 9, + "v": { + "mc": { + "r": 8, + "c": 8 + } + } + }, { + "r": 8, + "c": 10, + "v": { + "mc": { + "r": 8, + "c": 8 + } + } + }, { + "r": 8, + "c": 11, + "v": { + "mc": { + "r": 8, + "c": 8 + } + } + }, { + "r": 8, + "c": 12, + "v": { + "mc": { + "r": 8, + "c": 8 + } + } + }, { + "r": 9, + "c": 1, + "v": { + "v": "Column1", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column1" + } + }, { + "r": 9, + "c": 2, + "v": { + "v": "Column2", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column2" + } + }, { + "r": 9, + "c": 3, + "v": { + "v": "Column3", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column3" + } + }, { + "r": 9, + "c": 4, + "v": { + "v": "Column4", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column4" + } + }, { + "r": 9, + "c": 5, + "v": { + "v": "Column5", + "ct": { + "fa": "General", + "t": "g" + }, + "m": "Column5" + } + }, { + "r": 16, + "c": 1, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Table Style - medium6,Header,Footer", + "mc": { + "r": 16, + "c": 1, + "rs": 1, + "cs": 5 + }, + "bl": 1, + "m": "Table Style - medium6,Header,Footer" + } + }, { + "r": 16, + "c": 2, + "v": { + "mc": { + "r": 16, + "c": 1 + } + } + }, { + "r": 16, + "c": 3, + "v": { + "mc": { + "r": 16, + "c": 1 + } + } + }, { + "r": 16, + "c": 4, + "v": { + "mc": { + "r": 16, + "c": 1 + } + } + }, { + "r": 16, + "c": 5, + "v": { + "mc": { + "r": 16, + "c": 1 + } + } + }, { + "r": 16, + "c": 8, + "v": { + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Table Style - medium10,Header,Footer", + "mc": { + "r": 16, + "c": 8, + "rs": 1, + "cs": 5 + }, + "bl": 1, + "m": "Table Style - medium10,Header,Footer" + } + }, { + "r": 16, + "c": 9, + "v": { + "mc": { + "r": 16, + "c": 8 + } + } + }, { + "r": 16, + "c": 10, + "v": { + "mc": { + "r": 16, + "c": 8 + } + } + }, { + "r": 16, + "c": 11, + "v": { + "mc": { + "r": 16, + "c": 8 + } + } + }, { + "r": 16, + "c": 12, + "v": { + "mc": { + "r": 16, + "c": 8 + } + } + }, { + "r": 17, + "c": 1, + "v": { + "m": "Column1", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Column1" + } + }, { + "r": 17, + "c": 2, + "v": { + "m": "Column2", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Column2" + } + }, { + "r": 17, + "c": 3, + "v": { + "m": "Column3", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Column3" + } + }, { + "r": 17, + "c": 4, + "v": { + "m": "Column4", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Column4" + } + }, { + "r": 17, + "c": 5, + "v": { + "m": "Column5", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Column5" + } + }, { + "r": 17, + "c": 8, + "v": { + "m": "Name", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Name" + } + }, { + "r": 17, + "c": 9, + "v": { + "m": "Age", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Age" + } + }, { + "r": 17, + "c": 10, + "v": { + "m": "Sex", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Sex" + } + }, { + "r": 17, + "c": 11, + "v": { + "m": "Address", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Address" + } + }, { + "r": 17, + "c": 12, + "v": { + "m": "Score", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Score" + } + }, { + "r": 18, + "c": 8, + "v": { + "m": "bob", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "bob" + } + }, { + "r": 18, + "c": 9, + "v": { + "v": 36, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "36" + } + }, { + "r": 18, + "c": 10, + "v": { + "m": "man", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "man" + } + }, { + "r": 18, + "c": 11, + "v": { + "m": "Beijing", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Beijing" + } + }, { + "r": 18, + "c": 12, + "v": { + "v": 80, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "80" + } + }, { + "r": 19, + "c": 8, + "v": { + "m": "Betty", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Betty" + } + }, { + "r": 19, + "c": 9, + "v": { + "v": 28, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "28" + } + }, { + "r": 19, + "c": 10, + "v": { + "m": "woman", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "woman" + } + }, { + "r": 19, + "c": 11, + "v": { + "m": "Xi'an", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Xi'an" + } + }, { + "r": 19, + "c": 12, + "v": { + "v": 52, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "52" + } + }, { + "r": 20, + "c": 8, + "v": { + "m": "Gary", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Gary" + } + }, { + "r": 20, + "c": 9, + "v": { + "v": 23, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "23" + } + }, { + "r": 20, + "c": 10, + "v": { + "m": "man", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "man" + } + }, { + "r": 20, + "c": 11, + "v": { + "m": "NewYork", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "NewYork" + } + }, { + "r": 20, + "c": 12, + "v": { + "v": 63, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "63" + } + }, { + "r": 21, + "c": 8, + "v": { + "m": "Hunk", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Hunk" + } + }, { + "r": 21, + "c": 9, + "v": { + "v": 45, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "45" + } + }, { + "r": 21, + "c": 10, + "v": { + "m": "man", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "man" + } + }, { + "r": 21, + "c": 11, + "v": { + "m": "Beijing", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Beijing" + } + }, { + "r": 21, + "c": 12, + "v": { + "v": 80, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "80" + } + }, { + "r": 22, + "c": 8, + "v": { + "m": "Cherry", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Cherry" + } + }, { + "r": 22, + "c": 9, + "v": { + "v": 37, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "37" + } + }, { + "r": 22, + "c": 10, + "v": { + "m": "woman", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "woman" + } + }, { + "r": 22, + "c": 11, + "v": { + "m": "Shanghai", + "ct": { + "fa": "General", + "t": "g" + }, + "v": "Shanghai" + } + }, { + "r": 22, + "c": 12, + "v": { + "v": 58, + "ct": { + "fa": "General", + "t": "n" + }, + "m": "58" + } + }], + "ch_width": 4748, + "rh_height": 1790, + "luckysheet_select_save": [{ + "row": [0, 0], + "column": [0, 0] + }], + "luckysheet_selection_range": [], + "scrollLeft": 0, + "scrollTop": 0, + "filter_select": { + "left": 74, + "width": 73, + "top": 20, + "height": 19, + "left_move": 74, + "width_move": 369, + "top_move": 20, + "height_move": 119, + "row": [1, 6], + "column": [1, 5], + "row_focus": 1, + "column_focus": 1 + }, + "luckysheet_alternateformat_save": [{ + "cellrange": { + "row": [1, 6], + "column": [1, 5] + }, + "format": { + "head": { + "fc": "#000", + "bc": "#5ed593" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#e5fbee" + }, + "foot": { + "fc": "#000", + "bc": "#a5efcc" + } + }, + "hasRowHeader": false, + "hasRowFooter": false + }, { + "cellrange": { + "row": [1, 6], + "column": [8, 12] + }, + "format": { + "head": { + "fc": "#000", + "bc": "#5599fc" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#ecf2fe" + }, + "foot": { + "fc": "#000", + "bc": "#afcbfa" + } + }, + "hasRowHeader": false, + "hasRowFooter": false + }, { + "cellrange": { + "row": [9, 14], + "column": [1, 5] + }, + "format": { + "head": { + "fc": "#000", + "bc": "#5ed593" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#e5fbee" + }, + "foot": { + "fc": "#000", + "bc": "#a5efcc" + } + }, + "hasRowHeader": true, + "hasRowFooter": false + }, { + "cellrange": { + "row": [17, 22], + "column": [1, 5] + }, + "format": { + "head": { + "fc": "#000", + "bc": "#5599fc" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#ecf2fe" + }, + "foot": { + "fc": "#000", + "bc": "#afcbfa" + } + }, + "hasRowHeader": true, + "hasRowFooter": true + }, { + "cellrange": { + "row": [9, 14], + "column": [8, 12] + }, + "format": { + "head": { + "fc": "#000", + "bc": "#7a939a" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#f0eff7" + }, + "foot": { + "fc": "#000", + "bc": "#bdcad0" + } + }, + "hasRowHeader": false, + "hasRowFooter": true + }, { + "cellrange": { + "row": [17, 22], + "column": [8, 12] + }, + "format": { + "head": { + "fc": "#000", + "bc": "#89c54b" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#f1f7e9" + }, + "foot": { + "fc": "#000", + "bc": "#c5e3a7" + } + }, + "hasRowHeader": true, + "hasRowFooter": true + }], + "luckysheet_alternateformat_save_modelCustom": [{ + "head": { + "fc": "#6aa84f", + "bc": "#ffffff" + }, + "one": { + "fc": "#000", + "bc": "#ffffff" + }, + "two": { + "fc": "#000", + "bc": "#e5fbee" + }, + "foot": { + "fc": "#000", + "bc": "#a5efcc" + } + }] +} + +// export default sheetTable; \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/expendPlugins/chart/chartmix.css b/resources/assets/statics/public/js/luckysheet/expendPlugins/chart/chartmix.css new file mode 100644 index 000000000..6a988217b --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/expendPlugins/chart/chartmix.css @@ -0,0 +1 @@ +.luckysheet-datavisual-quick-menu{width:120px;overflow:auto;margin-top:15px}.luckysheet-datavisual-quick-menu::-webkit-scrollbar{display:none}.luckysheet-datavisual-quick-menu>div{text-align:left;padding:4px 4px;border-right:3px solid #fff;color:#777;cursor:pointer;line-height:1.4em;word-wrap:break-word}.luckysheet-datavisual-quick-menu>div:hover{color:#000}.luckysheet-datavisual-quick-menu>div i{width:15px}.luckysheet-datavisual-quick-menu>div:hover i{color:#ff7e7e}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active{border-right:3px solid #ff7e7e;color:#000;font-weight:700}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active:hover i{color:#000}.luckysheet-datavisual-quick-range{padding:5px 0}.luckysheet-datavisual-range-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid silver;min-width:20px;width:100%;max-width:200px;display:inline-block}.luckysheet-datavisual-range-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,.3);outline:none}.luckysheet-datavisual-range-input,.luckysheet-datavisual-range-input:focus{background:transparent!important;border:none!important;box-sizing:border-box;box-shadow:none;height:25px;margin:0;outline:none!important;padding:1px 8px!important;width:100%}.luckysheet-datavisual-range-button-container{overflow:hidden;padding:0 0 0 8px;text-align:right;width:21px}.luckysheet-datavisual-range-button-container div{padding:2px 10px 0 10px;font-size:18px;cursor:pointer;color:#6598f3}.luckysheet-datavisual-range-button-container div:hover{color:#ff7e7e}.luckysheet-datavisual-quick-m{margin-top:5px;min-height:500px;top:50px;font-size:12px}.luckysheet-datavisual-quick-list{left:110px;right:0;bottom:0;top:80px;position:absolute;overflow:auto;border-top:1px solid #e5e5e5;padding:5px 3px 35px 3px}.luckysheet-datavisual-quick-list-title{padding:4px 6px;background:#e5e5e5;margin-top:10px}.luckysheet-datavisual-quick-list-ul{overflow:hidden}.luckysheet-datavisual-quick-list-item{display:inline-block;margin:5px 8px;border:1px solid #dadada;width:100px;height:80px}.luckysheet-datavisual-quick-list-item:hover{border:1px solid #ff7e7e;box-shadow:0 0 20px #ff7e7e}.luckysheet-datavisual-quick-list-item img{display:inline-block;width:100px;height:80px}.luckysheet-datavisual-quick-list-item-active{border:1px solid #6598f3;box-shadow:0 0 20px #6598f3}.chart-base-slider .el-slider__runway.show-input{margin-right:72px}.chart-base-slider .el-slider__input.el-input-number--mini{width:56px}.chart-base-slider .input_content{margin:6px 0 0 5px}.body-sheet .title{font-weight:700}.el-row{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chartSetting{width:100%;height:100%} diff --git a/resources/assets/statics/public/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js b/resources/assets/statics/public/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js new file mode 100644 index 000000000..b8358261a --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js @@ -0,0 +1,34 @@ +(function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e(require("echarts"),require("Vuex"),require("Vue")):"function"===typeof define&&define.amd?define(["echarts","Vuex","Vue"],e):"object"===typeof exports?exports["chartmix"]=e(require("echarts"),require("Vuex"),require("Vue")):t["chartmix"]=e(t["echarts"],t["Vuex"],t["Vue"])})("undefined"!==typeof self?self:this,(function(t,e,n){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s="fb15")}({"00ee":function(t,e,n){var r=n("b622"),i=r("toStringTag"),o={};o[i]="z",t.exports="[object z]"===String(o)},"00fd":function(t,e,n){var r=n("9e69"),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,u=r?r.toStringTag:void 0;function s(t){var e=o.call(t,u),n=t[u];try{t[u]=void 0;var r=!0}catch(s){}var i=a.call(t);return r&&(e?t[u]=n:delete t[u]),i}t.exports=s},"0366":function(t,e,n){var r=n("1c0b");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},"03dd":function(t,e,n){var r=n("eac5"),i=n("57a5"),o=Object.prototype,a=o.hasOwnProperty;function u(t){if(!r(t))return i(t);var e=[];for(var n in Object(t))a.call(t,n)&&"constructor"!=n&&e.push(n);return e}t.exports=u},"057f":function(t,e,n){var r=n("fc6a"),i=n("241c").f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],u=function(t){try{return i(t)}catch(e){return a.slice()}};t.exports.f=function(t){return a&&"[object Window]"==o.call(t)?u(t):i(r(t))}},"0644":function(t,e,n){var r=n("3818"),i=1,o=4;function a(t){return r(t,i|o)}t.exports=a},"06cf":function(t,e,n){var r=n("83ab"),i=n("d1e7"),o=n("5c6c"),a=n("fc6a"),u=n("c04e"),s=n("5135"),l=n("0cfb"),c=Object.getOwnPropertyDescriptor;e.f=r?c:function(t,e){if(t=a(t),e=u(e,!0),l)try{return c(t,e)}catch(n){}if(s(t,e))return o(!i.f.call(t,e),t[e])}},"07c7":function(t,e){function n(){return!1}t.exports=n},"087d":function(t,e){function n(t,e){var n=-1,r=e.length,i=t.length;while(++n0;(o>>>=1)&&(e+=e))1&o&&(n+=e);return n}},1157:function(t,e,n){var r,i; +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */(function(e,n){"use strict";"object"===typeof t.exports?t.exports=e.document?n(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return n(t)}:n(e)})("undefined"!==typeof window?window:this,(function(n,o){"use strict";var a=[],u=Object.getPrototypeOf,s=a.slice,l=a.flat?function(t){return a.flat.call(t)}:function(t){return a.concat.apply([],t)},c=a.push,f=a.indexOf,h={},p=h.toString,d=h.hasOwnProperty,v=d.toString,g=v.call(Object),b={},y=function(t){return"function"===typeof t&&"number"!==typeof t.nodeType},m=function(t){return null!=t&&t===t.window},x=n.document,w={type:!0,src:!0,nonce:!0,noModule:!0};function A(t,e,n){n=n||x;var r,i,o=n.createElement("script");if(o.text=t,e)for(r in w)i=e[r]||e.getAttribute&&e.getAttribute(r),i&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function S(t){return null==t?t+"":"object"===typeof t||"function"===typeof t?h[p.call(t)]||"object":typeof t}var C="3.5.1",k=function(t,e){return new k.fn.init(t,e)};function O(t){var e=!!t&&"length"in t&&t.length,n=S(t);return!y(t)&&!m(t)&&("array"===n||0===e||"number"===typeof e&&e>0&&e-1 in t)}k.fn=k.prototype={jquery:C,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(t){return null==t?s.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=k.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return k.each(this,t)},map:function(t){return this.pushStack(k.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(k.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(k.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+B+")"+B+"*"),X=new RegExp(B+"|>"),Z=new RegExp(V),H=new RegExp("^"+P+"$"),U={ID:new RegExp("^#("+P+")"),CLASS:new RegExp("^\\.("+P+")"),TAG:new RegExp("^("+P+"|[*])"),ATTR:new RegExp("^"+z),PSEUDO:new RegExp("^"+V),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+B+"*(even|odd|(([+-]|)(\\d*)n|)"+B+"*(?:([+-]|)"+B+"*(\\d+)|))"+B+"*\\)|)","i"),bool:new RegExp("^(?:"+M+")$","i"),needsContext:new RegExp("^"+B+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+B+"*((?:-\\d)?\\d*)"+B+"*\\)|)(?=[^-]|$)","i")},J=/HTML$/i,Y=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,_=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}"+B+"?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},rt=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,it=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},ot=function(){h()},at=xt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{N.apply(D=G.call(w.childNodes),w.childNodes),D[w.childNodes.length].nodeType}catch(Tt){N={apply:D.length?function(t,e){L.apply(t,G.call(e))}:function(t,e){var n=t.length,r=0;while(t[n++]=e[r++]);t.length=n-1}}}function ut(t,e,r,i){var o,u,l,c,f,d,b,y=e&&e.ownerDocument,w=e?e.nodeType:9;if(r=r||[],"string"!==typeof t||!t||1!==w&&9!==w&&11!==w)return r;if(!i&&(h(e),e=e||p,v)){if(11!==w&&(f=$.exec(t)))if(o=f[1]){if(9===w){if(!(l=e.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(y&&(l=y.getElementById(o))&&m(e,l)&&l.id===o)return r.push(l),r}else{if(f[2])return N.apply(r,e.getElementsByTagName(t)),r;if((o=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return N.apply(r,e.getElementsByClassName(o)),r}if(n.qsa&&!T[t+" "]&&(!g||!g.test(t))&&(1!==w||"object"!==e.nodeName.toLowerCase())){if(b=t,y=e,1===w&&(X.test(t)||W.test(t))){y=tt.test(t)&&bt(e.parentNode)||e,y===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(rt,it):e.setAttribute("id",c=x)),d=a(t),u=d.length;while(u--)d[u]=(c?"#"+c:":scope")+" "+mt(d[u]);b=d.join(",")}try{return N.apply(r,y.querySelectorAll(b)),r}catch(A){T(t,!0)}finally{c===x&&e.removeAttribute("id")}}}return s(t.replace(F,"$1"),e,r,i)}function st(){var t=[];function e(n,i){return t.push(n+" ")>r.cacheLength&&delete e[t.shift()],e[n+" "]=i}return e}function lt(t){return t[x]=!0,t}function ct(t){var e=p.createElement("fieldset");try{return!!t(e)}catch(Tt){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){var n=t.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=e}function ht(t,e){var n=e&&t,r=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===e)return-1;return t?1:-1}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return"input"===n&&e.type===t}}function dt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&at(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function gt(t){return lt((function(e){return e=+e,lt((function(n,r){var i,o=t([],n.length,e),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))}))}))}function bt(t){return t&&"undefined"!==typeof t.getElementsByTagName&&t}for(e in n=ut.support={},o=ut.isXML=function(t){var e=t.namespaceURI,n=(t.ownerDocument||t).documentElement;return!J.test(e||n&&n.nodeName||"HTML")},h=ut.setDocument=function(t){var e,i,a=t?t.ownerDocument||t:w;return a!=p&&9===a.nodeType&&a.documentElement?(p=a,d=p.documentElement,v=!o(p),w!=p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",ot,!1):i.attachEvent&&i.attachEvent("onunload",ot)),n.scope=ct((function(t){return d.appendChild(t).appendChild(p.createElement("div")),"undefined"!==typeof t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(p.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=_.test(p.getElementsByClassName),n.getById=ct((function(t){return d.appendChild(t).id=x,!p.getElementsByName||!p.getElementsByName(x).length})),n.getById?(r.filter["ID"]=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},r.find["ID"]=function(t,e){if("undefined"!==typeof e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(r.filter["ID"]=function(t){var e=t.replace(et,nt);return function(t){var n="undefined"!==typeof t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},r.find["ID"]=function(t,e){if("undefined"!==typeof e.getElementById&&v){var n,r,i,o=e.getElementById(t);if(o){if(n=o.getAttributeNode("id"),n&&n.value===t)return[o];i=e.getElementsByName(t),r=0;while(o=i[r++])if(n=o.getAttributeNode("id"),n&&n.value===t)return[o]}return[]}}),r.find["TAG"]=n.getElementsByTagName?function(t,e){return"undefined"!==typeof e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,r=[],i=0,o=e.getElementsByTagName(t);if("*"===t){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find["CLASS"]=n.getElementsByClassName&&function(t,e){if("undefined"!==typeof e.getElementsByClassName&&v)return e.getElementsByClassName(t)},b=[],g=[],(n.qsa=_.test(p.querySelectorAll))&&(ct((function(t){var e;d.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+B+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||g.push("\\["+B+"*(?:value|"+M+")"),t.querySelectorAll("[id~="+x+"-]").length||g.push("~="),e=p.createElement("input"),e.setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||g.push("\\["+B+"*name"+B+"*="+B+"*(?:''|\"\")"),t.querySelectorAll(":checked").length||g.push(":checked"),t.querySelectorAll("a#"+x+"+*").length||g.push(".#.+[+~]"),t.querySelectorAll("\\\f"),g.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=p.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&g.push("name"+B+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),d.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),g.push(",.*:")}))),(n.matchesSelector=_.test(y=d.matches||d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),b.push("!=",V)})),g=g.length&&new RegExp(g.join("|")),b=b.length&&new RegExp(b.join("|")),e=_.test(d.compareDocumentPosition),m=e||_.test(d.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,r=e&&e.parentNode;return t===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):t.compareDocumentPosition&&16&t.compareDocumentPosition(r)))}:function(t,e){if(e)while(e=e.parentNode)if(e===t)return!0;return!1},E=e?function(t,e){if(t===e)return f=!0,0;var r=!t.compareDocumentPosition-!e.compareDocumentPosition;return r||(r=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1,1&r||!n.sortDetached&&e.compareDocumentPosition(t)===r?t==p||t.ownerDocument==w&&m(w,t)?-1:e==p||e.ownerDocument==w&&m(w,e)?1:c?R(c,t)-R(c,e):0:4&r?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,r=0,i=t.parentNode,o=e.parentNode,a=[t],u=[e];if(!i||!o)return t==p?-1:e==p?1:i?-1:o?1:c?R(c,t)-R(c,e):0;if(i===o)return ht(t,e);n=t;while(n=n.parentNode)a.unshift(n);n=e;while(n=n.parentNode)u.unshift(n);while(a[r]===u[r])r++;return r?ht(a[r],u[r]):a[r]==w?-1:u[r]==w?1:0},p):p},ut.matches=function(t,e){return ut(t,null,null,e)},ut.matchesSelector=function(t,e){if(h(t),n.matchesSelector&&v&&!T[e+" "]&&(!b||!b.test(e))&&(!g||!g.test(e)))try{var r=y.call(t,e);if(r||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(Tt){T(e,!0)}return ut(e,p,null,[t]).length>0},ut.contains=function(t,e){return(t.ownerDocument||t)!=p&&h(t),m(t,e)},ut.attr=function(t,e){(t.ownerDocument||t)!=p&&h(t);var i=r.attrHandle[e.toLowerCase()],o=i&&I.call(r.attrHandle,e.toLowerCase())?i(t,e,!v):void 0;return void 0!==o?o:n.attributes||!v?t.getAttribute(e):(o=t.getAttributeNode(e))&&o.specified?o.value:null},ut.escape=function(t){return(t+"").replace(rt,it)},ut.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},ut.uniqueSort=function(t){var e,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(E),f){while(e=t[o++])e===t[o]&&(i=r.push(o));while(i--)t.splice(r[i],1)}return c=null,t},i=ut.getText=function(t){var e,n="",r=0,o=t.nodeType;if(o){if(1===o||9===o||11===o){if("string"===typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=i(t)}else if(3===o||4===o)return t.nodeValue}else while(e=t[r++])n+=i(e);return n},r=ut.selectors={cacheLength:50,createPseudo:lt,match:U,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||ut.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&ut.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return U["CHILD"].test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&Z.test(n)&&(e=a(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=C[t+" "];return e||(e=new RegExp("(^|"+B+")"+t+"("+B+"|$)"))&&C(t,(function(t){return e.test("string"===typeof t.className&&t.className||"undefined"!==typeof t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(r){var i=ut.attr(r,t);return null==i?"!="===e:!e||(i+="","="===e?i===n:"!="===e?i!==n:"^="===e?n&&0===i.indexOf(n):"*="===e?n&&i.indexOf(n)>-1:"$="===e?n&&i.slice(-n.length)===n:"~="===e?(" "+i.replace(Q," ")+" ").indexOf(n)>-1:"|="===e&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,r,i){var o="nth"!==t.slice(0,3),a="last"!==t.slice(-4),u="of-type"===e;return 1===r&&0===i?function(t){return!!t.parentNode}:function(e,n,s){var l,c,f,h,p,d,v=o!==a?"nextSibling":"previousSibling",g=e.parentNode,b=u&&e.nodeName.toLowerCase(),y=!s&&!u,m=!1;if(g){if(o){while(v){h=e;while(h=h[v])if(u?h.nodeName.toLowerCase()===b:1===h.nodeType)return!1;d=v="only"===t&&!d&&"nextSibling"}return!0}if(d=[a?g.firstChild:g.lastChild],a&&y){h=g,f=h[x]||(h[x]={}),c=f[h.uniqueID]||(f[h.uniqueID]={}),l=c[t]||[],p=l[0]===A&&l[1],m=p&&l[2],h=p&&g.childNodes[p];while(h=++p&&h&&h[v]||(m=p=0)||d.pop())if(1===h.nodeType&&++m&&h===e){c[t]=[A,p,m];break}}else if(y&&(h=e,f=h[x]||(h[x]={}),c=f[h.uniqueID]||(f[h.uniqueID]={}),l=c[t]||[],p=l[0]===A&&l[1],m=p),!1===m)while(h=++p&&h&&h[v]||(m=p=0)||d.pop())if((u?h.nodeName.toLowerCase()===b:1===h.nodeType)&&++m&&(y&&(f=h[x]||(h[x]={}),c=f[h.uniqueID]||(f[h.uniqueID]={}),c[t]=[A,m]),h===e))break;return m-=i,m===r||m%r===0&&m/r>=0}}},PSEUDO:function(t,e){var n,i=r.pseudos[t]||r.setFilters[t.toLowerCase()]||ut.error("unsupported pseudo: "+t);return i[x]?i(e):i.length>1?(n=[t,t,"",e],r.setFilters.hasOwnProperty(t.toLowerCase())?lt((function(t,n){var r,o=i(t,e),a=o.length;while(a--)r=R(t,o[a]),t[r]=!(n[r]=o[a])})):function(t){return i(t,0,n)}):i}},pseudos:{not:lt((function(t){var e=[],n=[],r=u(t.replace(F,"$1"));return r[x]?lt((function(t,e,n,i){var o,a=r(t,null,i,[]),u=t.length;while(u--)(o=a[u])&&(t[u]=!(e[u]=o))})):function(t,i,o){return e[0]=t,r(e,null,o,n),e[0]=null,!n.pop()}})),has:lt((function(t){return function(e){return ut(t,e).length>0}})),contains:lt((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||i(e)).indexOf(t)>-1}})),lang:lt((function(t){return H.test(t||"")||ut.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return n=n.toLowerCase(),n===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===d},focus:function(t){return t===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!r.pseudos["empty"](t)},header:function(t){return K.test(t.nodeName)},input:function(t){return Y.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:gt((function(){return[0]})),last:gt((function(t,e){return[e-1]})),eq:gt((function(t,e,n){return[n<0?n+e:n]})),even:gt((function(t,e){for(var n=0;ne?e:n;--r>=0;)t.push(r);return t})),gt:gt((function(t,e,n){for(var r=n<0?n+e:n;++r1?function(e,n,r){var i=t.length;while(i--)if(!t[i](e,n,r))return!1;return!0}:t[0]}function At(t,e,n){for(var r=0,i=e.length;r-1&&(o[l]=!(a[l]=f))}}else b=St(b===a?b.splice(d,b.length):b),i?i(null,a,b,s):N.apply(a,b)}))}function kt(t){for(var e,n,i,o=t.length,a=r.relative[t[0].type],u=a||r.relative[" "],s=a?1:0,c=xt((function(t){return t===e}),u,!0),f=xt((function(t){return R(e,t)>-1}),u,!0),h=[function(t,n,r){var i=!a&&(r||n!==l)||((e=n).nodeType?c(t,n,r):f(t,n,r));return e=null,i}];s1&&wt(h),s>1&&mt(t.slice(0,s-1).concat({value:" "===t[s-2].type?"*":""})).replace(F,"$1"),n,s0,i=t.length>0,o=function(o,a,u,s,c){var f,d,g,b=0,y="0",m=o&&[],x=[],w=l,S=o||i&&r.find["TAG"]("*",c),C=A+=null==w?1:Math.random()||.1,k=S.length;for(c&&(l=a==p||a||c);y!==k&&null!=(f=S[y]);y++){if(i&&f){d=0,a||f.ownerDocument==p||(h(f),u=!v);while(g=t[d++])if(g(f,a||p,u)){s.push(f);break}c&&(A=C)}n&&((f=!g&&f)&&b--,o&&m.push(f))}if(b+=y,n&&y!==b){d=0;while(g=e[d++])g(m,x,a,u);if(o){if(b>0)while(y--)m[y]||x[y]||(x[y]=j.call(s));x=St(x)}N.apply(s,x),c&&!o&&x.length>0&&b+e.length>1&&ut.uniqueSort(s)}return c&&(A=C,l=w),m};return n?lt(o):o}return yt.prototype=r.filters=r.pseudos,r.setFilters=new yt,a=ut.tokenize=function(t,e){var n,i,o,a,u,s,l,c=k[t+" "];if(c)return e?0:c.slice(0);u=t,s=[],l=r.preFilter;while(u){for(a in n&&!(i=q.exec(u))||(i&&(u=u.slice(i[0].length)||u),s.push(o=[])),n=!1,(i=W.exec(u))&&(n=i.shift(),o.push({value:n,type:i[0].replace(F," ")}),u=u.slice(n.length)),r.filter)!(i=U[a].exec(u))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),u=u.slice(n.length));if(!n)break}return e?u.length:u?ut.error(t):k(t,s).slice(0)},u=ut.compile=function(t,e){var n,r=[],i=[],o=O[t+" "];if(!o){e||(e=a(t)),n=e.length;while(n--)o=kt(e[n]),o[x]?r.push(o):i.push(o);o=O(t,Ot(i,r)),o.selector=t}return o},s=ut.select=function(t,e,n,i){var o,s,l,c,f,h="function"===typeof t&&t,p=!i&&a(t=h.selector||t);if(n=n||[],1===p.length){if(s=p[0]=p[0].slice(0),s.length>2&&"ID"===(l=s[0]).type&&9===e.nodeType&&v&&r.relative[s[1].type]){if(e=(r.find["ID"](l.matches[0].replace(et,nt),e)||[])[0],!e)return n;h&&(e=e.parentNode),t=t.slice(s.shift().value.length)}o=U["needsContext"].test(t)?0:s.length;while(o--){if(l=s[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(et,nt),tt.test(s[0].type)&&bt(e.parentNode)||e))){if(s.splice(o,1),t=i.length&&mt(s),!t)return N.apply(n,i),n;break}}}return(h||u(t,p))(i,e,!v,n,!e||tt.test(t)&&bt(e.parentNode)||e),n},n.sortStable=x.split("").sort(E).join("")===x,n.detectDuplicates=!!f,h(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(p.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(M,(function(t,e,n){var r;if(!n)return!0===t[e]?e.toLowerCase():(r=t.getAttributeNode(e))&&r.specified?r.value:null})),ut}(n);k.find=T,k.expr=T.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=T.uniqueSort,k.text=T.getText,k.isXMLDoc=T.isXML,k.contains=T.contains,k.escapeSelector=T.escape;var E=function(t,e,n){var r=[],i=void 0!==n;while((t=t[e])&&9!==t.nodeType)if(1===t.nodeType){if(i&&k(t).is(n))break;r.push(t)}return r},I=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},D=k.expr.match.needsContext;function j(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var L=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(t,e,n){return y(e)?k.grep(t,(function(t,r){return!!e.call(t,r,t)!==n})):e.nodeType?k.grep(t,(function(t){return t===e!==n})):"string"!==typeof e?k.grep(t,(function(t){return f.call(e,t)>-1!==n})):k.filter(e,t,n)}k.filter=function(t,e,n){var r=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===r.nodeType?k.find.matchesSelector(r,t)?[r]:[]:k.find.matches(t,k.grep(e,(function(t){return 1===t.nodeType})))},k.fn.extend({find:function(t){var e,n,r=this.length,i=this;if("string"!==typeof t)return this.pushStack(k(t).filter((function(){for(e=0;e1?k.uniqueSort(n):n},filter:function(t){return this.pushStack(N(this,t||[],!1))},not:function(t){return this.pushStack(N(this,t||[],!0))},is:function(t){return!!N(this,"string"===typeof t&&D.test(t)?k(t):t||[],!1).length}});var G,R=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,M=k.fn.init=function(t,e,n){var r,i;if(!t)return this;if(n=n||G,"string"===typeof t){if(r="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:R.exec(t),!r||!r[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(r[1]){if(e=e instanceof k?e[0]:e,k.merge(this,k.parseHTML(r[1],e&&e.nodeType?e.ownerDocument||e:x,!0)),L.test(r[1])&&k.isPlainObject(e))for(r in e)y(this[r])?this[r](e[r]):this.attr(r,e[r]);return this}return i=x.getElementById(r[2]),i&&(this[0]=i,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):y(t)?void 0!==n.ready?n.ready(t):t(k):k.makeArray(t,this)};M.prototype=k.fn,G=k(x);var B=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};function z(t,e){while((t=t[e])&&1!==t.nodeType);return t}k.fn.extend({has:function(t){var e=k(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&k.find.matchesSelector(n,t))){o.push(n);break}return this.pushStack(o.length>1?k.uniqueSort(o):o)},index:function(t){return t?"string"===typeof t?f.call(k(t),this[0]):f.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),k.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return E(t,"parentNode")},parentsUntil:function(t,e,n){return E(t,"parentNode",n)},next:function(t){return z(t,"nextSibling")},prev:function(t){return z(t,"previousSibling")},nextAll:function(t){return E(t,"nextSibling")},prevAll:function(t){return E(t,"previousSibling")},nextUntil:function(t,e,n){return E(t,"nextSibling",n)},prevUntil:function(t,e,n){return E(t,"previousSibling",n)},siblings:function(t){return I((t.parentNode||{}).firstChild,t)},children:function(t){return I(t.firstChild)},contents:function(t){return null!=t.contentDocument&&u(t.contentDocument)?t.contentDocument:(j(t,"template")&&(t=t.content||t),k.merge([],t.childNodes))}},(function(t,e){k.fn[t]=function(n,r){var i=k.map(this,e,n);return"Until"!==t.slice(-5)&&(r=n),r&&"string"===typeof r&&(i=k.filter(r,i)),this.length>1&&(P[t]||k.uniqueSort(i),B.test(t)&&i.reverse()),this.pushStack(i)}}));var V=/[^\x20\t\r\n\f]+/g;function Q(t){var e={};return k.each(t.match(V)||[],(function(t,n){e[n]=!0})),e}function F(t){return t}function q(t){throw t}function W(t,e,n,r){var i;try{t&&y(i=t.promise)?i.call(t).done(e).fail(n):t&&y(i=t.then)?i.call(t,e,n):e.apply(void 0,[t].slice(r))}catch(t){n.apply(void 0,[t])}}k.Callbacks=function(t){t="string"===typeof t?Q(t):k.extend({},t);var e,n,r,i,o=[],a=[],u=-1,s=function(){for(i=i||t.once,r=e=!0;a.length;u=-1){n=a.shift();while(++u-1)o.splice(n,1),n<=u&&u--})),this},has:function(t){return t?k.inArray(t,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||e||(o=n=""),this},locked:function(){return!!i},fireWith:function(t,n){return i||(n=n||[],n=[t,n.slice?n.slice():n],a.push(n),e||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},k.extend({Deferred:function(t){var e=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(t){return i.then(null,t)},pipe:function(){var t=arguments;return k.Deferred((function(n){k.each(e,(function(e,r){var i=y(t[r[4]])&&t[r[4]];o[r[1]]((function(){var t=i&&i.apply(this,arguments);t&&y(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[t]:arguments)}))})),t=null})).promise()},then:function(t,r,i){var o=0;function a(t,e,r,i){return function(){var u=this,s=arguments,l=function(){var n,l;if(!(t=o&&(r!==q&&(u=void 0,s=[n]),e.rejectWith(u,s))}};t?c():(k.Deferred.getStackHook&&(c.stackTrace=k.Deferred.getStackHook()),n.setTimeout(c))}}return k.Deferred((function(n){e[0][3].add(a(0,n,y(i)?i:F,n.notifyWith)),e[1][3].add(a(0,n,y(t)?t:F)),e[2][3].add(a(0,n,y(r)?r:q))})).promise()},promise:function(t){return null!=t?k.extend(t,i):i}},o={};return k.each(e,(function(t,n){var a=n[2],u=n[5];i[n[1]]=a.add,u&&a.add((function(){r=u}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),a.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=a.fireWith})),i.promise(o),t&&t.call(o,o),o},when:function(t){var e=arguments.length,n=e,r=Array(n),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(n){r[t]=this,i[t]=arguments.length>1?s.call(arguments):n,--e||o.resolveWith(r,i)}};if(e<=1&&(W(t,o.done(a(n)).resolve,o.reject,!e),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();while(n--)W(i[n],a(n),o.reject);return o.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(t,e){n.console&&n.console.warn&&t&&X.test(t.name)&&n.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},k.readyException=function(t){n.setTimeout((function(){throw t}))};var Z=k.Deferred();function H(){x.removeEventListener("DOMContentLoaded",H),n.removeEventListener("load",H),k.ready()}k.fn.ready=function(t){return Z.then(t).catch((function(t){k.readyException(t)})),this},k.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--k.readyWait:k.isReady)||(k.isReady=!0,!0!==t&&--k.readyWait>0||Z.resolveWith(x,[k]))}}),k.ready.then=Z.then,"complete"===x.readyState||"loading"!==x.readyState&&!x.documentElement.doScroll?n.setTimeout(k.ready):(x.addEventListener("DOMContentLoaded",H),n.addEventListener("load",H));var U=function(t,e,n,r,i,o,a){var u=0,s=t.length,l=null==n;if("object"===S(n))for(u in i=!0,n)U(t,e,u,n[u],!0,o,a);else if(void 0!==r&&(i=!0,y(r)||(a=!0),l&&(a?(e.call(t,r),e=null):(l=e,e=function(t,e,n){return l.call(k(t),n)})),e))for(;u1,null,!0)},removeData:function(t){return this.each((function(){nt.remove(this,t)}))}}),k.extend({queue:function(t,e,n){var r;if(t)return e=(e||"fx")+"queue",r=et.get(t,e),n&&(!r||Array.isArray(n)?r=et.access(t,e,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(t,e){e=e||"fx";var n=k.queue(t,e),r=n.length,i=n.shift(),o=k._queueHooks(t,e),a=function(){k.dequeue(t,e)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===e&&n.unshift("inprogress"),delete o.stop,i.call(t,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return et.get(t,n)||et.access(t,n,{empty:k.Callbacks("once memory").add((function(){et.remove(t,[e+"queue",n])}))})}}),k.fn.extend({queue:function(t,e){var n=2;return"string"!==typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,xt=/^$|^module$|\/(?:java|ecma)script/i;(function(){var t=x.createDocumentFragment(),e=t.appendChild(x.createElement("div")),n=x.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),b.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",b.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,e.innerHTML="",b.option=!!e.lastChild})();var wt={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function At(t,e){var n;return n="undefined"!==typeof t.getElementsByTagName?t.getElementsByTagName(e||"*"):"undefined"!==typeof t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&j(t,e)?k.merge([t],n):n}function St(t,e){for(var n=0,r=t.length;n",""]);var Ct=/<|&#?\w+;/;function kt(t,e,n,r,i){for(var o,a,u,s,l,c,f=e.createDocumentFragment(),h=[],p=0,d=t.length;p-1)i&&i.push(o);else if(l=ft(o),a=At(f.appendChild(o),"script"),l&&St(a),n){c=0;while(o=a[c++])xt.test(o.type||"")&&n.push(o)}return f}var Ot=/^key/,Tt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Et=/^([^.]*)(?:\.(.+)|)/;function It(){return!0}function Dt(){return!1}function jt(t,e){return t===Lt()===("focus"===e)}function Lt(){try{return x.activeElement}catch(t){}}function Nt(t,e,n,r,i,o){var a,u;if("object"===typeof e){for(u in"string"!==typeof n&&(r=r||n,n=void 0),e)Nt(t,u,n,r,e[u],o);return t}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"===typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Dt;else if(!i)return t;return 1===o&&(a=i,i=function(t){return k().off(t),a.apply(this,arguments)},i.guid=a.guid||(a.guid=k.guid++)),t.each((function(){k.event.add(this,e,i,r,n)}))}function Gt(t,e,n){n?(et.set(t,e,!1),k.event.add(t,e,{namespace:!1,handler:function(t){var r,i,o=et.get(this,e);if(1&t.isTrigger&&this[e]){if(o.length)(k.event.special[e]||{}).delegateType&&t.stopPropagation();else if(o=s.call(arguments),et.set(this,e,o),r=n(this,e),this[e](),i=et.get(this,e),o!==i||r?et.set(this,e,!1):i={},o!==i)return t.stopImmediatePropagation(),t.preventDefault(),i.value}else o.length&&(et.set(this,e,{value:k.event.trigger(k.extend(o[0],k.Event.prototype),o.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===et.get(t,e)&&k.event.add(t,e,It)}k.event={global:{},add:function(t,e,n,r,i){var o,a,u,s,l,c,f,h,p,d,v,g=et.get(t);if($(t)){n.handler&&(o=n,n=o.handler,i=o.selector),i&&k.find.matchesSelector(ct,i),n.guid||(n.guid=k.guid++),(s=g.events)||(s=g.events=Object.create(null)),(a=g.handle)||(a=g.handle=function(e){return"undefined"!==typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),e=(e||"").match(V)||[""],l=e.length;while(l--)u=Et.exec(e[l])||[],p=v=u[1],d=(u[2]||"").split(".").sort(),p&&(f=k.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=k.event.special[p]||{},c=k.extend({type:p,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:d.join(".")},o),(h=s[p])||(h=s[p]=[],h.delegateCount=0,f.setup&&!1!==f.setup.call(t,r,d,a)||t.addEventListener&&t.addEventListener(p,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,c):h.push(c),k.event.global[p]=!0)}},remove:function(t,e,n,r,i){var o,a,u,s,l,c,f,h,p,d,v,g=et.hasData(t)&&et.get(t);if(g&&(s=g.events)){e=(e||"").match(V)||[""],l=e.length;while(l--)if(u=Et.exec(e[l])||[],p=v=u[1],d=(u[2]||"").split(".").sort(),p){f=k.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,h=s[p]||[],u=u[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=h.length;while(o--)c=h[o],!i&&v!==c.origType||n&&n.guid!==c.guid||u&&!u.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(h.splice(o,1),c.selector&&h.delegateCount--,f.remove&&f.remove.call(t,c));a&&!h.length&&(f.teardown&&!1!==f.teardown.call(t,d,g.handle)||k.removeEvent(t,p,g.handle),delete s[p])}else for(p in s)k.event.remove(t,p+e[l],n,r,!0);k.isEmptyObject(s)&&et.remove(t,"handle events")}},dispatch:function(t){var e,n,r,i,o,a,u=new Array(arguments.length),s=k.event.fix(t),l=(et.get(this,"events")||Object.create(null))[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,e=1;e=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==t.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&u.push({elem:l,handlers:o})}return l=this,s\s*$/g;function Pt(t,e){return j(t,"table")&&j(11!==e.nodeType?e:e.firstChild,"tr")&&k(t).children("tbody")[0]||t}function zt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Vt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Qt(t,e){var n,r,i,o,a,u,s;if(1===e.nodeType){if(et.hasData(t)&&(o=et.get(t),s=o.events,s))for(i in et.remove(e,"handle events"),s)for(n=0,r=s[i].length;n1&&"string"===typeof d&&!b.checkClone&&Mt.test(d))return t.each((function(i){var o=t.eq(i);v&&(e[0]=d.call(this,i,o.html())),qt(o,e,n,r)}));if(h&&(i=kt(e,t[0].ownerDocument,!1,t,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(a=k.map(At(i,"script"),zt),u=a.length;f0&&St(a,!s&&At(t,"script")),u},cleanData:function(t){for(var e,n,r,i=k.event.special,o=0;void 0!==(n=t[o]);o++)if($(n)){if(e=n[et.expando]){if(e.events)for(r in e.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,e.handle);n[et.expando]=void 0}n[nt.expando]&&(n[nt.expando]=void 0)}}}),k.fn.extend({detach:function(t){return Wt(this,t,!0)},remove:function(t){return Wt(this,t)},text:function(t){return U(this,(function(t){return void 0===t?k.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return qt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Pt(this,t);e.appendChild(t)}}))},prepend:function(){return qt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Pt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return qt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return qt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(k.cleanData(At(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return k.clone(this,t,e)}))},html:function(t){return U(this,(function(t){var e=this[0]||{},n=0,r=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"===typeof t&&!Rt.test(t)&&!wt[(mt.exec(t)||["",""])[1].toLowerCase()]){t=k.htmlPrefilter(t);try{for(;n3,ct.removeChild(t)),u}}))})();var Kt=["Webkit","Moz","ms"],_t=x.createElement("div").style,$t={};function te(t){var e=t[0].toUpperCase()+t.slice(1),n=Kt.length;while(n--)if(t=Kt[n]+e,t in _t)return t}function ee(t){var e=k.cssProps[t]||$t[t];return e||(t in _t?t:$t[t]=te(t)||t)}var ne=/^(none|table(?!-c[ea]).+)/,re=/^--/,ie={position:"absolute",visibility:"hidden",display:"block"},oe={letterSpacing:"0",fontWeight:"400"};function ae(t,e,n){var r=st.exec(e);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):e}function ue(t,e,n,r,i,o){var a="width"===e?1:0,u=0,s=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(s+=k.css(t,n+lt[a],!0,i)),r?("content"===n&&(s-=k.css(t,"padding"+lt[a],!0,i)),"margin"!==n&&(s-=k.css(t,"border"+lt[a]+"Width",!0,i))):(s+=k.css(t,"padding"+lt[a],!0,i),"padding"!==n?s+=k.css(t,"border"+lt[a]+"Width",!0,i):u+=k.css(t,"border"+lt[a]+"Width",!0,i));return!r&&o>=0&&(s+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-o-s-u-.5))||0),s}function se(t,e,n){var r=Zt(t),i=!b.boxSizingReliable()||n,o=i&&"border-box"===k.css(t,"boxSizing",!1,r),a=o,u=Jt(t,e,r),s="offset"+e[0].toUpperCase()+e.slice(1);if(Xt.test(u)){if(!n)return u;u="auto"}return(!b.boxSizingReliable()&&o||!b.reliableTrDimensions()&&j(t,"tr")||"auto"===u||!parseFloat(u)&&"inline"===k.css(t,"display",!1,r))&&t.getClientRects().length&&(o="border-box"===k.css(t,"boxSizing",!1,r),a=s in t,a&&(u=t[s])),u=parseFloat(u)||0,u+ue(t,e,n||(o?"border":"content"),a,r,u)+"px"}function le(t,e,n,r,i){return new le.prototype.init(t,e,n,r,i)}k.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,r){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var i,o,a,u=_(e),s=re.test(e),l=t.style;if(s||(e=ee(u)),a=k.cssHooks[e]||k.cssHooks[u],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(t,!1,r))?i:l[e];o=typeof n,"string"===o&&(i=st.exec(n))&&i[1]&&(n=dt(t,e,i),o="number"),null!=n&&n===n&&("number"!==o||s||(n+=i&&i[3]||(k.cssNumber[u]?"":"px")),b.clearCloneStyle||""!==n||0!==e.indexOf("background")||(l[e]="inherit"),a&&"set"in a&&void 0===(n=a.set(t,n,r))||(s?l.setProperty(e,n):l[e]=n))}},css:function(t,e,n,r){var i,o,a,u=_(e),s=re.test(e);return s||(e=ee(u)),a=k.cssHooks[e]||k.cssHooks[u],a&&"get"in a&&(i=a.get(t,!0,n)),void 0===i&&(i=Jt(t,e,r)),"normal"===i&&e in oe&&(i=oe[e]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],(function(t,e){k.cssHooks[e]={get:function(t,n,r){if(n)return!ne.test(k.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?se(t,e,r):Ht(t,ie,(function(){return se(t,e,r)}))},set:function(t,n,r){var i,o=Zt(t),a=!b.scrollboxSize()&&"absolute"===o.position,u=a||r,s=u&&"border-box"===k.css(t,"boxSizing",!1,o),l=r?ue(t,e,r,s,o):0;return s&&a&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(o[e])-ue(t,e,"border",!1,o)-.5)),l&&(i=st.exec(n))&&"px"!==(i[3]||"px")&&(t.style[e]=n,n=k.css(t,e)),ae(t,n,l)}}})),k.cssHooks.marginLeft=Yt(b.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Ht(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),k.each({margin:"",padding:"",border:"Width"},(function(t,e){k.cssHooks[t+e]={expand:function(n){for(var r=0,i={},o="string"===typeof n?n.split(" "):[n];r<4;r++)i[t+lt[r]+e]=o[r]||o[r-2]||o[0];return i}},"margin"!==t&&(k.cssHooks[t+e].set=ae)})),k.fn.extend({css:function(t,e){return U(this,(function(t,e,n){var r,i,o={},a=0;if(Array.isArray(e)){for(r=Zt(t),i=e.length;a1)}}),k.Tween=le,le.prototype={constructor:le,init:function(t,e,n,r,i,o){this.elem=t,this.prop=n,this.easing=i||k.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var t=le.propHooks[this.prop];return t&&t.get?t.get(this):le.propHooks._default.get(this)},run:function(t){var e,n=le.propHooks[this.prop];return this.options.duration?this.pos=e=k.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):le.propHooks._default.set(this),this}},le.prototype.init.prototype=le.prototype,le.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=k.css(t.elem,t.prop,""),e&&"auto"!==e?e:0)},set:function(t){k.fx.step[t.prop]?k.fx.step[t.prop](t):1!==t.elem.nodeType||!k.cssHooks[t.prop]&&null==t.elem.style[ee(t.prop)]?t.elem[t.prop]=t.now:k.style(t.elem,t.prop,t.now+t.unit)}}},le.propHooks.scrollTop=le.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},k.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},k.fx=le.prototype.init,k.fx.step={};var ce,fe,he=/^(?:toggle|show|hide)$/,pe=/queueHooks$/;function de(){fe&&(!1===x.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(de):n.setTimeout(de,k.fx.interval),k.fx.tick())}function ve(){return n.setTimeout((function(){ce=void 0})),ce=Date.now()}function ge(t,e){var n,r=0,i={height:t};for(e=e?1:0;r<4;r+=2-e)n=lt[r],i["margin"+n]=i["padding"+n]=t;return e&&(i.opacity=i.width=t),i}function be(t,e,n){for(var r,i=(xe.tweeners[e]||[]).concat(xe.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(t){return this.each((function(){k.removeAttr(this,t)}))}}),k.extend({attr:function(t,e,n){var r,i,o=t.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"===typeof t.getAttribute?k.prop(t,e,n):(1===o&&k.isXMLDoc(t)||(i=k.attrHooks[e.toLowerCase()]||(k.expr.match.bool.test(e)?we:void 0)),void 0!==n?null===n?void k.removeAttr(t,e):i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:(t.setAttribute(e,n+""),n):i&&"get"in i&&null!==(r=i.get(t,e))?r:(r=k.find.attr(t,e),null==r?void 0:r))},attrHooks:{type:{set:function(t,e){if(!b.radioValue&&"radio"===e&&j(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,r=0,i=e&&e.match(V);if(i&&1===t.nodeType)while(n=i[r++])t.removeAttribute(n)}}),we={set:function(t,e,n){return!1===e?k.removeAttr(t,n):t.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=Ae[e]||k.find.attr;Ae[e]=function(t,e,r){var i,o,a=e.toLowerCase();return r||(o=Ae[a],Ae[a]=i,i=null!=n(t,e,r)?a:null,Ae[a]=o),i}}));var Se=/^(?:input|select|textarea|button)$/i,Ce=/^(?:a|area)$/i;function ke(t){var e=t.match(V)||[];return e.join(" ")}function Oe(t){return t.getAttribute&&t.getAttribute("class")||""}function Te(t){return Array.isArray(t)?t:"string"===typeof t&&t.match(V)||[]}k.fn.extend({prop:function(t,e){return U(this,k.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[k.propFix[t]||t]}))}}),k.extend({prop:function(t,e,n){var r,i,o=t.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(t)||(e=k.propFix[e]||e,i=k.propHooks[e]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:t[e]=n:i&&"get"in i&&null!==(r=i.get(t,e))?r:t[e]},propHooks:{tabIndex:{get:function(t){var e=k.find.attr(t,"tabindex");return e?parseInt(e,10):Se.test(t.nodeName)||Ce.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),b.optSelected||(k.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){k.propFix[this.toLowerCase()]=this})),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,u,s=0;if(y(t))return this.each((function(e){k(this).addClass(t.call(this,e,Oe(this)))}));if(e=Te(t),e.length)while(n=this[s++])if(i=Oe(n),r=1===n.nodeType&&" "+ke(i)+" ",r){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");u=ke(r),i!==u&&n.setAttribute("class",u)}return this},removeClass:function(t){var e,n,r,i,o,a,u,s=0;if(y(t))return this.each((function(e){k(this).removeClass(t.call(this,e,Oe(this)))}));if(!arguments.length)return this.attr("class","");if(e=Te(t),e.length)while(n=this[s++])if(i=Oe(n),r=1===n.nodeType&&" "+ke(i)+" ",r){a=0;while(o=e[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");u=ke(r),i!==u&&n.setAttribute("class",u)}return this},toggleClass:function(t,e){var n=typeof t,r="string"===n||Array.isArray(t);return"boolean"===typeof e&&r?e?this.addClass(t):this.removeClass(t):y(t)?this.each((function(n){k(this).toggleClass(t.call(this,n,Oe(this),e),e)})):this.each((function(){var e,i,o,a;if(r){i=0,o=k(this),a=Te(t);while(e=a[i++])o.hasClass(e)?o.removeClass(e):o.addClass(e)}else void 0!==t&&"boolean"!==n||(e=Oe(this),e&&et.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":et.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,r=0;e=" "+t+" ";while(n=this[r++])if(1===n.nodeType&&(" "+ke(Oe(n))+" ").indexOf(e)>-1)return!0;return!1}});var Ee=/\r/g;k.fn.extend({val:function(t){var e,n,r,i=this[0];return arguments.length?(r=y(t),this.each((function(n){var i;1===this.nodeType&&(i=r?t.call(this,n,k(this).val()):t,null==i?i="":"number"===typeof i?i+="":Array.isArray(i)&&(i=k.map(i,(function(t){return null==t?"":t+""}))),e=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()],e&&"set"in e&&void 0!==e.set(this,i,"value")||(this.value=i))}))):i?(e=k.valHooks[i.type]||k.valHooks[i.nodeName.toLowerCase()],e&&"get"in e&&void 0!==(n=e.get(i,"value"))?n:(n=i.value,"string"===typeof n?n.replace(Ee,""):null==n?"":n)):void 0}}),k.extend({valHooks:{option:{get:function(t){var e=k.find.attr(t,"value");return null!=e?e:ke(k.text(t))}},select:{get:function(t){var e,n,r,i=t.options,o=t.selectedIndex,a="select-one"===t.type,u=a?null:[],s=a?o+1:i.length;for(r=o<0?s:a?o:0;r-1)&&(n=!0);return n||(t.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],(function(){k.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=k.inArray(k(t).val(),e)>-1}},b.checkOn||(k.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),b.focusin="onfocusin"in n;var Ie=/^(?:focusinfocus|focusoutblur)$/,De=function(t){t.stopPropagation()};k.extend(k.event,{trigger:function(t,e,r,i){var o,a,u,s,l,c,f,h,p=[r||x],v=d.call(t,"type")?t.type:t,g=d.call(t,"namespace")?t.namespace.split("."):[];if(a=h=u=r=r||x,3!==r.nodeType&&8!==r.nodeType&&!Ie.test(v+k.event.triggered)&&(v.indexOf(".")>-1&&(g=v.split("."),v=g.shift(),g.sort()),l=v.indexOf(":")<0&&"on"+v,t=t[k.expando]?t:new k.Event(v,"object"===typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),e=null==e?[t]:k.makeArray(e,[t]),f=k.event.special[v]||{},i||!f.trigger||!1!==f.trigger.apply(r,e))){if(!i&&!f.noBubble&&!m(r)){for(s=f.delegateType||v,Ie.test(s+v)||(a=a.parentNode);a;a=a.parentNode)p.push(a),u=a;u===(r.ownerDocument||x)&&p.push(u.defaultView||u.parentWindow||n)}o=0;while((a=p[o++])&&!t.isPropagationStopped())h=a,t.type=o>1?s:f.bindType||v,c=(et.get(a,"events")||Object.create(null))[t.type]&&et.get(a,"handle"),c&&c.apply(a,e),c=l&&a[l],c&&c.apply&&$(a)&&(t.result=c.apply(a,e),!1===t.result&&t.preventDefault());return t.type=v,i||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!$(r)||l&&y(r[v])&&!m(r)&&(u=r[l],u&&(r[l]=null),k.event.triggered=v,t.isPropagationStopped()&&h.addEventListener(v,De),r[v](),t.isPropagationStopped()&&h.removeEventListener(v,De),k.event.triggered=void 0,u&&(r[l]=u)),t.result}},simulate:function(t,e,n){var r=k.extend(new k.Event,n,{type:t,isSimulated:!0});k.event.trigger(r,null,e)}}),k.fn.extend({trigger:function(t,e){return this.each((function(){k.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return k.event.trigger(t,e,n,!0)}}),b.focusin||k.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){k.event.simulate(e,t.target,k.event.fix(t))};k.event.special[e]={setup:function(){var r=this.ownerDocument||this.document||this,i=et.access(r,e);i||r.addEventListener(t,n,!0),et.access(r,e,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this.document||this,i=et.access(r,e)-1;i?et.access(r,e,i):(r.removeEventListener(t,n,!0),et.remove(r,e))}}}));var je=n.location,Le={guid:Date.now()},Ne=/\?/;k.parseXML=function(t){var e;if(!t||"string"!==typeof t)return null;try{e=(new n.DOMParser).parseFromString(t,"text/xml")}catch(r){e=void 0}return e&&!e.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+t),e};var Ge=/\[\]$/,Re=/\r?\n/g,Me=/^(?:submit|button|image|reset|file)$/i,Be=/^(?:input|select|textarea|keygen)/i;function Pe(t,e,n,r){var i;if(Array.isArray(e))k.each(e,(function(e,i){n||Ge.test(t)?r(t,i):Pe(t+"["+("object"===typeof i&&null!=i?e:"")+"]",i,n,r)}));else if(n||"object"!==S(e))r(t,e);else for(i in e)Pe(t+"["+i+"]",e[i],n,r)}k.param=function(t,e){var n,r=[],i=function(t,e){var n=y(e)?e():e;r[r.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!k.isPlainObject(t))k.each(t,(function(){i(this.name,this.value)}));else for(n in t)Pe(n,t[n],e,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=k.prop(this,"elements");return t?k.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!k(this).is(":disabled")&&Be.test(this.nodeName)&&!Me.test(t)&&(this.checked||!yt.test(t))})).map((function(t,e){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,(function(t){return{name:e.name,value:t.replace(Re,"\r\n")}})):{name:e.name,value:n.replace(Re,"\r\n")}})).get()}});var ze=/%20/g,Ve=/#.*$/,Qe=/([?&])_=[^&]*/,Fe=/^(.*?):[ \t]*([^\r\n]*)$/gm,qe=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,We=/^(?:GET|HEAD)$/,Xe=/^\/\//,Ze={},He={},Ue="*/".concat("*"),Je=x.createElement("a");function Ye(t){return function(e,n){"string"!==typeof e&&(n=e,e="*");var r,i=0,o=e.toLowerCase().match(V)||[];if(y(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(t[r]=t[r]||[]).unshift(n)):(t[r]=t[r]||[]).push(n)}}function Ke(t,e,n,r){var i={},o=t===He;function a(u){var s;return i[u]=!0,k.each(t[u]||[],(function(t,u){var l=u(e,n,r);return"string"!==typeof l||o||i[l]?o?!(s=l):void 0:(e.dataTypes.unshift(l),a(l),!1)})),s}return a(e.dataTypes[0])||!i["*"]&&a("*")}function _e(t,e){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((i[n]?t:r||(r={}))[n]=e[n]);return r&&k.extend(!0,t,r),t}function $e(t,e,n){var r,i,o,a,u=t.contents,s=t.dataTypes;while("*"===s[0])s.shift(),void 0===r&&(r=t.mimeType||e.getResponseHeader("Content-Type"));if(r)for(i in u)if(u[i]&&u[i].test(r)){s.unshift(i);break}if(s[0]in n)o=s[0];else{for(i in n){if(!s[0]||t.converters[i+" "+s[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==s[0]&&s.unshift(o),n[o]}function tn(t,e,n,r){var i,o,a,u,s,l={},c=t.dataTypes.slice();if(c[1])for(a in t.converters)l[a.toLowerCase()]=t.converters[a];o=c.shift();while(o)if(t.responseFields[o]&&(n[t.responseFields[o]]=e),!s&&r&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),s=o,o=c.shift(),o)if("*"===o)o=s;else if("*"!==s&&s!==o){if(a=l[s+" "+o]||l["* "+o],!a)for(i in l)if(u=i.split(" "),u[1]===o&&(a=l[s+" "+u[0]]||l["* "+u[0]],a)){!0===a?a=l[i]:!0!==l[i]&&(o=u[0],c.unshift(u[1]));break}if(!0!==a)if(a&&t.throws)e=a(e);else try{e=a(e)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+s+" to "+o}}}return{state:"success",data:e}}Je.href=je.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:je.href,type:"GET",isLocal:qe.test(je.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ue,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?_e(_e(t,k.ajaxSettings),e):_e(k.ajaxSettings,t)},ajaxPrefilter:Ye(Ze),ajaxTransport:Ye(He),ajax:function(t,e){"object"===typeof t&&(e=t,t=void 0),e=e||{};var r,i,o,a,u,s,l,c,f,h,p=k.ajaxSetup({},e),d=p.context||p,v=p.context&&(d.nodeType||d.jquery)?k(d):k.event,g=k.Deferred(),b=k.Callbacks("once memory"),y=p.statusCode||{},m={},w={},A="canceled",S={readyState:0,getResponseHeader:function(t){var e;if(l){if(!a){a={};while(e=Fe.exec(o))a[e[1].toLowerCase()+" "]=(a[e[1].toLowerCase()+" "]||[]).concat(e[2])}e=a[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(t,e){return null==l&&(t=w[t.toLowerCase()]=w[t.toLowerCase()]||t,m[t]=e),this},overrideMimeType:function(t){return null==l&&(p.mimeType=t),this},statusCode:function(t){var e;if(t)if(l)S.always(t[S.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||A;return r&&r.abort(e),C(0,e),this}};if(g.promise(S),p.url=((t||p.url||je.href)+"").replace(Xe,je.protocol+"//"),p.type=e.method||e.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(V)||[""],null==p.crossDomain){s=x.createElement("a");try{s.href=p.url,s.href=s.href,p.crossDomain=Je.protocol+"//"+Je.host!==s.protocol+"//"+s.host}catch(O){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!==typeof p.data&&(p.data=k.param(p.data,p.traditional)),Ke(Ze,p,e,S),l)return S;for(f in c=k.event&&p.global,c&&0===k.active++&&k.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!We.test(p.type),i=p.url.replace(Ve,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(ze,"+")):(h=p.url.slice(i.length),p.data&&(p.processData||"string"===typeof p.data)&&(i+=(Ne.test(i)?"&":"?")+p.data,delete p.data),!1===p.cache&&(i=i.replace(Qe,"$1"),h=(Ne.test(i)?"&":"?")+"_="+Le.guid+++h),p.url=i+h),p.ifModified&&(k.lastModified[i]&&S.setRequestHeader("If-Modified-Since",k.lastModified[i]),k.etag[i]&&S.setRequestHeader("If-None-Match",k.etag[i])),(p.data&&p.hasContent&&!1!==p.contentType||e.contentType)&&S.setRequestHeader("Content-Type",p.contentType),S.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Ue+"; q=0.01":""):p.accepts["*"]),p.headers)S.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(!1===p.beforeSend.call(d,S,p)||l))return S.abort();if(A="abort",b.add(p.complete),S.done(p.success),S.fail(p.error),r=Ke(He,p,e,S),r){if(S.readyState=1,c&&v.trigger("ajaxSend",[S,p]),l)return S;p.async&&p.timeout>0&&(u=n.setTimeout((function(){S.abort("timeout")}),p.timeout));try{l=!1,r.send(m,C)}catch(O){if(l)throw O;C(-1,O)}}else C(-1,"No Transport");function C(t,e,a,s){var f,h,m,x,w,A=e;l||(l=!0,u&&n.clearTimeout(u),r=void 0,o=s||"",S.readyState=t>0?4:0,f=t>=200&&t<300||304===t,a&&(x=$e(p,S,a)),!f&&k.inArray("script",p.dataTypes)>-1&&(p.converters["text script"]=function(){}),x=tn(p,x,S,f),f?(p.ifModified&&(w=S.getResponseHeader("Last-Modified"),w&&(k.lastModified[i]=w),w=S.getResponseHeader("etag"),w&&(k.etag[i]=w)),204===t||"HEAD"===p.type?A="nocontent":304===t?A="notmodified":(A=x.state,h=x.data,m=x.error,f=!m)):(m=A,!t&&A||(A="error",t<0&&(t=0))),S.status=t,S.statusText=(e||A)+"",f?g.resolveWith(d,[h,A,S]):g.rejectWith(d,[S,A,m]),S.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[S,p,f?h:m]),b.fireWith(d,[S,A]),c&&(v.trigger("ajaxComplete",[S,p]),--k.active||k.event.trigger("ajaxStop")))}return S},getJSON:function(t,e,n){return k.get(t,e,n,"json")},getScript:function(t,e){return k.get(t,void 0,e,"script")}}),k.each(["get","post"],(function(t,e){k[e]=function(t,n,r,i){return y(n)&&(i=i||r,r=n,n=void 0),k.ajax(k.extend({url:t,type:e,dataType:i,data:n,success:r},k.isPlainObject(t)&&t))}})),k.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),k._evalUrl=function(t,e,n){return k.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){k.globalEval(t,e,n)}})},k.fn.extend({wrapAll:function(t){var e;return this[0]&&(y(t)&&(t=t.call(this[0])),e=k(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){var t=this;while(t.firstElementChild)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return y(t)?this.each((function(e){k(this).wrapInner(t.call(this,e))})):this.each((function(){var e=k(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=y(t);return this.each((function(n){k(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){k(this).replaceWith(this.childNodes)})),this}}),k.expr.pseudos.hidden=function(t){return!k.expr.pseudos.visible(t)},k.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(t){}};var en={0:200,1223:204},nn=k.ajaxSettings.xhr();b.cors=!!nn&&"withCredentials"in nn,b.ajax=nn=!!nn,k.ajaxTransport((function(t){var e,r;if(b.cors||nn&&!t.crossDomain)return{send:function(i,o){var a,u=t.xhr();if(u.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)u[a]=t.xhrFields[a];for(a in t.mimeType&&u.overrideMimeType&&u.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)u.setRequestHeader(a,i[a]);e=function(t){return function(){e&&(e=r=u.onload=u.onerror=u.onabort=u.ontimeout=u.onreadystatechange=null,"abort"===t?u.abort():"error"===t?"number"!==typeof u.status?o(0,"error"):o(u.status,u.statusText):o(en[u.status]||u.status,u.statusText,"text"!==(u.responseType||"text")||"string"!==typeof u.responseText?{binary:u.response}:{text:u.responseText},u.getAllResponseHeaders()))}},u.onload=e(),r=u.onerror=u.ontimeout=e("error"),void 0!==u.onabort?u.onabort=r:u.onreadystatechange=function(){4===u.readyState&&n.setTimeout((function(){e&&r()}))},e=e("abort");try{u.send(t.hasContent&&t.data||null)}catch(s){if(e)throw s}},abort:function(){e&&e()}}})),k.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return k.globalEval(t),t}}}),k.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),k.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(r,i){e=k(" + + + + + + + +
    + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/assets/statics/public/js/luckysheet/luckysheet.esm.js b/resources/assets/statics/public/js/luckysheet/luckysheet.esm.js new file mode 100644 index 000000000..40f58b5bf --- /dev/null +++ b/resources/assets/statics/public/js/luckysheet/luckysheet.esm.js @@ -0,0 +1,27 @@ +var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function a(e,t,a){return e(a={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&a.path)}},a.exports),a.exports}var n=function(e){return e&&e.Math==Math&&e},l=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),o=function(e){try{return!!e()}catch(e){return!0}},s=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),u={}.propertyIsEnumerable,d=Object.getOwnPropertyDescriptor,h={f:d&&!u.call({1:2},1)?function(e){var t=d(this,e);return!!t&&t.enumerable}:u},m=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},p={}.toString,f=function(e){return p.call(e).slice(8,-1)},g="".split,v=o((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?g.call(e,""):Object(e)}:Object,y=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},b=function(e){return v(y(e))},k=function(e){return"object"==typeof e?null!==e:"function"==typeof e},x=function(e,t){if(!k(e))return e;var a,r;if(t&&"function"==typeof(a=e.toString)&&!k(r=a.call(e)))return r;if("function"==typeof(a=e.valueOf)&&!k(r=a.call(e)))return r;if(!t&&"function"==typeof(a=e.toString)&&!k(r=a.call(e)))return r;throw TypeError("Can't convert object to primitive value")},w={}.hasOwnProperty,_=function(e,t){return w.call(e,t)},C=l.document,T=k(C)&&k(C.createElement),A=function(e){return T?C.createElement(e):{}},S=!s&&!o((function(){return 7!=Object.defineProperty(A("div"),"a",{get:function(){return 7}}).a})),I=Object.getOwnPropertyDescriptor,R={f:s?I:function(e,t){if(e=b(e),t=x(t,!0),S)try{return I(e,t)}catch(e){}if(_(e,t))return m(!h.f.call(e,t),e[t])}},q=function(e){if(!k(e))throw TypeError(String(e)+" is not an object");return e},D=Object.defineProperty,F={f:s?D:function(e,t,a){if(q(e),t=x(t,!0),q(a),S)try{return D(e,t,a)}catch(e){}if("get"in a||"set"in a)throw TypeError("Accessors not supported");return"value"in a&&(e[t]=a.value),e}},E=s?function(e,t,a){return F.f(e,t,m(1,a))}:function(e,t,a){return e[t]=a,e},M=function(e,t){try{E(l,e,t)}catch(a){l[e]=t}return t},N=l["__core-js_shared__"]||M("__core-js_shared__",{}),P=Function.toString;"function"!=typeof N.inspectSource&&(N.inspectSource=function(e){return P.call(e)});var z,L,O,B=N.inspectSource,V=l.WeakMap,H="function"==typeof V&&/native code/.test(B(V)),U=a((function(e){(e.exports=function(e,t){return N[e]||(N[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),j=0,G=Math.random(),W=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++j+G).toString(36)},Y=U("keys"),X=function(e){return Y[e]||(Y[e]=W(e))},K={},Z=l.WeakMap;if(H){var Q=new Z,J=Q.get,ee=Q.has,te=Q.set;z=function(e,t){return te.call(Q,e,t),t},L=function(e){return J.call(Q,e)||{}},O=function(e){return ee.call(Q,e)}}else{var ae=X("state");K[ae]=!0,z=function(e,t){return E(e,ae,t),t},L=function(e){return _(e,ae)?e[ae]:{}},O=function(e){return _(e,ae)}}var re={set:z,get:L,has:O,enforce:function(e){return O(e)?L(e):z(e,{})},getterFor:function(e){return function(t){var a;if(!k(t)||(a=L(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return a}}},ne=a((function(e){var t=re.get,a=re.enforce,r=String(String).split("String");(e.exports=function(e,t,n,i){var o=!!i&&!!i.unsafe,s=!!i&&!!i.enumerable,c=!!i&&!!i.noTargetGet;"function"==typeof n&&("string"!=typeof t||_(n,"name")||E(n,"name",t),a(n).source=r.join("string"==typeof t?t:"")),e!==l?(o?!c&&e[t]&&(s=!0):delete e[t],s?e[t]=n:E(e,t,n)):s?e[t]=n:M(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||B(this)}))})),le=l,ie=function(e){return"function"==typeof e?e:void 0},oe=function(e,t){return arguments.length<2?ie(le[e])||ie(l[e]):le[e]&&le[e][t]||l[e]&&l[e][t]},se=Math.ceil,ce=Math.floor,ue=function(e){return isNaN(e=+e)?0:(e>0?ce:se)(e)},de=Math.min,he=function(e){return e>0?de(ue(e),9007199254740991):0},me=Math.max,pe=Math.min,fe=function(e,t){var a=ue(e);return a<0?me(a+t,0):pe(a,t)},ge=function(e){return function(t,a,r){var n,l=b(t),i=he(l.length),o=fe(r,i);if(e&&a!=a){for(;i>o;)if((n=l[o++])!=n)return!0}else for(;i>o;o++)if((e||o in l)&&l[o]===a)return e||o||0;return!e&&-1}},ve={includes:ge(!0),indexOf:ge(!1)},ye=ve.indexOf,be=function(e,t){var a,r=b(e),n=0,l=[];for(a in r)!_(K,a)&&_(r,a)&&l.push(a);for(;t.length>n;)_(r,a=t[n++])&&(~ye(l,a)||l.push(a));return l},ke=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],xe=ke.concat("length","prototype"),we={f:Object.getOwnPropertyNames||function(e){return be(e,xe)}},_e={f:Object.getOwnPropertySymbols},Ce=oe("Reflect","ownKeys")||function(e){var t=we.f(q(e)),a=_e.f;return a?t.concat(a(e)):t},Te=function(e,t){for(var a=Ce(t),r=F.f,n=R.f,l=0;l1?arguments[1]:void 0)}});var je,Ge=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,a={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(a,[]),t=a instanceof Array}catch(e){}return function(a,r){return q(a),function(e){if(!k(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(r),t?e.call(a,r):a.__proto__=r,a}}():void 0),We=function(e,t,a){var r,n;return Ge&&"function"==typeof(r=t.constructor)&&r!==a&&k(n=r.prototype)&&n!==a.prototype&&Ge(e,n),e},Ye=Object.keys||function(e){return be(e,ke)},Xe=s?Object.defineProperties:function(e,t){q(e);for(var a,r=Ye(t),n=r.length,l=0;n>l;)F.f(e,a=r[l++],t[a]);return e},Ke=oe("document","documentElement"),Ze=X("IE_PROTO"),Qe=function(){},Je=function(e){return"