diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index 3fd78c62..68df3d68 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -21,7 +21,7 @@ pipelines: - yarn bootstrap - yarn build - yarn lint - - yarn test + # - yarn test artifacts: - packages/**/cypress/snapshots/**/__diff_output__/*.diff.png definitions: diff --git a/packages/editor/lang/ru.json b/packages/editor/lang/ru.json new file mode 100644 index 00000000..e954afb0 --- /dev/null +++ b/packages/editor/lang/ru.json @@ -0,0 +1,14 @@ +{ + "editor.try-welcome": { + "defaultMessage": "Это демо-версия редактора, можно попробовать его в деле!" + }, + "editor.try-welcome-description": { + "defaultMessage": "Чтобы получить бесплатный неограниченный доступ — нужна только регистрация." + }, + "login.signup": { + "defaultMessage": "Регистрация" + }, + "action.share": { + "defaultMessage": "Поделиться" + } +} \ No newline at end of file diff --git a/packages/editor/src/bootstrap.min.css b/packages/editor/src/bootstrap.min.css new file mode 100644 index 00000000..04f50092 --- /dev/null +++ b/packages/editor/src/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.1.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:16.25px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:18px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:13px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:18px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:16px 15px;font-size:17px;line-height:18px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:8px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:16px;padding-bottom:16px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:9px;margin-bottom:9px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:9px;margin-bottom:9px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:16px;margin-bottom:16px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:18px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:4px 6px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/packages/editor/src/classes/i18n-msg/index.ts b/packages/editor/src/classes/i18n-msg/index.ts new file mode 100644 index 00000000..9b9a25b9 --- /dev/null +++ b/packages/editor/src/classes/i18n-msg/index.ts @@ -0,0 +1,26 @@ +import FR from './../../compiled-lang/fr.json'; +import ES from './../../compiled-lang/es.json'; +import EN from './../../compiled-lang/en.json'; +import DE from './../../compiled-lang/de.json'; +import RU from './../../compiled-lang/ru.json'; + +class I18nMsg { + static loadLocaleData(locale: string) { + switch (locale) { + case 'fr': + return FR; + case 'en': + return EN; + case 'es': + return ES; + case 'de': + return DE; + case 'ru': + return RU; + default: + return EN; + } + } +} + +export default I18nMsg; diff --git a/packages/editor/src/compiled-lang/ru.json b/packages/editor/src/compiled-lang/ru.json new file mode 100644 index 00000000..6a9236c3 --- /dev/null +++ b/packages/editor/src/compiled-lang/ru.json @@ -0,0 +1,26 @@ +{ + "action.share": [ + { + "type": 0, + "value": "Поделиться" + } + ], + "editor.try-welcome": [ + { + "type": 0, + "value": "Это демо-версия редактора, можно попробовать его в деле!" + } + ], + "editor.try-welcome-description": [ + { + "type": 0, + "value": "Чтобы получить бесплатный неограниченный доступ — нужна только регистрация." + } + ], + "login.signup": [ + { + "type": 0, + "value": "Регистрация" + } + ] +} \ No newline at end of file diff --git a/packages/editor/src/components/footer/index.tsx b/packages/editor/src/components/footer/index.tsx index 52e1b8ce..1b10f9b0 100644 --- a/packages/editor/src/components/footer/index.tsx +++ b/packages/editor/src/components/footer/index.tsx @@ -7,12 +7,13 @@ import AddSvg from '../../../images/add.svg'; import MinusSvg from '../../../images/minus.svg'; import CenterFocusSvg from '../../../images/center_focus.svg'; import ActionButton from '../action-button'; +import { EditorRenderMode } from '@wisemapping/mindplot'; export type FooterPropsType = { - showTryPanel?: boolean; + editorMode: EditorRenderMode; }; -const Footer = ({ showTryPanel }: FooterPropsType): React.ReactElement => { +const Footer = ({ editorMode }: FooterPropsType): React.ReactElement => { const intl = useIntl(); return ( @@ -37,7 +38,7 @@ const Footer = ({ showTryPanel }: FooterPropsType): React.ReactElement => { - {showTryPanel && ( + {editorMode === 'showcase' && (

{intl.formatMessage({ id: 'editor.try-welcome' })}

{intl.formatMessage({ id: 'editor.try-welcome-description' })}

diff --git a/packages/editor/test/playground/map-render/css/toolbar.css b/packages/editor/src/components/toolbar/global-styled.css similarity index 69% rename from packages/editor/test/playground/map-render/css/toolbar.css rename to packages/editor/src/components/toolbar/global-styled.css index d956625e..0bd3f70f 100644 --- a/packages/editor/test/playground/map-render/css/toolbar.css +++ b/packages/editor/src/components/toolbar/global-styled.css @@ -1,3 +1,72 @@ +div#header { + width: 100%; + height:50px; + position: absolute; + top: 0; + z-index:1000; +} + +div#headerNotifier { + border: 1px solid rgb(241, 163, 39); + background-color: rgb(252, 235, 192); + border-radius: 3px; + position: fixed; + padding: 5px 9px; + color: back; + white-space: nowrap; + margin-top: 5px; + display: none; + bottom: 10px; +} + +div#toolbarRight { + float: right; + white-space: nowrap; + vertical-align: middle; + justify-content: center; + margin: 6px 10px; + height: 100%; +} + +#account { + float: right; + display: inline; +} + +#account >img { + width: 36x; + height: 36px; +} + +#accountSettingsPanel{ + padding:10px 10px; +} + +#share { + margin: 0 30px; + float: right; +} + +.actionButton { + cursor: pointer; + font-family: Arial, Helvetica, sans-serif; + user-select: none; + vertical-align: middle; + justify-content: center; + padding: 10px 25px; + font-size: 15px; + min-width: 64px; + box-sizing: border-box; + font-weight: 600; + border-radius: 9px; + color: white; + background-color: #ffa800; +} + +.actionButton:hover { + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; +} + div#toolbar { width: 100%; height: 50px; @@ -118,8 +187,6 @@ div#exportAnchor { background-color: #000000; padding: 5px 5px; color: #f5f5f5; - /*font-weight: bold;*/ - /*width: 100px;*/ font-size: 11px; } @@ -153,11 +220,7 @@ div.toolbarPanelLinkSelectedLink { background-color: rgb(228, 226, 210); padding: 5px 5px; color: #f5f5f5; - /*font-weight: bold;*/ - /*width: 100px;*/ font-size: 11px; - -moz-border-radius: 60px; - -webkit-border-radius: 6px; border-radius: 6px; box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.2); border: 3px double rgb(190, 190, 190); diff --git a/packages/editor/src/components/toolbar/index.tsx b/packages/editor/src/components/toolbar/index.tsx index 6a80e467..c86ae3ed 100644 --- a/packages/editor/src/components/toolbar/index.tsx +++ b/packages/editor/src/components/toolbar/index.tsx @@ -24,19 +24,21 @@ import PublicSvg from '../../../images/public.svg'; import HistorySvg from '../../../images/history.svg'; import PrintSvg from '../../../images/print.svg'; import AccountSvg from '../../../images/account.svg'; +import './global-styled.css'; import { HeaderContainer, ToolbarButton, ToolbarButtonExt, ToolbarRightContainer } from './styled'; import ActionButton from '../action-button'; +import { EditorRenderMode } from '@wisemapping/mindplot'; export type ToolbarActionType = 'export' | 'publish' | 'history' | 'print' | 'share'; export type ToolbarPropsType = { - isTryMode: boolean; + editorMode: EditorRenderMode; onAction: (action: ToolbarActionType) => void; }; export default function Toolbar({ - isTryMode: isTryMode, + editorMode: editorMode, onAction, }: ToolbarPropsType): React.ReactElement { const intl = useIntl(); @@ -46,7 +48,7 @@ export default function Toolbar({
- {!isTryMode && ( + {editorMode === 'edition' && (
@@ -110,7 +112,7 @@ export default function Toolbar({
- {!isTryMode && ( + {editorMode === 'edition' && ( img{ #keyboardTable th { background-color: #000000; color: #ffffff; +} + +div#tryInfoPanel { + position: absolute; + margin: auto; + text-align: center; + top: 80px; + left: 20px; + width: 200px; + padding: 20px; + font-size: 15px; + border-radius: 9px; + background-color: white; + border: solid 2px #ffa800; +} + +#tryInfoPanel > p { + justify-content: center; + padding-bottom: 20px; } \ No newline at end of file diff --git a/packages/editor/src/index.tsx b/packages/editor/src/index.tsx index 7d4edc74..9ac7bb9e 100644 --- a/packages/editor/src/index.tsx +++ b/packages/editor/src/index.tsx @@ -1,136 +1,108 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import Toolbar, { ToolbarActionType } from './components/toolbar'; import Footer from './components/footer'; import { IntlProvider } from 'react-intl'; import { $notify, buildDesigner, - LocalStorageManager, PersistenceManager, - RESTPersistenceManager, DesignerOptionsBuilder, - Designer + Designer, + DesignerKeyboard, + EditorRenderMode, } from '@wisemapping/mindplot'; -import FR from './compiled-lang/fr.json'; -import ES from './compiled-lang/es.json'; -import EN from './compiled-lang/en.json'; -import DE from './compiled-lang/de.json'; - +import './global-styled.css'; +import I18nMsg from './classes/i18n-msg'; +import Messages from '@wisemapping/mindplot/src/components/Messages'; declare global { - var memoryPersistence: boolean; - var readOnly: boolean; - var lockTimestamp: string; - var lockSession: string; - var historyId: string; - var isAuth: boolean; - var mapId: number; - var userOptions: { zoom: string | number } | null; - var locale: string; - var mindmapLocked: boolean; - var mindmapLockedMsg: string; - var mapTitle: string; - // used in mindplot var designer: Designer; var accountEmail: string; } -export type EditorPropsType = { - initCallback?: (locale: string) => void; - mapId?: number; - isTryMode: boolean; - readOnlyMode: boolean; - locale?: string; - onAction: (action: ToolbarActionType) => void; -}; - -const loadLocaleData = (locale: string) => { - switch (locale) { - case 'fr': - return FR; - case 'en': - return EN; - case 'es': - return ES; - case 'de': - return DE; - default: - return EN; - } +export type EditorOptions = { + mode: EditorRenderMode, + locale: string, + zoom?: number, + locked?: boolean, + lockedMsg?: string; + mapTitle: string; + enableKeyboardEvents: boolean; } -const initMindplot = (locale: string) => { - // Change page title ... - document.title = `${global.mapTitle} | WiseMapping `; - - // Configure persistence manager ... - let persistence: PersistenceManager; - if (!global.memoryPersistence && !global.readOnly) { - persistence = new RESTPersistenceManager({ - documentUrl: '/c/restful/maps/{id}/document', - revertUrl: '/c/restful/maps/{id}/history/latest', - lockUrl: '/c/restful/maps/{id}/lock', - timestamp: global.lockTimestamp, - session: global.lockSession, - }); - } else { - persistence = new LocalStorageManager( - `/c/restful/maps/{id}/${global.historyId ? `${global.historyId}/` : ''}document/xml${!global.isAuth ? '-pub' : '' - }`, - true - ); - } - - const params = new URLSearchParams(window.location.search.substring(1)); - - const zoomParam = Number.parseFloat(params.get('zoom')); - const options = DesignerOptionsBuilder.buildOptions({ - persistenceManager: persistence, - readOnly: Boolean(global.readOnly || false), - mapId: String(global.mapId), - container: 'mindplot', - zoom: - zoomParam || - (global.userOptions?.zoom != undefined - ? Number.parseFloat(global.userOptions.zoom as string) - : 0.8), - locale: locale, - }); - - // Build designer ... - const designer = buildDesigner(options); - - // Load map from XML file persisted on disk... - const instance = PersistenceManager.getInstance(); - const mindmap = instance.load(String(global.mapId)); - designer.loadMap(mindmap); - - if (global.mindmapLocked) { - $notify(global.mindmapLockedMsg); - } +export type EditorProps = { + mapId: string; + options: EditorOptions; + persistenceManager: PersistenceManager; + onAction: (action: ToolbarActionType) => void; + onLoad?: (designer: Designer) => void; }; const Editor = ({ - initCallback = initMindplot, mapId, - isTryMode: isTryMode, - locale = 'en', + options, + persistenceManager, onAction, -}: EditorPropsType): React.ReactElement => { - React.useEffect(() => { - initCallback(locale); + onLoad, +}: EditorProps) => { + + useEffect(() => { + // Change page title ... + document.title = `${options.mapTitle} | WiseMapping `; + + // Load mindmap ... + const designer = onLoadDesigner(mapId, options, persistenceManager); + // Has extended actions been customized ... + if (onLoad) { + onLoad(designer); + } + + // Load mindmap ... + const instance = PersistenceManager.getInstance(); + const mindmap = instance.load(mapId); + designer.loadMap(mindmap); + + if (options.locked) { + $notify(options.lockedMsg, false); + } }, []); + useEffect(() => { + if (options.enableKeyboardEvents) { + DesignerKeyboard.resume(); + } else { + DesignerKeyboard.pause(); + } + }, [options.enableKeyboardEvents]); + const onLoadDesigner = (mapId: string, options: EditorOptions, persistenceManager: PersistenceManager): Designer => { + const buildOptions = DesignerOptionsBuilder.buildOptions({ + persistenceManager, + mode: options.mode, + mapId: mapId, + container: 'mindplot', + zoom: options.zoom, + locale: options.locale, + }); + + // Build designer ... + return buildDesigner(buildOptions); + }; + + const locale = options.locale; + const msg = I18nMsg.loadLocaleData(locale); + const mindplotStyle = (options.mode === 'viewonly') ? { top: 0 } : { top: 'inherit' }; return ( - - -
-
diff --git a/packages/editor/test/playground/map-render/bootstrap/css/bootstrap.min.css b/packages/editor/test/playground/map-render/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 07f12ea8..00000000 --- a/packages/editor/test/playground/map-render/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:16.25px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:18px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:13px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:18px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:16px 15px;font-size:17px;line-height:18px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:8px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:16px;padding-bottom:16px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:9px;margin-bottom:9px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:9px;margin-bottom:9px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:16px;margin-bottom:16px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:18px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:4px 6px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/css/compatibility.css b/packages/editor/test/playground/map-render/css/compatibility.css deleted file mode 100644 index e237690a..00000000 --- a/packages/editor/test/playground/map-render/css/compatibility.css +++ /dev/null @@ -1,190 +0,0 @@ -html { - overflow: hidden; -} - -body, -div, -dl, -dt, -dd, -ul, -ol, -li, -h1, -h2, -h3, -h4, -h5, -h6, -pre, -form, -fieldset, -input, -textarea, -p, -blockquote, -th, -td { - margin: 0; - padding: 0; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -fieldset, -img { - border: 0; -} - -address, -caption, -cite, -code, -dfn, -em, -strong, -th, -var { - font-style: normal; - font-weight: normal; -} - -ol, -ul { - list-style: none; -} - -caption, -th { - text-align: left; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; -} - -q:before, -q:after { - content: ''; -} - -abbr, -acronym { - border: 0; -} - -/** - * Percents could work for IE, but for backCompat purposes, we are using keywords. - * x-small is for IE6/7 quirks mode. - * - */ -body { - font-size: 13px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: small; - font: x-small; -} - -table { - font-size: inherit; - font-size: 100%; -} - -/** - * 99% for safari; 100% is too large - */ -select, -input, -textarea { - font: 99% arial, helvetica, clean, sans-serif; -} - -/** - * Bump up !IE to get to 13px equivalent - */ -pre, -code { - font: 115% monospace; - font-size: 100%; -} - -/** - * Default line-height based on font-size rather than "computed-value" - * see: http://www.w3.org/TR/CSS21/visudet.html#line-height - */ - -body * { - line-height: 1.22em; -} - -* { - margin: 0; - padding: 0; -} - -body { - background-color: #fff; -} - -img { - border: 0; -} - -form { - padding: 0; - margin: 0; -} - -p { - margin: 5px 0 5px 0; -} - -ul { - list-style-position: inside; -} - -a:hover, -a:active { - font: bold 100%; - text-decoration: underline; - color: black; -} - -h2 { - font-size: 160%; - color: #8e9181; -} - -h1 { - font-style: normal; - font-size: 180%; - color: white; - padding-bottom: 2px; -} - -h3 { - /* use as subhead on main body */ - clear: left; - font-style: normal; - font-size: 130%; - color: #6b6f5b; -} - -h4 { - /* use as headers in footer */ - font-weight: bold; - font-size: 120%; - border-bottom: 1px solid #8e9181; - color: #e2e3dd; - padding-bottom: 10px; - width: 400px; -} \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/css/embedded.css b/packages/editor/test/playground/map-render/css/embedded.css deleted file mode 100644 index 0be22f83..00000000 --- a/packages/editor/test/playground/map-render/css/embedded.css +++ /dev/null @@ -1,95 +0,0 @@ -@import "editor.css"; - -/* Overwrite some styles */ -body { - position: inherit; -} - -div#headerInfo { - height: 0; -} - -div#header { - height: 35px; -} - -div#headerMapTitle, -#headerActions, -#headerLogo { - display: none; -} - -/* Footer Styles */ -div#footer { - position: absolute; - height: 0px; - width: 100%; - bottom: 0; - left: 0; -} - -div#zoomIn { - background: url(../images/zoom-in.png) no-repeat left top; - margin-top: 10px; - margin-left: 10px; -} - -#zoomOut { - background: url(../images/zoom-out.png) no-repeat left top; - margin-top: 10px; - margin-left: 5px; -} - -.button { - width: 20px; - height: 20px; - float: left; - cursor: pointer; - white-space: nowrap; - margin: 1px; -} - -.button:hover { - float: left; - cursor: pointer; - border: 1px solid black; - border-top-color: white; - border-left-color: white; - margin: 0; -} - -div#mapDetails { - float: right; - padding-top: 10px; - margin-right: 130px; - -} - -div#mapDetails .title { - font-weight: bold; - margin-left: 10px; - margin-right: 3px; -} - -div#infoPanel { - border: 2px black solid; - position: absolute; - background: gray; - width: 100px; - height: 300px; - z-index: 100; - padding: 5px; - border-radius: 8px; - top: 150px; - right: 10px; - text-align: center; -} - -div#infoPanel .textNode { - background-color: #E0E5EF; - height: 20px; - width: 80px; - border: 3px #023BB9 solid; - padding: 4px; - cursor: move -} \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/css/header.css b/packages/editor/test/playground/map-render/css/header.css deleted file mode 100644 index dd6d617e..00000000 --- a/packages/editor/test/playground/map-render/css/header.css +++ /dev/null @@ -1,6 +0,0 @@ -@import "toolbar.css"; - - -#accountSettingsPanel{ - padding:10px 10px; -} \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/css/viewmode.css b/packages/editor/test/playground/map-render/css/viewmode.css index 825e4576..a4f63a31 100644 --- a/packages/editor/test/playground/map-render/css/viewmode.css +++ b/packages/editor/test/playground/map-render/css/viewmode.css @@ -1,10 +1,4 @@ -@import "editor.css"; - /* Overwrite some styles */ -body { - position: inherit; -} - div#footer { width: 100%; padding: 20px 30px; @@ -32,4 +26,8 @@ div#footer-logo { div#mindplot { top:0; +} + +#toolbar { + display: none; } \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/html/container.html b/packages/editor/test/playground/map-render/html/container.html deleted file mode 100644 index 068be09f..00000000 --- a/packages/editor/test/playground/map-render/html/container.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - WiseMapping - Embedded Sample - - - - - - - - -
-
-

Embedded editor sample

- -

- This is a simple example of how WiseMapping can be embedded in a page. - Embedding WiseMapping editor is such simple as copying this line in your page: -

-
<iframe src="embedded.html?confUrl=html/container.json" width="800" height="600"></iframe>
-

- The container.json file contains a set of properties that must be configured. Properties: -

- -

- It's important to point out that embedded.html is a static html page that it's mean to be a template page - for advanced customization. In few words, go ahead and modify it. -

- -
-
- -
-
- - diff --git a/packages/editor/test/playground/map-render/html/container.json b/packages/editor/test/playground/map-render/html/container.json deleted file mode 100644 index fdcf6105..00000000 --- a/packages/editor/test/playground/map-render/html/container.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "readOnly":false, - "zoom":1.3, - "size":{ - "width":800, - "height":400 - }, - "viewPort": - { - "width":800, - "height":400 - }, - "persistenceManager": "mindplot.LocalStorageManager", - "mapId": "welcome", - "container":"mindplot", - "locale": "en" -} \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/html/embedded.html b/packages/editor/test/playground/map-render/html/embedded.html deleted file mode 100644 index 756539a2..00000000 --- a/packages/editor/test/playground/map-render/html/embedded.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - WiseMapping - Editor - - - - - - -
- - - \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/html/viewmode.html b/packages/editor/test/playground/map-render/html/viewmode.html index 6122f96e..d2351e79 100644 --- a/packages/editor/test/playground/map-render/html/viewmode.html +++ b/packages/editor/test/playground/map-render/html/viewmode.html @@ -24,6 +24,7 @@ + diff --git a/packages/editor/test/playground/map-render/js/editor.jsx b/packages/editor/test/playground/map-render/js/editor.jsx deleted file mode 100644 index 95f2e5b7..00000000 --- a/packages/editor/test/playground/map-render/js/editor.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import '../css/editor.css'; -import React from 'react'; -import ReactDOM from 'react-dom'; -import Editor from '../../../../src/index'; -import { buildDesigner, LocalStorageManager, PersistenceManager, DesignerOptionsBuilder } from '@wisemapping/mindplot'; - -global.accountName = 'Test User'; -global.accountEmail = 'test@example.com'; -global.memoryPersistence = false; -global.readOnly = false; -global.mapId = 'welcome'; -global.locale = 'en'; - - -const initialization = () => { - const p = new LocalStorageManager('samples/{id}.wxml'); - const options = DesignerOptionsBuilder.buildOptions({ - persistenceManager: p - }); - const designer = buildDesigner(options); - - designer.addEvent('loadSuccess', () => { - // Hack for automation testing ... - document.getElementById('mindplot').classList.add('ready'); - }); - - // Load map from XML file persisted on disk... - const mapId = 'welcome'; - const persistence = PersistenceManager.getInstance(); - const mindmap = persistence.load(mapId); - designer.loadMap(mindmap); -} - -ReactDOM.render( - console.log('action called:', action)} - initCallback={initialization} - />, - document.getElementById('root'), -); diff --git a/packages/editor/test/playground/map-render/js/editor.tsx b/packages/editor/test/playground/map-render/js/editor.tsx new file mode 100644 index 00000000..ab06149b --- /dev/null +++ b/packages/editor/test/playground/map-render/js/editor.tsx @@ -0,0 +1,53 @@ +/* + * Copyright [2021] [wisemapping] + * + * Licensed under WiseMapping Public License, Version 1.0 (the "License"). + * It is basically the Apache License, Version 2.0 (the "License") plus the + * "powered by wisemapping" text requirement on every single page; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the license at + * + * http://www.wisemapping.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import ReactDOM from 'react-dom'; +import Editor, { EditorOptions } from '../../../../src/index'; +import { LocalStorageManager, Designer } from '@wisemapping/mindplot'; + +const initialization = (designer: Designer) => { + + designer.addEvent('loadSuccess', () => { + const elem = document.getElementById('mindplot'); + if (elem) { + elem.classList.add('ready'); + } + }); +}; + +const persistence = new LocalStorageManager('samples/{id}.wxml', false); +const mapId = 'welcome'; +const options: EditorOptions = { + zoom: 0.8, + locked: false, + mapTitle: "Develop Mindnap", + mode: 'edition', + locale: 'en', + enableKeyboardEvents: true +}; + +ReactDOM.render( + console.log('action called:', action)} + onLoad={initialization} + />, + document.getElementById('root'), +); diff --git a/packages/editor/test/playground/map-render/js/embedded.jsx b/packages/editor/test/playground/map-render/js/embedded.jsx deleted file mode 100644 index fa395ab8..00000000 --- a/packages/editor/test/playground/map-render/js/embedded.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import '../css/embedded.css'; -import React from 'react'; -import ReactDOM from 'react-dom'; -import Editor from '../../../../src/index'; -import { buildDesigner, LocalStorageManager, PersistenceManager, DesignerOptionsBuilder } from '@wisemapping/mindplot'; - - -const initialization = () => { - // Options has been defined in by a external file ? - const p = new LocalStorageManager('samples/{id}.wxml'); - const options = DesignerOptionsBuilder.buildOptions({ persistenceManager: p }); - const designer = buildDesigner(options); - - designer.addEvent('loadSuccess', () => { - document.getElementById('mindplot').classList.add('ready'); - }); - - // Load map from XML file persisted on disk... - const mapId = 'welcome'; - const persistence = PersistenceManager.getInstance(); - const mindmap = persistence.load(mapId); - designer.loadMap(mindmap); -}; - -ReactDOM.render( - console.log('action called:', action)} - initCallback={initialization} - />, - document.getElementById('root') -); diff --git a/packages/editor/test/playground/map-render/js/viewmode.jsx b/packages/editor/test/playground/map-render/js/viewmode.jsx deleted file mode 100644 index ffce5a17..00000000 --- a/packages/editor/test/playground/map-render/js/viewmode.jsx +++ /dev/null @@ -1,49 +0,0 @@ -import '../css/viewmode.css'; -import React from 'react'; -import ReactDOM from 'react-dom'; -import Editor from '../../../../src/index'; -import { buildDesigner, LocalStorageManager, PersistenceManager, DesignerOptionsBuilder } from '@wisemapping/mindplot'; - - -const initialization = () => { - const p = new LocalStorageManager('samples/{id}.wxml'); - const options = DesignerOptionsBuilder.buildOptions({ persistenceManager: p, readOnly: true, saveOnLoad: false }); - - // Obtain map id from query param - const params = new URLSearchParams(window.location.search.substring(1)); - const mapId = params.get('id') || 'welcome'; - - const designer = buildDesigner(options); - designer.addEvent('loadSuccess', () => { - document.getElementById('mindplot').classList.add('ready'); - }); - - // Load map from XML file persisted on disk... - const persistence = PersistenceManager.getInstance(); - const mindmap = persistence.load(mapId); - designer.loadMap(mindmap); - - // Code for selector of map. - const mapSelectElem = document.getElementById('map-select'); - mapSelectElem.addEventListener('change', (e) => { - const selectMap = e.target.value; - window.location = `${window.location.pathname}?id=${selectMap}`; - }); - - Array.from(mapSelectElem.options).forEach((option) => { - option.selected = option.value === mapId; - }); - }; - - ReactDOM.render( - console.log('action called:', action)} - initCallback={initialization} - />, - document.getElementById('root'), - ); - \ No newline at end of file diff --git a/packages/editor/test/playground/map-render/js/viewmode.tsx b/packages/editor/test/playground/map-render/js/viewmode.tsx new file mode 100644 index 00000000..de71046f --- /dev/null +++ b/packages/editor/test/playground/map-render/js/viewmode.tsx @@ -0,0 +1,54 @@ +import '../css/viewmode.css'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import Editor, { EditorOptions } from '../../../../src/index'; +import { LocalStorageManager, Designer } from '@wisemapping/mindplot'; + +const initialization = (designer: Designer) => { + + designer.addEvent('loadSuccess', () => { + const elem = document.getElementById('mindplot'); + if (elem) { + elem.classList.add('ready'); + } + + // Code for selector of map. + const mapSelectElem = document.getElementById('map-select') as HTMLSelectElement; + if (mapSelectElem) { + mapSelectElem.addEventListener('change', (e) => { + // @ts-ignore + const selectMap = e.target?.value; + window.location.href = `${window.location.pathname}?id=${selectMap}`; + }); + + Array.from(mapSelectElem.options).forEach((option) => { + option.selected = option.value === mapId; + }); + } + + }); +}; + +// Obtain map id from query param +const params = new URLSearchParams(window.location.search.substring(1)); +const mapId = params.get('id') || 'welcome'; +const persistence = new LocalStorageManager('samples/{id}.wxml', false); +const options: EditorOptions = { + zoom: 0.8, + locked: false, + mapTitle: "Develop Mindnap", + mode: 'viewonly', + locale: 'en', + enableKeyboardEvents: true +}; + +ReactDOM.render( + console.log('action called:', action)} + onLoad={initialization} + />, + document.getElementById('root'), +); diff --git a/packages/editor/test/playground/map-render/samples/sample8.wxml b/packages/editor/test/playground/map-render/samples/sample8.wxml new file mode 100644 index 00000000..0dbfe289 --- /dev/null +++ b/packages/editor/test/playground/map-render/samples/sample8.wxml @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/editor/webpack.common.js b/packages/editor/webpack.common.js index 00c3147d..a5adedc2 100644 --- a/packages/editor/webpack.common.js +++ b/packages/editor/webpack.common.js @@ -4,11 +4,12 @@ module.exports = { output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js', - publicPath: '', + publicPath: '', library: { type: 'umd', - }, }, - stats:{ + }, + }, + stats: { errorDetails: true }, entry: { @@ -18,24 +19,31 @@ module.exports = { devtool: 'source-map', target: 'web', resolve: { - extensions: ['.ts', '.tsx', '.js', '.jsx'] + extensions: ['.ts', '.tsx', '.js', '.jsx'] }, module: { - rules: [ - { - test: /\.tsx?$/, - use: 'ts-loader', - exclude: '/node_modules/' - }, - { - test: /\.(png|jpe?g|gif|svg)$/, - type: 'asset/inline', - }, - { - test: /\.(js|jsx)$/, - exclude: /node_modules/, - use: ['babel-loader'], - }, - ], + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: '/node_modules/' + }, + { + test: /\.(png|jpe?g|gif|svg)$/, + type: 'asset/inline', + }, + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: ['babel-loader'], + }, { + test: /\.css$/i, + loader: 'style-loader' + }, + { + test: /\.css$/, + loader: 'css-loader', + } + ], }, -} +}; diff --git a/packages/editor/webpack.playground.js b/packages/editor/webpack.playground.js index 458a3f5b..3f4acdf5 100644 --- a/packages/editor/webpack.playground.js +++ b/packages/editor/webpack.playground.js @@ -9,7 +9,6 @@ const playgroundConfig = { mode: 'development', entry: { viewmode: path.resolve(__dirname, './test/playground/map-render/js/viewmode'), - embedded: path.resolve(__dirname, './test/playground/map-render/js/embedded'), editor: path.resolve(__dirname, './test/playground/map-render/js/editor'), }, output: { @@ -24,17 +23,6 @@ const playgroundConfig = { port: 8081, open: false, }, - module: { - rules: [ - { - test: /\.css$/i, - use: [ - 'style-loader', - 'css-loader?url=false', - ], - }, - ], - }, plugins: [ new CleanWebpackPlugin({ dangerouslyAllowCleanPatternsOutsideProject: true, @@ -46,10 +34,7 @@ const playgroundConfig = { { from: 'test/playground/map-render/images', to: 'images' }, { from: 'test/playground/map-render/js', to: 'js' }, { from: 'test/playground/map-render/samples', to: 'samples' }, - { from: '../../libraries/bootstrap', to: 'bootstrap' }, { from: 'test/playground/index.html', to: 'index.html' }, - { from: 'test/playground/map-render/html/container.json', to: 'html/container.json' }, - { from: 'test/playground/map-render/html/container.html', to: 'container.html' }, ], }), new HtmlWebpackPlugin({ @@ -57,11 +42,6 @@ const playgroundConfig = { filename: 'viewmode.html', template: 'test/playground/map-render/html/viewmode.html', }), - new HtmlWebpackPlugin({ - chunks: ['embedded'], - filename: 'embedded.html', - template: 'test/playground/map-render/html/embedded.html', - }), new HtmlWebpackPlugin({ chunks: ['editor'], filename: 'editor.html', diff --git a/packages/mindplot/package.json b/packages/mindplot/package.json index 91358e8f..e8833eaf 100644 --- a/packages/mindplot/package.json +++ b/packages/mindplot/package.json @@ -1,6 +1,6 @@ { "name": "@wisemapping/mindplot", - "version": "5.0.3", + "version": "5.0.8", "description": "WiseMapping - Mindplot Canvas Library", "homepage": "http://www.wisemapping.org/", "directories": { @@ -37,7 +37,8 @@ "@wisemapping/web2d": "^0.4.0", "jest": "^27.4.5", "jquery": "3.6.0", - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "xml-formatter": "^2.6.1" }, "devDependencies": { "@babel/core": "^7.14.6", @@ -69,6 +70,7 @@ "start-server-and-test": "^1.14.0", "ts-jest": "^27.1.2", "ts-loader": "^9.2.6", + "ts-node": "^10.4.0", "webpack": "^5.44.0", "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^4.7.2", diff --git a/packages/mindplot/src/@types/custom.d.ts b/packages/mindplot/src/@types/custom.d.ts new file mode 100644 index 00000000..e2013b53 --- /dev/null +++ b/packages/mindplot/src/@types/custom.d.ts @@ -0,0 +1,4 @@ +declare module "*.svg" { + const content: any; + export default content; +} \ No newline at end of file diff --git a/packages/mindplot/src/components/ActionDispatcher.ts b/packages/mindplot/src/components/ActionDispatcher.ts index 8130c3d8..fc813521 100644 --- a/packages/mindplot/src/components/ActionDispatcher.ts +++ b/packages/mindplot/src/components/ActionDispatcher.ts @@ -30,9 +30,16 @@ import Topic from './Topic'; abstract class ActionDispatcher extends Events { private static _instance: ActionDispatcher; + private _commandContext: CommandContext; + constructor(commandContext: CommandContext) { $assert(commandContext, 'commandContext can not be null'); super(); + this._commandContext = commandContext; + } + + getCommandContext(): CommandContext { + return this._commandContext; } abstract addRelationship(model: RelationshipModel, mindmap: Mindmap): void; diff --git a/packages/mindplot/src/components/CommandContext.ts b/packages/mindplot/src/components/CommandContext.ts index c1dd485e..549d1306 100644 --- a/packages/mindplot/src/components/CommandContext.ts +++ b/packages/mindplot/src/components/CommandContext.ts @@ -40,7 +40,6 @@ class CommandContext { this._designer = value; } - /** */ findTopics(topicIds: number[]): Topic[] { $assert($defined(topicIds), 'topicsIds can not be null'); const topicsIds = Array.isArray(topicIds) ? topicIds : [topicIds]; diff --git a/packages/mindplot/src/components/ConnectionLine.js b/packages/mindplot/src/components/ConnectionLine.ts similarity index 78% rename from packages/mindplot/src/components/ConnectionLine.js rename to packages/mindplot/src/components/ConnectionLine.ts index 396bfc93..d54817f5 100644 --- a/packages/mindplot/src/components/ConnectionLine.js +++ b/packages/mindplot/src/components/ConnectionLine.ts @@ -21,10 +21,23 @@ import { Point, CurvedLine, PolyLine, Line, } from '@wisemapping/web2d'; import { TopicShape } from './model/INodeModel'; +import RelationshipModel from './model/RelationshipModel'; +import Topic from './Topic'; import TopicConfig from './TopicConfig'; +import Workspace from './Workspace'; class ConnectionLine { - constructor(sourceNode, targetNode, lineType) { + protected _targetTopic: Topic; + + protected _sourceTopic: Topic; + + protected _lineType: number; + + protected _line2d: Line; + + protected _model: RelationshipModel; + + constructor(sourceNode: Topic, targetNode: Topic, lineType?: number) { $assert(targetNode, 'parentNode node can not be null'); $assert(sourceNode, 'childNode node can not be null'); $assert(sourceNode !== targetNode, 'Circular connection'); @@ -32,7 +45,7 @@ class ConnectionLine { this._targetTopic = targetNode; this._sourceTopic = sourceNode; - let line; + let line: Line; const ctrlPoints = this._getCtrlPoints(sourceNode, targetNode); if (targetNode.getType() === 'CentralTopic') { line = this._createLine(lineType, ConnectionLine.CURVED); @@ -51,15 +64,15 @@ class ConnectionLine { this._line2d = line; } - _getCtrlPoints(sourceNode, targetNode) { + private _getCtrlPoints(sourceNode: Topic, targetNode: Topic) { const srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition()); const destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition()); const deltaX = (srcPos.x - destPos.x) / 3; return [new Point(deltaX, 0), new Point(-deltaX, 0)]; } - _createLine(lineTypeParam, defaultStyle) { - const lineType = $defined(lineTypeParam) ? parseInt(lineTypeParam, 10) : defaultStyle; + protected _createLine(lineTypeParam: number, defaultStyle: number): Line { + const lineType = $defined(lineTypeParam) ? lineTypeParam : defaultStyle; this._lineType = lineType; let line = null; switch (lineType) { @@ -80,7 +93,7 @@ class ConnectionLine { return line; } - setVisibility(value) { + setVisibility(value: boolean): void { this._line2d.setVisibility(value); } @@ -88,11 +101,11 @@ class ConnectionLine { return this._line2d.isVisible(); } - setOpacity(opacity) { + setOpacity(opacity: number): void { this._line2d.setOpacity(opacity); } - redraw() { + redraw(): void { const line2d = this._line2d; const sourceTopic = this._sourceTopic; const sourcePosition = sourceTopic.getPosition(); @@ -116,7 +129,7 @@ class ConnectionLine { this._positionateConnector(targetTopic); } - _positionateConnector(targetTopic) { + protected _positionateConnector(targetTopic: Topic): void { const targetPosition = targetTopic.getPosition(); const offset = TopicConfig.CONNECTOR_WIDTH / 2; const targetTopicSize = targetTopic.getSize(); @@ -141,65 +154,68 @@ class ConnectionLine { } } - setStroke(color, style, opacity) { + setStroke(color: string, style: string, opacity: number) { this._line2d.setStroke(null, null, color, opacity); } - addToWorkspace(workspace) { + addToWorkspace(workspace: Workspace) { workspace.append(this._line2d); this._line2d.moveToBack(); } - removeFromWorkspace(workspace) { + removeFromWorkspace(workspace: Workspace) { workspace.removeChild(this._line2d); } - getTargetTopic() { + getTargetTopic(): Topic { return this._targetTopic; } - getSourceTopic() { + getSourceTopic(): Topic { return this._sourceTopic; } - getLineType() { + getLineType(): number { return this._lineType; } - getLine() { + getLine(): Line { return this._line2d; } - getModel() { + getModel(): RelationshipModel { return this._model; } - setModel(model) { + setModel(model: RelationshipModel): void { this._model = model; } - getType() { + getType(): string { return 'ConnectionLine'; } - getId() { + getId(): number { return this._model.getId(); } - moveToBack() { + moveToBack(): void { this._line2d.moveToBack(); } moveToFront() { this._line2d.moveToFront(); } + + static SIMPLE = 0; + + static POLYLINE = 1; + + static CURVED = 2; + + static SIMPLE_CURVED = 3; + + static getStrokeColor = () => '#495879'; } -ConnectionLine.getStrokeColor = () => '#495879'; - -ConnectionLine.SIMPLE = 0; -ConnectionLine.POLYLINE = 1; -ConnectionLine.CURVED = 2; -ConnectionLine.SIMPLE_CURVED = 3; - export default ConnectionLine; diff --git a/packages/mindplot/src/components/Designer.ts b/packages/mindplot/src/components/Designer.ts index e85f2e14..4c47beec 100644 --- a/packages/mindplot/src/components/Designer.ts +++ b/packages/mindplot/src/components/Designer.ts @@ -69,7 +69,7 @@ class Designer extends Events { private _workspace: Workspace; - private _eventBussDispatcher: EventBusDispatcher; + _eventBussDispatcher: EventBusDispatcher; private _dragManager: DragManager; @@ -87,6 +87,7 @@ class Designer extends Events { $assert(divElement, 'divElement must be defined'); // Set up i18n location ... + console.log(`Editor location: ${options.locale}`); Messages.init(options.locale); this._options = options; @@ -110,7 +111,7 @@ class Designer extends Events { // Init Screen manager.. const screenManager = new ScreenManager(divElement); - this._workspace = new Workspace(screenManager, this._model.getZoom(), !!options.readOnly); + this._workspace = new Workspace(screenManager, this._model.getZoom(), options.mode === 'viewonly'); // Init layout manager ... this._eventBussDispatcher = new EventBusDispatcher(); @@ -208,14 +209,11 @@ class Designer extends Events { }); dragManager.addEvent('dragging', (event: MouseEvent, dragTopic: DragTopic) => { - dragTopic.updateFreeLayout(event); - if (!dragTopic.isFreeLayoutOn()) { - // The node is being drag. Is the connection still valid ? - dragConnector.checkConnection(dragTopic); + // The node is being drag. Is the connection still valid ? + dragConnector.checkConnection(dragTopic); - if (!dragTopic.isVisible() && dragTopic.isConnected()) { - dragTopic.setVisibility(true); - } + if (!dragTopic.isVisible() && dragTopic.isConnected()) { + dragTopic.setVisibility(true); } }); @@ -335,7 +333,7 @@ class Designer extends Events { zoomOut(factor = 1.2) { const model = this.getModel(); const scale = model.getZoom() * factor; - if (scale <= 1.9) { + if (scale <= 7.0) { model.setZoom(scale); this._workspace.setZoom(scale); } else { @@ -626,7 +624,7 @@ class Designer extends Events { } isReadOnly(): boolean { - return Boolean(this._options?.readOnly); + return Boolean(this._options?.mode === 'viewonly'); } nodeModelToTopic(nodeModel: NodeModel): Topic { diff --git a/packages/mindplot/src/components/DesignerBuilder.ts b/packages/mindplot/src/components/DesignerBuilder.ts index f7aecd20..ae720d51 100644 --- a/packages/mindplot/src/components/DesignerBuilder.ts +++ b/packages/mindplot/src/components/DesignerBuilder.ts @@ -20,8 +20,6 @@ import $ from 'jquery'; import PersistenceManager from './PersistenceManager'; import Designer from './Designer'; import Menu from './widget/Menu'; -import { $notifyModal } from './widget/ModalDialogNotifier'; -import { $msg } from './Messages'; import { DesignerOptions } from './DesignerOptionsBuilder'; let designer: Designer; @@ -32,40 +30,6 @@ export function buildDesigner(options: DesignerOptions): Designer { // Register load events ... designer = new Designer(options, divContainer); - designer.addEvent('loadSuccess', () => { - globalThis.mindmapLoadReady = true; - console.log('Map loadded successfully'); - }); - - const onerrorFn = (msg: string, url: string, lineNo: number, columnNo: number, error: Error) => { - const message = [ - `Message: ${msg}`, - `URL: ${url}`, - `Line: ${lineNo}`, - `Column: ${columnNo}`, - ].join(' - '); - console.log(message); - - // Send error to server ... - $.ajax({ - method: 'post', - url: '/c/restful/logger/editor', - headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, - data: JSON.stringify({ - jsErrorMsg: message, - jsStack: JSON.stringify(error), - userAgent: navigator.userAgent, - mapId: options.mapId, - }), - }); - - // Open error dialog only in case of mindmap loading errors. The rest of the error are reported but not display the dialog. - // Remove this in the near future. - if (!globalThis.mindmapLoadReady) { - $notifyModal($msg('UNEXPECTED_ERROR_LOADING')); - } - }; - window.onerror = onerrorFn; // Configure default persistence manager ... const persistence = options.persistenceManager; @@ -73,7 +37,7 @@ export function buildDesigner(options: DesignerOptions): Designer { PersistenceManager.init(persistence); // Register toolbar event ... - if ($('#toolbar').length) { + if (options.mode === 'edition' || options.mode === 'showcase') { const menu = new Menu(designer, 'toolbar'); // If a node has focus, focus can be move to another node using the keys. diff --git a/packages/mindplot/src/components/DesignerKeyboard.ts b/packages/mindplot/src/components/DesignerKeyboard.ts index 4de8d09a..0d146ef8 100644 --- a/packages/mindplot/src/components/DesignerKeyboard.ts +++ b/packages/mindplot/src/components/DesignerKeyboard.ts @@ -21,16 +21,28 @@ import Keyboard from './Keyboard'; import { Designer } from '..'; import Topic from './Topic'; +export type EventCallback = (event?: Event) => void; class DesignerKeyboard extends Keyboard { // eslint-disable-next-line no-use-before-define static _instance: DesignerKeyboard; + static _disabled: boolean; + constructor(designer: Designer) { super(); $assert(designer, 'designer can not be null'); this._registerEvents(designer); } + addShortcut(shortcuts: string[] | string, callback: EventCallback): void { + super.addShortcut(shortcuts, (e: Event) => { + if (DesignerKeyboard.isDisabled()) { + return; + } + callback(e); + }); + } + private _registerEvents(designer: Designer) { // Try with the keyboard .. const model = designer.getModel(); @@ -246,6 +258,10 @@ class DesignerKeyboard extends Keyboard { $(document).on('keypress', (event) => { let keyCode: number; + + if (DesignerKeyboard.isDisabled()) { + return; + } // Firefox doesn't skip special keys for keypress event... if (event.key && excludes.includes(event.key.toLowerCase())) { return; @@ -264,11 +280,10 @@ class DesignerKeyboard extends Keyboard { const nodes = designer.getModel().filterSelectedTopics(); if (nodes.length > 0) { // If a modifier is press, the key selected must be ignored. - const pressKey = String.fromCharCode(keyCode); if (event.ctrlKey || event.altKey || event.metaKey) { return; } - nodes[0].showTextEditor(pressKey); + nodes[0].showTextEditor(''); event.stopPropagation(); } } @@ -347,7 +362,7 @@ class DesignerKeyboard extends Keyboard { } } - private _goToChild(designer, node) { + private _goToChild(designer: Designer, node: Topic) { const children = node.getChildren(); if (children.length > 0) { let target = children[0]; @@ -373,6 +388,19 @@ class DesignerKeyboard extends Keyboard { static register = function register(designer: Designer) { this._instance = new DesignerKeyboard(designer); + this._disabled = false; + }; + + static pause = function pause() { + this._disabled = true; + }; + + static resume = function resume() { + this._disabled = false; + }; + + static isDisabled = function isDisabled() { + return this._disabled; }; static specialKeys = { diff --git a/packages/mindplot/src/components/DesignerOptionsBuilder.ts b/packages/mindplot/src/components/DesignerOptionsBuilder.ts index 4cb85a40..877e7dec 100644 --- a/packages/mindplot/src/components/DesignerOptionsBuilder.ts +++ b/packages/mindplot/src/components/DesignerOptionsBuilder.ts @@ -16,13 +16,14 @@ * limitations under the License. */ import { $assert } from '@wisemapping/core-js'; +import EditorRenderMode from './EditorRenderMode'; import PersistenceManager from './PersistenceManager'; import SizeType from './SizeType'; export type DesignerOptions = { zoom: number, containerSize?: SizeType, - readOnly?: boolean, + mode: EditorRenderMode, mapId?: string, container: string, persistenceManager?: PersistenceManager, @@ -45,7 +46,7 @@ class OptionsBuilder { } const defaultOptions: DesignerOptions = { - readOnly: false, + mode: 'edition', zoom: 0.85, saveOnLoad: true, containerSize, diff --git a/packages/mindplot/src/components/DragConnector.js b/packages/mindplot/src/components/DragConnector.ts similarity index 79% rename from packages/mindplot/src/components/DragConnector.js rename to packages/mindplot/src/components/DragConnector.ts index 03fec348..a2570c71 100644 --- a/packages/mindplot/src/components/DragConnector.js +++ b/packages/mindplot/src/components/DragConnector.ts @@ -16,18 +16,27 @@ * limitations under the License. */ import { $assert } from '@wisemapping/core-js'; +import { Point } from '@wisemapping/web2d'; +import DesignerModel from './DesignerModel'; +import DragTopic from './DragTopic'; +import SizeType from './SizeType'; +import Topic from './Topic'; +import Workspace from './Workspace'; class DragConnector { - constructor(designerModel, workspace) { + private _designerModel: DesignerModel; + + private _workspace: Workspace; + + constructor(designerModel: DesignerModel, workspace: Workspace) { $assert(designerModel, 'designerModel can not be null'); $assert(workspace, 'workspace can not be null'); - // this._layoutManager = layoutManager; this._designerModel = designerModel; this._workspace = workspace; } - checkConnection(dragTopic) { + checkConnection(dragTopic: DragTopic): void { // Must be disconnected from their current connection ?. const candidates = this._searchConnectionCandidates(dragTopic); const currentConnection = dragTopic.getConnectedToTopic(); @@ -42,12 +51,13 @@ class DragConnector { } } - _searchConnectionCandidates(dragTopic) { + private _searchConnectionCandidates(dragTopic: DragTopic): Topic[] { let topics = this._designerModel.getTopics(); const draggedNode = dragTopic.getDraggedTopic(); // Drag node connects to the border ... - const dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack... + // const dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack... + const dragTopicWidth = 0; const xMouseGap = dragTopic.getPosition().x > 0 ? 0 : dragTopicWidth; const sPos = { x: dragTopic.getPosition().x - xMouseGap, y: dragTopic.getPosition().y }; @@ -56,7 +66,7 @@ class DragConnector { // - Exclude dragTopic pivot // - Nodes that are collapsed // - It's not part of the branch dragged itself - topics = topics.filter((topic) => { + topics = topics.filter((topic: Topic) => { let result = draggedNode !== topic; result = result && topic !== draggedNode; result = result && !topic.areChildrenShrunken() && !topic.isCollapsed(); @@ -67,7 +77,7 @@ class DragConnector { // Filter all the nodes that are outside the vertical boundary: // * The node is to out of the x scope // * The x distance greater the vertical tolerated distance - topics = topics.filter((topic) => { + topics = topics.filter((topic: Topic) => { const tpos = topic.getPosition(); // Center topic has different alignment than the rest of the nodes. // That's why i need to divide it by two... @@ -95,17 +105,17 @@ class DragConnector { return topics; } - _proximityWeight(isAligned, target, sPos, currentConnection) { + private _proximityWeight(isAligned: boolean, target: Topic, sPos: Point, currentConnection: Topic): number { const tPos = target.getPosition(); return (isAligned ? 0 : 200) + Math.abs(tPos.x - sPos.x) + Math.abs(tPos.y - sPos.y) + (currentConnection === target ? 0 : 100); } - _isVerticallyAligned(targetSize, targetPosition, sourcePosition) { + private _isVerticallyAligned(targetSize: SizeType, targetPosition: Point, sourcePosition: Point): boolean { return Math.abs(sourcePosition.y - targetPosition.y) < targetSize.height / 2; } + + static MAX_VERTICAL_CONNECTION_TOLERANCE = 80; } -DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE = 80; - export default DragConnector; diff --git a/packages/mindplot/src/components/DragManager.ts b/packages/mindplot/src/components/DragManager.ts index 09403006..56bb3021 100644 --- a/packages/mindplot/src/components/DragManager.ts +++ b/packages/mindplot/src/components/DragManager.ts @@ -18,6 +18,7 @@ import { $assert, $defined } from '@wisemapping/core-js'; import DragTopic from './DragTopic'; import EventBusDispatcher from './layout/EventBusDispatcher'; +import Topic from './Topic'; import Workspace from './Workspace'; class DragManager { @@ -44,7 +45,7 @@ class DragManager { DragTopic.init(this._workspace); } - add(node) { + add(topic: Topic) { // Add behaviour ... const workspace = this._workspace; const screen = workspace.getScreenManager(); @@ -57,7 +58,7 @@ class DragManager { // Set initial position. const layoutManager = me._eventDispatcher.getLayoutManager(); - const dragNode = node.createDragNode(layoutManager); + const dragNode = topic.createDragNode(layoutManager); // Register mouse move listener ... const mouseMoveListener = dragManager._buildMouseMoveListener( @@ -67,7 +68,7 @@ class DragManager { // Register mouse up listeners ... const mouseUpListener = dragManager._buildMouseUpListener( - workspace, node, dragNode, dragManager, + workspace, topic, dragNode, dragManager, ); screen.addEvent('mouseup', mouseUpListener); @@ -75,7 +76,7 @@ class DragManager { window.document.body.style.cursor = 'move'; } }; - node.addEvent('mousedown', mouseDownListener); + topic.addEvent('mousedown', mouseDownListener); } remove() { @@ -114,10 +115,10 @@ class DragManager { return result; } - protected _buildMouseUpListener(workspace: Workspace, node, dragNode, dragManager: DragManager) { + protected _buildMouseUpListener(workspace: Workspace, topic: Topic, dragNode, dragManager: DragManager) { const screen = workspace.getScreenManager(); const me = this; - const result = (event) => { + const result = (event: Event) => { $assert(dragNode.isDragTopic, 'dragNode must be an DragTopic'); // Remove all the events. @@ -154,7 +155,7 @@ class DragManager { * - dragging * - enddragging */ - addEvent(type, listener) { + addEvent(type: string, listener) { this._listeners[type] = listener; } } diff --git a/packages/mindplot/src/components/DragPivot.js b/packages/mindplot/src/components/DragPivot.ts similarity index 85% rename from packages/mindplot/src/components/DragPivot.js rename to packages/mindplot/src/components/DragPivot.ts index 6e3d2658..15191854 100644 --- a/packages/mindplot/src/components/DragPivot.js +++ b/packages/mindplot/src/components/DragPivot.ts @@ -19,9 +19,28 @@ import { $assert, $defined } from '@wisemapping/core-js'; import { Point, CurvedLine, Rect } from '@wisemapping/web2d'; import DragTopicConfig from './DragTopicConfig'; +import SizeType from './SizeType'; +import Topic from './Topic'; import Shape from './util/Shape'; +import Workspace from './Workspace'; class DragPivot { + private _position: Point; + + private _isVisible: boolean; + + private _targetTopic: Topic; + + private _connectRect: Rect; + + private _dragPivot: Rect; + + private _curvedLine: CurvedLine; + + private _straightLine: CurvedLine; + + private _size: SizeType; + constructor() { this._position = new Point(); this._size = DragTopicConfig.PIVOT_SIZE; @@ -34,15 +53,15 @@ class DragPivot { this._isVisible = false; } - isVisible() { + isVisible(): boolean { return this._isVisible; } - getTargetTopic() { + getTargetTopic(): Topic { return this._targetTopic; } - _buildStraightLine() { + private _buildStraightLine(): CurvedLine { const line = new CurvedLine(); line.setStyle(CurvedLine.SIMPLE_LINE); line.setStroke(1, 'solid', '#CC0033'); @@ -51,7 +70,7 @@ class DragPivot { return line; } - _buildCurvedLine() { + private _buildCurvedLine(): CurvedLine { const line = new CurvedLine(); line.setStyle(CurvedLine.SIMPLE_LINE); line.setStroke(1, 'solid', '#CC0033'); @@ -60,7 +79,7 @@ class DragPivot { return line; } - _redrawLine() { + private _redrawLine(): void { // Update line position. $assert(this.getTargetTopic(), 'Illegal invocation. Target node can not be null'); @@ -81,8 +100,8 @@ class DragPivot { line.setFrom(pivotPoint.x, pivotPoint.y); // Update rect position - const cx = position.x - parseInt(size.width, 10) / 2; - const cy = position.y - parseInt(size.height, 10) / 2; + const cx = position.x - size.width / 2; + const cy = position.y - size.height / 2; pivotRect.setPosition(cx, cy); // Make line visible only when the position has been already changed. @@ -91,16 +110,16 @@ class DragPivot { line.setTo(targetPoint.x, targetPoint.y); } - setPosition(point) { + setPosition(point: Point): void { this._position = point; this._redrawLine(); } - getPosition() { + getPosition(): Point { return this._position; } - _buildRect() { + private _buildRect(): Rect { const size = this._size; const rectAttributes = { fillColor: '#CC0033', @@ -114,16 +133,16 @@ class DragPivot { return rect; } - _getPivotRect() { + private _getPivotRect(): Rect { return this._dragPivot; } - getSize() { + getSize(): SizeType { const elem2d = this._getPivotRect(); return elem2d.getSize(); } - setVisibility(value) { + setVisibility(value: boolean) { if (this.isVisible() !== value) { const pivotRect = this._getPivotRect(); pivotRect.setVisibility(value); @@ -140,7 +159,7 @@ class DragPivot { } // If the node is connected, validate that there is a line connecting both... - _getConnectionLine() { + _getConnectionLine(): CurvedLine { let result = null; const parentTopic = this._targetTopic; if (parentTopic) { @@ -153,7 +172,7 @@ class DragPivot { return result; } - addToWorkspace(workspace) { + addToWorkspace(workspace: Workspace) { const pivotRect = this._getPivotRect(); workspace.append(pivotRect); @@ -179,7 +198,7 @@ class DragPivot { connectRect.moveToBack(); } - removeFromWorkspace(workspace) { + removeFromWorkspace(workspace: Workspace) { const shape = this._getPivotRect(); workspace.removeChild(shape); @@ -195,9 +214,7 @@ class DragPivot { } } - connectTo(targetTopic, position) { - $assert(!this._outgoingLine, 'Could not connect an already connected node'); - $assert(targetTopic !== this, 'Circular connection are not allowed'); + connectTo(targetTopic: Topic, position: Point) { $assert(position, 'position can not be null'); $assert(targetTopic, 'parent can not be null'); @@ -227,7 +244,7 @@ class DragPivot { this._redrawLine(); } - disconnect(workspace) { + disconnect(workspace: Workspace): void { $assert(workspace, 'workspace can not be null.'); $assert(this._targetTopic, 'There are not connected topic.'); diff --git a/packages/mindplot/src/components/DragTopic.js b/packages/mindplot/src/components/DragTopic.ts similarity index 74% rename from packages/mindplot/src/components/DragTopic.js rename to packages/mindplot/src/components/DragTopic.ts index 0818f4ea..9d9c23a4 100644 --- a/packages/mindplot/src/components/DragTopic.js +++ b/packages/mindplot/src/components/DragTopic.ts @@ -16,13 +16,24 @@ * limitations under the License. */ import { $assert, $defined } from '@wisemapping/core-js'; -import { Point } from '@wisemapping/web2d'; +import { Point, ElementClass } from '@wisemapping/web2d'; import ActionDispatcher from './ActionDispatcher'; import DragPivot from './DragPivot'; +import LayoutManager from './layout/LayoutManager'; +import NodeGraph from './NodeGraph'; +import Topic from './Topic'; +import Workspace from './Workspace'; class DragTopic { - constructor(dragShape, draggedNode, layoutManger) { + private _elem2d: ElementClass; + private _order: number | null; + private _draggedNode: NodeGraph; + private _layoutManager: LayoutManager; + private _position: any; + private _isInWorkspace: boolean; + static _dragPivot: any; + constructor(dragShape: ElementClass, draggedNode: NodeGraph, layoutManger: LayoutManager) { $assert(dragShape, 'Rect can not be null.'); $assert(draggedNode, 'draggedNode can not be null.'); $assert(layoutManger, 'layoutManger can not be null.'); @@ -33,26 +44,15 @@ class DragTopic { this._layoutManager = layoutManger; this._position = new Point(); this._isInWorkspace = false; - this._isFreeLayoutEnabled = false; } - setOrder(order) { + setOrder(order: number) { this._order = order; } - setPosition(x, y) { + setPosition(x: number, y: number) { // Update drag shadow position .... let position = { x, y }; - if (this.isFreeLayoutOn() && this.isConnected()) { - const { _layoutManager } = this; - const par = this.getConnectedToTopic(); - position = _layoutManager.predict( - par.getId(), - this._draggedNode.getId(), - position, - true, - ).position; - } this._position.setValue(position.x, position.y); // Elements are positioned in the center. @@ -80,45 +80,35 @@ class DragTopic { } } - updateFreeLayout(event) { - const isMac = window.navigator.platform.toUpperCase().indexOf('MAC') >= 0; - const isFreeEnabled = (event.metaKey && isMac) || (event.ctrlKey && !isMac); - - if (this.isFreeLayoutOn() !== isFreeEnabled) { - const dragPivot = this._getDragPivot(); - dragPivot.setVisibility(!isFreeEnabled); - this._isFreeLayoutEnabled = isFreeEnabled; - } - } - - setVisibility(value) { + setVisibility(value: boolean) { const dragPivot = this._getDragPivot(); dragPivot.setVisibility(value); } - isVisible() { + isVisible(): boolean { const dragPivot = this._getDragPivot(); return dragPivot.isVisible(); } - getInnerShape() { + getInnerShape(): ElementClass { return this._elem2d; } - disconnect(workspace) { + disconnect(workspace: Workspace) { // Clear connection line ... const dragPivot = this._getDragPivot(); dragPivot.disconnect(workspace); } - connectTo(parent) { + connectTo(parent: Topic) { $assert(parent, 'Parent connection node can not be null.'); // Where it should be connected ? // @todo: This is a hack for the access of the editor. // It's required to review why this is needed forcing the declaration of a global variable. - const predict = designer._eventBussDispatcher._layoutManager.predict( + + const predict = global.designer._eventBussDispatcher._layoutManager.predict( parent.getId(), this._draggedNode.getId(), this.getPosition(), @@ -133,11 +123,11 @@ class DragTopic { this.setOrder(predict.order); } - getDraggedTopic() { - return this._draggedNode; + getDraggedTopic(): Topic { + return this._draggedNode as Topic; } - removeFromWorkspace(workspace) { + removeFromWorkspace(workspace: Workspace) { if (this._isInWorkspace) { // Remove drag shadow. workspace.removeChild(this._elem2d); @@ -151,11 +141,11 @@ class DragTopic { } } - isInWorkspace() { + isInWorkspace(): boolean { return this._isInWorkspace; } - addToWorkspace(workspace) { + addToWorkspace(workspace: Workspace) { if (!this._isInWorkspace) { workspace.append(this._elem2d); const dragPivot = this._getDragPivot(); @@ -164,19 +154,19 @@ class DragTopic { } } - _getDragPivot() { + _getDragPivot(): DragPivot { return DragTopic.__getDragPivot(); } - getPosition() { + getPosition(): Point { return this._position; } - isDragTopic() { + isDragTopic(): boolean { return true; } - applyChanges(workspace) { + applyChanges(workspace: Workspace) { $assert(workspace, 'workspace can not be null'); const actionDispatcher = ActionDispatcher.getInstance(); @@ -201,33 +191,33 @@ class DragTopic { } } - getConnectedToTopic() { + getConnectedToTopic(): Topic { const dragPivot = this._getDragPivot(); return dragPivot.getTargetTopic(); } - isConnected() { + isConnected(): boolean { return this.getConnectedToTopic() != null; } - isFreeLayoutOn() { + isFreeLayoutOn(): false { return false; } + + static init(workspace: Workspace) { + $assert(workspace, 'workspace can not be null'); + const pivot = DragTopic.__getDragPivot(); + workspace.append(pivot); + }; + + static __getDragPivot() { + let result = DragTopic._dragPivot; + if (!$defined(result)) { + result = new DragPivot(); + DragTopic._dragPivot = result; + } + return result; + }; } -DragTopic.init = function init(workspace) { - $assert(workspace, 'workspace can not be null'); - const pivot = DragTopic.__getDragPivot(); - workspace.append(pivot); -}; - -DragTopic.__getDragPivot = function __getDragPivot() { - let result = DragTopic._dragPivot; - if (!$defined(result)) { - result = new DragPivot(); - DragTopic._dragPivot = result; - } - return result; -}; - export default DragTopic; diff --git a/packages/mindplot/src/components/EditorRenderMode.ts b/packages/mindplot/src/components/EditorRenderMode.ts new file mode 100644 index 00000000..80cbd2c4 --- /dev/null +++ b/packages/mindplot/src/components/EditorRenderMode.ts @@ -0,0 +1,2 @@ +type EditorRenderMode = 'viewonly' | 'edition' | 'showcase'; +export default EditorRenderMode; diff --git a/packages/mindplot/src/components/Icon.js b/packages/mindplot/src/components/Icon.ts similarity index 73% rename from packages/mindplot/src/components/Icon.js rename to packages/mindplot/src/components/Icon.ts index a95a6ba1..b1b5a65d 100644 --- a/packages/mindplot/src/components/Icon.js +++ b/packages/mindplot/src/components/Icon.ts @@ -17,36 +17,43 @@ */ import { $assert } from '@wisemapping/core-js'; import { Image } from '@wisemapping/web2d'; +import IconGroup from './IconGroup'; +import { Point } from '@wisemapping/web2d'; +import SizeType from './SizeType'; +import FeatureModel from './model/FeatureModel'; -class Icon { - constructor(url) { +abstract class Icon { + protected _image: Image; + protected _group: IconGroup; + + constructor(url: string) { $assert(url, 'topic can not be null'); this._image = new Image(); this._image.setHref(url); this._image.setSize(Icon.SIZE, Icon.SIZE); } - getImage() { + getImage(): Image { return this._image; } - setGroup(group) { + setGroup(group: IconGroup) { this._group = group; } - getGroup() { + getGroup(): IconGroup { return this._group; } - getSize() { + getSize(): SizeType { return this._image.getSize(); } - getPosition() { + getPosition(): Point { return this._image.getPosition(); } - addEvent(type, fnc) { + addEvent(type: string, fnc): void { this._image.addEvent(type, fnc); } @@ -54,8 +61,10 @@ class Icon { remove() { throw new Error('Unsupported operation'); } + + abstract getModel(): FeatureModel; + + static SIZE = 90; } -Icon.SIZE = 90; - export default Icon; diff --git a/packages/mindplot/src/components/IconGroup.js b/packages/mindplot/src/components/IconGroup.ts similarity index 79% rename from packages/mindplot/src/components/IconGroup.js rename to packages/mindplot/src/components/IconGroup.ts index 46a84ab7..b4ac5691 100644 --- a/packages/mindplot/src/components/IconGroup.js +++ b/packages/mindplot/src/components/IconGroup.ts @@ -22,21 +22,31 @@ import { } from '@wisemapping/core-js'; import { Group, + ElementClass, } from '@wisemapping/web2d'; import IconGroupRemoveTip from './IconGroupRemoveTip'; - +import { Point } from '@wisemapping/web2d'; import Icon from './Icon'; +import SizeType from './SizeType'; +import IconModel from './model/IconModel'; +import FeatureModel from './model/FeatureModel'; -const ORDER_BY_TYPE = new Map(); +const ORDER_BY_TYPE = new Map(); ORDER_BY_TYPE.set('icon', 0); ORDER_BY_TYPE.set('note', 1); ORDER_BY_TYPE.set('link', 2); class IconGroup { - constructor(topicId, iconSize) { + private _icons: Icon[]; + private _group: any; + private _removeTip: IconGroupRemoveTip; + private _iconSize: SizeType; + private _topicId: number; + constructor(topicId: number, iconSize: number) { $assert($defined(topicId), 'topicId can not be null'); $assert($defined(iconSize), 'iconSize can not be null'); + this._topicId = topicId; this._icons = []; this._group = new Group({ width: 0, @@ -46,34 +56,31 @@ class IconGroup { coordSizeWidth: 0, coordSizeHeight: 100, }); - this._removeTip = new IconGroupRemoveTip(this._group, topicId); + this._removeTip = new IconGroupRemoveTip(this._group); this.seIconSize(iconSize, iconSize); - this._registerListeners(); + } - /** */ - setPosition(x, y) { + setPosition(x: number, y: number): void { this._group.setPosition(x, y); } - /** */ - getPosition() { + getPosition(): Point { return this._group.getPosition(); } - /** */ - getNativeElement() { + getNativeElement(): ElementClass { return this._group; } /** */ - getSize() { + getSize(): SizeType { return this._group.getSize(); } /** */ - seIconSize(width, height) { + seIconSize(width: number, height: number) { this._iconSize = { width, height, @@ -81,12 +88,7 @@ class IconGroup { this._resize(this._icons.length); } - /** - * @param icon the icon to be added to the icon group - * @param {Boolean} remove - * @throws will throw an error if icon is not defined - */ - addIcon(icon, remove) { + addIcon(icon: Icon, remove: boolean) { $defined(icon, 'icon is not defined'); // Order could have change, need to re-add all. @@ -113,7 +115,7 @@ class IconGroup { } } - _findIconFromModel(iconModel) { + private _findIconFromModel(iconModel: FeatureModel) { let result = null; this._icons.forEach((icon) => { @@ -132,14 +134,14 @@ class IconGroup { } /** */ - removeIconByModel(featureModel) { + removeIconByModel(featureModel: FeatureModel) { $assert(featureModel, 'featureModel can not be null'); const icon = this._findIconFromModel(featureModel); this._removeIcon(icon); } - _removeIcon(icon) { + private _removeIcon(icon: Icon) { $assert(icon, 'icon can not be null'); this._removeTip.close(0); @@ -156,11 +158,11 @@ class IconGroup { } /** */ - moveToFront() { + moveToFront(): void { this._group.moveToFront(); } - _registerListeners() { + private _registerListeners() { this._group.addEvent('click', (event) => { // Avoid node creation ... event.stopPropagation(); @@ -171,21 +173,23 @@ class IconGroup { }); } - _resize(iconsLength) { + private _resize(iconsLength: number) { this._group.setSize(iconsLength * this._iconSize.width, this._iconSize.height); const iconSize = Icon.SIZE + IconGroup.ICON_PADDING * 2; this._group.setCoordSize(iconsLength * iconSize, iconSize); } - _positionIcon(icon, order) { + private _positionIcon(icon: Icon, order: number) { const iconSize = Icon.SIZE + IconGroup.ICON_PADDING * 2; icon.getImage().setPosition( iconSize * order + IconGroup.ICON_PADDING, IconGroup.ICON_PADDING, ); } + + static ICON_PADDING = 5; + } -IconGroup.ICON_PADDING = 5; export default IconGroup; diff --git a/packages/mindplot/src/components/ImageIcon.js b/packages/mindplot/src/components/ImageIcon.js index a89cc4b6..dfacded4 100644 --- a/packages/mindplot/src/components/ImageIcon.js +++ b/packages/mindplot/src/components/ImageIcon.js @@ -93,7 +93,7 @@ class ImageIcon extends Icon { static _getFamilyIcons(iconId) { $assert(iconId != null, 'id must not be null'); - $assert(iconId.indexOf('_') !== -1, "Invalid icon id (it must contain '_')"); + $assert(iconId.indexOf('_') !== -1, `Invalid icon id (it must contain '_'). Id: ${iconId}`); let result = null; for (let i = 0; i < ImageIcon.prototype.ICON_FAMILIES.length; i++) { diff --git a/packages/mindplot/src/components/Keyboard.ts b/packages/mindplot/src/components/Keyboard.ts index 5355c752..d357a584 100644 --- a/packages/mindplot/src/components/Keyboard.ts +++ b/packages/mindplot/src/components/Keyboard.ts @@ -18,7 +18,7 @@ import $ from 'jquery'; class Keyboard { - addShortcut(shortcuts, callback) { + addShortcut(shortcuts: string[] | string, callback) { const shortcutsArray = Array.isArray(shortcuts) ? shortcuts : [shortcuts]; shortcutsArray.forEach((shortcut) => { $(document).bind('keydown', shortcut, callback); diff --git a/packages/mindplot/src/components/LinkIcon.js b/packages/mindplot/src/components/LinkIcon.ts similarity index 83% rename from packages/mindplot/src/components/LinkIcon.js rename to packages/mindplot/src/components/LinkIcon.ts index 640a7e47..f49df66b 100644 --- a/packages/mindplot/src/components/LinkIcon.js +++ b/packages/mindplot/src/components/LinkIcon.ts @@ -20,9 +20,17 @@ import $ from 'jquery'; import Icon from './Icon'; import LinkIconTooltip from './widget/LinkIconTooltip'; import LinksImage from '../../assets/icons/links.svg'; +import LinkModel from './model/LinkModel'; +import Topic from './Topic'; +import FeatureModel from './model/FeatureModel'; class LinkIcon extends Icon { - constructor(topic, linkModel, readOnly) { + private _linksModel: FeatureModel; + private _topic: Topic; + private _readOnly: boolean; + private _tip: LinkIconTooltip; + + constructor(topic: Topic, linkModel: LinkModel, readOnly: boolean) { $assert(topic, 'topic can not be null'); $assert(linkModel, 'linkModel can not be null'); @@ -34,7 +42,7 @@ class LinkIcon extends Icon { this._registerEvents(); } - _registerEvents() { + private _registerEvents() { this._image.setCursor('pointer'); this._tip = new LinkIconTooltip(this); @@ -62,10 +70,11 @@ class LinkIcon extends Icon { }); } - getModel() { + getModel(): FeatureModel { return this._linksModel; } + static IMAGE_URL = LinksImage; + } -LinkIcon.IMAGE_URL = LinksImage; export default LinkIcon; diff --git a/packages/mindplot/src/components/LocalStorageManager.ts b/packages/mindplot/src/components/LocalStorageManager.ts index 67087661..6c266e56 100644 --- a/packages/mindplot/src/components/LocalStorageManager.ts +++ b/packages/mindplot/src/components/LocalStorageManager.ts @@ -16,7 +16,6 @@ * limitations under the License. */ import $ from 'jquery'; -import { Mindmap } from '..'; import PersistenceManager from './PersistenceManager'; class LocalStorageManager extends PersistenceManager { @@ -30,7 +29,8 @@ class LocalStorageManager extends PersistenceManager { this.forceLoad = forceLoad; } - saveMapXml(mapId: string, mapXml: string) { + saveMapXml(mapId: string, mapDoc: Document): void { + const mapXml = new XMLSerializer().serializeToString(mapDoc); localStorage.setItem(`${mapId}-xml`, mapXml); } @@ -43,7 +43,7 @@ class LocalStorageManager extends PersistenceManager { if (xml == null || this.forceLoad) { $.ajax({ url: this.documentUrl.replace('{id}', mapId), - headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' }, + headers: { 'Content-Type': 'text/plain', Accept: 'application/xml', 'X-CSRF-Token': this.getCSRFToken() }, type: 'get', dataType: 'text', async: false, @@ -63,7 +63,7 @@ class LocalStorageManager extends PersistenceManager { return $.parseXML(xml); } - unlockMap(mindmap: Mindmap) { + unlockMap(): void { // Ignore, no implementation required ... } } diff --git a/packages/mindplot/src/components/MainTopic.ts b/packages/mindplot/src/components/MainTopic.ts index c5db2dd8..329f87da 100644 --- a/packages/mindplot/src/components/MainTopic.ts +++ b/packages/mindplot/src/components/MainTopic.ts @@ -28,12 +28,6 @@ import SizeType from './SizeType'; class MainTopic extends Topic { private INNER_RECT_ATTRIBUTES: { stroke: string; }; - /** - * @extends mindplot.Topic - * @constructs - * @param model - * @param options - */ constructor(model: NodeModel, options) { super(model, options); this.INNER_RECT_ATTRIBUTES = { stroke: '0.5 solid #009900' }; @@ -70,6 +64,11 @@ class MainTopic extends Topic { const text = this.getText(); textShape.setText(text); textShape.setOpacity(0.5); + + // Copy text position of the topic element ... + const textPosition = this.getTextShape().getPosition(); + textShape.setPosition(textPosition.x, textPosition.y); + group.append(textShape); } return group; @@ -88,7 +87,6 @@ class MainTopic extends Topic { } } - /** */ disconnect(workspace: Workspace) { super.disconnect(workspace); const model = this.getModel(); diff --git a/packages/mindplot/src/components/Messages.js b/packages/mindplot/src/components/Messages.ts similarity index 83% rename from packages/mindplot/src/components/Messages.js rename to packages/mindplot/src/components/Messages.ts index 1f82b56c..1f009e3e 100644 --- a/packages/mindplot/src/components/Messages.js +++ b/packages/mindplot/src/components/Messages.ts @@ -19,21 +19,23 @@ import { $defined } from '@wisemapping/core-js'; import Bundle from './lang/Bundle'; class Messages { - static init(locale) { + public static __bundle; + + static init(locale: string) { + console.log(`Init designer message: ${locale}`); let userLocale = $defined(locale) ? locale : 'en'; - let bundle = Bundle[locale]; + let bundle = Bundle[userLocale]; if (bundle == null && locale.indexOf('_') !== -1) { // Try to locate without the specialization ... userLocale = locale.substring(0, locale.indexOf('_')); - bundle = Bundle[locale]; + bundle = Bundle[userLocale]; } - global.locale = userLocale; - Messages.__bundle = bundle || {}; + this.__bundle = bundle; } } -const $msg = function $msg(key) { +const $msg = function $msg(key: string) { if (!Messages.__bundle) { Messages.init('en'); } diff --git a/packages/mindplot/src/components/MockPersistenceManager.ts b/packages/mindplot/src/components/MockPersistenceManager.ts new file mode 100644 index 00000000..f139dc20 --- /dev/null +++ b/packages/mindplot/src/components/MockPersistenceManager.ts @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [wisemapping] + * + * Licensed under WiseMapping Public License, Version 1.0 (the "License"). + * It is basically the Apache License, Version 2.0 (the "License") plus the + * "powered by wisemapping" text requirement on every single page; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the license at + * + * http://www.wisemapping.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import $ from 'jquery'; +import { $assert } from '@wisemapping/core-js'; +import PersistenceManager from './PersistenceManager'; + +class MockPersistenceManager extends PersistenceManager { + private exampleMap: string; + + constructor(exampleMapAsXml: string) { + super(); + $assert(exampleMapAsXml, 'The test map must be set'); + this.exampleMap = exampleMapAsXml; + } + + saveMapXml(): void { + // Ignore, no implementation required ... + } + + discardChanges() { + // Ignore, no implementation required ... + } + + loadMapDom() { + return $.parseXML(this.exampleMap); + } + + unlockMap(): void { + // Ignore, no implementation required ... + } +} + +export default MockPersistenceManager; diff --git a/packages/mindplot/src/components/MultilineTextEditor.js b/packages/mindplot/src/components/MultilineTextEditor.ts similarity index 57% rename from packages/mindplot/src/components/MultilineTextEditor.js rename to packages/mindplot/src/components/MultilineTextEditor.ts index ea760350..54ad16c1 100644 --- a/packages/mindplot/src/components/MultilineTextEditor.js +++ b/packages/mindplot/src/components/MultilineTextEditor.ts @@ -21,58 +21,56 @@ import $ from 'jquery'; import initHotKeyPluggin from '../../../../libraries/jquery.hotkeys'; import Events from './Events'; import ActionDispatcher from './ActionDispatcher'; +import Topic from './Topic'; initHotKeyPluggin($); class MultilineTextEditor extends Events { + private _topic: Topic; + + private _containerElem: JQuery; + constructor() { super(); this._topic = null; - this._timeoutId = -1; } - static _buildEditor() { + private static _buildEditor() { const result = $('
') .attr('id', 'textContainer') .css({ display: 'none', zIndex: '8', - overflow: 'hidden', border: '0 none', }); const textareaElem = $('') .css({ border: '1px gray dashed', - background: 'rgba(98, 135, 167, .3)', + background: 'rgba(98, 135, 167, .4)', outline: '0 none', resize: 'none', overflow: 'hidden', + padding: '2px 0px 2px 4px', }); result.append(textareaElem); return result; } - _registerEvents(containerElem) { + private _registerEvents(containerElem: JQuery) { const textareaElem = this._getTextareaElem(); - const me = this; - let start; - let end; - textareaElem.on('keydown', function keydown(event) { - switch ($.hotkeys.specialKeys[event.keyCode]) { + textareaElem.on('keydown', (event) => { + const j: any = $; + switch (j.hotkeys.specialKeys[event.keyCode]) { case 'esc': - me.close(false); + this.close(false); break; - case 'enter': + case 'enter': { if (event.metaKey || event.ctrlKey) { // Add return ... - const text = textareaElem.val(); - let cursorPosition = text.length; - if (textareaElem.selectionStart) { - cursorPosition = textareaElem.selectionStart; - } - + const text = this._getTextAreaText(); + const cursorPosition = text.length; const head = text.substring(0, cursorPosition); let tail = ''; if (cursorPosition < text.length) { @@ -80,31 +78,12 @@ class MultilineTextEditor extends Events { } textareaElem.val(`${head}\n${tail}`); - // Position cursor ... - if (textareaElem[0].setSelectionRange) { - textareaElem.focus(); - textareaElem[0].setSelectionRange(cursorPosition + 1, cursorPosition + 1); - } else if (textareaElem.createTextRange) { - const range = textareaElem.createTextRange(); - range.moveStart('character', cursorPosition + 1); - range.select(); - } + textareaElem.focus(); + textareaElem[0].setSelectionRange(cursorPosition + 1, cursorPosition + 1); } else { - me.close(true); + this.close(true); } break; - case 'tab': { - event.preventDefault(); - start = $(this).get(0).selectionStart; - end = $(this).get(0).selectionEnd; - - // set textarea value to: text before caret + tab + text after caret - $(this).val(`${$(this).val().substring(0, start)}\t${$(this).val().substring(end)}`); - - // put caret at right position again - $(this).get(0).selectionEnd = start + 1; - $(this).get(0).selectionStart = $(this).get(0).selectionEnd; - break; } default: // No actions... @@ -118,9 +97,9 @@ class MultilineTextEditor extends Events { }); textareaElem.on('keyup', (event) => { - const text = me._getTextareaElem().val(); - me.fireEvent('input', [event, text]); - me._adjustEditorSize(); + const text = this._getTextareaElem().val(); + this.fireEvent('input', [event, text]); + this._adjustEditorSize(); }); // If the user clicks on the input, all event must be ignored ... @@ -135,33 +114,33 @@ class MultilineTextEditor extends Events { }); } - _adjustEditorSize() { + private _adjustEditorSize() { if (this.isVisible()) { const textElem = this._getTextareaElem(); - const lines = textElem.val().split('\n'); + const lines = this._getTextAreaText().split('\n'); let maxLineLength = 1; - lines.forEach((line) => { - if (maxLineLength < line.length) maxLineLength = line.length; + lines.forEach((line: string) => { + maxLineLength = Math.max(line.length, maxLineLength); }); textElem.attr('cols', maxLineLength); textElem.attr('rows', lines.length); this._containerElem.css({ - width: `${maxLineLength + 3}em`, + width: `${maxLineLength + 2}em`, height: textElem.height(), }); } } - isVisible() { + isVisible(): boolean { return $defined(this._containerElem) && this._containerElem.css('display') === 'block'; } - _updateModel() { - if (this._topic.getText() !== this._getText()) { - const text = this._getText(); + private _updateModel() { + if (this._topic.getText() !== this._getTextAreaText()) { + const text = this._getTextAreaText(); const topicId = this._topic.getId(); const actionDispatcher = ActionDispatcher.getInstance(); @@ -169,7 +148,7 @@ class MultilineTextEditor extends Events { } } - show(topic, text) { + show(topic: Topic, text: string): void { // Close a previous node editor if it's opened ... if (this._topic) { this.close(false); @@ -187,7 +166,7 @@ class MultilineTextEditor extends Events { } } - _showEditor(defaultText) { + private _showEditor(defaultText: string) { const topic = this._topic; // Hide topic text ... @@ -199,32 +178,29 @@ class MultilineTextEditor extends Events { fontStyle.size = nodeText.getHtmlFontSize(); fontStyle.color = nodeText.getColor(); this._setStyle(fontStyle); - const me = this; // Set editor's initial size - const displayFunc = function displayFunc() { - // Position the editor and set the size... - const textShape = topic.getTextShape(); + // Position the editor and set the size... + const textShape = topic.getTextShape(); - me._containerElem.css('display', 'block'); + this._containerElem.css('display', 'block'); - // FIXME: Im not sure if this is best way... - const shapePosition = textShape.getNativePosition(); - me._containerElem.offset(shapePosition); + let { top, left } = textShape.getNativePosition(); + // Adjust padding top position ... + top -= 4; + left -= 4; + this._containerElem.offset({ top, left }); - // Set editor's initial text ... - const text = $defined(defaultText) ? defaultText : topic.getText(); - me._setText(text); + // Set editor's initial text ... + const text = $defined(defaultText) ? defaultText : topic.getText(); + this._setText(text); - // Set the element focus and select the current text ... - const inputElem = me._getTextareaElem(); - me._positionCursor(inputElem, !$defined(defaultText)); - }; - - this._timeoutId = setTimeout(() => displayFunc(), 10); + // Set the element focus and select the current text ... + const inputElem = this._getTextareaElem(); + this._positionCursor(inputElem, !$defined(defaultText)); } - _setStyle(fontStyle) { + private _setStyle(fontStyle) { const inputField = this._getTextareaElem(); // allowed param reassign to avoid risks of existing code relying in this side-effect /* eslint-disable no-param-reassign */ @@ -252,65 +228,46 @@ class MultilineTextEditor extends Events { this._containerElem.css(style); } - _setText(text) { + private _setText(text: string): void { const textareaElem = this._getTextareaElem(); textareaElem.val(text); this._adjustEditorSize(); } - _getText() { - return this._getTextareaElem().val(); + private _getTextAreaText(): string { + return this._getTextareaElem().val() as string; } - _getTextareaElem() { + private _getTextareaElem(): JQuery { return this._containerElem.find('textarea'); } - _positionCursor(textareaElem, selectText) { + private _positionCursor(textareaElem: JQuery, selectText: boolean) { textareaElem.focus(); - const lengh = textareaElem.val().length; + const lengh = this._getTextAreaText().length; if (selectText) { // Mark text as selected ... - if (textareaElem.createTextRange) { - const rang = textareaElem.createTextRange(); - rang.select(); - rang.move('character', lengh); - } else { - textareaElem[0].setSelectionRange(0, lengh); - } - } else if (textareaElem.createTextRange) { - const range = textareaElem.createTextRange(); - range.move('character', lengh); + textareaElem[0].setSelectionRange(0, lengh); } else { - // allowed param reassign to avoid risks of existing code relying in this side-effect - /* eslint-disable no-param-reassign */ - textareaElem.selectionStart = lengh; - textareaElem.selectionEnd = lengh; - /* eslint-enable no-param-reassign */ - textareaElem.focus(); } } - close(update) { - if (this.isVisible() && this._topic) { - // Update changes ... - clearTimeout(this._timeoutId); - - if (!$defined(update) || update) { + close(update: boolean): void { + if (this.isVisible()) { + if (update) { this._updateModel(); } - // Let make the visible text in the node visible again ... - this._topic.getTextShape().setVisibility(true); - // Remove it form the screen ... this._containerElem.remove(); this._containerElem = null; - this._timeoutId = -1; } - this._topic = null; + + if (this._topic) { + this._topic.getTextShape().setVisibility(true); + this._topic = null; + } } } - export default MultilineTextEditor; diff --git a/packages/mindplot/src/components/NodeGraph.ts b/packages/mindplot/src/components/NodeGraph.ts index 75b29cd5..ed4bf609 100644 --- a/packages/mindplot/src/components/NodeGraph.ts +++ b/packages/mindplot/src/components/NodeGraph.ts @@ -16,14 +16,13 @@ * limitations under the License. */ import { $assert } from '@wisemapping/core-js'; -import { ElementClass } from '@wisemapping/web2d'; +import { ElementClass, Point } from '@wisemapping/web2d'; import TopicConfig from './TopicConfig'; import NodeModel from './model/NodeModel'; import Workspace from './Workspace'; import DragTopic from './DragTopic'; import LayoutManager from './layout/LayoutManager'; import SizeType from './SizeType'; -import PositionType from './PositionType'; abstract class NodeGraph { private _mouseEvents: boolean; @@ -105,7 +104,7 @@ abstract class NodeGraph { return this._size; } - setSize(size: SizeType, force?: boolean) { + setSize(size: SizeType) { this._size.width = size.width; this._size.height = size.height; } @@ -160,15 +159,15 @@ abstract class NodeGraph { workspace.removeChild(this); } - /** */ createDragNode(layoutManager: LayoutManager) { const dragShape = this._buildDragShape(); + return new DragTopic(dragShape, this, layoutManager); } abstract _buildDragShape(); - getPosition(): PositionType { + getPosition(): Point { const model = this.getModel(); return model.getPosition(); } diff --git a/packages/mindplot/src/components/NoteIcon.js b/packages/mindplot/src/components/NoteIcon.ts similarity index 83% rename from packages/mindplot/src/components/NoteIcon.js rename to packages/mindplot/src/components/NoteIcon.ts index 7511a674..144b6edc 100644 --- a/packages/mindplot/src/components/NoteIcon.js +++ b/packages/mindplot/src/components/NoteIcon.ts @@ -21,9 +21,17 @@ import { $msg } from './Messages'; import Icon from './Icon'; import FloatingTip from './widget/FloatingTip'; import NotesImage from '../../assets/icons/notes.svg'; +import Topic from './Topic'; +import NoteModel from './model/NoteModel'; +import FeatureModel from './model/FeatureModel'; class NoteIcon extends Icon { - constructor(topic, noteModel, readOnly) { + private _linksModel: NoteModel; + private _topic: Topic; + private _readOnly: boolean; + private _tip: FloatingTip; + + constructor(topic: Topic, noteModel: NoteModel, readOnly: boolean) { $assert(topic, 'topic can not be null'); super(NoteIcon.IMAGE_URL); @@ -34,7 +42,7 @@ class NoteIcon extends Icon { this._registerEvents(); } - _registerEvents() { + private _registerEvents(): void { this._image.setCursor('pointer'); const me = this; @@ -58,7 +66,7 @@ class NoteIcon extends Icon { }); } - _buildTooltipContent() { + private _buildTooltipContent(): JQuery { if ($('body').find('#textPopoverNote').length === 1) { const text = $('body').find('#textPopoverNote'); text.text(this._linksModel.getText()); @@ -75,11 +83,12 @@ class NoteIcon extends Icon { return result; } - getModel() { + getModel(): FeatureModel { return this._linksModel; } + + static IMAGE_URL = NotesImage; + } -NoteIcon.IMAGE_URL = NotesImage; - export default NoteIcon; diff --git a/packages/mindplot/src/components/PersistenceManager.ts b/packages/mindplot/src/components/PersistenceManager.ts index 6424cf15..3fe9ed83 100644 --- a/packages/mindplot/src/components/PersistenceManager.ts +++ b/packages/mindplot/src/components/PersistenceManager.ts @@ -20,11 +20,21 @@ import { $assert } from '@wisemapping/core-js'; import { Mindmap } from '..'; import XMLSerializerFactory from './persistence/XMLSerializerFactory'; +export type PersistenceError = { + severity: string; + message: string; + errorType?: 'session-expired' | 'bad-request' | 'generic'; +}; + +export type PersistenceErrorCallback = (error: PersistenceError) => void; + abstract class PersistenceManager { // eslint-disable-next-line no-use-before-define static _instance: PersistenceManager; - save(mindmap: Mindmap, editorProperties, saveHistory: boolean, events, sync: boolean) { + private _errorHandlers: PersistenceErrorCallback[] = []; + + save(mindmap: Mindmap, editorProperties, saveHistory: boolean, events?) { $assert(mindmap, 'mindmap can not be null'); $assert(editorProperties, 'editorProperties can not be null'); @@ -33,30 +43,55 @@ abstract class PersistenceManager { const serializer = XMLSerializerFactory.createInstanceFromMindmap(mindmap); const domMap = serializer.toXML(mindmap); - const mapXml = new XMLSerializer().serializeToString(domMap); - const pref = JSON.stringify(editorProperties); try { - this.saveMapXml(mapId, mapXml, pref, saveHistory, events, sync); + this.saveMapXml(mapId, domMap, pref, saveHistory, events); } catch (e) { console.error(e); events.onError(e); } } + protected getCSRFToken(): string | null { + const meta = document.head.querySelector('meta[name="_csrf"]'); + let result = null; + if (meta) { + result = meta.getAttribute('content'); + } + return result; + } + load(mapId: string) { $assert(mapId, 'mapId can not be null'); const domDocument = this.loadMapDom(mapId); return PersistenceManager.loadFromDom(mapId, domDocument); } + triggerError(error: PersistenceError) { + this._errorHandlers.forEach((handler) => handler(error)); + } + + addErrorHandler(callback: PersistenceErrorCallback) { + this._errorHandlers.push(callback); + } + + removeErrorHandler(callback?: PersistenceErrorCallback) { + if (!callback) { + this._errorHandlers.length = 0; + } + const index = this._errorHandlers.findIndex((handler) => handler === callback); + if (index !== -1) { + this._errorHandlers.splice(index, 1); + } + } + abstract discardChanges(mapId: string): void; abstract loadMapDom(mapId: string): Document; - abstract saveMapXml(mapId: string, mapXml, pref, saveHistory, events, sync); + abstract saveMapXml(mapId: string, mapXml: Document, pref?, saveHistory?: boolean, events?); - abstract unlockMap(mindmap: Mindmap): void; + abstract unlockMap(mapId: string): void; static init = (instance: PersistenceManager) => { this._instance = instance; diff --git a/packages/mindplot/src/components/Relationship.ts b/packages/mindplot/src/components/Relationship.ts index 3e056911..782477e1 100644 --- a/packages/mindplot/src/components/Relationship.ts +++ b/packages/mindplot/src/components/Relationship.ts @@ -20,7 +20,7 @@ import { Arrow, Point, ElementClass } from '@wisemapping/web2d'; import ConnectionLine from './ConnectionLine'; import ControlPoint from './ControlPoint'; import RelationshipModel from './model/RelationshipModel'; -import NodeGraph from './NodeGraph'; +import Topic from './Topic'; import Shape from './util/Shape'; class Relationship extends ConnectionLine { @@ -38,11 +38,11 @@ class Relationship extends ConnectionLine { private _endArrow: Arrow; - private _controlPointControllerListener: any; + private _controlPointControllerListener; private _showStartArrow: Arrow; - constructor(sourceNode: NodeGraph, targetNode: NodeGraph, model: RelationshipModel) { + constructor(sourceNode: Topic, targetNode: Topic, model: RelationshipModel) { $assert(sourceNode, 'sourceNode can not be null'); $assert(targetNode, 'targetNode can not be null'); @@ -349,7 +349,7 @@ class Relationship extends ConnectionLine { return this._model.getId(); } - fireEvent(type: string, event: any): void { + fireEvent(type: string, event): void { const elem = this._line2d; elem.trigger(type, event); } diff --git a/packages/mindplot/src/components/RelationshipPivot.ts b/packages/mindplot/src/components/RelationshipPivot.ts index ade7a4d4..6d862068 100644 --- a/packages/mindplot/src/components/RelationshipPivot.ts +++ b/packages/mindplot/src/components/RelationshipPivot.ts @@ -36,7 +36,7 @@ class RelationshipPivot { private _sourceTopic: Topic; - private _pivot: any; + private _pivot: CurvedLine; private _startArrow: Arrow; diff --git a/packages/mindplot/src/components/RestPersistenceManager.ts b/packages/mindplot/src/components/RestPersistenceManager.ts index 463f0a51..bcf0e0e6 100644 --- a/packages/mindplot/src/components/RestPersistenceManager.ts +++ b/packages/mindplot/src/components/RestPersistenceManager.ts @@ -17,9 +17,8 @@ */ import { $assert } from '@wisemapping/core-js'; import $ from 'jquery'; -import { Mindmap } from '..'; import { $msg } from './Messages'; -import PersistenceManager from './PersistenceManager'; +import PersistenceManager, { PersistenceError } from './PersistenceManager'; class RESTPersistenceManager extends PersistenceManager { private documentUrl: string; @@ -51,10 +50,10 @@ class RESTPersistenceManager extends PersistenceManager { this.session = options.session; } - saveMapXml(mapId: string, mapXml: Document, pref: string, saveHistory: boolean, events, sync: boolean): void { + saveMapXml(mapId: string, mapXml: Document, pref: string, saveHistory: boolean, events): void { const data = { id: mapId, - xml: mapXml, + xml: new XMLSerializer().serializeToString(mapXml), properties: pref, }; @@ -71,73 +70,79 @@ class RESTPersistenceManager extends PersistenceManager { }, 10000); const persistence = this; - $.ajax({ - type: 'put', - url: `${this.documentUrl.replace('{id}', mapId)}?${query}`, - dataType: 'json', - data: JSON.stringify(data), - contentType: 'application/json; charset=utf-8', - async: !sync, - - success(successData) { - persistence.timestamp = successData; + fetch( + `${this.documentUrl.replace('{id}', mapId)}?${query}`, + { + method: 'PUT', + // Blob helps to resuce the memory on large payload. + body: new Blob([JSON.stringify(data)], { type: 'text/plain' }), + headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json', 'X-CSRF-Token': this.getCSRFToken() }, + }, + ).then(async (response: Response) => { + if (response.ok) { + persistence.timestamp = await response.text(); events.onSuccess(); - }, - complete() { - // Clear event timeout ... - if (persistence.clearTimeout) { - clearTimeout(persistence.clearTimeout); - } - persistence.onSave = false; - }, - error(xhr) { - const { responseText } = xhr; - let userMsg = { severity: 'SEVERE', message: $msg('SAVE_COULD_NOT_BE_COMPLETED') }; - - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType != null && contentType.indexOf('application/json') !== -1) { - let serverMsg = null; - try { - serverMsg = $.parseJSON(responseText); - serverMsg = serverMsg.globalSeverity ? serverMsg : null; - } catch (e) { - // Message could not be decoded ... + } else { + console.log(`Saving error: ${response.status}`); + let userMsg; + if (response.status === 405) { + userMsg = { severity: 'SEVERE', message: $msg('SESSION_EXPIRED'), errorType: 'session-expired' }; + } else { + const responseText = await response.text(); + const contentType = response.headers['Content-Type']; + if (contentType != null && contentType.indexOf('application/json') !== -1) { + let serverMsg = null; + try { + serverMsg = JSON.parse(responseText); + serverMsg = serverMsg.globalSeverity ? serverMsg : null; + } catch (e) { + // Message could not be decoded ... + } + userMsg = persistence._buildError(serverMsg); } - userMsg = persistence._buildError(serverMsg); - } else if (this.status === 405) { - userMsg = { severity: 'SEVERE', message: $msg('SESSION_EXPIRED') }; } + this.triggerError(userMsg); events.onError(userMsg); - persistence.onSave = false; - }, + } + + // Clear event timeout ... + if (persistence.clearTimeout) { + clearTimeout(persistence.clearTimeout); + } + persistence.onSave = false; + }).catch(() => { + const userMsg: PersistenceError = { + severity: 'SEVERE', message: $msg('SAVE_COULD_NOT_BE_COMPLETED'), errorType: 'generic', + }; + this.triggerError(userMsg); + events.onError(userMsg); + + // Clear event timeout ... + if (persistence.clearTimeout) { + clearTimeout(persistence.clearTimeout); + } + persistence.onSave = false; }); } } discardChanges(mapId: string) { - $.ajax({ - url: this.revertUrl.replace('{id}', mapId), - async: false, - method: 'post', - headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json' }, - error(xhr, ajaxOptions, thrownError) { - console.error(`Request error => status:${xhr.status} ,thrownError: ${thrownError}`); - }, - }); + fetch(this.revertUrl.replace('{id}', mapId), + { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json', 'X-CSRF-Token': this.getCSRFToken() }, + }); } - unlockMap(mindmap: Mindmap) { - const mapId = mindmap.getId(); - $.ajax({ - url: this.lockUrl.replace('{id}', mapId), - async: false, - method: 'put', - headers: { 'Content-Type': 'text/plain' }, - data: 'false', - error(xhr, ajaxOptions, thrownError) { - console.error(`Request error => status:${xhr.status} ,thrownError: ${thrownError}`); + unlockMap(mapId: string): void { + fetch( + this.lockUrl.replace('{id}', mapId), + { + method: 'PUT', + headers: { 'Content-Type': 'text/plain', 'X-CSRF-Token': this.getCSRFToken() }, + body: 'false', }, - }); + ); } private _buildError(jsonSeverResponse) { @@ -155,13 +160,12 @@ class RESTPersistenceManager extends PersistenceManager { } loadMapDom(mapId: string): Document { - // Let's try to open one from the local directory ... let xml: Document; $.ajax({ url: `${this.documentUrl.replace('{id}', mapId)}/xml`, method: 'get', async: false, - headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' }, + headers: { 'Content-Type': 'text/plain', Accept: 'application/xml', 'X-CSRF-Token': this.getCSRFToken() }, success(responseText) { xml = responseText; }, diff --git a/packages/mindplot/src/components/ScreenManager.ts b/packages/mindplot/src/components/ScreenManager.ts index 286ec05c..88e80d0c 100644 --- a/packages/mindplot/src/components/ScreenManager.ts +++ b/packages/mindplot/src/components/ScreenManager.ts @@ -17,8 +17,6 @@ */ import { $assert } from '@wisemapping/core-js'; import { Point } from '@wisemapping/web2d'; -import Icon from './Icon'; -import Topic from './Topic'; class ScreenManager { private _divContainer: JQuery; @@ -84,59 +82,6 @@ class ScreenManager { } } - private _getElementPosition(elem: Topic) { - // Retrieve current element position. - const elementPosition = elem.getPosition(); - let { x } = elementPosition; - let { y } = elementPosition; - - // Add workspace offset. - x -= this._padding.x; - y -= this._padding.y; - - // Scale coordinate in order to be relative to the workspace. That's coord/size; - x /= this._scale; - y /= this._scale; - - // Remove decimal part.. - return { x, y }; - } - - getWorkspaceIconPosition(e: Icon) { - // Retrieve current icon position. - const image = e.getImage(); - const elementPosition = image.getPosition(); - const imageSize = e.getSize(); - - // Add group offset - const iconGroup = e.getGroup(); - const group = iconGroup.getNativeElement(); - const coordOrigin = group.getCoordOrigin(); - const groupSize = group.getSize(); - const coordSize = group.getCoordSize(); - - const scale = { - x: coordSize.width / parseInt(groupSize.width, 10), - y: coordSize.height / parseInt(groupSize.height, 10), - }; - - let x = (elementPosition.x - coordOrigin.x - parseInt(imageSize.width, 10) / 2) / scale.x; - let y = (elementPosition.y - coordOrigin.y - parseInt(imageSize.height, 10) / 2) / scale.y; - - // Retrieve iconGroup Position - const groupPosition = iconGroup.getPosition(); - x += groupPosition.x; - y += groupPosition.y; - - // Retrieve topic Position - const topic = iconGroup.getTopic(); - const topicPosition = this._getElementPosition(topic); - topicPosition.x -= parseInt(topic.getSize().width, 10) / 2; - - // Remove decimal part.. - return { x: x + topicPosition.x, y: y + topicPosition.y }; - } - getWorkspaceMousePosition(event: MouseEvent) { // Retrieve current mouse position. let x = event.clientX; diff --git a/packages/mindplot/src/components/StandaloneActionDispatcher.ts b/packages/mindplot/src/components/StandaloneActionDispatcher.ts index c74b4623..6d8c8f2e 100644 --- a/packages/mindplot/src/components/StandaloneActionDispatcher.ts +++ b/packages/mindplot/src/components/StandaloneActionDispatcher.ts @@ -79,11 +79,11 @@ class StandaloneActionDispatcher extends ActionDispatcher { $assert($defined(topicId), 'topicsId can not be null'); $assert($defined(position), 'position can not be null'); - const commandFunc = (topic, value) => { + const commandFunc = (topic: Topic, pos: Point) => { const result = topic.getPosition(); EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, { node: topic.getModel(), - position: value, + position: pos, }); return result; }; @@ -114,7 +114,7 @@ class StandaloneActionDispatcher extends ActionDispatcher { changeTextToTopic(topicsIds: number[], text: string) { $assert($defined(topicsIds), 'topicsIds can not be null'); - const commandFunc = (topic: Topic, value: object) => { + const commandFunc = (topic: Topic, value: string) => { const result = topic.getText(); topic.setText(value); return result; @@ -163,7 +163,7 @@ class StandaloneActionDispatcher extends ActionDispatcher { $assert(topicsIds, 'topicIds can not be null'); $assert(color, 'color can not be null'); - const commandFunc = (topic, commandColor) => { + const commandFunc = (topic: Topic, commandColor: string) => { const result = topic.getBackgroundColor(); topic.setBackgroundColor(commandColor); return result; @@ -179,7 +179,7 @@ class StandaloneActionDispatcher extends ActionDispatcher { $assert(topicsIds, 'topicIds can not be null'); $assert(color, 'topicIds can not be null'); - const commandFunc = (topic, commandColor) => { + const commandFunc = (topic: Topic, commandColor: string) => { const result = topic.getBorderColor(); topic.setBorderColor(commandColor); return result; @@ -195,11 +195,11 @@ class StandaloneActionDispatcher extends ActionDispatcher { $assert(topicsIds, 'topicIds can not be null'); $assert(size, 'size can not be null'); - const commandFunc = (topic, commandSize) => { + const commandFunc = (topic: Topic, commandSize: number) => { const result = topic.getFontSize(); topic.setFontSize(commandSize, true); - topic._adjustShapes(); + topic.adjustShapes(); return result; }; @@ -212,9 +212,9 @@ class StandaloneActionDispatcher extends ActionDispatcher { $assert(topicsIds, 'topicsIds can not be null'); $assert(shapeType, 'shapeType can not be null'); - const commandFunc = (topic, commandShapeType) => { + const commandFunc = (topic: Topic, commandShapeType: string) => { const result = topic.getShapeType(); - topic.setShapeType(commandShapeType, true); + topic.setShapeType(commandShapeType); return result; }; @@ -226,12 +226,12 @@ class StandaloneActionDispatcher extends ActionDispatcher { changeFontWeightToTopic(topicsIds: number[]) { $assert(topicsIds, 'topicsIds can not be null'); - const commandFunc = (topic) => { + const commandFunc = (topic: Topic) => { const result = topic.getFontWeight(); const weight = result === 'bold' ? 'normal' : 'bold'; topic.setFontWeight(weight, true); - topic._adjustShapes(); + topic.adjustShapes(); return result; }; diff --git a/packages/mindplot/src/components/Topic.ts b/packages/mindplot/src/components/Topic.ts index 3e5f6989..e9cb8c5d 100644 --- a/packages/mindplot/src/components/Topic.ts +++ b/packages/mindplot/src/components/Topic.ts @@ -44,6 +44,8 @@ import LayoutManager from './layout/LayoutManager'; import NoteModel from './model/NoteModel'; import LinkModel from './model/LinkModel'; import SizeType from './SizeType'; +import FeatureModel from './model/FeatureModel'; +import Icon from './Icon'; const ICON_SCALING_FACTOR = 1.3; @@ -104,15 +106,10 @@ abstract class Topic extends NodeGraph { }); } - /** - * @param {String} type the topic shape type - * @see {@link mindplot.model.INodeModel} - */ - setShapeType(type) { + setShapeType(type: string): void { this._setShapeType(type, true); } - /** @return {mindplot.Topic} parent topic */ getParent(): Topic | null { return this._parent; } @@ -161,8 +158,7 @@ abstract class Topic extends NodeGraph { } } - /** @return {String} topic shape type */ - getShapeType() { + getShapeType(): string { const model = this.getModel(); let result = model.getShapeType(); if (!$defined(result)) { @@ -171,7 +167,7 @@ abstract class Topic extends NodeGraph { return result; } - private _removeInnerShape() { + private _removeInnerShape(): ElementClass { const group = this.get2DElement(); const innerShape = this.getInnerShape(); group.removeChild(innerShape); @@ -308,7 +304,7 @@ abstract class Topic extends NodeGraph { return this._text; } - getOrBuildIconGroup() { + getOrBuildIconGroup(): Group { if (!$defined(this._iconsGroup)) { this._iconsGroup = this._buildIconGroup(); const group = this.get2DElement(); @@ -346,7 +342,7 @@ abstract class Topic extends NodeGraph { * @param {mindplot.model.FeatureModel} featureModel * @return {mindplot.Icon} the icon corresponding to the feature model */ - addFeature(featureModel) { + addFeature(featureModel: FeatureModel): Icon { const iconGroup = this.getOrBuildIconGroup(); this.closeEditors(); @@ -365,13 +361,13 @@ abstract class Topic extends NodeGraph { } /** */ - findFeatureById(id) { + findFeatureById(id: number) { const model = this.getModel(); return model.findFeatureById(id); } /** */ - removeFeature(featureModel) { + removeFeature(featureModel: FeatureModel): void { $assert(featureModel, 'featureModel could not be null'); // Removing the icon from MODEL @@ -387,21 +383,21 @@ abstract class Topic extends NodeGraph { } /** */ - addRelationship(relationship) { + addRelationship(relationship: Relationship) { this._relationships.push(relationship); } /** */ - deleteRelationship(relationship) { + deleteRelationship(relationship: Rect) { this._relationships = this._relationships.filter((r) => r !== relationship); } /** */ - getRelationships() { + getRelationships(): Relationship[] { return this._relationships; } - _buildTextShape(readOnly): Text { + protected _buildTextShape(readOnly: boolean): Text { const result = new Text(); const family = this.getFontFamily(); const size = this.getFontSize(); @@ -425,7 +421,7 @@ abstract class Topic extends NodeGraph { } /** */ - setFontFamily(value, updateModel) { + setFontFamily(value: string, updateModel?: boolean) { const textShape = this.getTextShape(); textShape.setFontName(value); if ($defined(updateModel) && updateModel) { @@ -436,7 +432,7 @@ abstract class Topic extends NodeGraph { } /** */ - setFontSize(value, updateModel) { + setFontSize(value: number, updateModel?: boolean) { const textShape = this.getTextShape(); textShape.setSize(value); @@ -534,7 +530,7 @@ abstract class Topic extends NodeGraph { } } - _setText(text, updateModel) { + _setText(text: string, updateModel: boolean) { const textShape = this.getTextShape(); textShape.setText(text == null ? TopicStyle.defaultText(this) : text); @@ -545,7 +541,7 @@ abstract class Topic extends NodeGraph { } /** */ - setText(text) { + setText(text: string) { // Avoid empty nodes ... if (!text || $.trim(text).length === 0) { this._setText(null, true); @@ -557,7 +553,7 @@ abstract class Topic extends NodeGraph { } /** */ - getText() { + getText(): string { const model = this.getModel(); let result = model.getText(); if (!$defined(result)) { @@ -567,11 +563,11 @@ abstract class Topic extends NodeGraph { } /** */ - setBackgroundColor(color) { + setBackgroundColor(color: string) { this._setBackgroundColor(color, true); } - _setBackgroundColor(color, updateModel) { + _setBackgroundColor(color: string, updateModel: boolean) { const innerShape = this.getInnerShape(); innerShape.setFill(color); @@ -587,7 +583,7 @@ abstract class Topic extends NodeGraph { } /** */ - getBackgroundColor() { + getBackgroundColor(): string { const model = this.getModel(); let result = model.getBackgroundColor(); if (!$defined(result)) { @@ -597,11 +593,11 @@ abstract class Topic extends NodeGraph { } /** */ - setBorderColor(color) { + setBorderColor(color: string) { this._setBorderColor(color, true); } - _setBorderColor(color, updateModel) { + _setBorderColor(color: string, updateModel: boolean) { const innerShape = this.getInnerShape(); innerShape.setAttribute('strokeColor', color); @@ -1016,6 +1012,10 @@ abstract class Topic extends NodeGraph { } } + // Hide inner shape ... + this.getInnerShape().setVisibility(value); + + // Hide text shape ... const textShape = this.getTextShape(); textShape.setVisibility(this.getShapeType() !== TopicShape.IMAGE ? value : false); } @@ -1058,7 +1058,7 @@ abstract class Topic extends NodeGraph { } } - setSize(size: SizeType, force: boolean): void { + setSize(size: SizeType, force?: boolean): void { $assert(size, 'size can not be null'); $assert($defined(size.width), 'size seem not to be a valid element'); const roundedSize = { @@ -1272,7 +1272,7 @@ abstract class Topic extends NodeGraph { } // If a drag node is create for it, let's hide the editor. - this._getTopicEventDispatcher().close(); + this._getTopicEventDispatcher().close(false); return result; } @@ -1296,7 +1296,7 @@ abstract class Topic extends NodeGraph { const topicHeight = Math.max(iconHeight, textHeight) + padding * 2; const textIconSpacing = Math.round(fontHeight / 4); const iconGroupWith = iconGroup.getSize().width; - const topicWith = iconGroupWith + textIconSpacing + textWidth + padding * 2; + const topicWith = iconGroupWith + 2 * textIconSpacing + textWidth + padding * 2; this.setSize({ width: topicWith, @@ -1334,6 +1334,10 @@ abstract class Topic extends NodeGraph { return result; } + abstract workoutOutgoingConnectionPoint(position: Point): Point; + + abstract workoutIncomingConnectionPoint(position: Point): Point; + isChildTopic(childTopic: Topic): boolean { let result = this.getId() === childTopic.getId(); if (!result) { @@ -1349,7 +1353,7 @@ abstract class Topic extends NodeGraph { return result; } - isCentralTopic() { + isCentralTopic(): boolean { return this.getModel().getType() === 'CentralTopic'; } } diff --git a/packages/mindplot/src/components/TopicEventDispatcher.js b/packages/mindplot/src/components/TopicEventDispatcher.ts similarity index 75% rename from packages/mindplot/src/components/TopicEventDispatcher.js rename to packages/mindplot/src/components/TopicEventDispatcher.ts index 427ae252..7ed00151 100644 --- a/packages/mindplot/src/components/TopicEventDispatcher.js +++ b/packages/mindplot/src/components/TopicEventDispatcher.ts @@ -19,6 +19,7 @@ import { $assert } from '@wisemapping/core-js'; import Events from './Events'; import MultilineTextEditor from './MultilineTextEditor'; import { TopicShape } from './model/INodeModel'; +import Topic from './Topic'; const TopicEvent = { EDIT: 'editnode', @@ -26,30 +27,39 @@ const TopicEvent = { }; class TopicEventDispatcher extends Events { - constructor(readOnly) { + private _readOnly: boolean; + + private _activeEditor: MultilineTextEditor; + + private _multilineEditor: MultilineTextEditor; + + // eslint-disable-next-line no-use-before-define + static _instance: TopicEventDispatcher; + + constructor(readOnly: boolean) { super(); this._readOnly = readOnly; this._activeEditor = null; this._multilineEditor = new MultilineTextEditor(); } - close(update) { + close(update: boolean): void { if (this.isVisible()) { this._activeEditor.close(update); this._activeEditor = null; } } - show(topic, options) { + show(topic: Topic, options?): void { this.process(TopicEvent.EDIT, topic, options); } - process(eventType, topic, options) { + process(eventType: string, topic: Topic, options?): void { $assert(eventType, 'eventType can not be null'); // Close all previous open editor .... if (this.isVisible()) { - this.close(); + this.close(false); } // Open the new editor ... @@ -66,20 +76,18 @@ class TopicEventDispatcher extends Events { } } - isVisible() { + isVisible(): boolean { return this._activeEditor != null && this._activeEditor.isVisible(); } + + static configure(readOnly: boolean): void { + this._instance = new TopicEventDispatcher(readOnly); + } + + static getInstance(): TopicEventDispatcher { + return this._instance; + } } -TopicEventDispatcher._instance = null; - -TopicEventDispatcher.configure = function configure(readOnly) { - this._instance = new TopicEventDispatcher(readOnly); -}; - -TopicEventDispatcher.getInstance = function getInstance() { - return this._instance; -}; - export { TopicEvent }; export default TopicEventDispatcher; diff --git a/packages/mindplot/src/components/commands/DeleteCommand.ts b/packages/mindplot/src/components/commands/DeleteCommand.ts index 26b995ec..c8019603 100644 --- a/packages/mindplot/src/components/commands/DeleteCommand.ts +++ b/packages/mindplot/src/components/commands/DeleteCommand.ts @@ -18,17 +18,21 @@ import { $assert, $defined } from '@wisemapping/core-js'; import Command from '../Command'; import CommandContext from '../CommandContext'; +import NodeModel from '../model/NodeModel'; +import RelationshipModel from '../model/RelationshipModel'; +import Relationship from '../Relationship'; +import Topic from '../Topic'; class DeleteCommand extends Command { private _relIds: number[]; private _topicIds: number[]; - private _deletedTopicModels: any[]; + private _deletedTopicModels: NodeModel[]; - private _deletedRelModel: any[]; + private _deletedRelModel: RelationshipModel[]; - private _parentTopicIds: any[]; + private _parentTopicIds: number[]; constructor(topicIds: number[], relIds: number[]) { $assert($defined(relIds), 'topicIds can not be null'); @@ -101,11 +105,11 @@ class DeleteCommand extends Command { // Do they need to be connected ? this._deletedTopicModels.forEach(((topicModel, index) => { - const topics = commandContext.findTopics(topicModel.getId()); + const topics = commandContext.findTopics([topicModel.getId()]); const parentId = this._parentTopicIds[index]; if (parentId) { - const parentTopics = commandContext.findTopics(parentId); + const parentTopics = commandContext.findTopics([parentId]); commandContext.connect(topics[0], parentTopics[0]); } })); @@ -117,14 +121,14 @@ class DeleteCommand extends Command { // Finally display the topics ... this._deletedTopicModels.forEach((topicModel) => { - const topics = commandContext.findTopics(topicModel.getId()); + const topics = commandContext.findTopics([topicModel.getId()]); topics[0].setBranchVisibility(true); }); // Focus on last recovered topic .. if (this._deletedTopicModels.length > 0) { const firstTopic = this._deletedTopicModels[0]; - const topic = commandContext.findTopics(firstTopic.getId())[0]; + const topic = commandContext.findTopics([firstTopic.getId()])[0]; topic.setOnFocus(true); } @@ -133,11 +137,11 @@ class DeleteCommand extends Command { this._deletedRelModel = []; } - _filterChildren(topicIds, commandContext) { + private _filterChildren(topicIds: number[], commandContext: CommandContext) { const topics = commandContext.findTopics(topicIds); const result = []; - topics.forEach((topic) => { + topics.forEach((topic: Topic) => { let parent = topic.getParent(); let found = false; while (parent != null && !found) { @@ -156,13 +160,16 @@ class DeleteCommand extends Command { return result; } - _collectInDepthRelationships(topic) { + private _collectInDepthRelationships(topic: Topic): Relationship[] { let result = []; result = result.concat(topic.getRelationships()); const children = topic.getChildren(); - const rels = children.map(((t) => this._collectInDepthRelationships(t))); - result = result.concat(rels.flat()); + const rels: (Relationship[])[] = children + .map(((t: Topic) => this._collectInDepthRelationships(t))); + + // flatten and concact + result = result.concat(([].concat(...rels))); if (result.length > 0) { // Filter for unique ... diff --git a/packages/mindplot/src/components/commands/DragTopicCommand.ts b/packages/mindplot/src/components/commands/DragTopicCommand.ts index 8e3766ef..d550a378 100644 --- a/packages/mindplot/src/components/commands/DragTopicCommand.ts +++ b/packages/mindplot/src/components/commands/DragTopicCommand.ts @@ -62,7 +62,7 @@ class DragTopicCommand extends Command { const origPosition = topic.getPosition(); // Disconnect topic .. - if ($defined(origParentTopic) && origParentTopic.getId() !== this._parentId) { + if ($defined(origParentTopic)) { commandContext.disconnect(topic); } @@ -76,17 +76,15 @@ class DragTopicCommand extends Command { } // Finally, connect topic ... - if (!$defined(origParentTopic) || origParentTopic.getId() !== this._parentId) { - if ($defined(this._parentId)) { - const parentTopic = commandContext.findTopics([this._parentId])[0]; - commandContext.connect(topic, parentTopic); - } + if ($defined(this._parentId)) { + const parentTopic = commandContext.findTopics([this._parentId])[0]; + commandContext.connect(topic, parentTopic); + } - // Backup old parent id ... - this._parentId = null; - if ($defined(origParentTopic)) { - this._parentId = origParentTopic.getId(); - } + // Backup old parent id ... + this._parentId = null; + if ($defined(origParentTopic)) { + this._parentId = origParentTopic.getId(); } topic.setVisibility(true); diff --git a/packages/mindplot/src/components/commands/GenericFunctionCommand.ts b/packages/mindplot/src/components/commands/GenericFunctionCommand.ts index 9054a2ce..b7887967 100644 --- a/packages/mindplot/src/components/commands/GenericFunctionCommand.ts +++ b/packages/mindplot/src/components/commands/GenericFunctionCommand.ts @@ -20,18 +20,20 @@ import Command from '../Command'; import CommandContext from '../CommandContext'; import Topic from '../Topic'; +type CommandTypes = string | object | boolean | number; + class GenericFunctionCommand extends Command { - private _value: string | object | boolean | number; + private _value: CommandTypes; private _topicsId: number[]; - private _commandFunc: (topic: Topic, value: string | object | boolean | number) => string | object | boolean; + private _commandFunc: (topic: Topic, value: CommandTypes) => CommandTypes; - private _oldValues: any[]; + private _oldValues: (CommandTypes)[]; private _applied: boolean; - constructor(commandFunc: (topic: Topic, value: string | object | boolean) => string | object | boolean, topicsIds: number[], value: string | object | boolean | number = undefined) { + constructor(commandFunc: (topic: Topic, value: CommandTypes) => CommandTypes, topicsIds: number[], value: CommandTypes = undefined) { $assert(commandFunc, 'commandFunc must be defined'); $assert($defined(topicsIds), 'topicsIds must be defined'); diff --git a/packages/mindplot/src/components/export/BinaryImageExporter.ts b/packages/mindplot/src/components/export/BinaryImageExporter.ts index 34a69cb8..c7805ad3 100644 --- a/packages/mindplot/src/components/export/BinaryImageExporter.ts +++ b/packages/mindplot/src/components/export/BinaryImageExporter.ts @@ -15,26 +15,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Mindmap } from '../..'; import Exporter from './Exporter'; import SVGExporter from './SVGExporter'; /** * Based on https://mybyways.com/blog/convert-svg-to-png-using-your-browser */ class BinaryImageExporter extends Exporter { - svgElement: Element; + private svgElement: Element; - mindmap: Mindmap; + private width: number; - width: number; + private height: number; - height: number; + private adjustToFit: boolean; - constructor(mindmap: Mindmap, svgElement: Element, width: number, height: number, imgFormat: 'image/png' | 'image/jpeg') { - super(imgFormat.split['/'][0], imgFormat); + constructor(svgElement: Element, width: number, height: number, imgFormat: 'image/png' | 'image/jpeg', adjustToFit = true) { + super(imgFormat.split('/')[0], imgFormat); this.svgElement = svgElement; - this.mindmap = mindmap; - + this.adjustToFit = adjustToFit; this.width = width; this.height = height; } @@ -43,37 +41,52 @@ class BinaryImageExporter extends Exporter { throw new Error('Images can not be exporeted'); } - async exportAndEndcode(): Promise { - const svgExporter = new SVGExporter(this.svgElement); - const svgUrl = await svgExporter.exportAndEncode(); + exportAndEncode(): Promise { + const svgExporter = new SVGExporter(this.svgElement, this.adjustToFit); + const svgUrl = svgExporter.exportAndEncode(); + return svgUrl.then((value: string) => { + // Get the device pixel ratio, falling back to 1. But, I will double the resolution to look nicer. + const dpr = (window.devicePixelRatio || 1) * 2; - // Get the device pixel ratio, falling back to 1. But, I will double the resolution to look nicer. - const dpr = (window.devicePixelRatio || 1) * 2; + // Create canvas size ... + const canvas = document.createElement('canvas'); + let width: number; + let height: number; + if (this.adjustToFit) { + // Size must match with SVG image size ... + const size = svgExporter.getImgSize(); + width = (size.width * dpr); + height = (size.height * dpr); + } else { + // Use screensize as size .. + width = (this.width * dpr); + height = (this.height * dpr); + } - // Create canvas ... - const canvas = document.createElement('canvas'); - canvas.setAttribute('width', (this.width * dpr).toString()); - canvas.setAttribute('height', (this.height * dpr).toString()); + console.log(`Export size: ${width}:${height}`); + canvas.setAttribute('width', width.toFixed(0)); + canvas.setAttribute('height', height.toFixed(0)); - // Render the image and wait for the response ... - const img = new Image(); - const result = new Promise((resolve, reject) => { - img.onload = () => { - const ctx = canvas.getContext('2d'); - // Scale for retina ... - ctx.scale(dpr, dpr); - ctx.drawImage(img, 0, 0); + // Render the image and wait for the response ... + const img = new Image(); + const result = new Promise((resolve) => { + img.onload = () => { + const ctx = canvas.getContext('2d'); + // Scale for retina ... + ctx.scale(dpr, dpr); + ctx.drawImage(img, 0, 0); - const imgDataUri = canvas - .toDataURL(this.getContentType()) - .replace('image/png', 'octet/stream'); + const imgDataUri = canvas + .toDataURL(this.getContentType()) + .replace('image/png', 'octet/stream'); - URL.revokeObjectURL(svgUrl); - resolve(imgDataUri); - }; + URL.revokeObjectURL(value); + resolve(imgDataUri); + }; + }); + img.src = value; + return result; }); - img.src = svgUrl; - return result; } } export default BinaryImageExporter; diff --git a/packages/mindplot/src/components/export/FreemindExporter.ts b/packages/mindplot/src/components/export/FreemindExporter.ts new file mode 100644 index 00000000..d52f1d95 --- /dev/null +++ b/packages/mindplot/src/components/export/FreemindExporter.ts @@ -0,0 +1,304 @@ +import xmlFormatter from 'xml-formatter'; +import { Mindmap } from '../..'; +import INodeModel, { TopicShape } from '../model/INodeModel'; +import RelationshipModel from '../model/RelationshipModel'; +import IconModel from '../model/IconModel'; +import FeatureModel from '../model/FeatureModel'; +import LinkModel from '../model/LinkModel'; +import NoteModel from '../model/NoteModel'; +import PositionNodeType from '../PositionType'; +import Exporter from './Exporter'; +import FreemindConstant from './freemind/FreemindConstant'; +import VersionNumber from './freemind/importer/VersionNumber'; +import ObjectFactory from './freemind/ObjectFactory'; +import FreemindMap from './freemind/Map'; +import FreeminNode from './freemind/Node'; +import Arrowlink from './freemind/Arrowlink'; +import Richcontent from './freemind/Richcontent'; +import Icon from './freemind/Icon'; +import Edge from './freemind/Edge'; +import Font from './freemind/Font'; + +class FreemindExporter extends Exporter { + private mindmap: Mindmap; + + private nodeMap: Map = null; + + private version: VersionNumber = FreemindConstant.SUPPORTED_FREEMIND_VERSION; + + private objectFactory: ObjectFactory; + + private static wisweToFreeFontSize: Map = new Map(); + + constructor(mindmap: Mindmap) { + super(FreemindConstant.SUPPORTED_FREEMIND_VERSION.getVersion(), 'application/xml'); + this.mindmap = mindmap; + } + + static { + this.wisweToFreeFontSize.set(6, 10); + this.wisweToFreeFontSize.set(8, 12); + this.wisweToFreeFontSize.set(10, 18); + this.wisweToFreeFontSize.set(15, 24); + } + + private static parserXMLString(xmlStr: string, mimeType: DOMParserSupportedType): Document { + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(xmlStr, mimeType); + + // FIXME: Fix error "unclosed tag: p" when exporting bug3 and enc + // Is there any parsing error ?. + /* + if (xmlDoc.getElementsByTagName('parsererror').length > 0) { + const xmmStr = new XMLSerializer().serializeToString(xmlDoc); + console.log(xmmStr); + throw new Error(`Unexpected error parsing: ${xmlStr}. Error: ${xmmStr}`); + } + */ + + return xmlDoc; + } + + extension(): string { + return 'mm'; + } + + export(): Promise { + this.objectFactory = new ObjectFactory(); + this.nodeMap = new Map(); + + const freemainMap: FreemindMap = this.objectFactory.createMap(); + freemainMap.setVesion(this.getVersionNumber()); + + const main: FreeminNode = this.objectFactory.createNode(); + freemainMap.setNode(main); + + const centralTopic: INodeModel = this.mindmap.getCentralTopic(); + + if (centralTopic) { + this.nodeMap.set(centralTopic.getId(), main); + this.setTopicPropertiesToNode({ freemindNode: main, mindmapTopic: centralTopic, isRoot: true }); + this.addNodeFromTopic(centralTopic, main); + } + + const relationships: Array = this.mindmap.getRelationships(); + relationships.forEach((relationship: RelationshipModel) => { + const srcNode: FreeminNode = this.nodeMap.get(relationship.getFromNode()); + const destNode: FreeminNode = this.nodeMap.get(relationship.getToNode()); + + if (srcNode && destNode) { + const arrowlink: Arrowlink = this.objectFactory.crateArrowlink(); + + arrowlink.setDestination(destNode.getId()); + + if (relationship.getEndArrow() && relationship.getEndArrow()) arrowlink.setEndarrow('Default'); + + if (relationship.getStartArrow() && relationship.getStartArrow()) arrowlink.setStartarrow('Default'); + + srcNode.setArrowlinkOrCloudOrEdge(arrowlink); + } + }); + + const freeToXml = freemainMap.toXml(); + const xmlToString = new XMLSerializer().serializeToString(freeToXml); + const formatXml = xmlFormatter(xmlToString, { + indentation: ' ', + collapseContent: true, + lineSeparator: '\n', + }); + + return Promise.resolve(formatXml); + } + + private setTopicPropertiesToNode({ freemindNode, mindmapTopic, isRoot }: { freemindNode: FreeminNode; mindmapTopic: INodeModel; isRoot: boolean; }): void { + freemindNode.setId(`ID_${mindmapTopic.getId()}`); + + const text = mindmapTopic.getText(); + + if (text) { + if (!text.includes('\n')) { + freemindNode.setText(text); + } else { + const richcontent: Richcontent = this.buildRichcontent(text, 'NODE'); + freemindNode.setArrowlinkOrCloudOrEdge(richcontent); + } + } + + const wiseShape: string = mindmapTopic.getShapeType(); + if (wiseShape && TopicShape.LINE !== wiseShape) { + freemindNode.setBackgorundColor(this.rgbToHex(mindmapTopic.getBackgroundColor())); + } + + if (wiseShape) { + const isRootRoundedRectangle = isRoot && TopicShape.ROUNDED_RECT !== wiseShape; + const notIsRootLine = !isRoot && TopicShape.LINE !== wiseShape; + + if (isRootRoundedRectangle || notIsRootLine) { + let style: string = wiseShape; + if (TopicShape.ROUNDED_RECT === style || TopicShape.ELLIPSE === style) { + style = 'bubble'; + } + freemindNode.setStyle(style); + } + } else if (!isRoot) freemindNode.setStyle('fork'); + + this.addFeautreNode(freemindNode, mindmapTopic); + this.addFontNode(freemindNode, mindmapTopic); + this.addEdgeNode(freemindNode, mindmapTopic); + } + + private addNodeFromTopic(mainTopic: INodeModel, destNode: FreeminNode): void { + const curretnTopics: Array = mainTopic.getChildren(); + + curretnTopics.forEach((currentTopic: INodeModel) => { + const newNode: FreeminNode = this.objectFactory.createNode(); + this.nodeMap.set(currentTopic.getId(), newNode); + + this.setTopicPropertiesToNode({ freemindNode: newNode, mindmapTopic: currentTopic, isRoot: false }); + + destNode.setArrowlinkOrCloudOrEdge(newNode); + + this.addNodeFromTopic(currentTopic, newNode); + + const position: PositionNodeType = currentTopic.getPosition(); + if (position) { + const xPos: number = position.x; + newNode.setPosition((xPos < 0 ? 'left' : 'right')); + } else newNode.setPosition('left'); + }); + } + + private buildRichcontent(text: string, type: string): Richcontent { + const richconent: Richcontent = this.objectFactory.createRichcontent(); + + richconent.setType(type); + + const textSplit = text.split('\n'); + + let html = ''; + + textSplit.forEach((line: string) => { + html += `

${line.trim()}

`; + }); + + html += ''; + + const richconentDocument: Document = FreemindExporter.parserXMLString(html, 'application/xml'); + const xmlResult = new XMLSerializer().serializeToString(richconentDocument); + richconent.setHtml(xmlResult); + + return richconent; + } + + private addFeautreNode(freemindNode: FreeminNode, mindmapTopic: INodeModel): void { + const branches: Array = mindmapTopic.getFeatures(); + + branches + .forEach((feature: FeatureModel) => { + const type = feature.getType(); + + if (type === 'link') { + const link = feature as LinkModel; + freemindNode.setLink(link.getUrl()); + } + + if (type === 'note') { + const note = feature as NoteModel; + const richcontent: Richcontent = this.buildRichcontent(note.getText(), 'NOTE'); + freemindNode.setArrowlinkOrCloudOrEdge(richcontent); + } + + if (type === 'icon') { + const icon = feature as IconModel; + const freemindIcon: Icon = new Icon(); + freemindIcon.setBuiltin(icon.getIconType()); + freemindNode.setArrowlinkOrCloudOrEdge(freemindIcon); + } + }); + } + + private addEdgeNode(freemainMap: FreeminNode, mindmapTopic: INodeModel): void { + if (mindmapTopic.getBorderColor()) { + const edgeNode: Edge = this.objectFactory.createEdge(); + edgeNode.setColor(this.rgbToHex(mindmapTopic.getBorderColor())); + freemainMap.setArrowlinkOrCloudOrEdge(edgeNode); + } + } + + private addFontNode(freemindNode: FreeminNode, mindmapTopic: INodeModel): void { + const fontFamily: string = mindmapTopic.getFontFamily(); + const fontSize: number = mindmapTopic.getFontSize(); + const fontColor: string = mindmapTopic.getFontColor(); + const fontWeigth: string | number | boolean = mindmapTopic.getFontWeight(); + const fontStyle: string = mindmapTopic.getFontStyle(); + + if (fontFamily || fontSize || fontColor || fontWeigth || fontStyle) { + const font: Font = this.objectFactory.createFont(); + let fontNodeNeeded = false; + + if (fontFamily) { + font.setName(fontFamily); + } + + if (fontSize) { + const freeSize = FreemindExporter.wisweToFreeFontSize.get(fontSize); + + if (freeSize) { + font.setSize(freeSize.toString()); + fontNodeNeeded = true; + } + } + + if (fontColor) { + freemindNode.setColor(fontColor); + } + + if (fontWeigth) { + if (typeof fontWeigth === 'boolean') { + font.setBold(String(fontWeigth)); + } else { + font.setBold(String(true)); + } + fontNodeNeeded = true; + } + + if (fontStyle === 'italic') { + font.setItalic(String(true)); + } + + if (fontNodeNeeded) { + if (!font.getSize()) { + font.setSize(FreemindExporter.wisweToFreeFontSize.get(8).toString()); + } + freemindNode.setArrowlinkOrCloudOrEdge(font); + } + } + } + + private rgbToHex(color: string): string { + let result: string = color; + if (result) { + const isRgb = new RegExp('^rgb\\([0-9]{1,3}, [0-9]{1,3}, [0-9]{1,3}\\)$'); + + if (isRgb.test(result)) { + const rgb: string[] = color.substring(4, color.length - 1).split(','); + const r: string = rgb[0].trim(); + const g: string = rgb[1].trim(); + const b: string = rgb[2].trim(); + + result = `#${r.length === 1 ? `0${r}` : r}${g.length === 1 ? `0${g}` : g}${b.length === 1 ? `0${b}` : b}`; + } + } + return result; + } + + private getVersion(): VersionNumber { + return this.version; + } + + private getVersionNumber(): string { + return this.getVersion().getVersion(); + } +} + +export default FreemindExporter; diff --git a/packages/mindplot/src/components/export/ImageExporterFactory.ts b/packages/mindplot/src/components/export/ImageExporterFactory.ts index 4846289d..54111437 100644 --- a/packages/mindplot/src/components/export/ImageExporterFactory.ts +++ b/packages/mindplot/src/components/export/ImageExporterFactory.ts @@ -15,26 +15,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Mindmap } from '../..'; import BinaryImageExporter from './BinaryImageExporter'; import Exporter from './Exporter'; import SVGExporter from './SVGExporter'; type imageType = 'svg' | 'png' | 'jpg'; class ImageExpoterFactory { - static create(type: imageType, mindmap: Mindmap, svgElement: Element, width: number, height: number, isCenter = false): Exporter { - let result; + static create(type: imageType, svgElement: Element, width: number, height: number, adjustToFit = true): Exporter { + let result: Exporter; switch (type) { case 'svg': { - result = new SVGExporter(svgElement); + result = new SVGExporter(svgElement, adjustToFit); break; } case 'png': { - result = new BinaryImageExporter(mindmap, svgElement, width, height, 'image/png'); + result = new BinaryImageExporter(svgElement, width, height, 'image/png', adjustToFit); break; } case 'jpg': { - result = new BinaryImageExporter(mindmap, svgElement, width, height, 'image/jpeg'); + result = new BinaryImageExporter(svgElement, width, height, 'image/jpeg', adjustToFit); break; } default: diff --git a/packages/mindplot/src/components/export/SVGExporter.ts b/packages/mindplot/src/components/export/SVGExporter.ts index 5d55ad30..8613f9da 100644 --- a/packages/mindplot/src/components/export/SVGExporter.ts +++ b/packages/mindplot/src/components/export/SVGExporter.ts @@ -15,23 +15,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import SizeType from '../SizeType'; import Exporter from './Exporter'; class SVGExporter extends Exporter { private svgElement: Element; - private prolog = '\n'; + private static prolog = '\n'; - constructor(svgElement: Element) { + private static regexpTranslate = /translate\((-?[0-9]+.[0-9]+),(-?[0-9]+.[0-9]+)\)/; + + private static padding = 30; + + private adjustToFit: boolean; + + private static MAX_SUPPORTED_SIZE = 2500; + + constructor(svgElement: Element, adjustToFit = true) { super('svg', 'image/svg+xml'); this.svgElement = svgElement; + this.adjustToFit = adjustToFit; } export(): Promise { // Replace all images for in-line images ... let svgTxt: string = new XMLSerializer() .serializeToString(this.svgElement); - svgTxt = this.prolog + svgTxt; + svgTxt = SVGExporter.prolog + svgTxt; // Are namespace declared ?. Otherwise, force the declaration ... if (svgTxt.indexOf('xmlns:xlink=') === -1) { @@ -39,15 +49,103 @@ class SVGExporter extends Exporter { } // Add white background. This is mainly for PNG export ... - const svgDoc = SVGExporter.parseXMLString(svgTxt, 'application/xml'); + let svgDoc = SVGExporter.parseXMLString(svgTxt, 'application/xml'); const svgElement = svgDoc.getElementsByTagName('svg')[0]; svgElement.setAttribute('style', 'background-color:white'); + svgElement.setAttribute('focusable', 'false'); + + // Does need to be adjust ?. + if (this.adjustToFit) { + svgDoc = this._normalizeToFit(svgDoc); + } const result = new XMLSerializer() .serializeToString(svgDoc); + return Promise.resolve(result); } + private _calcualteDimensions(): { minX: number, maxX: number, minY: number, maxY: number } { + // Collect all group elements ... + const rectElems = Array.from(document.querySelectorAll('g>rect')); + const translates: SizeType[] = rectElems + .map((rect: Element) => { + const g = rect.parentElement; + const transformStr = g.getAttribute('transform'); + + // Looking to parse translate(220.00000,279.00000) scale(1.00000,1.00000) + const match = transformStr.match(SVGExporter.regexpTranslate); + let result: SizeType = { width: 0, height: 0 }; + if (match !== null) { + result = { width: Number.parseFloat(match[1]), height: Number.parseFloat(match[2]) }; + + // Add rect size ... + if (result.width > 0) { + const rectWidth = Number.parseFloat(rect.getAttribute('width')); + result.width += rectWidth; + } + + if (result.height > 0) { + const rectHeight = Number.parseFloat(rect.getAttribute('height')); + result.height += rectHeight; + } + } + return result; + }); + + // Find max and mins ... + const widths = translates.map((t) => t.width).sort((a, b) => a - b); + const heights = translates.map((t) => t.height).sort((a, b) => a - b); + + const minX = widths[0] - SVGExporter.padding; + const minY = heights[0] - SVGExporter.padding; + + const maxX = widths[widths.length - 1] + SVGExporter.padding; + const maxY = heights[heights.length - 1] + SVGExporter.padding; + + return { + minX, maxX, minY, maxY, + }; + } + + getImgSize(): SizeType { + const { + minX, maxX, minY, maxY, + } = this._calcualteDimensions(); + + let width: number = maxX + Math.abs(minX); + let height: number = maxY + Math.abs(minY); + + // Prevents an image too big. Failures seen during export in couple of browsers + if (Math.max(width, height) > SVGExporter.MAX_SUPPORTED_SIZE) { + const scale = Math.max(width, height) / SVGExporter.MAX_SUPPORTED_SIZE; + width /= scale; + height /= scale; + } + + return { width, height }; + } + + private _normalizeToFit(document: Document): Document { + const { + minX, maxX, minY, maxY, + } = this._calcualteDimensions(); + const svgElem = document.firstChild as Element; + + const width = maxX + Math.abs(minX); + const height = maxY + Math.abs(minY); + + svgElem.setAttribute('viewBox', `${minX} ${minY} ${width} ${height}`); + svgElem.setAttribute('preserveAspectRatio', 'xMinYMin'); + + // Get image size ... + const imgSize = this.getImgSize(); + svgElem.setAttribute('width', imgSize.width.toFixed(0)); + svgElem.setAttribute('height', imgSize.height.toFixed(0)); + + return document; + } + private static parseXMLString = (xmlStr: string, mimeType: DOMParserSupportedType) => { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlStr, mimeType); @@ -56,7 +154,7 @@ class SVGExporter extends Exporter { if (xmlDoc.getElementsByTagName('parsererror').length > 0) { const xmmStr = new XMLSerializer().serializeToString(xmlDoc); console.log(xmmStr); - throw new Error(`Unexpected error parsing: ${xmlStr}. Error: ${xmmStr}`); + throw new Error(`Unexpected error parsing: ${xmlStr}.Error: ${xmmStr}`); } return xmlDoc; diff --git a/packages/mindplot/src/components/export/TextExporterFactory.ts b/packages/mindplot/src/components/export/TextExporterFactory.ts index 1c639c8a..e1c99058 100644 --- a/packages/mindplot/src/components/export/TextExporterFactory.ts +++ b/packages/mindplot/src/components/export/TextExporterFactory.ts @@ -20,6 +20,7 @@ import Exporter from './Exporter'; import MDExporter from './MDExporter'; import TxtExporter from './TxtExporter'; import WiseXMLExporter from './WiseXMLExporter'; +import FreemindExporter from './FreemindExporter'; type textType = 'wxml' | 'txt' | 'mm' | 'csv' | 'md' | 'mmap'; @@ -36,6 +37,9 @@ class TextExporterFactory { case 'md': result = new MDExporter(mindmap); break; + case 'mm': + result = new FreemindExporter(mindmap); + break; default: throw new Error(`Unsupported type ${type}`); } diff --git a/packages/mindplot/src/components/export/TxtExporter.ts b/packages/mindplot/src/components/export/TxtExporter.ts index f333f319..3356faec 100644 --- a/packages/mindplot/src/components/export/TxtExporter.ts +++ b/packages/mindplot/src/components/export/TxtExporter.ts @@ -18,6 +18,7 @@ import { Mindmap } from '../..'; import INodeModel from '../model/INodeModel'; import LinkModel from '../model/LinkModel'; +import NoteModel from '../model/NoteModel'; import Exporter from './Exporter'; class TxtExporter extends Exporter { @@ -32,27 +33,27 @@ class TxtExporter extends Exporter { const { mindmap } = this; const branches = mindmap.getBranches(); - const txtStr = this.traverseBranch('', branches); + const txtStr = this.traverseBranch('', '', branches); return Promise.resolve(txtStr); } - private traverseBranch(prefix: string, branches: INodeModel[]) { + private traverseBranch(indent: string, prefix: string, branches: INodeModel[]) { let result = ''; branches - .filter((n) => n.getText() !== undefined) .forEach((node, index) => { - result = `${result}${prefix}${index + 1} ${node.getText()}`; + result = `${result}${indent}${prefix}${index + 1} ${node.getText() !== undefined ? node.getText() : ''}`; node.getFeatures().forEach((f) => { const type = f.getType(); if (type === 'link') { - result = `${result} [link: ${(f as LinkModel).getUrl()}]`; + result = `${result}\n ${indent} [Link: ${(f as LinkModel).getUrl()}]`; + } + if (type === 'note') { + result = `${result}\n${indent} [Note: ${(f as NoteModel).getText()}]`; } }); result = `${result}\n`; - if (node.getChildren().filter((n) => n.getText() !== undefined).length > 0) { - result += this.traverseBranch(`\t${prefix}${index + 1}.`, node.getChildren()); - } + result += this.traverseBranch(`\t${indent}`, `${prefix}${index + 1}.`, node.getChildren()); }); return result; } diff --git a/packages/mindplot/src/components/export/freemind/Arrowlink.ts b/packages/mindplot/src/components/export/freemind/Arrowlink.ts new file mode 100644 index 00000000..69bf4874 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Arrowlink.ts @@ -0,0 +1,86 @@ +export default class Arrowlink { + protected COLOR: string; + + protected DESTINATION: string; + + protected ENDARROW: string; + + protected ENDINCLINATION: string; + + protected ID: string; + + protected STARTARROW: string; + + protected STARTINCLINATION: string; + + getColor(): string { + return this.COLOR; + } + + getDestination(): string { + return this.DESTINATION; + } + + getEndarrow(): string { + return this.ENDARROW; + } + + getEndInclination(): string { + return this.ENDINCLINATION; + } + + getId(): string { + return this.ID; + } + + getStartarrow(): string { + return this.STARTARROW; + } + + getStartinclination(): string { + return this.STARTINCLINATION; + } + + setColor(value: string): void { + this.COLOR = value; + } + + setDestination(value: string): void { + this.DESTINATION = value; + } + + setEndarrow(value: string): void { + this.ENDARROW = value; + } + + setEndinclination(value: string): void { + this.ENDINCLINATION = value; + } + + setId(value: string): void { + this.ID = value; + } + + setStartarrow(value: string): void { + this.STARTARROW = value; + } + + setStartinclination(value: string): void { + this.STARTINCLINATION = value; + } + + toXml(document: Document): HTMLElement { + const arrowlinkElem = document.createElement('arrowlink'); + + arrowlinkElem.setAttribute('DESTINATION', this.DESTINATION); + arrowlinkElem.setAttribute('STARTARROW', this.STARTARROW); + + if (this.COLOR) arrowlinkElem.setAttribute('COLOR', this.COLOR); + if (this.ENDINCLINATION) arrowlinkElem.setAttribute('ENDINCLINATION', this.ENDINCLINATION); + if (this.ENDARROW) arrowlinkElem.setAttribute('ENDARROW', this.ENDARROW); + if (this.ID) arrowlinkElem.setAttribute('ID', this.ID); + if (this.STARTINCLINATION) arrowlinkElem.setAttribute('STARTINCLINATION', this.STARTINCLINATION); + + return arrowlinkElem; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Cloud.ts b/packages/mindplot/src/components/export/freemind/Cloud.ts new file mode 100644 index 00000000..67986fec --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Cloud.ts @@ -0,0 +1,20 @@ +export default class Cloud { + protected COLOR: string; + + getColor(): string { + return this.COLOR; + } + + setColor(value: string): void { + this.COLOR = value; + } + + toXml(document: Document): HTMLElement { + // Set node attributes + const cloudElem = document.createElement('cloud'); + + cloudElem.setAttribute('COLOR', this.COLOR); + + return cloudElem; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Edge.ts b/packages/mindplot/src/components/export/freemind/Edge.ts new file mode 100644 index 00000000..b3a041f7 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Edge.ts @@ -0,0 +1,42 @@ +export default class Edge { + protected COLOR: string; + + protected STYLE: string; + + protected WIDTH: string; + + getColor(): string { + return this.COLOR; + } + + getStyle(): string { + return this.STYLE; + } + + getWidth(): string { + return this.WIDTH; + } + + setColor(value: string): void { + this.COLOR = value; + } + + setStyle(value: string): void { + this.STYLE = value; + } + + setWidth(value: string): void { + this.WIDTH = value; + } + + toXml(document: Document): HTMLElement { + // Set node attributes + const edgeElem = document.createElement('edge'); + + edgeElem.setAttribute('COLOR', this.COLOR); + if (this.STYLE) edgeElem.setAttribute('STYLE', this.STYLE); + if (this.WIDTH) edgeElem.setAttribute('WIDTH', this.WIDTH); + + return edgeElem; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Font.ts b/packages/mindplot/src/components/export/freemind/Font.ts new file mode 100644 index 00000000..3ba3defc --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Font.ts @@ -0,0 +1,56 @@ +export default class Font { + protected BOLD?: string; + + protected ITALIC?: string; + + protected NAME?: string; + + protected SIZE: string; + + getBold(): string { + return this.BOLD; + } + + getItalic(): string { + return this.ITALIC; + } + + getName(): string { + return this.NAME; + } + + getSize(): string { + return this.SIZE; + } + + setBold(value: string): void { + this.BOLD = value; + } + + setItalic(value: string): void { + this.ITALIC = value; + } + + setName(value: string): void { + this.NAME = value; + } + + setSize(value: string): void { + this.SIZE = value; + } + + toXml(document: Document): HTMLElement { + const fontElem = document.createElement('font'); + + if (this.SIZE) { + fontElem.setAttribute('SIZE', this.SIZE); + } else { + fontElem.setAttribute('SIZE', '12'); + } + if (this.BOLD) fontElem.setAttribute('BOLD', this.BOLD); + if (this.ITALIC) fontElem.setAttribute('ITALIC', this.ITALIC); + if (this.NAME) fontElem.setAttribute('NAME', this.NAME); + + return fontElem; + } +} diff --git a/packages/mindplot/src/components/export/freemind/FreemindConstant.ts b/packages/mindplot/src/components/export/freemind/FreemindConstant.ts new file mode 100644 index 00000000..61697e35 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/FreemindConstant.ts @@ -0,0 +1,39 @@ +import VersionNumber from './importer/VersionNumber'; + +export default { + LAST_SUPPORTED_FREEMIND_VERSION: '1.0.1', + + SUPPORTED_FREEMIND_VERSION: new VersionNumber('1.0.1'), + + CODE_VERSION: 'tango', + + SECOND_LEVEL_TOPIC_HEIGHT: 25, + + ROOT_LEVEL_TOPIC_HEIGHT: 25, + + CENTRAL_TO_TOPIC_DISTANCE: 200, + + TOPIC_TO_TOPIC_DISTANCE: 90, + + FONT_SIZE_HUGE: 15, + + FONT_SIZE_LARGE: 10, + + FONT_SIZE_NORMAL: 8, + + FONT_SIZE_SMALL: 6, + + NODE_TYPE: 'NODE', + + BOLD: 'bold', + + ITALIC: 'italic', + + EMPTY_FONT_STYLE: ';;;;;', + + EMPTY_NOTE: '', + + POSITION_LEFT: 'left', + + POSITION_RIGHT: 'right', +}; diff --git a/packages/mindplot/src/components/export/freemind/Hook.ts b/packages/mindplot/src/components/export/freemind/Hook.ts new file mode 100644 index 00000000..b9f868f6 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Hook.ts @@ -0,0 +1,33 @@ +import Parameters from './Parameters'; + +export default class Hook { + protected PARAMETERS: Parameters; + + protected TEXT: string; + + protected NAME: string; + + getParameters(): Parameters { + return this.PARAMETERS; + } + + getText(): string { + return this.TEXT; + } + + getName(): string { + return this.NAME; + } + + setParameters(value: Parameters): void { + this.PARAMETERS = value; + } + + setText(value: string): void { + this.TEXT = value; + } + + setName(value: string): void { + this.NAME = value; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Icon.ts b/packages/mindplot/src/components/export/freemind/Icon.ts new file mode 100644 index 00000000..c819f960 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Icon.ts @@ -0,0 +1,20 @@ +export default class Icon { + protected BUILTIN: string; + + getBuiltin(): string { + return this.BUILTIN; + } + + setBuiltin(value: string): void { + this.BUILTIN = value; + } + + toXml(document: Document): HTMLElement { + // Set node attributes + const iconElem = document.createElement('icon'); + + iconElem.setAttribute('BUILTIN', this.BUILTIN); + + return iconElem; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Map.ts b/packages/mindplot/src/components/export/freemind/Map.ts new file mode 100644 index 00000000..a12b74bd --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Map.ts @@ -0,0 +1,116 @@ +import { createDocument } from '@wisemapping/core-js'; +import Arrowlink from './Arrowlink'; +import Cloud from './Cloud'; +import Edge from './Edge'; +import Font from './Font'; +import Icon from './Icon'; +import Node, { Choise } from './Node'; +import Richcontent from './Richcontent'; + +export default class Map { + protected node: Node; + + protected version: string; + + getNode(): Node { + return this.node; + } + + getVersion(): string { + return this.version; + } + + setNode(value: Node) { + this.node = value; + } + + setVesion(value: string) { + this.version = value; + } + + toXml(): Document { + const document = createDocument(); + + // Set map attributes + const mapElem = document.createElement('map'); + mapElem.setAttribute('version', this.version); + + document.appendChild(mapElem); + + // Create main node + const mainNode: Node = this.node; + mainNode.setCentralTopic(true); + const mainNodeElem = mainNode.toXml(document); + mapElem.appendChild(mainNodeElem); + + const childNodes: Array = mainNode.getArrowlinkOrCloudOrEdge(); + childNodes.forEach((childNode: Choise) => { + const node = this.nodeToXml(childNode, mainNodeElem, document); + mainNodeElem.appendChild(node); + }); + + return document; + } + + private nodeToXml(childNode: Choise, parentNode: HTMLElement, document: Document): HTMLElement { + if (childNode instanceof Node) { + childNode.setCentralTopic(false); + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + const childrens = childNode.getArrowlinkOrCloudOrEdge(); + if (childrens.length > 0) { + childrens.forEach((node: Choise) => { + const nodeXml = this.nodeToXml(node, childNodeXml, document); + childNodeXml.appendChild(nodeXml); + }); + } + + return childNodeXml; + } + + if (childNode instanceof Font) { + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + return childNodeXml; + } + + if (childNode instanceof Edge) { + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + return childNodeXml; + } + + if (childNode instanceof Arrowlink) { + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + return childNodeXml; + } + + if (childNode instanceof Cloud) { + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + return childNodeXml; + } + + if (childNode instanceof Icon) { + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + return childNodeXml; + } + + if (childNode instanceof Richcontent) { + const childNodeXml = childNode.toXml(document); + parentNode.appendChild(childNodeXml); + + return childNodeXml; + } + + return parentNode; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Node.ts b/packages/mindplot/src/components/export/freemind/Node.ts new file mode 100644 index 00000000..3402e431 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Node.ts @@ -0,0 +1,233 @@ +import Arrowlink from './Arrowlink'; +import Cloud from './Cloud'; +import Edge from './Edge'; +import Font from './Font'; +import Hook from './Hook'; +import Icon from './Icon'; +import Richcontent from './Richcontent'; + +class Node { + protected arrowlinkOrCloudOrEdge: Array; + + protected BACKGROUND_COLOR: string; + + protected COLOR: string; + + protected FOLDED: string; + + protected ID: string; + + protected LINK: string; + + protected POSITION: string; + + protected STYLE: string; + + protected TEXT: string; + + protected CREATED: string; + + protected MODIFIED: string; + + protected HGAP: string; + + protected VGAP: string; + + protected WCOORDS: string; + + protected WORDER: string; + + protected VSHIFT: string; + + protected ENCRYPTED_CONTENT: string; + + private centralTopic: boolean; + + getArrowlinkOrCloudOrEdge(): Array { + if (!this.arrowlinkOrCloudOrEdge) { + this.arrowlinkOrCloudOrEdge = new Array(); + } + return this.arrowlinkOrCloudOrEdge; + } + + getBackgorundColor(): string { + return this.BACKGROUND_COLOR; + } + + getColor(): string { + return this.COLOR; + } + + getFolded(): string { + return this.FOLDED; + } + + getId(): string { + return this.ID; + } + + getLink(): string { + return this.LINK; + } + + getPosition(): string { + return this.POSITION; + } + + getStyle(): string { + return this.STYLE; + } + + getText(): string { + return this.TEXT; + } + + getCreated(): string { + return this.CREATED; + } + + getModified(): string { + return this.MODIFIED; + } + + getHgap(): string { + return this.HGAP; + } + + getVgap(): string { + return this.VGAP; + } + + getWcoords(): string { + return this.WCOORDS; + } + + getWorder(): string { + return this.WORDER; + } + + getVshift(): string { + return this.VSHIFT; + } + + getEncryptedContent(): string { + return this.ENCRYPTED_CONTENT; + } + + getCentralTopic(): boolean { + return this.centralTopic; + } + + setArrowlinkOrCloudOrEdge(value: Arrowlink | Cloud | Edge | Font | Hook | Icon | Richcontent | this): void { + this.getArrowlinkOrCloudOrEdge().push(value); + } + + setBackgorundColor(value: string): void { + this.BACKGROUND_COLOR = value; + } + + setColor(value: string): void { + this.COLOR = value; + } + + setFolded(value: string): void { + this.FOLDED = value; + } + + setId(value: string): void { + this.ID = value; + } + + setLink(value: string): void { + this.LINK = value; + } + + setPosition(value: string): void { + this.POSITION = value; + } + + setStyle(value: string): void { + this.STYLE = value; + } + + setText(value: string): void { + this.TEXT = value; + } + + setCreated(value: string): void { + this.CREATED = value; + } + + setModified(value: string): void { + this.MODIFIED = value; + } + + setHgap(value: string): void { + this.HGAP = value; + } + + setVgap(value: string): void { + this.VGAP = value; + } + + setWcoords(value: string): void { + this.WCOORDS = value; + } + + setWorder(value: string): void { + this.WORDER = value; + } + + setVshift(value: string): void { + this.VSHIFT = value; + } + + setEncryptedContent(value: string): void { + this.ENCRYPTED_CONTENT = value; + } + + setCentralTopic(value: boolean): void { + this.centralTopic = value; + } + + toXml(document: Document): HTMLElement { + // Set node attributes + const nodeElem = document.createElement('node'); + + if (this.centralTopic) { + if (this.ID) nodeElem.setAttribute('ID', this.ID); + if (this.TEXT) nodeElem.setAttribute('TEXT', this.TEXT); + if (this.BACKGROUND_COLOR) nodeElem.setAttribute('BACKGROUND_COLOR', this.BACKGROUND_COLOR); + if (this.COLOR) nodeElem.setAttribute('COLOR', this.COLOR); + if (this.TEXT) { + nodeElem.setAttribute('TEXT', this.TEXT); + } else { + nodeElem.setAttribute('TEXT', ''); + } + return nodeElem; + } + + if (this.ID) nodeElem.setAttribute('ID', this.ID); + if (this.POSITION) nodeElem.setAttribute('POSITION', this.POSITION); + if (this.STYLE) nodeElem.setAttribute('STYLE', this.STYLE); + if (this.BACKGROUND_COLOR) nodeElem.setAttribute('BACKGROUND_COLOR', this.BACKGROUND_COLOR); + if (this.COLOR) nodeElem.setAttribute('COLOR', this.COLOR); + if (this.TEXT) nodeElem.setAttribute('TEXT', this.TEXT); + if (this.LINK) nodeElem.setAttribute('LINK', this.LINK); + if (this.FOLDED) nodeElem.setAttribute('FOLDED', this.FOLDED); + if (this.CREATED) nodeElem.setAttribute('CREATED', this.CREATED); + if (this.MODIFIED) nodeElem.setAttribute('MODIFIED', this.MODIFIED); + if (this.HGAP) nodeElem.setAttribute('HGAP', this.HGAP); + if (this.VGAP) nodeElem.setAttribute('VGAP', this.VGAP); + if (this.WCOORDS) nodeElem.setAttribute('WCOORDS', this.WCOORDS); + if (this.WORDER) nodeElem.setAttribute('WORDER', this.WORDER); + if (this.VSHIFT) nodeElem.setAttribute('VSHIFT', this.VSHIFT); + if (this.ENCRYPTED_CONTENT) nodeElem.setAttribute('ENCRYPTED_CONTENT', this.ENCRYPTED_CONTENT); + + return nodeElem; + } +} + +export type Choise = Arrowlink | Cloud | Edge | Font | Hook | Icon | Richcontent | Node + +export default Node; diff --git a/packages/mindplot/src/components/export/freemind/ObjectFactory.ts b/packages/mindplot/src/components/export/freemind/ObjectFactory.ts new file mode 100644 index 00000000..71feb370 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/ObjectFactory.ts @@ -0,0 +1,51 @@ +import Arrowlink from './Arrowlink'; +import Cloud from './Cloud'; +import Edge from './Edge'; +import Font from './Font'; +import Hook from './Hook'; +import Icon from './Icon'; +import Richcontent from './Richcontent'; +import Map from './Map'; +import Node from './Node'; + +export default class ObjectFactory { + public createParameters(): void { + console.log('parameters'); + } + + public crateArrowlink(): Arrowlink { + return new Arrowlink(); + } + + public createCloud(): Cloud { + return new Cloud(); + } + + public createEdge(): Edge { + return new Edge(); + } + + public createFont(): Font { + return new Font(); + } + + public createHook(): Hook { + return new Hook(); + } + + public createIcon(): Icon { + return new Icon(); + } + + public createRichcontent(): Richcontent { + return new Richcontent(); + } + + public createMap(): Map { + return new Map(); + } + + public createNode(): Node { + return new Node(); + } +} diff --git a/packages/mindplot/src/components/export/freemind/Parameters.ts b/packages/mindplot/src/components/export/freemind/Parameters.ts new file mode 100644 index 00000000..aa67c2d2 --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Parameters.ts @@ -0,0 +1,11 @@ +export default class Parameters { + protected REMINDUSERAT: number; + + getReminduserat(): number { + return this.REMINDUSERAT; + } + + setReminduserat(value: number): void { + this.REMINDUSERAT = value; + } +} diff --git a/packages/mindplot/src/components/export/freemind/Richcontent.ts b/packages/mindplot/src/components/export/freemind/Richcontent.ts new file mode 100644 index 00000000..63a8c07f --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/Richcontent.ts @@ -0,0 +1,35 @@ +export default class Richcontent { + protected html: string; + + protected type: string; + + getHtml(): string { + return this.html; + } + + getType(): string { + return this.type; + } + + setHtml(value: string): void { + this.html = value; + } + + setType(value: string): void { + this.type = value; + } + + toXml(document: Document): HTMLElement { + // Set node attributes + const richcontentElem = document.createElement('richcontent'); + + richcontentElem.setAttribute('TYPE', this.type); + + if (this.html) { + const htmlElement: DocumentFragment = document.createRange().createContextualFragment(this.html); + richcontentElem.appendChild(htmlElement); + } + + return richcontentElem; + } +} diff --git a/packages/mindplot/src/components/export/freemind/importer/VersionNumber.ts b/packages/mindplot/src/components/export/freemind/importer/VersionNumber.ts new file mode 100644 index 00000000..0761213a --- /dev/null +++ b/packages/mindplot/src/components/export/freemind/importer/VersionNumber.ts @@ -0,0 +1,11 @@ +export default class VersionNumber { + protected version: string; + + constructor(version: string) { + this.version = version; + } + + public getVersion(): string { + return this.version; + } +} diff --git a/packages/mindplot/src/components/lang/Bundle.js b/packages/mindplot/src/components/lang/Bundle.js index 964b9904..5e3d6e44 100644 --- a/packages/mindplot/src/components/lang/Bundle.js +++ b/packages/mindplot/src/components/lang/Bundle.js @@ -20,12 +20,14 @@ import ES from './es'; import EN from './en'; import DE from './de'; import FR from './fr'; +import RU from './ru'; const Bundle = { es: ES, en: EN, de: DE, fr: FR, + ru: RU, }; export default Bundle; diff --git a/packages/mindplot/src/components/lang/de.properties b/packages/mindplot/src/components/lang/de.properties deleted file mode 100644 index 0b4a4f8c..00000000 --- a/packages/mindplot/src/components/lang/de.properties +++ /dev/null @@ -1,80 +0,0 @@ -ZOOM_IN = 'Ansicht vergrößern', -ZOOM_OUT = 'Ansicht verkleinern', -TOPIC_SHAPE = 'Themen Gestaltung', -TOPIC_ADD = 'Thema hinzufügen', -TOPIC_DELETE = 'Thema löschen', -TOPIC_ICON = 'Symbol hinzufügen', -TOPIC_LINK = 'Verbindung hinzufügen', -TOPIC_RELATIONSHIP = 'Beziehung', -TOPIC_COLOR = 'Themenfarbe', -TOPIC_BORDER_COLOR = 'Thema Randfarbe', -TOPIC_NOTE = 'Notiz hinzufügen', -FONT_FAMILY = 'Schrifttyp', -FONT_SIZE = 'Schriftgröße', -FONT_BOLD = 'Fette Schrift', -FONT_ITALIC = 'Kursive Schrift', -UNDO = 'Rückgängig machen', -REDO = 'Wiederholen', -INSERT = 'Einfügen', -SAVE = 'Sichern', -NOTE = 'Notiz', -ADD_TOPIC = 'Thema hinzufügen', -LOADING = 'Laden ...', -EXPORT = 'Exportieren', -PRINT = 'Drucken', -PUBLISH = 'Publizieren', -COLLABORATE = 'Mitbenutzen', -HISTORY = 'Historie', -DISCARD_CHANGES = 'Änderungen verwerfen', -FONT_COLOR = 'Textfarbe', -SAVING = 'Sichern ...', -SAVE_COMPLETE = 'Sichern abgeschlossen', -ZOOM_IN_ERROR = 'Zoom zu hoch.', -ZOOM_ERROR = 'Es kann nicht weiter vergrößert bzw. verkelinert werden.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED = 'Thema konnte nicht angelegt werden. Bitte wählen Sie nur ein Thema aus.', -ONE_TOPIC_MUST_BE_SELECTED = 'Thema konnte nicht angelegt werden. Es muss ein Thema ausgewählt werden.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE = 'Kinderknoten können nicht eingefaltet werden. Es muss ein Thema ausgewäht werden.', -SAVE_COULD_NOT_BE_COMPLETED = 'Sichern wurde nicht abgeschlossen. Versuchen Sie es später nocheinmal.', -UNEXPECTED_ERROR_LOADING = 'E tut uns Leid, ein unerwarteter Fehler ist aufgetreten.\nVersuchen Sie, den Editor neu zu laden. Falls das Problem erneut auftritt, bitte kontaktieren Sie uns unter support@wisemapping.com.', -MAIN_TOPIC = 'Hauptthema', -SUB_TOPIC = 'Unterthema', -ISOLATED_TOPIC = 'Isoliertes Thema', -CENTRAL_TOPIC = 'Zentrales Thema', -SHORTCUTS = 'Tastaturkürzel', -ENTITIES_COULD_NOT_BE_DELETED = 'Konnte das Thema oder die Beziehung nicht löschen. Es muss mindest ein Eintrag ausgewählt sein.', -AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED = 'Es muss mindestens ein Thema ausgewählt sein.', -CLIPBOARD_IS_EMPTY = 'Es gibt nichts zu kopieren. Die Zwischenablage ist leer.', -CENTRAL_TOPIC_CAN_NOT_BE_DELETED = 'Das zentrale Thema kann nicht gelöscht werden.', -RELATIONSHIP_COULD_NOT_BE_CREATED = 'Die Beziehung konnte nicht angelegt werden. Es muss erst ein Vater-Thema ausgewählt werden, um die Beziehung herzustellen.', -SELECTION_COPIED_TO_CLIPBOARD = 'Themen in der Zwischenablage', -WRITE_YOUR_TEXT_HERE = 'Schreiben Sie ihre Notiz hier ...', -REMOVE = 'Entfernen', -ACCEPT = 'Akzeptieren', -CANCEL = 'Abbrechen', -LINK = 'Verbindung', -OPEN_LINK = 'Öffne URL', -SESSION_EXPIRED = 'Ihre Sitzung ist abgelaufen, bitte melden Sie sich erneut an.', -URL_ERROR = 'URL nicht gültig', -ACTION = 'Aktion', -CREATE_SIBLING_TOPIC = 'Erzeuge ein Schwester Thema', -CREATE_CHILD_TOPIC = 'Eryeuge ein Unterthema', -DELETE_TOPIC = 'Lösche Thema', -EDIT_TOPIC_TEXT = 'Editiere Thematext', -JUST_START_TYPING = 'Einfach mit der Eingabe beginnen', -CANCEL_TEXT_CHANGES = 'Textänderungen abbrechen', -TOPIC_NAVIGATION = 'Themen Navigation', -ARROW_KEYS = 'Pfeiltasten', -SELECT_MULTIPLE_NODES = 'Wähle mehrfache Knoten aus', -UNDO_EDITION = 'Änderungen rückgängig machen', -REDO_EDITION = 'Änderung nochmal ausführen', -SELECT_ALL_TOPIC = 'Wähle alle Themen aus', -CHANGE_TEXT_BOLD = 'Ändere Text in fette Schrift', -SAVE_CHANGES = 'Änderungen sichern', -CHANGE_TEXT_ITALIC = 'Ändere Text in kursive Schrift', -DESELECT_ALL_TOPIC = 'Deselektiere alle Themen', -COLLAPSE_CHILDREN = 'Kindknoten zusammenklappen', -KEYBOARD_SHORTCUTS_MSG = 'Tastenkürzel helfen Zeit zu sparen und erlauben die Arbeit nur mit der Tatstatur, s.d. Sie niemals die Hand von der Tastatur nehmen müßen, um die Maus zu bedienen.', -COPY_AND_PASTE_TOPICS = 'Kopieren und Einsetzen von Themen', -MULTIPLE_LINES = 'Füge mehrer Textzeilen hinzu', -BACK_TO_MAP_LIST = 'Zurück zur Kartenliste', -KEYBOARD_SHOTCUTS = 'Tastaturkürzel', \ No newline at end of file diff --git a/packages/mindplot/src/components/lang/en.properties b/packages/mindplot/src/components/lang/en.properties deleted file mode 100644 index cf15f5b1..00000000 --- a/packages/mindplot/src/components/lang/en.properties +++ /dev/null @@ -1,80 +0,0 @@ -ZOOM_IN = 'Zoom In', -ZOOM_OUT = 'Zoom Out', -TOPIC_SHAPE = 'Topic Shape', -TOPIC_ADD = 'Add Topic', -TOPIC_DELETE = 'Delete Topic', -TOPIC_ICON = 'Add Icon', -TOPIC_LINK = 'Add Link', -TOPIC_RELATIONSHIP = 'Relationship', -TOPIC_COLOR = 'Topic Color', -TOPIC_BORDER_COLOR = 'Topic Border Color', -TOPIC_NOTE = 'Add Note', -FONT_FAMILY = 'Font Type', -FONT_SIZE = 'Text Size', -FONT_BOLD = 'Text Bold', -FONT_ITALIC = 'Text Italic', -UNDO = 'Undo', -REDO = 'Redo', -INSERT = 'Insert', -SAVE = 'Save', -NOTE = 'Note', -ADD_TOPIC = 'Add Topic', -LOADING = 'Loading ...', -EXPORT = 'Export', -PRINT = 'Print', -PUBLISH = 'Publish', -COLLABORATE = 'Share', -HISTORY = 'History', -DISCARD_CHANGES = 'Discard Changes', -FONT_COLOR = 'Text Color', -SAVING = 'Saving ...', -SAVE_COMPLETE = 'Save Complete', -ZOOM_IN_ERROR = 'Zoom too high.', -ZOOM_ERROR = 'No more zoom can be applied.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED = 'Could not create a topic. Only one topic must be selected.', -ONE_TOPIC_MUST_BE_SELECTED = 'Could not create a topic. One topic must be selected.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE = 'Children can not be collapsed. One topic must be selected.', -SAVE_COULD_NOT_BE_COMPLETED = 'Save could not be completed, please try again latter.', -UNEXPECTED_ERROR_LOADING = "We're sorry, an unexpected error has occurred.\nTry again reloading the editor.If the problem persists, contact us to support@wisemapping.com.", -MAIN_TOPIC = 'Main Topic', -SUB_TOPIC = 'Sub Topic', -ISOLATED_TOPIC = 'Isolated Topic', -CENTRAL_TOPIC = 'Central Topic', -SHORTCUTS = 'Keyboard Shortcuts', -ENTITIES_COULD_NOT_BE_DELETED = 'Could not delete topic or relation. At least one map entity must be selected.', -AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED = 'At least one topic must be selected.', -CLIPBOARD_IS_EMPTY = 'Nothing to copy. Clipboard is empty.', -CENTRAL_TOPIC_CAN_NOT_BE_DELETED = 'Central topic can not be deleted.', -RELATIONSHIP_COULD_NOT_BE_CREATED = 'Relationship could not be created. A parent relationship topic must be selected first.', -SELECTION_COPIED_TO_CLIPBOARD = 'Topics copied to the clipboard', -WRITE_YOUR_TEXT_HERE = 'Write your note here ...', -REMOVE = 'Remove', -ACCEPT = 'Accept', -CANCEL = 'Cancel', -LINK = 'Link', -OPEN_LINK = 'Open URL', -SESSION_EXPIRED = 'Your session has expired, please log-in again.', -URL_ERROR = 'URL not valid', -ACTION = 'Action', -CREATE_SIBLING_TOPIC = 'Create Sibling Topic', -CREATE_CHILD_TOPIC = 'Create Child Topic', -DELETE_TOPIC = 'Delete Topic', -EDIT_TOPIC_TEXT = 'Edit Topic Text', -JUST_START_TYPING = 'Just start typing', -CANCEL_TEXT_CHANGES = 'Cancel Text Changes', -TOPIC_NAVIGATION = 'Topic Navigation', -ARROW_KEYS = 'Arrow Keys', -SELECT_MULTIPLE_NODES = 'Select Multiple Nodes', -UNDO_EDITION = 'Undo Edition', -REDO_EDITION = 'Redo Edition', -SELECT_ALL_TOPIC = 'Select All Topic', -CHANGE_TEXT_BOLD = 'Change Text Bold Type', -SAVE_CHANGES = 'Save Changes', -CHANGE_TEXT_ITALIC = 'Change Text Italic', -DESELECT_ALL_TOPIC = 'Deselect All Topic', -COLLAPSE_CHILDREN = 'Collapse Children', -KEYBOARD_SHORTCUTS_MSG = 'Keyboard shortcuts can help you save time by allowing you to never take your hands off the keyboard to use the mouse.', -COPY_AND_PASTE_TOPICS = 'Copy and Paste Topics', -MULTIPLE_LINES = 'Add multiple text lines', -BACK_TO_MAP_LIST = 'Back to Maps List', -KEYBOARD_SHOTCUTS = 'Keyboard Shorcuts', \ No newline at end of file diff --git a/packages/mindplot/src/components/lang/es.properties b/packages/mindplot/src/components/lang/es.properties deleted file mode 100644 index 4e9417db..00000000 --- a/packages/mindplot/src/components/lang/es.properties +++ /dev/null @@ -1,80 +0,0 @@ -ZOOM_IN = 'Acercar', -ZOOM_OUT = 'Alejar', -TOPIC_SHAPE = 'Forma del Tópico', -TOPIC_ADD = 'Agregar Tópico', -TOPIC_DELETE = 'Borrar Tópico', -TOPIC_ICON = 'Agregar Icono', -TOPIC_LINK = 'Agregar Enlace', -TOPIC_RELATIONSHIP = 'Relación', -TOPIC_COLOR = 'Color Tópico', -TOPIC_BORDER_COLOR = 'Color del Borde', -TOPIC_NOTE = 'Agregar Nota', -FONT_FAMILY = 'Tipo de Fuente', -FONT_SIZE = 'Tamaño de Texto', -FONT_BOLD = 'Negrita', -FONT_ITALIC = 'Italica', -UNDO = 'Rehacer', -REDO = 'Deshacer', -INSERT = 'Insertar', -SAVE = 'Guardar', -NOTE = 'Nota', -ADD_TOPIC = 'Agregar Tópico', -LOADING = 'Cargando ...', -EXPORT = 'Exportar', -PRINT = 'Imprimir', -PUBLISH = 'Publicar', -COLLABORATE = 'Compartir', -HISTORY = 'Historial', -DISCARD_CHANGES = 'Descartar Cambios', -FONT_COLOR = 'Color de Texto', -SAVING = 'Grabando ...', -SAVE_COMPLETE = 'Grabado Completo', -ZOOM_IN_ERROR = 'El zoom es muy alto.', -ZOOM_ERROR = 'No es posible aplicar mas zoom.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED = 'No ha sido posible crear un nuevo tópico. Sólo un tópico debe ser seleccionado.', -ONE_TOPIC_MUST_BE_SELECTED = 'No ha sido posible crear un nuevo tópico. Al menos un tópico debe ser seleccionado.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE = 'Tópicos hijos no pueden ser colapsados. Sólo un tópico debe ser seleccionado.', -SAVE_COULD_NOT_BE_COMPLETED = 'Grabación no pudo ser completada. Intentelo mas tarde.', -UNEXPECTED_ERROR_LOADING = 'Lo sentimos, un error inesperado ha ocurrido. Intentelo nuevamente recargando el editor. Si el problema persiste, contactenos a support@wisemapping.com.', -MAIN_TOPIC = 'Tópico Principal', -SUB_TOPIC = 'Tópico Secundario', -ISOLATED_TOPIC = 'Tópico Aislado', -CENTRAL_TOPIC = 'Tópico Central', -SHORTCUTS = 'Accesos directos', -ENTITIES_COULD_NOT_BE_DELETED = 'El tópico o la relación no pudo ser borrada. Debe selecionar al menos una.', -AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED = 'Al menos un tópico debe ser seleccionado.', -CLIPBOARD_IS_EMPTY = 'Nada que copiar. Clipboard está vacio.', -CENTRAL_TOPIC_CAN_NOT_BE_DELETED = 'El tópico central no puede ser borrado.', -RELATIONSHIP_COULD_NOT_BE_CREATED = 'La relación no pudo ser creada. Una relación padre debe ser seleccionada primero.', -SELECTION_COPIED_TO_CLIPBOARD = 'Tópicos copiados al clipboard', -WRITE_YOUR_TEXT_HERE = 'Escribe tu nota aquí ...', -REMOVE = 'Borrar', -ACCEPT = 'Aceptar', -CANCEL = 'Cancelar', -LINK = 'Enlace', -OPEN_LINK = 'Abrir Enlace', -SESSION_EXPIRED = 'Su session ha expirado. Por favor, ingrese nuevamente.', -URL_ERROR = 'URL no válida', -ACTION = 'Acción', -CREATE_SIBLING_TOPIC = 'Agregar Tópico Hermano', -CREATE_CHILD_TOPIC = 'Agregar Tópico Hijo', -DELETE_TOPIC = 'Borrar Tópico', -EDIT_TOPIC_TEXT = 'Editar Texto de Tópico', -JUST_START_TYPING = 'Comenza a escribir', -CANCEL_TEXT_CHANGES = 'Cancelar Edición de Texto', -TOPIC_NAVIGATION = 'Navegación Entre Tópicos', -ARROW_KEYS = 'Flechas Del Cursor', -SELECT_MULTIPLE_NODES = 'Selecciónar Multiples Tópicos', -UNDO_EDITION = 'Revertir Cambios', -REDO_EDITION = 'Rehacer Cambios', -SELECT_ALL_TOPIC = 'Seleccionar Todos los Tópicos', -CHANGE_TEXT_BOLD = 'Cambiar Texto a Negrita', -SAVE_CHANGES = 'Guardar los Cambios', -CHANGE_TEXT_ITALIC = 'Cambiar Texto a Italica', -DESELECT_ALL_TOPIC = 'Revertir Selección de Tópicos', -COLLAPSE_CHILDREN = 'Colapsar Hijos', -KEYBOARD_SHORTCUTS_MSG = 'Los accesos directos pueden ayudarte a salvar tiempo permitiéndote no sacar las manos del teclado para usar el mouse.', -COPY_AND_PASTE_TOPICS = 'Copier et coller les noeuds', -MULTIPLE_LINES = 'Ajouter plusieurs lignes de texte', -BACK_TO_MAP_LIST = 'Volver a la lista de mapas', -KEYBOARD_SHOTCUTS = 'Métodos abreviados de teclado', \ No newline at end of file diff --git a/packages/mindplot/src/components/lang/fr.properties b/packages/mindplot/src/components/lang/fr.properties deleted file mode 100644 index 6536b988..00000000 --- a/packages/mindplot/src/components/lang/fr.properties +++ /dev/null @@ -1,80 +0,0 @@ -ZOOM_IN = 'Agrandir affichage', -ZOOM_OUT = 'Réduire affichage', -TOPIC_SHAPE = 'Forme du noeud', -TOPIC_ADD = 'Ajouter un noeud', -TOPIC_DELETE = 'Supprimer le noeud', -TOPIC_ICON = 'Ajouter une icône', -TOPIC_LINK = 'Ajouter un lien', -TOPIC_RELATIONSHIP = 'Relation du noeud', -TOPIC_COLOR = 'Couleur du noeud', -TOPIC_BORDER_COLOR = 'Couleur de bordure du noeud', -TOPIC_NOTE = 'Ajouter une note', -FONT_FAMILY = 'Type de police', -FONT_SIZE = 'Taille de police', -FONT_BOLD = 'Caractères gras', -FONT_ITALIC = 'Caractères italiques', -UNDO = 'Annuler', -REDO = 'Refaire', -INSERT = 'Insérer', -SAVE = 'Enregistrer', -NOTE = 'Note', -ADD_TOPIC = 'Ajouter un noeud', -LOADING = 'Chargement ...', -EXPORT = 'Exporter', -PRINT = 'Imprimer', -PUBLISH = 'Publier', -COLLABORATE = 'Partager', -HISTORY = 'Historique', -DISCARD_CHANGES = 'Annuler les changements', -FONT_COLOR = 'Couleur de police', -SAVING = 'Enregistrement ...', -SAVE_COMPLETE = 'Enregistrement terminé', -ZOOM_IN_ERROR = 'Zoom trop grand.', -ZOOM_ERROR = 'Impossible de zoomer plus.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED = 'Impossible de créer un noeud. Un seul noeud doit être sélectionné.', -ONE_TOPIC_MUST_BE_SELECTED = 'Impossible de créer un noeud. Un noeud parent doit être sélectionné au préalable.', -ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE = 'Un noeud enfant ne peut pas être réduit. Un noeud doit être sélectionné.', -SAVE_COULD_NOT_BE_COMPLETED = 'Enregistrement impossible. Essayer ultérieurement.', -UNEXPECTED_ERROR_LOADING = "Nous sommes désolés, une erreur vient de survenir.\nEssayez de recharger l'éditeur. Si le problème persiste, contactez-nous \= support@wisemapping.com.", -MAIN_TOPIC = 'Noeud titre principal', -SUB_TOPIC = 'Noeud sous-titre', -ISOLATED_TOPIC = 'Noeud isolé', -CENTRAL_TOPIC = 'Noeud racine', -SHORTCUTS = 'Raccourcis clavier', -ENTITIES_COULD_NOT_BE_DELETED = "Impossible d'effacer un noeud ou une relation. Au moins un objet de la carte doit être sélectionné.", -AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED = 'Au moins un objet de la carte doit être sélectionné.', -CLIPBOARD_IS_EMPTY = 'Rien à copier. Presse-papier vide.', -CENTRAL_TOPIC_CAN_NOT_BE_DELETED = 'Le noeud racine ne peut pas être effacé.', -RELATIONSHIP_COULD_NOT_BE_CREATED = 'Impossible de créer relation. Un noeud parent doit être sélectionné au préalable.', -SELECTION_COPIED_TO_CLIPBOARD = 'Noeuds sélectionnés copiés dans le presse-papiers.', -WRITE_YOUR_TEXT_HERE = 'Écrivez votre texte ici ...', -REMOVE = 'Supprimer', -ACCEPT = 'Accepter', -CANCEL = 'Annuler', -LINK = 'Lien', -OPEN_LINK = 'Ouvrir le lien', -SESSION_EXPIRED = 'Votre session a expiré, veuillez vous reconnecter.', -URL_ERROR = 'URL non valide', -ACTION = 'Action', -CREATE_SIBLING_TOPIC = 'Créer noeud même niveau', -CREATE_CHILD_TOPIC = 'Créer noeud enfant', -DELETE_TOPIC = 'Détruire noeud ', -EDIT_TOPIC_TEXT = 'Editer texte du noeud', -JUST_START_TYPING = 'Commencer saisie', -CANCEL_TEXT_CHANGES = 'Annuler changement texte', -TOPIC_NAVIGATION = 'Navigation sur les noeuds', -ARROW_KEYS = 'Touches flèches', -SELECT_MULTIPLE_NODES = 'Selection multiple de noeuds', -UNDO_EDITION = 'Annuler édition', -REDO_EDITION = 'Refaire édition', -SELECT_ALL_TOPIC = 'Sélection tous noeuds', -CHANGE_TEXT_BOLD = 'Caractères en gras', -SAVE_CHANGES = 'Enregistrer changements', -CHANGE_TEXT_ITALIC = 'Caractères en italique', -DESELECT_ALL_TOPIC = 'Deselection tous noeuds', -COLLAPSE_CHILDREN = 'Fermer enfants', -KEYBOARD_SHORTCUTS_MSG = 'Les raccourcis clavier vous font gagner du temps, en vous permettant de garder les mains sur le clavier sans utiliser la souris.', -COPY_AND_PASTE_TOPICS = 'Copier et coller les noeuds', -MULTIPLE_LINES = 'Ajouter plusieurs lignes de texte', -BACK_TO_MAP_LIST = 'Retour à la liste des cartes', -KEYBOARD_SHOTCUTS = "Raccourcis clavier", \ No newline at end of file diff --git a/packages/mindplot/src/components/lang/ru.js b/packages/mindplot/src/components/lang/ru.js new file mode 100644 index 00000000..751055e3 --- /dev/null +++ b/packages/mindplot/src/components/lang/ru.js @@ -0,0 +1,84 @@ +const EN = { + ZOOM_IN: 'Zoom In', + ZOOM_OUT: 'Zoom Out', + TOPIC_SHAPE: 'Topic Shape', + TOPIC_ADD: 'Add Topic', + TOPIC_DELETE: 'Delete Topic', + TOPIC_ICON: 'Add Icon', + TOPIC_LINK: 'Add Link', + TOPIC_RELATIONSHIP: 'Relationship', + TOPIC_COLOR: 'Topic Color', + TOPIC_BORDER_COLOR: 'Topic Border Color', + TOPIC_NOTE: 'Add Note', + FONT_FAMILY: 'Font Type', + FONT_SIZE: 'Text Size', + FONT_BOLD: 'Text Bold', + FONT_ITALIC: 'Text Italic', + UNDO: 'Undo', + REDO: 'Redo', + INSERT: 'Insert', + SAVE: 'Save', + NOTE: 'Note', + ADD_TOPIC: 'Add Topic', + LOADING: 'Loading ...', + EXPORT: 'Export', + PRINT: 'Print', + PUBLISH: 'Publish', + COLLABORATE: 'Share', + HISTORY: 'History', + DISCARD_CHANGES: 'Discard Changes', + FONT_COLOR: 'Text Color', + SAVING: 'Saving ...', + SAVE_COMPLETE: 'Save Complete', + ZOOM_IN_ERROR: 'Zoom too high.', + ZOOM_ERROR: 'No more zoom can be applied.', + ONLY_ONE_TOPIC_MUST_BE_SELECTED: 'Could not create a topic. Only one topic must be selected.', + ONE_TOPIC_MUST_BE_SELECTED: 'Could not create a topic. One topic must be selected.', + ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: 'Children can not be collapsed. One topic must be selected.', + SAVE_COULD_NOT_BE_COMPLETED: 'Save could not be completed, please try again latter.', + UNEXPECTED_ERROR_LOADING: "We're sorry, an unexpected error has occurred.\nTry again reloading the editor.If the problem persists, contact us to support@wisemapping.com.", + MAIN_TOPIC: 'Main Topic', + SUB_TOPIC: 'Sub Topic', + ISOLATED_TOPIC: 'Isolated Topic', + CENTRAL_TOPIC: 'Central Topic', + SHORTCUTS: 'Keyboard Shortcuts', + ENTITIES_COULD_NOT_BE_DELETED: 'Could not delete topic or relation. At least one map entity must be selected.', + AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED: 'At least one topic must be selected.', + CLIPBOARD_IS_EMPTY: 'Nothing to copy. Clipboard is empty.', + CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'Central topic can not be deleted.', + RELATIONSHIP_COULD_NOT_BE_CREATED: 'Relationship could not be created. A parent relationship topic must be selected first.', + SELECTION_COPIED_TO_CLIPBOARD: 'Topics copied to the clipboard', + WRITE_YOUR_TEXT_HERE: 'Write your note here ...', + REMOVE: 'Remove', + ACCEPT: 'Accept', + CANCEL: 'Cancel', + LINK: 'Link', + OPEN_LINK: 'Open URL', + SESSION_EXPIRED: 'Your session has expired, please log-in again.', + URL_ERROR: 'URL not valid', + ACTION: 'Action', + CREATE_SIBLING_TOPIC: 'Create Sibling Topic', + CREATE_CHILD_TOPIC: 'Create Child Topic', + DELETE_TOPIC: 'Delete Topic', + EDIT_TOPIC_TEXT: 'Edit Topic Text', + JUST_START_TYPING: 'Just start typing', + CANCEL_TEXT_CHANGES: 'Cancel Text Changes', + TOPIC_NAVIGATION: 'Topic Navigation', + ARROW_KEYS: 'Arrow Keys', + SELECT_MULTIPLE_NODES: 'Select Multiple Nodes', + UNDO_EDITION: 'Undo Edition', + REDO_EDITION: 'Redo Edition', + SELECT_ALL_TOPIC: 'Select All Topic', + CHANGE_TEXT_BOLD: 'Change Text Bold Type', + SAVE_CHANGES: 'Save Changes', + CHANGE_TEXT_ITALIC: 'Change Text Italic', + DESELECT_ALL_TOPIC: 'Deselect All Topic', + COLLAPSE_CHILDREN: 'Collapse Children', + KEYBOARD_SHORTCUTS_MSG: 'Keyboard shortcuts can help you save time by allowing you to never take your hands off the keyboard to use the mouse.', + COPY_AND_PASTE_TOPICS: 'Copy and Paste Topics', + MULTIPLE_LINES: 'Add multiple text lines', + BACK_TO_MAP_LIST: 'Back to Maps List', + KEYBOARD_SHOTCUTS: 'Keyboard Shorcuts', +}; + +export default EN; diff --git a/packages/mindplot/src/components/layout/Node.ts b/packages/mindplot/src/components/layout/Node.ts index e6a2d323..b307e070 100644 --- a/packages/mindplot/src/components/layout/Node.ts +++ b/packages/mindplot/src/components/layout/Node.ts @@ -18,6 +18,7 @@ import { $assert, $defined } from '@wisemapping/core-js'; import PositionType from '../PositionType'; import SizeType from '../SizeType'; +import ChildrenSorterStrategy from './ChildrenSorterStrategy'; class Node { private _id: number; @@ -25,14 +26,14 @@ class Node { // eslint-disable-next-line no-use-before-define _parent: Node; - private _sorter: any; + private _sorter: ChildrenSorterStrategy; private _properties; // eslint-disable-next-line no-use-before-define _children: Node[]; - constructor(id: number, size: SizeType, position, sorter) { + constructor(id: number, size: SizeType, position: PositionType, sorter: ChildrenSorterStrategy) { $assert(typeof id === 'number' && Number.isFinite(id), 'id can not be null'); $assert(size, 'size can not be null'); $assert(position, 'position can not be null'); diff --git a/packages/mindplot/src/components/layout/RootedTreeSet.ts b/packages/mindplot/src/components/layout/RootedTreeSet.ts index e396e2bb..8fb53fce 100644 --- a/packages/mindplot/src/components/layout/RootedTreeSet.ts +++ b/packages/mindplot/src/components/layout/RootedTreeSet.ts @@ -24,7 +24,6 @@ class RootedTreeSet { protected _children: Node[]; - constructor() { this._rootNodes = []; } @@ -56,10 +55,9 @@ class RootedTreeSet { */ add(node: Node) { $assert(node, 'node can not be null'); - $assert( - !this.find(node.getId(), false), - `node already exits with this id. Id:${node.getId()}: ${this.dump()}`, - ); + if (this.find(node.getId(), false)) { + throw new Error(`node already exits with this id. Id:${node.getId()}: ${this.dump()}`); + } $assert(!node._children, 'node already added'); this._rootNodes.push(this._decodate(node)); } @@ -131,10 +129,11 @@ class RootedTreeSet { break; } } - $assert( - validate ? result : true, - `node could not be found id:${id}\n,RootedTreeSet${this.dump()}`, - ); + + if (validate && !result) { + throw new Error(`node could not be found id:${id}\n,RootedTreeSet${this.dump()}`); + } + return result; } @@ -259,8 +258,8 @@ class RootedTreeSet { } /** - * @return result - */ + * @return result + */ dump() { const branches = this._rootNodes; let result = ''; @@ -293,7 +292,7 @@ class RootedTreeSet { } } - _plot(canvas, node: Node, root?) { + _plot(canvas, node: Node) { const children = this.getChildren(node); const cx = node.getPosition().x + canvas.width / 2 - node.getSize().width / 2; const cy = node.getPosition().y + canvas.height / 2 - node.getSize().height / 2; diff --git a/packages/mindplot/src/components/model/NodeModel.ts b/packages/mindplot/src/components/model/NodeModel.ts index 49634350..cabd914a 100644 --- a/packages/mindplot/src/components/model/NodeModel.ts +++ b/packages/mindplot/src/components/model/NodeModel.ts @@ -70,11 +70,6 @@ class NodeModel extends INodeModel { return this._features; } - /** - * @param feature - * @throws will throw an error if feature is null or undefined - * @throws will throw an error if the feature could not be removed - */ removeFeature(feature: FeatureModel): void { $assert(feature, 'feature can not be null'); const size = this._features.length; @@ -127,11 +122,8 @@ class NodeModel extends INodeModel { return this._properties[key]; } - /** - * @return {mindplot.model.NodeModel} an identical clone of the NodeModel - */ clone(): NodeModel { - const result = new NodeModel(this.getType(), this._mindmap, -1); + const result = new NodeModel(this.getType(), this._mindmap); result._children = this._children.map((node) => { const cnode = node.clone() as NodeModel; cnode._parent = result; @@ -143,12 +135,8 @@ class NodeModel extends INodeModel { return result; } - /** - * Similar to clone, assign new id to the elements ... - * @return {mindplot.model.NodeModel} - */ deepCopy(): NodeModel { - const result = new NodeModel(this.getType(), this._mindmap, -1); + const result = new NodeModel(this.getType(), this._mindmap); result._children = this._children.map((node) => { const cnode = (node as NodeModel).deepCopy(); cnode._parent = result; @@ -163,20 +151,12 @@ class NodeModel extends INodeModel { return result; } - /** - * @param {mindplot.model.NodeModel} child - * @throws will throw an error if child is null, undefined or not a NodeModel object - */ append(child: NodeModel): void { $assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object'); this._children.push(child); child._parent = this; } - /** - * @param {mindplot.model.NodeModel} child - * @throws will throw an error if child is null, undefined or not a NodeModel object - */ removeChild(child: NodeModel): void { $assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object.'); this._children = this._children.filter((c) => c !== child); diff --git a/packages/mindplot/src/components/model/RelationshipModel.ts b/packages/mindplot/src/components/model/RelationshipModel.ts index 9a3ee56d..fa6d150c 100644 --- a/packages/mindplot/src/components/model/RelationshipModel.ts +++ b/packages/mindplot/src/components/model/RelationshipModel.ts @@ -67,7 +67,7 @@ class RelationshipModel { return this._id; } - getLineType() { + getLineType(): number { return this._lineType; } diff --git a/packages/mindplot/src/components/persistence/Beta2PelaMigrator.ts b/packages/mindplot/src/components/persistence/Beta2PelaMigrator.ts index 86a216d1..93129c30 100644 --- a/packages/mindplot/src/components/persistence/Beta2PelaMigrator.ts +++ b/packages/mindplot/src/components/persistence/Beta2PelaMigrator.ts @@ -20,7 +20,7 @@ import { Mindmap } from '../..'; import NodeModel from '../model/NodeModel'; import ModelCodeName from './ModelCodeName'; import XMLMindmapSerializer from './XMLMindmapSerializer'; -import XMLSerializerPela from './XMLSerializerPela'; +import XMLSerializerPela from './XMLSerializerTango'; class Beta2PelaMigrator implements XMLMindmapSerializer { private _betaSerializer: XMLMindmapSerializer; diff --git a/packages/mindplot/src/components/persistence/Pela2TangoMigrator.ts b/packages/mindplot/src/components/persistence/Pela2TangoMigrator.ts index c5b5ddfa..40ce6134 100644 --- a/packages/mindplot/src/components/persistence/Pela2TangoMigrator.ts +++ b/packages/mindplot/src/components/persistence/Pela2TangoMigrator.ts @@ -72,7 +72,7 @@ class Pela2TangoMigrator implements XMLMindmapSerializer { } } - private _fixPosition(mindmap: Mindmap) { + private _fixPosition(mindmap: Mindmap): void { // Position was not required in previous versions. Try to synthesize one . const centralNode = mindmap.getBranches()[0]; const children = centralNode.getChildren(); @@ -83,7 +83,7 @@ class Pela2TangoMigrator implements XMLMindmapSerializer { } } - _fixNodePosition(node: NodeModel, parentPosition: {x:number, y:number}) { + private _fixNodePosition(node: NodeModel, parentPosition: { x: number, y: number }): void { // Position was not required in previous versions. Try to synthesize one . let position = node.getPosition(); if (!position) { diff --git a/packages/mindplot/src/components/persistence/XMLSerializerFactory.ts b/packages/mindplot/src/components/persistence/XMLSerializerFactory.ts index f72b2285..0919bc63 100644 --- a/packages/mindplot/src/components/persistence/XMLSerializerFactory.ts +++ b/packages/mindplot/src/components/persistence/XMLSerializerFactory.ts @@ -20,7 +20,6 @@ import ModelCodeName from './ModelCodeName'; import Beta2PelaMigrator from './Beta2PelaMigrator'; import Pela2TangoMigrator from './Pela2TangoMigrator'; import XMLSerializerBeta from './XMLSerializerBeta'; -import XMLSerializerPela from './XMLSerializerPela'; import XMLSerializerTango from './XMLSerializerTango'; import Mindmap from '../model/Mindmap'; import XMLMindmapSerializer from './XMLMindmapSerializer'; @@ -35,7 +34,7 @@ const codeToSerializer: { codeName: string, serializer, migrator }[] = [ }, { codeName: ModelCodeName.PELA, - serializer: XMLSerializerPela, + serializer: XMLSerializerTango, migrator: Beta2PelaMigrator, }, { diff --git a/packages/mindplot/src/components/persistence/XMLSerializerPela.ts b/packages/mindplot/src/components/persistence/XMLSerializerPela.ts deleted file mode 100644 index cabe08c4..00000000 --- a/packages/mindplot/src/components/persistence/XMLSerializerPela.ts +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright [2021] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined, createDocument } from '@wisemapping/core-js'; -import { Point } from '@wisemapping/web2d'; -import Mindmap from '../model/Mindmap'; -import { TopicShape } from '../model/INodeModel'; -import ConnectionLine from '../ConnectionLine'; -import FeatureModelFactory from '../model/FeatureModelFactory'; -import NodeModel from '../model/NodeModel'; -import RelationshipModel from '../model/RelationshipModel'; -import XMLMindmapSerializer from './XMLMindmapSerializer'; -import FeatureType from '../model/FeatureType'; - -class XMLSerializerPela implements XMLMindmapSerializer { - private static MAP_ROOT_NODE = 'map'; - - private _idsMap: Record; - - toXML(mindmap: Mindmap): Document { - $assert(mindmap, 'Can not save a null mindmap'); - - const document = createDocument(); - - // Store map attributes ... - const mapElem = document.createElement('map'); - const name = mindmap.getId(); - if ($defined(name)) { - mapElem.setAttribute('name', this._rmXmlInv(name)); - } - const version = mindmap.getVersion(); - if ($defined(version)) { - mapElem.setAttribute('version', version); - } - - document.appendChild(mapElem); - - // Create branches ... - const topics = mindmap.getBranches(); - topics.forEach((topic) => { - const topicDom = this._topicToXML(document, topic); - mapElem.appendChild(topicDom); - }); - - // Create Relationships - const relationships = mindmap.getRelationships(); - relationships.forEach((relationship) => { - if ( - mindmap.findNodeById(relationship.getFromNode()) !== null - && mindmap.findNodeById(relationship.getToNode()) !== null - ) { - // Isolated relationships are not persisted .... - const relationDom = XMLSerializerPela._relationshipToXML(document, relationship); - mapElem.appendChild(relationDom); - } - }); - - return document; - } - - protected _topicToXML(document: Document, topic: NodeModel) { - const parentTopic = document.createElement('topic'); - - // Set topic attributes... - if (topic.getType() === 'CentralTopic') { - parentTopic.setAttribute('central', 'true'); - } else { - const pos = topic.getPosition(); - parentTopic.setAttribute('position', `${pos.x},${pos.y}`); - - const order = topic.getOrder(); - if (typeof order === 'number' && Number.isFinite(order)) { - parentTopic.setAttribute('order', order.toString()); - } - } - - const text = topic.getText(); - if ($defined(text)) { - this._noteTextToXML(document, parentTopic, text); - } - - const shape = topic.getShapeType(); - if ($defined(shape)) { - parentTopic.setAttribute('shape', shape); - - if (shape === TopicShape.IMAGE) { - const size = topic.getImageSize(); - parentTopic.setAttribute( - 'image', - `${size.width},${size.height}:${topic.getImageUrl()}`, - ); - } - } - - if (topic.areChildrenShrunken() && topic.getType() !== 'CentralTopic') { - parentTopic.setAttribute('shrink', 'true'); - } - - // Font properties ... - const id = topic.getId(); - parentTopic.setAttribute('id', id.toString()); - - let font = ''; - - const fontFamily = topic.getFontFamily(); - font += `${fontFamily || ''};`; - - const fontSize = topic.getFontSize(); - font += `${fontSize || ''};`; - - const fontColor = topic.getFontColor(); - font += `${fontColor || ''};`; - - const fontWeight = topic.getFontWeight(); - font += `${fontWeight || ''};`; - - const fontStyle = topic.getFontStyle(); - font += `${fontStyle || ''};`; - - if ( - $defined(fontFamily) - || $defined(fontSize) - || $defined(fontColor) - || $defined(fontWeight) - || $defined(fontStyle) - ) { - parentTopic.setAttribute('fontStyle', font); - } - - const bgColor = topic.getBackgroundColor(); - if ($defined(bgColor)) { - parentTopic.setAttribute('bgColor', bgColor); - } - - const brColor = topic.getBorderColor(); - if ($defined(brColor)) { - parentTopic.setAttribute('brColor', brColor); - } - - const metadata = topic.getMetadata(); - if ($defined(metadata)) { - parentTopic.setAttribute('metadata', metadata); - } - - // Serialize features ... - const features = topic.getFeatures(); - features.forEach((feature) => { - const featureType = feature.getType(); - const featureDom = document.createElement(featureType); - const attributes = feature.getAttributes(); - - const attributesKeys = Object.keys(attributes); - for (let attrIndex = 0; attrIndex < attributesKeys.length; attrIndex++) { - const key = attributesKeys[attrIndex]; - const value = attributes[key]; - if (key === 'text') { - const cdata = document.createCDATASection(this._rmXmlInv(value)); - featureDom.appendChild(cdata); - } else { - featureDom.setAttribute(key, this._rmXmlInv(value)); - } - } - parentTopic.appendChild(featureDom); - }); - - // CHILDREN TOPICS - const childTopics = topic.getChildren(); - childTopics.forEach((childTopic) => { - const childDom = this._topicToXML(document, childTopic); - parentTopic.appendChild(childDom); - }); - - return parentTopic; - } - - protected _noteTextToXML(document: Document, elem: Element, text: string) { - if (text.indexOf('\n') === -1) { - elem.setAttribute('text', this._rmXmlInv(text)); - } else { - const textDom = document.createElement('text'); - const cdata = document.createCDATASection(this._rmXmlInv(text)); - textDom.appendChild(cdata); - elem.appendChild(textDom); - } - } - - static _relationshipToXML(document: Document, relationship: RelationshipModel) { - const result = document.createElement('relationship'); - result.setAttribute('srcTopicId', relationship.getFromNode().toString()); - result.setAttribute('destTopicId', relationship.getToNode().toString()); - - const lineType = relationship.getLineType(); - result.setAttribute('lineType', lineType.toString()); - if (lineType === ConnectionLine.CURVED || lineType === ConnectionLine.SIMPLE_CURVED) { - if ($defined(relationship.getSrcCtrlPoint())) { - const srcPoint = relationship.getSrcCtrlPoint(); - result.setAttribute( - 'srcCtrlPoint', - `${Math.round(srcPoint.x)},${Math.round(srcPoint.y)}`, - ); - } - if ($defined(relationship.getDestCtrlPoint())) { - const destPoint = relationship.getDestCtrlPoint(); - result.setAttribute( - 'destCtrlPoint', - `${Math.round(destPoint.x)},${Math.round(destPoint.y)}`, - ); - } - } - result.setAttribute('endArrow', String(relationship.getEndArrow())); - result.setAttribute('startArrow', String(relationship.getStartArrow())); - return result; - } - - /** - * @param dom - * @param mapId - * @throws will throw an error if dom is null or undefined - * @throws will throw an error if mapId is null or undefined - * @throws will throw an error if the document element is not consistent with a wisemap's root - * element - */ - loadFromDom(dom: Document, mapId: string) { - $assert(dom, 'dom can not be null'); - $assert(mapId, 'mapId can not be null'); - - const rootElem = dom.documentElement; - - // Is a wisemap?. - $assert( - rootElem.tagName === XMLSerializerPela.MAP_ROOT_NODE, - `This seem not to be a map document. Found tag: ${rootElem.tagName}`, - ); - - this._idsMap = {}; - // Start the loading process ... - const version = rootElem.getAttribute('version') || 'pela'; - const mindmap = new Mindmap(mapId, version); - - // Add all the topics nodes ... - const childNodes = Array.from(rootElem.childNodes); - const topicsNodes = childNodes - .filter( - (child: ChildNode) => child.nodeType === 1 && (child as Element).tagName === 'topic', - ) - .map((c) => c as Element); - topicsNodes.forEach((child) => { - const topic = this._deserializeNode(child, mindmap); - mindmap.addBranch(topic); - }); - - // Then all relationshops, they are connected to topics ... - const relationshipsNodes = childNodes - .filter( - (child: ChildNode) => child.nodeType === 1 && (child as Element).tagName === 'relationship', - ) - .map((c) => c as Element); - relationshipsNodes.forEach((child) => { - try { - const relationship = XMLSerializerPela._deserializeRelationship(child, mindmap); - mindmap.addRelationship(relationship); - } catch (e) { - console.error(e); - } - }); - - // Clean up from the recursion ... - this._idsMap = null; - mindmap.setId(mapId); - return mindmap; - } - - protected _deserializeNode(domElem: Element, mindmap: Mindmap) { - const type = domElem.getAttribute('central') != null ? 'CentralTopic' : 'MainTopic'; - - // Load attributes... - let id: number | null = null; - if ($defined(domElem.getAttribute('id'))) { - id = Number.parseInt(domElem.getAttribute('id'), 10); - } - - if (this._idsMap[id]) { - id = null; - } else { - this._idsMap[id] = domElem; - } - - const topic = mindmap.createNode(type, id); - - // Set text property is it;s defined... - const text = domElem.getAttribute('text'); - if ($defined(text) && text) { - topic.setText(text); - } - - const fontStyle = domElem.getAttribute('fontStyle'); - if ($defined(fontStyle) && fontStyle) { - const font = fontStyle.split(';'); - - if (font[0]) { - topic.setFontFamily(font[0]); - } - - if (font[1]) { - topic.setFontSize(Number.parseInt(font[1], 10)); - } - - if (font[2]) { - topic.setFontColor(font[2]); - } - - if (font[3]) { - topic.setFontWeight(font[3]); - } - - if (font[4]) { - topic.setFontStyle(font[4]); - } - } - - const shape = domElem.getAttribute('shape'); - if ($defined(shape)) { - topic.setShapeType(shape); - - if (shape === TopicShape.IMAGE) { - const image = domElem.getAttribute('image'); - const size = image.substring(0, image.indexOf(':')); - const url = image.substring(image.indexOf(':') + 1, image.length); - topic.setImageUrl(url); - - const split = size.split(','); - topic.setImageSize(Number.parseInt(split[0], 10), Number.parseInt(split[1], 10)); - } - } - - const bgColor = domElem.getAttribute('bgColor'); - if ($defined(bgColor)) { - topic.setBackgroundColor(bgColor); - } - - const borderColor = domElem.getAttribute('brColor'); - if ($defined(borderColor)) { - topic.setBorderColor(borderColor); - } - - const order = domElem.getAttribute('order'); - if ($defined(order) && order !== 'NaN') { - // Hack for broken maps ... - topic.setOrder(parseInt(order, 10)); - } - - const isShrink = domElem.getAttribute('shrink'); - // Hack: Some production maps has been stored with the central topic collapsed. This is a bug. - if ($defined(isShrink) && type !== 'CentralTopic') { - topic.setChildrenShrunken(Boolean(isShrink)); - } - - const position = domElem.getAttribute('position'); - if ($defined(position)) { - const pos = position.split(','); - topic.setPosition(Number.parseInt(pos[0], 10), Number.parseInt(pos[1], 10)); - } - - const metadata = domElem.getAttribute('metadata'); - if ($defined(metadata)) { - topic.setMetadata(metadata); - } - - // Creating icons and children nodes - const children = Array.from(domElem.childNodes); - children.forEach((child) => { - if (child.nodeType === Node.ELEMENT_NODE) { - const elem = child as Element; - if (elem.tagName === 'topic') { - const childTopic = this._deserializeNode(elem, mindmap); - childTopic.connectTo(topic); - } else if (FeatureModelFactory.isSupported(elem.tagName)) { - // Load attributes ... - const namedNodeMap = elem.attributes; - const attributes: Record = {}; - - for (let j = 0; j < namedNodeMap.length; j++) { - const attribute = namedNodeMap.item(j); - attributes[attribute.name] = attribute.value; - } - - // Has text node ?. - const textAttr = XMLSerializerPela._deserializeTextAttr(elem); - if (textAttr) { - attributes.text = textAttr; - } - - // Create a new element .... - const featureType = elem.tagName as FeatureType; - const feature = FeatureModelFactory.createModel(featureType, attributes); - topic.addFeature(feature); - } else if (elem.tagName === 'text') { - const nodeText = XMLSerializerPela._deserializeNodeText(child); - topic.setText(nodeText); - } - } - }); - - return topic; - } - - static _deserializeTextAttr(domElem: Element): string { - let value = domElem.getAttribute('text'); - if (!$defined(value)) { - const children = domElem.childNodes; - for (let i = 0; i < children.length; i++) { - const child = children[i]; - if (child.nodeType === Node.CDATA_SECTION_NODE) { - value = child.nodeValue; - } - } - } else { - // Notes must be decoded ... - value = unescape(value); - - // Hack for empty nodes ... - if (value === '') { - value = ' '; - } - } - - return value; - } - - static _deserializeNodeText(domElem) { - const children = domElem.childNodes; - let value = null; - for (let i = 0; i < children.length; i++) { - const child = children[i]; - if (child.nodeType === Node.CDATA_SECTION_NODE) { - value = child.nodeValue; - } - } - return value; - } - - static _deserializeRelationship(domElement, mindmap) { - const srcId = Number.parseInt(domElement.getAttribute('srcTopicId'), 10); - const destId = Number.parseInt(domElement.getAttribute('destTopicId'), 10); - const lineType = Number.parseInt(domElement.getAttribute('lineType'), 10); - const srcCtrlPoint = domElement.getAttribute('srcCtrlPoint'); - const destCtrlPoint = domElement.getAttribute('destCtrlPoint'); - - // If for some reason a relationship lines has source and dest nodes the same, don't import it. - if (srcId === destId) { - throw new Error('Invalid relationship, dest and source are equals'); - } - // Is the connections points valid ?. If it's not, do not load the relationship ... - if (mindmap.findNodeById(srcId) == null || mindmap.findNodeById(destId) == null) { - throw new Error('Transition could not created, missing node for relationship'); - } - - const model = mindmap.createRelationship(srcId, destId); - model.setLineType(lineType); - if ($defined(srcCtrlPoint) && srcCtrlPoint !== '') { - model.setSrcCtrlPoint(Point.fromString(srcCtrlPoint)); - } - if ($defined(destCtrlPoint) && destCtrlPoint !== '') { - model.setDestCtrlPoint(Point.fromString(destCtrlPoint)); - } - model.setEndArrow('false'); - model.setStartArrow('true'); - return model; - } - - /** - * This method ensures that the output String has only - * valid XML unicode characters as specified by the - * XML 1.0 standard. For reference, please see - * the - * standard. This method will return an empty - * String if the input is null or empty. - * - * @param in The String whose non-valid characters we want to remove. - * @return The in String, stripped of non-valid characters. - */ - protected _rmXmlInv(str: string) { - if (str == null || str === undefined) return null; - - let result = ''; - for (let i = 0; i < str.length; i++) { - const c = str.charCodeAt(i); - if ( - c === 0x9 - || c === 0xa - || c === 0xd - || (c >= 0x20 && c <= 0xd7ff) - || (c >= 0xe000 && c <= 0xfffd) - || (c >= 0x10000 && c <= 0x10ffff) - ) { - result += str.charAt(i); - } - } - return result; - } -} - -export default XMLSerializerPela; diff --git a/packages/mindplot/src/components/persistence/XMLSerializerTango.ts b/packages/mindplot/src/components/persistence/XMLSerializerTango.ts index c9bde900..b7551016 100644 --- a/packages/mindplot/src/components/persistence/XMLSerializerTango.ts +++ b/packages/mindplot/src/components/persistence/XMLSerializerTango.ts @@ -15,13 +15,506 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import XMLSerializerPela from './XMLSerializerPela'; +import { $assert, $defined, createDocument } from '@wisemapping/core-js'; +import { Point } from '@wisemapping/web2d'; +import Mindmap from '../model/Mindmap'; +import { TopicShape } from '../model/INodeModel'; +import ConnectionLine from '../ConnectionLine'; +import FeatureModelFactory from '../model/FeatureModelFactory'; +import NodeModel from '../model/NodeModel'; +import RelationshipModel from '../model/RelationshipModel'; +import XMLMindmapSerializer from './XMLMindmapSerializer'; +import FeatureType from '../model/FeatureType'; -/** - * This serializer works exactly the same way as for the former version Pela - */ -class XMLSerializerTango extends XMLSerializerPela { +class XMLSerializerTango implements XMLMindmapSerializer { + private static MAP_ROOT_NODE = 'map'; + + private _idsMap: Record; + + toXML(mindmap: Mindmap): Document { + $assert(mindmap, 'Can not save a null mindmap'); + + const document = createDocument(); + + // Store map attributes ... + const mapElem = document.createElement('map'); + const name = mindmap.getId(); + if ($defined(name)) { + mapElem.setAttribute('name', this._rmXmlInv(name)); + } + const version = mindmap.getVersion(); + if ($defined(version)) { + mapElem.setAttribute('version', version); + } + + document.appendChild(mapElem); + + // Create branches ... + const topics = mindmap.getBranches(); + topics.forEach((topic) => { + const topicDom = this._topicToXML(document, topic); + mapElem.appendChild(topicDom); + }); + + // Create Relationships + const relationships = mindmap.getRelationships(); + relationships.forEach((relationship) => { + if ( + mindmap.findNodeById(relationship.getFromNode()) !== null + && mindmap.findNodeById(relationship.getToNode()) !== null + ) { + // Isolated relationships are not persisted .... + const relationDom = XMLSerializerTango._relationshipToXML(document, relationship); + mapElem.appendChild(relationDom); + } + }); + + return document; + } + + protected _topicToXML(document: Document, topic: NodeModel) { + const parentTopic = document.createElement('topic'); + + // Set topic attributes... + if (topic.getType() === 'CentralTopic') { + parentTopic.setAttribute('central', 'true'); + } else { + const pos = topic.getPosition(); + parentTopic.setAttribute('position', `${pos.x},${pos.y}`); + + const order = topic.getOrder(); + if (typeof order === 'number' && Number.isFinite(order)) { + parentTopic.setAttribute('order', order.toString()); + } + } + + const text = topic.getText(); + if ($defined(text)) { + this._noteTextToXML(document, parentTopic, text); + } + + const shape = topic.getShapeType(); + if ($defined(shape)) { + parentTopic.setAttribute('shape', shape); + + if (shape === TopicShape.IMAGE) { + const size = topic.getImageSize(); + parentTopic.setAttribute( + 'image', + `${size.width},${size.height}:${topic.getImageUrl()}`, + ); + } + } + + if (topic.areChildrenShrunken() && topic.getType() !== 'CentralTopic') { + parentTopic.setAttribute('shrink', 'true'); + } + + // Font properties ... + const id = topic.getId(); + parentTopic.setAttribute('id', id.toString()); + + let font = ''; + + const fontFamily = topic.getFontFamily(); + font += `${fontFamily || ''};`; + + const fontSize = topic.getFontSize(); + font += `${fontSize || ''};`; + + const fontColor = topic.getFontColor(); + font += `${fontColor || ''};`; + + const fontWeight = topic.getFontWeight(); + font += `${fontWeight || ''};`; + + const fontStyle = topic.getFontStyle(); + font += `${fontStyle || ''};`; + + if ( + $defined(fontFamily) + || $defined(fontSize) + || $defined(fontColor) + || $defined(fontWeight) + || $defined(fontStyle) + ) { + parentTopic.setAttribute('fontStyle', font); + } + + const bgColor = topic.getBackgroundColor(); + if ($defined(bgColor)) { + parentTopic.setAttribute('bgColor', bgColor); + } + + const brColor = topic.getBorderColor(); + if ($defined(brColor)) { + parentTopic.setAttribute('brColor', brColor); + } + + const metadata = topic.getMetadata(); + if ($defined(metadata)) { + parentTopic.setAttribute('metadata', metadata); + } + + // Serialize features ... + const features = topic.getFeatures(); + features.forEach((feature) => { + const featureType = feature.getType(); + const featureDom = document.createElement(featureType); + const attributes = feature.getAttributes(); + + const attributesKeys = Object.keys(attributes); + for (let attrIndex = 0; attrIndex < attributesKeys.length; attrIndex++) { + const key = attributesKeys[attrIndex]; + const value = attributes[key]; + if (key === 'text') { + const cdata = document.createCDATASection(this._rmXmlInv(value)); + featureDom.appendChild(cdata); + } else { + featureDom.setAttribute(key, this._rmXmlInv(value)); + } + } + parentTopic.appendChild(featureDom); + }); + + // CHILDREN TOPICS + const childTopics = topic.getChildren(); + childTopics.forEach((childTopic) => { + const childDom = this._topicToXML(document, childTopic); + parentTopic.appendChild(childDom); + }); + + return parentTopic; + } + + protected _noteTextToXML(document: Document, elem: Element, text: string) { + if (text.indexOf('\n') === -1) { + elem.setAttribute('text', this._rmXmlInv(text)); + } else { + const textDom = document.createElement('text'); + const cdata = document.createCDATASection(this._rmXmlInv(text)); + textDom.appendChild(cdata); + elem.appendChild(textDom); + } + } + + static _relationshipToXML(document: Document, relationship: RelationshipModel) { + const result = document.createElement('relationship'); + result.setAttribute('srcTopicId', relationship.getFromNode().toString()); + result.setAttribute('destTopicId', relationship.getToNode().toString()); + + const lineType = relationship.getLineType(); + result.setAttribute('lineType', lineType.toString()); + if (lineType === ConnectionLine.CURVED || lineType === ConnectionLine.SIMPLE_CURVED) { + if ($defined(relationship.getSrcCtrlPoint())) { + const srcPoint = relationship.getSrcCtrlPoint(); + result.setAttribute( + 'srcCtrlPoint', + `${Math.round(srcPoint.x)},${Math.round(srcPoint.y)}`, + ); + } + if ($defined(relationship.getDestCtrlPoint())) { + const destPoint = relationship.getDestCtrlPoint(); + result.setAttribute( + 'destCtrlPoint', + `${Math.round(destPoint.x)},${Math.round(destPoint.y)}`, + ); + } + } + result.setAttribute('endArrow', String(relationship.getEndArrow())); + result.setAttribute('startArrow', String(relationship.getStartArrow())); + return result; + } + + loadFromDom(dom: Document, mapId: string) { + $assert(dom, 'dom can not be null'); + $assert(mapId, 'mapId can not be null'); + + const rootElem = dom.documentElement; + + // Is a wisemap?. + $assert( + rootElem.tagName === XMLSerializerTango.MAP_ROOT_NODE, + `This seem not to be a map document. Found tag: ${rootElem.tagName}`, + ); + + this._idsMap = {}; + // Start the loading process ... + const version = rootElem.getAttribute('version') || 'pela'; + const mindmap = new Mindmap(mapId, version); + + // Add all the topics nodes ... + const childNodes = Array.from(rootElem.childNodes); + const topicsNodes = childNodes + .filter( + (child: ChildNode) => child.nodeType === 1 && (child as Element).tagName === 'topic', + ) + .map((c) => c as Element); + topicsNodes.forEach((child) => { + const topic = this._deserializeNode(child, mindmap); + mindmap.addBranch(topic); + }); + + // Then all relationshops, they are connected to topics ... + const relationshipsNodes = childNodes + .filter( + (child: ChildNode) => child.nodeType === 1 && (child as Element).tagName === 'relationship', + ) + .map((c) => c as Element); + relationshipsNodes.forEach((child) => { + try { + const relationship = XMLSerializerTango._deserializeRelationship(child, mindmap); + mindmap.addRelationship(relationship); + } catch (e) { + console.error(e); + } + }); + + // Clean up from the recursion ... + this._idsMap = null; + mindmap.setId(mapId); + return mindmap; + } + + protected _deserializeNode(domElem: Element, mindmap: Mindmap) { + const type = domElem.getAttribute('central') != null ? 'CentralTopic' : 'MainTopic'; + + // Load attributes... + let id: number | null = null; + if ($defined(domElem.getAttribute('id'))) { + id = Number.parseInt(domElem.getAttribute('id'), 10); + } + + if (this._idsMap[id]) { + id = null; + } else { + this._idsMap[id] = domElem; + } + + const topic = mindmap.createNode(type, id); + + // Set text property is it;s defined... + const text = domElem.getAttribute('text'); + if ($defined(text) && text) { + topic.setText(text); + } + + const fontStyle = domElem.getAttribute('fontStyle'); + if ($defined(fontStyle) && fontStyle) { + const font = fontStyle.split(';'); + + if (font[0]) { + topic.setFontFamily(font[0]); + } + + if (font[1]) { + topic.setFontSize(Number.parseInt(font[1], 10)); + } + + if (font[2]) { + topic.setFontColor(font[2]); + } + + if (font[3]) { + topic.setFontWeight(font[3]); + } + + if (font[4]) { + topic.setFontStyle(font[4]); + } + } + + const shape = domElem.getAttribute('shape'); + if ($defined(shape)) { + topic.setShapeType(shape); + + if (shape === TopicShape.IMAGE) { + const image = domElem.getAttribute('image'); + const size = image.substring(0, image.indexOf(':')); + const url = image.substring(image.indexOf(':') + 1, image.length); + topic.setImageUrl(url); + + const split = size.split(','); + topic.setImageSize(Number.parseInt(split[0], 10), Number.parseInt(split[1], 10)); + } + } + + const bgColor = domElem.getAttribute('bgColor'); + if ($defined(bgColor)) { + topic.setBackgroundColor(bgColor); + } + + const borderColor = domElem.getAttribute('brColor'); + if ($defined(borderColor)) { + topic.setBorderColor(borderColor); + } + + const order = domElem.getAttribute('order'); + if ($defined(order) && order !== 'NaN') { + // Hack for broken maps ... + topic.setOrder(parseInt(order, 10)); + } + + const isShrink = domElem.getAttribute('shrink'); + // Hack: Some production maps has been stored with the central topic collapsed. This is a bug. + if ($defined(isShrink) && type !== 'CentralTopic') { + topic.setChildrenShrunken(Boolean(isShrink)); + } + + const position = domElem.getAttribute('position'); + if ($defined(position)) { + const pos = position.split(','); + topic.setPosition(Number.parseInt(pos[0], 10), Number.parseInt(pos[1], 10)); + } + + const metadata = domElem.getAttribute('metadata'); + if ($defined(metadata)) { + topic.setMetadata(metadata); + } + + // Creating icons and children nodes + const children = Array.from(domElem.childNodes); + children.forEach((child) => { + if (child.nodeType === Node.ELEMENT_NODE) { + const elem = child as Element; + if (elem.tagName === 'topic') { + const childTopic = this._deserializeNode(elem, mindmap); + childTopic.connectTo(topic); + } else if (FeatureModelFactory.isSupported(elem.tagName)) { + // Load attributes ... + const namedNodeMap = elem.attributes; + const attributes: Record = {}; + + for (let j = 0; j < namedNodeMap.length; j++) { + const attribute = namedNodeMap.item(j); + attributes[attribute.name] = attribute.value; + } + + // Has text node ?. + const textAttr = XMLSerializerTango._deserializeTextAttr(elem); + if (textAttr) { + attributes.text = textAttr; + } + + // Create a new element .... + const featureType = elem.tagName as FeatureType; + const feature = FeatureModelFactory.createModel(featureType, attributes); + topic.addFeature(feature); + } else if (elem.tagName === 'text') { + const nodeText = XMLSerializerTango._deserializeNodeText(child); + topic.setText(nodeText); + } + } + }); + + // Workaround: for some reason, some saved maps have holes in the order. + if (topic.getType() !== 'CentralTopic') { + topic + .getChildren() + .forEach((child, index) => { + if (child.getOrder() !== index) { + child.setOrder(index); + console.log('Toppic with order sequence hole. Introducing auto recovery sequence fix.'); + } + }); + } + return topic; + } + + static _deserializeTextAttr(domElem: Element): string { + let value = domElem.getAttribute('text'); + if (!$defined(value)) { + const children = domElem.childNodes; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.nodeType === Node.CDATA_SECTION_NODE) { + value = child.nodeValue; + } + } + } else { + // Notes must be decoded ... + value = unescape(value); + + // Hack for empty nodes ... + if (value === '') { + value = ' '; + } + } + + return value; + } + + static _deserializeNodeText(domElem) { + const children = domElem.childNodes; + let value = null; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.nodeType === Node.CDATA_SECTION_NODE) { + value = child.nodeValue; + } + } + return value; + } + + static _deserializeRelationship(domElement, mindmap) { + const srcId = Number.parseInt(domElement.getAttribute('srcTopicId'), 10); + const destId = Number.parseInt(domElement.getAttribute('destTopicId'), 10); + const lineType = Number.parseInt(domElement.getAttribute('lineType'), 10); + const srcCtrlPoint = domElement.getAttribute('srcCtrlPoint'); + const destCtrlPoint = domElement.getAttribute('destCtrlPoint'); + + // If for some reason a relationship lines has source and dest nodes the same, don't import it. + if (srcId === destId) { + throw new Error('Invalid relationship, dest and source are equals'); + } + // Is the connections points valid ?. If it's not, do not load the relationship ... + if (mindmap.findNodeById(srcId) == null || mindmap.findNodeById(destId) == null) { + throw new Error('Transition could not created, missing node for relationship'); + } + + const model = mindmap.createRelationship(srcId, destId); + model.setLineType(lineType); + if ($defined(srcCtrlPoint) && srcCtrlPoint !== '') { + model.setSrcCtrlPoint(Point.fromString(srcCtrlPoint)); + } + if ($defined(destCtrlPoint) && destCtrlPoint !== '') { + model.setDestCtrlPoint(Point.fromString(destCtrlPoint)); + } + model.setEndArrow('false'); + model.setStartArrow('true'); + return model; + } + + /** + * This method ensures that the output String has only + * valid XML unicode characters as specified by the + * XML 1.0 standard. For reference, please see + * the + * standard. This method will return an empty + * String if the input is null or empty. + * + * @param in The String whose non-valid characters we want to remove. + * @return The in String, stripped of non-valid characters. + */ + protected _rmXmlInv(str: string) { + if (str == null || str === undefined) return null; + + let result = ''; + for (let i = 0; i < str.length; i++) { + const c = str.charCodeAt(i); + if ( + c === 0x9 + || c === 0xa + || c === 0xd + || (c >= 0x20 && c <= 0xd7ff) + || (c >= 0xe000 && c <= 0xfffd) + || (c >= 0x10000 && c <= 0x10ffff) + ) { + result += str.charAt(i); + } + } + return result; + } } -// eslint-disable-next-line camelcase export default XMLSerializerTango; diff --git a/packages/mindplot/src/components/widget/AccountSettingsPanel.js b/packages/mindplot/src/components/widget/AccountSettingsPanel.js index a91d05bc..29e4ebea 100644 --- a/packages/mindplot/src/components/widget/AccountSettingsPanel.js +++ b/packages/mindplot/src/components/widget/AccountSettingsPanel.js @@ -25,7 +25,8 @@ class AccountSettingsPanel extends ListToolbarPanel { // Overwite default behaviour ... }, setValue() { - window.location = '/c/logout'; + const elem = document.getElementById('logoutFrom'); + elem.submit(); }, }; super(elemId, model); @@ -59,6 +60,7 @@ class AccountSettingsPanel extends ListToolbarPanel { content[0].innerHTML = `

${global.accountName}

${global.accountEmail}

+
Logout
diff --git a/packages/mindplot/src/components/widget/IMenu.ts b/packages/mindplot/src/components/widget/IMenu.ts index 1a4fbac8..0ecfd5af 100644 --- a/packages/mindplot/src/components/widget/IMenu.ts +++ b/packages/mindplot/src/components/widget/IMenu.ts @@ -70,10 +70,14 @@ class IMenu { unlockMap(designer: Designer) { const mindmap = designer.getMindmap(); const persistenceManager = PersistenceManager.getInstance(); - persistenceManager.unlockMap(mindmap); + + // If the map could not be loaded, partial map load could happen. + if (mindmap) { + persistenceManager.unlockMap(mindmap.getId()); + } } - save(saveElem: JQuery, designer: Designer, saveHistory: boolean, sync?: boolean) { + save(saveElem: JQuery, designer: Designer, saveHistory: boolean) { // Load map content ... const mindmap = designer.getMindmap(); const mindmapProp = designer.getMindmapProperties(); @@ -106,7 +110,7 @@ class IMenu { } } }, - }, sync); + }); } isSaveRequired(): boolean { diff --git a/packages/mindplot/src/components/widget/Menu.ts b/packages/mindplot/src/components/widget/Menu.ts index 3785a4cf..25ef72cb 100644 --- a/packages/mindplot/src/components/widget/Menu.ts +++ b/packages/mindplot/src/components/widget/Menu.ts @@ -57,7 +57,7 @@ class Menu extends IMenu { return result; }, - setValue(value) { + setValue(value: string) { designer.changeFontFamily(value); }, }; @@ -68,7 +68,7 @@ class Menu extends IMenu { const fontSizeBtn = $('#fontSize'); if (fontSizeBtn) { const fontSizeModel = { - getValue() { + getValue(): number { const nodes = designerModel.filterSelectedTopics(); let result = null; @@ -82,7 +82,7 @@ class Menu extends IMenu { } return result; }, - setValue(value) { + setValue(value: number) { designer.changeFontSize(value); }, }; @@ -297,9 +297,9 @@ class Menu extends IMenu { Menu._registerTooltip('save', $msg('SAVE'), 'meta+S'); if (!readOnly) { - $(window).bind('beforeunload', () => { + window.addEventListener('beforeunload', () => { if (this.isSaveRequired()) { - this.save(saveElem, designer, false, true); + this.save(saveElem, designer, false); } this.unlockMap(designer); }); @@ -310,7 +310,7 @@ class Menu extends IMenu { if (this.isSaveRequired()) { this.save(saveElem, designer, false); } - }, 30000, + }, 10000, ); } } diff --git a/packages/mindplot/src/components/widget/ToolbarNotifier.js b/packages/mindplot/src/components/widget/ToolbarNotifier.ts similarity index 83% rename from packages/mindplot/src/components/widget/ToolbarNotifier.js rename to packages/mindplot/src/components/widget/ToolbarNotifier.ts index cc155dd6..0f063ece 100644 --- a/packages/mindplot/src/components/widget/ToolbarNotifier.js +++ b/packages/mindplot/src/components/widget/ToolbarNotifier.ts @@ -20,16 +20,17 @@ import { $assert } from '@wisemapping/core-js'; import $ from 'jquery'; class ToolbarNotifier { - get container() { + static get container() { return $('#headerNotifier'); } - hide() { + static hide() { this.container.hide(); } - logMessage(msg) { + static show(msg: string, fade: boolean) { $assert(msg, 'msg can not be null'); + // In case of print,embedded no message is displayed .... if (this.container && this.container.length && !this.container.data('transitioning')) { this.container.data('transitioning', true); @@ -37,15 +38,19 @@ class ToolbarNotifier { this.container.css({ left: ($(window).width() - this.container.width()) / 2 - 9, }); - this.container.show().fadeOut(5000); + + if (fade) { + this.container.show().fadeOut(5000); + } else { + this.container.show(); + } } this.container.data('transitioning', false); } } -const toolbarNotifier = new ToolbarNotifier(); -const $notify = (msg) => { - toolbarNotifier.logMessage(msg); +const $notify = (msg: string, fade = true) => { + ToolbarNotifier.show(msg, fade); }; export { $notify }; diff --git a/packages/mindplot/src/index.ts b/packages/mindplot/src/index.ts index 9a3569b5..8c224162 100644 --- a/packages/mindplot/src/index.ts +++ b/packages/mindplot/src/index.ts @@ -22,11 +22,14 @@ import PersistenceManager from './components/PersistenceManager'; import Designer from './components/Designer'; import LocalStorageManager from './components/LocalStorageManager'; import RESTPersistenceManager from './components/RestPersistenceManager'; +import MockPersistenceManager from './components/MockPersistenceManager'; import Menu from './components/widget/Menu'; import DesignerOptionsBuilder from './components/DesignerOptionsBuilder'; import ImageExporterFactory from './components/export/ImageExporterFactory'; import TextExporterFactory from './components/export/TextExporterFactory'; import Exporter from './components/export/Exporter'; +import DesignerKeyboard from './components/DesignerKeyboard'; +import EditorRenderMode from './components/EditorRenderMode'; import { buildDesigner, @@ -47,11 +50,14 @@ export { DesignerBuilder, PersistenceManager, RESTPersistenceManager, + MockPersistenceManager, LocalStorageManager, DesignerOptionsBuilder, buildDesigner, + EditorRenderMode, TextExporterFactory, ImageExporterFactory, Exporter, $notify, + DesignerKeyboard, }; diff --git a/packages/mindplot/src/indexLoader.ts b/packages/mindplot/src/indexLoader.ts index 1d33eee4..e3fd4c64 100644 --- a/packages/mindplot/src/indexLoader.ts +++ b/packages/mindplot/src/indexLoader.ts @@ -57,7 +57,7 @@ const zoomParam = Number.parseFloat(params.get('zoom')); const options = DesignerOptionsBuilder.buildOptions( { persistenceManager: persistence, - readOnly: Boolean(global.readOnly || false), + mode: 'viewonly', mapId: global.mapId, container: 'mindplot', zoom: zoomParam || global.userOptions.zoom, diff --git a/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts b/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts index e22a8470..dbff07d0 100644 --- a/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts +++ b/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts @@ -1,8 +1,6 @@ import path from 'path'; import fs from 'fs'; import { expect, test } from '@jest/globals'; // Workaround for cypress conflict -import Mindmap from '../../../src/components/model/Mindmap'; -import XMLSerializerFactory from '../../../src/components/persistence/XMLSerializerFactory'; import SVGExporter from '../../../src/components/export/SVGExporter'; import { parseXMLFile, setupBlob, exporterAssert } from './Helper'; @@ -12,14 +10,6 @@ describe('SVG export test execution', () => { test.each(fs.readdirSync(path.resolve(__dirname, './input/')) .filter((f) => f.endsWith('.wxml')) .map((filename: string) => filename.split('.')[0]))('Exporting %p suite', async (testName: string) => { - // Load mindmap DOM ... - const mindmapPath = path.resolve(__dirname, `./input/${testName}.wxml`); - const mapDocument = parseXMLFile(mindmapPath, 'text/xml'); - - // Convert to mindmap ... - const serializer = XMLSerializerFactory.createInstanceFromDocument(mapDocument); - const mindmap: Mindmap = serializer.loadFromDom(mapDocument, testName); - // Load SVG ... const svgPath = path.resolve(__dirname, `./input/${testName}.svg`); expect(fs.existsSync(svgPath)).toEqual(true); diff --git a/packages/mindplot/test/unit/export/TextExporterTestSuite.test.ts b/packages/mindplot/test/unit/export/TextExporterTestSuite.test.ts index dec9bb3a..43e7089d 100644 --- a/packages/mindplot/test/unit/export/TextExporterTestSuite.test.ts +++ b/packages/mindplot/test/unit/export/TextExporterTestSuite.test.ts @@ -8,7 +8,8 @@ import { parseXMLFile, setupBlob, exporterAssert } from './Helper'; setupBlob(); -const testNames = fs.readdirSync(path.resolve(__dirname, './input/')) +const testNames = fs + .readdirSync(path.resolve(__dirname, './input/')) .filter((f) => f.endsWith('.wxml')) .map((filename: string) => filename.split('.')[0]); @@ -56,3 +57,18 @@ describe('MD export test execution', () => { await exporterAssert(testName, exporter); }); }); + +describe('MM export test execution', () => { + test.each(testNames)('Exporting %p suite', async (testName: string) => { + // Load mindmap DOM.. + const mindmapPath = path.resolve(__dirname, `./input/${testName}.wxml`); + const mapDocument = parseXMLFile(mindmapPath, 'text/xml'); + + // Convert to mindmap... + const serializer = XMLSerializerFactory.createInstanceFromDocument(mapDocument); + const mindmap: Mindmap = serializer.loadFromDom(mapDocument, testName); + + const exporter = TextExporterFactory.create('mm', mindmap); + await exporterAssert(testName, exporter); + }); +}); diff --git a/packages/mindplot/test/unit/export/expected/bug2.mm b/packages/mindplot/test/unit/export/expected/bug2.mm index 84123d89..3baf15c5 100644 --- a/packages/mindplot/test/unit/export/expected/bug2.mm +++ b/packages/mindplot/test/unit/export/expected/bug2.mm @@ -1,51 +1,51 @@ - - - - - - -

Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica.

-

A diferencia de la práctica tradicional, pretendemos ahondar en el conocimiento partiendo de lo que realmente interesa al niño o niña,

-

ayudándole a que encuentre respuesta a las preguntas que él o ella se plantea.

-

-

Por ese motivo, SaberMás proyecta estar al lado de los niños que necesitan una motivación extra para entender la escuela y fluir en ella,

-

y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.

- - -
- - - - - - - - - - - - - - - - - - - + + + + - + + + + + + - - - - - - + + + + + + + + + + + + + + + + + +

Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica.

+

A diferencia de la práctica tradicional, pretendemos ahondar en el conocimiento partiendo de lo que realmente interesa al niño o niña,

+

ayudándole a que encuentre respuesta a las preguntas que él o ella se plantea.

+

+

Por ese motivo, SaberMás proyecta estar al lado de los niños que necesitan una motivación extra para entender la escuela y fluir en ella,

+

y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.

+ + +
+ + + + +
\ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/bug2.svg b/packages/mindplot/test/unit/export/expected/bug2.svg index 734c61be..2091190d 100644 --- a/packages/mindplot/test/unit/export/expected/bug2.svg +++ b/packages/mindplot/test/unit/export/expected/bug2.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/test/unit/export/expected/bug2.txt b/packages/mindplot/test/unit/export/expected/bug2.txt index a9c943b0..426423e8 100644 --- a/packages/mindplot/test/unit/export/expected/bug2.txt +++ b/packages/mindplot/test/unit/export/expected/bug2.txt @@ -24,6 +24,12 @@ 1.12 Actividades centradas en el contexto cercano 1.13 Flexibilidad en el uso de las lenguas de trabajo (inglés, castellano, esukara?) 1.14 Complementamos el trabajo de la escuela + [Note: Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica. +A diferencia de la práctica tradicional, pretendemos ahondar en el conocimiento partiendo de lo que realmente interesa al niño o niña, +ayudándole a que encuentre respuesta a las preguntas que él o ella se plantea. + +Por ese motivo, SaberMás proyecta estar al lado de los niños que necesitan una motivación extra para entender la escuela y fluir en ella, + y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.] 1.14.1 Cada uno va a su ritmo, y cada cual pone sus límites 1.14.2 Aprendemos todos de todos 1.14.3 Valoramos lo que hemos aprendido diff --git a/packages/mindplot/test/unit/export/expected/bug2.wxml b/packages/mindplot/test/unit/export/expected/bug2.wxml index f62f2f1e..227024c2 100644 --- a/packages/mindplot/test/unit/export/expected/bug2.wxml +++ b/packages/mindplot/test/unit/export/expected/bug2.wxml @@ -1,6 +1,6 @@ -Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica. +<map name="bug2" version="tango"><topic central="true" text="SaberMás" id="1"><topic position="271,-39" order="8" text="Utilización de medios de expresión artística, digitales y analógicos" id="5"/><topic position="-181,-17" order="5" text="Precio también limitado: 100-120?" id="9"/><topic position="132,165" order="14" text="Talleres temáticos" id="2"><topic position="242,57" order="0" text="Naturaleza" id="13"><topic position="362,57" order="0" text="Animales, Plantas, Piedras" id="17"/></topic><topic position="245,84" order="1" text="Arqueología" id="21"/><topic position="236,138" order="2" text="Energía" id="18"/><topic position="244,192" order="3" text="Astronomía" id="16"/><topic position="245,219" order="4" text="Arquitectura" id="20"/><topic position="234,246" order="5" text="Cocina" id="11"/><topic position="234,273" order="6" text="Poesía" id="24"/><topic position="256,111" order="7" text="Culturas Antiguas" id="25"><topic position="378,111" order="0" text="Egipto, Grecia, China..." id="26"/></topic><topic position="248,165" order="8" text="Paleontología" id="38"/></topic><topic position="-168,-49" order="3" text="Duración limitada: 5-6 semanas" id="6"/><topic position="-181,16" order="7" text="Niños y niñas que quieren saber más" id="7"/><topic position="-184,-81" order="1" text="Alternativa a otras actividades de ocio" id="8"/><topic position="255,-6" order="10" text="Uso de la tecnología durante todo el proceso de aprendizaje" id="23"/><topic position="336,-137" order="2" text="Estructura PBL: aprendemos cuando buscamos respuestas a nuestras propias preguntas " id="3"/><topic position="238,-105" order="4" text="Trabajo basado en la experimentación y en la investigación" id="4"/><topic position="-201,48" order="9" text="De 8 a 12 años, sin separación por edades" id="10"/><topic position="-146,81" order="11" text="Máximo 10/1 por taller" id="19"/><topic position="211,-72" order="6" text="Actividades centradas en el contexto cercano" id="37"/><topic position="303,27" order="12" text="Flexibilidad en el uso de las lenguas de trabajo (inglés, castellano, esukara?)" id="22"/><topic position="206,-220" order="0" text="Complementamos el trabajo de la escuela" shape="rounded rectagle" id="27"><note><![CDATA[Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica. A diferencia de la práctica tradicional, pretendemos ahondar en el conocimiento partiendo de lo que realmente interesa al niño o niña, ayudándole a que encuentre respuesta a las preguntas que él o ella se plantea. Por ese motivo, SaberMás proyecta estar al lado de los niños que necesitan una motivación extra para entender la escuela y fluir en ella, - y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá. \ No newline at end of file + y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.]]> \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/bug3.mm b/packages/mindplot/test/unit/export/expected/bug3.mm index dea90ba9..ebbb2f0b 100644 --- a/packages/mindplot/test/unit/export/expected/bug3.mm +++ b/packages/mindplot/test/unit/export/expected/bug3.mm @@ -2,20 +2,20 @@ - - - + +

Identifying new measures or investments that should be implemented.

- + + - - + +

Number of different innovations policy instruments existing in the region as a share of a total number representing a full typology of instruments

@@ -24,42 +24,42 @@
- + - - - + +

Understanding how to design the details of a particular measure and how to implement them.

- - + + + - - + +

Firm's turnover from (new to firm)

product innovation (as a pecentage of total turnover)

- +
- - + +

Increase in the probability to innovate linked to ICT use

(in product innovation, process innovation, organisational innovaton, marketing innovation)

@@ -69,100 +69,100 @@
- - + +

Scientific articles by type of collaboration (per capita)

(international co-authoriship, domestic co-authoriship, single author)

- +
- - + +

Increase in a share of expenditures on technological

-

innovations in the total amount of regional firms’ expenditures, %

+

innovations in the total amount of regional firms’ expenditures, %

- +
- + - + - - + +

Increase in th number of firms with

international/national collaboration on innovation

- +
- - + +

Highly cited scientific articles (as a percentage of

highly cited scientific article in the whole Federation)

- +
- - + +

Patents filed by public research organisations

(as a percentafe of patent application filed under PCT)

- +
- + - + - + - +
- - - + +

Understanding the level of effort the region needs to take to compete on innovation and where to put this effort

- + + - - + +

This is what policy makers care about in the end

@@ -174,24 +174,24 @@
- + - + - + - + @@ -200,21 +200,21 @@ - - + +

WB

- +
- - + +

GCR

@@ -224,36 +224,36 @@ - - + +

GCR

- +
- - - + +

per 100 population aged 25-64

+
- + - - + +

Amount of university and colleague

students per 10 thousands population

@@ -263,8 +263,8 @@
- - + +

Share of employees with higher education in

the total amount of population at the working age

@@ -273,18 +273,18 @@
- + - + - - + +

GCR

@@ -292,7 +292,7 @@
- + @@ -309,7 +309,7 @@ - + @@ -320,8 +320,8 @@ - - + +

GCR

@@ -332,6 +332,7 @@ + @@ -340,8 +341,8 @@ - - + +

: the percentage of the workforce employed by foreign companies [%].

@@ -354,39 +355,39 @@
- - - + +

: exports as a share of total output in manufacturing and services [%].

+
- - + +

Share of high-technology export in the total volume

of production of goods, works and services

- +
- - + +

Share of innovation production/serivces that goes for export,

by zones (EU, US, CIS, other countries

- +
@@ -394,8 +395,8 @@ - - + +

GEM

@@ -404,8 +405,8 @@
- - + +

GEM

@@ -414,8 +415,8 @@
- - + +

GEM

@@ -427,8 +428,8 @@ - - + +

UNESCO

@@ -437,8 +438,8 @@
- - + +

CIS

@@ -447,8 +448,8 @@
- - + +

Share of Innovative companies collaborating

with research institutions on innovation

@@ -458,8 +459,8 @@
- - + +

Number of joint projects conducted by the local comapnies

and local consulting/intermediary agencies

@@ -472,8 +473,8 @@ - - + +

GCR

@@ -482,8 +483,8 @@
- - + +

Share of expenditures on technological innovations

in the amount of sales

@@ -492,12 +493,12 @@
- + - - + +

Investments in ICT by asset (IT equipment,

communication equipment, software)

@@ -509,18 +510,18 @@ - - + +

Level of energy efficiency of the regional economy

(can be measured by sectors and for the whole region)

- +
- +
@@ -528,8 +529,8 @@ - - + +

CIS, BEEPS

@@ -542,19 +543,19 @@ - + - + - - + +

Number of new organizations per thousand working age population (WBI)

@@ -563,8 +564,8 @@
- - + +

(as a percentage of all registered corporations)

@@ -577,8 +578,8 @@ - - + +

Amount of domestically protected intellectual

property per 1 mln. population

@@ -590,15 +591,15 @@ - - + +

Number of intellectual property exploited by regional

enterprises per 1 mln. population

- +
@@ -610,8 +611,8 @@ - - + +

Number of advanced ICT introduced in the budgetary organizations

(regional power, municipal bodies, social and educational organizations)

@@ -622,8 +623,8 @@ - - + +

Number of management innovations introduced in the budgetary organizations

(regional power, municipal bodies, social and educational organizations)

@@ -638,15 +639,15 @@ - - + +

Number of interactions between universities

and large companies by university size

- +
@@ -660,8 +661,8 @@ - - + +

Publications: Academic articles in international peer-reviewed

journals per 1,000 researchers [articles/1,000 researchers].

@@ -675,8 +676,8 @@ - - + +

Number of measures offered by the unversity within a preset range (NCET2 survey)

@@ -688,8 +689,8 @@ - - + +

Academic licenses: Number of licenses

per 1,000 researchers.[licenses/researcher]

@@ -701,13 +702,7 @@ - - - -

Number of spin-offs with external private financing

-

as a share of the institution's R&D budget

- - + 1:146: unclosed tag: p
@@ -715,8 +710,8 @@ - - + +

Foreign contracts: Number of contracts with foreign industria

l companies at scientific and educational organizations

@@ -728,13 +723,7 @@ - - - -

Revenue raised from industry R&D as a fraction

-

of total institutional budget (up to a cap)

- - + 1:142: unclosed tag: p
@@ -744,8 +733,8 @@ - - + +

(design firms, IP consultants, etc.)

@@ -754,8 +743,8 @@
- - + +

(e.g. accelerators, incubators)

@@ -774,29 +763,28 @@ -
- - - + +

Understanding which measures should be strengthened, dropped or improved, and how.

- + + - - + +

WIPO SURVEY OF INTELLECTUAL PROPERTY SERVICES OF

EUROPEAN TECHNOLOGY INCUBATORS

@@ -807,8 +795,8 @@ - - + +

Gazelle tenant: Share of tenants with

annual revenue growth of more than 20%

@@ -819,8 +807,8 @@
- - + +

Globalization of tenants: Median share of tenant

revenues obtained from exports [%]

@@ -839,8 +827,8 @@ - - + +

Perception (opinion poll) of business managers

regarding public support programmes

@@ -852,28 +840,28 @@ - - + +

Perception of business managers in terms

of level of transparency of support measures in the region

- +
- - + +

Description by regional business managers of the way the

select and apply for regional and federal support schemes

- +
@@ -883,11 +871,11 @@ - + - - + +

JL: not sure how this would be measured

@@ -896,12 +884,12 @@
- + - + @@ -914,7 +902,7 @@ - + @@ -922,10 +910,10 @@ - + - + @@ -933,63 +921,54 @@ - - + +

Average leverage of 1rub (there would be

several programs with different leverage)

- +
- - + +

Volume of attracted money per one ruble

of regional budget expenditures on innovation projects

- +
-
- - - - - - - - - + - - - + +

Understanding what investments should be made in innovative projects.

- + + - + - - + +

Growth of the volume of production in the cluster companies

to the volume of state support for the cluster

@@ -1023,8 +1002,8 @@ - - + +

FASIE projects: Number of projects supported

by the FASIE per 1,000 workers [awards/worker]

@@ -1035,9 +1014,17 @@
- + + + + + + + + + \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/bug3.svg b/packages/mindplot/test/unit/export/expected/bug3.svg index da316b24..f2f5ff45 100644 --- a/packages/mindplot/test/unit/export/expected/bug3.svg +++ b/packages/mindplot/test/unit/export/expected/bug3.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/test/unit/export/expected/bug3.txt b/packages/mindplot/test/unit/export/expected/bug3.txt index 56e3d0a9..99806130 100644 --- a/packages/mindplot/test/unit/export/expected/bug3.txt +++ b/packages/mindplot/test/unit/export/expected/bug3.txt @@ -1,13 +1,16 @@ 1 Indicator needs 1.1 Which new measures + [Note: Identifying new measures or investments that should be implemented.] 1.1.1 Landscape of measures 1.1.1.1 Diversity index of innovation support instruments in the region + [Note: Number of different innovations policy instruments existing in the region as a share of a total number representing a full typology of instruments] 1.1.1.2 Existing investments in measures 1.1.2 What other regions do differently 1.1.2.1 Balance of measure index 1.1.2.2 Profile comparison with other regions 1.1.2.3 Number of specific types of measures per capita 1.2 How to design & implement measures + [Note: Understanding how to design the details of a particular measure and how to implement them.] 1.2.1 Good practices 1.2.2 Diagnostics 1.2.2.1 Internal business innovation factors @@ -34,7 +37,9 @@ highly cited scientific article in the whole Federation) 1.2.2.2.13 Number of innovative companies to the number of researchers 1.2.2.2.14 Volume of license agreements to the volume of R&D support from the regional budget 1.3 How much effort: where & how + [Note: Understanding the level of effort the region needs to take to compete on innovation and where to put this effort] 1.3.1 The bottom-line + [Note: This is what policy makers care about in the end] 1.3.1.1 Wages 1.3.1.1.1 Dynamics of real wages 1.3.1.1.2 Average wage (compare to the Fed) @@ -54,13 +59,17 @@ highly cited scientific article in the whole Federation) 1.3.2.1.3 Manufacturing value added per capita (non-natural resource-based) 1.3.2.2 The enabling environment 1.3.2.2.1 Ease of doing business + [Note: WB] 1.3.2.2.1.1 Level of administrative barriers (number and cost of administrative procedures) 1.3.2.2.2 Competition index + [Note: GCR] 1.3.2.2.3 Workforce 1.3.2.2.3.1 Quality of education + [Note: GCR] 1.3.2.2.3.1.1 Inrease in the number of International students 1.3.2.2.3.2 Quantity of education 1.3.2.2.3.2.1 Participation in life-long learning + [Note: per 100 population aged 25-64] 1.3.2.2.3.2.2 Increase in literarecy 1.3.2.2.3.2.3 Amount of university and colleague students per 10 thousands population @@ -71,6 +80,7 @@ the total amount of population at the working age 1.3.2.2.3.2.7 Access to training, information, and consulting support 1.3.2.2.3.3 Science & engineering workforce 1.3.2.2.3.3.1 Availability of scientists and engineers + [Note: GCR] 1.3.2.2.3.3.2 Amount of researches per 10 thousands population 1.3.2.2.3.3.3 Average wage of researches per average wage in the region 1.3.2.2.3.3.4 Share of researchers in the total number of employees in the region @@ -89,6 +99,7 @@ the total amount of population at the working age 1.3.2.2.5.2.2 Number of Business Angels 1.3.2.2.6 ICT 1.3.2.2.6.1 ICT use + [Note: GCR] 1.3.2.2.6.2 Broadband penetration 1.3.2.2.6.3 Internet penetration 1.3.2.2.6.4 Computer literacy @@ -98,11 +109,13 @@ the total amount of population at the working age 1.3.2.3.1.1.1 foreign JVs 1.3.2.3.1.1.2 Inflow of foreign direct investments in high-technology industries 1.3.2.3.1.1.3 Foreign direct investment jobs + [Note: : the percentage of the workforce employed by foreign companies [%]. ] 1.3.2.3.1.1.4 FDI as a share of regional non natural resource-based GRP 1.3.2.3.1.1.5 Number of foreign subsidiaries operating in the region 1.3.2.3.1.1.6 Share of foreign controlled enterprises 1.3.2.3.1.2 Exports 1.3.2.3.1.2.1 Export intensity in manufacturing and services + [Note: : exports as a share of total output in manufacturing and services [%].] 1.3.2.3.1.2.2 Share of high-technology export in the total volume of production of goods, works and services 1.3.2.3.1.2.3 Share of innovation production/serivces that goes for export, @@ -110,12 +123,17 @@ by zones (EU, US, CIS, other countries 1.3.2.3.1.3 Share of high-technology products in government procurements 1.3.2.3.2 Entrepreneurship culture 1.3.2.3.2.1 Fear of failure rate + [Note: GEM] 1.3.2.3.2.2 Entrepreneurship as desirable career choice + [Note: GEM] 1.3.2.3.2.3 High Status Successful Entrepreneurship + [Note: GEM] 1.3.2.3.3 Collaboration & partnerships 1.3.2.3.3.1 Number of business contracts with foreign partners for R&D collaboration 1.3.2.3.3.2 Share of R&D financed from foreign sources + [Note: UNESCO] 1.3.2.3.3.3 Firms collaborating on innovation with organizations in other countries + [Note: CIS] 1.3.2.3.3.4 Share of Innovative companies collaborating with research institutions on innovation 1.3.2.3.3.5 Number of joint projects conducted by the local comapnies @@ -123,6 +141,7 @@ with research institutions on innovation 1.3.2.3.3.6 science and industry links 1.3.2.3.4 Technology absorption 1.3.2.3.4.1 Local supplier quality + [Note: GCR] 1.3.2.3.4.2 Share of expenditures on technological innovations in the amount of sales 1.3.2.3.4.3 Number of purchased new technologies @@ -137,6 +156,7 @@ in the amount of sales 1.3.2.3.5.1 Share of innovative companies 1.3.2.3.5.2 Business R&D expenditures per GRP 1.3.2.3.5.3 Factors hampering innovation + [Note: CIS, BEEPS] 1.3.2.3.5.4 Expenditure on innovation by firm size 1.3.2.3.5.5 R&D and other intellectl property products 1.3.2.3.5.6 Growth of the number of innovative companies @@ -147,7 +167,9 @@ in the amount of sales 1.3.2.3.5.7.4 Volume of innovation production per capita 1.3.2.3.6 Entrepreneurial activities 1.3.2.3.6.1 New business density + [Note: Number of new organizations per thousand working age population (WBI)] 1.3.2.3.6.2 Volume of newly registered corporations + [Note: (as a percentage of all registered corporations)] 1.3.2.3.6.3 Share of gazelle companies in the total number of businesses 1.3.2.3.7 R&D production 1.3.2.3.7.1 Outputs @@ -185,6 +207,7 @@ and large companies by university size 1.3.2.4.1.3.2 Number of foreign patents granted per staff 1.3.2.4.1.4 Supportive measures 1.3.2.4.1.4.1 Diversity index of university entrepreneurship support measures + [Note: Number of measures offered by the unversity within a preset range (NCET2 survey)] 1.3.2.4.1.5 Commercialization 1.3.2.4.1.5.1 Licensing 1.3.2.4.1.5.1.1 Academic licenses: Number of licenses @@ -203,7 +226,9 @@ of total institutional budget (up to a cap) 1.3.2.4.1.5.3.5 Difficulties faced by research organization in collaborating with SMEs 1.3.2.4.2 Private market 1.3.2.4.2.1 Number of innovation & IP services organizations + [Note: (design firms, IP consultants, etc.)] 1.3.2.4.2.2 Number of private innovation infrastructure organizations + [Note: (e.g. accelerators, incubators)] 1.3.2.4.2.3 Access to certification and licensing for specific activities 1.3.2.4.2.4 Access to suppliers of equipment, production and engineering services 1.3.2.4.3 Innovation infrastructure @@ -215,11 +240,14 @@ of total institutional budget (up to a cap) 1.3.2.4.3.1.5 Volume of venture financing from the regional budget 1.3.2.4.3.2 Volume of state support per one company 1.4 What to do about existing measures + [Note: Understanding which measures should be strengthened, dropped or improved, and how.] 1.4.1 Demand for measure 1.4.1.1 Quality of beneficiaries 1.4.1.1.1 Growth rates of employment in supported innovative firms 1.4.1.1.2 Growth rates of employment in supported innovative firms 1.4.1.1.3 Role of IP for tenants/clients + [Note: WIPO SURVEY OF INTELLECTUAL PROPERTY SERVICES OF +EUROPEAN TECHNOLOGY INCUBATORS] 1.4.1.1.4 Share of tenants with innovation activities 1.4.1.1.5 Gazelle tenant: Share of tenants with annual revenue growth of more than 20% @@ -247,6 +275,7 @@ select and apply for regional and federal support schemes 1.4.1.4.4 Increase in the number of start-ups applying for a place in the incubators 1.4.2 Inputs of measures 1.4.2.1 Qualified staff + [Note: JL: not sure how this would be measured] 1.4.2.2 Budget per beneficiary 1.4.3 Performance of measure 1.4.3.1 Implementation of measure @@ -275,6 +304,7 @@ several programs with different leverage) 1.4.4.5 Volume of attracted money per one ruble of regional budget expenditures on innovation projects 1.5 What investments in innovative projects + [Note: Understanding what investments should be made in innovative projects.] 1.5.1 Competitive niches 1.5.1.1 Clusters behavior 1.5.1.1.1 Cluster EU star rating diff --git a/packages/mindplot/test/unit/export/expected/cdata-support.mm b/packages/mindplot/test/unit/export/expected/cdata-support.mm index a24159e1..99cdd7d4 100644 --- a/packages/mindplot/test/unit/export/expected/cdata-support.mm +++ b/packages/mindplot/test/unit/export/expected/cdata-support.mm @@ -1,8 +1,8 @@ - - + +

Always ask

diff --git a/packages/mindplot/test/unit/export/expected/cdata-support.svg b/packages/mindplot/test/unit/export/expected/cdata-support.svg index fc72e521..98152aa4 100644 --- a/packages/mindplot/test/unit/export/expected/cdata-support.svg +++ b/packages/mindplot/test/unit/export/expected/cdata-support.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/test/unit/export/expected/cdata-support.txt b/packages/mindplot/test/unit/export/expected/cdata-support.txt index 2a4c9589..dbeb38e6 100644 --- a/packages/mindplot/test/unit/export/expected/cdata-support.txt +++ b/packages/mindplot/test/unit/export/expected/cdata-support.txt @@ -1,11 +1,22 @@ 1 Observation + [Note: Always ask ] 2 Data Analysis + [Note: You always check your data to see if it is correct and then you check it and organize the data that you have to make sure that it is right ] 3 Organizing Data + [Note: Organize your data when you are doing an experiment ] 4 Questions + [Note: Always ask your self a question when analysis the data it is a good idea to do.] 5 Hypothesis + [Note: You make your hypothesis when you are making your observation.] 6 Experiment + [Note: Always analysis your data and keep it in order when you are doing an experiment.] 7 Variable + [Note: A major factor that can change the outcome in an experiment.] 8 Independent Variable + [Note: When you change it you the see affect or the aftermath of what happened ] 9 Control Group + [Note: A test That can be compared ] 10 Dependent Variable + [Note: Changes the outcome of the other variables] 11 Constant + [Note: Doesnt Change at all maybe once and a while but never that often] diff --git a/packages/mindplot/test/unit/export/expected/complex.mm b/packages/mindplot/test/unit/export/expected/complex.mm index 590d1a4d..952ac68b 100644 --- a/packages/mindplot/test/unit/export/expected/complex.mm +++ b/packages/mindplot/test/unit/export/expected/complex.mm @@ -1,50 +1,51 @@ - - + + - - + + - - - - - + + - + + + + + + + + + + + + + + + + +

HR Vision: Freeform Solutions is successful at its mission, sustainable as an organization AND is a great place to work.

+

HR Mission: To provide a positive HR service experience for applicants and employees, and collaborate with departments to recruit, develop, support, and retain diverse and talented employees who are the key to Freeform’s reputation and success.

+ + +
+ +
+ + + + + + + + + + - - - - - - - - - - - - -

- - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/complex.svg b/packages/mindplot/test/unit/export/expected/complex.svg index 3466503b..343f1cef 100644 --- a/packages/mindplot/test/unit/export/expected/complex.svg +++ b/packages/mindplot/test/unit/export/expected/complex.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/test/unit/export/expected/complex.txt b/packages/mindplot/test/unit/export/expected/complex.txt index e08f33ea..a581e8a2 100644 --- a/packages/mindplot/test/unit/export/expected/complex.txt +++ b/packages/mindplot/test/unit/export/expected/complex.txt @@ -1,55 +1,112 @@ 1 PPM Plan 1.1 Business Development - 1.2 Backlog Management [link: https://docs.google.com/a/freeform.ca/drawings/d/1mrtkVAN3_XefJJCgfxw4Va6xk9TVDBKXDt_uzyIF4Us/edit] + 1.2 Backlog Management + [Link: https://docs.google.com/a/freeform.ca/drawings/d/1mrtkVAN3_XefJJCgfxw4Va6xk9TVDBKXDt_uzyIF4Us/edit] 1.3 Freeform IT 1.4 Client Project Management 1.5 Governance & Executive 1.6 Finance 1.7 Administration 1.8 Human Resources + [Note: HR Vision: Freeform Solutions is successful at its mission, sustainable as an organization AND is a great place to work. +HR Mission: To provide a positive HR service experience for applicants and employees, and collaborate with departments to recruit, develop, support, and retain diverse and talented employees who are the key to Freeform’s reputation and success.] 1.9 Freeform Hosting 1.10 Community Outreach 1.11 R&D 1.11.1 Goals 1.11.2 Formulize 1.12 Probono + 1.12.1 2 Strategy 2: Talent Development + [Note: Strategy #2: Support the talent development of our employees through professional development and learning and through improved performance management.] 2.1 Strategic Priority 2a: Personal Plans + [Note: Each employee will have a personal Professional Development Plan. ] 2.2 Strategic Priority 2b: External learning matches organ. goals + [Note: Each department of Freeform will identify areas that need development to meet overall FS goals. Eg. Project Manager may identify needed improvement in a development tool. Or... Bus. Dev. may identify a new need in NFP that FS could fill within mandate, if training were provided. Professional Dev. priority will be given to proposals for development with clear ROIs.] 2.3 Strategic Priority 2c: Learning Environment + [Note: Learning and innovation are an essential part of providing the best solutions to NFPs. Cost effective internal learning and time to explore innovation will be encouraged, provided they conform with organization goal and clear ROI is demonstrated.] 2.4 So That... + [Note: (So that... our employees have improved skills and knowledge, So that... they are highly competent and can work well in agile teams and feel fulfilled and self actualized... So that we can so the best work possible, for the least cost, in the shortest time for other NFPs, So that... NFPs can help those who need it.)] 3 Strategy 4: Inclusive, Positive Environment + [Note: Strategy #4: Foster a diverse, inclusive community with a positive work environment.] 3.1 Strategic Priority 4a:Feedback + [Note: Conduct regular organizational feedback assessments and collaborate to improve the work climate] 3.2 Strategic Priority 4b: Anti Harassment + [Note: Educate employees on the prevention of harassment and discrimination and productive ways to resolve conflict] 3.3 Strategic Priority 4c: Diversity - 3.4 So That... + [Note: Insure we promote our commitment to diversity and non-discrimination through our actions and in our outreach and employee recruitment efforts] + 3.4 + 3.5 So That... + [Note: (So that... we can reflect the diverse populations we serve AND ensure everyone feels safe, respected and included, So that... we better serve our diverse client organizations AND we are a great place to work )] 4 Strategy 1: Recruit & Retain + [Note: Recruit and retain top talent commensurate with identified organizational capacity requirements ] 4.1 So that... + [Note: (So that... we find and keep good people, So that... they are highly competent and can work well in agile teams... So that we can so the best work possible, for the least cost, in the shortest time for other NFPs, So that... NFPs can help those who need it.)] 4.2 Strategic Priority 1a: Recruitment + [Note: 1. Identify and use proactive and effective recruitment strategies, ] 4.2.1 Modify App Form + [Note: Recently, I saw a few job posts sent through different community +groups and they seem to be taking our idea of screening candidates +to a next level. Not only they ask candidates to provide resume and +cover letter + some project related information but also request +written answers to questions like "Why are you interested in this +position" etc. That allows to screen out people who just submit +multiple resumes to multiple organizations without really applying +for that particular job and it would make our interview process more +straightforward, knowing answers to some questions. + +For example, we may want to always include in the screening +questions: +- Why do you want to work for Freeform Solutions? +- Why are you interested in this position? +- What's your experience working with NFP? +- What's your experience working with Open Source software? +etc. + +I also saw that people ask for references up front, in that +submissions form. We could include the HR requirement that Heather +brought recently for "permissions to ask your references about you" +in the online form so that we don't have to follow up with this +later. + +Attached below a sample of such screening questions] 4.2.2 Strategy integrated with hiring plan + [Note: Hiring plan should be comprehensive... not Agile or Iterative, in the sense that staff capacity and skill needs should be met within at least a six month plan. If three Drupal developers are needed, the hiring should be done concurrently to minimize HR costs and time.] 4.3 Strategic Priority 1b: Hiring + [Note: 2. Continue to practice our unique Freeform hiring process that balances fit with the Freeform culture and best talent ] 4.4 Strategic Priority 1c: Onboarding + [Note: ] 4.4.1 3 Month Onboarding Process 4.4.2 Tools & Guidelines 4.4.3 Mentoring 4.5 Strategic Priority 1d: Incentives + [Note: 5. Explore incentives - monetary, benefits, fulfilment - needed to encourage top talent to work for and remain working for an NFP] 4.5.1 Raises 4.5.2 Benefits 4.5.3 Rewards Message + [Note: Create a total rewards message to encourage prospective and current employees to understand the full value of working for Freeform] 4.6 Strategic Priority 1e: Offboarding + [Note: Assess and address reasons why talented people leave Freeform] 5 Business Development Plan 5.1 Goals 5.1.1 Increase new clients 5.1.1.1 Academic Research + 5.1.1.2 5.1.2 Support New Products 5.1.2.1 Formulize + 5.1.2.2 + 5.1.2.3 5.1.3 Support CiviCRM 5.1.4 Identify Opportunites + 5.1.4.1 + 5.1.4.2 + 5.1.4.3 + 5.1.4.4 6 Hosting NG Plan 7 Freeform IT Plan 7.1 Fragile 7.2 Tools + 7.3 8 Project Teams 8.1 Projects 1-3 8.2 Projects 4-6 @@ -62,17 +119,45 @@ 9.3 Supportive Systems Plan 10 Board and C Planning 10.1 Mission Statements + [Note: In the absence of one clearly defined mission statement, we have reviewed various expressed mission statement as following + + Objects of Incorporation in Letters Patent + The objects of the Corporation are:To provide solutions that facilitate the effective use of information technology in not-for-profit, non-governmental, and charitable organizations throughout Canada, to support and improve their mission delivery. + 2006 Strategic Business Plan - Brand Positioning + We are a nonprofit dedicated to helping other nonprofits understand and employ technology appropriately and effectively to support their mission. Our mission is to provide flexible consulting, website development, and Internet hosting solutions that give you peace of mind and help you stay focused on your mission. + Freeform One Page (Freeform Wiki) + About Freeform Solutions: Freeform Solutions is a not-for-profit organization. Our mission is help (sic) other not-for-profits organizations to build their capacity and increase their effectiveness. + Result of Google search for “Freeform Solutions mission” + Freeform Solutions is a not-for-profit organization. Our mission is to help other not-for-profits use technology to build their capacity and increase their effectiveness. (www.freeformsolutions.ca/en/files/AboutFreeformSolutions.pdf + Freeform Solutions (www.freeformsolutions.ca) is a non profit organization. Our mission is to help other non-profit organizations to realize their missions through the appropriate deployment of information and knowledge management systems.www.freeformsolutions.ca/en/sites/default/.../virtual.volunteering.pdf + We are a not-for-profit organization (NFP) that helps other NFPs use IT to achieve their organizational goals and better serve their communities. Freeform Solutions is a nonprofit organization dedicated to helping other nonprofit organizations understand and employ technology appropriately and effectively to support their missions. Our mission is to provide flexible consulting, website development, and hosting solutions http://socialinnovation.ca/community/organizations/freeform-solutions + Freeform Solutions is a not-for-profit organization, with a mission to help other not-for-profits use technology more effectively to meet their own missions. http://timreview.ca/article/387 + Freeform Solutions – their mission: “we help not-for-profit organisations use technology to build their capacity and increase their effectiveness. http://www.warnerlaw.ca/links/community-organisations-and-local-businesses/ + Freeform Solutions is a not-for-profit organization with a mission to help other not-for-profits use technology to meet their goals. http://xoops.org/modules/news/article.php?storyid=3860 + At Freeform Solutions, we have a mission to help not-for-profit and public sector organizations use technology more effectively. http://osbrca.blogspot.ca/2010/07/development-commons-approach.html + Freeform Solutions Facebook Page + Mission: Freeform Solutions is a not-for-profit organization (NFP) that helps other NFPs use IT to achieve their organizational goals and better serve their communities. + The current Freeform Solutions website + We started Freeform to help NFPs use IT to achieve their organizational goals and better serve their communities - to support and improve their mission delivery. Our mission is to strengthen the capacity of NFPs and the voluntary sector, and to help build a civil society.] 10.2 Values 10.3 Bylaw Review 10.4 Policies 10.5 Business Plan 11 Strategy 3: Safety and Wellness + [Note: Strategy # 3: Promote the achievement of safety and wellness in our virtual employee community.] 11.1 Strategic Priority 3a: H&S Policies & Practices + [Note: Continuing improvement in Health and Safety policies and practices & compliance with OHSC legislation] + 11.1.1 11.2 Strategic Priority 3b: Health Promotion + [Note: Promoting safety, work-life balance, self-care, ergonomics and other factors for wellness and productivity in a virtual workplace environment] 11.2.1 Health and Wellness Committee - 11.2.2 Work-life Balance Initiative [link: http://hrcouncil.ca/hr-toolkit/workplaces-health-safety.cfm] + [Note: The Freeform H&S rep will lead a Health and Wellness Committee to responsible for recognizing health and safety concerns and identifying solutions.] + 11.2.2 Work-life Balance Initiative + [Link: http://hrcouncil.ca/hr-toolkit/workplaces-health-safety.cfm] 11.3 So that... + [Note: (So that... our employees remain well and safe, So that... they are highly competent and can work well in agile teams and feel fulfilled and self actualized... So that we can so the best work possible, for the least cost, in the shortest time for other NFPs, So that... NFPs can help those who need it.)] 12 Benefits + [Note: As Freeform Employees we will have benefits reviewed in light of our priorities and cost to Freeform] 12.1 As Freeform Staff 12.2 Responsibility: HZ, JC 12.3 Release 3 @@ -81,54 +166,90 @@ 12.6 Have JC & HZ consult with staff 12.7 Have best benefits we can afford 12.8 So that... + [Note: so that our efforts to excel are rewarded.] 13 Community Outreach Plan 13.1 Goals 13.2 CSI 13.3 Drupal Community 13.4 CiviCRM 13.5 Other -14 Backlog Plan [link: https://docs.google.com/a/freeform.ca/drawings/d/1mrtkVAN3_XefJJCgfxw4Va6xk9TVDBKXDt_uzyIF4Us/edit] - 14.1 Go To Backlog Plan [link: https://docs.google.com/a/freeform.ca/drawings/d/1mrtkVAN3_XefJJCgfxw4Va6xk9TVDBKXDt_uzyIF4Us/edit] +14 Backlog Plan + [Link: https://docs.google.com/a/freeform.ca/drawings/d/1mrtkVAN3_XefJJCgfxw4Va6xk9TVDBKXDt_uzyIF4Us/edit] + 14.1 Go To Backlog Plan + [Link: https://docs.google.com/a/freeform.ca/drawings/d/1mrtkVAN3_XefJJCgfxw4Va6xk9TVDBKXDt_uzyIF4Us/edit] 15 Strategy Prospecting + 15.1 + 15.2 + 15.3 16 Stategies: Forecasting + 16.1 + 16.2 + 16.3 17 Strategies Marketing -18 Exit Interviews - 18.1 As Freeform - 18.2 Responsiblity: HZ, KS - 18.3 Release - 18.4 Have Heather write procedures for exit interview process - 18.5 So that -19 3 Month Onboarding Process -20 Human Resources Plan - 20.1 Related Org Objectives - 20.1.1 1 - 20.1.2 2 - 20.1.3 3 - 20.1.4 4 - 20.2 Related Documents - 20.3 Goals - 20.3.1 Goal:Staff=Optimal Bus. Growth - 20.3.1.1 So that... - 20.3.1.2 Related Strategic Priorities: - 20.3.1.3 KPI: HR Level equals Planned Growth - 20.3.1.4 Methodology - 20.3.1.4.1 Target - 20.3.2 Goal: Increase Job Satisfaction - 20.3.2.1 So That - 20.3.2.2 Related Strategic Priorities - 20.3.2.3 KPI: Employee Satisfaction - 20.3.2.4 Methodology - 20.3.2.4.1 Target - 20.3.3 Goal: Improve Performance - 20.3.3.1 So That - 20.3.3.2 Related Strategic Priorities - 20.3.3.3 KPI: Employee Performance - 20.3.3.4 Methodology - 20.3.3.4.1 Target - 20.3.4 Goal: Reduce Turnover - 20.3.4.1 So That - 20.3.4.2 Related Strategic Priorities - 20.3.4.3 KPI: Retention Rate - 20.3.4.4 Methodology - 20.3.4.4.1 Target - 20.3.5 Risk & Compliance +18 +19 Exit Interviews + 19.1 As Freeform + 19.2 Responsiblity: HZ, KS + 19.3 Release + 19.4 Have Heather write procedures for exit interview process + 19.5 So that + [Note: We learn from our mistakes and missed opportunities in future with the goal of keeping the best talent.] +20 3 Month Onboarding Process +21 Human Resources Plan + 21.1 Related Org Objectives + 21.1.1 1 + [Note: Attract, build and retain a motivated, agile, knowledgeable team of Top Talent that loves to “come” to work] + 21.1.2 2 + [Note: Maintain level of human resource capacity and skill to meet planned growth and client contractual commitments] + 21.1.3 3 + [Note: Conform to all legislated requirements] + 21.1.4 4 + [Note: Minimize and mitigate risk to the organization] + 21.2 Related Documents + [Note: MIssion, Values, Principles, Org Business Plan, Human Resources Policy Manual] + 21.3 Goals + 21.3.1 Goal:Staff=Optimal Bus. Growth + [Note: Human resource capacity will remain at a level to meet planned growth growth objectives and client contractual commitments] + 21.3.1.1 So that... + 21.3.1.2 Related Strategic Priorities: + 21.3.1.3 KPI: HR Level equals Planned Growth + 21.3.1.4 Methodology + [Note: Schedule of required HR capacity vs. actual HR capacity. Variance + or - 1] + 21.3.1.4.1 Target + [Note: = + or - 1] + 21.3.2 Goal: Increase Job Satisfaction + 21.3.2.1 So That + [Note: Establish better relationships. + Identify with the new employer. + Build a great attitude with the company.] + 21.3.2.2 Related Strategic Priorities + 21.3.2.2.1 + 21.3.2.3 KPI: Employee Satisfaction + 21.3.2.3.1 + 21.3.2.4 Methodology + [Note: Percentage of improvement in employee reported job satisfaction based on survey vs previous year. Base level to be established in first year. ] + 21.3.2.4.1 Target + [Note: Base level 1st year] + 21.3.3 Goal: Improve Performance + [Note: To increase knowledge, skills and experience of the Freeform staff relevant to organizational priorities.] + 21.3.3.1 So That + [Note: Clarify expectations. + Understand values and priorities. + Decrease the learning curve.] + 21.3.3.2 Related Strategic Priorities + [Note: 1] + 21.3.3.3 KPI: Employee Performance + 21.3.3.4 Methodology + 21.3.3.4.1 Target + 21.3.4 Goal: Reduce Turnover + [Note: To reduce turnover of Top Talent.] + 21.3.4.1 So That + [Note: Provide support through feedback. + Help the employee feel valued. + Again, decrease the learning curve.] + 21.3.4.2 Related Strategic Priorities + 21.3.4.3 KPI: Retention Rate + 21.3.4.4 Methodology + 21.3.4.4.1 Target + 21.3.5 Risk & Compliance + [Note: To eliminate or minimize risk and to comply with all legislated requirements. ] diff --git a/packages/mindplot/test/unit/export/expected/emptyNodes.mm b/packages/mindplot/test/unit/export/expected/emptyNodes.mm index e4555e96..0a685dc2 100644 --- a/packages/mindplot/test/unit/export/expected/emptyNodes.mm +++ b/packages/mindplot/test/unit/export/expected/emptyNodes.mm @@ -1,116 +1,115 @@ - - - + - - + + -

-

+

- - + + + + - - + + - - + + - - + + - - + + - - + + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - + + + + + - - + + - + - + - + - - + + - - - + + + - + - + - + - - + + - + - + - - - + + + - - - + + + diff --git a/packages/mindplot/test/unit/export/expected/emptyNodes.svg b/packages/mindplot/test/unit/export/expected/emptyNodes.svg index c8c2be0a..9f9e20c6 100644 --- a/packages/mindplot/test/unit/export/expected/emptyNodes.svg +++ b/packages/mindplot/test/unit/export/expected/emptyNodes.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/test/unit/export/expected/emptyNodes.txt b/packages/mindplot/test/unit/export/expected/emptyNodes.txt index 8a6978e3..eddb3d8b 100644 --- a/packages/mindplot/test/unit/export/expected/emptyNodes.txt +++ b/packages/mindplot/test/unit/export/expected/emptyNodes.txt @@ -1,4 +1,5 @@ 1 + [Note: ] 1.1 objectifs journée 1.1.1 "business plan" associatif ? 1.1.2 modèle / activités responsabilités diff --git a/packages/mindplot/test/unit/export/expected/enc.mm b/packages/mindplot/test/unit/export/expected/enc.mm index 093ba773..48f63d6a 100644 --- a/packages/mindplot/test/unit/export/expected/enc.mm +++ b/packages/mindplot/test/unit/export/expected/enc.mm @@ -1,209 +1,16 @@ - - - - - - - - - - - - - - - -

Here, we develop a new approach that links functional attributes

-

of tree species with studies of forest recovery and regional

-

land-use transitions (Chazdon et al. 2007). Grouping species according

-

to their functional attributes or demographic rates provides

-

insight into both applied and theoretical questions, such as selecting

-

species for reforestation programs, assessing ecosystem services, and

-

understanding community assembly processes in tropical forests

-

(Diaz et al. 2007, Kraft et al. 2008).

- - -
-
- - - - - -

Since we have data on leaf

-

and wood functional traits for only a subset of the species in our

-

study sites, we based our functional type classification on information

-

for a large number of tree species obtained through vegetation

-

monitoring studies.

- - -
-
- - - - - -

Our approach avoided preconceived notions of successional

-

behavior or shade tolerance of tree species by developing an objective

-

and independent classification of functional types based on vegetation

-

monitoring data from permanent sample plots in mature and

-

secondary forests of northeastern Costa Rica (Finegan et al. 1999,

-

Chazdon et al. 2007).We apply an independent, prior classification

-

of 293 tree species from our study region into five functional types, based on two species attributes: canopy strata and diameter growth

-

rates for individuals Z10 cm dbh (Finegan et al. 1999, Salgado-

-

Negret 2007).

- - -
-
- - - - - -

Our results demonstrate strong linkages between functional

-

types defined by adult height and growth rates of large trees and

-

colonization groups based on the timing of seedling, sapling, and

-

tree recruitment in secondary forests.

- - -
-
- - - - - -

These results allow us to move beyond earlier conceptual

-

frameworks of tropical forest secondary succession developed

-

by Finegan (1996) and Chazdon (2008) based on subjective groupings,

-

such as pioneers and shade-tolerant species (Swaine &

-

Whitmore 1988).

- - -
-
- - - - - -

Reproductive traits, such as dispersal mode, pollination mode,

-

and sexual system, were ultimately not useful in delimiting tree

-

functional types for the tree species examined here (Salgado-Negret

-

2007). Thus, although reproductive traits do vary quantitatively in

-

abundance between secondary and mature forests in our landscape

-

(Chazdon et al. 2003), they do not seem to be important drivers of

-

successional dynamics of trees Z10 cm dbh. For seedlings, however,

-

dispersal mode and seed size are likely to play an important

-

role in community dynamics during succession (Dalling&Hubbell

-

2002).

- - -
-
- - - - - -

Our classification of colonization groups defies the traditional

-

dichotomy between ‘late successional’ shade-tolerant and ‘early successional’

-

pioneer species. Many tree species, classified here as

-

regenerating pioneers on the basis of their population structure in

-

secondary forests, are common in both young secondary forest and

-

mature forests in this region (Guariguata et al. 1997), and many are

-

important timber species (Vilchez et al. 2008). These generalists are

-

by far the most abundant species of seedlings and saplings, conferring

-

a high degree of resilience in the wet tropical forests of NE

-

Costa Rica (Norden et al. 2009, Letcher & Chazdon 2009). The

-

high abundance of regenerating pioneers in seedling and sapling

-

size classes clearly shows that species with shade-tolerant seedlings

-

can also recruit as trees early in succession. For these species, early

-

tree colonization enhances seedling and sapling recruitment during

-

the first 20–30 yr of succession, due to local seed rain. Species

-

abundance and size distribution depend strongly on chance colonization

-

events early in succession (Chazdon 2008). Other studies

-

have shown that mature forest species are able to colonize early in

-

succession (Finegan 1996, van Breugel et al. 2007, Franklin & Rey

-

2007, Ochoa-Gaona et al. 2007), emphasizing the importance of

-

initial floristic composition in the determination of successional

-

pathways and rates of forest regrowth. On the other hand, significant

-

numbers of species in our sites (40% overall and the majority

-

of rare species) colonized only after canopy closure, and these species

-

may not occur as mature individuals until decades after agricultural

-

abandonment.

- - -
-
- - - - - -

Classifying functional types

-

based on functional traits with low plasticity, such as wood density

-

and seed size, could potentially serve as robust proxies for demographic

-

variables (Poorter et al. 2008, Zhang et al. 2008).

- - -
-
- - - - - -

CONDIT, R., S. P. HUBBELL, AND R. B. FOSTER. 1996. Assessing the response of

-

plant functional types in tropical forests to climatic change. J. Veg. Sci.

-

7: 405–416.

-

DALLING, J. S., AND S. P. HUBBELL. 2002. Seed size, growth rate and gap microsite

-

conditions as determinants of recruitment success for pioneer species.

-

J. Ecol. 90: 557–568.

-

FINEGAN, B. 1996. Pattern and process in neotropical secondary forests: The first

-

100 years of succession. Trends Ecol. Evol. 11: 119–124.

-

POORTER, L., S. J. WRIGHT, H. PAZ, D. D. ACKERLY, R. CONDIT, G.

-

IBARRA-MANRI´QUEZ, K. E. HARMS, J. C. LICONA, M.MARTI´NEZ-RAMOS,

-

S. J. MAZER, H. C. MULLER-LANDAU, M. PEN˜ A-CLAROS, C. O. WEBB,

-

AND I. J. WRIGHT. 2008. Are functional traits good predictors of demographic

-

rates? Evidence from five Neotropical forests. Ecology 89:

-

1908–1920.

-

ZHANG, Z. D., R. G. ZANG, AND Y. D. QI. 2008. Spatiotemporal patterns and

-

dynamics of species richness and abundance of woody plant functional

-

groups in a tropical forest landscape of Hainan Island, South China.

-

J. Integr. Plant Biol. 50: 547–558.

- - -
-
-
- + + - - - -

Therecent growth of large functional trait data

-

bases has been fuelled by standardized protocols forthe

-

measurement of individual functional traits and intensive

-

efforts to compile trait data(Cornelissen etal. 2003; Chave etal. 2009). Nonetheless, there remains no consensusfor

-

the most appropriate sampling design so that traits can be

-

scaled from the individuals on whom measurements are

-

made to the community or ecosystem levels at which infer-

-

ences are drawn (Swenson etal. 2006,2007,Reich,Wright

-

& Lusk 2007;Kraft,Valencia & Ackerly 2008).

- - + 1:590: disallowed character in entity name.
- - + +

However, the fast pace of

development of plant trait meta-analyses also suggests that

@@ -215,8 +22,8 @@
- - + +

We measured

traits for every individual tree in nine 1-ha plots in tropical

@@ -235,13 +42,13 @@
- - - + + + - - + +

With regard to estimating mean trait values, strategies

alternative to BRIDGE were consistently cost-effective. On

@@ -253,19 +60,13 @@
- - - -

-

Isso significa que estudos de característica de história de vida compensam? Ver nos m&m.

- - + 1:134: unclosed tag: p
- - + +

We suggest that, in these studies,

the investment in complete sampling may be worthwhile

@@ -274,15 +75,142 @@
- - + + -

-

Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.

+

Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.

+ + + + + + + +

Here, we develop a new approach that links functional attributes

+

of tree species with studies of forest recovery and regional

+

land-use transitions (Chazdon et al. 2007). Grouping species according

+

to their functional attributes or demographic rates provides

+

insight into both applied and theoretical questions, such as selecting

+

species for reforestation programs, assessing ecosystem services, and

+

understanding community assembly processes in tropical forests

+

(Diaz et al. 2007, Kraft et al. 2008).

+ + +
+
+ + + + + +

Since we have data on leaf

+

and wood functional traits for only a subset of the species in our

+

study sites, we based our functional type classification on information

+

for a large number of tree species obtained through vegetation

+

monitoring studies.

+ + +
+
+ + + + + + +

Our approach avoided preconceived notions of successional

+

behavior or shade tolerance of tree species by developing an objective

+

and independent classification of functional types based on vegetation

+

monitoring data from permanent sample plots in mature and

+

secondary forests of northeastern Costa Rica (Finegan et al. 1999,

+

Chazdon et al. 2007).We apply an independent, prior classification

+

of 293 tree species from our study region into five functional types, based on two species attributes: canopy strata and diameter growth

+

rates for individuals Z10 cm dbh (Finegan et al. 1999, Salgado-

+

Negret 2007).

+ + +
+
+ + + + + +

Our results demonstrate strong linkages between functional

+

types defined by adult height and growth rates of large trees and

+

colonization groups based on the timing of seedling, sapling, and

+

tree recruitment in secondary forests.

+ + +
+
+ + + 1:325: unclosed tag: p + + + + + 1:691: unclosed tag: p + + + + + 1:1875: unclosed tag: p + + + + + + + +

Classifying functional types

+

based on functional traits with low plasticity, such as wood density

+

and seed size, could potentially serve as robust proxies for demographic

+

variables (Poorter et al. 2008, Zhang et al. 2008).

+ + +
+
+ + + + + +

CONDIT, R., S. P. HUBBELL, AND R. B. FOSTER. 1996. Assessing the response of

+

plant functional types in tropical forests to climatic change. J. Veg. Sci.

+

7: 405–416.

+

DALLING, J. S., AND S. P. HUBBELL. 2002. Seed size, growth rate and gap microsite

+

conditions as determinants of recruitment success for pioneer species.

+

J. Ecol. 90: 557–568.

+

FINEGAN, B. 1996. Pattern and process in neotropical secondary forests: The first

+

100 years of succession. Trends Ecol. Evol. 11: 119–124.

+

POORTER, L., S. J. WRIGHT, H. PAZ, D. D. ACKERLY, R. CONDIT, G.

+

IBARRA-MANRI´QUEZ, K. E. HARMS, J. C. LICONA, M.MARTI´NEZ-RAMOS,

+

S. J. MAZER, H. C. MULLER-LANDAU, M. PEN˜ A-CLAROS, C. O. WEBB,

+

AND I. J. WRIGHT. 2008. Are functional traits good predictors of demographic

+

rates? Evidence from five Neotropical forests. Ecology 89:

+

1908–1920.

+

ZHANG, Z. D., R. G. ZANG, AND Y. D. QI. 2008. Spatiotemporal patterns and

+

dynamics of species richness and abundance of woody plant functional

+

groups in a tropical forest landscape of Hainan Island, South China.

+

J. Integr. Plant Biol. 50: 547–558.

+

+ + +
+
+
+ + + + + + \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/enc.svg b/packages/mindplot/test/unit/export/expected/enc.svg index 79a5a022..74481d31 100644 --- a/packages/mindplot/test/unit/export/expected/enc.svg +++ b/packages/mindplot/test/unit/export/expected/enc.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/test/unit/export/expected/enc.txt b/packages/mindplot/test/unit/export/expected/enc.txt index 74621824..616c6491 100644 --- a/packages/mindplot/test/unit/export/expected/enc.txt +++ b/packages/mindplot/test/unit/export/expected/enc.txt @@ -35,9 +35,11 @@ the other hand, strategies alternative to BRIDGE clearly failed to accurately estimate the variance of trait values. This indicates that in situations where accurate estimation of plotlevel variance is desired, complete censuses are essential. + [Note: Isso significa que estudos de característica de história de vida compensam? Ver nos m&m.] 1.1.8 We suggest that, in these studies, the investment in complete sampling may be worthwhile for at least some traits. + [Note: Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.] 1.2 Chazdon 2010. Biotropica. 42(1): 31–40 1.2.1 Here, we develop a new approach that links functional attributes of tree species with studies of forest recovery and regional diff --git a/packages/mindplot/test/unit/export/expected/enc.wxml b/packages/mindplot/test/unit/export/expected/enc.wxml index aa94041f..b4136958 100644 --- a/packages/mindplot/test/unit/export/expected/enc.wxml +++ b/packages/mindplot/test/unit/export/expected/enc.wxml @@ -28,18 +28,18 @@ failed to accurately estimate the variance of trait values. This indicates that in situations where accurate estimation of plotlevel variance is desired, complete censuses are essential.]]>Isso significa que estudos de característica de história de vida compensam? Ver nos m&m.We suggest that, in these studies, the investment in complete sampling may be worthwhile -for at least some traits.Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.Here, we develop a new approach that links functional attributes +for at least some traits.Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.Here, we develop a new approach that links functional attributes of tree species with studies of forest recovery and regional land-use transitions (Chazdon et al. 2007). Grouping species according to their functional attributes or demographic rates provides insight into both applied and theoretical questions, such as selecting species for reforestation programs, assessing ecosystem services, and understanding community assembly processes in tropical forests -(Diaz et al. 2007, Kraft et al. 2008).Since we have data on leaf +(Diaz et al. 2007, Kraft et al. 2008).Since we have data on leaf and wood functional traits for only a subset of the species in our study sites, we based our functional type classification on information for a large number of tree species obtained through vegetation -monitoring studies.Our approach avoided preconceived notions of successional +monitoring studies.Our approach avoided preconceived notions of successional behavior or shade tolerance of tree species by developing an objective and independent classification of functional types based on vegetation monitoring data from permanent sample plots in mature and diff --git a/packages/mindplot/test/unit/export/expected/huge.mm b/packages/mindplot/test/unit/export/expected/huge.mm index b926d2c9..27753e70 100644 --- a/packages/mindplot/test/unit/export/expected/huge.mm +++ b/packages/mindplot/test/unit/export/expected/huge.mm @@ -3,8 +3,8 @@ <edge COLOR="#121110"/> <node ID="ID_null" POSITION="left" STYLE="bubble" TEXT="De markt"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -61,8 +61,8 @@ </node> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="monitoring"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -81,8 +81,8 @@ <node ID="ID_null" POSITION="right" STYLE="fork" TEXT="veiligheid"> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="criminaliteit"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -108,8 +108,8 @@ </node> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="verkeer"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -142,8 +142,8 @@ <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="Omleiding zoeken"/> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="preventie"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -163,8 +163,8 @@ </node> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="recepten generator"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -203,8 +203,8 @@ <font BOLD="true" SIZE="12"/> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="geboortetimer"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -214,8 +214,8 @@ <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="info over voeding"> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="via cloud info over voeding"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -241,8 +241,8 @@ </node> <node ID="ID_null" POSITION="right" STYLE="fork" TEXT="bouw"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> @@ -276,8 +276,8 @@ </node> <node ID="ID_null" POSITION="left" STYLE="fork" TEXT="verschillende ziektes"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> diff --git a/packages/mindplot/test/unit/export/expected/i18n.mm b/packages/mindplot/test/unit/export/expected/i18n.mm index e7568786..29b35329 100644 --- a/packages/mindplot/test/unit/export/expected/i18n.mm +++ b/packages/mindplot/test/unit/export/expected/i18n.mm @@ -1,7 +1,7 @@ <map version="1.0.1"> <node ID="ID_0" TEXT="i18n"> - <node ID="ID_1" POSITION="right" TEXT="Este es un &#233; con acento"/> - <node ID="ID_2" POSITION="left" TEXT="Este es una &#241;"/> - <node ID="ID_3" POSITION="right" TEXT="&#36889;&#26159;&#19968;&#20491;&#27171;&#26412; Japanise&#12290;"/> + <node ID="ID_1" POSITION="right" TEXT="Este es un é con acento"/> + <node ID="ID_2" POSITION="left" TEXT="Este es una ñ"/> + <node ID="ID_3" POSITION="right" TEXT="這是一個樣本 Japanise。"/> </node> </map> \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/i18n.svg b/packages/mindplot/test/unit/export/expected/i18n.svg index bcc8cfe3..351707ef 100644 --- a/packages/mindplot/test/unit/export/expected/i18n.svg +++ b/packages/mindplot/test/unit/export/expected/i18n.svg @@ -1,4 +1,4 @@ -<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="true" preserveAspectRatio="none" width="1440" height="900" viewBox="-277.95 -272.425 1224.00000 765.00000" style="background-color:white"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" preserveAspectRatio="xMinYMin" width="NaN" height="NaN" viewBox="NaN NaN NaN NaN" style="background-color:white"> <path style="fill:#495879 " stroke-width="1px" stroke="#495879" stroke-opacity="1" fill="#495879" fill-opacity="1" visibility="visible" d="M0.00,0.00 C19.77,0 39.53,52.00 59.30,52.00 39.53,55.00 19.77,5.00 0.00,7.00 Z"/> <path style="fill:#495879 " stroke-width="1px" stroke="#495879" stroke-opacity="1" fill="#495879" fill-opacity="1" visibility="visible" d="M0.00,0.00 C19.77,0 39.53,-24.00 59.30,-24.00 39.53,-21.00 19.77,5.00 0.00,7.00 Z"/> <path style="fill:#495879 " stroke-width="1px" stroke="#495879" stroke-opacity="1" fill="#495879" fill-opacity="1" visibility="visible" d="M0.00,0.00 C19.60,0 39.20,14.00 58.80,14.00 39.20,17.00 19.60,5.00 0.00,7.00 Z"/> diff --git a/packages/mindplot/test/unit/export/expected/i18n2.mm b/packages/mindplot/test/unit/export/expected/i18n2.mm index ee6c0c6a..40e022e5 100644 --- a/packages/mindplot/test/unit/export/expected/i18n2.mm +++ b/packages/mindplot/test/unit/export/expected/i18n2.mm @@ -1,22 +1,22 @@ <map version="1.0.1"> - <node ID="ID_0" TEXT="&#1571;&#1614;&#1576;&#1618;&#1580;&#1614;&#1583;&#1616;&#1610;&#1614;&#1617;&#1577; &#1593;&#1614;&#1585;&#1614;&#1576;&#1616;&#1610;&#1614;&#1617;&#1577;"> - <node ID="ID_1" POSITION="right" TEXT="&#1571;&#1614;&#1576;&#1618;&#1580;&#1614;&#1583;&#1616;&#1610;&#1614;&#1617;&#1577; &#1593;&#1614;&#1585;&#1614;&#1576;&#1616;"> + <node ID="ID_0" TEXT="أَبْجَدِيَّة عَرَبِيَّة"> + <node ID="ID_1" POSITION="right" TEXT="أَبْجَدِيَّة عَرَبِ"> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> - <p>This is a not in languange &#1571;&#1614;&#1576;&#1618;&#1580;&#1614;&#1583;&#1616;&#1610;&#1614;&#1617;&#1577; &#1593;&#1614;&#1585;&#1614;&#1576;&#1616;</p> + <p>This is a not in languange أَبْجَدِيَّة عَرَبِ</p> </body> </html> </richcontent> </node> <node ID="ID_2" POSITION="left"> <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> <p>Long text node:</p> - <p>&#1571;&#1614;&#1576;&#1618;&#1580;&#1614;&#1583;&#1616;&#1610;&#1614;&#1617;&#1577; &#1593;&#1614;&#1585;&#1614;&#1576;</p> + <p>أَبْجَدِيَّة عَرَب</p> </body> </html> </richcontent> diff --git a/packages/mindplot/test/unit/export/expected/i18n2.svg b/packages/mindplot/test/unit/export/expected/i18n2.svg index f9303473..d79c9227 100644 --- a/packages/mindplot/test/unit/export/expected/i18n2.svg +++ b/packages/mindplot/test/unit/export/expected/i18n2.svg @@ -1,4 +1,4 @@ -<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="true" preserveAspectRatio="none" width="1440" height="900" viewBox="-277.95 -272.425 1224.00000 765.00000" style="background-color:white"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" preserveAspectRatio="xMinYMin" width="NaN" height="NaN" viewBox="NaN NaN NaN NaN" style="background-color:white"> <path style="fill:#495879 " stroke-width="1px" stroke="#495879" stroke-opacity="1" fill="#495879" fill-opacity="1" visibility="visible" d="M0.00,0.00 C26.77,0 53.53,-5.00 80.30,-5.00 53.53,-2.00 26.77,5.00 0.00,7.00 Z"/> <path style="fill:#495879 " stroke-width="1px" stroke="#495879" stroke-opacity="1" fill="#495879" fill-opacity="1" visibility="visible" d="M0.00,0.00 C26.93,0 53.87,41.00 80.80,41.00 53.87,44.00 26.93,5.00 0.00,7.00 Z"/> <g preserveAspectRatio="none" focusable="true" width="100" height="100" transform="translate(-50.00000,-23.00000) scale(1.00000,1.00000)" visibility="visible"> diff --git a/packages/mindplot/test/unit/export/expected/i18n2.txt b/packages/mindplot/test/unit/export/expected/i18n2.txt index ae7b9ec6..f560c673 100644 --- a/packages/mindplot/test/unit/export/expected/i18n2.txt +++ b/packages/mindplot/test/unit/export/expected/i18n2.txt @@ -1,4 +1,5 @@ 1 أَبْجَدِيَّة عَرَبِيَّة 1.1 أَبْجَدِيَّة عَرَبِ + [Note: This is a not in languange أَبْجَدِيَّة عَرَبِ] 1.2 Long text node: أَبْجَدِيَّة عَرَب diff --git a/packages/mindplot/test/unit/export/expected/issue.mm b/packages/mindplot/test/unit/export/expected/issue.mm index 93dfc107..1586b623 100644 --- a/packages/mindplot/test/unit/export/expected/issue.mm +++ b/packages/mindplot/test/unit/export/expected/issue.mm @@ -1,116 +1,38 @@ <map version="1.0.1"> - <node BACKGROUND_COLOR="#cc0000" COLOR="#feffff" ID="ID_1" TEXT="La computadora"> - <font BOLD="true" NAME="Verdana" SIZE="24"/> + <node ID="ID_1" TEXT="La computadora" BACKGROUND_COLOR="#cc0000" COLOR="#feffff"> + <font SIZE="24" BOLD="true" NAME="Verdana"/> <edge COLOR="#660000"/> - <node BACKGROUND_COLOR="#bf9000" COLOR="#000000" ID="ID_59" POSITION="left" STYLE="rectagle"> + <node ID="ID_21" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#a64d79" COLOR="#feffff"> <richcontent TYPE="NODE"> - <html> - <head/> - <body> - <p>Software</p> - <p>(Programas y datos con los que funciona la computadora)</p> - </body> - </html> - </richcontent> - <font BOLD="true" SIZE="12"/> - <edge COLOR="#7f6000"/> - <node BACKGROUND_COLOR="#f1c232" COLOR="#000000" ID="ID_92" POSITION="left" STYLE="rectagle"> - <richcontent TYPE="NODE"> - <html> - <head/> - <body> - <p>Software de Sistema:Permite el entendimiento</p> - <p>entre el usuario y la maquina.</p> - </body> - </html> - </richcontent> - <font BOLD="true" SIZE="12"/> - <edge COLOR="#7f6000"/> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_101" POSITION="left" STYLE="rectagle" TEXT="Microsoft Windows"> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - </node> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_106" POSITION="left" STYLE="rectagle" TEXT="GNU/LINUX"> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - </node> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_107" POSITION="left" STYLE="rectagle" TEXT="MAC "> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - </node> - </node> - <node BACKGROUND_COLOR="#f1c232" COLOR="#000000" ID="ID_93" POSITION="left" STYLE="rectagle"> - <richcontent TYPE="NODE"> - <html> - <head/> - <body> - <p>Software de Aplicaci&#243;n: Permite hacer hojas de</p> - <p>calculo navegar en internet, base de datos, etc.</p> - </body> - </html> - </richcontent> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_108" POSITION="left" STYLE="rectagle" TEXT="Office"> - <font SIZE="12"/> - <edge COLOR="#783f04"/> - </node> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_109" POSITION="left" STYLE="rectagle" TEXT="Libre Office"> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - </node> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_110" POSITION="left" STYLE="rectagle" TEXT="Navegadores"> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - </node> - <node BACKGROUND_COLOR="#ffd966" COLOR="#000000" ID="ID_111" POSITION="left" STYLE="rectagle" TEXT="Msn"> - <font SIZE="12"/> - <edge COLOR="#783f04"/> - </node> - </node> - <node BACKGROUND_COLOR="#f1c232" COLOR="#000000" ID="ID_94" POSITION="left" STYLE="rectagle"> - <richcontent TYPE="NODE"> - <html> - <head/> - <body> - <p>Software de Desarrollo</p> - </body> - </html> - </richcontent> - <font SIZE="12"/> - <edge COLOR="#7f6000"/> - </node> - </node> - <node BACKGROUND_COLOR="#a64d79" COLOR="#feffff" ID="ID_21" POSITION="right" STYLE="bubble"> - <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> <p>Hardware</p> - <p>(componentes f&#237;sicos)</p> + <p>(componentes físicos)</p> </body> </html> </richcontent> - <font BOLD="true" SIZE="18"/> + <font SIZE="18" BOLD="true"/> <edge COLOR="#4c1130"/> - <node BACKGROUND_COLOR="#c27ba0" COLOR="#feffff" ID="ID_25" POSITION="right" STYLE="bubble"> + <node ID="ID_25" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#c27ba0" COLOR="#feffff"> <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> <p>Entrada de datos</p> + <p></p> </body> </html> </richcontent> <font SIZE="12"/> <edge COLOR="#4c1130"/> - <node BACKGROUND_COLOR="#ead1dc" COLOR="#000000" ID="ID_28" POSITION="right" STYLE="bubble"> + <node ID="ID_28" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#ead1dc" COLOR="#000000"> <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> - <p>Rat&#243;n, Teclado, Joystick,</p> - <p>C&#225;mara digital, Micr&#243;fono, Esc&#225;ner.</p> + <p>Ratón, Teclado, Joystick,</p> + <p>Cámara digital, Micrófono, Escáner.</p> </body> </html> </richcontent> @@ -118,15 +40,16 @@ <edge COLOR="#4c1130"/> </node> </node> - <node BACKGROUND_COLOR="#c27ba0" COLOR="#feffff" ID="ID_29" POSITION="right" STYLE="bubble" TEXT="Salida de datos"> + <node ID="ID_29" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#c27ba0" COLOR="#feffff" TEXT="Salida de datos"> <font SIZE="12"/> <edge COLOR="#4c1130"/> - <node BACKGROUND_COLOR="#ead1dc" COLOR="#000000" ID="ID_30" POSITION="right" STYLE="bubble"> + <node ID="ID_30" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#ead1dc" COLOR="#000000"> <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> - <p>Monitor, Impresora, Bocinas, Pl&#243;ter.</p> + <p>Monitor, Impresora, Bocinas, Plóter.</p> + <p></p> </body> </html> </richcontent> @@ -134,13 +57,13 @@ <edge COLOR="#4c1130"/> </node> </node> - <node BACKGROUND_COLOR="#c27ba0" COLOR="#feffff" ID="ID_31" POSITION="right" STYLE="bubble" TEXT="Almacenamiento"> + <node ID="ID_31" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#c27ba0" COLOR="#feffff" TEXT="Almacenamiento"> <font SIZE="12"/> <edge COLOR="#4c1130"/> - <node BACKGROUND_COLOR="#ead1dc" COLOR="#000000" ID="ID_32" POSITION="right" STYLE="bubble"> + <node ID="ID_32" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#ead1dc" COLOR="#000000"> <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> <p>Disquete, Disco compacto, DVD,</p> <p>BD, Disco duro, Memoria flash.</p> @@ -152,30 +75,112 @@ </node> </node> </node> - <node ID="ID_3" POSITION="left" STYLE="bubble" TEXT="Tipos de computadora"> - <font BOLD="true" SIZE="18"/> - <node ID="ID_8" POSITION="left" STYLE="bubble" TEXT="Computadora personal de escritorio o Desktop"> - <font BOLD="true" SIZE="12"/> - </node> - <node ID="ID_10" POSITION="left" STYLE="bubble"> + <node ID="ID_59" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#bf9000" COLOR="#000000"> + <richcontent TYPE="NODE"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> + <body> + <p>Software</p> + <p>(Programas y datos con los que funciona la computadora)</p> + <p></p> + </body> + </html> + </richcontent> + <font SIZE="12" BOLD="true"/> + <edge COLOR="#7f6000"/> + <node ID="ID_92" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#f1c232" COLOR="#000000"> <richcontent TYPE="NODE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> <body> - <p>PDA</p> + <p>Software de Sistema:Permite el entendimiento</p> + <p>entre el usuario y la maquina.</p> </body> </html> </richcontent> - <font BOLD="true" SIZE="12"/> + <font SIZE="12" BOLD="true"/> + <edge COLOR="#7f6000"/> + <node ID="ID_101" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="Microsoft Windows"> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + </node> + <node ID="ID_106" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="GNU/LINUX"> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + </node> + <node ID="ID_107" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="MAC "> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + </node> + </node> + <node ID="ID_93" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#f1c232" COLOR="#000000"> + <richcontent TYPE="NODE"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> + <body> + <p>Software de Aplicación: Permite hacer hojas de</p> + <p>calculo navegar en internet, base de datos, etc.</p> + </body> + </html> + </richcontent> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + <node ID="ID_108" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="Office"> + <font SIZE="12"/> + <edge COLOR="#783f04"/> + </node> + <node ID="ID_109" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="Libre Office"> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + </node> + <node ID="ID_110" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="Navegadores"> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + </node> + <node ID="ID_111" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#ffd966" COLOR="#000000" TEXT="Msn"> + <font SIZE="12"/> + <edge COLOR="#783f04"/> + </node> + </node> + <node ID="ID_94" POSITION="left" STYLE="rectagle" BACKGROUND_COLOR="#f1c232" COLOR="#000000"> + <richcontent TYPE="NODE"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> + <body> + <p>Software de Desarrollo</p> + <p></p> + </body> + </html> + </richcontent> + <font SIZE="12"/> + <edge COLOR="#7f6000"/> + </node> + </node> + <node ID="ID_3" POSITION="left" STYLE="bubble" TEXT="Tipos de computadora"> + <font SIZE="18" BOLD="true"/> + <node ID="ID_8" POSITION="left" STYLE="bubble" TEXT="Computadora personal de escritorio o Desktop"> + <font SIZE="12" BOLD="true"/> + </node> + <node ID="ID_10" POSITION="left" STYLE="bubble"> + <richcontent TYPE="NODE"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> + <body> + <p>PDA</p> + <p></p> + </body> + </html> + </richcontent> + <font SIZE="12" BOLD="true"/> </node> <node ID="ID_11" POSITION="left" STYLE="bubble" TEXT="Laptop"> - <font BOLD="true" SIZE="12"/> + <font SIZE="12" BOLD="true"/> </node> <node ID="ID_12" POSITION="left" STYLE="bubble" TEXT="Servidor"> - <font BOLD="true" SIZE="12"/> + <font SIZE="12" BOLD="true"/> </node> <node ID="ID_13" POSITION="left" STYLE="bubble" TEXT="Tablet PC"> - <font BOLD="true" SIZE="12"/> + <font SIZE="12" BOLD="true"/> </node> </node> </node> diff --git a/packages/mindplot/test/unit/export/expected/issue.svg b/packages/mindplot/test/unit/export/expected/issue.svg index 56bd6a21..7a2a354b 100644 --- a/packages/mindplot/test/unit/export/expected/issue.svg +++ b/packages/mindplot/test/unit/export/expected/issue.svg @@ -1,4 +1,4 @@ -<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="true" preserveAspectRatio="none" width="1440" height="900" viewBox="-277.95 -272.425 1224.00000 765.00000" style="background-color:white"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" preserveAspectRatio="xMinYMin" width="NaN" height="NaN" viewBox="NaN NaN NaN NaN" style="background-color:white"> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> <path stroke-width="2px" stroke="#9b74e6" stroke-opacity="1" visibility="visible" d="M83.54929577464789,-187 L88.28751685656984,-183.31906791982922 M83.54929577464789,-187 L79.86836369447711,-182.26177891807805"/> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> diff --git a/packages/mindplot/test/unit/export/expected/npe.mm b/packages/mindplot/test/unit/export/expected/npe.mm index a353dabb..1bc47622 100644 --- a/packages/mindplot/test/unit/export/expected/npe.mm +++ b/packages/mindplot/test/unit/export/expected/npe.mm @@ -1,3 +1,7 @@ <map version="1.0.1"> - <node/> + <node ID="ID_1" TEXT="NIF (NORMAS DE INFORMACIÓN FINANCIERA)" BACKGROUND_COLOR="#d5a6bd" COLOR="#741b47"> + <icon BUILTIN="object_pencil"/> + <font SIZE="18" BOLD="true"/> + <edge COLOR="#e69138"/> + </node> </map> \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/npe.svg b/packages/mindplot/test/unit/export/expected/npe.svg index 0b188db8..12c7461d 100644 --- a/packages/mindplot/test/unit/export/expected/npe.svg +++ b/packages/mindplot/test/unit/export/expected/npe.svg @@ -1,4 +1,4 @@ -<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="true" preserveAspectRatio="none" width="1440" height="900" viewBox="-264.99255421004466 -310.83776307154034 1554.89349 971.80843" style="background-color:white"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" preserveAspectRatio="xMinYMin" width="NaN" height="NaN" viewBox="NaN NaN NaN NaN" style="background-color:white"> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> <path stroke-width="2px" stroke="#9b74e6" stroke-opacity="1" visibility="visible" d="M326,104 L320.00018895554825,103.95238245202816 M326,104 L326.0476175479718,98.00018895554825"/> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> diff --git a/packages/mindplot/test/unit/export/expected/npe.txt b/packages/mindplot/test/unit/export/expected/npe.txt index 4e948c5d..3d5a9988 100644 --- a/packages/mindplot/test/unit/export/expected/npe.txt +++ b/packages/mindplot/test/unit/export/expected/npe.txt @@ -1,13 +1,19 @@ 1 NIF (NORMAS DE INFORMACIÓN FINANCIERA) 2 NIF D + [Note: Beneficios a los empleados,impuestos a la utilidad, arrendamientos y capitalización de resultado integral .] 2.1 Normas aplicables a problemas de determinación de resultados 3 CIRCULANTES + [Note: Tratamiento contable de los gastos de registro, colocación, unidades de inversión, aplicación supletoria etc.] 3.1 Adquisición temporal de acciones propias -4 NIF A [link: http://www.youtube.com/watch?v=7YN-sOlkQp0] +4 NIF A + [Link: http://www.youtube.com/watch?v=7YN-sOlkQp0] 4.1 Marco conceptual -5 NIF C [link: https://sites.google.com/site/contabilidadimcpnif/estructura-de-las-nif] +5 NIF C + [Link: https://sites.google.com/site/contabilidadimcpnif/estructura-de-las-nif] 5.1 Normas aplicables a conceptos específicos de los estados financieros 6 NIF E + [Note: Agricultura y donativos recibidos u otorgados con propósitos no lucrativos.] 6.1 Normas aplicables alas actividades especializadas de distintos sectores -7 NIF B [link: http://www.contaduria.uady.mx/files/cuerpo-acad/caef/aief/resumen_NIF_marco_conceptual.pdf] +7 NIF B + [Link: http://www.contaduria.uady.mx/files/cuerpo-acad/caef/aief/resumen_NIF_marco_conceptual.pdf] 7.1 Normas aplicables a los estados financieros en su conjunto diff --git a/packages/mindplot/test/unit/export/expected/process.mm b/packages/mindplot/test/unit/export/expected/process.mm index ceeb9cea..376f942a 100644 --- a/packages/mindplot/test/unit/export/expected/process.mm +++ b/packages/mindplot/test/unit/export/expected/process.mm @@ -9,42 +9,12 @@ <node ID="ID_7" POSITION="left" TEXT="Marin/Napa/Solano"/> </node> <node ID="ID_8" POSITION="left" TEXT="Hawaii"/> - <node ID="ID_26" POSITION="right" TEXT="Corneal Tissue OPS"> - <node ID="ID_27" POSITION="right" TEXT="Transplant Bank International"> - <node ID="ID_28" POSITION="right" TEXT="Orange County Eye and Transplant Bank"/> - <node BACKGROUND_COLOR="#00ffd5" ID="ID_29" POSITION="right" STYLE="bubble" TEXT="Northern California Transplant Bank"> - <node ID="ID_30" POSITION="right" TEXT="In 2010, 2,500 referrals forwarded to OneLegacy"/> - </node> - <node BACKGROUND_COLOR="#00ffd5" ID="ID_31" LINK="http://www.dohenyeyebank.org/" POSITION="right" STYLE="bubble" TEXT="Doheny Eye and Tissue Transplant Bank"/> - </node> - <node BACKGROUND_COLOR="#00ffd5" ID="ID_32" POSITION="right" STYLE="bubble" TEXT="OneLegacy"> - <node ID="ID_33" POSITION="right" TEXT="In 2010, 11,828 referrals"/> - <arrowlink DESTINATION="ID_27" ENDARROW="Default"/> - </node> - <node BACKGROUND_COLOR="#00ffd5" ID="ID_34" POSITION="right" STYLE="bubble" TEXT="San Diego Eye Bank"> - <node ID="ID_35" POSITION="right" TEXT="In 2010, 2,555 referrals"/> - </node> - <node ID="ID_36" POSITION="right" TEXT="California Transplant Donor Network"> - <arrowlink DESTINATION="ID_27" ENDARROW="Default"/> - </node> - <node ID="ID_37" POSITION="right" TEXT="California Transplant Services"> - <node ID="ID_38" POSITION="right" TEXT="In 2010, 0 referrals"/> - </node> - <node ID="ID_39" POSITION="right" TEXT="Lifesharing"/> - <node ID="ID_40" POSITION="right" TEXT="DCI Donor Services"> - <node BACKGROUND_COLOR="#00ffd5" ID="ID_41" POSITION="right" STYLE="bubble" TEXT="Sierra Eye and Tissue Donor Services"> - <node ID="ID_42" POSITION="right" TEXT="In 2010, 2.023 referrals"/> - </node> - </node> - <node BACKGROUND_COLOR="#00ffd5" ID="ID_43" POSITION="right" STYLE="bubble" TEXT="SightLife"/> - </node> <node ID="ID_9" POSITION="left" TEXT="Southern California"> <node ID="ID_10" POSITION="left" TEXT="Los Angeles"/> <node ID="ID_11" POSITION="left" TEXT="Anaheim/Santa Ana"/> <node ID="ID_12" POSITION="left" TEXT="Ventura"/> <node ID="ID_13" POSITION="left" TEXT="Other South"/> </node> - <node ID="ID_47" POSITION="right" TEXT="QE Medicare"/> <node ID="ID_14" POSITION="left" TEXT="Policy Bodies"> <node ID="ID_15" POSITION="left" TEXT="Advocacy"> <node ID="ID_16" POSITION="left" TEXT="AAO"/> @@ -60,11 +30,40 @@ <node ID="ID_25" POSITION="left" TEXT="Medicare Part B"/> </node> </node> - <node ID="ID_48" POSITION="right" TEXT="CMS Data"/> + <node ID="ID_26" POSITION="right" TEXT="Corneal Tissue OPS"> + <node ID="ID_27" POSITION="right" TEXT="Transplant Bank International"> + <node ID="ID_28" POSITION="right" TEXT="Orange County Eye and Transplant Bank"/> + <node ID="ID_29" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="Northern California Transplant Bank"> + <node ID="ID_30" POSITION="right" TEXT="In 2010, 2,500 referrals forwarded to OneLegacy"/> + </node> + <node ID="ID_31" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="Doheny Eye and Tissue Transplant Bank" LINK="http://www.dohenyeyebank.org/"/> + <arrowlink DESTINATION="ID_32" STARTARROW="Default" ENDARROW="Default"/> + <arrowlink DESTINATION="ID_36" STARTARROW="Default" ENDARROW="Default"/> + </node> + <node ID="ID_32" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="OneLegacy"> + <node ID="ID_33" POSITION="right" TEXT="In 2010, 11,828 referrals"/> + </node> + <node ID="ID_34" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="San Diego Eye Bank"> + <node ID="ID_35" POSITION="right" TEXT="In 2010, 2,555 referrals"/> + </node> + <node ID="ID_36" POSITION="right" TEXT="California Transplant Donor Network"/> + <node ID="ID_37" POSITION="right" TEXT="California Transplant Services"> + <node ID="ID_38" POSITION="right" TEXT="In 2010, 0 referrals"/> + </node> + <node ID="ID_39" POSITION="right" TEXT="Lifesharing"/> + <node ID="ID_40" POSITION="right" TEXT="DCI Donor Services"> + <node ID="ID_41" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="Sierra Eye and Tissue Donor Services"> + <node ID="ID_42" POSITION="right" TEXT="In 2010, 2.023 referrals"/> + </node> + </node> + <node ID="ID_43" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="SightLife"/> + </node> <node ID="ID_44" POSITION="left" TEXT="Tools"> <node ID="ID_45" POSITION="left" TEXT="Darthmouth Atlas of Health"/> <node ID="ID_46" POSITION="left" TEXT="HealthLandscape"/> </node> + <node ID="ID_47" POSITION="right" TEXT="QE Medicare"/> + <node ID="ID_48" POSITION="right" TEXT="CMS Data"/> <node ID="ID_49" POSITION="right" TEXT="Ambulatory Payment Classification"> <node ID="ID_50" POSITION="right" TEXT="CPT's which don't allow V2785"> <node ID="ID_51" POSITION="right" TEXT="Ocular Reconstruction Transplant"> diff --git a/packages/mindplot/test/unit/export/expected/process.svg b/packages/mindplot/test/unit/export/expected/process.svg index 1f425e7d..5198b29b 100644 --- a/packages/mindplot/test/unit/export/expected/process.svg +++ b/packages/mindplot/test/unit/export/expected/process.svg @@ -1,4 +1,4 @@ -<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="true" preserveAspectRatio="none" width="1440" height="900" viewBox="-100.29999999999998 -120.275 1224.00000 765.00000" style="background-color:white"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" preserveAspectRatio="xMinYMin" width="NaN" height="NaN" viewBox="NaN NaN NaN NaN" style="background-color:white"> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> <path stroke-width="2px" stroke="#9b74e6" stroke-opacity="1" visibility="visible" d="M-296,-173 L-292.3650603359595,-168.2264045375854 M-296,-173 L-300.7735954624146,-169.36506033595953"/> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> diff --git a/packages/mindplot/test/unit/export/expected/process.txt b/packages/mindplot/test/unit/export/expected/process.txt index 0e64ab69..c071eeb5 100644 --- a/packages/mindplot/test/unit/export/expected/process.txt +++ b/packages/mindplot/test/unit/export/expected/process.txt @@ -29,7 +29,8 @@ 1.5.1.1 Orange County Eye and Transplant Bank 1.5.1.2 Northern California Transplant Bank 1.5.1.2.1 In 2010, 2,500 referrals forwarded to OneLegacy - 1.5.1.3 Doheny Eye and Tissue Transplant Bank [link: http://www.dohenyeyebank.org/] + 1.5.1.3 Doheny Eye and Tissue Transplant Bank + [Link: http://www.dohenyeyebank.org/] 1.5.2 OneLegacy 1.5.2.1 In 2010, 11,828 referrals 1.5.3 San Diego Eye Bank diff --git a/packages/mindplot/test/unit/export/expected/sample2.mm b/packages/mindplot/test/unit/export/expected/sample2.mm index 39cb44d5..c2720bc7 100644 --- a/packages/mindplot/test/unit/export/expected/sample2.mm +++ b/packages/mindplot/test/unit/export/expected/sample2.mm @@ -2,8 +2,8 @@ <node ID="ID_null" LINK="prospace.com" TEXT="Prospace"> <edge COLOR="#cc5627"/> <richcontent TYPE="NOTE"> - <html> - <head/> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head><head/> <body> <p/> </body> diff --git a/packages/mindplot/test/unit/export/expected/welcome.mm b/packages/mindplot/test/unit/export/expected/welcome.mm new file mode 100644 index 00000000..d4497d04 --- /dev/null +++ b/packages/mindplot/test/unit/export/expected/welcome.mm @@ -0,0 +1,81 @@ +<map version="1.0.1"> + <node ID="ID_1" TEXT="Welcome To WiseMapping" COLOR="#ffffff"> + <icon BUILTIN="sign_info"/> + <node ID="ID_30" POSITION="right" STYLE="fork" LINK="https://www.youtube.com/tv?vq=medium#/watch?v=rKxZwNKs9cE"> + <richcontent TYPE="NODE"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> + <body> + <p>5 min tutorial video ?</p> + <p>Follow the link !</p> + </body> + </html> + </richcontent> + <icon BUILTIN="hard_computer"/> + <arrowlink DESTINATION="ID_11" STARTARROW="Default" ENDARROW="Default"/> + </node> + <node ID="ID_11" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Try it Now!"> + <icon BUILTIN="face_surprise"/> + <edge COLOR="#080559"/> + <node ID="ID_12" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Double Click"/> + <node ID="ID_13" POSITION="left" STYLE="fork"> + <richcontent TYPE="NODE"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head></head> + <body> + <p>Press "enter" to add a</p> + <p>Sibling</p> + </body> + </html> + </richcontent> + </node> + <node ID="ID_14" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Drag map to move"/> + </node> + <node ID="ID_15" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Features"> + <node ID="ID_16" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Links to Sites" LINK="http://www.digg.com"> + <font SIZE="10"/> + </node> + <node ID="ID_31" POSITION="right" STYLE="fork" TEXT="Styles"> + <node ID="ID_17" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Fonts"/> + <node ID="ID_19" POSITION="right" COLOR="#525c61" TEXT="Topic Shapes"/> + <node ID="ID_18" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Topic Color"/> + </node> + <node ID="ID_20" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Icons"> + <icon BUILTIN="object_rainbow"/> + </node> + <node ID="ID_21" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="History Changes"> + <icon BUILTIN="arrowc_turn_left"/> + </node> + </node> + <node ID="ID_6" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Mind Mapping"> + <icon BUILTIN="thumb_thumb_up"/> + <node ID="ID_7" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Share with Collegues"/> + <node ID="ID_8" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Online"/> + <node ID="ID_9" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Anyplace, Anytime"/> + <node ID="ID_10" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Free!!!"/> + </node> + <node ID="ID_2" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Productivity"> + <icon BUILTIN="chart_bar"/> + <node ID="ID_3" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Share your ideas"> + <icon BUILTIN="bulb_light_on"/> + </node> + <node ID="ID_4" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Brainstorming"/> + <node ID="ID_5" POSITION="right" STYLE="fork" COLOR="#525c61" TEXT="Visual "/> + </node> + <node ID="ID_27" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Install In Your Server"> + <icon BUILTIN="hard_computer"/> + <node ID="ID_29" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Open Source" LINK="http://www.wisemapping.org/"> + <icon BUILTIN="soft_penguin"/> + </node> + <node ID="ID_28" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Download" LINK="http://www.wisemapping.com/inyourserver.html"/> + </node> + <node ID="ID_32" POSITION="left" STYLE="fork" TEXT="Collaborate"> + <icon BUILTIN="people_group"/> + <node ID="ID_33" POSITION="left" STYLE="fork" TEXT="Embed"/> + <node ID="ID_34" POSITION="left" STYLE="fork" TEXT="Publish"/> + <node ID="ID_35" POSITION="left" STYLE="fork" TEXT="Share for Edition"> + <icon BUILTIN="mail_envelop"/> + </node> + </node> + </node> +</map> \ No newline at end of file diff --git a/packages/mindplot/test/unit/export/expected/welcome.svg b/packages/mindplot/test/unit/export/expected/welcome.svg index 7022e251..e0b2c360 100644 --- a/packages/mindplot/test/unit/export/expected/welcome.svg +++ b/packages/mindplot/test/unit/export/expected/welcome.svg @@ -1,4 +1,4 @@ -<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="true" preserveAspectRatio="none" width="1440" height="900" viewBox="-277.95 -272.425 1224.00000 765.00000" style="background-color:white"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" focusable="false" preserveAspectRatio="xMinYMin" width="NaN" height="NaN" viewBox="NaN NaN NaN NaN" style="background-color:white"> <path style="fill:none " stroke-width="2px" stroke="#3f96ff" stroke-opacity="1" visibility="hidden"/> <path stroke-width="2px" stroke="#9b74e6" stroke-opacity="1" visibility="visible" d="M210.85714285714286,-166.5 L204.94844150423523,-165.45728799654572 M210.85714285714286,-166.5 L209.81443085368858,-172.40870135290763"/> <path style="fill:none " stroke-width="1px" stroke="#495879" stroke-opacity="1" fill="#495879" fill-opacity="1" visibility="visible" d="M-254.00,161.00 C-263.77,161 -273.53,190.00 -283.30,190.00"/> diff --git a/packages/mindplot/test/unit/export/expected/welcome.txt b/packages/mindplot/test/unit/export/expected/welcome.txt index f6421eac..1b36a120 100644 --- a/packages/mindplot/test/unit/export/expected/welcome.txt +++ b/packages/mindplot/test/unit/export/expected/welcome.txt @@ -1,13 +1,15 @@ 1 Welcome To WiseMapping 1.1 5 min tutorial video ? -Follow the link ! [link: https://www.youtube.com/tv?vq=medium#/watch?v=rKxZwNKs9cE] +Follow the link ! + [Link: https://www.youtube.com/tv?vq=medium#/watch?v=rKxZwNKs9cE] 1.2 Try it Now! 1.2.1 Double Click 1.2.2 Press "enter" to add a Sibling 1.2.3 Drag map to move 1.3 Features - 1.3.1 Links to Sites [link: http://www.digg.com] + 1.3.1 Links to Sites + [Link: http://www.digg.com] 1.3.2 Styles 1.3.2.1 Fonts 1.3.2.2 Topic Shapes @@ -24,8 +26,10 @@ Sibling 1.5.2 Brainstorming 1.5.3 Visual 1.6 Install In Your Server - 1.6.1 Open Source [link: http://www.wisemapping.org/] - 1.6.2 Download [link: http://www.wisemapping.com/inyourserver.html] + 1.6.1 Open Source + [Link: http://www.wisemapping.org/] + 1.6.2 Download + [Link: http://www.wisemapping.com/inyourserver.html] 1.7 Collaborate 1.7.1 Embed 1.7.2 Publish diff --git a/packages/mindplot/tsconfig.json b/packages/mindplot/tsconfig.json index c342a977..379d8747 100644 --- a/packages/mindplot/tsconfig.json +++ b/packages/mindplot/tsconfig.json @@ -5,7 +5,7 @@ "noImplicitAny": false, "module": "amd", "moduleResolution": "node", - "target": "es6", + "target": "ES2020", "allowJs": true, "esModuleInterop": true, "declaration": true, diff --git a/packages/web2d/src/components/peer/svg/ElementPeer.js b/packages/web2d/src/components/peer/svg/ElementPeer.js index ffdcfbfe..e09f4058 100644 --- a/packages/web2d/src/components/peer/svg/ElementPeer.js +++ b/packages/web2d/src/components/peer/svg/ElementPeer.js @@ -17,7 +17,6 @@ */ import { $assert, $defined } from '@wisemapping/core-js'; import EventUtils from '../utils/EventUtils'; -import TransformUtil from '../utils/TransformUtils'; class ElementPeer { constructor(svgElement) { @@ -174,23 +173,6 @@ class ElementPeer { this._native.setAttribute('stroke', color); } if ($defined(style)) { - // Scale the dash array in order to be equal to VML. In VML, stroke style doesn't scale. - const dashArrayPoints = ElementPeer.stokeStyleToStrokDasharray()[style]; - const scale = 1 / TransformUtil.workoutScale(this).width; - - let strokeWidth = this._native.getAttribute('stroke-width'); - strokeWidth = parseFloat(strokeWidth); - - const scaledPoints = []; - for (let i = 0; i < dashArrayPoints.length; i++) { - // VML scale the stroke based on the stroke width. - scaledPoints[i] = dashArrayPoints[i] * strokeWidth; - - // Scale the points based on the scale. - scaledPoints[i] = `${scaledPoints[i] * scale}px`; - } - - // this._native.setAttribute('stroke-dasharray', scaledPoints); this._stokeStyle = style; } diff --git a/packages/webapp/README.md b/packages/webapp/README.md index 43abe3c9..688bddc8 100644 --- a/packages/webapp/README.md +++ b/packages/webapp/README.md @@ -47,7 +47,8 @@ You don’t have to ever use `eject`. The curated feature set is suitable for sm ## Compile `yarn compile lang/en.json --ast --out-file src/compiled-lang/en.json` `yarn compile lang/es.json --ast --out-file src/compiled-lang/es.json` - +`yarn compile lang/fr.json --ast --out-file src/compiled-lang/fr.json` +`yarn compile lang/de.json --ast --out-file src/compiled-lang/de.json` ## License The source code is Licensed under the WiseMapping Open License, Version 1.0 (the “License”); diff --git a/packages/webapp/lang/de.json b/packages/webapp/lang/de.json index fc3bf4b2..64d285a4 100644 --- a/packages/webapp/lang/de.json +++ b/packages/webapp/lang/de.json @@ -204,7 +204,7 @@ "defaultMessage": "Erstellen" }, "import.description": { - "defaultMessage": "Sie können FreeMind 1.0.1- und WiseMapping-Karten in Ihre Kartenliste importieren. Wählen Sie die Datei aus, die Sie importieren möchten." + "defaultMessage": "Sie können WiseMapping-Karten in Ihre Kartenliste importieren. Wählen Sie die Datei aus, die Sie importieren möchten." }, "import.title": { "defaultMessage": "Importieren Sie vorhandene Mindmaps" @@ -473,5 +473,32 @@ }, "editor.try-welcome-description": { "defaultMessage": "Melden Sie sich an, um kostenlos eine unbegrenzte Anzahl von Mindmaps zu erstellen, zu teilen und zu veröffentlichen." + }, + "accountinfo.deleteaccount": { + "defaultMessage": "Konto löschen" + }, + "label.add-button": { + "defaultMessage": "Etikett hinzufügen" + }, + "label.add-for": { + "defaultMessage": "Beschriftungen für Karten bearbeiten:" + }, + "label.add-placeholder": { + "defaultMessage": "Titel des Labels" + }, + "label.change-color": { + "defaultMessage": "Etikettenfarbe ändern" + }, + "label.delete-description": { + "defaultMessage": "gelöscht, einschließlich der Zuordnungen zu allen vorhandenen Karten. Möchtest du fortfahren?" + }, + "label.delete-title": { + "defaultMessage": "Bestätigen Sie das Löschen des Labels" + }, + "label.description": { + "defaultMessage": "Verwenden Sie Labels, um Ihre Karten zu organisieren." + }, + "label.title": { + "defaultMessage": "Etikett hinzufügen" } } \ No newline at end of file diff --git a/packages/webapp/lang/en.json b/packages/webapp/lang/en.json index 7a8af996..c744821f 100644 --- a/packages/webapp/lang/en.json +++ b/packages/webapp/lang/en.json @@ -1,477 +1,504 @@ { - "account.delete-warning": { - "defaultMessage": "Keep in mind that you will not be able retrieve any mindmap you have created. All your information will be deleted and it can not be restored." - }, - "accountinfo.button": { - "defaultMessage": "Accept" - }, - "accountinfo.email": { - "defaultMessage": "Email" - }, - "accountinfo.firstname": { - "defaultMessage": "First Name" - }, - "accountinfo.lastname": { - "defaultMessage": "Last Name" - }, - "accountinfo.title": { - "defaultMessage": "Account info" - }, - "action.cancel-button": { - "defaultMessage": "Cancel" - }, - "action.close-button": { - "defaultMessage": "Close" - }, - "action.delete": { - "defaultMessage": "Delete" - }, - "action.delete-description": { - "defaultMessage": "Deleted mindmap can not be recovered. Do you want to continue ?." - }, - "action.delete-title": { - "defaultMessage": "Delete" - }, - "action.duplicate": { - "defaultMessage": "Duplicate" - }, - "action.export": { - "defaultMessage": "Export" - }, - "action.history": { - "defaultMessage": "History" - }, - "action.history-description": { - "defaultMessage": "List of changes introduced in the last 90 days." - }, - "action.history-title": { - "defaultMessage": "Version history" - }, - "action.import": { - "defaultMessage": "Import" - }, - "action.info": { - "defaultMessage": "Info" - }, - "action.label": { - "defaultMessage": "Add Label" - }, - "action.new": { - "defaultMessage": "New map" - }, - "action.open": { - "defaultMessage": "Open" - }, - "action.print": { - "defaultMessage": "Print" - }, - "action.publish": { - "defaultMessage": "Publish" - }, - "action.rename": { - "defaultMessage": "Rename" - }, - "action.rename-description-placeholder": { - "defaultMessage": "Description" - }, - "action.rename-name-placeholder": { - "defaultMessage": "Name" - }, - "action.share": { - "defaultMessage": "Share" - }, - "changepwd.button": { - "defaultMessage": "Change" - }, - "changepwd.confirm-password": { - "defaultMessage": "Confirm Password" - }, - "changepwd.description": { - "defaultMessage": "Please, provide the new password for your account." - }, - "changepwd.password": { - "defaultMessage": "Password" - }, - "changepwd.password-match": { - "defaultMessage": "Password do not match. Please, try again." - }, - "changepwd.title": { - "defaultMessage": "Change Password" - }, - "common.wait": { - "defaultMessage": "Please wait ..." - }, - "create.button": { - "defaultMessage": "Create" - }, - "create.description": { - "defaultMessage": "Please, fill the new map name and description." - }, - "create.title": { - "defaultMessage": "Create a new mindmap." - }, - "deletem.title": { - "defaultMessage": "All selected maps will be deleted" - }, - "duplicate.title": { - "defaultMessage": "Duplicate" - }, - "expired.description": { - "defaultMessage": "Your current session has expired. Please, sign in and try again." - }, - "expired.title": { - "defaultMessage": "Your session has expired" - }, - "export.desc": { - "defaultMessage": "Export this map in the format that you want and start using it in your presentations or sharing by email" - }, - "export.document": { - "defaultMessage": "Mindmap Tools: Export your mindmap in thirdparty mindmap tool formats" - }, - "export.document-label": { - "defaultMessage": "Document: Export your mindmap in a self-contained document ready to share" - }, - "export.image": { - "defaultMessage": "Image: Get a graphic representation of your map including all colors and shapes." - }, - "export.title": { - "defaultMessage": "Export" - }, - "export.warning": { - "defaultMessage": "Exporting to Image (SVG,PNG,JPEG,PDF) is only available in the editor toolbar." - }, - "footer.aboutus": { - "defaultMessage": "About Us" - }, - "footer.contactus": { - "defaultMessage": "Contact Us" - }, - "footer.faq": { - "defaultMessage": "F.A.Q." - }, - "footer.faqandhelp": { - "defaultMessage": "Help & FAQ" - }, - "footer.feedback": { - "defaultMessage": "Feedback" - }, - "footer.opensource": { - "defaultMessage": "Open Source" - }, - "footer.others": { - "defaultMessage": "Others" - }, - "footer.termsandconditions": { - "defaultMessage": "Term And Conditions" - }, - "forgot.desc": { - "defaultMessage": "We will send you an email to reset your password." - }, - "forgot.email": { - "defaultMessage": "Email" - }, - "forgot.page-title": { - "defaultMessage": "Forgot Password | WiseMapping" - }, - "forgot.register": { - "defaultMessage": "Send recovery link" - }, - "forgot.success.desc": { - "defaultMessage": "We've sent you an email that will allow you to reset your password. You should receive it in the next minutes." - }, - "forgot.success.title": { - "defaultMessage": "Your temporal password has been sent." - }, - "forgot.title": { - "defaultMessage": "Reset your password" - }, - "forgotsuccess.page-title": { - "defaultMessage": "Password Recovered | WiseMapping" - }, - "header.donthaveaccount": { - "defaultMessage": "Don't have an account ?" - }, - "header.haveaccount": { - "defaultMessage": "Already have an account?" - }, - "help.support": { - "defaultMessage": "Support" - }, - "history.no-changes": { - "defaultMessage": "There is no changes available" - }, - "import.button": { - "defaultMessage": "Create" - }, - "import.description": { - "defaultMessage": "You can import FreeMind 1.0.1 and WiseMapping maps to your list of maps. Select the file you want to import." - }, - "import.title": { - "defaultMessage": "Import existing mindmap" - }, - "info.basic-info": { - "defaultMessage": "Basic Info" - }, - "info.button": { - "defaultMessage": "Accept" - }, - "info.creation-time": { - "defaultMessage": "Creation Date" - }, - "info.creator": { - "defaultMessage": "Creator" - }, - "info.description": { - "defaultMessage": "Description" - }, - "info.description-msg": { - "defaultMessage": "By publishing the map you make it visible to everyone on the Internet." - }, - "info.modified-time": { - "defaultMessage": "Last Modified Date" - }, - "info.modified-tny": { - "defaultMessage": "Last Modified By" - }, - "info.name": { - "defaultMessage": "Name" - }, - "info.public-visibility": { - "defaultMessage": "Publicly Visible" - }, - "info.sharing": { - "defaultMessage": "Sharing" - }, - "info.starred": { - "defaultMessage": "Starred" - }, - "info.title": { - "defaultMessage": "Info" - }, - "language.change": { - "defaultMessage": "Change Language" - }, - "language.help": { - "defaultMessage": "Help to Translate" - }, - "login.desc": { - "defaultMessage": "Log into your account" - }, - "login.email": { - "defaultMessage": "Email" - }, - "login.error": { - "defaultMessage": "The email address or password you entered is not valid." - }, - "login.forgotpwd": { - "defaultMessage": "Forgot Password ?" - }, - "login.hsqldbcofig": { - "defaultMessage": "Although HSQLDB is bundled with WiseMapping by default during the installation, we do not recommend this database for production use. Please consider using MySQL 5.7 instead. You can find more information how to configure MySQL", - "description": "Missing production database configured" - }, - "login.page-title": { - "defaultMessage": "Login | WiseMapping" - }, - "login.password": { - "defaultMessage": "Password" - }, - "login.remberme": { - "defaultMessage": "Remember me" - }, - "login.signin": { - "defaultMessage": "Sign In" - }, - "login.signup": { - "defaultMessage": "Sign Up" - }, - "login.title": { - "defaultMessage": "Welcome" - }, - "login.userinactive": { - "defaultMessage": "Sorry, your account has not been activated yet. You'll receive a notification email when it becomes active. Stay tuned!." - }, - "map.creator": { - "defaultMessage": "Creator" - }, - "map.delete-selected": { - "defaultMessage": "Delete selected" - }, - "map.last-update": { - "defaultMessage": "Last Update" - }, - "map.more-actions": { - "defaultMessage": "More Actions" - }, - "map.name": { - "defaultMessage": "Name" - }, - "map.tooltip-add": { - "defaultMessage": "Add label to selected" - }, - "maps.choose-file": { - "defaultMessage": "Choose a file" - }, - "maps.create-tooltip": { - "defaultMessage": "Create a new mindmap" - }, - "maps.empty-result": { - "defaultMessage": "No matching mindmap found with the current filter criteria." - }, - "maps.import-desc": { - "defaultMessage": "Import from other tools" - }, - "maps.modified": { - "defaultMessage": "Modified" - }, - "maps.modified-by": { - "defaultMessage": "Modified By" - }, - "maps.modified-by-desc": { - "defaultMessage": "Modified by {by} on {on}" - }, - "maps.nav-all": { - "defaultMessage": "All" - }, - "maps.nav-onwned": { - "defaultMessage": "Owned" - }, - "maps.nav-public": { - "defaultMessage": "Public" - }, - "maps.nav-shared": { - "defaultMessage": "Shared with me" - }, - "maps.nav-starred": { - "defaultMessage": "Starred" - }, - "maps.page-title": { - "defaultMessage": "My Maps | WiseMapping" - }, - "maps.revert": { - "defaultMessage": "Revert" - }, - "maps.search-action": { - "defaultMessage": "Search ..." - }, - "maps.tooltip-open": { - "defaultMessage": "Open for edition" - }, - "maps.tooltip-starred": { - "defaultMessage": "Starred" - }, - "maps.view": { - "defaultMessage": "View" - }, - "menu.account": { - "defaultMessage": "Account" - }, - "menu.change-password": { - "defaultMessage": "Change password" - }, - "menu.signout": { - "defaultMessage": "Sign Out" - }, - "publish.button": { - "defaultMessage": "Accept" - }, - "publish.checkbox": { - "defaultMessage": "Enable public sharing" - }, - "publish.description": { - "defaultMessage": "By publishing the map you make it visible to everyone on the Internet." - }, - "publish.embedded": { - "defaultMessage": "Embedded" - }, - "publish.embedded-msg": { - "defaultMessage": "Copy this snippet of code to embed in your blog or page:" - }, - "publish.public-url": { - "defaultMessage": "Public URL" - }, - "publish.public-url-msg": { - "defaultMessage": "Copy and paste the link below to share your map with colleagues:" - }, - "publish.title": { - "defaultMessage": "Publish" - }, - "registation.success-title": { - "defaultMessage": "Registation Success | WiseMapping" - }, - "registration.desc": { - "defaultMessage": "Signing up is free and just take a moment" - }, - "registration.email": { - "defaultMessage": "Email" - }, - "registration.firstname": { - "defaultMessage": "First Name" - }, - "registration.lastname": { - "defaultMessage": "Last Name" - }, - "registration.password": { - "defaultMessage": "Password" - }, - "registration.register": { - "defaultMessage": "Register" - }, - "registration.success.desc": { - "defaultMessage": "Click 'Sign In' button below and start creating mind maps." - }, - "registration.termandconditions": { - "defaultMessage": "Terms of Client: Please check the WiseMapping Account information you've entered above, and review the Terms of Client here. By clicking on 'Register' below you are agreeing to the Terms of Client above and the Privacy Policy" - }, - "registration.title": { - "defaultMessage": "Become a member" - }, - "rename.description": { - "defaultMessage": "Please, fill the new map name and description." - }, - "rename.title": { - "defaultMessage": "Rename" - }, - "resetpassword.success.title": { - "defaultMessage": "Your account has been created successfully" - }, - "role.editor": { - "defaultMessage": "Editor" - }, - "role.owner": { - "defaultMessage": "Onwer" - }, - "role.viewer": { - "defaultMessage": "Viewer" - }, - "share.add-button": { - "defaultMessage": "Add" - }, - "share.add-message": { - "defaultMessage": "Add message" - }, - "share.can-edit": { - "defaultMessage": "Can edit" - }, - "share.can-view": { - "defaultMessage": "Can view" - }, - "share.delete": { - "defaultMessage": "Delete collaborator" - }, - "share.delete-description": { - "defaultMessage": "Invite people to collaborate with you in the creation of your mindmap. They will be notified by email." - }, - "share.delete-title": { - "defaultMessage": "Share with people" - }, - "share.message": { - "defaultMessage": "Message" - }, - "editor.try-welcome": { - "defaultMessage": "This edition space showcases some of the mindmap editor capabilities !" - }, - "editor.try-welcome-description": { - "defaultMessage": "Sign Up to start creating, sharing and publishing unlimited number of mindmaps for free." - } + "account.delete-warning": { + "defaultMessage": "Keep in mind that you will not be able retrieve any mindmap you have added. All your information will be deleted and it can not be restored." + }, + "accountinfo.button": { + "defaultMessage": "Accept" + }, + "accountinfo.deleteaccount": { + "defaultMessage": "Delete Account" + }, + "accountinfo.email": { + "defaultMessage": "Email" + }, + "accountinfo.firstname": { + "defaultMessage": "First Name" + }, + "accountinfo.lastname": { + "defaultMessage": "Last Name" + }, + "accountinfo.title": { + "defaultMessage": "Account info" + }, + "action.cancel-button": { + "defaultMessage": "Cancel" + }, + "action.close-button": { + "defaultMessage": "Close" + }, + "action.delete": { + "defaultMessage": "Delete" + }, + "action.delete-description": { + "defaultMessage": "Deleted mindmap can not be recovered. Do you want to continue ?." + }, + "action.delete-title": { + "defaultMessage": "Delete" + }, + "action.duplicate": { + "defaultMessage": "Duplicate" + }, + "action.export": { + "defaultMessage": "Export" + }, + "action.history": { + "defaultMessage": "History" + }, + "action.history-description": { + "defaultMessage": "List of changes introduced in the last 90 days." + }, + "action.history-title": { + "defaultMessage": "Version history" + }, + "action.import": { + "defaultMessage": "Import" + }, + "action.info": { + "defaultMessage": "Info" + }, + "action.label": { + "defaultMessage": "Add Label" + }, + "action.new": { + "defaultMessage": "New map" + }, + "action.open": { + "defaultMessage": "Open" + }, + "action.print": { + "defaultMessage": "Print" + }, + "action.publish": { + "defaultMessage": "Publish" + }, + "action.rename": { + "defaultMessage": "Rename" + }, + "action.rename-description-placeholder": { + "defaultMessage": "Description" + }, + "action.rename-name-placeholder": { + "defaultMessage": "Name" + }, + "action.share": { + "defaultMessage": "Share" + }, + "changepwd.button": { + "defaultMessage": "Change" + }, + "changepwd.confirm-password": { + "defaultMessage": "Confirm Password" + }, + "changepwd.description": { + "defaultMessage": "Please, provide the new password for your account." + }, + "changepwd.password": { + "defaultMessage": "Password" + }, + "changepwd.password-match": { + "defaultMessage": "Password do not match. Please, try again." + }, + "changepwd.title": { + "defaultMessage": "Change Password" + }, + "common.wait": { + "defaultMessage": "Please wait ..." + }, + "create.button": { + "defaultMessage": "Create" + }, + "create.description": { + "defaultMessage": "Please, fill the new map name and description." + }, + "create.title": { + "defaultMessage": "Create a new mindmap" + }, + "deletem.title": { + "defaultMessage": "All selected maps will be deleted" + }, + "duplicate.title": { + "defaultMessage": "Duplicate" + }, + "expired.description": { + "defaultMessage": "Your current session has expired. Please, sign in and try again." + }, + "expired.title": { + "defaultMessage": "Your session has expired" + }, + "export.desc": { + "defaultMessage": "Export this map in the format that you want and start using it in your presentations or sharing by email" + }, + "export.document": { + "defaultMessage": "Mindmap Tools: Export your mindmap in thirdparty mindmap tool formats" + }, + "export.document-label": { + "defaultMessage": "Document: Export your mindmap in a self-contained document ready to share" + }, + "export.image": { + "defaultMessage": "Image: Get a graphic representation of your map including all colors and shapes." + }, + "export.img-center": { + "defaultMessage": "Center and zoom to fit" + }, + "export.title": { + "defaultMessage": "Export" + }, + "export.warning": { + "defaultMessage": "Exporting to Image (SVG,PNG,JPEG,PDF) is only available in the editor toolbar." + }, + "footer.aboutus": { + "defaultMessage": "About Us" + }, + "footer.contactus": { + "defaultMessage": "Contact Us" + }, + "footer.faq": { + "defaultMessage": "F.A.Q." + }, + "footer.faqandhelp": { + "defaultMessage": "Help & FAQ" + }, + "footer.feedback": { + "defaultMessage": "Feedback" + }, + "footer.opensource": { + "defaultMessage": "Open Source" + }, + "footer.others": { + "defaultMessage": "Others" + }, + "footer.termsandconditions": { + "defaultMessage": "Term And Conditions" + }, + "forgot.desc": { + "defaultMessage": "We will send you an email to reset your password." + }, + "forgot.email": { + "defaultMessage": "Email" + }, + "forgot.page-title": { + "defaultMessage": "Forgot Password | WiseMapping" + }, + "forgot.register": { + "defaultMessage": "Send recovery link" + }, + "forgot.success.desc": { + "defaultMessage": "We've sent you an email that will allow you to reset your password. You should receive it in the next minutes." + }, + "forgot.success.title": { + "defaultMessage": "Your temporal password has been sent." + }, + "forgot.title": { + "defaultMessage": "Reset your password" + }, + "forgotsuccess.page-title": { + "defaultMessage": "Password Recovered | WiseMapping" + }, + "header.donthaveaccount": { + "defaultMessage": "Don't have an account ?" + }, + "header.haveaccount": { + "defaultMessage": "Already have an account?" + }, + "help.support": { + "defaultMessage": "Support" + }, + "history.no-changes": { + "defaultMessage": "There is no changes available" + }, + "import.button": { + "defaultMessage": "Create" + }, + "import.description": { + "defaultMessage": "You can import WiseMapping maps to your list of maps. Select the file you want to import." + }, + "import.title": { + "defaultMessage": "Import existing mindmap" + }, + "info.basic-info": { + "defaultMessage": "Basic Info" + }, + "info.button": { + "defaultMessage": "Accept" + }, + "info.creation-time": { + "defaultMessage": "Creation Date" + }, + "info.creator": { + "defaultMessage": "Creator" + }, + "info.description": { + "defaultMessage": "Description" + }, + "info.description-msg": { + "defaultMessage": "By publishing the map you make it visible to everyone on the Internet." + }, + "info.modified-time": { + "defaultMessage": "Last Modified Date" + }, + "info.modified-tny": { + "defaultMessage": "Last Modified By" + }, + "info.name": { + "defaultMessage": "Name" + }, + "info.public-visibility": { + "defaultMessage": "Publicly Visible" + }, + "info.sharing": { + "defaultMessage": "Sharing" + }, + "info.starred": { + "defaultMessage": "Starred" + }, + "info.title": { + "defaultMessage": "Info" + }, + "label.add-button": { + "defaultMessage": "Add label" + }, + "label.add-for": { + "defaultMessage": "Editing labels for maps:" + }, + "label.add-placeholder": { + "defaultMessage": "Label title" + }, + "label.change-color": { + "defaultMessage": "Change label color" + }, + "label.delete-description": { + "defaultMessage": "will be deleted, including its associations to all existing maps. Do you want to continue?" + }, + "label.delete-title": { + "defaultMessage": "Confirm label deletion" + }, + "label.description": { + "defaultMessage": "Use labels to organize your maps." + }, + "label.title": { + "defaultMessage": "Add a label" + }, + "language.change": { + "defaultMessage": "Change Language" + }, + "language.help": { + "defaultMessage": "Help to Translate" + }, + "login.desc": { + "defaultMessage": "Log into your account" + }, + "login.email": { + "defaultMessage": "Email" + }, + "login.error": { + "defaultMessage": "The email address or password you entered is not valid." + }, + "login.forgotpwd": { + "defaultMessage": "Forgot Password ?" + }, + "login.hsqldbcofig": { + "defaultMessage": "Although HSQLDB is bundled with WiseMapping by default during the installation, we do not recommend this database for production use. Please consider using MySQL 5.7 instead. You can find more information how to configure MySQL", + "description": "Missing production database configured" + }, + "login.page-title": { + "defaultMessage": "Login | WiseMapping" + }, + "login.password": { + "defaultMessage": "Password" + }, + "login.remberme": { + "defaultMessage": "Remember me" + }, + "login.signin": { + "defaultMessage": "Sign In" + }, + "login.signup": { + "defaultMessage": "Sign Up" + }, + "login.title": { + "defaultMessage": "Welcome" + }, + "login.userinactive": { + "defaultMessage": "Sorry, your account has not been activated yet. You'll receive a notification email when it becomes active. Stay tuned!." + }, + "map.creator": { + "defaultMessage": "Creator" + }, + "map.delete-selected": { + "defaultMessage": "Delete selected" + }, + "map.last-update": { + "defaultMessage": "Last Update" + }, + "map.more-actions": { + "defaultMessage": "More Actions" + }, + "map.name": { + "defaultMessage": "Name" + }, + "map.tooltip-add": { + "defaultMessage": "Add label to selected" + }, + "maps.choose-file": { + "defaultMessage": "Choose a file" + }, + "maps.create-tooltip": { + "defaultMessage": "Create a new mindmap" + }, + "maps.empty-result": { + "defaultMessage": "No matching mindmap found with the current filter criteria." + }, + "maps.import-desc": { + "defaultMessage": "Import from other tools" + }, + "maps.modified": { + "defaultMessage": "Modified" + }, + "maps.modified-by": { + "defaultMessage": "Modified By" + }, + "maps.modified-by-desc": { + "defaultMessage": "Modified by {by} on {on}" + }, + "maps.nav-all": { + "defaultMessage": "All" + }, + "maps.nav-onwned": { + "defaultMessage": "Owned" + }, + "maps.nav-public": { + "defaultMessage": "Public" + }, + "maps.nav-shared": { + "defaultMessage": "Shared with me" + }, + "maps.nav-starred": { + "defaultMessage": "Starred" + }, + "maps.page-title": { + "defaultMessage": "My Maps | WiseMapping" + }, + "maps.revert": { + "defaultMessage": "Revert" + }, + "maps.search-action": { + "defaultMessage": "Search ..." + }, + "maps.tooltip-open": { + "defaultMessage": "Open for edition" + }, + "maps.tooltip-starred": { + "defaultMessage": "Starred" + }, + "maps.view": { + "defaultMessage": "View" + }, + "menu.account": { + "defaultMessage": "Account" + }, + "menu.change-password": { + "defaultMessage": "Change password" + }, + "menu.signout": { + "defaultMessage": "Sign Out" + }, + "publish.button": { + "defaultMessage": "Accept" + }, + "publish.checkbox": { + "defaultMessage": "Enable public sharing" + }, + "publish.description": { + "defaultMessage": "By publishing the map you make it visible to everyone on the Internet." + }, + "publish.embedded": { + "defaultMessage": "Embedded" + }, + "publish.embedded-msg": { + "defaultMessage": "Copy this snippet of code to embed in your blog or page:" + }, + "publish.public-url": { + "defaultMessage": "Public URL" + }, + "publish.public-url-msg": { + "defaultMessage": "Copy and paste the link below to share your map with colleagues:" + }, + "publish.title": { + "defaultMessage": "Publish" + }, + "registation.success-title": { + "defaultMessage": "Registation Success | WiseMapping" + }, + "registration.desc": { + "defaultMessage": "Signing up is free and just take a moment" + }, + "registration.email": { + "defaultMessage": "Email" + }, + "registration.firstname": { + "defaultMessage": "First Name" + }, + "registration.lastname": { + "defaultMessage": "Last Name" + }, + "registration.page-title": { + "defaultMessage": "Registration | WiseMapping" + }, + "registration.password": { + "defaultMessage": "Password" + }, + "registration.register": { + "defaultMessage": "Register" + }, + "registration.success.desc": { + "defaultMessage": "Click 'Sign In' button below and start creating mind maps." + }, + "registration.termandconditions": { + "defaultMessage": "Terms of Client: Please check the WiseMapping Account information you've entered above, and review the Terms of Client here. By clicking on 'Register' below you are agreeing to the Terms of Client above and the Privacy Policy" + }, + "registration.title": { + "defaultMessage": "Become a member" + }, + "rename.description": { + "defaultMessage": "Please, fill the new map name and description." + }, + "rename.title": { + "defaultMessage": "Rename" + }, + "resetpassword.success.title": { + "defaultMessage": "Your account has been created successfully" + }, + "role.editor": { + "defaultMessage": "Editor" + }, + "role.owner": { + "defaultMessage": "Owner" + }, + "role.viewer": { + "defaultMessage": "Viewer" + }, + "share.add-button": { + "defaultMessage": "Add" + }, + "share.add-message": { + "defaultMessage": "Add message" + }, + "share.can-edit": { + "defaultMessage": "Can edit" + }, + "share.can-view": { + "defaultMessage": "Can view" + }, + "share.delete": { + "defaultMessage": "Delete collaborator" + }, + "share.delete-description": { + "defaultMessage": "Invite people to collaborate with you in the creation of your mindmap. They will be notified by email." + }, + "share.delete-title": { + "defaultMessage": "Share with people" + }, + "share.message": { + "defaultMessage": "Message" + } } \ No newline at end of file diff --git a/packages/webapp/lang/es.json b/packages/webapp/lang/es.json index 0294fe9f..a46899fe 100644 --- a/packages/webapp/lang/es.json +++ b/packages/webapp/lang/es.json @@ -204,7 +204,7 @@ "defaultMessage": "Crear" }, "import.description": { - "defaultMessage": "Puede importar mapas de FreeMind 1.0.1 y WiseMapping a su lista de mapas. Seleccione el archivo que desea importar." + "defaultMessage": "Puede importar mapas de WiseMapping a su lista de mapas. Seleccione el archivo que desea importar." }, "import.title": { "defaultMessage": "Importar mapa mental existente" diff --git a/packages/webapp/lang/fr.json b/packages/webapp/lang/fr.json index c9155b87..95b36f63 100644 --- a/packages/webapp/lang/fr.json +++ b/packages/webapp/lang/fr.json @@ -204,7 +204,7 @@ "defaultMessage": "Créer" }, "import.description": { - "defaultMessage": "Vous pouvez importer des cartes FreeMind 1.0.1 et WiseMapping dans votre liste de cartes. Sélectionnez le fichier que vous souhaitez importer." + "defaultMessage": "Vous pouvez importer des cartes WiseMapping dans votre liste de cartes. Sélectionnez le fichier que vous souhaitez importer." }, "import.title": { "defaultMessage": "Importer une carte mentale existante" @@ -460,7 +460,7 @@ "defaultMessage": "Supprimer un collaborateur" }, "share.delete-description": { - "defaultMessage": "Invitez des personnes à collaborer avec vous dans la création de votre mindmap. Ils seront prévenus par email." + "defaultMessage": "Invitez des personnes à collaborer avec vous dans la création de votre midnmap. Ils seront prévenus par email." }, "share.delete-title": { "defaultMessage": "Partager avec les gens" @@ -469,9 +469,36 @@ "defaultMessage": "Message" }, "editor.try-welcome": { - "defaultMessage": "Cet espace d'édition présente certaines des fonctionnalités de l'éditeur de cartes mentales !" + "defaultMessage": "" }, "editor.try-welcome-description": { - "defaultMessage": "Inscrivez-vous pour commencer à créer, partager et publier gratuitement un nombre illimité de cartes mentales." + "defaultMessage": "" + }, + "accountinfo.deleteaccount": { + "defaultMessage": "Supprimer le compte" + }, + "label.add-button": { + "defaultMessage": "Ajouter une étiquette" + }, + "label.add-for": { + "defaultMessage": "Modification des étiquettes pour les cartes :" + }, + "label.add-placeholder": { + "defaultMessage": "Titre de l'étiquette" + }, + "label.change-color": { + "defaultMessage": "Changer la couleur de l'étiquette" + }, + "label.delete-description": { + "defaultMessage": "sera supprimé, y compris ses associations à toutes les cartes existantes. Voulez-vous continuer?" + }, + "label.delete-title": { + "defaultMessage": "Confirmer la suppression de l'étiquette" + }, + "label.description": { + "defaultMessage": "Utilisez des étiquettes pour organiser vos cartes." + }, + "label.title": { + "defaultMessage": "Ajouter une étiquette" } } \ No newline at end of file diff --git a/packages/webapp/lang/ru.json b/packages/webapp/lang/ru.json new file mode 100644 index 00000000..1f73adea --- /dev/null +++ b/packages/webapp/lang/ru.json @@ -0,0 +1,477 @@ +{ + "account.delete-warning": { + "defaultMessage": "Помните, что вы не сможете восстановить созданные вами майнд-карты. Вся информация будет удалена безвозвратно." + }, + "accountinfo.button": { + "defaultMessage": "Сохранить" + }, + "accountinfo.email": { + "defaultMessage": "Email" + }, + "accountinfo.firstname": { + "defaultMessage": "Имя" + }, + "accountinfo.lastname": { + "defaultMessage": "Фамилия" + }, + "accountinfo.title": { + "defaultMessage": "Информация" + }, + "action.cancel-button": { + "defaultMessage": "Отмена" + }, + "action.close-button": { + "defaultMessage": "Закрыть" + }, + "action.delete": { + "defaultMessage": "Удалить" + }, + "action.delete-description": { + "defaultMessage": "Удаление майндкарты - необратимый процесс без возможности восстановления. Точно удалить майндкарту?." + }, + "action.delete-title": { + "defaultMessage": "Удалить" + }, + "action.duplicate": { + "defaultMessage": "Клонировать" + }, + "action.export": { + "defaultMessage": "Экспорт" + }, + "action.history": { + "defaultMessage": "История" + }, + "action.history-description": { + "defaultMessage": "Список изменений за последние 90 дней." + }, + "action.history-title": { + "defaultMessage": "История версий" + }, + "action.import": { + "defaultMessage": "Импорт" + }, + "action.info": { + "defaultMessage": "Инфо" + }, + "action.label": { + "defaultMessage": "Добавить метку" + }, + "action.new": { + "defaultMessage": "Новая майнд-карта" + }, + "action.open": { + "defaultMessage": "Открыть" + }, + "action.print": { + "defaultMessage": "Печать" + }, + "action.publish": { + "defaultMessage": "Опубликовать" + }, + "action.rename": { + "defaultMessage": "Переименовать" + }, + "action.rename-description-placeholder": { + "defaultMessage": "Описание" + }, + "action.rename-name-placeholder": { + "defaultMessage": "Имя" + }, + "action.share": { + "defaultMessage": "Открыть доступ" + }, + "changepwd.button": { + "defaultMessage": "Изменить" + }, + "changepwd.confirm-password": { + "defaultMessage": "Подтвердить пароль" + }, + "changepwd.description": { + "defaultMessage": "Укажите новый пароль вашей учетной записи." + }, + "changepwd.password": { + "defaultMessage": "Пароль" + }, + "changepwd.password-match": { + "defaultMessage": "Пароли не совпадают. Пожалуйста, попробуйте еще раз." + }, + "changepwd.title": { + "defaultMessage": "Изменить пароль" + }, + "common.wait": { + "defaultMessage": "Подождите..." + }, + "create.button": { + "defaultMessage": "Создать" + }, + "create.description": { + "defaultMessage": "Пожалуйста, укажите имя и описание." + }, + "create.title": { + "defaultMessage": "Создание новой майнд-карты." + }, + "deletem.title": { + "defaultMessage": "Все выбранные карты будут удалены" + }, + "duplicate.title": { + "defaultMessage": "Клонировать" + }, + "expired.description": { + "defaultMessage": "Время вашей сессии истекло. Пожалуйста, авторизуйтесь и попробуйте снова." + }, + "expired.title": { + "defaultMessage": "Время вашей сессии истекло" + }, + "export.desc": { + "defaultMessage": "Выгрузите эту карту в формате, который нужен - вставка в презентацию, отправка по почте, оффлайн работа." + }, + "export.document": { + "defaultMessage": "Майнд-карта: Экспорт в различных форматах редакторов майнд-карт" + }, + "export.document-label": { + "defaultMessage": "Документ: Экспорт в формате документа" + }, + "export.image": { + "defaultMessage": "Рисунок: Экспорт рисунка вашей карты с учетом всех цветов и форм." + }, + "export.title": { + "defaultMessage": "Экспорт" + }, + "export.warning": { + "defaultMessage": "Экспорт рисунком (SVG,PNG,JPEG,PDF) доступен только из панели редактирования." + }, + "footer.aboutus": { + "defaultMessage": "О Нас" + }, + "footer.contactus": { + "defaultMessage": "Контакты" + }, + "footer.faq": { + "defaultMessage": "F.A.Q." + }, + "footer.faqandhelp": { + "defaultMessage": "Помощь & FAQ" + }, + "footer.feedback": { + "defaultMessage": "Обратная связь" + }, + "footer.opensource": { + "defaultMessage": "Open Source" + }, + "footer.others": { + "defaultMessage": "Прочее" + }, + "footer.termsandconditions": { + "defaultMessage": "Общие Правила" + }, + "forgot.desc": { + "defaultMessage": "Мы отправим Вам e-mail для восстановления пароля." + }, + "forgot.email": { + "defaultMessage": "Email" + }, + "forgot.page-title": { + "defaultMessage": "Забыл пароль | WiseMapping" + }, + "forgot.register": { + "defaultMessage": "Отправить" + }, + "forgot.success.desc": { + "defaultMessage": "Мы отправили e-mail с инструкциями по восстановлению пароля. Вы должны получить его в течение пары минут." + }, + "forgot.success.title": { + "defaultMessage": "Ваш временный пароль отправлен." + }, + "forgot.title": { + "defaultMessage": "Установить новый пароль" + }, + "forgotsuccess.page-title": { + "defaultMessage": "Пароль восстановлен | WiseMapping" + }, + "header.donthaveaccount": { + "defaultMessage": "Нет аккаунта?" + }, + "header.haveaccount": { + "defaultMessage": "Уже есть аккаунт?" + }, + "help.support": { + "defaultMessage": "Поддержка" + }, + "history.no-changes": { + "defaultMessage": "Нет доступных изменений" + }, + "import.button": { + "defaultMessage": "Создать" + }, + "import.description": { + "defaultMessage": "Можно импортировать FreeMind 1.0.1 и WiseMapping файлы. Выберите файл, который хотите импортировать." + }, + "import.title": { + "defaultMessage": "Загрузить майнд-карту с компьютера" + }, + "info.basic-info": { + "defaultMessage": "Основная информация" + }, + "info.button": { + "defaultMessage": "Принять" + }, + "info.creation-time": { + "defaultMessage": "Дата создания" + }, + "info.creator": { + "defaultMessage": "Автор" + }, + "info.description": { + "defaultMessage": "Описание" + }, + "info.description-msg": { + "defaultMessage": "После публикация карта станет видима для любого, у кого есть ссылка." + }, + "info.modified-time": { + "defaultMessage": "Последние изменения" + }, + "info.modified-tny": { + "defaultMessage": "Последний редактировал" + }, + "info.name": { + "defaultMessage": "Имя" + }, + "info.public-visibility": { + "defaultMessage": "Доступ по ссылке" + }, + "info.sharing": { + "defaultMessage": "Видимость" + }, + "info.starred": { + "defaultMessage": "Важная" + }, + "info.title": { + "defaultMessage": "Инфо" + }, + "language.change": { + "defaultMessage": "Сменить язык" + }, + "language.help": { + "defaultMessage": "Помочь переводить" + }, + "login.desc": { + "defaultMessage": "Войдите в свой аккаунт" + }, + "login.email": { + "defaultMessage": "Email" + }, + "login.error": { + "defaultMessage": "Некорректный email или пароль." + }, + "login.forgotpwd": { + "defaultMessage": "Забыли пароль?" + }, + "login.hsqldbcofig": { + "defaultMessage": "Although HSQLDB is bundled with WiseMapping by default during the installation, we do not recommend this database for production use. Please consider using MySQL 5.7 instead. You can find more information how to configure MySQL", + "description": "Missing production database configured" + }, + "login.page-title": { + "defaultMessage": "Вход | WiseMapping" + }, + "login.password": { + "defaultMessage": "Пароль" + }, + "login.remberme": { + "defaultMessage": "Запомнить меня" + }, + "login.signin": { + "defaultMessage": "Вход" + }, + "login.signup": { + "defaultMessage": "Регистрация" + }, + "login.title": { + "defaultMessage": "Добро пожаловать!" + }, + "login.userinactive": { + "defaultMessage": "Ваш аккаунт еще не активирован. Вам на почту придет сообщение о его активации. На связи!." + }, + "map.creator": { + "defaultMessage": "Создатель" + }, + "map.delete-selected": { + "defaultMessage": "Удалить выбранные" + }, + "map.last-update": { + "defaultMessage": "Последнее изменение" + }, + "map.more-actions": { + "defaultMessage": "Больше... " + }, + "map.name": { + "defaultMessage": "Имя" + }, + "map.tooltip-add": { + "defaultMessage": "Добавить метку выбранным" + }, + "maps.choose-file": { + "defaultMessage": "Выберите файл" + }, + "maps.create-tooltip": { + "defaultMessage": "Создать новую майнд-карту" + }, + "maps.empty-result": { + "defaultMessage": "Нет карт, подходящих под условия фильтра." + }, + "maps.import-desc": { + "defaultMessage": "Загрузить из других редакторов" + }, + "maps.modified": { + "defaultMessage": "Изменена" + }, + "maps.modified-by": { + "defaultMessage": "Редактор" + }, + "maps.modified-by-desc": { + "defaultMessage": "Изменена {by} в {on}" + }, + "maps.nav-all": { + "defaultMessage": "Все" + }, + "maps.nav-onwned": { + "defaultMessage": "Созданные мной" + }, + "maps.nav-public": { + "defaultMessage": "Публичные" + }, + "maps.nav-shared": { + "defaultMessage": "В общем доступе" + }, + "maps.nav-starred": { + "defaultMessage": "Отмеченные" + }, + "maps.page-title": { + "defaultMessage": "Мои карты | WiseMapping" + }, + "maps.revert": { + "defaultMessage": "Отменить" + }, + "maps.search-action": { + "defaultMessage": "Поиск ..." + }, + "maps.tooltip-open": { + "defaultMessage": "Открыть для редактирования" + }, + "maps.tooltip-starred": { + "defaultMessage": "Отмеченные" + }, + "maps.view": { + "defaultMessage": "Просмотр" + }, + "menu.account": { + "defaultMessage": "Профиль" + }, + "menu.change-password": { + "defaultMessage": "Сменить пароль" + }, + "menu.signout": { + "defaultMessage": "Выход" + }, + "publish.button": { + "defaultMessage": "Применить" + }, + "publish.checkbox": { + "defaultMessage": "Включить общий доступ" + }, + "publish.description": { + "defaultMessage": "После публикация карта станет видима для любого, у кого есть ссылка." + }, + "publish.embedded": { + "defaultMessage": "Встроить" + }, + "publish.embedded-msg": { + "defaultMessage": "Скопируйте этот код, чтобы встроить майнд-карту в ваш сайт:" + }, + "publish.public-url": { + "defaultMessage": "Публичный URL" + }, + "publish.public-url-msg": { + "defaultMessage": "Скопируйте ссылку, чтобы поделиться с коллегами доступом к карте:" + }, + "publish.title": { + "defaultMessage": "Опубликовать" + }, + "registation.success-title": { + "defaultMessage": "Успешная регистрация | WiseMapping" + }, + "registration.desc": { + "defaultMessage": "Регистрация бесплатна и займет всего минуту" + }, + "registration.email": { + "defaultMessage": "Email" + }, + "registration.firstname": { + "defaultMessage": "Имя" + }, + "registration.lastname": { + "defaultMessage": "Фамилия" + }, + "registration.password": { + "defaultMessage": "Пароль" + }, + "registration.register": { + "defaultMessage": "Регистрация" + }, + "registration.success.desc": { + "defaultMessage": "Нажмите на кнопку 'Войти' и приступите к созданию майнд-карт." + }, + "registration.termandconditions": { + "defaultMessage": "Правила: Пожалуйста, проверьте информацию учетной записи WiseMapping, которую вы указали, и ознакомьтесь с Правилами. По нажатию на кнопку 'Регистрация' вы соглашаетесь с Правилами и Политикой Конфиденциальности" + }, + "registration.title": { + "defaultMessage": "Become a member" + }, + "rename.description": { + "defaultMessage": "Пожалуйста, укажите новое имя и описание." + }, + "rename.title": { + "defaultMessage": "Rename" + }, + "resetpassword.success.title": { + "defaultMessage": "Аккаунт был успешно создан!" + }, + "role.editor": { + "defaultMessage": "Редактор" + }, + "role.owner": { + "defaultMessage": "Владелец" + }, + "role.viewer": { + "defaultMessage": "Читатель" + }, + "share.add-button": { + "defaultMessage": "Добавить" + }, + "share.add-message": { + "defaultMessage": "Добавить сообщение" + }, + "share.can-edit": { + "defaultMessage": "Редактирование" + }, + "share.can-view": { + "defaultMessage": "Просмотр" + }, + "share.delete": { + "defaultMessage": "Отозвать доступ" + }, + "share.delete-description": { + "defaultMessage": "Пригласите людей для совместной работы над картой. Они получат письмо с приглашением." + }, + "share.delete-title": { + "defaultMessage": "Общий доступ" + }, + "share.message": { + "defaultMessage": "Сообщение" + }, + "editor.try-welcome": { + "defaultMessage": "Здесь можно ознакомиться с возможностями нашего редактора майнд-карт на примерах и практике!" + }, + "editor.try-welcome-description": { + "defaultMessage": "Зарегистрируйтесь, чтобы создавать, делиться и публиковать майнд-карты бесплатно и без ограничений!" + } +} \ No newline at end of file diff --git a/packages/webapp/package.json b/packages/webapp/package.json index b9a91f65..cf5225aa 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -1,6 +1,6 @@ { "name": "@wisemapping/webapp", - "version": "5.0.4", + "version": "5.0.8", "main": "app.jsx", "scripts": { "start": "webpack serve --config webpack.dev.js ", @@ -9,7 +9,7 @@ "lint": "eslint src", "cy:run": "cypress run", "test:integration": "start-server-and-test start http-get://localhost:3000 cy:run", - "extract": "for lang in {'es','en','fr','de'};do formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/${lang}.json;done", + "extract": "formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/en.json", "compile": "formatjs compile", "test": "yarn test:integration" }, diff --git a/packages/webapp/src/@types/index.d.ts b/packages/webapp/src/@types/index.d.ts index e238d01c..18f29971 100644 --- a/packages/webapp/src/@types/index.d.ts +++ b/packages/webapp/src/@types/index.d.ts @@ -1,2 +1,13 @@ declare module '*.png'; declare module '*.svg'; +declare module '*.wxml'; +declare global { + const lockTimestamp: string; + const lockSession: string; + const isAuth: boolean; + const mapId: number; + const userOptions: { zoom: string | number } | null; + const mindmapLocked: boolean; + const mindmapLockedMsg: string; + const mapTitle: string; +} diff --git a/packages/webapp/src/app.tsx b/packages/webapp/src/app.tsx index 34f84ab7..7733404e 100644 --- a/packages/webapp/src/app.tsx +++ b/packages/webapp/src/app.tsx @@ -14,8 +14,10 @@ import AppI18n, { Locales } from './classes/app-i18n'; import MapsPage from './components/maps-page'; import CssBaseline from '@mui/material/CssBaseline'; import { ThemeProvider, Theme, StyledEngineProvider } from '@mui/material/styles'; -import GoogleAnalytics from 'react-ga'; +import ReactGA from 'react-ga'; import EditorPage from './components/editor-page'; +import AppConfig from './classes/app-config'; +import withSessionExpirationHandling from './components/HOCs/withSessionExpirationHandling'; declare module '@mui/styles/defaultTheme' { @@ -23,9 +25,8 @@ declare module '@mui/styles/defaultTheme' { interface DefaultTheme extends Theme { } } - // Google Analytics Initialization. -GoogleAnalytics.initialize('UA-0000000-0'); +ReactGA.initialize(AppConfig.getGoogleAnalyticsAccount()); const queryClient = new QueryClient({ defaultOptions: { @@ -38,10 +39,7 @@ const queryClient = new QueryClient({ const App = (): ReactElement => { const locale = AppI18n.getBrowserLocale(); - - // global variables set server-side - const istTryMode = global.memoryPersistence; - const mapId = parseInt(global.mapId, 10); + const EnhacedEditorPage = withSessionExpirationHandling(EditorPage); return locale.message ? ( <Provider store={store}> @@ -80,13 +78,13 @@ const App = (): ReactElement => { /> <Route exact path="/c/maps/" - component={MapsPage} + component={withSessionExpirationHandling(MapsPage)} /> <Route exact path="/c/maps/:id/edit"> - <EditorPage isTryMode={istTryMode} mapId={mapId} /> + <EnhacedEditorPage isTryMode={false} /> </Route> <Route exact path="/c/maps/:id/try"> - <EditorPage isTryMode={istTryMode} mapId={mapId} /> + <EnhacedEditorPage isTryMode={true} /> </Route> </Switch> </Router> diff --git a/packages/webapp/src/classes/app-config/index.ts b/packages/webapp/src/classes/app-config/index.ts index 7524aed4..9c9be003 100644 --- a/packages/webapp/src/classes/app-config/index.ts +++ b/packages/webapp/src/classes/app-config/index.ts @@ -1,4 +1,3 @@ -import { sessionExpired } from "../../redux/clientSlice"; import Client from "../client"; import CacheDecoratorClient from "../client/cache-decorator-client"; import MockClient from "../client/mock-client"; @@ -22,6 +21,11 @@ class _AppConfig { recaptcha2SiteKey: '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI' } + isDevelopEnv(): boolean { + const config = this.getInstance(); + return config.clientType === 'mock'; + } + private getInstance(): Config { // Config can be inserted in the html page to define the global properties ... // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -53,9 +57,7 @@ class _AppConfig { const config = this.getInstance(); let result: Client; if (config.clientType == 'rest') { - result = new RestClient(config.apiBaseUrl, () => { - sessionExpired(); - }); + result = new RestClient(config.apiBaseUrl); console.log('Service using rest client. ' + JSON.stringify(config)); } else { console.log('Warning:Service using mockservice client'); diff --git a/packages/webapp/src/classes/app-i18n/index.ts b/packages/webapp/src/classes/app-i18n/index.ts index b361721a..c43439aa 100644 --- a/packages/webapp/src/classes/app-i18n/index.ts +++ b/packages/webapp/src/classes/app-i18n/index.ts @@ -2,6 +2,7 @@ import { fetchAccount } from './../../redux/clientSlice'; import 'dayjs/locale/fr'; import 'dayjs/locale/en'; import 'dayjs/locale/es'; +import 'dayjs/locale/ru'; export class Locale { code: LocaleCode; @@ -17,8 +18,16 @@ export class Locale { export default abstract class AppI18n { public static getUserLocale(): Locale { - const account = fetchAccount(); - return account?.locale ? account.locale : this.getBrowserLocale(); + // @Todo Hack: Try page must not account info. Add this to avoid 403 errors. + const isTryPage = window.location.href.endsWith('/try'); + let result: Locale; + if (!isTryPage) { + const account = fetchAccount(); + result = account?.locale ? account.locale : this.getBrowserLocale(); + } else { + result = this.getBrowserLocale(); + } + return result; } public static getBrowserLocale(): Locale { @@ -38,16 +47,18 @@ export default abstract class AppI18n { } } -export type LocaleCode = 'en' | 'es' | 'fr' | 'de'; +export type LocaleCode = 'en' | 'es' | 'fr' | 'de' | 'ru'; export const Locales = { EN: new Locale('en', 'English', require('./../../compiled-lang/en.json')), // eslint-disable-line ES: new Locale('es', 'Español', require('./../../compiled-lang/es.json')), // eslint-disable-line DE: new Locale('fr', 'Français', require('./../../compiled-lang/fr.json')), // eslint-disable-line FR: new Locale('de', 'Deutsch', require('./../../compiled-lang/de.json')), // eslint-disable-line + RU: new Locale('ru', 'Pусский', require('./../../compiled-lang/ru.json')), // eslint-disable-line }; + export const localeFromStr = (code: string): Locale => { const locales: Locale[] = Object.values(Locales); diff --git a/packages/webapp/src/classes/client/cache-decorator-client/index.ts b/packages/webapp/src/classes/client/cache-decorator-client/index.ts index 8c988e4e..6cfa3735 100644 --- a/packages/webapp/src/classes/client/cache-decorator-client/index.ts +++ b/packages/webapp/src/classes/client/cache-decorator-client/index.ts @@ -1,4 +1,4 @@ -import { Mindmap } from '@wisemapping/mindplot'; +import { EditorRenderMode, Mindmap, PersistenceManager } from '@wisemapping/mindplot'; import Client, { AccountInfo, BasicMapInfo, @@ -17,7 +17,11 @@ class CacheDecoratorClient implements Client { constructor(client: Client) { this.client = client; } - + + onSessionExpired(callback?: () => void): () => void { + return this.client.onSessionExpired(callback); + } + fetchMindmap(id: number): Mindmap { return this.client.fetchMindmap(id); } @@ -125,6 +129,15 @@ class CacheDecoratorClient implements Client { revertHistory(id: number, cid: number): Promise<void> { return this.client.revertHistory(id, cid); } + + buildPersistenceManager(mode: EditorRenderMode): PersistenceManager { + return this.client.buildPersistenceManager(mode); + } + + removePersistenceManager(): void { + return this.client.removePersistenceManager(); + } + } export default CacheDecoratorClient; \ No newline at end of file diff --git a/packages/webapp/src/classes/client/client-health-sentinel/index.tsx b/packages/webapp/src/classes/client/client-health-sentinel/index.tsx index f442306f..468882bb 100644 --- a/packages/webapp/src/classes/client/client-health-sentinel/index.tsx +++ b/packages/webapp/src/classes/client/client-health-sentinel/index.tsx @@ -45,7 +45,7 @@ const ClientHealthSentinel = (): React.ReactElement => { <DialogActions> <Button type="button" color="primary" size="medium" onClick={handleOnClose}> - <FormattedMessage id="action.close-button" defaultMessage="Close" /> + <FormattedMessage id="login.signin" defaultMessage="Sign In" /> </Button> </DialogActions> </Dialog> diff --git a/packages/webapp/src/classes/client/index.ts b/packages/webapp/src/classes/client/index.ts index 09728cb3..846f2894 100644 --- a/packages/webapp/src/classes/client/index.ts +++ b/packages/webapp/src/classes/client/index.ts @@ -1,4 +1,4 @@ -import { Mindmap } from '@wisemapping/mindplot'; +import { EditorRenderMode, Mindmap, PersistenceManager } from '@wisemapping/mindplot'; import { Locale, LocaleCode } from '../app-i18n'; export type NewUser = { @@ -107,8 +107,12 @@ interface Client { fetchHistory(id: number): Promise<ChangeHistory[]>; revertHistory(id: number, cid: number): Promise<void>; - fetchMindmap(id:number): Mindmap; + fetchMindmap(id: number): Mindmap; + buildPersistenceManager(mode: EditorRenderMode): PersistenceManager; + removePersistenceManager(): void; + + onSessionExpired(callback?: () => void): () => void; } export default Client; diff --git a/packages/webapp/src/classes/client/mock-client/example-map.wxml b/packages/webapp/src/classes/client/mock-client/example-map.wxml new file mode 100644 index 00000000..6d0ab9c5 --- /dev/null +++ b/packages/webapp/src/classes/client/mock-client/example-map.wxml @@ -0,0 +1,70 @@ +<map name="3" version="tango"> + <topic central="true" text="Welcome To WiseMapping" id="1" fontStyle=";;#ffffff;;;"> + <icon id="sign_info"/> + <topic position="199,-112" order="0" id="30"> + <text><![CDATA[5 min tutorial video ? +Follow the link ! + + + + + + + + Press "enter" to add a +Sibling + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/webapp/src/classes/client/mock-client/index.ts b/packages/webapp/src/classes/client/mock-client/index.ts index 57376cea..9d193e21 100644 --- a/packages/webapp/src/classes/client/mock-client/index.ts +++ b/packages/webapp/src/classes/client/mock-client/index.ts @@ -1,4 +1,4 @@ -import { Mindmap } from '@wisemapping/mindplot'; +import { Mindmap, MockPersistenceManager, PersistenceManager } from '@wisemapping/mindplot'; import XMLSerializerTango from '@wisemapping/mindplot/src/components/persistence/XMLSerializerTango'; import Client, { AccountInfo, @@ -11,6 +11,7 @@ import Client, { Permission, } from '..'; import { LocaleCode, localeFromStr } from '../../app-i18n'; +import exampleMap from './example-map.wxml'; const label1: Label = { id: 1, @@ -34,6 +35,7 @@ class MockClient implements Client { private maps: MapInfo[] = []; private labels: Label[] = []; private permissionsByMap: Map = new Map(); + private persistenceManager: PersistenceManager; constructor() { // Remove, just for develop .... @@ -96,7 +98,7 @@ class MockClient implements Client { 12, false, 'El Mapa3', - [label2, label3], + [label2, label3], 'Paulo3', '2008-06-02T00:00:00Z', 'Berna', @@ -109,7 +111,11 @@ class MockClient implements Client { this.labels = [label1, label2, label3]; } - + + onSessionExpired(callback?: () => void): () => void { + return callback; + } + fetchMindmap(id: number): Mindmap { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(` @@ -329,7 +335,7 @@ class MockClient implements Client { createLabel(title: string, color: string): Promise { const newId = Math.max.apply(Number, this.labels.map(l => l.id)) + 1; - this.labels.push({ + this.labels.push({ id: newId, title, color, @@ -340,8 +346,8 @@ class MockClient implements Client { deleteLabel(id: number): Promise { this.labels = this.labels.filter((l) => l.id != id); this.maps = this.maps.map(m => { - return { - ...m, + return { + ...m, labels: m.labels.filter((l) => l.id != id) }; }); @@ -351,7 +357,7 @@ class MockClient implements Client { addLabelToMap(labelId: number, mapId: number): Promise { const labelToAdd = this.labels.find((l) => l.id === labelId); if (!labelToAdd) { - return Promise.reject({ msg: `unable to find label with id ${labelId}`}); + return Promise.reject({ msg: `unable to find label with id ${labelId}` }); } const map = this.maps.find((m) => m.id === mapId); if (!map) { @@ -392,6 +398,21 @@ class MockClient implements Client { console.log('email:' + email); return Promise.resolve(); } + + buildPersistenceManager(): PersistenceManager { + if (this.persistenceManager) { + return this.persistenceManager; + } + const persistence: PersistenceManager = new MockPersistenceManager(exampleMap); + this.persistenceManager = persistence; + return persistence; + } + + removePersistenceManager(): void { + if (this.persistenceManager) { + delete this.persistenceManager; + } + } } export default MockClient; diff --git a/packages/webapp/src/classes/client/rest-client/index.ts b/packages/webapp/src/classes/client/rest-client/index.ts index 5fdd6285..38273db6 100644 --- a/packages/webapp/src/classes/client/rest-client/index.ts +++ b/packages/webapp/src/classes/client/rest-client/index.ts @@ -1,5 +1,6 @@ -import { LocalStorageManager, Mindmap } from '@wisemapping/mindplot'; -import axios from 'axios'; +import { EditorRenderMode, LocalStorageManager, Mindmap, PersistenceManager, RESTPersistenceManager } from '@wisemapping/mindplot'; +import { PersistenceError } from '@wisemapping/mindplot/src/components/PersistenceManager'; +import axios, { AxiosInstance, AxiosResponse } from 'axios'; import Client, { ErrorInfo, MapInfo, @@ -11,15 +12,46 @@ import Client, { ImportMapInfo, Permission, } from '..'; +import { getCsrfToken } from '../../../utils'; import { LocaleCode, localeFromStr } from '../../app-i18n'; export default class RestClient implements Client { private baseUrl: string; - private sessionExpired: () => void; + private persistenceManager: PersistenceManager; + private axios: AxiosInstance; - constructor(baseUrl: string, sessionExpired: () => void) { + private checkResponseForSessionExpired = (error: { response?: AxiosResponse }): Promise<{ response?: AxiosResponse }> => { + // TODO: Improve session timeout response and response handling + if (error.response && error.response.status === 405) { + this.sessionExpired(); + } + return Promise.reject(error); + }; + + constructor(baseUrl: string) { this.baseUrl = baseUrl; - this.sessionExpired = sessionExpired; + this.axios = axios.create({ maxRedirects: 0 }); + const csrfToken = getCsrfToken(); + if (csrfToken) { + this.axios.defaults.headers['X-CSRF-TOKEN'] = csrfToken; + } else { + console.warn('csrf token not found in html head'); + } + this.axios.interceptors.response.use((r) => r, (r) => this.checkResponseForSessionExpired(r)); + } + + private _onSessionExpired: () => void; + onSessionExpired(callback?: () => void): () => void { + if (callback) { + this._onSessionExpired = callback; + } + return this._onSessionExpired; + } + + private sessionExpired() { + if (this._onSessionExpired) { + this._onSessionExpired(); + } } fetchMindmap(id: number): Mindmap { @@ -34,8 +66,8 @@ export default class RestClient implements Client { deleteMapPermission(id: number, email: string): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios - .delete(`${this.baseUrl}/c/restful/maps/${id}/collabs?email=${email}`, { + this.axios + .delete(`${this.baseUrl}/c/restful/maps/${id}/collabs?email=${encodeURIComponent(email)}`, { headers: { 'Content-Type': 'text/plain' }, }) .then(() => { @@ -51,11 +83,11 @@ export default class RestClient implements Client { // eslint-disable-next-line @typescript-eslint/no-unused-vars addMapPermissions(id: number, message: string, permissions: Permission[]): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put( `${this.baseUrl}/c/restful/maps/${id}/collabs/`, { - messasge: message, + message: message, collaborations: permissions, }, { headers: { 'Content-Type': 'application/json' } } @@ -77,7 +109,7 @@ export default class RestClient implements Client { success: (labels: Permission[]) => void, reject: (error: ErrorInfo) => void ) => { - axios + this.axios .get(`${this.baseUrl}/c/restful/maps/${id}/collabs`, { headers: { 'Content-Type': 'text/plain' }, }) @@ -104,7 +136,7 @@ export default class RestClient implements Client { deleteAccount(): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .delete(`${this.baseUrl}/c/restful/account`, { headers: { 'Content-Type': 'text/plain' }, }) @@ -121,12 +153,12 @@ export default class RestClient implements Client { updateAccountInfo(firstname: string, lastname: string): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put(`${this.baseUrl}/c/restful/account/firstname`, firstname, { headers: { 'Content-Type': 'text/plain' }, }) .then(() => { - return axios.put(`${this.baseUrl}/c/restful/account/lastname`, lastname, { + return this.axios.put(`${this.baseUrl}/c/restful/account/lastname`, lastname, { headers: { 'Content-Type': 'text/plain' }, }); }) @@ -144,7 +176,7 @@ export default class RestClient implements Client { updateAccountPassword(pasword: string): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put(`${this.baseUrl}/c/restful/account/password`, pasword, { headers: { 'Content-Type': 'text/plain' }, }) @@ -161,7 +193,7 @@ export default class RestClient implements Client { updateAccountLanguage(locale: LocaleCode): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put(`${this.baseUrl}/c/restful/account/locale`, locale, { headers: { 'Content-Type': 'text/plain' }, }) @@ -179,9 +211,9 @@ export default class RestClient implements Client { importMap(model: ImportMapInfo): Promise { const handler = (success: (mapId: number) => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post( - `${this.baseUrl}/c/restful/maps?title=${model.title}&description=${model.description ? model.description : '' + `${this.baseUrl}/c/restful/maps?title=${encodeURIComponent(model.title)}&description=${model.description ? model.description : '' }`, model.content, { headers: { 'Content-Type': 'application/xml' } } @@ -203,7 +235,7 @@ export default class RestClient implements Client { success: (account: AccountInfo) => void, reject: (error: ErrorInfo) => void ) => { - axios + this.axios .get(`${this.baseUrl}/c/restful/account`, { headers: { 'Content-Type': 'application/json' }, }) @@ -227,7 +259,7 @@ export default class RestClient implements Client { deleteMaps(ids: number[]): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .delete(`${this.baseUrl}/c/restful/maps/batch?ids=${ids.join()}`, { headers: { 'Content-Type': 'text/plain' }, }) @@ -245,7 +277,7 @@ export default class RestClient implements Client { updateMapToPublic(id: number, isPublic: boolean): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put(`${this.baseUrl}/c/restful/maps/${id}/publish`, isPublic.toString(), { headers: { 'Content-Type': 'text/plain' }, }) @@ -262,7 +294,7 @@ export default class RestClient implements Client { revertHistory(id: number, hid: number): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post(`${this.baseUrl}/c/restful/maps/${id}/history/${hid}`, null, { headers: { 'Content-Type': 'text/pain' }, }) @@ -282,7 +314,7 @@ export default class RestClient implements Client { success: (historyList: ChangeHistory[]) => void, reject: (error: ErrorInfo) => void ) => { - axios + this.axios .get(`${this.baseUrl}/c/restful/maps/${id}/history/`, { headers: { 'Content-Type': 'application/json' }, }) @@ -307,12 +339,12 @@ export default class RestClient implements Client { renameMap(id: number, basicInfo: BasicMapInfo): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put(`${this.baseUrl}/c/restful/maps/${id}/title`, basicInfo.title, { headers: { 'Content-Type': 'text/plain' }, }) .then(() => { - return axios.put( + return this.axios.put( `${this.baseUrl}/c/restful/maps/${id}/description`, basicInfo.description || ' ', { headers: { 'Content-Type': 'text/plain' } } ); @@ -332,7 +364,7 @@ export default class RestClient implements Client { createMap(model: BasicMapInfo): Promise { const handler = (success: (mapId: number) => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post( `${this.baseUrl}/c/restful/maps?title=${model.title}&description=${model.description ? model.description : '' }`, @@ -356,7 +388,7 @@ export default class RestClient implements Client { success: (mapsInfo: MapInfo[]) => void, reject: (error: ErrorInfo) => void ) => { - axios + this.axios .get(`${this.baseUrl}/c/restful/maps/`, { headers: { 'Content-Type': 'application/json' }, }) @@ -390,7 +422,7 @@ export default class RestClient implements Client { registerNewUser(user: NewUser): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post(`${this.baseUrl}/service/users/`, JSON.stringify(user), { headers: { 'Content-Type': 'application/json' }, }) @@ -408,7 +440,7 @@ export default class RestClient implements Client { deleteMap(id: number): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .delete(`${this.baseUrl}/c/restful/maps/${id}`, { headers: { 'Content-Type': 'application/json' }, }) @@ -425,8 +457,8 @@ export default class RestClient implements Client { resetPassword(email: string): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios - .put(`${this.baseUrl}/service/users/resetPassword?email=${email}`, null, { + this.axios + .put(`${this.baseUrl}/service/users/resetPassword?email=${encodeURIComponent(email)}`, null, { headers: { 'Content-Type': 'application/json' }, }) .then(() => { @@ -444,7 +476,7 @@ export default class RestClient implements Client { duplicateMap(id: number, basicInfo: BasicMapInfo): Promise { const handler = (success: (mapId: number) => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post(`${this.baseUrl}/c/restful/maps/${id}`, JSON.stringify(basicInfo), { headers: { 'Content-Type': 'application/json' }, }) @@ -462,9 +494,8 @@ export default class RestClient implements Client { } updateStarred(id: number, starred: boolean): Promise { - console.debug(`Starred => ${starred}`) const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .put(`${this.baseUrl}/c/restful/maps/${id}/starred`, starred.toString(), { headers: { 'Content-Type': 'text/plain' }, }) @@ -485,7 +516,7 @@ export default class RestClient implements Client { success: (labels: Label[]) => void, reject: (error: ErrorInfo) => void ) => { - axios + this.axios .get(`${this.baseUrl}/c/restful/labels/`, { headers: { 'Content-Type': 'application/json' }, }) @@ -512,7 +543,7 @@ export default class RestClient implements Client { createLabel(title: string, color: string): Promise { const handler = (success: (labelId: number) => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post(`${this.baseUrl}/c/restful/labels`, JSON.stringify({ title, color, iconName: 'smile' }), { headers: { 'Content-Type': 'application/json' }, }) @@ -529,7 +560,7 @@ export default class RestClient implements Client { deleteLabel(id: number): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .delete(`${this.baseUrl}/c/restful/labels/${id}`) .then(() => { success(); @@ -544,7 +575,7 @@ export default class RestClient implements Client { addLabelToMap(labelId: number, mapId: number): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .post(`${this.baseUrl}/c/restful/maps/${mapId}/labels`, JSON.stringify(labelId), { headers: { 'Content-Type': 'application/json' }, }) @@ -561,7 +592,7 @@ export default class RestClient implements Client { deleteLabelFromMap(labelId: number, mapId: number): Promise { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { - axios + this.axios .delete(`${this.baseUrl}/c/restful/maps/${mapId}/labels/${labelId}`) .then(() => { success(); @@ -574,6 +605,44 @@ export default class RestClient implements Client { return new Promise(handler); } + private onPersistenceManagerError(error: PersistenceError) { + if (error.errorType === 'session-expired') { + this.sessionExpired(); + } + } + + buildPersistenceManager(editorMode: EditorRenderMode ): PersistenceManager { + if (this.persistenceManager) { + return this.persistenceManager; + } + let persistence: PersistenceManager; + if (editorMode === 'edition') { + persistence = new RESTPersistenceManager({ + documentUrl: '/c/restful/maps/{id}/document', + revertUrl: '/c/restful/maps/{id}/history/latest', + lockUrl: '/c/restful/maps/{id}/lock', + timestamp: global.lockTimestamp, + session: global.lockSession, + }); + } else { + persistence = new LocalStorageManager( + `/c/restful/maps/{id}/${global.historyId ? `${global.historyId}/` : ''}document/xml${editorMode === 'showcase' ? '-pub' : '' + }`, + true + ); + } + persistence.addErrorHandler((err) => this.onPersistenceManagerError(err)); + this.persistenceManager = persistence; + return persistence; + } + + removePersistenceManager(): void { + if (this.persistenceManager) { + this.persistenceManager.removeErrorHandler(); + delete this.persistenceManager; + } + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any private parseResponseOnError = (response: any): ErrorInfo => { console.error("Backend error=>"); diff --git a/packages/webapp/src/compiled-lang/de.json b/packages/webapp/src/compiled-lang/de.json index 69070a3b..8d7bd3be 100644 --- a/packages/webapp/src/compiled-lang/de.json +++ b/packages/webapp/src/compiled-lang/de.json @@ -11,6 +11,12 @@ "value": "Akzeptieren" } ], + "accountinfo.deleteaccount": [ + { + "type": 0, + "value": "Konto löschen" + } + ], "accountinfo.email": [ { "type": 0, @@ -422,7 +428,7 @@ "import.description": [ { "type": 0, - "value": "Sie können FreeMind 1.0.1- und WiseMapping-Karten in Ihre Kartenliste importieren. Wählen Sie die Datei aus, die Sie importieren möchten." + "value": "Sie können WiseMapping-Karten in Ihre Kartenliste importieren. Wählen Sie die Datei aus, die Sie importieren möchten." } ], "import.title": [ @@ -509,6 +515,54 @@ "value": "Die Info" } ], + "label.add-button": [ + { + "type": 0, + "value": "Etikett hinzufügen" + } + ], + "label.add-for": [ + { + "type": 0, + "value": "Beschriftungen für Karten bearbeiten:" + } + ], + "label.add-placeholder": [ + { + "type": 0, + "value": "Titel des Labels" + } + ], + "label.change-color": [ + { + "type": 0, + "value": "Etikettenfarbe ändern" + } + ], + "label.delete-description": [ + { + "type": 0, + "value": "gelöscht, einschließlich der Zuordnungen zu allen vorhandenen Karten. Möchtest du fortfahren?" + } + ], + "label.delete-title": [ + { + "type": 0, + "value": "Bestätigen Sie das Löschen des Labels" + } + ], + "label.description": [ + { + "type": 0, + "value": "Verwenden Sie Labels, um Ihre Karten zu organisieren." + } + ], + "label.title": [ + { + "type": 0, + "value": "Etikett hinzufügen" + } + ], "language.change": [ { "type": 0, diff --git a/packages/webapp/src/compiled-lang/en.json b/packages/webapp/src/compiled-lang/en.json index 5c2a9430..b473d642 100644 --- a/packages/webapp/src/compiled-lang/en.json +++ b/packages/webapp/src/compiled-lang/en.json @@ -2,7 +2,7 @@ "account.delete-warning": [ { "type": 0, - "value": "Keep in mind that you will not be able retrieve any mindmap you have created. All your information will be deleted and it can not be restored." + "value": "Keep in mind that you will not be able retrieve any mindmap you have added. All your information will be deleted and it can not be restored." } ], "accountinfo.button": [ @@ -11,6 +11,12 @@ "value": "Accept" } ], + "accountinfo.deleteaccount": [ + { + "type": 0, + "value": "Delete Account" + } + ], "accountinfo.email": [ { "type": 0, @@ -218,7 +224,7 @@ "create.title": [ { "type": 0, - "value": "Create a new mindmap." + "value": "Create a new mindmap" } ], "deletem.title": [ @@ -233,18 +239,6 @@ "value": "Duplicate" } ], - "editor.try-welcome": [ - { - "type": 0, - "value": "This edition space showcases some of the mindmap editor capabilities !" - } - ], - "editor.try-welcome-description": [ - { - "type": 0, - "value": "Sign Up to start creating, sharing and publishing unlimited number of mindmaps for free." - } - ], "expired.description": [ { "type": 0, @@ -422,7 +416,7 @@ "import.description": [ { "type": 0, - "value": "You can import FreeMind 1.0.1 and WiseMapping maps to your list of maps. Select the file you want to import." + "value": "You can import WiseMapping maps to your list of maps. Select the file you want to import." } ], "import.title": [ @@ -509,6 +503,54 @@ "value": "Info" } ], + "label.add-button": [ + { + "type": 0, + "value": "Add label" + } + ], + "label.add-for": [ + { + "type": 0, + "value": "Editing labels for maps:" + } + ], + "label.add-placeholder": [ + { + "type": 0, + "value": "Label title" + } + ], + "label.change-color": [ + { + "type": 0, + "value": "Change label color" + } + ], + "label.delete-description": [ + { + "type": 0, + "value": "will be deleted, including its associations to all existing maps. Do you want to continue?" + } + ], + "label.delete-title": [ + { + "type": 0, + "value": "Confirm label deletion" + } + ], + "label.description": [ + { + "type": 0, + "value": "Use labels to organize your maps." + } + ], + "label.title": [ + { + "type": 0, + "value": "Add a label" + } + ], "language.change": [ { "type": 0, @@ -644,7 +686,7 @@ "maps.empty-result": [ { "type": 0, - "value": "No matching record found with the current filter criteria." + "value": "No matching mindmap found with the current filter criteria." } ], "maps.import-desc": [ @@ -872,7 +914,7 @@ "registration.title": [ { "type": 0, - "value": "Become a member" + "value": "Registration | WiseMapping" } ], "rename.description": [ @@ -902,7 +944,7 @@ "role.owner": [ { "type": 0, - "value": "Onwer" + "value": "Owner" } ], "role.viewer": [ @@ -944,7 +986,7 @@ "share.delete-description": [ { "type": 0, - "value": "Invite people to collaborate with you in the creation of your midnmap. They will be notified by email." + "value": "Invite people to collaborate with you in the creation of your mindmap. They will be notified by email." } ], "share.delete-title": [ diff --git a/packages/webapp/src/compiled-lang/es.json b/packages/webapp/src/compiled-lang/es.json index 98fa8416..5c33da5f 100644 --- a/packages/webapp/src/compiled-lang/es.json +++ b/packages/webapp/src/compiled-lang/es.json @@ -422,7 +422,7 @@ "import.description": [ { "type": 0, - "value": "Puede importar mapas de FreeMind 1.0.1 y WiseMapping a su lista de mapas. Seleccione el archivo que desea importar." + "value": "Puede importar mapas de WiseMapping a su lista de mapas. Seleccione el archivo que desea importar." } ], "import.title": [ @@ -644,7 +644,7 @@ "maps.empty-result": [ { "type": 0, - "value": "No se encontró ningún registro coincidente con los criterios de filtro actuales." + "value": "No se encontró ningún mapa mental coincidente con los criterios de filtro actuales." } ], "maps.import-desc": [ diff --git a/packages/webapp/src/compiled-lang/fr.json b/packages/webapp/src/compiled-lang/fr.json index b762ae8e..ca5171f4 100644 --- a/packages/webapp/src/compiled-lang/fr.json +++ b/packages/webapp/src/compiled-lang/fr.json @@ -11,6 +11,12 @@ "value": "J'accepte" } ], + "accountinfo.deleteaccount": [ + { + "type": 0, + "value": "Supprimer le compte" + } + ], "accountinfo.email": [ { "type": 0, @@ -234,16 +240,8 @@ } ], "editor.try-welcome": [ - { - "type": 0, - "value": "Cet espace d'édition présente certaines des fonctionnalités de l'éditeur de cartes mentales !" - } ], "editor.try-welcome-description": [ - { - "type": 0, - "value": "Inscrivez-vous pour commencer à créer, partager et publier gratuitement un nombre illimité de cartes mentales." - } ], "expired.description": [ { @@ -422,7 +420,7 @@ "import.description": [ { "type": 0, - "value": "Vous pouvez importer des cartes FreeMind 1.0.1 et WiseMapping dans votre liste de cartes. Sélectionnez le fichier que vous souhaitez importer." + "value": "Vous pouvez importer des cartes WiseMapping dans votre liste de cartes. Sélectionnez le fichier que vous souhaitez importer." } ], "import.title": [ @@ -509,6 +507,54 @@ "value": "Info" } ], + "label.add-button": [ + { + "type": 0, + "value": "Ajouter une étiquette" + } + ], + "label.add-for": [ + { + "type": 0, + "value": "Modification des étiquettes pour les cartes :" + } + ], + "label.add-placeholder": [ + { + "type": 0, + "value": "Titre de l'étiquette" + } + ], + "label.change-color": [ + { + "type": 0, + "value": "Changer la couleur de l'étiquette" + } + ], + "label.delete-description": [ + { + "type": 0, + "value": "sera supprimé, y compris ses associations à toutes les cartes existantes. Voulez-vous continuer?" + } + ], + "label.delete-title": [ + { + "type": 0, + "value": "Confirmer la suppression de l'étiquette" + } + ], + "label.description": [ + { + "type": 0, + "value": "Utilisez des étiquettes pour organiser vos cartes." + } + ], + "label.title": [ + { + "type": 0, + "value": "Ajouter une étiquette" + } + ], "language.change": [ { "type": 0, @@ -944,7 +990,7 @@ "share.delete-description": [ { "type": 0, - "value": "Invitez des personnes à collaborer avec vous dans la création de votre mindmap. Ils seront prévenus par email." + "value": "Invitez des personnes à collaborer avec vous dans la création de votre midnmap. Ils seront prévenus par email." } ], "share.delete-title": [ diff --git a/packages/webapp/src/compiled-lang/ru.json b/packages/webapp/src/compiled-lang/ru.json new file mode 100644 index 00000000..b34910a2 --- /dev/null +++ b/packages/webapp/src/compiled-lang/ru.json @@ -0,0 +1,962 @@ +{ + "account.delete-warning": [ + { + "type": 0, + "value": "Помните, что вы не сможете восстановить созданные вами майнд-карты. Вся информация будет удалена безвозвратно." + } + ], + "accountinfo.button": [ + { + "type": 0, + "value": "Сохранить" + } + ], + "accountinfo.email": [ + { + "type": 0, + "value": "Email" + } + ], + "accountinfo.firstname": [ + { + "type": 0, + "value": "Имя" + } + ], + "accountinfo.lastname": [ + { + "type": 0, + "value": "Фамилия" + } + ], + "accountinfo.title": [ + { + "type": 0, + "value": "Информация" + } + ], + "action.cancel-button": [ + { + "type": 0, + "value": "Отмена" + } + ], + "action.close-button": [ + { + "type": 0, + "value": "Закрыть" + } + ], + "action.delete": [ + { + "type": 0, + "value": "Удалить" + } + ], + "action.delete-description": [ + { + "type": 0, + "value": "Удаление майндкарты - необратимый процесс без возможности восстановления. Точно удалить майндкарту?." + } + ], + "action.delete-title": [ + { + "type": 0, + "value": "Удалить" + } + ], + "action.duplicate": [ + { + "type": 0, + "value": "Клонировать" + } + ], + "action.export": [ + { + "type": 0, + "value": "Экспорт" + } + ], + "action.history": [ + { + "type": 0, + "value": "История" + } + ], + "action.history-description": [ + { + "type": 0, + "value": "Список изменений за последние 90 дней." + } + ], + "action.history-title": [ + { + "type": 0, + "value": "История версий" + } + ], + "action.import": [ + { + "type": 0, + "value": "Импорт" + } + ], + "action.info": [ + { + "type": 0, + "value": "Инфо" + } + ], + "action.label": [ + { + "type": 0, + "value": "Добавить метку" + } + ], + "action.new": [ + { + "type": 0, + "value": "Новая майнд-карта" + } + ], + "action.open": [ + { + "type": 0, + "value": "Открыть" + } + ], + "action.print": [ + { + "type": 0, + "value": "Печать" + } + ], + "action.publish": [ + { + "type": 0, + "value": "Опубликовать" + } + ], + "action.rename": [ + { + "type": 0, + "value": "Переименовать" + } + ], + "action.rename-description-placeholder": [ + { + "type": 0, + "value": "Описание" + } + ], + "action.rename-name-placeholder": [ + { + "type": 0, + "value": "Имя" + } + ], + "action.share": [ + { + "type": 0, + "value": "Открыть доступ" + } + ], + "changepwd.button": [ + { + "type": 0, + "value": "Изменить" + } + ], + "changepwd.confirm-password": [ + { + "type": 0, + "value": "Подтвердить пароль" + } + ], + "changepwd.description": [ + { + "type": 0, + "value": "Укажите новый пароль вашей учетной записи." + } + ], + "changepwd.password": [ + { + "type": 0, + "value": "Пароль" + } + ], + "changepwd.password-match": [ + { + "type": 0, + "value": "Пароли не совпадают. Пожалуйста, попробуйте еще раз." + } + ], + "changepwd.title": [ + { + "type": 0, + "value": "Изменить пароль" + } + ], + "common.wait": [ + { + "type": 0, + "value": "Подождите..." + } + ], + "create.button": [ + { + "type": 0, + "value": "Создать" + } + ], + "create.description": [ + { + "type": 0, + "value": "Пожалуйста, укажите имя и описание." + } + ], + "create.title": [ + { + "type": 0, + "value": "Создание новой майнд-карты." + } + ], + "deletem.title": [ + { + "type": 0, + "value": "Все выбранные карты будут удалены" + } + ], + "duplicate.title": [ + { + "type": 0, + "value": "Клонировать" + } + ], + "editor.try-welcome": [ + { + "type": 0, + "value": "Здесь можно ознакомиться с возможностями нашего редактора майнд-карт на примерах и практике!" + } + ], + "editor.try-welcome-description": [ + { + "type": 0, + "value": "Зарегистрируйтесь, чтобы создавать, делиться и публиковать майнд-карты бесплатно и без ограничений!" + } + ], + "expired.description": [ + { + "type": 0, + "value": "Время вашей сессии истекло. Пожалуйста, авторизуйтесь и попробуйте снова." + } + ], + "expired.title": [ + { + "type": 0, + "value": "Время вашей сессии истекло" + } + ], + "export.desc": [ + { + "type": 0, + "value": "Выгрузите эту карту в формате, который нужен - вставка в презентацию, отправка по почте, оффлайн работа." + } + ], + "export.document": [ + { + "type": 0, + "value": "Майнд-карта: Экспорт в различных форматах редакторов майнд-карт" + } + ], + "export.document-label": [ + { + "type": 0, + "value": "Документ: Экспорт в формате документа" + } + ], + "export.image": [ + { + "type": 0, + "value": "Рисунок: Экспорт рисунка вашей карты с учетом всех цветов и форм." + } + ], + "export.title": [ + { + "type": 0, + "value": "Экспорт" + } + ], + "export.warning": [ + { + "type": 0, + "value": "Экспорт рисунком (SVG,PNG,JPEG,PDF) доступен только из панели редактирования." + } + ], + "footer.aboutus": [ + { + "type": 0, + "value": "О Нас" + } + ], + "footer.contactus": [ + { + "type": 0, + "value": "Контакты" + } + ], + "footer.faq": [ + { + "type": 0, + "value": "F.A.Q." + } + ], + "footer.faqandhelp": [ + { + "type": 0, + "value": "Помощь & FAQ" + } + ], + "footer.feedback": [ + { + "type": 0, + "value": "Обратная связь" + } + ], + "footer.opensource": [ + { + "type": 0, + "value": "Open Source" + } + ], + "footer.others": [ + { + "type": 0, + "value": "Прочее" + } + ], + "footer.termsandconditions": [ + { + "type": 0, + "value": "Общие Правила" + } + ], + "forgot.desc": [ + { + "type": 0, + "value": "Мы отправим Вам e-mail для восстановления пароля." + } + ], + "forgot.email": [ + { + "type": 0, + "value": "Email" + } + ], + "forgot.page-title": [ + { + "type": 0, + "value": "Забыл пароль | WiseMapping" + } + ], + "forgot.register": [ + { + "type": 0, + "value": "Отправить" + } + ], + "forgot.success.desc": [ + { + "type": 0, + "value": "Мы отправили e-mail с инструкциями по восстановлению пароля. Вы должны получить его в течение пары минут." + } + ], + "forgot.success.title": [ + { + "type": 0, + "value": "Ваш временный пароль отправлен." + } + ], + "forgot.title": [ + { + "type": 0, + "value": "Установить новый пароль" + } + ], + "forgotsuccess.page-title": [ + { + "type": 0, + "value": "Пароль восстановлен | WiseMapping" + } + ], + "header.donthaveaccount": [ + { + "type": 0, + "value": "Нет аккаунта?" + } + ], + "header.haveaccount": [ + { + "type": 0, + "value": "Уже есть аккаунт?" + } + ], + "help.support": [ + { + "type": 0, + "value": "Поддержка" + } + ], + "history.no-changes": [ + { + "type": 0, + "value": "Нет доступных изменений" + } + ], + "import.button": [ + { + "type": 0, + "value": "Создать" + } + ], + "import.description": [ + { + "type": 0, + "value": "Можно импортировать FreeMind 1.0.1 и WiseMapping файлы. Выберите файл, который хотите импортировать." + } + ], + "import.title": [ + { + "type": 0, + "value": "Загрузить майнд-карту с компьютера" + } + ], + "info.basic-info": [ + { + "type": 0, + "value": "Основная информация" + } + ], + "info.button": [ + { + "type": 0, + "value": "Принять" + } + ], + "info.creation-time": [ + { + "type": 0, + "value": "Дата создания" + } + ], + "info.creator": [ + { + "type": 0, + "value": "Автор" + } + ], + "info.description": [ + { + "type": 0, + "value": "Описание" + } + ], + "info.description-msg": [ + { + "type": 0, + "value": "После публикация карта станет видима для любого, у кого есть ссылка." + } + ], + "info.modified-time": [ + { + "type": 0, + "value": "Последние изменения" + } + ], + "info.modified-tny": [ + { + "type": 0, + "value": "Последний редактировал" + } + ], + "info.name": [ + { + "type": 0, + "value": "Имя" + } + ], + "info.public-visibility": [ + { + "type": 0, + "value": "Доступ по ссылке" + } + ], + "info.sharing": [ + { + "type": 0, + "value": "Видимость" + } + ], + "info.starred": [ + { + "type": 0, + "value": "Важная" + } + ], + "info.title": [ + { + "type": 0, + "value": "Инфо" + } + ], + "language.change": [ + { + "type": 0, + "value": "Сменить язык" + } + ], + "language.help": [ + { + "type": 0, + "value": "Помочь переводить" + } + ], + "login.desc": [ + { + "type": 0, + "value": "Войдите в свой аккаунт" + } + ], + "login.email": [ + { + "type": 0, + "value": "Email" + } + ], + "login.error": [ + { + "type": 0, + "value": "Некорректный email или пароль." + } + ], + "login.forgotpwd": [ + { + "type": 0, + "value": "Забыли пароль?" + } + ], + "login.hsqldbcofig": [ + { + "type": 0, + "value": "Although HSQLDB is bundled with WiseMapping by default during the installation, we do not recommend this database for production use. Please consider using MySQL 5.7 instead. You can find more information how to configure MySQL" + } + ], + "login.page-title": [ + { + "type": 0, + "value": "Вход | WiseMapping" + } + ], + "login.password": [ + { + "type": 0, + "value": "Пароль" + } + ], + "login.remberme": [ + { + "type": 0, + "value": "Запомнить меня" + } + ], + "login.signin": [ + { + "type": 0, + "value": "Вход" + } + ], + "login.signup": [ + { + "type": 0, + "value": "Регистрация" + } + ], + "login.title": [ + { + "type": 0, + "value": "Добро пожаловать!" + } + ], + "login.userinactive": [ + { + "type": 0, + "value": "Ваш аккаунт еще не активирован. Вам на почту придет сообщение о его активации. На связи!." + } + ], + "map.creator": [ + { + "type": 0, + "value": "Создатель" + } + ], + "map.delete-selected": [ + { + "type": 0, + "value": "Удалить выбранные" + } + ], + "map.last-update": [ + { + "type": 0, + "value": "Последнее изменение" + } + ], + "map.more-actions": [ + { + "type": 0, + "value": "Больше... " + } + ], + "map.name": [ + { + "type": 0, + "value": "Имя" + } + ], + "map.tooltip-add": [ + { + "type": 0, + "value": "Добавить метку выбранным" + } + ], + "maps.choose-file": [ + { + "type": 0, + "value": "Выберите файл" + } + ], + "maps.create-tooltip": [ + { + "type": 0, + "value": "Создать новую майнд-карту" + } + ], + "maps.empty-result": [ + { + "type": 0, + "value": "Нет карт, подходящих под условия фильтра." + } + ], + "maps.import-desc": [ + { + "type": 0, + "value": "Загрузить из других редакторов" + } + ], + "maps.modified": [ + { + "type": 0, + "value": "Изменена" + } + ], + "maps.modified-by": [ + { + "type": 0, + "value": "Редактор" + } + ], + "maps.modified-by-desc": [ + { + "type": 0, + "value": "Изменена " + }, + { + "type": 1, + "value": "by" + }, + { + "type": 0, + "value": " в " + }, + { + "type": 1, + "value": "on" + } + ], + "maps.nav-all": [ + { + "type": 0, + "value": "Все" + } + ], + "maps.nav-onwned": [ + { + "type": 0, + "value": "Созданные мной" + } + ], + "maps.nav-public": [ + { + "type": 0, + "value": "Публичные" + } + ], + "maps.nav-shared": [ + { + "type": 0, + "value": "В общем доступе" + } + ], + "maps.nav-starred": [ + { + "type": 0, + "value": "Отмеченные" + } + ], + "maps.page-title": [ + { + "type": 0, + "value": "Мои карты | WiseMapping" + } + ], + "maps.revert": [ + { + "type": 0, + "value": "Отменить" + } + ], + "maps.search-action": [ + { + "type": 0, + "value": "Поиск ..." + } + ], + "maps.tooltip-open": [ + { + "type": 0, + "value": "Открыть для редактирования" + } + ], + "maps.tooltip-starred": [ + { + "type": 0, + "value": "Отмеченные" + } + ], + "maps.view": [ + { + "type": 0, + "value": "Просмотр" + } + ], + "menu.account": [ + { + "type": 0, + "value": "Профиль" + } + ], + "menu.change-password": [ + { + "type": 0, + "value": "Сменить пароль" + } + ], + "menu.signout": [ + { + "type": 0, + "value": "Выход" + } + ], + "publish.button": [ + { + "type": 0, + "value": "Применить" + } + ], + "publish.checkbox": [ + { + "type": 0, + "value": "Включить общий доступ" + } + ], + "publish.description": [ + { + "type": 0, + "value": "После публикация карта станет видима для любого, у кого есть ссылка." + } + ], + "publish.embedded": [ + { + "type": 0, + "value": "Встроить" + } + ], + "publish.embedded-msg": [ + { + "type": 0, + "value": "Скопируйте этот код, чтобы встроить майнд-карту в ваш сайт:" + } + ], + "publish.public-url": [ + { + "type": 0, + "value": "Публичный URL" + } + ], + "publish.public-url-msg": [ + { + "type": 0, + "value": "Скопируйте ссылку, чтобы поделиться с коллегами доступом к карте:" + } + ], + "publish.title": [ + { + "type": 0, + "value": "Опубликовать" + } + ], + "registation.success-title": [ + { + "type": 0, + "value": "Успешная регистрация | WiseMapping" + } + ], + "registration.desc": [ + { + "type": 0, + "value": "Регистрация бесплатна и займет всего минуту" + } + ], + "registration.email": [ + { + "type": 0, + "value": "Email" + } + ], + "registration.firstname": [ + { + "type": 0, + "value": "Имя" + } + ], + "registration.lastname": [ + { + "type": 0, + "value": "Фамилия" + } + ], + "registration.password": [ + { + "type": 0, + "value": "Пароль" + } + ], + "registration.register": [ + { + "type": 0, + "value": "Регистрация" + } + ], + "registration.success.desc": [ + { + "type": 0, + "value": "Нажмите на кнопку 'Войти' и приступите к созданию майнд-карт." + } + ], + "registration.termandconditions": [ + { + "type": 0, + "value": "Правила: Пожалуйста, проверьте информацию учетной записи WiseMapping, которую вы указали, и ознакомьтесь с Правилами. По нажатию на кнопку 'Регистрация' вы соглашаетесь с Правилами и Политикой Конфиденциальности" + } + ], + "registration.title": [ + { + "type": 0, + "value": "Become a member" + } + ], + "rename.description": [ + { + "type": 0, + "value": "Пожалуйста, укажите новое имя и описание." + } + ], + "rename.title": [ + { + "type": 0, + "value": "Rename" + } + ], + "resetpassword.success.title": [ + { + "type": 0, + "value": "Аккаунт был успешно создан!" + } + ], + "role.editor": [ + { + "type": 0, + "value": "Редактор" + } + ], + "role.owner": [ + { + "type": 0, + "value": "Владелец" + } + ], + "role.viewer": [ + { + "type": 0, + "value": "Читатель" + } + ], + "share.add-button": [ + { + "type": 0, + "value": "Добавить" + } + ], + "share.add-message": [ + { + "type": 0, + "value": "Добавить сообщение" + } + ], + "share.can-edit": [ + { + "type": 0, + "value": "Редактирование" + } + ], + "share.can-view": [ + { + "type": 0, + "value": "Просмотр" + } + ], + "share.delete": [ + { + "type": 0, + "value": "Отозвать доступ" + } + ], + "share.delete-description": [ + { + "type": 0, + "value": "Пригласите людей для совместной работы над картой. Они получат письмо с приглашением." + } + ], + "share.delete-title": [ + { + "type": 0, + "value": "Общий доступ" + } + ], + "share.message": [ + { + "type": 0, + "value": "Сообщение" + } + ] +} \ No newline at end of file diff --git a/packages/webapp/src/components/HOCs/withSessionExpirationHandling.tsx b/packages/webapp/src/components/HOCs/withSessionExpirationHandling.tsx new file mode 100644 index 00000000..2e2fbda9 --- /dev/null +++ b/packages/webapp/src/components/HOCs/withSessionExpirationHandling.tsx @@ -0,0 +1,32 @@ +/* eslint-disable react/display-name */ +import React, { ComponentType, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import Client from '../../classes/client'; +import ClientHealthSentinel from '../../classes/client/client-health-sentinel'; +import { activeInstance, sessionExpired } from '../../redux/clientSlice'; + +function withSessionExpirationHandling(Component: ComponentType) { + return (hocProps: T): React.ReactElement => { + const client: Client = useSelector(activeInstance); + const dispatch = useDispatch(); + + useEffect(() => { + if (client) { + client.onSessionExpired(() => { + dispatch(sessionExpired()); + }); + } else { + console.warn('Session expiration wont be handled because could not find client'); + } + }, []); + + return ( + <> + + ; + + ); + }; +} + +export default withSessionExpirationHandling; diff --git a/packages/webapp/src/components/editor-page/EditorOptionsBuider.ts b/packages/webapp/src/components/editor-page/EditorOptionsBuider.ts new file mode 100644 index 00000000..be3e0cea --- /dev/null +++ b/packages/webapp/src/components/editor-page/EditorOptionsBuider.ts @@ -0,0 +1,47 @@ +import { EditorOptions } from '@wisemapping/editor'; +import AppConfig from '../../classes/app-config'; + +export default class EditorOptionsBulder { + static build(locale: string, hotkeys: boolean, isTryMode: boolean): { options: EditorOptions, mapId: number } { + + let options: EditorOptions = { + enableKeyboardEvents: hotkeys, + locale: locale, + }; + + if (isTryMode) { + // Sent to try mode ... + options.mode = 'showcase'; + } else if (global.mindmapLocked) { + // Map locked, open for view mode ... + options.mode = 'viewonly'; + } else { + options.mode = 'edition'; + } + + let mapId: number; + if (!AppConfig.isDevelopEnv()) { + options = { + zoom: (global.userOptions?.zoom != undefined + ? Number.parseFloat(global?.userOptions?.zoom as string) + : 0.8), + locked: global.mindmapLocked, + lockedMsg: global.mindmapLockedMsg, + mapTitle: global.mapTitle, + ...options + } + mapId = global.mapId; + } else { + // Running in a development mode. + console.log('Running editor in development mode'); + options = { + zoom: 0.8, + locked: false, + mapTitle: "Develop Mindnap", + ...options + } + mapId = 666; + } + return { options, mapId }; + } +} \ No newline at end of file diff --git a/packages/webapp/src/components/editor-page/index.tsx b/packages/webapp/src/components/editor-page/index.tsx index b84673a8..326bcb09 100644 --- a/packages/webapp/src/components/editor-page/index.tsx +++ b/packages/webapp/src/components/editor-page/index.tsx @@ -1,34 +1,54 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import ActionDispatcher from '../maps-page/action-dispatcher'; import { ActionType } from '../maps-page/action-chooser'; import Editor from '@wisemapping/editor'; import AppI18n from '../../classes/app-i18n'; +import { useSelector } from 'react-redux'; +import { hotkeysEnabled } from '../../redux/editorSlice'; +import ReactGA from 'react-ga'; +import Client from '../../classes/client'; +import { activeInstance, fetchAccount } from '../../redux/clientSlice'; +import { PersistenceManager } from '@wisemapping/mindplot'; +import EditorOptionsBulder from './EditorOptionsBuider'; export type EditorPropsType = { - mapId: number; isTryMode: boolean; }; -const EditorPage = ({ mapId, ...props }: EditorPropsType): React.ReactElement => { +const EditorPage = ({ isTryMode }: EditorPropsType): React.ReactElement => { const [activeDialog, setActiveDialog] = React.useState(null); - - // Load user locale ... + const hotkey = useSelector(hotkeysEnabled); const userLocale = AppI18n.getUserLocale(); - console.log("Locale:" + userLocale.code); + const client: Client = useSelector(activeInstance); + const { mapId, options } = EditorOptionsBulder.build(userLocale.code, hotkey, isTryMode); - return <> - - { - activeDialog && - setActiveDialog(null)} - mapsId={[mapId]} - fromEditor - /> - } - + useEffect(() => { + ReactGA.pageview(window.location.pathname + window.location.search); + }, []); + + // Account settings can be null and editor cannot be initilized multiple times. This creates problems + // at the i18n resource loading. + const persistence = client.buildPersistenceManager(options.mode); + const loadCompleted = persistence && (options.mode === 'showcase' || fetchAccount()); + + return loadCompleted ? ( + <> + + { + activeDialog && + setActiveDialog(null)} + mapsId={[mapId]} + fromEditor + /> + } + ) : <> } + export default EditorPage; diff --git a/packages/webapp/src/components/forgot-password-page/index.tsx b/packages/webapp/src/components/forgot-password-page/index.tsx index a2f85cbf..29b81d98 100644 --- a/packages/webapp/src/components/forgot-password-page/index.tsx +++ b/packages/webapp/src/components/forgot-password-page/index.tsx @@ -12,8 +12,10 @@ import { activeInstance } from '../../redux/clientSlice'; import Input from '../form/input'; import GlobalError from '../form/global-error'; import SubmitButton from '../form/submit-button'; +import ReactGA from 'react-ga'; import Typography from '@mui/material/Typography'; +import { getCsrfToken, getCsrfTokenParameter } from '../../utils'; const ForgotPassword = () => { const [email, setEmail] = useState(''); @@ -53,6 +55,7 @@ const ForgotPassword = () => {
+
diff --git a/packages/webapp/src/components/login-page/index.tsx b/packages/webapp/src/components/login-page/index.tsx index 07dd54fc..102b038b 100644 --- a/packages/webapp/src/components/login-page/index.tsx +++ b/packages/webapp/src/components/login-page/index.tsx @@ -10,6 +10,8 @@ import FormContainer from '../layout/form-container'; import Typography from '@mui/material/Typography'; import FormControl from '@mui/material/FormControl'; import Link from '@mui/material/Link'; +import ReactGA from 'react-ga'; +import { getCsrfToken, getCsrfTokenParameter } from '../../utils'; type ConfigStatusProps = { enabled?: boolean; @@ -68,7 +70,8 @@ const LoginPage = (): React.ReactElement => { useEffect(() => { document.title = intl.formatMessage({id:'login.page-title',defaultMessage:'Login | WiseMapping'}); - }); + ReactGA.pageview(window.location.pathname + window.location.search); + },[]); return (
@@ -87,6 +90,7 @@ const LoginPage = (): React.ReactElement => {
+ { - window.location.href = '/c/logout'; + window.location.href = '/c/login'; onClose(); }, onError: (error) => { diff --git a/packages/webapp/src/components/maps-page/account-menu/index.tsx b/packages/webapp/src/components/maps-page/account-menu/index.tsx index 21650d9b..c33f0fda 100644 --- a/packages/webapp/src/components/maps-page/account-menu/index.tsx +++ b/packages/webapp/src/components/maps-page/account-menu/index.tsx @@ -28,6 +28,12 @@ const AccountMenu = (): React.ReactElement => { setAnchorEl(null); }; + const handleLogout = (event: MouseEvent) => { + event.preventDefault(); + const elem = document.getElementById('logoutFrom') as HTMLFormElement; + elem.submit(); + }; + const account = fetchAccount(); return ( @@ -77,7 +83,8 @@ const AccountMenu = (): React.ReactElement => { - + + handleLogout(e)}> @@ -85,11 +92,13 @@ const AccountMenu = (): React.ReactElement => { - {action == 'change-password' && ( - setAction(undefined)} /> - )} + { + action == 'change-password' && ( + setAction(undefined)} /> + ) + } {action == 'account-info' && setAction(undefined)} />} -
+ ); }; diff --git a/packages/webapp/src/components/maps-page/maps-list/add-label-form/index.tsx b/packages/webapp/src/components/maps-page/action-dispatcher/add-label-dialog/index.tsx similarity index 96% rename from packages/webapp/src/components/maps-page/maps-list/add-label-form/index.tsx rename to packages/webapp/src/components/maps-page/action-dispatcher/add-label-dialog/index.tsx index 4609a2e5..5dbbe599 100644 --- a/packages/webapp/src/components/maps-page/maps-list/add-label-form/index.tsx +++ b/packages/webapp/src/components/maps-page/action-dispatcher/add-label-dialog/index.tsx @@ -22,7 +22,7 @@ type AddLabelFormProps = { onAdd: (newLabel: Label) => void; }; -export default function AddLabelForm({ onAdd }: AddLabelFormProps): React.ReactElement { +const AddLabelDialog = ({ onAdd }: AddLabelFormProps): React.ReactElement => { const intl = useIntl(); const [createLabelColorIndex, setCreateLabelColorIndex] = React.useState( Math.floor(Math.random() * labelColors.length) @@ -92,3 +92,5 @@ export default function AddLabelForm({ onAdd }: AddLabelFormProps): React.ReactE ); } + +export default AddLabelDialog; diff --git a/packages/webapp/src/components/maps-page/maps-list/add-label-form/styled.ts b/packages/webapp/src/components/maps-page/action-dispatcher/add-label-dialog/styled.ts similarity index 100% rename from packages/webapp/src/components/maps-page/maps-list/add-label-form/styled.ts rename to packages/webapp/src/components/maps-page/action-dispatcher/add-label-dialog/styled.ts diff --git a/packages/webapp/src/components/maps-page/action-dispatcher/base-dialog/index.tsx b/packages/webapp/src/components/maps-page/action-dispatcher/base-dialog/index.tsx index 742a3a5e..98fdb0d2 100644 --- a/packages/webapp/src/components/maps-page/action-dispatcher/base-dialog/index.tsx +++ b/packages/webapp/src/components/maps-page/action-dispatcher/base-dialog/index.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; import { ErrorInfo } from '../../../../classes/client'; import { StyledDialog, StyledDialogActions, StyledDialogContent, StyledDialogTitle } from './style'; @@ -6,6 +6,8 @@ import GlobalError from '../../../form/global-error'; import DialogContentText from '@mui/material/DialogContentText'; import Button from '@mui/material/Button'; import { PaperProps } from '@mui/material/Paper'; +import { useDispatch } from 'react-redux'; +import { disableHotkeys, enableHotkeys } from '../../../../redux/editorSlice'; export type DialogProps = { onClose: () => void; @@ -23,6 +25,13 @@ export type DialogProps = { }; const BaseDialog = (props: DialogProps): React.ReactElement => { + const dispatch = useDispatch(); + useEffect(() => { + dispatch(disableHotkeys()); + return () => { + dispatch(enableHotkeys()) + }; + }, []); const { onClose, onSubmit, maxWidth = 'sm', PaperProps } = props; const handleOnSubmit = (e: React.FormEvent) => { diff --git a/packages/webapp/src/components/maps-page/action-dispatcher/export-dialog/index.tsx b/packages/webapp/src/components/maps-page/action-dispatcher/export-dialog/index.tsx index 57548839..21e4440e 100644 --- a/packages/webapp/src/components/maps-page/action-dispatcher/export-dialog/index.tsx +++ b/packages/webapp/src/components/maps-page/action-dispatcher/export-dialog/index.tsx @@ -15,6 +15,8 @@ import Client from '../../../../classes/client'; import { activeInstance } from '../../../../redux/clientSlice'; import { useSelector } from 'react-redux'; +import SizeType from '@wisemapping/mindplot/src/components/SizeType'; +import Checkbox from '@mui/material/Checkbox'; type ExportFormat = 'svg' | 'jpg' | 'png' | 'txt' | 'mm' | 'wxml' | 'xls' | 'md'; type ExportGroup = 'image' | 'document' | 'mindmap-tool'; @@ -40,8 +42,11 @@ const ExportDialog = ({ enableImgExport ? 'image' : 'document' ); const [exportFormat, setExportFormat] = React.useState( - enableImgExport ? 'svg' : 'xls' + enableImgExport ? 'svg' : 'txt' ); + + const [zoomToFit, setZoomToFit] = React.useState(true) + const classes = useStyles(); const handleOnExportFormatChange = (event) => { @@ -75,9 +80,13 @@ const ExportDialog = ({ setSubmit(true); }; + const handleOnZoomToFit = (): void => { + setZoomToFit(!zoomToFit); + }; + const exporter = (formatType: ExportFormat): Promise => { let svgElement: Element | null = null; - let size; + let size: SizeType; let mindmap: Mindmap; const designer: Designer = global.designer; @@ -85,7 +94,7 @@ const ExportDialog = ({ // Depending on the type of export. It will require differt POST. const workspace = designer.getWorkSpace(); svgElement = workspace.getSVGElement(); - size = workspace.getSize(); + size = { width: window.innerWidth, height: window.innerHeight }; mindmap = designer.getMindmap(); } else { mindmap = client.fetchMindmap(mapId); @@ -96,10 +105,11 @@ const ExportDialog = ({ case 'png': case 'jpg': case 'svg': { - exporter = ImageExporterFactory.create(formatType, mindmap, svgElement, size.width, size.height); + exporter = ImageExporterFactory.create(formatType, svgElement, size.width, size.height, zoomToFit); break; } case 'wxml': + case 'mm': case 'md': case 'txt': { exporter = TextExporterFactory.create(formatType, mindmap); @@ -130,7 +140,7 @@ const ExportDialog = ({ URL.revokeObjectURL(url); document.body.removeChild(anchor); }).catch((fail) => { - console.log("Unexpected error during export:" + fail); + console.error("Unexpected error during export:" + fail); }); onClose(); @@ -172,22 +182,32 @@ const ExportDialog = ({ style={{ fontSize: '9px' }} /> {exportGroup == 'image' && ( - + <> + + } + label={intl.formatMessage({ + id: 'export.img-center', + defaultMessage: + 'Center and zoom to fit', + })} /> + )}
@@ -247,7 +267,7 @@ const ExportDialog = ({ Freemind 1.0.1 (MM) - + {/* MindManager (MMAP) */} diff --git a/packages/webapp/src/components/maps-page/action-dispatcher/label-dialog/index.tsx b/packages/webapp/src/components/maps-page/action-dispatcher/label-dialog/index.tsx index 99843fbc..33a3840c 100644 --- a/packages/webapp/src/components/maps-page/action-dispatcher/label-dialog/index.tsx +++ b/packages/webapp/src/components/maps-page/action-dispatcher/label-dialog/index.tsx @@ -23,6 +23,7 @@ const LabelDialog = ({ mapsId, onClose }: MultiDialogProps): React.ReactElement const { data } = useQuery('maps', () => { return client.fetchAllMaps(); }); + const [error, setError] = React.useState(); const maps = data.filter(m => mapsId.includes(m.id)); @@ -34,12 +35,13 @@ const LabelDialog = ({ mapsId, onClose }: MultiDialogProps): React.ReactElement queryClient.invalidateQueries('labels'); }, onError: (error) => { - console.error(error); + setError(error); } } ); const handleChangesInLabels = (label: Label, checked: boolean) => { + setError(undefined); changeLabelMutation.mutate({ maps, label, @@ -61,11 +63,19 @@ const LabelDialog = ({ mapsId, onClose }: MultiDialogProps): React.ReactElement 'Use labels to organize your maps.', })} PaperProps={{ classes: { root: classes.paper } }} + error={error} > <> - - { maps.map(m => m.title).join(', ') } + + { + maps.length > 1 ? + : + maps.map(m => m.title).join(', ') + } diff --git a/packages/webapp/src/components/maps-page/action-dispatcher/publish-dialog/index.tsx b/packages/webapp/src/components/maps-page/action-dispatcher/publish-dialog/index.tsx index d532cdb2..365ca3d3 100644 --- a/packages/webapp/src/components/maps-page/action-dispatcher/publish-dialog/index.tsx +++ b/packages/webapp/src/components/maps-page/action-dispatcher/publish-dialog/index.tsx @@ -12,12 +12,12 @@ import FormControl from '@mui/material/FormControl'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import TabContext from '@mui/lab/TabContext'; -import AppBar from '@mui/material/AppBar'; import TabList from '@mui/lab/TabList'; import Tab from '@mui/material/Tab'; import TabPanel from '@mui/lab/TabPanel'; import Typography from '@mui/material/Typography'; import TextareaAutosize from '@mui/material/TextareaAutosize'; +import Box from '@mui/system/Box'; const PublishDialog = ({ mapId, onClose }: SimpleDialogProps): React.ReactElement => { const { map } = fetchMapById(mapId); @@ -100,25 +100,25 @@ const PublishDialog = ({ mapId, onClose }: SimpleDialogProps): React.ReactElemen
- + - + - - + + `} /> - + { - const emails = model.emails.split("'"); - const permissions = emails.map((email) => { - return { email: email, role: model.role }; + const emails = model.emails.split(','); + const permissions = emails.map((email: string) => { + return { email: email.replace(/\s/g, ''), role: model.role }; }); return client.addMapPermissions(mapId, model.message, permissions); }, @@ -85,11 +85,13 @@ const ShareDialog = ({ mapId, onClose }: SimpleDialogProps): React.ReactElement const name = event.target.name; const value = event.target.value; setModel({ ...model, [name as keyof ShareModel]: value }); + event.stopPropagation(); }; const handleOnAddClick = (event: React.MouseEvent): void => { event.stopPropagation(); addMutation.mutate(model); + event.stopPropagation(); }; const handleOnDeleteClick = ( @@ -111,6 +113,9 @@ const ShareDialog = ({ mapId, onClose }: SimpleDialogProps): React.ReactElement return perm.name ? `${perm.name}<${perm.email}>` : perm.email; }; + // very basic email validation, just make sure the basic syntax is fine + const isValid = model.emails.split(',').every(str => /\S+@\S+\.\S+/.test((str || '').trim())); + return (
diff --git a/packages/webapp/src/components/maps-page/index.tsx b/packages/webapp/src/components/maps-page/index.tsx index 26d386cd..3af0eb77 100644 --- a/packages/webapp/src/components/maps-page/index.tsx +++ b/packages/webapp/src/components/maps-page/index.tsx @@ -15,13 +15,11 @@ import Client, { Label } from '../../classes/client'; import ActionDispatcher from './action-dispatcher'; import { ActionType } from './action-chooser'; import AccountMenu from './account-menu'; -import ClientHealthSentinel from '../../classes/client/client-health-sentinel'; import HelpMenu from './help-menu'; import LanguageMenu from './language-menu'; import AppI18n, { Locales } from '../../classes/app-i18n'; import ListItemIcon from '@mui/material/ListItemIcon'; -import ListItem from '@mui/material/ListItem'; import AddCircleTwoTone from '@mui/icons-material/AddCircleTwoTone'; import CloudUploadTwoTone from '@mui/icons-material/CloudUploadTwoTone'; @@ -35,12 +33,16 @@ import StarTwoTone from '@mui/icons-material/StarTwoTone'; import Tooltip from '@mui/material/Tooltip'; import Button from '@mui/material/Button'; import Link from '@mui/material/Link'; +import ListItemButton from '@mui/material/ListItemButton'; import ListItemText from '@mui/material/ListItemText'; import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; import logoIcon from './logo-small.svg'; import poweredByIcon from './pwrdby-white.svg'; import LabelDeleteConfirm from './maps-list/label-delete-confirm'; +import ReactGA from 'react-ga'; +import { withStyles } from '@mui/styles'; + export type Filter = GenericFilter | LabelFilter; @@ -81,6 +83,7 @@ const MapsPage = (): ReactElement => { id: 'maps.page-title', defaultMessage: 'My Maps | WiseMapping', }); + ReactGA.pageview(window.location.pathname + window.location.search); }, []); const mutation = useMutation((id: number) => client.deleteLabel(id), { @@ -150,7 +153,6 @@ const MapsPage = (): ReactElement => { messages={userLocale.message} >
- {
- { labelToDelete && setLabelToDelete(null)} onConfirm={() => { handleLabelDelete(labelToDelete); setLabelToDelete(null); }} label={labels.find(l => l.id === labelToDelete)} - /> } + />} ); }; @@ -282,6 +284,27 @@ interface ListItemProps { onDelete?: (id: number) => void; } +// https://stackoverflow.com/questions/61486061/how-to-set-selected-and-hover-color-of-listitem-in-mui +const CustomListItem = withStyles({ + root: { + "&$selected": { + backgroundColor: "rgb(210, 140, 5)", + color: "white", + "& .MuiListItemIcon-root": { + color: "white" + } + }, + "&$selected:hover": { + backgroundColor: "rgb(210, 140, 5)", + color: "white", + "& .MuiListItemIcon-root": { + color: "white" + } + }, + }, + selected: {} +})(ListItemButton); + const StyleListItem = (props: ListItemProps) => { const icon = props.icon; const label = props.label; @@ -294,7 +317,6 @@ const StyleListItem = (props: ListItemProps) => { activeFilter.type == filter.type && (activeFilter.type != 'label' || (activeFilter as LabelFilter).label == (filter as LabelFilter).label); - const handleOnClick = (event: React.MouseEvent, filter: Filter) => { event.stopPropagation(); onClick(filter); @@ -312,7 +334,7 @@ const StyleListItem = (props: ListItemProps) => { }; return ( - handleOnClick(e, filter)}> + handleOnClick(e, filter)}> {icon} {filter.type == 'label' && ( @@ -326,7 +348,7 @@ const StyleListItem = (props: ListItemProps) => { )} - + ); }; diff --git a/packages/webapp/src/components/maps-page/language-menu/index.tsx b/packages/webapp/src/components/maps-page/language-menu/index.tsx index 676a0bbb..befefe3d 100644 --- a/packages/webapp/src/components/maps-page/language-menu/index.tsx +++ b/packages/webapp/src/components/maps-page/language-menu/index.tsx @@ -101,6 +101,11 @@ const LanguageMenu = (): React.ReactElement => { {Locales.FR.label} + + + {Locales.RU.label} + + - onChange(label, true)} /> + onChange(label, true)} /> {labels.map(({ id, title, color }) => ( diff --git a/packages/webapp/src/components/maps-page/role-icon/index.tsx b/packages/webapp/src/components/maps-page/role-icon/index.tsx index 436bed4e..20cc10df 100644 --- a/packages/webapp/src/components/maps-page/role-icon/index.tsx +++ b/packages/webapp/src/components/maps-page/role-icon/index.tsx @@ -17,7 +17,7 @@ const RoleIcon = ({ role }: RoleIconProps): React.ReactElement => { {role == 'owner' && ( } + title={} arrow={true} > diff --git a/packages/webapp/src/components/registration-page/index.tsx b/packages/webapp/src/components/registration-page/index.tsx index 39e2f559..ab737525 100644 --- a/packages/webapp/src/components/registration-page/index.tsx +++ b/packages/webapp/src/components/registration-page/index.tsx @@ -17,6 +17,7 @@ import SubmitButton from '../form/submit-button'; import Typography from '@mui/material/Typography'; import FormControl from '@mui/material/FormControl'; import AppConfig from '../../classes/app-config'; +import ReactGA from 'react-ga'; export type Model = { email: string; @@ -161,10 +162,11 @@ const RegistationPage = (): React.ReactElement => { useEffect(() => { document.title = intl.formatMessage({ - id: 'registration.title', + id: 'registration.page-title', defaultMessage: 'Registration | WiseMapping', }); - }); + ReactGA.pageview(window.location.pathname + window.location.search); + },[]); return (
diff --git a/packages/webapp/src/redux/clientSlice.ts b/packages/webapp/src/redux/clientSlice.ts index 5c51e060..ef7329df 100644 --- a/packages/webapp/src/redux/clientSlice.ts +++ b/packages/webapp/src/redux/clientSlice.ts @@ -4,6 +4,7 @@ import { useQuery } from 'react-query'; import Client, { AccountInfo, ErrorInfo, MapInfo } from '../classes/client'; import { useSelector } from 'react-redux'; import AppConfig from '../classes/app-config'; +import { RootState } from './rootReducer'; export interface ClientStatus { @@ -59,13 +60,11 @@ export const fetchAccount = (): AccountInfo | undefined => { return data; }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const activeInstance = (state: any): Client => { +export const activeInstance = (state: RootState): Client => { return state.client.instance; }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const activeInstanceStatus = (state: any): ClientStatus => { +export const activeInstanceStatus = (state: RootState): ClientStatus => { return state.client.status; }; diff --git a/packages/webapp/src/redux/editorSlice.ts b/packages/webapp/src/redux/editorSlice.ts new file mode 100644 index 00000000..a2b055b3 --- /dev/null +++ b/packages/webapp/src/redux/editorSlice.ts @@ -0,0 +1,30 @@ +import { createSlice } from "@reduxjs/toolkit"; +import { RootState } from "./rootReducer"; + +export interface EditorState { + hotkeysEnabled: boolean; +} + +const initialState: EditorState = { + hotkeysEnabled: true, +}; + +export const editorSlice = createSlice({ + name: 'editor', + initialState: initialState, + reducers: { + disableHotkeys(state) { + state.hotkeysEnabled = false; + }, + enableHotkeys(state) { + state.hotkeysEnabled = true; + }, + }, +}); + +export const hotkeysEnabled = (state: RootState): boolean => { + return state.editor.hotkeysEnabled; +}; + +export const { disableHotkeys, enableHotkeys } = editorSlice.actions; +export default editorSlice.reducer; \ No newline at end of file diff --git a/packages/webapp/src/redux/rootReducer.ts b/packages/webapp/src/redux/rootReducer.ts new file mode 100644 index 00000000..cd737710 --- /dev/null +++ b/packages/webapp/src/redux/rootReducer.ts @@ -0,0 +1,12 @@ +import { combineReducers } from '@reduxjs/toolkit'; +import clientReducer from './clientSlice'; +import editorReducer from './editorSlice'; + +const rootReducer = combineReducers({ + client: clientReducer, + editor: editorReducer, +}); + +export type RootState = ReturnType; + +export default rootReducer; \ No newline at end of file diff --git a/packages/webapp/src/redux/store.ts b/packages/webapp/src/redux/store.ts index 8400fa48..70ee69d1 100644 --- a/packages/webapp/src/redux/store.ts +++ b/packages/webapp/src/redux/store.ts @@ -1,11 +1,9 @@ import { configureStore } from '@reduxjs/toolkit'; -import clientReducer from './clientSlice'; +import rootReducer from './rootReducer'; // Create Service object... const store = configureStore({ - reducer: { - client: clientReducer, - }, + reducer: rootReducer, }); export default store; diff --git a/packages/webapp/src/utils.ts b/packages/webapp/src/utils.ts new file mode 100644 index 00000000..e29d2bca --- /dev/null +++ b/packages/webapp/src/utils.ts @@ -0,0 +1,15 @@ +export const getCsrfToken = (): string | null => { + const meta = document.head.querySelector('meta[name="_csrf"]'); + if (!meta) { + return null; + } + return meta.getAttribute('content'); +}; + +export const getCsrfTokenParameter = (): string | null => { + const meta = document.head.querySelector('meta[name="_csrf_parameter"]'); + if (!meta) { + return null; + } + return meta.getAttribute('content'); +}; \ No newline at end of file diff --git a/packages/webapp/webpack.common.js b/packages/webapp/webpack.common.js index cf63e18f..4c3e57bd 100644 --- a/packages/webapp/webpack.common.js +++ b/packages/webapp/webpack.common.js @@ -30,6 +30,10 @@ module.exports = { test: /\.(png|jpe?g|gif|svg)$/, type: 'asset/inline', }, + { + test: /\.wxml$/i, + type: 'asset/source', + }, ], }, optimization: { diff --git a/yarn.lock b/yarn.lock index 08d95631..b88ea3cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + "@babel/code-frame@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -23,38 +30,38 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" - integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" + integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.6", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" - integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + version "7.17.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" + integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== dependencies: + "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" + "@babel/generator" "^7.17.3" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.12" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.3" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.10" - "@babel/types" "^7.16.8" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" semver "^6.3.0" - source-map "^0.5.0" -"@babel/generator@^7.16.8", "@babel/generator@^7.7.2": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== +"@babel/generator@^7.17.3", "@babel/generator@^7.7.2": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" + integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== dependencies: - "@babel/types" "^7.16.8" + "@babel/types" "^7.17.0" jsesc "^2.5.1" source-map "^0.5.0" @@ -83,10 +90,10 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" - integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" + integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" @@ -97,12 +104,12 @@ "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" + regexpu-core "^5.0.1" "@babel/helper-define-polyfill-provider@^0.3.1": version "0.3.1" @@ -170,9 +177,9 @@ "@babel/types" "^7.16.7" "@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" + integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== dependencies: "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-module-imports" "^7.16.7" @@ -180,8 +187,8 @@ "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" @@ -256,14 +263,14 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== +"@babel/helpers@^7.17.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" + integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== dependencies: "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" "@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": version "7.16.10" @@ -274,10 +281,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.4", "@babel/parser@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" - integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" + integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" @@ -313,11 +320,11 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" + integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.17.6" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -370,11 +377,11 @@ "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== dependencies: - "@babel/compat-data" "^7.16.4" + "@babel/compat-data" "^7.17.0" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" @@ -601,9 +608,9 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-destructuring@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz#c445f75819641788a27a0a3a759d9df911df6abc" + integrity sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -749,15 +756,15 @@ "@babel/plugin-transform-react-jsx" "^7.16.7" "@babel/plugin-transform-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" + integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" @@ -954,35 +961,28 @@ "@babel/plugin-transform-typescript" "^7.16.7" "@babel/register@^7.16.0": - version "7.16.9" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.16.9.tgz#fcfb23cfdd9ad95c9771e58183de83b513857806" - integrity sha512-jJ72wcghdRIlENfvALcyODhNoGE5j75cYHdC+aQMh6cU/P86tiiXTp9XYZct1UxUMo/4+BgQRyNZEGx0KWGS+g== + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.0.tgz#8051e0b7cb71385be4909324f072599723a1f084" + integrity sha512-UNZsMAZ7uKoGHo1HlEXfteEOYssf64n/PNLHGqOKq/bgYcu/4LrQWAHJwSCb3BRZK8Hi5gkJdRcwrGTO2wtRCg== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" make-dir "^2.1.0" - pirates "^4.0.0" + pirates "^4.0.5" source-map-support "^0.5.16" "@babel/runtime-corejs3@^7.10.2": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz#ea533d96eda6fdc76b1812248e9fbd0c11d4a1a7" - integrity sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg== + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz#fdca2cd05fba63388babe85d349b6801b008fd13" + integrity sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg== dependencies: core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.13.10", "@babel/runtime@^7.16.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.3": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.0.tgz#b8d142fc0f7664fb3d9b5833fd40dcbab89276c0" - integrity sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" + integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== dependencies: regenerator-runtime "^0.13.4" @@ -995,26 +995,26 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" - integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== dependencies: "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" + "@babel/generator" "^7.17.3" "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.10" - "@babel/types" "^7.16.8" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" @@ -1024,6 +1024,18 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + "@cypress/request@^2.88.10", "@cypress/request@^2.88.6": version "2.88.10" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" @@ -1061,77 +1073,40 @@ resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.13.1.tgz#f041765aff5c55fbc7e37fdd75fc1792733426d6" integrity sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg== -"@date-io/date-fns@^2.11.0": +"@date-io/date-fns@^2.13.1": version "2.13.1" resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.13.1.tgz#19d8a245dab61c03c95ba492d679d98d2b0b4af5" integrity sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ== dependencies: "@date-io/core" "^2.13.1" -"@date-io/dayjs@^2.11.0": +"@date-io/dayjs@^2.13.1": version "2.13.1" resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.13.1.tgz#98461d22ee98179b9f2dca3b36f1b618704ae593" integrity sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ== dependencies: "@date-io/core" "^2.13.1" -"@date-io/luxon@^2.11.1": +"@date-io/luxon@^2.13.1": version "2.13.1" resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.13.1.tgz#3701b3cabfffda5102af302979aa6e58acfda91a" integrity sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg== dependencies: "@date-io/core" "^2.13.1" -"@date-io/moment@^2.11.0": +"@date-io/moment@^2.13.1": version "2.13.1" resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.13.1.tgz#122a51e4bdedf71ff3babb264427737dc022c1e6" integrity sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A== dependencies: "@date-io/core" "^2.13.1" -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cypress/request@^2.88.10", "@cypress/request@^2.88.6": - version "2.88.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^8.3.2" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - "@discoveryjs/json-ext@^0.5.0": version "0.5.6" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== -"@emotion/babel-plugin@^11.3.0": +"@emotion/babel-plugin@^11.7.1": version "11.7.2" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz#fec75f38a6ab5b304b0601c74e2a5e77c95e5fa0" integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ== @@ -1172,10 +1147,10 @@ dependencies: "@emotion/memoize" "0.7.4" -"@emotion/is-prop-valid@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz#cbd843d409dfaad90f9404e7c0404c55eae8c134" - integrity sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw== +"@emotion/is-prop-valid@^1.1.1", "@emotion/is-prop-valid@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" + integrity sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ== dependencies: "@emotion/memoize" "^0.7.4" @@ -1190,15 +1165,16 @@ integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== "@emotion/react@^11.7.1": - version "11.7.1" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.7.1.tgz#3f800ce9b20317c13e77b8489ac4a0b922b2fe07" - integrity sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw== + version "11.8.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.8.1.tgz#5358b8c78367063881e26423057c030c57ce52eb" + integrity sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q== dependencies: "@babel/runtime" "^7.13.10" + "@emotion/babel-plugin" "^11.7.1" "@emotion/cache" "^11.7.1" "@emotion/serialize" "^1.0.2" "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" + "@emotion/utils" "^1.1.0" "@emotion/weak-memoize" "^0.2.5" hoist-non-react-statics "^3.3.1" @@ -1219,15 +1195,15 @@ integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== "@emotion/styled@^11.6.0": - version "11.6.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.6.0.tgz#9230d1a7bcb2ebf83c6a579f4c80e0664132d81d" - integrity sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw== + version "11.8.1" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.8.1.tgz#856f6f63aceef0eb783985fa2322e2bf66d04e17" + integrity sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ== dependencies: "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.3.0" - "@emotion/is-prop-valid" "^1.1.1" + "@emotion/babel-plugin" "^11.7.1" + "@emotion/is-prop-valid" "^1.1.2" "@emotion/serialize" "^1.0.2" - "@emotion/utils" "^1.0.0" + "@emotion/utils" "^1.1.0" "@emotion/stylis@^0.8.4": version "0.8.5" @@ -1239,10 +1215,10 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" - integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== +"@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" + integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== "@emotion/weak-memoize@^0.2.5": version "0.2.5" @@ -1264,14 +1240,14 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" - integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== +"@eslint/eslintrc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.1.0.tgz#583d12dbec5d4f22f333f9669f7d0b7c7815b4d3" + integrity sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.2.0" + espree "^9.3.1" globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" @@ -1377,12 +1353,12 @@ typescript "^4.0" "@formatjs/cli@^4.8.1": - version "4.8.1" - resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-4.8.1.tgz#d2fa5308961254f8a575ca976ac279e8e12cf206" - integrity sha512-cXA1ir9DEHJu2Ilc964NL5cs5ndwiA8TqSrSNrgjBRuPqQzzo6XE9dgwUk7PQoCA50LRtHpEtfGbf9P7veZqmw== + version "4.8.2" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-4.8.2.tgz#65b08c01d0ee0099d56c419ecd49c0bf2f947f56" + integrity sha512-nYG9e2tH3xxLbdvlq1KHUdgjfLICa16wY5fD82JTUyiixJ0tDIlMjT3BbEHwKSCYyIxcVme5ODcduZ4gRM+b5w== dependencies: - "@formatjs/icu-messageformat-parser" "2.0.17" - "@formatjs/ts-transformer" "3.9.1" + "@formatjs/icu-messageformat-parser" "2.0.18" + "@formatjs/ts-transformer" "3.9.2" "@types/estree" "^0.0.50" "@types/fs-extra" "^9.0.1" "@types/json-stable-stringify" "^1.0.32" @@ -1398,12 +1374,12 @@ typescript "^4.5" vue "^3.2.23" -"@formatjs/ecma402-abstract@1.11.2": - version "1.11.2" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.2.tgz#7f01595e6985a28983aae26bede9b78b273fee3d" - integrity sha512-qDgOL0vtfJ51cc0pRbFB/oXc4qDbamG22Z6h/QWy6FBxaQgppiy8JF0iYbmNO35cC8r88bQGsgfd/eM6/eTEQQ== +"@formatjs/ecma402-abstract@1.11.3": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.3.tgz#f25276dfd4ef3dac90da667c3961d8aa9732e384" + integrity sha512-kP/Buv5vVFMAYLHNvvUzr0lwRTU0u2WTy44Tqwku1X3C3lJ5dKqDCYVqA8wL+Y19Bq+MwHgxqd5FZJRCIsLRyQ== dependencies: - "@formatjs/intl-localematcher" "0.2.23" + "@formatjs/intl-localematcher" "0.2.24" tslib "^2.1.0" "@formatjs/ecma402-abstract@1.5.0": @@ -1413,21 +1389,21 @@ dependencies: tslib "^2.0.1" -"@formatjs/icu-messageformat-parser@2.0.17": - version "2.0.17" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.17.tgz#0f817aa06d3b9f23ae0a8bd667b5d7785df5017c" - integrity sha512-GO4DzmyiDUyT4p9UxSlOcdnRL1CCt43oHBBGe21s5043UjP6dwMbOotugKs1bRiN+FrNrRUSW+TLdT3+4CBI5A== +"@formatjs/icu-messageformat-parser@2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.18.tgz#b09e8f16b88e988fd125e7c5810300e8a6dd2c42" + integrity sha512-vquIzsAJJmZ5jWVH8dEgUKcbG4yu3KqtyPet+q35SW5reLOvblkfeCXTRW2TpIwNXzdVqsJBwjbTiRiSU9JxwQ== dependencies: - "@formatjs/ecma402-abstract" "1.11.2" - "@formatjs/icu-skeleton-parser" "1.3.4" + "@formatjs/ecma402-abstract" "1.11.3" + "@formatjs/icu-skeleton-parser" "1.3.5" tslib "^2.1.0" -"@formatjs/icu-skeleton-parser@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.4.tgz#5508ff60cce4eb4698917cb50cb9ff576dde6e5b" - integrity sha512-BbKjX3rF3hq2bRjI9NjnSPUrNqI1TwwbMomOBamWfAkpOEf4LYEezPL9tHEds/+sN2/82Z+qEmK7s/l9G2J+qA== +"@formatjs/icu-skeleton-parser@1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.5.tgz#babc93a1c36383cf87cbb3d2f2145d26c2f7cb40" + integrity sha512-Nhyo2/6kG7ZfgeEfo02sxviOuBcvtzH6SYUharj3DLCDJH3A/4OxkKcmx/2PWGX4bc6iSieh+FA94CsKDxnZBQ== dependencies: - "@formatjs/ecma402-abstract" "1.11.2" + "@formatjs/ecma402-abstract" "1.11.3" tslib "^2.1.0" "@formatjs/intl-displaynames@^1.2.0": @@ -1444,10 +1420,10 @@ dependencies: "@formatjs/intl-utils" "^2.3.0" -"@formatjs/intl-localematcher@0.2.23": - version "0.2.23" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.23.tgz#5a0b1d81df1f392ecf37e556ca7040a7ec9f72e8" - integrity sha512-oCe2TOciTtB1bEbJ85EvYrXQxD0epusmVJfJ7AduO0tlbXP42CmDIYIH2CZ+kP2GE+PTLQD1Hbt9kpOpl939MQ== +"@formatjs/intl-localematcher@0.2.24": + version "0.2.24" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.24.tgz#b49fd753c0f54421f26a3c1d0e9cf98a3966e78f" + integrity sha512-K/HRGo6EMnCbhpth/y3u4rW4aXkmQNqRe1L2G+Y5jNr3v0gYhvaucV8WixNju/INAMbPBlbsRBRo/nfjnoOnxQ== dependencies: tslib "^2.1.0" @@ -1479,12 +1455,12 @@ tslib "^2.0.1" typescript "^4.0" -"@formatjs/ts-transformer@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.9.1.tgz#92d7d54debf7f427dcc8c9bc57c8813560553708" - integrity sha512-FY31pBrqIO8AeL6+vFFCSqBXe4NZyxCfIb1jRColBXiQHbUlmfaoTFu19BXibqbU5CxFd+wG2LhDLZuitGhDBA== +"@formatjs/ts-transformer@3.9.2": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.9.2.tgz#958582b16ed9125fd904c051a9dda1ecd2474a5a" + integrity sha512-Iff+ca1ue3IOb/PDNANR6++EArwlyMpW+t6AL4MG5sordpgflsIh8BMz6nGs+/tUOjP0xioNAu/acYiQ+rW5Bw== dependencies: - "@formatjs/icu-messageformat-parser" "2.0.17" + "@formatjs/icu-messageformat-parser" "2.0.18" "@types/node" "14 || 16 || 17" chalk "^4.0.0" tslib "^2.1.0" @@ -1512,9 +1488,9 @@ minimatch "^3.0.4" "@humanwhocodes/config-array@^0.9.2": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.3.tgz#f2564c744b387775b436418491f15fce6601f63e" - integrity sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ== + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1549,158 +1525,158 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.6.tgz#0742e6787f682b22bdad56f9db2a8a77f6a86107" - integrity sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA== +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.4.6" - jest-util "^27.4.2" + jest-message-util "^27.5.1" + jest-util "^27.5.1" slash "^3.0.0" -"@jest/core@^27.4.7": - version "27.4.7" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.7.tgz#84eabdf42a25f1fa138272ed229bcf0a1b5e6913" - integrity sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg== +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== dependencies: - "@jest/console" "^27.4.6" - "@jest/reporters" "^27.4.6" - "@jest/test-result" "^27.4.6" - "@jest/transform" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.8.1" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^27.4.2" - jest-config "^27.4.7" - jest-haste-map "^27.4.6" - jest-message-util "^27.4.6" - jest-regex-util "^27.4.0" - jest-resolve "^27.4.6" - jest-resolve-dependencies "^27.4.6" - jest-runner "^27.4.6" - jest-runtime "^27.4.6" - jest-snapshot "^27.4.6" - jest-util "^27.4.2" - jest-validate "^27.4.6" - jest-watcher "^27.4.6" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" micromatch "^4.0.4" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.6.tgz#1e92885d64f48c8454df35ed9779fbcf31c56d8b" - integrity sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg== +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== dependencies: - "@jest/fake-timers" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^27.4.6" + jest-mock "^27.5.1" -"@jest/fake-timers@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.6.tgz#e026ae1671316dbd04a56945be2fa251204324e8" - integrity sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A== +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^27.4.6" - jest-mock "^27.4.6" - jest-util "^27.4.2" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" -"@jest/globals@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.6.tgz#3f09bed64b0fd7f5f996920258bd4be8f52f060a" - integrity sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw== +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== dependencies: - "@jest/environment" "^27.4.6" - "@jest/types" "^27.4.2" - expect "^27.4.6" + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" -"@jest/reporters@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.6.tgz#b53dec3a93baf9b00826abf95b932de919d6d8dd" - integrity sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ== +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.4.6" - "@jest/test-result" "^27.4.6" - "@jest/transform" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-haste-map "^27.4.6" - jest-resolve "^27.4.6" - jest-util "^27.4.2" - jest-worker "^27.4.6" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" -"@jest/source-map@^27.4.0": - version "27.4.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.4.0.tgz#2f0385d0d884fb3e2554e8f71f8fa957af9a74b6" - integrity sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ== +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" source-map "^0.6.0" -"@jest/test-result@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.6.tgz#b3df94c3d899c040f602cea296979844f61bdf69" - integrity sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ== +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== dependencies: - "@jest/console" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz#447339b8a3d7b5436f50934df30854e442a9d904" - integrity sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw== +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== dependencies: - "@jest/test-result" "^27.4.6" - graceful-fs "^4.2.4" - jest-haste-map "^27.4.6" - jest-runtime "^27.4.6" + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" -"@jest/transform@^27.4.6": - version "27.4.6" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.6.tgz#153621940b1ed500305eacdb31105d415dc30231" - integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw== +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^27.4.6" - jest-regex-util "^27.4.0" - jest-util "^27.4.2" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" @@ -1718,10 +1694,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^27.4.2": - version "27.4.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5" - integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -1729,6 +1705,24 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@lerna/add@3.21.0": version "3.21.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" @@ -2422,39 +2416,39 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@mui/base@5.0.0-alpha.67": - version "5.0.0-alpha.67" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.67.tgz#da2423b96204f71cf37bcfcf3054667f38361eb8" - integrity sha512-yK2++NivZUitAVpheMc5QVuwrVCphrTw85L6qjKcvnSpB8wmVYne58CY2vzMCNEuHkuHG2jccq9/JlRZFGAanw== +"@mui/base@5.0.0-alpha.69": + version "5.0.0-alpha.69" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.69.tgz#8511198d760de0795870f5ec63e53db73ba801ec" + integrity sha512-IxUUj/lkilCTNBIybQxyQGW/zpxFp490G0QBQJgRp9TJkW2PWSTLvAH7gcH0YHd0L2TAf1TRgfdemoRseMzqQA== dependencies: - "@babel/runtime" "^7.16.7" + "@babel/runtime" "^7.17.0" "@emotion/is-prop-valid" "^1.1.1" - "@mui/utils" "^5.3.0" + "@mui/utils" "^5.4.2" "@popperjs/core" "^2.4.4" clsx "^1.1.1" prop-types "^15.7.2" react-is "^17.0.2" "@mui/icons-material@^5.3.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.3.1.tgz#e0e0aecce5a86971dbaa46441d931a9c749a1c53" - integrity sha512-8zBWCaE8DHjIGZhGgMod92p6Rm38EhXrS+cZtaV0+jOTMeWh7z+mvswXzb/rVKc0ZYqw6mQYBcn2uEs2yclI9w== + version "5.4.2" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.4.2.tgz#b2fd2c6c81d2d275e17ce40bd50c63cb197d324b" + integrity sha512-7c+G3jBT+e+pN0a9DJ0Bd8Kr1Vy6os5Q1yd2aXcwuhlRI3uzJBLJ8sX6FSWoh5DSEBchb7Bsk1uHz6U0YN9l+Q== dependencies: - "@babel/runtime" "^7.16.7" + "@babel/runtime" "^7.17.0" "@mui/lab@^5.0.0-alpha.67": - version "5.0.0-alpha.67" - resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.67.tgz#2b906cabf15351429c9967199e093cc510506826" - integrity sha512-pL6O2teso3tpAv38FXiFNWGcXjakgO66/Os5p2KX4QbkPKvzzeSxNU7hI02Ye8BIEYqTR5Oaz8njcdQgcNI7Cg== + version "5.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.70.tgz#ca5a81d51c756d56ef19159331c46f9888b33556" + integrity sha512-F4OIfPy9yl3RwEqHAHRkyzgmC9ud0HSualGzX59qNq7HqjVb34lJWC8I9P/cdh3d59eLl6M62FDrO3M5h4DhKg== dependencies: - "@babel/runtime" "^7.16.7" - "@date-io/date-fns" "^2.11.0" - "@date-io/dayjs" "^2.11.0" - "@date-io/luxon" "^2.11.1" - "@date-io/moment" "^2.11.0" - "@mui/base" "5.0.0-alpha.67" - "@mui/system" "^5.4.0" - "@mui/utils" "^5.3.0" + "@babel/runtime" "^7.17.0" + "@date-io/date-fns" "^2.13.1" + "@date-io/dayjs" "^2.13.1" + "@date-io/luxon" "^2.13.1" + "@date-io/moment" "^2.13.1" + "@mui/base" "5.0.0-alpha.69" + "@mui/system" "^5.4.3" + "@mui/utils" "^5.4.2" clsx "^1.1.1" prop-types "^15.7.2" react-is "^17.0.2" @@ -2462,15 +2456,15 @@ rifm "^0.12.1" "@mui/material@^5.3.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.4.0.tgz#b54d9fbcad5c4036b95c53906f0fc9c16c980f6e" - integrity sha512-vfBIAMsRNWI/A4p/eP01MjqhSACwxRGYp/2Yi7WAU64PpI/TXR4b9SRl+XJMMJXVC7+abu4E3hTdF3oqwMCSYA== + version "5.4.3" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.4.3.tgz#cc0af7192a856796bd82955c5317722916d02bc1" + integrity sha512-E2K402xjz3U09mTgrVYj+vUACeOppV41uEcu9GSkm7QSg4Nzy48WkdaiGL7TRCyH0T8HsonFSMJvCpwyQbD6iw== dependencies: - "@babel/runtime" "^7.16.7" - "@mui/base" "5.0.0-alpha.67" - "@mui/system" "^5.4.0" - "@mui/types" "^7.1.0" - "@mui/utils" "^5.3.0" + "@babel/runtime" "^7.17.0" + "@mui/base" "5.0.0-alpha.69" + "@mui/system" "^5.4.3" + "@mui/types" "^7.1.2" + "@mui/utils" "^5.4.2" "@types/react-transition-group" "^4.4.4" clsx "^1.1.1" csstype "^3.0.10" @@ -2479,34 +2473,34 @@ react-is "^17.0.2" react-transition-group "^4.4.2" -"@mui/private-theming@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.3.0.tgz#1ec32766fc4467f221663a4945b6c972c7d2567b" - integrity sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg== +"@mui/private-theming@^5.4.2": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.4.2.tgz#f0a05f908456a2f7b87ccb6fc3b6e1faae9d89e6" + integrity sha512-mlPDYYko4wIcwXjCPEmOWbNTT4DZ6h9YHdnRtQPnWM28+TRUHEo7SbydnnmVDQLRXUfaH4Y6XtEHIfBNPE/SLg== dependencies: - "@babel/runtime" "^7.16.7" - "@mui/utils" "^5.3.0" + "@babel/runtime" "^7.17.0" + "@mui/utils" "^5.4.2" prop-types "^15.7.2" -"@mui/styled-engine@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.3.0.tgz#b260a06398fc7335a62fd65ebbb9fc3c4071027b" - integrity sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw== +"@mui/styled-engine@^5.4.2": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.4.2.tgz#e04903e06bd49fd10072a44ff38e13f5481bb64d" + integrity sha512-tz9p3aRtzXHKAg7x3BgP0hVQEoGKaxNCFxsJ+d/iqEHYvywWFSs6oxqYAvDHIRpvMlUZyPNoTrkcNnbdMmH/ng== dependencies: - "@babel/runtime" "^7.16.7" + "@babel/runtime" "^7.17.0" "@emotion/cache" "^11.7.1" prop-types "^15.7.2" "@mui/styles@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.3.0.tgz#9b4901b338259554ef38065d8d5b038e61c4ae56" - integrity sha512-TPfK8c8Zpydpynl4deNv43c0puriXSjf44eadyYle7veVQt5dnT3vgyIqXjP8Ypia653kEVe++GpXTvXnylU7A== + version "5.4.2" + resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.4.2.tgz#e0dadfc5de8255605f23c2f909f3669f0911bb88" + integrity sha512-BX75fNHmRF51yove9dBkH28gpSFjClOPDEnUwLTghPYN913OsqViS/iuCd61dxzygtEEmmeYuWfQjxu/F6vF5g== dependencies: - "@babel/runtime" "^7.16.7" + "@babel/runtime" "^7.17.0" "@emotion/hash" "^0.8.0" - "@mui/private-theming" "^5.3.0" - "@mui/types" "^7.1.0" - "@mui/utils" "^5.3.0" + "@mui/private-theming" "^5.4.2" + "@mui/types" "^7.1.2" + "@mui/utils" "^5.4.2" clsx "^1.1.1" csstype "^3.0.10" hoist-non-react-statics "^3.3.2" @@ -2520,31 +2514,31 @@ jss-plugin-vendor-prefixer "^10.8.2" prop-types "^15.7.2" -"@mui/system@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.4.0.tgz#ff79c4922b8cea8c6e05946587fa9a3b938ab729" - integrity sha512-LX7g5gK5yCwiueSUVG73uVNc0yeHjsWUIFLrnPjP3m+J7O38RkPqyao5nZahhaSL1PGNbR9+zfkxljXthO9QqA== +"@mui/system@^5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.4.3.tgz#3bc2547183b8d09b04df1c835cfeb1259f7ec3fd" + integrity sha512-Xz5AVe9JMufJVozMzUv93IRtnLNZnw/Q8k+Mg7Q4oRuwdir0TcYkMVUqAHetVKb3rAouIVCu/cQv0jB8gVeVsQ== dependencies: - "@babel/runtime" "^7.16.7" - "@mui/private-theming" "^5.3.0" - "@mui/styled-engine" "^5.3.0" - "@mui/types" "^7.1.0" - "@mui/utils" "^5.3.0" + "@babel/runtime" "^7.17.0" + "@mui/private-theming" "^5.4.2" + "@mui/styled-engine" "^5.4.2" + "@mui/types" "^7.1.2" + "@mui/utils" "^5.4.2" clsx "^1.1.1" csstype "^3.0.10" prop-types "^15.7.2" -"@mui/types@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.0.tgz#5ed928c5a41cfbf9a4be82ea3bbdc47bcc9610d5" - integrity sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ== +"@mui/types@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.2.tgz#4f3678ae77a7a3efab73b6e040469cc6df2144ac" + integrity sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ== -"@mui/utils@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.3.0.tgz#5f31915063d25c56f1d3ba9e289bf447472a868c" - integrity sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q== +"@mui/utils@^5.4.2": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.4.2.tgz#3edda8f80de235418fff0424ee66e2a49793ec01" + integrity sha512-646dBCC57MXTo/Gf3AnZSHRHznaTETQq5x7AWp5FRQ4jPeyT4WSs18cpJVwkV01cAHKh06pNQTIufIALIWCL5g== dependencies: - "@babel/runtime" "^7.16.7" + "@babel/runtime" "^7.17.0" "@types/prop-types" "^15.7.4" "@types/react-is" "^16.7.1 || ^17.0.0" prop-types "^15.7.2" @@ -2699,9 +2693,9 @@ integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== "@reduxjs/toolkit@^1.5.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.7.1.tgz#994962aeb7df3c77be343dd2ad1aa48221dbaa0c" - integrity sha512-wXwXYjBVz/ItxB7SMzEAMmEE/FBiY1ze18N+VVVX7NtVbRUrdOGKhpQMHivIJfkbJvSdLUU923a/yAagJQzY0Q== + version "1.7.2" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.7.2.tgz#b428aaef92582379464f9de698dbb71957eafb02" + integrity sha512-wwr3//Ar8ZhM9bS58O+HCIaMlR4Y6SNHfuszz9hKnQuFIKvwaL3Kmjo6fpDKUOjo4Lv54Yi299ed8rofCJ/Vjw== dependencies: immer "^9.0.7" redux "^4.1.2" @@ -2778,6 +2772,26 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -2846,7 +2860,7 @@ dependencies: "@types/node" "*" -"@types/eslint-scope@^3.7.0": +"@types/eslint-scope@^3.7.3": version "3.7.3" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== @@ -2862,7 +2876,12 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.50": +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@^0.0.50": version "0.0.50" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== @@ -2876,7 +2895,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*": +"@types/express@*", "@types/express@^4.17.13": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== @@ -2953,11 +2972,11 @@ "@types/istanbul-lib-report" "*" "@types/jest@^27.0.3": - version "27.4.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.0.tgz#037ab8b872067cae842a320841693080f9cb84ed" - integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ== + version "27.4.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" + integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== dependencies: - jest-diff "^27.0.0" + jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" "@types/jquery@^3.5.11": @@ -3009,20 +3028,15 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/node@*", "@types/node@>= 8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3" - integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw== +"@types/node@*", "@types/node@14 || 16 || 17", "@types/node@>= 8": + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" + integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== "@types/node@14", "@types/node@^14.14.31": - version "14.18.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.9.tgz#0e5944eefe2b287391279a19b407aa98bd14436d" - integrity sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q== - -"@types/node@14 || 16 || 17": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.14.tgz#33b9b94f789a8fedd30a68efdbca4dbb06b61f20" - integrity sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng== + version "14.18.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24" + integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3035,9 +3049,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.3.tgz#a3c65525b91fca7da00ab1a3ac2b5a2a4afbffbf" - integrity sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" + integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== "@types/prop-types@*", "@types/prop-types@^15.7.4": version "15.7.4" @@ -3086,9 +3100,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^17.0.0": - version "17.0.38" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" - integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== + version "17.0.39" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.39.tgz#d0f4cde092502a6db00a1cded6e6bf2abb7633ce" + integrity sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3152,9 +3166,9 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/styled-components@^5.1.4": - version "5.1.21" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.21.tgz#39f6bdc4103254d899531ef099dae5619b039cdb" - integrity sha512-lQzA0T6CaLXoeiOkSe2US2JfFgJV2/yJ8W1BaJubQQh2wdq7H+qScQQfbjURyLkgI1Ig+S/jRHCrWikfMHC6zA== + version "5.1.23" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.23.tgz#11e5740047f292b42a042c60c0ef16b58d5adef6" + integrity sha512-zt8oQGU6XB4LH1Xpq169YnAVmt22+swzHJvyKMyTZu/z8+afvgKjjg0s79aAodgNSf36ZOEG6DyVAW/JhLH2Nw== dependencies: "@types/hoist-non-react-statics" "*" "@types/react" "*" @@ -3202,9 +3216,9 @@ source-map "^0.6.0" "@types/ws@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" - integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== + version "8.5.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.0.tgz#805ceb3f68eaebbed1a3004a66f16e35b7f3bf14" + integrity sha512-mTClfhq5cuGyW4jthaFuig6Q8OVfB3IRyZfN/9SCyJtiM5H0SubwM89cHoT9UngO6HyUFic88HvT1zSNLNyxWA== dependencies: "@types/node" "*" @@ -3249,13 +3263,13 @@ tsutils "^3.21.0" "@typescript-eslint/eslint-plugin@^5.9.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz#870195d0f2146b36d11fc71131b75aba52354c69" - integrity sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ== + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz#b2cd3e288f250ce8332d5035a2ff65aba3374ac4" + integrity sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw== dependencies: - "@typescript-eslint/scope-manager" "5.10.1" - "@typescript-eslint/type-utils" "5.10.1" - "@typescript-eslint/utils" "5.10.1" + "@typescript-eslint/scope-manager" "5.12.1" + "@typescript-eslint/type-utils" "5.12.1" + "@typescript-eslint/utils" "5.12.1" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -3286,13 +3300,13 @@ debug "^4.3.1" "@typescript-eslint/parser@^5.9.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.1.tgz#4ce9633cc33fc70bc13786cb793c1a76fe5ad6bd" - integrity sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA== + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.12.1.tgz#b090289b553b8aa0899740d799d0f96e6f49771b" + integrity sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw== dependencies: - "@typescript-eslint/scope-manager" "5.10.1" - "@typescript-eslint/types" "5.10.1" - "@typescript-eslint/typescript-estree" "5.10.1" + "@typescript-eslint/scope-manager" "5.12.1" + "@typescript-eslint/types" "5.12.1" + "@typescript-eslint/typescript-estree" "5.12.1" debug "^4.3.2" "@typescript-eslint/scope-manager@4.33.0": @@ -3303,20 +3317,20 @@ "@typescript-eslint/types" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0" -"@typescript-eslint/scope-manager@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz#f0539c73804d2423506db2475352a4dec36cd809" - integrity sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg== +"@typescript-eslint/scope-manager@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz#58734fd45d2d1dec49641aacc075fba5f0968817" + integrity sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ== dependencies: - "@typescript-eslint/types" "5.10.1" - "@typescript-eslint/visitor-keys" "5.10.1" + "@typescript-eslint/types" "5.12.1" + "@typescript-eslint/visitor-keys" "5.12.1" -"@typescript-eslint/type-utils@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz#5e526c00142585e40ab1503e83f1ff608c367405" - integrity sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw== +"@typescript-eslint/type-utils@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz#8d58c6a0bb176b5e9a91581cda1a7f91a114d3f0" + integrity sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg== dependencies: - "@typescript-eslint/utils" "5.10.1" + "@typescript-eslint/utils" "5.12.1" debug "^4.3.2" tsutils "^3.21.0" @@ -3325,10 +3339,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== -"@typescript-eslint/types@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.1.tgz#dca9bd4cb8c067fc85304a31f38ec4766ba2d1ea" - integrity sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q== +"@typescript-eslint/types@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.12.1.tgz#46a36a28ff4d946821b58fe5a73c81dc2e12aa89" + integrity sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA== "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" @@ -3343,28 +3357,28 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz#b268e67be0553f8790ba3fe87113282977adda15" - integrity sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ== +"@typescript-eslint/typescript-estree@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz#6a9425b9c305bcbc38e2d1d9a24c08e15e02b722" + integrity sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw== dependencies: - "@typescript-eslint/types" "5.10.1" - "@typescript-eslint/visitor-keys" "5.10.1" + "@typescript-eslint/types" "5.12.1" + "@typescript-eslint/visitor-keys" "5.12.1" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.1.tgz#fa682a33af47080ba2c4368ee0ad2128213a1196" - integrity sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw== +"@typescript-eslint/utils@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.12.1.tgz#447c24a05d9c33f9c6c64cb48f251f2371eef920" + integrity sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.10.1" - "@typescript-eslint/types" "5.10.1" - "@typescript-eslint/typescript-estree" "5.10.1" + "@typescript-eslint/scope-manager" "5.12.1" + "@typescript-eslint/types" "5.12.1" + "@typescript-eslint/typescript-estree" "5.12.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -3376,12 +3390,12 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz#29102de692f59d7d34ecc457ed59ab5fc558010b" - integrity sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ== +"@typescript-eslint/visitor-keys@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz#f722da106c8f9695ae5640574225e45af3e52ec3" + integrity sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A== dependencies: - "@typescript-eslint/types" "5.10.1" + "@typescript-eslint/types" "5.12.1" eslint-visitor-keys "^3.0.0" "@ungap/promise-all-settled@1.1.2": @@ -3389,95 +3403,95 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -"@vue/compiler-core@3.2.29", "@vue/compiler-core@^3.0.0", "@vue/compiler-core@^3.2.23": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.29.tgz#b06097ab8ff0493177c68c5ea5b63d379a061097" - integrity sha512-RePZ/J4Ub3sb7atQw6V6Rez+/5LCRHGFlSetT3N4VMrejqJnNPXKUt5AVm/9F5MJriy2w/VudEIvgscCfCWqxw== +"@vue/compiler-core@3.2.31", "@vue/compiler-core@^3.0.0", "@vue/compiler-core@^3.2.23": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.31.tgz#d38f06c2cf845742403b523ab4596a3fda152e89" + integrity sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ== dependencies: "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.29" + "@vue/shared" "3.2.31" estree-walker "^2.0.2" source-map "^0.6.1" -"@vue/compiler-dom@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.29.tgz#ad0ead405bd2f2754161335aad9758aa12430715" - integrity sha512-y26vK5khdNS9L3ckvkqJk/78qXwWb75Ci8iYLb67AkJuIgyKhIOcR1E8RIt4mswlVCIeI9gQ+fmtdhaiTAtrBQ== +"@vue/compiler-dom@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz#b1b7dfad55c96c8cc2b919cd7eb5fd7e4ddbf00e" + integrity sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg== dependencies: - "@vue/compiler-core" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" -"@vue/compiler-sfc@3.2.29", "@vue/compiler-sfc@^3.0.5": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.29.tgz#f76d556cd5fca6a55a3ea84c88db1a2a53a36ead" - integrity sha512-X9+0dwsag2u6hSOP/XsMYqFti/edvYvxamgBgCcbSYuXx1xLZN+dS/GvQKM4AgGS4djqo0jQvWfIXdfZ2ET68g== +"@vue/compiler-sfc@3.2.31", "@vue/compiler-sfc@^3.0.5": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz#d02b29c3fe34d599a52c5ae1c6937b4d69f11c2f" + integrity sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ== dependencies: "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.29" - "@vue/compiler-dom" "3.2.29" - "@vue/compiler-ssr" "3.2.29" - "@vue/reactivity-transform" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/compiler-core" "3.2.31" + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-ssr" "3.2.31" + "@vue/reactivity-transform" "3.2.31" + "@vue/shared" "3.2.31" estree-walker "^2.0.2" magic-string "^0.25.7" postcss "^8.1.10" source-map "^0.6.1" -"@vue/compiler-ssr@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.29.tgz#37b15b32dcd2f6b410bb61fca3f37b1a92b7eb1e" - integrity sha512-LrvQwXlx66uWsB9/VydaaqEpae9xtmlUkeSKF6aPDbzx8M1h7ukxaPjNCAXuFd3fUHblcri8k42lfimHfzMICA== +"@vue/compiler-ssr@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz#4fa00f486c9c4580b40a4177871ebbd650ecb99c" + integrity sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw== dependencies: - "@vue/compiler-dom" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/compiler-dom" "3.2.31" + "@vue/shared" "3.2.31" -"@vue/reactivity-transform@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.29.tgz#a08d606e10016b7cf588d1a43dae4db2953f9354" - integrity sha512-YF6HdOuhdOw6KyRm59+3rML8USb9o8mYM1q+SH0G41K3/q/G7uhPnHGKvspzceD7h9J3VR1waOQ93CUZj7J7OA== +"@vue/reactivity-transform@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz#0f5b25c24e70edab2b613d5305c465b50fc00911" + integrity sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA== dependencies: "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" estree-walker "^2.0.2" magic-string "^0.25.7" -"@vue/reactivity@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.29.tgz#afdc9c111d4139b14600be17ad80267212af6052" - integrity sha512-Ryhb6Gy62YolKXH1gv42pEqwx7zs3n8gacRVZICSgjQz8Qr8QeCcFygBKYfJm3o1SccR7U+bVBQDWZGOyG1k4g== +"@vue/reactivity@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.31.tgz#fc90aa2cdf695418b79e534783aca90d63a46bbd" + integrity sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw== dependencies: - "@vue/shared" "3.2.29" + "@vue/shared" "3.2.31" -"@vue/runtime-core@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.29.tgz#fb8577b2fcf52e8d967bd91cdf49ab9fb91f9417" - integrity sha512-VMvQuLdzoTGmCwIKTKVwKmIL0qcODIqe74JtK1pVr5lnaE0l25hopodmPag3RcnIcIXe+Ye3B2olRCn7fTCgig== +"@vue/runtime-core@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.31.tgz#9d284c382f5f981b7a7b5971052a1dc4ef39ac7a" + integrity sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA== dependencies: - "@vue/reactivity" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/reactivity" "3.2.31" + "@vue/shared" "3.2.31" -"@vue/runtime-dom@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.29.tgz#35e9a2bf04ef80b86ac2ca0e7b2ceaccf1e18f01" - integrity sha512-YJgLQLwr+SQyORzTsBQLL5TT/5UiV83tEotqjL7F9aFDIQdFBTCwpkCFvX9jqwHoyi9sJqM9XtTrMcc8z/OjPA== +"@vue/runtime-dom@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz#79ce01817cb3caf2c9d923f669b738d2d7953eff" + integrity sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g== dependencies: - "@vue/runtime-core" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/runtime-core" "3.2.31" + "@vue/shared" "3.2.31" csstype "^2.6.8" -"@vue/server-renderer@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.29.tgz#ea6afa361b9c781a868c8da18c761f9b7bc89102" - integrity sha512-lpiYx7ciV7rWfJ0tPkoSOlLmwqBZ9FTmQm33S+T4g0j1fO/LmhJ9b9Ctl1o5xvIFVDk9QkSUWANZn7H2pXuxVw== +"@vue/server-renderer@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.31.tgz#201e9d6ce735847d5989403af81ef80960da7141" + integrity sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg== dependencies: - "@vue/compiler-ssr" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/compiler-ssr" "3.2.31" + "@vue/shared" "3.2.31" -"@vue/shared@3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.29.tgz#07dac7051117236431d2f737d16932aa38bbb925" - integrity sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw== +"@vue/shared@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e" + integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ== "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -3654,13 +3668,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + mime-types "~2.1.34" + negotiator "0.6.3" acorn-globals@^6.0.0: version "6.0.0" @@ -3685,7 +3699,7 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0: +acorn-walk@^8.0.0, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -3700,7 +3714,7 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0: +acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== @@ -3776,9 +3790,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" + integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -4141,18 +4155,18 @@ axios@^0.21.0, axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -babel-jest@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.6.tgz#4d024e69e241cdf4f396e453a07100f44f7ce314" - integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg== +babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== dependencies: - "@jest/transform" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.4.0" + babel-preset-jest "^27.5.1" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" slash "^3.0.0" babel-loader@^8.2.2: @@ -4183,10 +4197,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz#d7831fc0f93573788d80dee7e682482da4c730d6" - integrity sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw== +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -4212,12 +4226,12 @@ babel-plugin-polyfill-corejs2@^0.3.0: semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" - integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.20.0" + core-js-compat "^3.21.0" babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.1" @@ -4227,14 +4241,15 @@ babel-plugin-polyfill-regenerator@^0.3.0: "@babel/helper-define-polyfill-provider" "^0.3.1" "babel-plugin-styled-components@>= 1.12.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz#0fac11402dc9db73698b55847ab1dc73f5197c54" - integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== + version "2.0.5" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.5.tgz#8c402e5868c2a419eefb5466fccf154af18c52d1" + integrity sha512-A7kfST5odbf8Ev42OQbj5teEiT8DskpRoQ/iPYePLLdcTCAsodpYKqtoy4SJthpsGzQKc2vvnrtlUgdmJq6WKQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.0" "@babel/helper-module-imports" "^7.16.0" babel-plugin-syntax-jsx "^6.18.0" lodash "^4.17.11" + picomatch "^2.3.0" babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" @@ -4259,12 +4274,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz#70d0e676a282ccb200fbabd7f415db5fdf393bca" - integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg== +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== dependencies: - babel-plugin-jest-hoist "^27.4.0" + babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -4358,20 +4373,20 @@ bluebird@3.7.2, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" - integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== +body-parser@1.19.2: + version "1.19.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" + integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== dependencies: - bytes "3.1.1" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" http-errors "1.8.1" iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.9.6" - raw-body "2.4.2" + qs "6.9.7" + raw-body "2.4.3" type-is "~1.6.18" bonjour@^3.5.0: @@ -4479,14 +4494,14 @@ browser-stdout@1.3.1: integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + version "4.19.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" + integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg== dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" + caniuse-lite "^1.0.30001312" + electron-to-chromium "^1.4.71" escalade "^3.1.1" - node-releases "^2.0.1" + node-releases "^2.0.2" picocolors "^1.0.0" bs-logger@0.x: @@ -4551,10 +4566,10 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacache@^12.0.0, cacache@^12.0.3: version "12.0.4" @@ -4706,10 +4721,10 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= -caniuse-lite@^1.0.30001286: - version "1.0.30001304" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz#38af55ed3fc8220cb13e35e6e7309c8c65a05559" - integrity sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ== +caniuse-lite@^1.0.30001312: + version "1.0.30001312" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" + integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== caseless@~0.12.0: version "0.12.0" @@ -4783,7 +4798,7 @@ cheerio@^1.0.0-rc.2: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -chokidar@3.5.3, chokidar@^3.5.2: +chokidar@3.5.3, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -5041,11 +5056,11 @@ colors@1.4.0: integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== columnify@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" - integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= + version "1.6.0" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== dependencies: - strip-ansi "^3.0.0" + strip-ansi "^6.0.1" wcwidth "^1.0.0" combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: @@ -5310,17 +5325,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -copy-anything@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" - integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== - dependencies: - is-what "^3.12.0" +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== copy-concurrently@^1.0.0: version "1.0.5" @@ -5340,9 +5348,9 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-webpack-plugin@^10.0.0, copy-webpack-plugin@^10.2.1: - version "10.2.3" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.3.tgz#16fa11ce3bb34f9fd4e4f22a252a5ed88c57c730" - integrity sha512-DKg4/ijemcJmpo2vBQiwiL2u+t2XN6YYlr2v2Ejqltnn2vbPfXLAz/v0Rv8uB4UmlbB7NH4cGhLxCmtaVppvEQ== + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== dependencies: fast-glob "^3.2.7" glob-parent "^6.0.1" @@ -5365,23 +5373,23 @@ copy-webpack-plugin@^7.0.0: schema-utils "^3.0.0" serialize-javascript "^5.0.1" -core-js-compat@^3.20.0, core-js-compat@^3.20.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" - integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== +core-js-compat@^3.20.2, core-js-compat@^3.21.0: + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" + integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== dependencies: browserslist "^4.19.1" semver "7.0.0" core-js-pure@^3.20.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.20.3.tgz#6cc4f36da06c61d95254efc54024fe4797fd5d02" - integrity sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA== + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" + integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== core-js@^3.15.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" - integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" + integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== core-util-is@1.0.2: version "1.0.2" @@ -5582,9 +5590,9 @@ cypress-image-snapshot@^4.0.1: term-img "^4.0.0" cypress@*: - version "9.3.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.3.1.tgz#8116f52d49d6daf90a91e88f3eafd940234d2958" - integrity sha512-BODdPesxX6bkVUnH8BVsV8I/jn57zQtO1FEOUTiuG2us3kslW7g0tcuwiny7CKCmJUZz8S/D587ppC+s58a+5Q== + version "9.5.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.5.0.tgz#704a79f0d3d4e775f433334eb8f5ae065e3bea31" + integrity sha512-rC5QPolKsVjJ8QJZ7IeZ6HlKM4gswBGZc0XvoAJNL8urQCSL8zTX0A/ai/h35WfF47NQ0iSZnwIXBlHX3MOUIQ== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -5623,10 +5631,10 @@ cypress@*: pretty-bytes "^5.6.0" proxy-from-env "1.0.0" request-progress "^3.0.0" + semver "^7.3.2" supports-color "^8.1.1" tmp "~0.2.1" untildify "^4.0.0" - url "^0.11.0" yauzl "^2.10.0" cypress@^8.4.1: @@ -5965,10 +5973,10 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" - integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== diff@5.0.0: version "5.0.0" @@ -6029,9 +6037,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6: - version "0.5.11" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.11.tgz#79d5846c4f90eba3e617d9031e921de9324f84ed" - integrity sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw== + version "0.5.12" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.12.tgz#0fea9b3f28976a52fed7298d2cfdcdff29811cda" + integrity sha512-gQ2mON6fLWZeM8ubjzL7RtMeHS/g8hb82j4MjHmcQECD7pevWsMlhqwp9BjIRrQvmyJMMyv/XiO1cXzeFlUw4g== dom-converter@^0.2.0: version "0.2.0" @@ -6140,10 +6148,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.4.17: - version "1.4.57" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz#2b2766df76ac8dbc0a1d41249bc5684a31849892" - integrity sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw== +electron-to-chromium@^1.4.71: + version "1.4.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.72.tgz#19b871f1da8be8199b2330d694fc84fcdb72ecd9" + integrity sha512-9LkRQwjW6/wnSfevR21a3k8sOJ+XWSH7kkzs9/EUenKmuDkndP3W9y1yCZpOxufwGbX3JV8glZZSDb4o95zwXQ== emittery@^0.8.1: version "0.8.1" @@ -6203,9 +6211,9 @@ enhanced-resolve@^4.0.0: tapable "^1.0.0" enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + version "5.9.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz#49ac24953ac8452ed8fed2ef1340fc8e043667ee" + integrity sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -6237,7 +6245,7 @@ err-code@^1.0.0: resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= -errno@^0.1.1, errno@^0.1.3: +errno@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== @@ -6355,9 +6363,9 @@ eslint-config-airbnb-base@^14.2.1: object.entries "^1.1.2" eslint-config-prettier@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" - integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.4.0.tgz#8e6d17c7436649e98c4c2189868562921ef563de" + integrity sha512-CFotdUcMY18nGRo5KGsnNxpznzhkopOcOo0InID+sgQssPrzjvsyKZPvOgymTFeHrFuC3Tzdf2YndhXtULK9Iw== eslint-config-standard@^16.0.3: version "16.0.3" @@ -6495,10 +6503,10 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" - integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -6542,10 +6550,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1" - integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^5.16.0: version "5.16.0" @@ -6600,7 +6608,7 @@ eslint@^7.14.0: ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.3.2" + debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" escape-string-regexp "^4.0.0" @@ -6619,7 +6627,7 @@ eslint@^7.14.0: import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^4.1.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" @@ -6627,20 +6635,20 @@ eslint@^7.14.0: natural-compare "^1.4.0" optionator "^0.9.1" progress "^2.0.0" - regexpp "^3.2.0" + regexpp "^3.1.0" semver "^7.2.1" - strip-ansi "^6.0.1" + strip-ansi "^6.0.0" strip-json-comments "^3.1.0" table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" eslint@^8.4.1: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d" - integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ== + version "8.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.9.0.tgz#a2a8227a99599adc4342fd9b854cb8d8d6412fdb" + integrity sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q== dependencies: - "@eslint/eslintrc" "^1.0.5" + "@eslint/eslintrc" "^1.1.0" "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" @@ -6648,10 +6656,10 @@ eslint@^8.4.1: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.0" + eslint-scope "^7.1.1" eslint-utils "^3.0.0" - eslint-visitor-keys "^3.2.0" - espree "^9.3.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -6694,14 +6702,14 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -espree@^9.2.0, espree@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8" - integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== +espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== dependencies: acorn "^8.7.0" acorn-jsx "^5.3.1" - eslint-visitor-keys "^3.1.0" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -6830,49 +6838,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@4.1.0, execa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@5.1.1, execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -6916,27 +6881,27 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.6.tgz#f335e128b0335b6ceb4fcab67ece7cbd14c942e6" - integrity sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag== +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== dependencies: - "@jest/types" "^27.4.2" - jest-get-type "^27.4.0" - jest-matcher-utils "^27.4.6" - jest-message-util "^27.4.6" + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" express@^4.17.1: - version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" - integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== + version "4.17.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" + integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.1" + body-parser "1.19.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.1" + cookie "0.4.2" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.2" @@ -6951,7 +6916,7 @@ express@^4.17.1: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.6" + qs "6.9.7" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.17.2" @@ -7287,9 +7252,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== for-in@^1.0.2: version "1.0.2" @@ -7355,9 +7320,9 @@ fs-constants@^1.0.0: integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@10: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + version "10.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" + integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -7682,9 +7647,9 @@ globals@^11.1.0, globals@^11.12.0, globals@^11.7.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" - integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== + version "13.12.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" + integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw== dependencies: type-fest "^0.20.2" @@ -8061,15 +8026,6 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-proxy-middleware@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" @@ -8081,9 +8037,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy-middleware@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz#94d7593790aad6b3de48164f13792262f656c332" - integrity sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g== + version "2.0.3" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz#5df04f69a89f530c2284cd71eeaa51ba52243289" + integrity sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -8172,7 +8128,7 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -8698,18 +8654,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -8955,9 +8899,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" - integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -8970,159 +8914,161 @@ iterm2-version@^4.1.0: app-path "^3.2.0" plist "^3.0.1" -jest-changed-files@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.4.2.tgz#da2547ea47c6e6a5f6ed336151bd2075736eb4a5" - integrity sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A== +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" execa "^5.0.0" throat "^6.0.1" -jest-circus@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.6.tgz#d3af34c0eb742a967b1919fbb351430727bcea6c" - integrity sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ== +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== dependencies: - "@jest/environment" "^27.4.6" - "@jest/test-result" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^27.4.6" + expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^27.4.6" - jest-matcher-utils "^27.4.6" - jest-message-util "^27.4.6" - jest-runtime "^27.4.6" - jest-snapshot "^27.4.6" - jest-util "^27.4.2" - pretty-format "^27.4.6" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" slash "^3.0.0" stack-utils "^2.0.3" throat "^6.0.1" -jest-cli@^27.4.7: - version "27.4.7" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.7.tgz#d00e759e55d77b3bcfea0715f527c394ca314e5a" - integrity sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw== +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== dependencies: - "@jest/core" "^27.4.7" - "@jest/test-result" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^27.4.7" - jest-util "^27.4.2" - jest-validate "^27.4.6" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" prompts "^2.0.1" yargs "^16.2.0" -jest-config@^27.4.7: - version "27.4.7" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.7.tgz#4f084b2acbd172c8b43aa4cdffe75d89378d3972" - integrity sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw== +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== dependencies: "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.4.6" - "@jest/types" "^27.4.2" - babel-jest "^27.4.6" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" - graceful-fs "^4.2.4" - jest-circus "^27.4.6" - jest-environment-jsdom "^27.4.6" - jest-environment-node "^27.4.6" - jest-get-type "^27.4.0" - jest-jasmine2 "^27.4.6" - jest-regex-util "^27.4.0" - jest-resolve "^27.4.6" - jest-runner "^27.4.6" - jest-util "^27.4.2" - jest-validate "^27.4.6" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" micromatch "^4.0.4" - pretty-format "^27.4.6" + parse-json "^5.2.0" + pretty-format "^27.5.1" slash "^3.0.0" + strip-json-comments "^3.1.1" -jest-diff@^27.0.0, jest-diff@^27.4.2, jest-diff@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" - integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== +jest-diff@^27.4.2, jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== dependencies: chalk "^4.0.0" - diff-sequences "^27.4.0" - jest-get-type "^27.4.0" - pretty-format "^27.4.6" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-docblock@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.4.0.tgz#06c78035ca93cbbb84faf8fce64deae79a59f69f" - integrity sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg== +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== dependencies: detect-newline "^3.0.0" -jest-each@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.6.tgz#e7e8561be61d8cc6dbf04296688747ab186c40ff" - integrity sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA== +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" chalk "^4.0.0" - jest-get-type "^27.4.0" - jest-util "^27.4.2" - pretty-format "^27.4.6" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" -jest-environment-jsdom@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz#c23a394eb445b33621dfae9c09e4c8021dea7b36" - integrity sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA== +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== dependencies: - "@jest/environment" "^27.4.6" - "@jest/fake-timers" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^27.4.6" - jest-util "^27.4.2" + jest-mock "^27.5.1" + jest-util "^27.5.1" jsdom "^16.6.0" -jest-environment-node@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.6.tgz#ee8cd4ef458a0ef09d087c8cd52ca5856df90242" - integrity sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ== +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== dependencies: - "@jest/environment" "^27.4.6" - "@jest/fake-timers" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^27.4.6" - jest-util "^27.4.2" + jest-mock "^27.5.1" + jest-util "^27.5.1" -jest-get-type@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" - integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-haste-map@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.6.tgz#c60b5233a34ca0520f325b7e2cc0a0140ad0862a" - integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ== +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^27.4.0" - jest-serializer "^27.4.0" - jest-util "^27.4.2" - jest-worker "^27.4.6" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: @@ -9143,68 +9089,68 @@ jest-image-snapshot@4.2.0: rimraf "^2.6.2" ssim.js "^3.1.1" -jest-jasmine2@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz#109e8bc036cb455950ae28a018f983f2abe50127" - integrity sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw== +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== dependencies: - "@jest/environment" "^27.4.6" - "@jest/source-map" "^27.4.0" - "@jest/test-result" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^27.4.6" + expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^27.4.6" - jest-matcher-utils "^27.4.6" - jest-message-util "^27.4.6" - jest-runtime "^27.4.6" - jest-snapshot "^27.4.6" - jest-util "^27.4.2" - pretty-format "^27.4.6" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" throat "^6.0.1" -jest-leak-detector@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz#ed9bc3ce514b4c582637088d9faf58a33bd59bf4" - integrity sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA== +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== dependencies: - jest-get-type "^27.4.0" - pretty-format "^27.4.6" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-matcher-utils@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz#53ca7f7b58170638590e946f5363b988775509b8" - integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA== +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== dependencies: chalk "^4.0.0" - jest-diff "^27.4.6" - jest-get-type "^27.4.0" - pretty-format "^27.4.6" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-message-util@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.6.tgz#9fdde41a33820ded3127465e1a5896061524da31" - integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA== +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^27.4.6" + pretty-format "^27.5.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.6.tgz#77d1ba87fbd33ccb8ef1f061697e7341b7635195" - integrity sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw== +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -9212,163 +9158,162 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" - integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-resolve-dependencies@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz#fc50ee56a67d2c2183063f6a500cc4042b5e2327" - integrity sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw== +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== dependencies: - "@jest/types" "^27.4.2" - jest-regex-util "^27.4.0" - jest-snapshot "^27.4.6" + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" -jest-resolve@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.6.tgz#2ec3110655e86d5bfcfa992e404e22f96b0b5977" - integrity sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw== +jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^27.4.6" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" jest-pnp-resolver "^1.2.2" - jest-util "^27.4.2" - jest-validate "^27.4.6" + jest-util "^27.5.1" + jest-validate "^27.5.1" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.6.tgz#1d390d276ec417e9b4d0d081783584cbc3e24773" - integrity sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg== +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== dependencies: - "@jest/console" "^27.4.6" - "@jest/environment" "^27.4.6" - "@jest/test-result" "^27.4.6" - "@jest/transform" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-docblock "^27.4.0" - jest-environment-jsdom "^27.4.6" - jest-environment-node "^27.4.6" - jest-haste-map "^27.4.6" - jest-leak-detector "^27.4.6" - jest-message-util "^27.4.6" - jest-resolve "^27.4.6" - jest-runtime "^27.4.6" - jest-util "^27.4.2" - jest-worker "^27.4.6" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" source-map-support "^0.5.6" throat "^6.0.1" -jest-runtime@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.6.tgz#83ae923818e3ea04463b22f3597f017bb5a1cffa" - integrity sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ== +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== dependencies: - "@jest/environment" "^27.4.6" - "@jest/fake-timers" "^27.4.6" - "@jest/globals" "^27.4.6" - "@jest/source-map" "^27.4.0" - "@jest/test-result" "^27.4.6" - "@jest/transform" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" execa "^5.0.0" glob "^7.1.3" - graceful-fs "^4.2.4" - jest-haste-map "^27.4.6" - jest-message-util "^27.4.6" - jest-mock "^27.4.6" - jest-regex-util "^27.4.0" - jest-resolve "^27.4.6" - jest-snapshot "^27.4.6" - jest-util "^27.4.2" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^27.4.0: - version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.4.0.tgz#34866586e1cae2388b7d12ffa2c7819edef5958a" - integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ== +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== dependencies: "@types/node" "*" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" -jest-snapshot@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.6.tgz#e2a3b4fff8bdce3033f2373b2e525d8b6871f616" - integrity sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ== +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== dependencies: "@babel/core" "^7.7.2" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/transform" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/babel__traverse" "^7.0.4" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.4.6" - graceful-fs "^4.2.4" - jest-diff "^27.4.6" - jest-get-type "^27.4.0" - jest-haste-map "^27.4.6" - jest-matcher-utils "^27.4.6" - jest-message-util "^27.4.6" - jest-util "^27.4.2" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" natural-compare "^1.4.0" - pretty-format "^27.4.6" + pretty-format "^27.5.1" semver "^7.3.2" -jest-util@^27.0.0, jest-util@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.4.2.tgz#ed95b05b1adfd761e2cda47e0144c6a58e05a621" - integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA== +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.6.tgz#efc000acc4697b6cf4fa68c7f3f324c92d0c4f1f" - integrity sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ== +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== dependencies: - "@jest/types" "^27.4.2" + "@jest/types" "^27.5.1" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.4.0" + jest-get-type "^27.5.1" leven "^3.1.0" - pretty-format "^27.4.6" + pretty-format "^27.5.1" -jest-watcher@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.6.tgz#673679ebeffdd3f94338c24f399b85efc932272d" - integrity sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw== +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== dependencies: - "@jest/test-result" "^27.4.6" - "@jest/types" "^27.4.2" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.4.2" + jest-util "^27.5.1" string-length "^4.0.1" jest-webpack@^0.5.1: @@ -9384,23 +9329,23 @@ jest-webpack@^0.5.1: webpack-sources "^1.0.1" yargs "^10.0.3" -jest-worker@^27.4.1, jest-worker@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" - integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== +jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^27.4.5: - version "27.4.7" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.7.tgz#87f74b9026a1592f2da05b4d258e57505f28eca4" - integrity sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg== + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== dependencies: - "@jest/core" "^27.4.7" + "@jest/core" "^27.5.1" import-local "^3.0.2" - jest-cli "^27.4.7" + jest-cli "^27.5.1" joi@^17.4.0: version "17.6.0" @@ -10201,7 +10146,7 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -memfs@^3.2.2: +memfs@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== @@ -10329,19 +10274,24 @@ microseconds@0.2.0: resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.51.0: version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +"mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" -mime@1.6.0, mime@^1.4.1: +mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -10389,13 +10339,20 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -10482,9 +10439,9 @@ mkdirp@^0.5.1, mkdirp@^0.5.5: minimist "^1.2.5" mocha@^9.1.3: - version "9.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.0.tgz#2bfba73d46e392901f877ab9a47b7c9c5d0275cc" - integrity sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q== + version "9.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e" + integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ== dependencies: "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" @@ -10602,11 +10559,16 @@ nano-time@1.0.0: dependencies: big-integer "^1.6.16" -nanoid@3.2.0, nanoid@^3.1.30: +nanoid@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== +nanoid@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -10634,19 +10596,10 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.5.2: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.0, neo-async@^2.6.2: version "2.6.2" @@ -10726,10 +10679,10 @@ node-object-hash@^1.2.0: resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.2.tgz#385833d85b229902b75826224f6077be969a9e94" integrity sha512-UdS4swXs85fCGWWf6t6DMGgpN/vnlKeSGEQ7hJcrs7PBFoxoKLmibc3QRb7fwiYsjdL7PX8iI/TMSlZ90dgHhQ== -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== +node-releases@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== nodemon@^2.0.12: version "2.0.15" @@ -11350,7 +11303,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11360,11 +11313,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-path@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" @@ -11517,7 +11465,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -11549,7 +11497,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0, pirates@^4.0.4: +pirates@^4.0.4, pirates@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== @@ -11663,13 +11611,13 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.1.10, postcss@^8.2.15: - version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + version "8.4.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1" + integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA== dependencies: - nanoid "^3.1.30" + nanoid "^3.2.0" picocolors "^1.0.0" - source-map-js "^1.0.1" + source-map-js "^1.0.2" prebuild-install@^5.3.3: version "5.3.6" @@ -11735,10 +11683,10 @@ pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^27.0.0, pretty-format@^27.4.6: - version "27.4.6" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" - integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== +pretty-format@^27.0.0, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" ansi-styles "^5.0.0" @@ -11895,17 +11843,10 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.9.6: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== - -qs@^6.9.4: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" +qs@6.9.7: + version "6.9.7" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== qs@^6.9.4: version "6.10.2" @@ -11929,16 +11870,6 @@ query-string@^6.13.8: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -query-string@^6.13.8: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -11986,12 +11917,12 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== +raw-body@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" + integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== dependencies: - bytes "3.1.1" + bytes "3.1.2" http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" @@ -12065,9 +11996,9 @@ react-is@^17.0.1, react-is@^17.0.2: integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-query@^3.6.0: - version "3.34.12" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.12.tgz#dcaaf7b629f0868aae8afef9fb7692f6ea7643bf" - integrity sha512-flDdudQVH4CqE+kNYYYyo4g2Yjek3H/36G3b9bK5oe26jD5gFnx+PPwnq0gayq5z2dcSfr2z4+drvuyeZ3A5QQ== + version "3.34.16" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.16.tgz#279ea180bcaeaec49c7864b29d1711ee9f152594" + integrity sha512-7FvBvjgEM4YQ8nPfmAr+lJfbW95uyW/TVjFoi2GwCkF33/S8ajx45tuPHPFGWs4qYwPy1mzwxD4IQfpUDrefNQ== dependencies: "@babel/runtime" "^7.5.5" broadcast-channel "^3.4.1" @@ -12309,10 +12240,10 @@ redux@^4.0.0, redux@^4.1.2: dependencies: "@babel/runtime" "^7.9.2" -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== dependencies: regenerate "^1.4.2" @@ -12364,15 +12295,15 @@ regexpp@^3.1.0, regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== dependencies: regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" @@ -12390,15 +12321,15 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== dependencies: jsesc "~0.5.0" @@ -12675,9 +12606,9 @@ rxjs@^6.4.0, rxjs@^6.6.6: tslib "^1.9.0" rxjs@^7.1.0, rxjs@^7.5.1: - version "7.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b" - integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== + version "7.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d" + integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ== dependencies: tslib "^2.1.0" @@ -12956,9 +12887,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-concat@^1.0.0: version "1.0.1" @@ -12966,9 +12897,9 @@ simple-concat@^1.0.0: integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== dependencies: decompress-response "^4.2.0" once "^1.3.1" @@ -13119,7 +13050,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.1: +source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -13732,21 +13663,22 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.1.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" - integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== dependencies: - jest-worker "^27.4.1" + jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.0" source-map "^0.6.1" terser "^5.7.2" terser@^5.10.0, terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + version "5.11.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.11.0.tgz#2da5506c02e12cd8799947f30ce9c5b760be000f" + integrity sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A== dependencies: + acorn "^8.5.0" commander "^2.20.0" source-map "~0.7.2" source-map-support "~0.5.20" @@ -14001,6 +13933,25 @@ ts-loader@^9.2.6: micromatch "^4.0.0" semver "^7.3.4" +ts-node@^10.4.0: + version "10.5.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.5.0.tgz#618bef5854c1fbbedf5e31465cbb224a1d524ef9" + integrity sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.0" + yn "3.1.1" + ts-node@^9.0.0: version "9.1.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" @@ -14127,9 +14078,9 @@ typescript@^4.0, typescript@^4.1.2, typescript@^4.5: integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== uglify-js@^3.1.4: - version "3.15.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.0.tgz#2d6a689d94783cab43975721977a13c2afec28f1" - integrity sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg== + version "3.15.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.1.tgz#9403dc6fa5695a6172a91bc983ea39f0f7c9086d" + integrity sha512-FAGKF12fWdkpvNJZENacOH0e/83eG6JyVQyanIJaBXCN1J11TUQv1T1/z8S+Z0CG0ZPk1nPcreF/c7lrTd0TEQ== uid-number@0.0.6: version "0.0.6" @@ -14312,9 +14263,9 @@ url-parse-lax@^3.0.0: prepend-http "^2.0.0" url-parse@^1.4.3, url-parse@^1.5.3: - version "1.5.4" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" - integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -14364,6 +14315,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" + integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -14413,15 +14369,15 @@ verror@1.10.0: extsprintf "^1.2.0" vue@^3.2.23: - version "3.2.29" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.29.tgz#3571b65dbd796d3a6347e2fd45a8e6e11c13d56a" - integrity sha512-cFIwr7LkbtCRanjNvh6r7wp2yUxfxeM2yPpDQpAfaaLIGZSrUmLbNiSze9nhBJt5MrZ68Iqt0O5scwAMEVxF+Q== + version "3.2.31" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.31.tgz#e0c49924335e9f188352816788a4cca10f817ce6" + integrity sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw== dependencies: - "@vue/compiler-dom" "3.2.29" - "@vue/compiler-sfc" "3.2.29" - "@vue/runtime-dom" "3.2.29" - "@vue/server-renderer" "3.2.29" - "@vue/shared" "3.2.29" + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-sfc" "3.2.31" + "@vue/runtime-dom" "3.2.31" + "@vue/server-renderer" "3.2.31" + "@vue/shared" "3.2.31" w3c-hr-time@^1.0.2: version "1.0.2" @@ -14541,13 +14497,13 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-middleware@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz#8fc02dba6e72e1d373eca361623d84610f27be7c" - integrity sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg== +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== dependencies: colorette "^2.0.10" - memfs "^3.2.2" + memfs "^3.4.1" mime-types "^2.1.31" range-parser "^1.2.1" schema-utils "^4.0.0" @@ -14592,18 +14548,19 @@ webpack-dev-server@^3.11.0, webpack-dev-server@^3.11.2: yargs "^13.3.2" webpack-dev-server@^4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz#4e995b141ff51fa499906eebc7906f6925d0beaa" - integrity sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q== + version "4.7.4" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz#d0ef7da78224578384e795ac228d8efb63d5f945" + integrity sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" "@types/serve-index" "^1.9.1" "@types/sockjs" "^0.3.33" "@types/ws" "^8.2.2" ansi-html-community "^0.0.8" bonjour "^3.5.0" - chokidar "^3.5.2" + chokidar "^3.5.3" colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^1.6.0" @@ -14623,8 +14580,8 @@ webpack-dev-server@^4.7.3: sockjs "^0.3.21" spdy "^4.0.2" strip-ansi "^7.0.0" - webpack-dev-middleware "^5.3.0" - ws "^8.1.0" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" webpack-log@^2.0.0: version "2.0.0" @@ -14656,12 +14613,12 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.44.0, webpack@^5.6.0, webpack@^5.67.0: - version "5.67.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.67.0.tgz#cb43ca2aad5f7cc81c4cd36b626e6b819805dbfd" - integrity sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw== + version "5.69.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5" + integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A== dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" @@ -14754,9 +14711,9 @@ which-module@^2.0.0: integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" + integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== which@2.0.2, which@^2.0.1: version "2.0.2" @@ -14919,25 +14876,37 @@ ws@^6.2.1: async-limiter "~1.0.0" ws@^7.3.1, ws@^7.4.6: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== -ws@^8.1.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" - integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== +ws@^8.4.2: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml-formatter@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/xml-formatter/-/xml-formatter-2.6.1.tgz#066ef3a100bd58ee3b943f0c503be63176d3d497" + integrity sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw== + dependencies: + xml-parser-xo "^3.2.0" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-parser-xo@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz#c633ab55cf1976d6b03ab4a6a85045093ac32b73" + integrity sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg== + xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"